diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityStorage.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityStorage.cs index dafa727e0d..7be3636022 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityStorage.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityStorage.cs @@ -11,11 +11,12 @@ public interface ITelemetryActivityStorage Task MarkActivitiesAsSentAsync(); Task MarkDeviceInfoAsAddedAsync(); Task MarkSolutionInfoAsAddedAsync(Guid solutionId); - Task GetLastSolutionInfoSendTimeAsync(Guid solutionId); - Task GetLastDeviceInfoSendTimeAsync(); + Task MarkApplicationInfoAsAddedAsync(Guid applicationInfo); Task BufferActivityAsync(ActivityData activityData); Task> GetBufferedActivitiesAsync(); Task EndSessionAsync(); Task ShouldAddDeviceInfoAsync(); Task ShouldAddSolutionInformation(Guid solutionId); + + Task ShouldAddApplicationInfoAsync(Guid applicationId); } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetryApplicationInfoEnricher.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetryApplicationInfoEnricher.cs index 9de497f367..8da018b736 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetryApplicationInfoEnricher.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetryApplicationInfoEnricher.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.Telemetry.Activity.Contracts; @@ -12,24 +13,39 @@ public class TelemetryApplicationInfoEnricher : ITelemetryActivityDataEnricher, { private readonly ITelemetrySessionTypeProvider _telemetrySessionTypeProvider; private readonly IEnumerable _telemetryApplicationInfoContributors; + private readonly ITelemetryActivityStorage _telemetryActivityStorage; public TelemetryApplicationInfoEnricher(ITelemetrySessionTypeProvider telemetrySessionTypeProvider, - IEnumerable telemetryApplicationInfoContributors) + IEnumerable telemetryApplicationInfoContributors, ITelemetryActivityStorage telemetryActivityStorage) { _telemetrySessionTypeProvider = telemetrySessionTypeProvider; _telemetryApplicationInfoContributors = telemetryApplicationInfoContributors; + _telemetryActivityStorage = telemetryActivityStorage; } public async Task EnrichAsync(ActivityData activity) { if (activity.ContainsKey(ActivityPropertyName.Assembly) && _telemetrySessionTypeProvider.SessionType == SessionType.ApplicationRuntime) { + if (!activity.TryGetValue(ActivityPropertyName.ProjectId, out var projectIdObj) || + projectIdObj is not string projectIdStr || + !Guid.TryParse(projectIdStr, out var projectId)) + { + return; + } + + if (!await _telemetryActivityStorage.ShouldAddApplicationInfoAsync(projectId)) + { + return; + } + foreach (var contributor in _telemetryApplicationInfoContributors) { await contributor.ContributeAsync(activity); } activity.Remove(ActivityPropertyName.Assembly); + await _telemetryActivityStorage.MarkApplicationInfoAsAddedAsync(projectId); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorage.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorage.cs index e2e15801ef..fea21ff317 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorage.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorage.cs @@ -68,8 +68,14 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep state.Solutions[solutionId] = DateTimeOffset.UtcNow; await SaveAsync(); } - - public async Task GetLastSolutionInfoSendTimeAsync(Guid id) + public async Task MarkApplicationInfoAsAddedAsync(Guid applicationInfo) + { + var state = await GetStateAsync(); + state.Solutions[applicationInfo] = DateTimeOffset.UtcNow; + await SaveAsync(); + } + + private async Task GetLastSolutionInfoSendTimeAsync(Guid id) { var state = await GetStateAsync(); @@ -81,7 +87,7 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep return null; } - public async Task GetLastDeviceInfoSendTimeAsync() + private async Task GetLastDeviceInfoSendTimeAsync() { var state = await GetStateAsync(); return state.LastDeviceInfoAddTime; @@ -93,6 +99,23 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep state.LastDeviceInfoAddTime = DateTimeOffset.UtcNow; await SaveAsync(); } + + public virtual async Task ShouldAddDeviceInfoAsync() + { + var lastSend = await GetLastDeviceInfoSendTimeAsync(); + return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7); + } + + public virtual async Task ShouldAddSolutionInformation(Guid solutionId) + { + var lastSend = await GetLastSolutionInfoSendTimeAsync(solutionId); + return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7); + } + public virtual async Task ShouldAddApplicationInfoAsync(Guid applicationId) + { + var lastSend = await GetLastApplicationInfoSendTimeAsync(applicationId); + return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7); + } private async Task GetStateAsync() { @@ -183,16 +206,15 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep return Task.CompletedTask; } - - public virtual async Task ShouldAddDeviceInfoAsync() + private async Task GetLastApplicationInfoSendTimeAsync(Guid applicationId) { - var lastSend = await GetLastDeviceInfoSendTimeAsync(); - return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7); - } + var state = await GetStateAsync(); + if (state.ApplicationInfos.TryGetValue(applicationId, out var lastActivitySendTime)) + { + return lastActivitySendTime; + } - public virtual async Task ShouldAddSolutionInformation(Guid solutionId) - { - var lastSend = await GetLastSolutionInfoSendTimeAsync(solutionId); - return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7); + return null; } + } \ No newline at end of file