|
|
@ -22,79 +22,72 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityDataEnricher, ISi |
|
|
_telemetryActivityStorage = telemetryActivityStorage; |
|
|
_telemetryActivityStorage = telemetryActivityStorage; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public async Task EnrichAsync(ActivityEvent activity) |
|
|
public async Task EnrichAsync(ActivityEvent activity) |
|
|
{ |
|
|
{ |
|
|
var solutionId = GetSolutionId(activity); |
|
|
if (TryGetSolutionId(activity, out var solutionId)) |
|
|
if (solutionId.HasValue) |
|
|
|
|
|
{ |
|
|
{ |
|
|
if (await _telemetryActivityStorage.ShouldAddSolutionInformation(solutionId.Value)) |
|
|
if (await _telemetryActivityStorage.ShouldAddSolutionInformation(solutionId)) |
|
|
{ |
|
|
{ |
|
|
|
|
|
activity[ActivityPropertyNames.SolutionId] = solutionId; |
|
|
await FillSolutionInfoAsync(activity); |
|
|
await FillSolutionInfoAsync(activity); |
|
|
await _telemetryActivityStorage.MarkSolutionInfoAsAddedAsync(solutionId.Value); |
|
|
await _telemetryActivityStorage.MarkSolutionInfoAsAddedAsync(solutionId); |
|
|
activity[ActivityPropertyNames.HasSolutionInfo] = true; |
|
|
activity[ActivityPropertyNames.HasSolutionInfo] = true; |
|
|
activity.Remove(ActivityPropertyNames.SolutionPath); |
|
|
activity.Remove(ActivityPropertyNames.SolutionPath); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private Guid? GetSolutionId(ActivityEvent activity) |
|
|
private bool TryGetSolutionId(ActivityEvent activity, out Guid solutionId) |
|
|
{ |
|
|
{ |
|
|
if (TryGetSolutionIdFromActivity(activity, out var solutionId)) |
|
|
if (TryGetSolutionIdFromActivity(activity, out solutionId)) |
|
|
{ |
|
|
{ |
|
|
return solutionId; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (TryGetSolutionIdFromFile(activity, out var idFromFile)) |
|
|
if (TryGetSolutionIdFromFile(activity, out solutionId)) |
|
|
{ |
|
|
{ |
|
|
activity[ActivityPropertyNames.SolutionId] = idFromFile; |
|
|
return true; |
|
|
return idFromFile; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return null; |
|
|
solutionId = Guid.Empty; |
|
|
|
|
|
return false; |
|
|
} |
|
|
} |
|
|
private async Task FillSolutionInfoAsync(ActivityEvent activityEvent) |
|
|
|
|
|
|
|
|
private Task FillSolutionInfoAsync(ActivityEvent activity) |
|
|
{ |
|
|
{ |
|
|
try |
|
|
try |
|
|
{ |
|
|
{ |
|
|
if (!activityEvent.TryGetValue(ActivityPropertyNames.SolutionPath, out var rawSolutionPath) |
|
|
if (!activity.TryGetValue(ActivityPropertyNames.SolutionPath, out var rawSolutionPath) |
|
|
|| string.IsNullOrWhiteSpace(rawSolutionPath?.ToString()) |
|
|
|| string.IsNullOrWhiteSpace(rawSolutionPath?.ToString()) |
|
|
|| !File.Exists(rawSolutionPath?.ToString())) |
|
|
|| !File.Exists(rawSolutionPath?.ToString())) |
|
|
{ |
|
|
{ |
|
|
return; |
|
|
return Task.CompletedTask; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var solutionPath = rawSolutionPath!.ToString(); |
|
|
|
|
|
|
|
|
|
|
|
if (!File.Exists(solutionPath)) |
|
|
|
|
|
{ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var solutionPath = rawSolutionPath!.ToString()!; |
|
|
var jsonContent = File.ReadAllText(solutionPath); |
|
|
var jsonContent = File.ReadAllText(solutionPath); |
|
|
using var doc = JsonDocument.Parse(jsonContent); |
|
|
using var doc = JsonDocument.Parse(jsonContent); |
|
|
var root = doc.RootElement; |
|
|
var root = doc.RootElement; |
|
|
|
|
|
|
|
|
AddSolutionInformation(activityEvent, root.GetProperty("creatingStudioConfiguration")); |
|
|
AddSolutionInformation(activity, root.GetProperty("creatingStudioConfiguration")); |
|
|
|
|
|
|
|
|
if (root.TryGetProperty("modules", out var modulesElement) && |
|
|
if (root.TryGetProperty("modules", out var modulesElement) && modulesElement.ValueKind == JsonValueKind.Object) |
|
|
modulesElement.ValueKind == JsonValueKind.Object) |
|
|
|
|
|
{ |
|
|
{ |
|
|
var directoryPath = Path.GetDirectoryName(solutionPath)!; |
|
|
var directoryPath = Path.GetDirectoryName(solutionPath)!; |
|
|
activityEvent[ActivityPropertyNames.InstalledModules] = ExtractModules(directoryPath, modulesElement); |
|
|
activity[ActivityPropertyNames.InstalledModules] = ExtractModules(directoryPath, modulesElement); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
catch |
|
|
catch |
|
|
{ |
|
|
{ |
|
|
// ignored
|
|
|
// ignored
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return Task.CompletedTask; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private bool TryGetSolutionIdFromActivity(ActivityEvent activity, out Guid solutionId) |
|
|
private bool TryGetSolutionIdFromActivity(ActivityEvent activity, out Guid solutionId) |
|
|
{ |
|
|
{ |
|
|
solutionId = Guid.Empty; |
|
|
|
|
|
|
|
|
|
|
|
if (activity.TryGetValue(ActivityPropertyNames.SolutionId, out var value) && |
|
|
if (activity.TryGetValue(ActivityPropertyNames.SolutionId, out var value) && |
|
|
Guid.TryParse(value?.ToString(), out var parsedId)) |
|
|
Guid.TryParse(value?.ToString(), out var parsedId)) |
|
|
@ -102,14 +95,15 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityDataEnricher, ISi |
|
|
solutionId = parsedId; |
|
|
solutionId = parsedId; |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
solutionId = Guid.Empty; |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private bool TryGetSolutionIdFromFile(ActivityEvent activity, out Guid solutionId) |
|
|
private bool TryGetSolutionIdFromFile(ActivityEvent activity, out Guid solutionId) |
|
|
{ |
|
|
{ |
|
|
solutionId = Guid.Empty; |
|
|
solutionId = Guid.Empty; |
|
|
|
|
|
|
|
|
if (!activity.TryGetValue(ActivityPropertyNames.SolutionPath, out var value)) |
|
|
if (!activity.TryGetValue(ActivityPropertyNames.SolutionPath, out var value)) |
|
|
{ |
|
|
{ |
|
|
return false; |
|
|
return false; |
|
|
@ -134,9 +128,9 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityDataEnricher, ISi |
|
|
} |
|
|
} |
|
|
catch |
|
|
catch |
|
|
{ |
|
|
{ |
|
|
// ignore malformed json etc.
|
|
|
// ignored
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -246,5 +240,4 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityDataEnricher, ISi |
|
|
_ => false |
|
|
_ => false |
|
|
}; |
|
|
}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |