Skip to content

Commit e600ee3

Browse files
committed
Enhance telemetry functionality by adding null checks for activity names in TelemetryService and updating TelemetryActivityStorage to improve state management and info expiration logic.
1 parent 3b21575 commit e600ee3

File tree

3 files changed

+57
-58
lines changed

3 files changed

+57
-58
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,5 @@ public interface ITelemetryActivityStorage
1717
Task EndSessionAsync();
1818
Task<bool> ShouldAddDeviceInfoAsync();
1919
Task<bool> ShouldAddSolutionInformation(Guid solutionId);
20-
2120
Task<bool> ShouldAddApplicationInfoAsync(Guid applicationId);
2221
}

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

Lines changed: 55 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ namespace Volo.Abp.Telemetry.Activity.Storage;
1313

1414
public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDependency
1515
{
16+
private const int MaxFileRetries = 5;
17+
private const int RetryDelayMs = 100;
18+
private static readonly TimeSpan InfoExpirationPeriod = TimeSpan.FromDays(7);
19+
1620
private TelemetryActivityStorageState? _cachedState;
1721

1822
public async Task BufferActivityAsync(ActivityData activityData)
@@ -31,19 +35,16 @@ public async Task<List<ActivityData>> GetBufferedActivitiesAsync()
3135
public async Task EndSessionAsync()
3236
{
3337
var state = await GetStateAsync();
34-
3538
state.SessionId = null;
3639
await SaveAsync();
3740
}
3841

39-
4042
public async Task<DateTimeOffset?> GetLastActivitySendTimeAsync()
4143
{
4244
var state = await GetStateAsync();
4345
return state.ActivitySendTime;
4446
}
4547

46-
4748
public async Task<Guid> GetOrCreateSessionInfoAsync()
4849
{
4950
var state = await GetStateAsync();
@@ -58,7 +59,6 @@ public async Task MarkActivitiesAsSentAsync()
5859
state.ActivitySendTime = DateTimeOffset.UtcNow;
5960
state.Activities.Clear();
6061
state.SessionId = null;
61-
6262
await SaveAsync();
6363
}
6464

@@ -68,29 +68,12 @@ public async Task MarkSolutionInfoAsAddedAsync(Guid solutionId)
6868
state.Solutions[solutionId] = DateTimeOffset.UtcNow;
6969
await SaveAsync();
7070
}
71-
public async Task MarkApplicationInfoAsAddedAsync(Guid applicationInfo)
72-
{
73-
var state = await GetStateAsync();
74-
state.Solutions[applicationInfo] = DateTimeOffset.UtcNow;
75-
await SaveAsync();
76-
}
77-
78-
private async Task<DateTimeOffset?> GetLastSolutionInfoSendTimeAsync(Guid id)
79-
{
80-
var state = await GetStateAsync();
81-
82-
if (state.Solutions.TryGetValue(id, out var date))
83-
{
84-
return date;
85-
}
86-
87-
return null;
88-
}
8971

90-
private async Task<DateTimeOffset?> GetLastDeviceInfoSendTimeAsync()
72+
public async Task MarkApplicationInfoAsAddedAsync(Guid applicationId)
9173
{
9274
var state = await GetStateAsync();
93-
return state.LastDeviceInfoAddTime;
75+
state.ApplicationInfos[applicationId] = DateTimeOffset.UtcNow;
76+
await SaveAsync();
9477
}
9578

9679
public async Task MarkDeviceInfoAsAddedAsync()
@@ -99,22 +82,41 @@ public async Task MarkDeviceInfoAsAddedAsync()
9982
state.LastDeviceInfoAddTime = DateTimeOffset.UtcNow;
10083
await SaveAsync();
10184
}
102-
85+
10386
public virtual async Task<bool> ShouldAddDeviceInfoAsync()
10487
{
10588
var lastSend = await GetLastDeviceInfoSendTimeAsync();
106-
return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7);
89+
return ShouldAddInfo(lastSend);
10790
}
10891

10992
public virtual async Task<bool> ShouldAddSolutionInformation(Guid solutionId)
11093
{
11194
var lastSend = await GetLastSolutionInfoSendTimeAsync(solutionId);
112-
return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7);
95+
return ShouldAddInfo(lastSend);
11396
}
97+
11498
public virtual async Task<bool> ShouldAddApplicationInfoAsync(Guid applicationId)
11599
{
116100
var lastSend = await GetLastApplicationInfoSendTimeAsync(applicationId);
117-
return lastSend is null || DateTimeOffset.UtcNow - lastSend > TimeSpan.FromDays(7);
101+
return ShouldAddInfo(lastSend);
102+
}
103+
104+
private async Task<DateTimeOffset?> GetLastSolutionInfoSendTimeAsync(Guid solutionId)
105+
{
106+
var state = await GetStateAsync();
107+
return state.Solutions.TryGetValue(solutionId, out var date) ? date : null;
108+
}
109+
110+
private async Task<DateTimeOffset?> GetLastApplicationInfoSendTimeAsync(Guid applicationId)
111+
{
112+
var state = await GetStateAsync();
113+
return state.ApplicationInfos.TryGetValue(applicationId, out var date) ? date : null;
114+
}
115+
116+
private async Task<DateTimeOffset?> GetLastDeviceInfoSendTimeAsync()
117+
{
118+
var state = await GetStateAsync();
119+
return state.LastDeviceInfoAddTime;
118120
}
119121

120122
private async Task<TelemetryActivityStorageState> GetStateAsync()
@@ -129,19 +131,15 @@ private async Task<TelemetryActivityStorageState> GetStateAsync()
129131
{
130132
using var reader = new StreamReader(stream, Encoding.UTF8);
131133
var json = await reader.ReadToEndAsync();
132-
return JsonSerializer.Deserialize<TelemetryActivityStorageState?>(json,
133-
new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }) ??
134-
new TelemetryActivityStorageState();
135-
});
134+
return JsonSerializer.Deserialize<TelemetryActivityStorageState?>(json, GetJsonSerializerOptions())
135+
?? new TelemetryActivityStorageState();
136+
}) ?? new TelemetryActivityStorageState();
136137
return _cachedState;
137138
}
138139

139-
private async Task<TResult> WithExclusiveFileLockAsync<TResult>(Func<FileStream, Task<TResult>> action)
140+
private async Task<TResult?> WithExclusiveFileLockAsync<TResult>(Func<FileStream, Task<TResult>> action)
140141
{
141-
const int maxRetries = 5;
142-
const int retryDelayMs = 100;
143-
144-
for (int i = 0; i < maxRetries; i++)
142+
for (int i = 0; i < MaxFileRetries; i++)
145143
{
146144
try
147145
{
@@ -156,27 +154,29 @@ private async Task<TResult> WithExclusiveFileLockAsync<TResult>(Func<FileStream,
156154
}
157155
catch (IOException)
158156
{
159-
if (i == maxRetries - 1)
157+
if (i == MaxFileRetries - 1)
160158
{
161-
throw;
159+
return default;
162160
}
163161

164-
await Task.Delay(retryDelayMs);
162+
await Task.Delay(RetryDelayMs);
163+
}
164+
catch
165+
{
166+
return default;
165167
}
166168
}
167169

168-
throw new IOException("Unable to acquire file lock for ActivityStorage.");
170+
return default;
169171
}
170172

171173
private Task SaveAsync()
172174
{
173-
var json = JsonSerializer.Serialize(_cachedState ?? new TelemetryActivityStorageState(),
174-
new JsonSerializerOptions { WriteIndented = true, PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
175+
var json = JsonSerializer.Serialize(_cachedState ?? new TelemetryActivityStorageState(), GetJsonSerializerOptions());
175176
File.WriteAllText(TelemetryPaths.ActivityStorage, json, Encoding.UTF8);
176177
return Task.CompletedTask;
177178
}
178179

179-
180180
private Task EnsureFileExistsAsync()
181181
{
182182
try
@@ -190,31 +190,29 @@ private Task EnsureFileExistsAsync()
190190

191191
if (!File.Exists(TelemetryPaths.ActivityStorage))
192192
{
193-
var json = JsonSerializer.Serialize(_cachedState ?? new TelemetryActivityStorageState(),
194-
new JsonSerializerOptions
195-
{
196-
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = true
197-
});
193+
var json = JsonSerializer.Serialize(_cachedState ?? new TelemetryActivityStorageState(), GetJsonSerializerOptions());
198194
File.WriteAllText(TelemetryPaths.ActivityStorage, json, Encoding.UTF8);
199195
}
200196
}
201197
catch
202198
{
203-
//ignored
199+
// Ignored intentionally
204200
}
205201

206202
return Task.CompletedTask;
207203
}
208204

209-
private async Task<DateTimeOffset?> GetLastApplicationInfoSendTimeAsync(Guid applicationId)
205+
private static JsonSerializerOptions GetJsonSerializerOptions()
210206
{
211-
var state = await GetStateAsync();
212-
if (state.ApplicationInfos.TryGetValue(applicationId, out var lastActivitySendTime))
207+
return new JsonSerializerOptions
213208
{
214-
return lastActivitySendTime;
215-
}
209+
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
210+
WriteIndented = true
211+
};
212+
}
216213

217-
return null;
214+
private static bool ShouldAddInfo(DateTimeOffset? lastSend)
215+
{
216+
return lastSend is null || DateTimeOffset.UtcNow - lastSend > InfoExpirationPeriod;
218217
}
219-
220218
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public TelemetryService(ITelemetryActivityStorage telemetryActivityStorage, ITel
2626

2727
public IAsyncDisposable TrackActivity(string activityName, Action<ActivityData>? configure = null)
2828
{
29+
Check.NotNullOrEmpty(activityName, nameof(activityName));
2930
var stopwatch = Stopwatch.StartNew();
3031
var activityData = new ActivityData(activityName);
3132

@@ -87,6 +88,7 @@ public async Task AddActivityAsync(string activityName, string? details = null)
8788

8889
public async Task AddActivityAsync(string activityName, Action<ActivityData> configure)
8990
{
91+
Check.NotNullOrEmpty(activityName, nameof(activityName));
9092
var activityData = new ActivityData(activityName);
9193

9294
configure?.Invoke(activityData);

0 commit comments

Comments
 (0)