From 8a75bf71f25cccea6bf440ddfd5ade450ee8bcd8 Mon Sep 17 00:00:00 2001 From: Emre KARA Date: Tue, 6 May 2025 09:43:10 +0300 Subject: [PATCH] Refactor telemetry constants and improve activity tracking --- .../Volo/Abp/Modularity/AbpModule.cs | 11 +- .../Volo/Abp/Telemetry/AbpTelemetryModule.cs | 72 +++--- .../Abp/Telemetry/Activity/ActivityData.cs | 41 ---- .../Activity/ActivityDataProvider.cs | 207 ++++++++++-------- .../Activity/ActivityPropertyNameConstants.cs | 42 ++++ .../Helpers/AbpPackageMetadataHelper.cs | 34 ++- 6 files changed, 225 insertions(+), 182 deletions(-) create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityPropertyNameConstants.cs diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs index 300317f181..8227643465 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs @@ -1,11 +1,11 @@ using System; using System.Reflection; using System.Threading.Tasks; -using Helpers; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Telemetry; using Volo.Abp.Telemetry.Activity; +using Volo.Abp.Telemetry.Helpers; namespace Volo.Abp.Modularity; @@ -113,11 +113,12 @@ public abstract class AbpModule : { var telemetryService = context.ServiceProvider.GetRequiredService(); - await using var _ = telemetryService.TrackActivity(ActivityNameConsts.ApplicationRun, c => + await using var _ = telemetryService.TrackActivity(ActivityNameConsts.ApplicationRun, activity => { - c.Add("ProjectAssemblyForScan", Assembly.GetCallingAssembly()); - c.Add("ProjectId", packageMetadata.ProjectId!); - c.Add("ProjectType", packageMetadata.Role!); + activity.Add(ActivityPropertyNameConstants.Assembly, Assembly.GetCallingAssembly()); + activity.Add(ActivityPropertyNameConstants.ProjectId, packageMetadata.ProjectId!); + activity.Add(ActivityPropertyNameConstants.ProjectType, packageMetadata.Role!); + activity.Add(ActivityPropertyNameConstants.SolutionPath, packageMetadata.AbpSlnPath ?? string.Empty); }); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/AbpTelemetryModule.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/AbpTelemetryModule.cs index 9bf0e38106..237fcc5534 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/AbpTelemetryModule.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/AbpTelemetryModule.cs @@ -1,38 +1,34 @@ -using System; -using System.Reflection; -using System.Threading.Tasks; -using Helpers; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Modularity; -using Volo.Abp.Telemetry.Activity; - -namespace Volo.Abp.Telemetry; - -public class AbpTelemetryModule : AbpModule -{ - - public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) - { - var packageMetadata = AbpPackageMetadataHelper.GetMetaData(Assembly.GetCallingAssembly()); - - if (packageMetadata != null) - { - var activityStorage = context.ServiceProvider.GetRequiredService(); - var lastApplicationInfoSendTime = await activityStorage.GetApplicationInfoLastActivitySendTimeAsync(packageMetadata.ProjectId!.To()); - if (lastApplicationInfoSendTime is null || - DateTimeOffset.UtcNow - lastApplicationInfoSendTime > TimeSpan.FromDays(7)) - { - var telemetryService = context.ServiceProvider.GetRequiredService(); - - await using var _ = telemetryService.TrackActivity(ActivityNameConsts.ApplicationRun, c => - { - c.Add("ProjectAssemblyForScan", Assembly.GetCallingAssembly()); - c.Add("ProjectId", packageMetadata.ProjectId!); - c.Add("ProjectType", packageMetadata.Role!); - }); - } - - } - } - -} \ No newline at end of file +// using System; +// using System.Reflection; +// using System.Threading.Tasks; +// using Microsoft.Extensions.DependencyInjection; +// using Volo.Abp.Modularity; +// using Volo.Abp.Telemetry.Activity; +// using Volo.Abp.Telemetry.Helpers; +// +// namespace Volo.Abp.Telemetry; +// +// public class AbpTelemetryModule : AbpModule +// { +// +// public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) +// { +// var packageMetadata = AbpPackageMetadataHelper.GetMetaData(Assembly.GetCallingAssembly()); +// +// if (packageMetadata != null) +// { +// +// var telemetryService = context.ServiceProvider.GetRequiredService(); +// +// await using var _ = telemetryService.TrackActivity(ActivityNameConsts.ApplicationRun, activity => +// { +// activity.Add("ProjectAssemblyForScan", Assembly.GetCallingAssembly()); +// activity.Add("ProjectId", packageMetadata.ProjectId!); +// activity.Add("ProjectType", packageMetadata.Role!); +// activity.Add("SolutionPath", packageMetadata.AbpSlnPath ?? string.Empty); +// }); +// +// } +// } +// +// } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityData.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityData.cs index 29c8f4b565..d804a1ad9e 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityData.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityData.cs @@ -44,45 +44,4 @@ public class ActivityData : Dictionary ActivityName = activityName; ActivityDetails = details; } -} - - -public static class ActivityPropertyNameConstants -{ - public const string SessionId = "SessionId"; - public const string IsFirstSession = "IsFirstSession"; - public const string DeviceId = "DeviceId"; - public const string DeviceType = "DeviceType"; - public const string DeviceLanguage = "DeviceLanguage"; - public const string OperatingSystem = "OperatingSystem"; - public const string CountryIsoCode = "CountryIsoCode"; - public const string InstalledSoftwares = "InstalledSoftwares"; - public const string ControllerCount = nameof(ApplicationInfo.ControllerCount); - public const string EntityCount = nameof(ApplicationInfo.EntityCount); - public const string AbpModuleCount = nameof(ApplicationInfo.AbpModuleCount); - public const string PermissionCount = nameof(ApplicationInfo.PermissionCount); - public const string AppServiceCount = nameof(ApplicationInfo.AppServiceCount); - public const string ProjectType = "ProjectType"; - public const string ProjectId = "ProjectId"; - public const string SolutionId = "SolutionId"; - public const string Template = "Template"; - public const string CreatedAbpStudioVersion = "CreatedAbpStudioVersion"; - public const string IsTiered = "IsTiered"; - public const string UiFramework = "UiFramework"; - public const string DatabaseProvider = "DatabaseProvider"; - public const string DatabaseManagementSystem = "DatabaseManagementSystem"; - public const string IsSeparateTenantSchema = "IsSeparateTenantSchema"; - public const string Theme = "Theme"; - public const string ThemeStyle = "ThemeStyle"; - public const string MobileFramework = "MobileFramework"; - public const string HasPublicWebsite = "HasPublicWebsite"; - public const string IncludeTests = "IncludeTests"; - public const string MultiTenancy = "MultiTenancy"; - public const string DynamicLocalization = "DynamicLocalization"; - public const string KubernetesConfiguration = "KubernetesConfiguration"; - public const string GrafanaDashboard = "GrafanaDashboard"; - public const string SocialLogins = "SocialLogins"; - public const string InstalledModules = "InstalledModules"; - public const string ProjectAssemblyForScan = "ProjectAssemblyForScan"; - public const string SolutionPath = "SolutionPath"; } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityDataProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityDataProvider.cs index e6ec98925c..ee8131db4b 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityDataProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityDataProvider.cs @@ -38,18 +38,18 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency { var (isFirstSession, sessionId) = await _activityStorage.GetOrCreateSessionInfoAsync(cancellationToken); - activityData.Add("SessionId", sessionId); - activityData.Add("IsFirstSession", isFirstSession); - + activityData.Add(ActivityPropertyNameConstants.SessionId, sessionId); + activityData.Add(ActivityPropertyNameConstants.IsFirstSession, isFirstSession); + var lastDeviceInfoSendTime = await _activityStorage.GetLastDeviceInfoSendTimeAsync(cancellationToken); - activityData.Add("DeviceId", await _deviceInfoProvider.GetDeviceIdAsync()); + activityData.Add(ActivityPropertyNameConstants.DeviceId, await _deviceInfoProvider.GetDeviceIdAsync()); if (lastDeviceInfoSendTime is null || DateTimeOffset.UtcNow - lastDeviceInfoSendTime > TimeSpan.FromDays(7)) { await AddDeviceInformationAsync(activityData); } - if (activityData.TryGetValue("ProjectAssemblyForScan", out var value)) + if (activityData.TryGetValue(ActivityPropertyNameConstants.Assembly, out var value)) { var assembly = value as Assembly; if (assembly != null) @@ -70,7 +70,7 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency private async Task AddDeviceInformationAsync(ActivityData activityData) { - activityData.Add(ActivityPropertyNameConstants.DeviceType , _deviceInfoProvider.GetDeviceType()); + activityData.Add(ActivityPropertyNameConstants.DeviceType, _deviceInfoProvider.GetDeviceType()); activityData.Add(ActivityPropertyNameConstants.DeviceLanguage, _deviceInfoProvider.GetLanguage()); activityData.Add(ActivityPropertyNameConstants.OperatingSystem, _deviceInfoProvider.GetOperatingSystem()); activityData.Add(ActivityPropertyNameConstants.CountryIsoCode, _deviceInfoProvider.GetCountry()); @@ -84,121 +84,138 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency { var info = _applicationInfoProvider.Scan(assembly); - activityData.Add(nameof(ApplicationInfo.ControllerCount), info.ControllerCount); - activityData.Add(nameof(ApplicationInfo.EntityCount), info.EntityCount); - activityData.Add(nameof(ApplicationInfo.AbpModuleCount), info.AbpModuleCount); - activityData.Add(nameof(ApplicationInfo.PermissionCount), info.PermissionCount); - activityData.Add(nameof(ApplicationInfo.AppServiceCount), info.AppServiceCount); - activityData.Add(ActivityPropertyNameConstants.ProjectType, activityData["ProjectType"]); - activityData.Add(ActivityPropertyNameConstants.ProjectId, activityData["ProjectId"]); + activityData.Add(ActivityPropertyNameConstants.ControllerCount, info.ControllerCount); + activityData.Add(ActivityPropertyNameConstants.EntityCount, info.EntityCount); + activityData.Add(ActivityPropertyNameConstants.AbpModuleCount, info.AbpModuleCount); + activityData.Add(ActivityPropertyNameConstants.PermissionCount, info.PermissionCount); + activityData.Add(ActivityPropertyNameConstants.AppServiceCount, info.AppServiceCount); + activityData.Add(ActivityPropertyNameConstants.ProjectId, activityData[ActivityPropertyNameConstants.ProjectId]); - activityData.Remove("ProjectAssemblyForScan"); + activityData.Remove(ActivityPropertyNameConstants.Assembly); } - private async Task AddSolutionInformationAsync(ActivityData activityData) -{ - if (activityData.TryGetValue(ActivityPropertyNameConstants.SolutionPath, out var value)) + private async Task AddSolutionInformationAsync(ActivityData activityData) { - var solutionPath = value as string; - if (string.IsNullOrEmpty(solutionPath) || !File.Exists(solutionPath)) - { - return; - } - - var solutionJson = File.ReadAllText(solutionPath); - using var solutionDoc = JsonDocument.Parse(solutionJson); - - var root = solutionDoc.RootElement; - - if (!root.TryGetProperty("id", out var idElement) || !Guid.TryParse(idElement.GetString(), out var solutionId)) + if (activityData.TryGetValue(ActivityPropertyNameConstants.SolutionPath, out var value)) { - return; - } + var solutionPath = value as string; + if (string.IsNullOrEmpty(solutionPath) || !File.Exists(solutionPath)) + { + return; + } - activityData.Add(ActivityPropertyNameConstants.SolutionId, solutionId); + var solutionJson = File.ReadAllText(solutionPath); + using var solutionDoc = JsonDocument.Parse(solutionJson); - var lastSolutionInfoSendTime = await _activityStorage.GetLastSolutionInfoSendTimeAsync(solutionId); + var root = solutionDoc.RootElement; - if (lastSolutionInfoSendTime is null || DateTimeOffset.UtcNow - lastSolutionInfoSendTime > TimeSpan.FromDays(7)) - { - if (root.TryGetProperty("creatingStudioConfiguration", out var config)) + if (!root.TryGetProperty("id", out var idElement) || + !Guid.TryParse(idElement.GetString(), out var solutionId)) { - activityData.Add(ActivityPropertyNameConstants.Template, GetSolutionTemplate(config.GetProperty("template").GetString())); - activityData.Add(ActivityPropertyNameConstants.CreatedAbpStudioVersion, config.GetProperty("createdAbpStudioVersion").GetString()!); - activityData.Add(ActivityPropertyNameConstants.IsTiered, config.GetProperty("Tiered").GetBoolean()); - activityData.Add(ActivityPropertyNameConstants.UiFramework, GetUiFramework(config.GetProperty("uiFramework").GetString())); - activityData.Add(ActivityPropertyNameConstants.DatabaseProvider, GetDatabaseProvider(config.GetProperty("databaseProvider").GetString())); - activityData.Add(ActivityPropertyNameConstants.DatabaseManagementSystem, GetDbms(config.GetProperty("databaseManagementSystem").GetString())); - activityData.Add(ActivityPropertyNameConstants.IsSeparateTenantSchema, config.GetProperty("separateTenantSchema").GetBoolean()); - activityData.Add(ActivityPropertyNameConstants.Theme, GetUiTheme(config.GetProperty("theme").GetString())); - activityData.Add(ActivityPropertyNameConstants.ThemeStyle, GetUiThemeStyle(config.GetProperty("themeStyle").GetString())); - activityData.Add(ActivityPropertyNameConstants.MobileFramework, GetMobileApp(config.GetProperty("mobileFramework").GetString())); - activityData.Add(ActivityPropertyNameConstants.HasPublicWebsite, config.GetProperty("publicWebsite").GetBoolean()); - activityData.Add(ActivityPropertyNameConstants.IncludeTests, config.GetProperty("includeTests").GetBoolean()); - activityData.Add(ActivityPropertyNameConstants.MultiTenancy, config.GetProperty("multiTenancy").GetBoolean()); - activityData.Add(ActivityPropertyNameConstants.DynamicLocalization, config.GetProperty("dynamicLocalization").GetBoolean()); - activityData.Add(ActivityPropertyNameConstants.KubernetesConfiguration, config.GetProperty("kubernetesConfiguration").GetBoolean()); - activityData.Add(ActivityPropertyNameConstants.GrafanaDashboard, config.GetProperty("grafanaDashboard").GetBoolean()); - activityData.Add(ActivityPropertyNameConstants.SocialLogins, config.GetProperty("socialLogin").GetBoolean()); + return; } - var modules = new List(); + activityData.Add(ActivityPropertyNameConstants.SolutionId, solutionId); + + var lastSolutionInfoSendTime = await _activityStorage.GetLastSolutionInfoSendTimeAsync(solutionId); - if (root.TryGetProperty("modules", out var modulesElement) && modulesElement.ValueKind == JsonValueKind.Object) + if (lastSolutionInfoSendTime is null || + DateTimeOffset.UtcNow - lastSolutionInfoSendTime > TimeSpan.FromDays(7)) { - foreach (var moduleProperty in modulesElement.EnumerateObject()) + if (root.TryGetProperty("creatingStudioConfiguration", out var config)) { - var name = moduleProperty.Name; - if (!moduleProperty.Value.TryGetProperty("path", out var pathElement)) - { - continue; - } - - var path = pathElement.GetString(); - if (path.IsNullOrEmpty() || !File.Exists(path)) - { - continue; - } + activityData.Add(ActivityPropertyNameConstants.Template, + MapSolutionTemplate(config.GetProperty("template").GetString())); + activityData.Add(ActivityPropertyNameConstants.CreatedAbpStudioVersion, + config.GetProperty("createdAbpStudioVersion").GetString()!); + activityData.Add(ActivityPropertyNameConstants.IsTiered, config.GetProperty("Tiered").GetBoolean()); + activityData.Add(ActivityPropertyNameConstants.UiFramework, + MapUiFramework(config.GetProperty("uiFramework").GetString())); + activityData.Add(ActivityPropertyNameConstants.DatabaseProvider, + MapDatabaseProvider(config.GetProperty("databaseProvider").GetString())); + activityData.Add(ActivityPropertyNameConstants.DatabaseManagementSystem, + MapDbms(config.GetProperty("databaseManagementSystem").GetString())); + activityData.Add(ActivityPropertyNameConstants.IsSeparateTenantSchema, + config.GetProperty("separateTenantSchema").GetBoolean()); + activityData.Add(ActivityPropertyNameConstants.Theme, + MapUiTheme(config.GetProperty("theme").GetString())); + activityData.Add(ActivityPropertyNameConstants.ThemeStyle, + MapUiThemeStyle(config.GetProperty("themeStyle").GetString())); + activityData.Add(ActivityPropertyNameConstants.MobileFramework, + MapMobileApp(config.GetProperty("mobileFramework").GetString())); + activityData.Add(ActivityPropertyNameConstants.HasPublicWebsite, + config.GetProperty("publicWebsite").GetBoolean()); + activityData.Add(ActivityPropertyNameConstants.IncludeTests, + config.GetProperty("includeTests").GetBoolean()); + activityData.Add(ActivityPropertyNameConstants.MultiTenancy, + config.GetProperty("multiTenancy").GetBoolean()); + activityData.Add(ActivityPropertyNameConstants.DynamicLocalization, + config.GetProperty("dynamicLocalization").GetBoolean()); + activityData.Add(ActivityPropertyNameConstants.KubernetesConfiguration, + config.GetProperty("kubernetesConfiguration").GetBoolean()); + activityData.Add(ActivityPropertyNameConstants.GrafanaDashboard, + config.GetProperty("grafanaDashboard").GetBoolean()); + activityData.Add(ActivityPropertyNameConstants.SocialLogins, + config.GetProperty("socialLogin").GetBoolean()); + } - var moduleJson = File.ReadAllText(path); - using var moduleDoc = JsonDocument.Parse(moduleJson); + var modules = new List(); - if (!moduleDoc.RootElement.TryGetProperty("imports", out var importsElement) || importsElement.ValueKind != JsonValueKind.Object) + if (root.TryGetProperty("modules", out var modulesElement) && + modulesElement.ValueKind == JsonValueKind.Object) + { + foreach (var moduleProperty in modulesElement.EnumerateObject()) { - continue; - } + var name = moduleProperty.Name; + if (!moduleProperty.Value.TryGetProperty("path", out var pathElement)) + { + continue; + } - foreach (var importProperty in importsElement.EnumerateObject()) - { - var importValue = importProperty.Value; + var path = pathElement.GetString(); + if (path.IsNullOrEmpty() || !File.Exists(path)) + { + continue; + } - var version = importValue.GetProperty("version").GetString(); - var creationTime = importValue.TryGetProperty("creationTime", out var ct) - ? DateTimeOffset.Parse(ct.GetString()!) - : (DateTimeOffset?)null; + var moduleJson = File.ReadAllText(path); + using var moduleDoc = JsonDocument.Parse(moduleJson); - if (modules.Any(x => x.ModuleName == name && x.Version == version)) + if (!moduleDoc.RootElement.TryGetProperty("imports", out var importsElement) || + importsElement.ValueKind != JsonValueKind.Object) { continue; } - modules.Add(new SolutionModuleInstallationInfo + foreach (var importProperty in importsElement.EnumerateObject()) { - ModuleName = name, - Version = version, - InstallationTime = creationTime - }); + var importValue = importProperty.Value; + + var version = importValue.GetProperty("version").GetString(); + var creationTime = importValue.TryGetProperty("creationTime", out var ct) + ? DateTimeOffset.Parse(ct.GetString()!) + : (DateTimeOffset?)null; + + if (modules.Any(x => x.ModuleName == name && x.Version == version)) + { + continue; + } + + modules.Add(new SolutionModuleInstallationInfo + { + ModuleName = name, Version = version, InstallationTime = creationTime + }); + } } - } - activityData.Add(ActivityPropertyNameConstants.InstalledModules, modules); + activityData.Add(ActivityPropertyNameConstants.InstalledModules, modules); + } } } } -} - private Dbms GetDbms(string? databaseManagementSystem) + private Dbms MapDbms(string? databaseManagementSystem) { return databaseManagementSystem switch { @@ -212,7 +229,7 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency }; } - private UiTheme GetUiTheme(string? theme) + private UiTheme MapUiTheme(string? theme) { return theme switch { @@ -224,7 +241,7 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency }; } - private MobileApp GetMobileApp(string? mobileFramework) + private MobileApp MapMobileApp(string? mobileFramework) { return mobileFramework switch { @@ -235,7 +252,7 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency }; } - private UiThemeStyle GetUiThemeStyle(string? themeStyle) + private UiThemeStyle MapUiThemeStyle(string? themeStyle) { return themeStyle switch { @@ -247,7 +264,7 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency }; } - private SolutionTemplate GetSolutionTemplate(string? templateName) + private SolutionTemplate MapSolutionTemplate(string? templateName) { return templateName switch { @@ -258,7 +275,7 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency }; } - private UiFramework GetUiFramework(string? uiFramework) + private UiFramework MapUiFramework(string? uiFramework) { return uiFramework switch { @@ -273,7 +290,7 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency }; } - private DatabaseProvider GetDatabaseProvider(string? databaseProvider) + private DatabaseProvider MapDatabaseProvider(string? databaseProvider) { return databaseProvider switch { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityPropertyNameConstants.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityPropertyNameConstants.cs new file mode 100644 index 0000000000..e772463dcc --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityPropertyNameConstants.cs @@ -0,0 +1,42 @@ +namespace Volo.Abp.Telemetry.Activity; + +public static class ActivityPropertyNameConstants +{ + public const string SessionId = nameof(SessionId); + public const string IsFirstSession = nameof(IsFirstSession); + public const string DeviceId = nameof(DeviceId); + public const string DeviceType = nameof(DeviceType); + public const string DeviceLanguage = nameof(DeviceLanguage); + public const string OperatingSystem = nameof(OperatingSystem); + public const string CountryIsoCode = nameof(CountryIsoCode); + public const string InstalledSoftwares = nameof(InstalledSoftwares); + public const string ControllerCount = nameof(ControllerCount); + public const string EntityCount = nameof(EntityCount); + public const string AbpModuleCount = nameof(AbpModuleCount); + public const string PermissionCount = nameof(PermissionCount); + public const string AppServiceCount = nameof(AppServiceCount); + public const string ProjectType = nameof(ProjectType); + public const string ProjectId = nameof(ProjectId); + public const string SolutionId = nameof(SolutionId); + public const string Template = nameof(Template); + public const string CreatedAbpStudioVersion = nameof(CreatedAbpStudioVersion); + public const string IsTiered = nameof(IsTiered); + public const string UiFramework = nameof(UiFramework); + public const string DatabaseProvider = nameof(DatabaseProvider); + public const string DatabaseManagementSystem = nameof(DatabaseManagementSystem); + public const string IsSeparateTenantSchema = nameof(IsSeparateTenantSchema); + public const string Theme = nameof(Theme); + public const string ThemeStyle = nameof(ThemeStyle); + public const string MobileFramework = nameof(MobileFramework); + public const string HasPublicWebsite = nameof(HasPublicWebsite); + public const string IncludeTests = nameof(IncludeTests); + public const string MultiTenancy = nameof(MultiTenancy); + public const string DynamicLocalization = nameof(DynamicLocalization); + public const string KubernetesConfiguration = nameof(KubernetesConfiguration); + public const string GrafanaDashboard = nameof(GrafanaDashboard); + public const string SocialLogins = nameof(SocialLogins); + public const string InstalledModules = nameof(InstalledModules); + public const string ProjectAssemblyForScan = nameof(ProjectAssemblyForScan); + public const string SolutionPath = nameof(SolutionPath); + public const string Assembly = nameof(Assembly); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Helpers/AbpPackageMetadataHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Helpers/AbpPackageMetadataHelper.cs index 2ec82f67bc..b85c050996 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Helpers/AbpPackageMetadataHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Helpers/AbpPackageMetadataHelper.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Reflection; using System.Text.Json; -namespace Helpers; +namespace Volo.Abp.Telemetry.Helpers; public static class AbpPackageMetadataHelper { @@ -22,9 +22,19 @@ public static class AbpPackageMetadataHelper var abppkgPath = Directory.GetFiles(dir, "*.abppkg").FirstOrDefault(); if (abppkgPath == null) + { return null; + } - return ReadOrCreateMetadata(abppkgPath); + var metadata = ReadOrCreateMetadata(abppkgPath); + var abpslnPath = FindAbpSlnFile(dir); + if (!abpslnPath.IsNullOrEmpty()) + { + metadata.AbpSlnPath = abpslnPath; + } + + + return metadata; } private static AbpPackageMetadata ReadOrCreateMetadata(string path) @@ -57,11 +67,29 @@ public static class AbpPackageMetadataHelper return metadata; } + + private static string? FindAbpSlnFile(string startingDir) + { + var currentDir = new DirectoryInfo(startingDir); + + while (currentDir != null) + { + var abpslnFile = currentDir.GetFiles("*.abpsln").FirstOrDefault(); + if (abpslnFile != null) + { + return abpslnFile.FullName; + } + + currentDir = currentDir.Parent; + } + + return null; + } } public class AbpPackageMetadata { public string? ProjectId { get; set; } public string? Role { get; set; } - + public string? AbpSlnPath { get; set; } } \ No newline at end of file