Browse Source

Refactor telemetry activity storage to support application info.

pull/23059/head
Emre KARA 1 year ago
parent
commit
32cf225fe4
  1. 5
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityStorage.cs
  2. 20
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetryApplicationInfoEnricher.cs
  3. 46
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorage.cs

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

@ -11,11 +11,12 @@ public interface ITelemetryActivityStorage
Task MarkActivitiesAsSentAsync(); Task MarkActivitiesAsSentAsync();
Task MarkDeviceInfoAsAddedAsync(); Task MarkDeviceInfoAsAddedAsync();
Task MarkSolutionInfoAsAddedAsync(Guid solutionId); Task MarkSolutionInfoAsAddedAsync(Guid solutionId);
Task<DateTimeOffset?> GetLastSolutionInfoSendTimeAsync(Guid solutionId); Task MarkApplicationInfoAsAddedAsync(Guid applicationInfo);
Task<DateTimeOffset?> GetLastDeviceInfoSendTimeAsync();
Task BufferActivityAsync(ActivityData activityData); Task BufferActivityAsync(ActivityData activityData);
Task<List<ActivityData>> GetBufferedActivitiesAsync(); Task<List<ActivityData>> GetBufferedActivitiesAsync();
Task EndSessionAsync(); Task EndSessionAsync();
Task<bool> ShouldAddDeviceInfoAsync(); Task<bool> ShouldAddDeviceInfoAsync();
Task<bool> ShouldAddSolutionInformation(Guid solutionId); Task<bool> ShouldAddSolutionInformation(Guid solutionId);
Task<bool> ShouldAddApplicationInfoAsync(Guid applicationId);
} }

20
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 System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Telemetry.Activity.Contracts; using Volo.Abp.Telemetry.Activity.Contracts;
@ -12,24 +13,39 @@ public class TelemetryApplicationInfoEnricher : ITelemetryActivityDataEnricher,
{ {
private readonly ITelemetrySessionTypeProvider _telemetrySessionTypeProvider; private readonly ITelemetrySessionTypeProvider _telemetrySessionTypeProvider;
private readonly IEnumerable<ITelemetryApplicationInfoContributor> _telemetryApplicationInfoContributors; private readonly IEnumerable<ITelemetryApplicationInfoContributor> _telemetryApplicationInfoContributors;
private readonly ITelemetryActivityStorage _telemetryActivityStorage;
public TelemetryApplicationInfoEnricher(ITelemetrySessionTypeProvider telemetrySessionTypeProvider, public TelemetryApplicationInfoEnricher(ITelemetrySessionTypeProvider telemetrySessionTypeProvider,
IEnumerable<ITelemetryApplicationInfoContributor> telemetryApplicationInfoContributors) IEnumerable<ITelemetryApplicationInfoContributor> telemetryApplicationInfoContributors, ITelemetryActivityStorage telemetryActivityStorage)
{ {
_telemetrySessionTypeProvider = telemetrySessionTypeProvider; _telemetrySessionTypeProvider = telemetrySessionTypeProvider;
_telemetryApplicationInfoContributors = telemetryApplicationInfoContributors; _telemetryApplicationInfoContributors = telemetryApplicationInfoContributors;
_telemetryActivityStorage = telemetryActivityStorage;
} }
public async Task EnrichAsync(ActivityData activity) public async Task EnrichAsync(ActivityData activity)
{ {
if (activity.ContainsKey(ActivityPropertyName.Assembly) && _telemetrySessionTypeProvider.SessionType == SessionType.ApplicationRuntime) 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) foreach (var contributor in _telemetryApplicationInfoContributors)
{ {
await contributor.ContributeAsync(activity); await contributor.ContributeAsync(activity);
} }
activity.Remove(ActivityPropertyName.Assembly); activity.Remove(ActivityPropertyName.Assembly);
await _telemetryActivityStorage.MarkApplicationInfoAsAddedAsync(projectId);
} }
} }
} }

46
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; state.Solutions[solutionId] = DateTimeOffset.UtcNow;
await SaveAsync(); await SaveAsync();
} }
public async Task MarkApplicationInfoAsAddedAsync(Guid applicationInfo)
public async Task<DateTimeOffset?> GetLastSolutionInfoSendTimeAsync(Guid id) {
var state = await GetStateAsync();
state.Solutions[applicationInfo] = DateTimeOffset.UtcNow;
await SaveAsync();
}
private async Task<DateTimeOffset?> GetLastSolutionInfoSendTimeAsync(Guid id)
{ {
var state = await GetStateAsync(); var state = await GetStateAsync();
@ -81,7 +87,7 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
return null; return null;
} }
public async Task<DateTimeOffset?> GetLastDeviceInfoSendTimeAsync() private async Task<DateTimeOffset?> GetLastDeviceInfoSendTimeAsync()
{ {
var state = await GetStateAsync(); var state = await GetStateAsync();
return state.LastDeviceInfoAddTime; return state.LastDeviceInfoAddTime;
@ -93,6 +99,23 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
state.LastDeviceInfoAddTime = DateTimeOffset.UtcNow; state.LastDeviceInfoAddTime = DateTimeOffset.UtcNow;
await SaveAsync(); await SaveAsync();
} }
public virtual async Task<bool> ShouldAddDeviceInfoAsync()
{
var lastSend = await GetLastDeviceInfoSendTimeAsync();
return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7);
}
public virtual async Task<bool> ShouldAddSolutionInformation(Guid solutionId)
{
var lastSend = await GetLastSolutionInfoSendTimeAsync(solutionId);
return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7);
}
public virtual async Task<bool> ShouldAddApplicationInfoAsync(Guid applicationId)
{
var lastSend = await GetLastApplicationInfoSendTimeAsync(applicationId);
return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7);
}
private async Task<TelemetryActivityStorageState> GetStateAsync() private async Task<TelemetryActivityStorageState> GetStateAsync()
{ {
@ -183,16 +206,15 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
return Task.CompletedTask; return Task.CompletedTask;
} }
private async Task<DateTimeOffset?> GetLastApplicationInfoSendTimeAsync(Guid applicationId)
public virtual async Task<bool> ShouldAddDeviceInfoAsync()
{ {
var lastSend = await GetLastDeviceInfoSendTimeAsync(); var state = await GetStateAsync();
return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7); if (state.ApplicationInfos.TryGetValue(applicationId, out var lastActivitySendTime))
} {
return lastActivitySendTime;
}
public virtual async Task<bool> ShouldAddSolutionInformation(Guid solutionId) return null;
{
var lastSend = await GetLastSolutionInfoSendTimeAsync(solutionId);
return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7);
} }
} }
Loading…
Cancel
Save