From e2ecf979a522ca787a518794d71ebd561e70e9a6 Mon Sep 17 00:00:00 2001 From: Emre KARA Date: Tue, 6 May 2025 14:34:26 +0300 Subject: [PATCH] Refactor telemetry and environment inspection logic --- .../Volo/Abp/Modularity/AbpModule.cs | 27 ++++---- .../Abp/Telemetry/Activity/ActivityData.cs | 27 +++++--- .../Activity/ActivityDataProvider.cs | 3 +- .../Activity/ActivityStorageState.cs | 24 ------- .../Enums/ApplicationType.cs | 14 ++++ .../EnvironmentInspection/SoftwareDetector.cs | 3 +- .../SoftwareInfoProvider.cs | 3 +- .../Helpers/AbpPackageMetadataHelper.cs | 67 ++++++++++--------- 8 files changed, 85 insertions(+), 83 deletions(-) create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/ApplicationType.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 8227643465..832142703c 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs @@ -102,25 +102,22 @@ public abstract class AbpModule : { return; } - var packageMetadata = AbpPackageMetadataHelper.GetMetaData(Assembly.GetCallingAssembly()); + + var assembly = Assembly.GetEntryAssembly()!; + + var packageMetadata = AbpPackageMetadataHelper.GetMetaData(assembly); 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(); + var telemetryService = context.ServiceProvider.GetRequiredService(); - await using var _ = telemetryService.TrackActivity(ActivityNameConsts.ApplicationRun, activity => - { - 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); - }); - } + await using var _ = telemetryService.TrackActivity(ActivityNameConsts.ApplicationRun, activity => + { + activity.Add(ActivityPropertyNameConstants.Assembly, assembly); + 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/Activity/ActivityData.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityData.cs index d804a1ad9e..8098188552 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 @@ -5,6 +5,22 @@ namespace Volo.Abp.Telemetry.Activity; public class ActivityData : Dictionary { + public ActivityData() + { + + } + + public ActivityData(string activityName, string? details = null) + { + if (activityName.IsNullOrWhiteSpace()) + { + throw new ArgumentNullException(nameof(activityName)); + } + + ActivityName = activityName; + ActivityDetails = details; + } + public string ActivityName { get => (string) this[nameof(ActivityName)]; @@ -34,14 +50,5 @@ public class ActivityData : Dictionary public DateTimeOffset Time = DateTimeOffset.UtcNow; - public ActivityData(string activityName, string? details = null) - { - if (activityName.IsNullOrWhiteSpace()) - { - throw new ArgumentNullException(nameof(activityName)); - } - - ActivityName = activityName; - ActivityDetails = details; - } + } \ 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 ee8131db4b..27355a1df9 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 @@ -89,8 +89,7 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency 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(ActivityPropertyNameConstants.Assembly); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityStorageState.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityStorageState.cs index 9f42e84ef8..a7c0e33c03 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityStorageState.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityStorageState.cs @@ -17,27 +17,3 @@ public class ActivityStorageState -public class ApplicationInfo -{ - public Guid ApplicationId { get; set; } - public ApplicationType Type { get; set; } - public int EntityCount { get; set; } // Number of entities in the application, to understand its size - public int AppServiceCount { get; set; } // ... - public int ControllerCount { get; set; } // ... - public int PermissionCount { get; set; } // ... - public int AbpModuleCount { get; set; } - -} - -public enum ApplicationType -{ - Unknown = 0, - Console = 1, - MvcUi = 2, - BlazorServerUi = 3, - BlazorWebAssemblyUi = 4, - BlazorWebAppUi = 5, - HttpApi = 6, - AspNetCore = 7 //We could not understand if it is HTTP API or MVC UI or whatever - //TODO: More? -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/ApplicationType.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/ApplicationType.cs new file mode 100644 index 0000000000..81d1160711 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/ApplicationType.cs @@ -0,0 +1,14 @@ +namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums; + +public enum ApplicationType +{ + Unknown = 0, + Console = 1, + MvcUi = 2, + BlazorServerUi = 3, + BlazorWebAssemblyUi = 4, + BlazorWebAppUi = 5, + HttpApi = 6, + AspNetCore = 7 //We could not understand if it is HTTP API or MVC UI or whatever + //TODO: More? +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/SoftwareDetector.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/SoftwareDetector.cs index 2f1dd069c3..c667d203ad 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/SoftwareDetector.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/SoftwareDetector.cs @@ -1,11 +1,12 @@ using System.Diagnostics; using System.Text; using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; using Volo.Abp.Telemetry.EnvironmentInspection.Contracts; namespace Volo.Abp.Telemetry.EnvironmentInspection; -abstract internal class SoftwareDetector : ISoftwareDetector +abstract internal class SoftwareDetector : ISoftwareDetector , ISingletonDependency { public abstract string Name { get; } public abstract Task DetectAsync(); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/SoftwareInfoProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/SoftwareInfoProvider.cs index 68c4a75d66..b52b5dd07d 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/SoftwareInfoProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/SoftwareInfoProvider.cs @@ -1,11 +1,12 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; using Volo.Abp.Telemetry.EnvironmentInspection.Contracts; namespace Volo.Abp.Telemetry.EnvironmentInspection; -internal class SoftwareInfoProvider : ISoftwareInfoProvider +internal class SoftwareInfoProvider : ISoftwareInfoProvider , ISingletonDependency { private readonly IEnumerable _softwareDetectors; 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 b85c050996..9a113e64f1 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 @@ -12,29 +12,39 @@ public static class AbpPackageMetadataHelper public static AbpPackageMetadata? GetMetaData(Assembly assembly) { var assemblyPath = assembly.Location; + try + { + if (string.IsNullOrWhiteSpace(assemblyPath)) + { + return null; + } - if (string.IsNullOrWhiteSpace(assemblyPath)) - return null; + var dir = Path.GetDirectoryName(assemblyPath); + if (dir == null) + { + return null; + } - var dir = Path.GetDirectoryName(assemblyPath); - if (dir == null) - return null; + var abppkgPath = FindFileUpwards(dir, "*.abppkg"); + if (abppkgPath == null) + { + return null; + } - var abppkgPath = Directory.GetFiles(dir, "*.abppkg").FirstOrDefault(); - if (abppkgPath == null) - { - return null; - } + var metadata = ReadOrCreateMetadata(abppkgPath); + + var abpslnPath = FindFileUpwards(dir, "*.abpsln"); + if (!string.IsNullOrEmpty(abpslnPath)) + { + metadata.AbpSlnPath = abpslnPath; + } - var metadata = ReadOrCreateMetadata(abppkgPath); - var abpslnPath = FindAbpSlnFile(dir); - if (!abpslnPath.IsNullOrEmpty()) + return metadata; + } + catch { - metadata.AbpSlnPath = abpslnPath; + return null; } - - - return metadata; } private static AbpPackageMetadata ReadOrCreateMetadata(string path) @@ -44,10 +54,9 @@ public static class AbpPackageMetadataHelper var metadata = new AbpPackageMetadata(); - if (doc.TryGetValue("projectId", out var existingProjectId) && existingProjectId is string id && - !string.IsNullOrWhiteSpace(id)) + if (doc.TryGetValue("projectId", out var existingProjectId) && existingProjectId.ToString() != null) { - metadata.ProjectId = id; + metadata.ProjectId = existingProjectId.ToString()!; } else { @@ -55,29 +64,27 @@ public static class AbpPackageMetadataHelper doc["projectId"] = metadata.ProjectId; } - // Role - if (doc.TryGetValue("role", out var existingRole) && existingRole is string role) + if (doc.TryGetValue("role", out var existingRole) && existingRole.ToString() != null) { - metadata.Role = role; + metadata.Role = existingRole.ToString()!; } - // Save if new ProjectId was generated - var updatedJson = JsonSerializer.Serialize(doc, new JsonSerializerOptions {WriteIndented = true, PropertyNamingPolicy = JsonNamingPolicy.CamelCase}); + var updatedJson = JsonSerializer.Serialize(doc, new JsonSerializerOptions { WriteIndented = true, PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); File.WriteAllText(path, updatedJson); return metadata; } - - private static string? FindAbpSlnFile(string startingDir) + + private static string? FindFileUpwards(string startingDir, string searchPattern) { var currentDir = new DirectoryInfo(startingDir); while (currentDir != null) { - var abpslnFile = currentDir.GetFiles("*.abpsln").FirstOrDefault(); - if (abpslnFile != null) + var file = currentDir.GetFiles(searchPattern).FirstOrDefault(); + if (file != null) { - return abpslnFile.FullName; + return file.FullName; } currentDir = currentDir.Parent;