Browse Source

Refactor telemetry system to use ActivityEvent instead of ActivityData, updating related interfaces and implementations for improved consistency and functionality.

pull/23059/head
Emre KARA 1 year ago
parent
commit
a98411e4f2
  1. 8
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/TelemetryApplicationMetricsContributor.cs
  2. 4
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/TelemetryPermissionInfoContributor.cs
  3. 32
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityDataExtensions.cs
  4. 8
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityEvent.cs
  5. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityDataBuilder.cs
  6. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityDataEnricher.cs
  7. 4
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityStorage.cs
  8. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetryActivityDataBuilder.cs
  9. 6
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetryApplicationInfoEnricher.cs
  10. 6
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetryDeviceInfoEnricher.cs
  11. 16
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetrySolutionInfoEnricher.cs
  12. 6
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorage.cs
  13. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorageState.cs
  14. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ITelemetryApplicationInfoContributor.cs
  15. 8
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ITelemetryService.cs
  16. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ITelemetrySessionProvider.cs
  17. 8
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/TelemetryModuleInfoContributor.cs
  18. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/TelemetryRuntimeSessionProvider.cs
  19. 31
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/TelemetryService.cs
  20. 6
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Telemetry/TelemetryDomainInfoContributor.cs

8
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/TelemetryApplicationMetricsContributor.cs

@ -12,9 +12,9 @@ namespace Volo.Abp.AspNetCore.Mvc;
[ExposeServices(typeof(ITelemetryApplicationInfoContributor))] [ExposeServices(typeof(ITelemetryApplicationInfoContributor))]
public class TelemetryApplicationMetricsContributor : ITelemetryApplicationInfoContributor, ISingletonDependency public class TelemetryApplicationMetricsContributor : ITelemetryApplicationInfoContributor, ISingletonDependency
{ {
public Task ContributeAsync(ActivityData activityData) public Task ContributeAsync(ActivityEvent activityEvent)
{ {
if (activityData.TryGetValue(ActivityPropertyNames.Assembly, out var assemblyPath)) if (activityEvent.TryGetValue(ActivityPropertyNames.Assembly, out var assemblyPath))
{ {
var assembly = Assembly.LoadFrom((string)assemblyPath); var assembly = Assembly.LoadFrom((string)assemblyPath);
var types = assembly.GetTypes(); var types = assembly.GetTypes();
@ -27,8 +27,8 @@ public class TelemetryApplicationMetricsContributor : ITelemetryApplicationInfoC
typeof(AbpController).IsAssignableFrom(t) && typeof(AbpController).IsAssignableFrom(t) &&
!t.IsAbstract); !t.IsAbstract);
activityData[ActivityPropertyNames.AppServiceCount] = appServiceCount; activityEvent[ActivityPropertyNames.AppServiceCount] = appServiceCount;
activityData[ActivityPropertyNames.ControllerCount] = controllerCount; activityEvent[ActivityPropertyNames.ControllerCount] = controllerCount;
} }
return Task.CompletedTask; return Task.CompletedTask;
} }

4
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/TelemetryPermissionInfoContributor.cs

@ -16,9 +16,9 @@ public class TelemetryPermissionInfoContributor : ITelemetryApplicationInfoContr
_permissionDefinitionManager = permissionDefinitionManager; _permissionDefinitionManager = permissionDefinitionManager;
} }
public async Task ContributeAsync(ActivityData activityData) public async Task ContributeAsync(ActivityEvent activityEvent)
{ {
var permissions = await _permissionDefinitionManager.GetPermissionsAsync(); var permissions = await _permissionDefinitionManager.GetPermissionsAsync();
activityData[ActivityPropertyNames.PermissionCount] = permissions.Count; activityEvent[ActivityPropertyNames.PermissionCount] = permissions.Count;
} }
} }

32
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityDataExtensions.cs

@ -4,46 +4,46 @@ namespace Volo.Abp.Telemetry.Activity;
public static class ActivityDataExtensions public static class ActivityDataExtensions
{ {
public static ActivityData WithAdditionalProperty(this ActivityData activityData, string key, object value) public static ActivityEvent WithAdditionalProperty(this ActivityEvent activityEvent, string key, object value)
{ {
activityData.AdditionalProperties ??= new Dictionary<string, object>(); activityEvent.AdditionalProperties ??= new Dictionary<string, object>();
activityData.AdditionalProperties[key] = value; activityEvent.AdditionalProperties[key] = value;
return activityData; return activityEvent;
} }
public static ActivityData WithAdditionalProperties(this ActivityData activityData, Dictionary<string, object> properties) public static ActivityEvent WithAdditionalProperties(this ActivityEvent activityEvent, Dictionary<string, object> properties)
{ {
activityData.AdditionalProperties ??= new Dictionary<string, object>(); activityEvent.AdditionalProperties ??= new Dictionary<string, object>();
foreach (var property in properties) foreach (var property in properties)
{ {
activityData.AdditionalProperties[property.Key] = property.Value; activityEvent.AdditionalProperties[property.Key] = property.Value;
} }
return activityData; return activityEvent;
} }
public static ActivityData WithAdditionalProperties(this ActivityData activityData, params (string key, object value)[] properties) public static ActivityEvent WithAdditionalProperties(this ActivityEvent activityEvent, params (string key, object value)[] properties)
{ {
activityData.AdditionalProperties ??= new Dictionary<string, object>(); activityEvent.AdditionalProperties ??= new Dictionary<string, object>();
foreach (var (key, value) in properties) foreach (var (key, value) in properties)
{ {
activityData.AdditionalProperties[key] = value; activityEvent.AdditionalProperties[key] = value;
} }
return activityData; return activityEvent;
} }
public static ActivityData WithAdditionalProperties(this ActivityData activityData, object properties) public static ActivityEvent WithAdditionalProperties(this ActivityEvent activityEvent, object properties)
{ {
activityData.AdditionalProperties ??= new Dictionary<string, object>(); activityEvent.AdditionalProperties ??= new Dictionary<string, object>();
foreach (var property in properties.GetType().GetProperties()) foreach (var property in properties.GetType().GetProperties())
{ {
var value = property.GetValue(properties); var value = property.GetValue(properties);
if (value != null) if (value != null)
{ {
activityData.AdditionalProperties[property.Name] = value; activityEvent.AdditionalProperties[property.Name] = value;
} }
} }
return activityData; return activityEvent;
} }
} }

8
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityData.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityEvent.cs

@ -3,9 +3,13 @@ using System.Collections.Generic;
namespace Volo.Abp.Telemetry.Activity; namespace Volo.Abp.Telemetry.Activity;
public class ActivityData : Dictionary<string, object> public class ActivityEvent : Dictionary<string, object>
{ {
public ActivityData(string activityName, string? details = null) private ActivityEvent()
{
}
public ActivityEvent(string activityName, string? details = null)
{ {
if (activityName.IsNullOrWhiteSpace()) if (activityName.IsNullOrWhiteSpace())
{ {

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityDataBuilder.cs

@ -4,5 +4,5 @@ namespace Volo.Abp.Telemetry.Activity.Contracts;
public interface ITelemetryActivityDataBuilder public interface ITelemetryActivityDataBuilder
{ {
Task BuildAsync(ActivityData activity); Task BuildAsync(ActivityEvent activity);
} }

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityDataEnricher.cs

@ -4,5 +4,5 @@ namespace Volo.Abp.Telemetry.Activity.Contracts;
public interface ITelemetryActivityDataEnricher public interface ITelemetryActivityDataEnricher
{ {
Task EnrichAsync(ActivityData activity); Task EnrichAsync(ActivityEvent activity);
} }

4
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityStorage.cs

@ -11,8 +11,8 @@ public interface ITelemetryActivityStorage
Task MarkDeviceInfoAsAddedAsync(); Task MarkDeviceInfoAsAddedAsync();
Task MarkSolutionInfoAsAddedAsync(Guid solutionId); Task MarkSolutionInfoAsAddedAsync(Guid solutionId);
Task MarkApplicationInfoAsAddedAsync(Guid applicationInfo); Task MarkApplicationInfoAsAddedAsync(Guid applicationInfo);
Task BufferActivityAsync(ActivityData activityData); Task BufferActivityAsync(ActivityEvent activityEvent);
Task<List<ActivityData>> GetBufferedActivitiesAsync(); Task<List<ActivityEvent>> GetBufferedActivitiesAsync();
Task EndSessionAsync(); Task EndSessionAsync();
Task<bool> ShouldAddDeviceInfoAsync(); Task<bool> ShouldAddDeviceInfoAsync();
Task<bool> ShouldAddSolutionInformation(Guid solutionId); Task<bool> ShouldAddSolutionInformation(Guid solutionId);

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetryActivityDataBuilder.cs

@ -16,7 +16,7 @@ public class TelemetryActivityDataBuilder : ITelemetryActivityDataBuilder, ISing
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
} }
public virtual async Task BuildAsync(ActivityData activity) public virtual async Task BuildAsync(ActivityEvent activity)
{ {
var sessionProvider = _serviceProvider.GetRequiredService<ITelemetrySessionProvider>(); var sessionProvider = _serviceProvider.GetRequiredService<ITelemetrySessionProvider>();

6
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetryApplicationInfoEnricher.cs

@ -22,7 +22,7 @@ public class TelemetryApplicationInfoEnricher : ITelemetryActivityDataEnricher,
_telemetryActivityStorage = telemetryActivityStorage; _telemetryActivityStorage = telemetryActivityStorage;
} }
public async Task EnrichAsync(ActivityData activity) public async Task EnrichAsync(ActivityEvent activity)
{ {
if (!ShouldEnrichActivity(activity)) if (!ShouldEnrichActivity(activity))
{ {
@ -57,7 +57,7 @@ public class TelemetryApplicationInfoEnricher : ITelemetryActivityDataEnricher,
} }
} }
private bool ShouldEnrichActivity(ActivityData activity) private bool ShouldEnrichActivity(ActivityEvent activity)
{ {
return activity.ContainsKey(ActivityPropertyNames.Assembly) return activity.ContainsKey(ActivityPropertyNames.Assembly)
&& activity.TryGetValue(ActivityPropertyNames.SessionType, out var sessionTypeObj) && activity.TryGetValue(ActivityPropertyNames.SessionType, out var sessionTypeObj)
@ -65,7 +65,7 @@ public class TelemetryApplicationInfoEnricher : ITelemetryActivityDataEnricher,
&& parsed == SessionType.ApplicationRuntime; && parsed == SessionType.ApplicationRuntime;
} }
private static Guid? ExtractProjectId(ActivityData activity) private static Guid? ExtractProjectId(ActivityEvent activity)
{ {
if (!activity.TryGetValue(ActivityPropertyNames.ProjectId, out var projectIdObj) || if (!activity.TryGetValue(ActivityPropertyNames.ProjectId, out var projectIdObj) ||
projectIdObj is not string projectIdStr || projectIdObj is not string projectIdStr ||

6
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetryDeviceInfoEnricher.cs

@ -30,7 +30,7 @@ public class TelemetryDeviceInfoEnricher : ITelemetryActivityDataEnricher, ISing
_deviceId = new Lazy<Guid?>(GetDeviceId); _deviceId = new Lazy<Guid?>(GetDeviceId);
} }
public async Task EnrichAsync(ActivityData activity) public async Task EnrichAsync(ActivityEvent activity)
{ {
if (_deviceId.Value.HasValue) if (_deviceId.Value.HasValue)
{ {
@ -48,7 +48,7 @@ public class TelemetryDeviceInfoEnricher : ITelemetryActivityDataEnricher, ISing
await _telemetryActivityStorage.MarkDeviceInfoAsAddedAsync(); await _telemetryActivityStorage.MarkDeviceInfoAsAddedAsync();
} }
private void EnrichWithDeviceInfo(ActivityData activity) private void EnrichWithDeviceInfo(ActivityEvent activity)
{ {
activity[ActivityPropertyNames.DeviceType] = GetDeviceType(); activity[ActivityPropertyNames.DeviceType] = GetDeviceType();
activity[ActivityPropertyNames.DeviceLanguage] = GetLanguage(); activity[ActivityPropertyNames.DeviceLanguage] = GetLanguage();
@ -56,7 +56,7 @@ public class TelemetryDeviceInfoEnricher : ITelemetryActivityDataEnricher, ISing
activity[ActivityPropertyNames.CountryIsoCode] = GetCountry(); activity[ActivityPropertyNames.CountryIsoCode] = GetCountry();
} }
private async Task EnrichWithSoftwareInfoAsync(ActivityData activity) private async Task EnrichWithSoftwareInfoAsync(ActivityEvent activity)
{ {
var softwareList = await _softwareInfoProvider.GetSoftwareInfoAsync(); var softwareList = await _softwareInfoProvider.GetSoftwareInfoAsync();
activity[ActivityPropertyNames.InstalledSoftwares] = softwareList; activity[ActivityPropertyNames.InstalledSoftwares] = softwareList;

16
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetrySolutionInfoEnricher.cs

@ -24,7 +24,7 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityDataEnricher, ISi
public async Task EnrichAsync(ActivityData activity) public async Task EnrichAsync(ActivityEvent activity)
{ {
var solutionId = GetSolutionId(activity); var solutionId = GetSolutionId(activity);
if (solutionId.HasValue) if (solutionId.HasValue)
@ -40,7 +40,7 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityDataEnricher, ISi
} }
} }
private Guid? GetSolutionId(ActivityData activity) private Guid? GetSolutionId(ActivityEvent activity)
{ {
if (TryGetSolutionIdFromActivity(activity, out var solutionId)) if (TryGetSolutionIdFromActivity(activity, out var solutionId))
{ {
@ -55,11 +55,11 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityDataEnricher, ISi
return null; return null;
} }
private async Task FillSolutionInfoAsync(ActivityData activityData) private async Task FillSolutionInfoAsync(ActivityEvent activityEvent)
{ {
try try
{ {
if (!activityData.TryGetValue(ActivityPropertyNames.SolutionPath, out var rawSolutionPath) if (!activityEvent.TryGetValue(ActivityPropertyNames.SolutionPath, out var rawSolutionPath)
|| string.IsNullOrWhiteSpace(rawSolutionPath?.ToString()) || string.IsNullOrWhiteSpace(rawSolutionPath?.ToString())
|| !File.Exists(rawSolutionPath?.ToString())) || !File.Exists(rawSolutionPath?.ToString()))
{ {
@ -77,13 +77,13 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityDataEnricher, ISi
using var doc = JsonDocument.Parse(jsonContent); using var doc = JsonDocument.Parse(jsonContent);
var root = doc.RootElement; var root = doc.RootElement;
AddSolutionInformation(activityData, root.GetProperty("creatingStudioConfiguration")); AddSolutionInformation(activityEvent, root.GetProperty("creatingStudioConfiguration"));
if (root.TryGetProperty("modules", out var modulesElement) && if (root.TryGetProperty("modules", out var modulesElement) &&
modulesElement.ValueKind == JsonValueKind.Object) modulesElement.ValueKind == JsonValueKind.Object)
{ {
var directoryPath = Path.GetDirectoryName(solutionPath)!; var directoryPath = Path.GetDirectoryName(solutionPath)!;
activityData[ActivityPropertyNames.InstalledModules] = ExtractModules(directoryPath, modulesElement); activityEvent[ActivityPropertyNames.InstalledModules] = ExtractModules(directoryPath, modulesElement);
} }
} }
catch catch
@ -92,7 +92,7 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityDataEnricher, ISi
} }
} }
private bool TryGetSolutionIdFromActivity(ActivityData activity, out Guid solutionId) private bool TryGetSolutionIdFromActivity(ActivityEvent activity, out Guid solutionId)
{ {
solutionId = Guid.Empty; solutionId = Guid.Empty;
@ -106,7 +106,7 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityDataEnricher, ISi
return false; return false;
} }
private bool TryGetSolutionIdFromFile(ActivityData activity, out Guid solutionId) private bool TryGetSolutionIdFromFile(ActivityEvent activity, out Guid solutionId)
{ {
solutionId = Guid.Empty; solutionId = Guid.Empty;

6
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorage.cs

@ -28,15 +28,15 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
_activitySendPeriod = isTestMode ? TimeSpan.FromSeconds(5) : TimeSpan.FromDays(1); _activitySendPeriod = isTestMode ? TimeSpan.FromSeconds(5) : TimeSpan.FromDays(1);
} }
public async Task BufferActivityAsync(ActivityData activityData) public async Task BufferActivityAsync(ActivityEvent activityEvent)
{ {
await ModifyStateAsync(state => await ModifyStateAsync(state =>
{ {
state.Activities.Insert(0, activityData); state.Activities.Insert(0, activityEvent);
}); });
} }
public async Task<List<ActivityData>> GetBufferedActivitiesAsync() public async Task<List<ActivityEvent>> GetBufferedActivitiesAsync()
{ {
var state = await GetStateAsync(); var state = await GetStateAsync();
return state.Activities; return state.Activities;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorageState.cs

@ -8,7 +8,7 @@ public class TelemetryActivityStorageState
public DateTimeOffset? ActivitySendTime { get; set; } public DateTimeOffset? ActivitySendTime { get; set; }
public DateTimeOffset? LastDeviceInfoAddTime { get; set; } public DateTimeOffset? LastDeviceInfoAddTime { get; set; }
public Guid? SessionId { get; set; } public Guid? SessionId { get; set; }
public List<ActivityData> Activities { get; set; } = new(); public List<ActivityEvent> Activities { get; set; } = new();
public Dictionary<Guid,DateTimeOffset> Solutions { get; set; } = new(); public Dictionary<Guid,DateTimeOffset> Solutions { get; set; } = new();
public Dictionary<Guid, DateTimeOffset> Applications { get; set; } = new(); public Dictionary<Guid, DateTimeOffset> Applications { get; set; } = new();

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ITelemetryApplicationInfoContributor.cs

@ -5,5 +5,5 @@ namespace Volo.Abp.Telemetry;
public interface ITelemetryApplicationInfoContributor public interface ITelemetryApplicationInfoContributor
{ {
Task ContributeAsync(ActivityData activityData); Task ContributeAsync(ActivityEvent activityEvent);
} }

8
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ITelemetryService.cs

@ -8,11 +8,11 @@ namespace Volo.Abp.Telemetry;
public interface ITelemetryService public interface ITelemetryService
{ {
IAsyncDisposable TrackActivity(string activityName, Action<ActivityData>? configure = null); IAsyncDisposable TrackActivity(string activityName, Action<ActivityEvent>? configure = null);
IAsyncDisposable TrackActivity(ActivityData activityData); IAsyncDisposable TrackActivity(ActivityEvent activityEvent);
Task AddActivityAsync(ActivityData data); Task AddActivityAsync(ActivityEvent @event);
Task AddActivityAsync(string activityName, string? details = null); Task AddActivityAsync(string activityName, string? details = null);
Task AddActivityAsync(string activityName, Action<ActivityData> configure); Task AddActivityAsync(string activityName, Action<ActivityEvent> configure);
Task AddErrorActivityAsync(Action<Dictionary<string, object>> configure); Task AddErrorActivityAsync(Action<Dictionary<string, object>> configure);
Task AddErrorActivityAsync(string errorMessage); Task AddErrorActivityAsync(string errorMessage);
Task AddErrorForActivityAsync(string failingActivity, string errorMessage); Task AddErrorForActivityAsync(string failingActivity, string errorMessage);

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ITelemetrySessionProvider.cs

@ -5,5 +5,5 @@ namespace Volo.Abp.Telemetry;
public interface ITelemetrySessionProvider public interface ITelemetrySessionProvider
{ {
Task AddSessionInfoAsync(ActivityData activity); Task AddSessionInfoAsync(ActivityEvent activity);
} }

8
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/TelemetryModuleInfoContributor.cs

@ -11,17 +11,17 @@ namespace Volo.Abp.Telemetry;
[ExposeServices(typeof(ITelemetryApplicationInfoContributor))] [ExposeServices(typeof(ITelemetryApplicationInfoContributor))]
public class TelemetryModuleInfoContributor : ITelemetryApplicationInfoContributor, ISingletonDependency public class TelemetryModuleInfoContributor : ITelemetryApplicationInfoContributor, ISingletonDependency
{ {
public Task ContributeAsync(ActivityData activityData) public Task ContributeAsync(ActivityEvent activityEvent)
{ {
if (activityData.TryGetValue(ActivityPropertyNames.Assembly, out var assemblyPath)) if (activityEvent.TryGetValue(ActivityPropertyNames.Assembly, out var assemblyPath))
{ {
var assembly = Assembly.LoadFrom((string)assemblyPath); var assembly = Assembly.LoadFrom((string)assemblyPath);
var types = assembly.GetTypes(); var types = assembly.GetTypes();
var moduleCount = types.Count(t => typeof(AbpModule).IsAssignableFrom(t) && !t.IsAbstract); var moduleCount = types.Count(t => typeof(AbpModule).IsAssignableFrom(t) && !t.IsAbstract);
var projectCount = types.Select(t => t.Assembly.GetName().Name).Distinct().Count(); var projectCount = types.Select(t => t.Assembly.GetName().Name).Distinct().Count();
activityData[ActivityPropertyNames.ModuleCount] = moduleCount; activityEvent[ActivityPropertyNames.ModuleCount] = moduleCount;
activityData[ActivityPropertyNames.ProjectCount] = projectCount; activityEvent[ActivityPropertyNames.ProjectCount] = projectCount;
} }
return Task.CompletedTask; return Task.CompletedTask;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/TelemetryRuntimeSessionProvider.cs

@ -11,7 +11,7 @@ namespace Volo.Abp.Telemetry;
[ExposeServices(typeof(ITelemetrySessionProvider))] [ExposeServices(typeof(ITelemetrySessionProvider))]
public class TelemetryRuntimeSessionProvider : ITelemetrySessionProvider, ISingletonDependency public class TelemetryRuntimeSessionProvider : ITelemetrySessionProvider, ISingletonDependency
{ {
public Task AddSessionInfoAsync(ActivityData activity) public Task AddSessionInfoAsync(ActivityEvent activity)
{ {
activity[ActivityPropertyNames.SessionType] = SessionType.ApplicationRuntime; activity[ActivityPropertyNames.SessionType] = SessionType.ApplicationRuntime;
activity[ActivityPropertyNames.SessionId] = Guid.NewGuid(); activity[ActivityPropertyNames.SessionId] = Guid.NewGuid();

31
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/TelemetryService.cs

@ -6,6 +6,7 @@ using Volo.Abp.DependencyInjection;
using Volo.Abp.Telemetry.Activity; using Volo.Abp.Telemetry.Activity;
using Volo.Abp.Telemetry.Activity.Contracts; using Volo.Abp.Telemetry.Activity.Contracts;
using Volo.Abp.Telemetry.Constants; using Volo.Abp.Telemetry.Constants;
using ActivityEvent = Volo.Abp.Telemetry.Activity.ActivityEvent;
namespace Volo.Abp.Telemetry; namespace Volo.Abp.Telemetry;
@ -23,11 +24,11 @@ public class TelemetryService : ITelemetryService, ISingletonDependency
_telemetryActivityDataBuilder = telemetryActivityDataBuilder; _telemetryActivityDataBuilder = telemetryActivityDataBuilder;
} }
public IAsyncDisposable TrackActivity(string activityName, Action<ActivityData>? configure = null) public IAsyncDisposable TrackActivity(string activityName, Action<ActivityEvent>? configure = null)
{ {
Check.NotNullOrEmpty(activityName, nameof(activityName)); Check.NotNullOrEmpty(activityName, nameof(activityName));
var stopwatch = Stopwatch.StartNew(); var stopwatch = Stopwatch.StartNew();
var activityData = new ActivityData(activityName); var activityData = new ActivityEvent(activityName);
configure?.Invoke(activityData); configure?.Invoke(activityData);
@ -40,30 +41,30 @@ public class TelemetryService : ITelemetryService, ISingletonDependency
}); });
} }
public IAsyncDisposable TrackActivity(ActivityData activityData) public IAsyncDisposable TrackActivity(ActivityEvent activityEvent)
{ {
var stopwatch = Stopwatch.StartNew(); var stopwatch = Stopwatch.StartNew();
return new AsyncDisposeFunc(async () => return new AsyncDisposeFunc(async () =>
{ {
stopwatch.Stop(); stopwatch.Stop();
activityData.ActivityDuration = stopwatch.ElapsedMilliseconds; activityEvent.ActivityDuration = stopwatch.ElapsedMilliseconds;
await AddActivityAsync(activityData); await AddActivityAsync(activityEvent);
}); });
} }
public Task AddActivityAsync(ActivityData data) public Task AddActivityAsync(ActivityEvent @event)
{ {
_ = Task.Run(async () => _ = Task.Run(async () =>
{ {
try try
{ {
await _telemetryActivityDataBuilder.BuildAsync(data); await _telemetryActivityDataBuilder.BuildAsync(@event);
await _telemetryActivityStorage.BufferActivityAsync(data); await _telemetryActivityStorage.BufferActivityAsync(@event);
if (data.ActivityName == ActivityNameConsts.AbpStudioClose) if (@event.ActivityName == ActivityNameConsts.AbpStudioClose)
{ {
await _telemetryActivityStorage.EndSessionAsync(); await _telemetryActivityStorage.EndSessionAsync();
} }
@ -84,13 +85,13 @@ public class TelemetryService : ITelemetryService, ISingletonDependency
public async Task AddActivityAsync(string activityName, string? details = null) public async Task AddActivityAsync(string activityName, string? details = null)
{ {
await AddActivityAsync(new ActivityData(activityName, details)); await AddActivityAsync(new ActivityEvent(activityName, details));
} }
public async Task AddActivityAsync(string activityName, Action<ActivityData> configure) public async Task AddActivityAsync(string activityName, Action<ActivityEvent> configure)
{ {
Check.NotNullOrEmpty(activityName, nameof(activityName)); Check.NotNullOrEmpty(activityName, nameof(activityName));
var activityData = new ActivityData(activityName); var activityData = new ActivityEvent(activityName);
configure?.Invoke(activityData); configure?.Invoke(activityData);
@ -99,7 +100,7 @@ public class TelemetryService : ITelemetryService, ISingletonDependency
public async Task AddErrorActivityAsync(Action<Dictionary<string, object>> configure) public async Task AddErrorActivityAsync(Action<Dictionary<string, object>> configure)
{ {
var activityData = new ActivityData(ActivityNameConsts.Error) var activityData = new ActivityEvent(ActivityNameConsts.Error)
{ {
AdditionalProperties = new Dictionary<string, object>() AdditionalProperties = new Dictionary<string, object>()
}; };
@ -111,7 +112,7 @@ public class TelemetryService : ITelemetryService, ISingletonDependency
public async Task AddErrorActivityAsync(string errorMessage) public async Task AddErrorActivityAsync(string errorMessage)
{ {
var activityData = new ActivityData(ActivityNameConsts.Error) var activityData = new ActivityEvent(ActivityNameConsts.Error)
{ {
AdditionalProperties = new Dictionary<string, object> AdditionalProperties = new Dictionary<string, object>
{ {
@ -124,7 +125,7 @@ public class TelemetryService : ITelemetryService, ISingletonDependency
public async Task AddErrorForActivityAsync(string failingActivity, string errorMessage) public async Task AddErrorForActivityAsync(string failingActivity, string errorMessage)
{ {
var activityData = new ActivityData(ActivityNameConsts.Error) var activityData = new ActivityEvent(ActivityNameConsts.Error)
{ {
AdditionalProperties = new Dictionary<string, object> AdditionalProperties = new Dictionary<string, object>
{ {

6
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Telemetry/TelemetryDomainInfoContributor.cs

@ -12,15 +12,15 @@ namespace Volo.Abp.Domain.Telemetry;
[ExposeServices(typeof(ITelemetryApplicationInfoContributor))] [ExposeServices(typeof(ITelemetryApplicationInfoContributor))]
public class TelemetryDomainInfoContributor : ITelemetryApplicationInfoContributor , ISingletonDependency public class TelemetryDomainInfoContributor : ITelemetryApplicationInfoContributor , ISingletonDependency
{ {
public Task ContributeAsync(ActivityData activityData) public Task ContributeAsync(ActivityEvent activityEvent)
{ {
if (activityData.TryGetValue(ActivityPropertyNames.Assembly, out var assemblyPath)) if (activityEvent.TryGetValue(ActivityPropertyNames.Assembly, out var assemblyPath))
{ {
var assembly = Assembly.LoadFrom((string)assemblyPath); var assembly = Assembly.LoadFrom((string)assemblyPath);
var entityCount = assembly.GetTypes().Count(t => typeof(IEntity).IsAssignableFrom(t) && !t.IsAbstract); var entityCount = assembly.GetTypes().Count(t => typeof(IEntity).IsAssignableFrom(t) && !t.IsAbstract);
activityData[ActivityPropertyNames.EntityCount] = entityCount; activityEvent[ActivityPropertyNames.EntityCount] = entityCount;
} }
return Task.CompletedTask; return Task.CompletedTask;

Loading…
Cancel
Save