Browse Source

Refactor telemetry and environment inspection logic

pull/23059/head
Emre KARA 1 year ago
parent
commit
e2ecf979a5
  1. 27
      framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs
  2. 27
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityData.cs
  3. 3
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityDataProvider.cs
  4. 24
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityStorageState.cs
  5. 14
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/ApplicationType.cs
  6. 3
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/SoftwareDetector.cs
  7. 3
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/SoftwareInfoProvider.cs
  8. 67
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Helpers/AbpPackageMetadataHelper.cs

27
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<IActivityStorage>();
var lastApplicationInfoSendTime = await activityStorage.GetApplicationInfoLastActivitySendTimeAsync(packageMetadata.ProjectId!.To<Guid>());
if (lastApplicationInfoSendTime is null ||
DateTimeOffset.UtcNow - lastApplicationInfoSendTime > TimeSpan.FromDays(7))
{
var telemetryService = context.ServiceProvider.GetRequiredService<ITelemetryService>();
var telemetryService = context.ServiceProvider.GetRequiredService<ITelemetryService>();
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);
});
}
}

27
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityData.cs

@ -5,6 +5,22 @@ namespace Volo.Abp.Telemetry.Activity;
public class ActivityData : Dictionary<string, object>
{
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<string, object>
public DateTimeOffset Time = DateTimeOffset.UtcNow;
public ActivityData(string activityName, string? details = null)
{
if (activityName.IsNullOrWhiteSpace())
{
throw new ArgumentNullException(nameof(activityName));
}
ActivityName = activityName;
ActivityDetails = details;
}
}

3
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);
}

24
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?
}

14
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?
}

3
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<SoftwareInfo?> DetectAsync();

3
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<ISoftwareDetector> _softwareDetectors;

67
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;

Loading…
Cancel
Save