Browse Source

Enhance telemetry functionality by updating TelemetryService to send activities based on a new condition, modifying ActivityData to initialize time correctly, and adding ShouldSendActivitiesAsync method in ITelemetryActivityStorage for improved activity management.

pull/23059/head
Emre KARA 1 year ago
parent
commit
94ecbf3199
  1. 7
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/ActivityData.cs
  2. 1
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Contracts/ITelemetryActivityStorage.cs
  3. 29
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorage.cs
  4. 10
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorageOptions.cs
  5. 19
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/TelemetryService.cs

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

@ -7,6 +7,7 @@ public class ActivityData : Dictionary<string, object>
{
public ActivityData()
{
Time = DateTimeOffset.UtcNow;
}
public ActivityData(string activityName, string? details = null)
@ -18,6 +19,7 @@ public class ActivityData : Dictionary<string, object>
ActivityName = activityName;
ActivityDetails = details;
Time = DateTimeOffset.UtcNow;
}
public string ActivityName {
@ -55,5 +57,8 @@ public class ActivityData : Dictionary<string, object>
}
}
public DateTimeOffset Time = DateTimeOffset.UtcNow;
public DateTimeOffset Time {
get => TryGetValue(nameof(Time), out var value) ? (DateTimeOffset)value : DateTimeOffset.UtcNow;
set => this[nameof(Time)] = value;
}
}

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

@ -18,4 +18,5 @@ public interface ITelemetryActivityStorage
Task<bool> ShouldAddDeviceInfoAsync();
Task<bool> ShouldAddSolutionInformation(Guid solutionId);
Task<bool> ShouldAddApplicationInfoAsync(Guid applicationId);
Task<bool> ShouldSendActivitiesAsync();
}

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

@ -5,6 +5,7 @@ using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Telemetry.Activity.Contracts;
using Volo.Abp.Telemetry.Constants;
@ -15,10 +16,16 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
{
private const int MaxFileRetries = 5;
private const int RetryDelayMs = 100;
private static readonly TimeSpan InfoExpirationPeriod = TimeSpan.FromDays(7);
private readonly TelemetryActivityStorageOptions _options;
private TelemetryActivityStorageState? _cachedState;
public TelemetryActivityStorage(IOptions<TelemetryActivityStorageOptions> options)
{
_options = options?.Value ?? new TelemetryActivityStorageOptions();
}
public async Task BufferActivityAsync(ActivityData activityData)
{
var state = await GetStateAsync();
@ -48,15 +55,15 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
public async Task<(Guid SessionId, bool IsFirstSession)> GetOrCreateSessionAsync()
{
var isFirstSession = !File.Exists(TelemetryPaths.ActivityStorage);
var state = await GetStateAsync();
if (state.SessionId is null)
{
state.SessionId = Guid.NewGuid();
await SaveAsync();
}
return (state.SessionId.Value, isFirstSession);
}
@ -108,6 +115,12 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
return ShouldAddInfo(lastSend);
}
public virtual async Task<bool> ShouldSendActivitiesAsync()
{
var lastActivitySendTime = await GetLastActivitySendTimeAsync();
return lastActivitySendTime is null || DateTimeOffset.UtcNow - lastActivitySendTime > _options.ActivitySendPeriod;
}
private async Task<DateTimeOffset?> GetLastSolutionInfoSendTimeAsync(Guid solutionId)
{
var state = await GetStateAsync();
@ -138,7 +151,7 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
{
using var reader = new StreamReader(stream, Encoding.UTF8);
var json = await reader.ReadToEndAsync();
return JsonSerializer.Deserialize<TelemetryActivityStorageState?>(json, GetJsonSerializerOptions())
return JsonSerializer.Deserialize<TelemetryActivityStorageState?>(json, GetJsonSerializerOptions())
?? new TelemetryActivityStorageState();
}) ?? new TelemetryActivityStorageState();
return _cachedState;
@ -218,8 +231,8 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
};
}
private static bool ShouldAddInfo(DateTimeOffset? lastSend)
private bool ShouldAddInfo(DateTimeOffset? lastSend)
{
return lastSend is null || DateTimeOffset.UtcNow - lastSend > InfoExpirationPeriod;
return lastSend is null || DateTimeOffset.UtcNow - lastSend > _options.InfoExpirationPeriod;
}
}

10
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorageOptions.cs

@ -0,0 +1,10 @@
using System;
namespace Volo.Abp.Telemetry.Activity.Storage;
public class TelemetryActivityStorageOptions
{
public TimeSpan InfoExpirationPeriod { get; set; } = TimeSpan.FromDays(7);
public TimeSpan ActivitySendPeriod { get; set; } = TimeSpan.FromDays(1);
}

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

@ -54,7 +54,7 @@ public class TelemetryService : ITelemetryService, IScopedDependency
});
}
public Task AddActivityAsync(ActivityData data)
{
@ -70,7 +70,10 @@ public class TelemetryService : ITelemetryService, IScopedDependency
await _telemetryActivityStorage.EndSessionAsync();
}
await SendActivityIfDueAsync();
if (await _telemetryActivityStorage.ShouldSendActivitiesAsync())
{
await _telemetryDataSender.SendAsync();
}
}
catch
{
@ -96,7 +99,7 @@ public class TelemetryService : ITelemetryService, IScopedDependency
await AddActivityAsync(activityData);
}
public async Task AddErrorActivityAsync(Action<Dictionary<string,object>> configure)
public async Task AddErrorActivityAsync(Action<Dictionary<string, object>> configure)
{
var activityData = new ActivityData(ActivityNameConsts.Error)
{
@ -121,13 +124,5 @@ public class TelemetryService : ITelemetryService, IScopedDependency
await AddActivityAsync(activityData);
}
private async Task SendActivityIfDueAsync()
{
var lastActivitySendTime = await _telemetryActivityStorage.GetLastActivitySendTimeAsync();
if (lastActivitySendTime is not null && lastActivitySendTime < DateTimeOffset.UtcNow.AddDays(-1))
{
await _telemetryDataSender.SendAsync();
}
}
}
Loading…
Cancel
Save