Browse Source

Refactor Telemetry system for modularity and enum sharing

pull/23059/head
Emre KARA 1 year ago
parent
commit
5828eeb840
  1. 21
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionInfoContributor.cs
  2. 49
      framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs
  3. 31
      framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs
  4. 44
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityDataProvider.cs
  5. 3
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityPropertyNameConstants.cs
  6. 26
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityStorage.cs
  7. 7
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/IActivityDataProvider.cs
  8. 22
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/IActivityStorage.cs
  9. 24
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ApplicationInfoProvider.cs
  10. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Contracts/SoftwareInfo.cs
  11. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/AbpStudioDetector.cs
  12. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/ChromeDetector.cs
  13. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/DotnetSdkDetector.cs
  14. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/FireFoxDetector.cs
  15. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/MsEdgeDetector.cs
  16. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/NodeJsDetector.cs
  17. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/OperatingSystemDetector.cs
  18. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/RiderDetector.cs
  19. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/VisualStudioCodeDetector.cs
  20. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/DeviceInfoProvider.cs
  21. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/IDeviceInfoProvider.cs
  22. 5
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Helpers/AbpPackageMetadataHelper.cs
  23. 6
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/IApplicationScanner.cs
  24. 10
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ITelemetryApplicationInfoContributor.cs
  25. 4
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ITelemetryService.cs
  26. 27
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ModuleInfoContributor.cs
  27. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/AbpTool.cs
  28. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/ApplicationType.cs
  29. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/DatabaseProvider.cs
  30. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/Dbms.cs
  31. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/DeviceType.cs
  32. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/LicenseType.cs
  33. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/MobileApp.cs
  34. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/OperationSystem.cs
  35. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/SoftwareType.cs
  36. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/SolutionTemplate.cs
  37. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/UiFramework.cs
  38. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/UiTheme.cs
  39. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/UiThemeStyle.cs
  40. 12
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/TelemetryDataSender.cs
  41. 8
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/TelemetryService.cs
  42. 26
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Telemetry/DomainInfoContributor.cs

21
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionInfoContributor.cs

@ -0,0 +1,21 @@
using System.Threading.Tasks;
using Volo.Abp.Telemetry;
using Volo.Abp.Telemetry.Activity;
namespace Volo.Abp.Authorization.Permissions;
public class PermissionInfoContributor : ITelemetryApplicationInfoContributor
{
private readonly IPermissionDefinitionManager _permissionDefinitionManager;
public PermissionInfoContributor(IPermissionDefinitionManager permissionDefinitionManager)
{
_permissionDefinitionManager = permissionDefinitionManager;
}
public async Task ContributeAsync(ActivityData activityData)
{
var permissions = await _permissionDefinitionManager.GetPermissionsAsync();
activityData.Add(ActivityPropertyNameConstants.PermissionCount, permissions.Count);
}
}

49
framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs

@ -1,7 +1,13 @@
using System;
using System.Reflection;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Volo.Abp.Telemetry;
using Volo.Abp.Telemetry.Activity;
using Volo.Abp.Telemetry.Helpers;
namespace Volo.Abp;
@ -44,6 +50,8 @@ internal class AbpApplicationWithExternalServiceProvider : AbpApplicationBase, I
SetServiceProvider(serviceProvider);
await InitializeModulesAsync();
ConfigureTelemetry(serviceProvider);
}
public void Initialize([NotNull] IServiceProvider serviceProvider)
@ -53,8 +61,49 @@ internal class AbpApplicationWithExternalServiceProvider : AbpApplicationBase, I
SetServiceProvider(serviceProvider);
InitializeModules();
ConfigureTelemetry(serviceProvider);
}
private void ConfigureTelemetry(IServiceProvider serviceProvider)
{
Task.Run(async () =>
{
try
{
using var scope = serviceProvider.CreateScope();
var configuration = scope.ServiceProvider.GetRequiredService<IConfiguration>();
if (configuration.GetValue<bool>("Abp:Telemetry:Disable"))
{
return;
}
var assembly = Assembly.GetEntryAssembly()!;
var packageMetadata = AbpPackageMetadataHelper.GetMetaData(assembly);
if (packageMetadata != null)
{
var telemetryService = scope.ServiceProvider.GetRequiredService<ITelemetryService>();
await using var _ = telemetryService.TrackActivity(ActivityNameConsts.ApplicationRun, activity =>
{
activity.Add(ActivityPropertyNameConstants.Assembly, assembly.Location);
activity.Add(ActivityPropertyNameConstants.ProjectId, packageMetadata.ProjectId!);
activity.Add(ActivityPropertyNameConstants.ProjectType, packageMetadata.Role!);
activity.Add(ActivityPropertyNameConstants.SolutionPath,
packageMetadata.AbpSlnPath ?? string.Empty);
});
}
}
catch (Exception e)
{
var logger = serviceProvider.GetRequiredService<ILogger<AbpApplicationWithExternalServiceProvider>>();
logger.LogError(e, "An error occurred while configuring telemetry.");
}
});
}
public override void Dispose()
{
base.Dispose();

31
framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs

@ -89,38 +89,13 @@ public abstract class AbpModule :
}
public virtual async Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context)
public virtual Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context)
{
OnPostApplicationInitialization(context);
await ConfigureTelemetry(context);
return Task.CompletedTask;
}
private async Task ConfigureTelemetry(ApplicationInitializationContext context)
{
var configuration = context.ServiceProvider.GetRequiredService<IConfiguration>();
if (configuration.GetValue<bool>("Abp:Telemetry:Disable"))
{
return;
}
var assembly = Assembly.GetEntryAssembly()!;
var packageMetadata = AbpPackageMetadataHelper.GetMetaData(assembly);
if (packageMetadata != null)
{
var telemetryService = context.ServiceProvider.GetRequiredService<ITelemetryService>();
await using var _ = telemetryService.TrackActivity(ActivityNameConsts.ApplicationRun, activity =>
{
activity.Add(ActivityPropertyNameConstants.Assembly, assembly.Location);
activity.Add(ActivityPropertyNameConstants.ProjectId, packageMetadata.ProjectId!);
activity.Add(ActivityPropertyNameConstants.ProjectType, packageMetadata.Role!);
activity.Add(ActivityPropertyNameConstants.SolutionPath, packageMetadata.AbpSlnPath ?? string.Empty);
});
}
}
public virtual void OnPostApplicationInitialization(ApplicationInitializationContext context)
{

44
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityDataProvider.cs

@ -2,16 +2,14 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Telemetry.EnvironmentInspection;
using Volo.Abp.Telemetry.EnvironmentInspection.Contracts;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using DatabaseProvider = Volo.Abp.Telemetry.EnvironmentInspection.Enums.DatabaseProvider;
using MobileApp = Volo.Abp.Telemetry.EnvironmentInspection.Enums.MobileApp;
using Volo.Abp.Telemetry.Shared.Enums;
using DatabaseProvider = Volo.Abp.Telemetry.Shared.Enums.DatabaseProvider;
using MobileApp = Volo.Abp.Telemetry.Shared.Enums.MobileApp;
namespace Volo.Abp.Telemetry.Activity;
@ -19,19 +17,20 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency
{
private readonly IDeviceInfoProvider _deviceInfoProvider;
private readonly ISoftwareInfoProvider _softwareInfoProvider;
private readonly ApplicationInfoProvider _applicationInfoProvider;
private readonly IEnumerable<ITelemetryApplicationInfoContributor> _applicationInfoContributors;
private readonly ModuleInfoContributor _moduleInfoContributor;
public ActivityDataProvider(IDeviceInfoProvider deviceInfoProvider,
ISoftwareInfoProvider softwareInfoProvider, ApplicationInfoProvider applicationInfoProvider)
ISoftwareInfoProvider softwareInfoProvider, IEnumerable<ITelemetryApplicationInfoContributor> applicationInfoContributors, ModuleInfoContributor moduleInfoContributor)
{
_deviceInfoProvider = deviceInfoProvider;
_softwareInfoProvider = softwareInfoProvider;
_applicationInfoProvider = applicationInfoProvider;
_applicationInfoContributors = applicationInfoContributors;
_moduleInfoContributor = moduleInfoContributor;
}
public async Task AddDeviceInformationAsync(ActivityData activityData,
CancellationToken cancellationToken = default)
public async Task AddDeviceInformationAsync(ActivityData activityData)
{
activityData.Add(ActivityPropertyNameConstants.DeviceId, await _deviceInfoProvider.GetDeviceIdAsync());
activityData.Add(ActivityPropertyNameConstants.DeviceType, _deviceInfoProvider.GetDeviceType());
@ -39,32 +38,27 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency
activityData.Add(ActivityPropertyNameConstants.OperatingSystem, _deviceInfoProvider.GetOperatingSystem());
activityData.Add(ActivityPropertyNameConstants.CountryIsoCode, _deviceInfoProvider.GetCountry());
var softwareList = await _softwareInfoProvider.GetSoftwareInfoAsync(cancellationToken);
var softwareList = await _softwareInfoProvider.GetSoftwareInfoAsync();
activityData.Add(ActivityPropertyNameConstants.InstalledSoftwares, softwareList);
}
public void AddApplicationInformation(ActivityData activityData, Assembly assembly)
public async Task AddApplicationInformation(ActivityData activityData)
{
var info = _applicationInfoProvider.ExtractApplicationInfo(assembly);
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);
foreach (var applicationInfoContributor in _applicationInfoContributors)
{
activityData.Remove(ActivityPropertyNameConstants.Assembly);
await applicationInfoContributor.ContributeAsync(activityData);
}
}
public async Task AddSolutionInformationAsync(ActivityData activityData,
CancellationToken cancellationToken = default)
public Task AddSolutionInformationAsync(ActivityData activityData)
{
if (activityData.TryGetValue(ActivityPropertyNameConstants.SolutionPath, out var value))
{
var solutionPath = value as string;
if (string.IsNullOrEmpty(solutionPath) || !File.Exists(solutionPath))
{
return;
return Task.CompletedTask;
}
var solutionJson = File.ReadAllText(solutionPath);
@ -75,7 +69,8 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency
if (!root.TryGetProperty("id", out var idElement) ||
!Guid.TryParse(idElement.GetString(), out var solutionId))
{
return;
return Task.CompletedTask;
}
activityData.Add(ActivityPropertyNameConstants.SolutionId, solutionId);
@ -170,6 +165,7 @@ public class ActivityDataProvider : IActivityDataProvider, IScopedDependency
activityData.Add(ActivityPropertyNameConstants.InstalledModules, modules);
}
}
return Task.CompletedTask;
}

3
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityPropertyNameConstants.cs

@ -12,7 +12,8 @@ public static class ActivityPropertyNameConstants
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 ProjectCount = nameof(ProjectCount);
public const string ModuleCount = nameof(ModuleCount);
public const string PermissionCount = nameof(PermissionCount);
public const string AppServiceCount = nameof(AppServiceCount);
public const string ProjectType = nameof(ProjectType);

26
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityStorage.cs

@ -18,14 +18,14 @@ public class ActivityStorage : IActivityStorage, ISingletonDependency
public async Task BufferActivityAsync(ActivityData activityData, CancellationToken cancellationToken = default)
public async Task BufferActivityAsync(ActivityData activityData)
{
var state = await GetStateAsync();
state.Activities.Add(activityData);
await SaveAsync();
}
public async Task<List<ActivityData>> GetBufferedActivitiesAsync(CancellationToken cancellationToken = default)
public async Task<List<ActivityData>> GetBufferedActivitiesAsync()
{
var state = await GetStateAsync();
return state.Activities;
@ -45,16 +45,14 @@ public class ActivityStorage : IActivityStorage, ISingletonDependency
}
}
public async Task MarkApplicationInfoAsSentAsync(Guid applicationId,
CancellationToken cancellationToken = default)
public async Task MarkApplicationInfoAsSentAsync(Guid applicationId)
{
var state = await GetStateAsync();
state.ApplicationInfos[applicationId] = DateTimeOffset.UtcNow;
await SaveAsync();
}
public async Task<DateTimeOffset?> GetApplicationInfoLastActivitySendTimeAsync(Guid applicationId,
CancellationToken cancellationToken = default)
public async Task<DateTimeOffset?> GetApplicationInfoLastActivitySendTimeAsync(Guid applicationId)
{
var state = await GetStateAsync();
if (state.ApplicationInfos.TryGetValue(applicationId, out var lastActivitySendTime))
@ -65,7 +63,7 @@ public class ActivityStorage : IActivityStorage, ISingletonDependency
return null;
}
public async Task<DateTimeOffset?> GetLastActivitySendTimeAsync(CancellationToken cancellationToken = default)
public async Task<DateTimeOffset?> GetLastActivitySendTimeAsync()
{
var state = await GetStateAsync();
return state.ActivitySendTime;
@ -77,8 +75,7 @@ public class ActivityStorage : IActivityStorage, ISingletonDependency
return state.SessionId ?? null;
}
public async Task<(bool isFirstSession, Guid sessionId)> GetOrCreateSessionInfoAsync(
CancellationToken cancellationToken = default)
public async Task<(bool isFirstSession, Guid sessionId)> GetOrCreateSessionInfoAsync()
{
var state = await GetStateAsync();
state.IsFirstSession ??= true;
@ -96,7 +93,7 @@ public class ActivityStorage : IActivityStorage, ISingletonDependency
await SaveAsync();
}
public async Task MarkActivitiesAsSentAsync(CancellationToken cancellationToken = default)
public async Task MarkActivitiesAsSentAsync()
{
var state = await GetStateAsync();
state.ActivitySendTime = DateTimeOffset.UtcNow;
@ -106,8 +103,7 @@ public class ActivityStorage : IActivityStorage, ISingletonDependency
await SaveAsync();
}
public async Task<DateTimeOffset?> GetLastSolutionInfoSendTimeAsync(Guid id,
CancellationToken cancellationToken = default)
public async Task<DateTimeOffset?> GetLastSolutionInfoSendTimeAsync(Guid id)
{
var state = await GetStateAsync();
@ -119,20 +115,20 @@ public class ActivityStorage : IActivityStorage, ISingletonDependency
return null;
}
public async Task<DateTimeOffset?> GetLastDeviceInfoSendTimeAsync(CancellationToken cancellationToken = default)
public async Task<DateTimeOffset?> GetLastDeviceInfoSendTimeAsync()
{
var state = await GetStateAsync();
return state.LastDeviceInfoSendTime;
}
public async Task MarkSolutionInfoAsSentAsync(Guid id, CancellationToken cancellationToken = default)
public async Task MarkSolutionInfoAsSentAsync(Guid id)
{
var state = await GetStateAsync();
state.Solutions[id] = DateTimeOffset.UtcNow;
await SaveAsync();
}
public async Task MarkDeviceInfoAsSentAsync(CancellationToken cancellationToken = default)
public async Task MarkDeviceInfoAsSentAsync()
{
var state = await GetStateAsync();
state.LastDeviceInfoSendTime = DateTimeOffset.UtcNow;

7
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/IActivityDataProvider.cs

@ -6,8 +6,7 @@ namespace Volo.Abp.Telemetry.Activity;
public interface IActivityDataProvider
{
Task AddDeviceInformationAsync(ActivityData activityData, CancellationToken cancellationToken = default);
void AddApplicationInformation(ActivityData activityData, Assembly assembly);
Task AddSolutionInformationAsync(ActivityData activityData, CancellationToken cancellationToken = default);
Task AddDeviceInformationAsync(ActivityData activityData);
Task AddApplicationInformation(ActivityData activityData);
Task AddSolutionInformationAsync(ActivityData activityData);
}

22
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/IActivityStorage.cs

@ -7,16 +7,16 @@ namespace Volo.Abp.Telemetry.Activity;
public interface IActivityStorage
{
Task<DateTimeOffset?> GetLastActivitySendTimeAsync(CancellationToken cancellationToken = default);
Task<(bool isFirstSession, Guid sessionId)> GetOrCreateSessionInfoAsync(CancellationToken cancellationToken = default);
Task MarkActivitiesAsSentAsync(CancellationToken cancellationToken = default);
Task<DateTimeOffset?> GetLastSolutionInfoSendTimeAsync(Guid solutionId, CancellationToken cancellationToken = default);
Task<DateTimeOffset?> GetLastDeviceInfoSendTimeAsync(CancellationToken cancellationToken = default);
Task MarkDeviceInfoAsSentAsync(CancellationToken cancellationToken = default);
Task MarkSolutionInfoAsSentAsync(Guid solutionId , CancellationToken cancellationToken = default);
Task BufferActivityAsync(ActivityData activityData, CancellationToken cancellationToken = default);
Task<List<ActivityData>> GetBufferedActivitiesAsync(CancellationToken cancellationToken = default);
Task MarkApplicationInfoAsSentAsync(Guid applicationId, CancellationToken cancellationToken = default);
Task<DateTimeOffset?> GetApplicationInfoLastActivitySendTimeAsync(Guid applicationId, CancellationToken cancellationToken = default);
Task<DateTimeOffset?> GetLastActivitySendTimeAsync();
Task<(bool isFirstSession, Guid sessionId)> GetOrCreateSessionInfoAsync();
Task MarkActivitiesAsSentAsync();
Task<DateTimeOffset?> GetLastSolutionInfoSendTimeAsync(Guid solutionId);
Task<DateTimeOffset?> GetLastDeviceInfoSendTimeAsync();
Task MarkDeviceInfoAsSentAsync();
Task MarkSolutionInfoAsSentAsync(Guid solutionId);
Task BufferActivityAsync(ActivityData activityData);
Task<List<ActivityData>> GetBufferedActivitiesAsync();
Task MarkApplicationInfoAsSentAsync(Guid applicationId);
Task<DateTimeOffset?> GetApplicationInfoLastActivitySendTimeAsync(Guid applicationId);
}

24
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ApplicationInfoProvider.cs

@ -1,24 +0,0 @@
using System.Linq;
using System.Reflection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity;
namespace Volo.Abp.Telemetry;
public class ApplicationInfoProvider : ISingletonDependency
{
public ApplicationInfo ExtractApplicationInfo(Assembly assembly)
{
var types = assembly.GetTypes();
return new ApplicationInfo
{
// EntityCount = types.Count(t => typeof(IEntity).IsAssignableFrom(t) && !t.IsAbstract),
// AppServiceCount = types.Count(t => typeof(IApplicationService).IsAssignableFrom(t) && !t.IsAbstract),
// ControllerCount = types.Count(t => typeof(AbpController).IsAssignableFrom(t) && !t.IsAbstract),
// PermissionCount = types.Count(t => typeof(PermissionDefinitionProvider).IsAssignableFrom(t) && !t.IsAbstract),
AbpModuleCount = types.Count(t => typeof(AbpModule).IsAssignableFrom(t) && !t.IsAbstract),
ProjectCount = types.Select(t => t.Assembly.GetName().Name).Distinct().Count()
};
}
}

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Contracts/SoftwareInfo.cs

@ -1,5 +1,5 @@
using System;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection.Contracts;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/AbpStudioDetector.cs

@ -4,7 +4,7 @@ using System.Text.Json;
using System.Threading.Tasks;
using Shared;
using Volo.Abp.Telemetry.EnvironmentInspection.Contracts;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection.Detectors;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/ChromeDetector.cs

@ -3,7 +3,7 @@ using System.IO;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Volo.Abp.Telemetry.EnvironmentInspection.Contracts;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection.Detectors;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/DotnetSdkDetector.cs

@ -1,7 +1,7 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Telemetry.EnvironmentInspection.Contracts;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection.Detectors;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/FireFoxDetector.cs

@ -3,7 +3,7 @@ using System.IO;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Volo.Abp.Telemetry.EnvironmentInspection.Contracts;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection.Detectors;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/MsEdgeDetector.cs

@ -3,7 +3,7 @@ using System.IO;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Volo.Abp.Telemetry.EnvironmentInspection.Contracts;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection.Detectors;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/NodeJsDetector.cs

@ -1,7 +1,7 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Telemetry.EnvironmentInspection.Contracts;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection.Detectors;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/OperatingSystemDetector.cs

@ -4,7 +4,7 @@ using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Microsoft.Win32;
using Volo.Abp.Telemetry.EnvironmentInspection.Contracts;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection.Detectors;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/RiderDetector.cs

@ -5,7 +5,7 @@ using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Xml.Linq;
using Volo.Abp.Telemetry.EnvironmentInspection.Contracts;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection.Detectors;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Detectors/VisualStudioCodeDetector.cs

@ -5,7 +5,7 @@ using System.Runtime.InteropServices;
using System.Text.Json;
using System.Threading.Tasks;
using Volo.Abp.Telemetry.EnvironmentInspection.Contracts;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection.Detectors;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/DeviceInfoProvider.cs

@ -8,7 +8,7 @@ using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Shared;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection;

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/IDeviceInfoProvider.cs

@ -1,6 +1,6 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Telemetry.EnvironmentInspection.Enums;
using Volo.Abp.Telemetry.Shared.Enums;
namespace Volo.Abp.Telemetry.EnvironmentInspection;

5
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Helpers/AbpPackageMetadataHelper.cs

@ -14,11 +14,6 @@ public static class AbpPackageMetadataHelper
var assemblyPath = assembly.Location;
try
{
if (string.IsNullOrWhiteSpace(assemblyPath))
{
return null;
}
var dir = Path.GetDirectoryName(assemblyPath);
if (dir == null)
{

6
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/IApplicationScanner.cs

@ -1,6 +0,0 @@
namespace Volo.Abp.Telemetry;
public interface IApplicationScanner
{
ApplicationInfo Scan();
}

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

@ -0,0 +1,10 @@
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Telemetry.Activity;
namespace Volo.Abp.Telemetry;
public interface ITelemetryApplicationInfoContributor : ISingletonDependency
{
Task ContributeAsync(ActivityData activityData);
}

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

@ -9,6 +9,6 @@ public interface ITelemetryService
{
IAsyncDisposable TrackActivity(string activityName, Action<ActivityData>? configure = null);
IAsyncDisposable TrackActivity(ActivityData activityData);
Task AddActivityAsync(ActivityData data, CancellationToken cancellationToken = default);
Task AddActivityAsync(string activityName, string? details = null, CancellationToken cancellationToken = default);
Task AddActivityAsync(ActivityData data);
Task AddActivityAsync(string activityName, string? details = null);
}

27
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/ModuleInfoContributor.cs

@ -0,0 +1,27 @@
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity;
using Volo.Abp.Telemetry.Activity;
namespace Volo.Abp.Telemetry;
public class ModuleInfoContributor : ITelemetryApplicationInfoContributor
{
public Task ContributeAsync(ActivityData activityData)
{
if (activityData.TryGetValue(ActivityPropertyNameConstants.Assembly, out var assemblyPath))
{
var assembly = Assembly.LoadFrom((string)assemblyPath);
var types = assembly.GetTypes();
var moduleCount = types.Count(t => typeof(AbpModule).IsAssignableFrom(t) && !t.IsAbstract);
var projectCount = types.Select(t => t.Assembly.GetName().Name).Distinct().Count();
activityData.Add(ActivityPropertyNameConstants.ModuleCount, moduleCount);
activityData.Add(ActivityPropertyNameConstants.ProjectCount, projectCount);
}
return Task.CompletedTask;
}
}

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/AbpTool.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/AbpTool.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum AbpTool : byte
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/ApplicationType.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/ApplicationType.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum ApplicationType
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/DatabaseProvider.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/DatabaseProvider.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum DatabaseProvider
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/Dbms.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/Dbms.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum Dbms
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/DeviceType.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/DeviceType.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum DeviceType
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/LicenseType.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/LicenseType.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum LicenseType
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/MobileApp.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/MobileApp.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum MobileApp
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/OperationSystem.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/OperationSystem.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum OperationSystem
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/SoftwareType.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/SoftwareType.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum SoftwareType : byte
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/SolutionTemplate.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/SolutionTemplate.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum SolutionTemplate
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/UiFramework.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/UiFramework.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum UiFramework
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/UiTheme.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/UiTheme.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum UiTheme
{

2
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/EnvironmentInspection/Enums/UiThemeStyle.cs → framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Shared/Enums/UiThemeStyle.cs

@ -1,4 +1,4 @@
namespace Volo.Abp.Telemetry.EnvironmentInspection.Enums;
namespace Volo.Abp.Telemetry.Shared.Enums;
public enum UiThemeStyle
{

12
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/TelemetryDataSender.cs

@ -1,5 +1,6 @@
using System;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Mime;
@ -24,6 +25,7 @@ public class TelemetryDataSender : ITelemetryDataSender , IScopedDependency
#endif
private readonly IActivityStorage _activityStorage;
private readonly IActivityDataProvider _activityDataProvider;
private const int ActivityBatchSize = 50;
public TelemetryDataSender(IActivityStorage activityStorage, IActivityDataProvider activityDataProvider)
{
@ -41,10 +43,12 @@ public class TelemetryDataSender : ITelemetryDataSender , IScopedDependency
if (activities.Count > 0)
{
await AddExtraInformationAsync(activities[0]);
foreach (var activity in activities)
for (var i = 0; i < activities.Count; i += ActivityBatchSize)
{
var activityBatch = activities.Skip(i).Take(ActivityBatchSize).ToList();
await httpClient.PostAsync(ApiUrl,
new StringContent(JsonSerializer.Serialize(activity), Encoding.UTF8, "application/json"));
new StringContent(JsonSerializer.Serialize(activityBatch), Encoding.UTF8, "application/json"));
}
await _activityStorage.MarkActivitiesAsSentAsync();
@ -69,9 +73,9 @@ public class TelemetryDataSender : ITelemetryDataSender , IScopedDependency
}
if (activityData.TryGetValue(ActivityPropertyNameConstants.Assembly, out var assemblyLocation))
if (activityData.ContainsKey(ActivityPropertyNameConstants.Assembly))
{
_activityDataProvider.AddApplicationInformation(activityData, Assembly.LoadFrom((string) assemblyLocation));
await _activityDataProvider.AddApplicationInformation(activityData);
}
if (activityData.TryGetValue(ActivityPropertyNameConstants.SolutionPath, out var path))

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

@ -63,16 +63,16 @@ public class TelemetryService : ITelemetryService , IScopedDependency
await _telemetryDataSender.SendAsync();
}
}
public async Task AddActivityAsync(ActivityData data, CancellationToken cancellationToken = default)
public async Task AddActivityAsync(ActivityData data)
{
await _activityStorage.BufferActivityAsync(data, cancellationToken);
await _activityStorage.BufferActivityAsync(data);
await CheckIfActivitySendTimeIsDueAsync();
}
public async Task AddActivityAsync(string activityName, string? details = null, CancellationToken cancellationToken = default)
public async Task AddActivityAsync(string activityName, string? details = null)
{
await AddActivityAsync(new ActivityData(activityName, details),cancellationToken);
await AddActivityAsync(new ActivityData(activityName, details));
}
}

26
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Telemetry/DomainInfoContributor.cs

@ -0,0 +1,26 @@
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Telemetry;
using Volo.Abp.Telemetry.Activity;
namespace Volo.Abp.Domain.Telemetry;
public class DomainInfoContributor : ITelemetryApplicationInfoContributor
{
public Task ContributeAsync(ActivityData activityData)
{
if (activityData.TryGetValue(ActivityPropertyNameConstants.Assembly, out var assemblyPath))
{
var assembly = Assembly.LoadFrom((string)assemblyPath);
var entityCount = assembly.GetTypes().Count(t => typeof(IEntity).IsAssignableFrom(t) && !t.IsAbstract);
activityData.Add(ActivityPropertyNameConstants.EntityCount, entityCount);
}
return Task.CompletedTask;
}
}
Loading…
Cancel
Save