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 MarkDeviceInfoAsAddedAsync();
Task MarkSolutionInfoAsAddedAsync(Guid solutionId);
Task<DateTimeOffset?> GetLastSolutionInfoSendTimeAsync(Guid solutionId);
Task<DateTimeOffset?> GetLastDeviceInfoSendTimeAsync();
Task MarkApplicationInfoAsAddedAsync(Guid applicationInfo);
Task BufferActivityAsync(ActivityData activityData);
Task<List<ActivityData>> GetBufferedActivitiesAsync();
Task EndSessionAsync();
Task<bool> ShouldAddDeviceInfoAsync();
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 Volo.Abp.DependencyInjection;
using Volo.Abp.Telemetry.Activity.Contracts;
@ -12,24 +13,39 @@ public class TelemetryApplicationInfoEnricher : ITelemetryActivityDataEnricher,
{
private readonly ITelemetrySessionTypeProvider _telemetrySessionTypeProvider;
private readonly IEnumerable<ITelemetryApplicationInfoContributor> _telemetryApplicationInfoContributors;
private readonly ITelemetryActivityStorage _telemetryActivityStorage;
public TelemetryApplicationInfoEnricher(ITelemetrySessionTypeProvider telemetrySessionTypeProvider,
IEnumerable<ITelemetryApplicationInfoContributor> telemetryApplicationInfoContributors)
IEnumerable<ITelemetryApplicationInfoContributor> 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);
}
}
}

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