Browse Source

Refactor `TelemetrySolutionInfoEnricher`: remove unused imports, streamline solution info methods, improve exception handling, and enhance code readability.

pull/23059/head
Emre KARA 1 year ago
parent
commit
fe309eda1f
  1. 155
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetrySolutionInfoEnricher.cs

155
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Providers/TelemetrySolutionInfoEnricher.cs

@ -2,8 +2,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json; using System.Text.Json;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -30,7 +28,7 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityEventEnricher, IS
if (await _telemetryActivityStorage.ShouldAddSolutionInformation(solutionId)) if (await _telemetryActivityStorage.ShouldAddSolutionInformation(solutionId))
{ {
activity[ActivityPropertyNames.SolutionId] = solutionId; activity[ActivityPropertyNames.SolutionId] = solutionId;
await FillSolutionInfoAsync(activity); AddSolutionInfo(activity);
await _telemetryActivityStorage.MarkSolutionInfoAsAddedAsync(solutionId); await _telemetryActivityStorage.MarkSolutionInfoAsAddedAsync(solutionId);
activity[ActivityPropertyNames.HasSolutionInfo] = true; activity[ActivityPropertyNames.HasSolutionInfo] = true;
activity.Remove(ActivityPropertyNames.SolutionPath); activity.Remove(ActivityPropertyNames.SolutionPath);
@ -54,142 +52,105 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityEventEnricher, IS
return false; return false;
} }
private Task FillSolutionInfoAsync(ActivityEvent activity) private void AddSolutionInfo(ActivityEvent activity)
{ {
try try
{ {
if (!activity.TryGetValue(ActivityPropertyNames.SolutionPath, out var rawSolutionPath) var solutionPath = activity[ActivityPropertyNames.SolutionPath]!.ToString()!;
|| string.IsNullOrWhiteSpace(rawSolutionPath?.ToString())
|| !File.Exists(rawSolutionPath?.ToString()))
{
return Task.CompletedTask;
}
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(activity, root.GetProperty("creatingStudioConfiguration")); AddSolutionCreationConfiguration(activity, root.GetProperty("creatingStudioConfiguration"));
if (root.TryGetProperty("modules", out var modulesElement) && modulesElement.ValueKind == JsonValueKind.Object) if (root.TryGetProperty("modules", out var modulesElement) &&
modulesElement.ValueKind == JsonValueKind.Object)
{ {
var directoryPath = Path.GetDirectoryName(solutionPath)!; activity[ActivityPropertyNames.InstalledModules] = ExtractModules(solutionPath, 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)
{ {
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))
{ {
solutionId = parsedId; solutionId = parsedId;
return true; return true;
} }
solutionId = Guid.Empty; 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; if (activity.TryGetValue(ActivityPropertyNames.SolutionPath, out var pathValue) &&
pathValue is string &&
if (!activity.TryGetValue(ActivityPropertyNames.SolutionPath, out var value)) File.Exists(pathValue.ToString()))
{
return false;
}
var path = value?.ToString();
if (string.IsNullOrWhiteSpace(path) || !File.Exists(path))
{
return false;
}
try
{ {
var json = File.ReadAllText(path); try
using var doc = JsonDocument.Parse(json);
if (doc.RootElement.TryGetProperty("id", out var idProp) &&
Guid.TryParse(idProp.GetString(), out var parsedId))
{ {
solutionId = parsedId; var solutionPath = pathValue.ToString()!;
return true; var json = File.ReadAllText(solutionPath);
using var doc = JsonDocument.Parse(json);
if (doc.RootElement.TryGetProperty("id", out var idProp) &&
Guid.TryParse(idProp.GetString(), out var parsedId))
{
solutionId = parsedId;
return true;
}
}
catch
{
// ignored
} }
} }
catch
{ solutionId = Guid.Empty;
// ignored
}
return false; return false;
} }
private void AddSolutionInformation(Dictionary<string, object> activity, JsonElement config) private void AddSolutionCreationConfiguration(ActivityEvent activity, JsonElement config)
{ {
var map = new (string Key, Action<JsonElement> Apply)[] activity[ActivityPropertyNames.Template] = config.GetProperty("template").GetString() ?? string.Empty;
{ activity[ActivityPropertyNames.CreatedAbpStudioVersion] = config.GetProperty("createdAbpStudioVersion").GetString()!;
("template", v => activity[ActivityPropertyNames.Template] = v.GetString() ?? string.Empty), activity[ActivityPropertyNames.MultiTenancy] = ParseBool(config.GetProperty("multiTenancy"));
("createdAbpStudioVersion", v => activity[ActivityPropertyNames.CreatedAbpStudioVersion] = v.GetString()!), activity[ActivityPropertyNames.UiFramework] = config.GetProperty("uiFramework").GetString() ?? string.Empty;
("multiTenancy", v => activity[ActivityPropertyNames.MultiTenancy] = ParseBool(v)), activity[ActivityPropertyNames.DatabaseProvider] = config.GetProperty("databaseProvider").GetString() ?? string.Empty;
("uiFramework", v => activity[ActivityPropertyNames.UiFramework] = v.GetString() ?? string.Empty), activity[ActivityPropertyNames.Theme] = config.GetProperty("theme").GetString() ?? string.Empty;
("databaseProvider", v => activity[ActivityPropertyNames.DatabaseProvider] = v.GetString() ?? string.Empty), activity[ActivityPropertyNames.ThemeStyle] = config.GetProperty("themeStyle").GetString() ?? string.Empty;
("theme", v => activity[ActivityPropertyNames.Theme] = v.GetString() ?? string.Empty), activity[ActivityPropertyNames.HasPublicWebsite] = ParseBool(config.GetProperty("publicWebsite"));
("themeStyle", v => activity[ActivityPropertyNames.ThemeStyle] = v.GetString() ?? string.Empty), activity[ActivityPropertyNames.IsTiered] = ParseBool(config.GetProperty("tiered"));
("publicWebsite", v => activity[ActivityPropertyNames.HasPublicWebsite] = ParseBool(v)), activity[ActivityPropertyNames.SocialLogins] = ParseBool(config.GetProperty("socialLogin"));
("tiered", v => activity[ActivityPropertyNames.IsTiered] = ParseBool(v)), activity[ActivityPropertyNames.DatabaseManagementSystem] = config.GetProperty("databaseManagementSystem").GetString() ?? string.Empty;
("socialLogin", v => activity[ActivityPropertyNames.SocialLogins] = ParseBool(v)), activity[ActivityPropertyNames.IsSeparateTenantSchema] = ParseBool(config.GetProperty("separateTenantSchema"));
("databaseManagementSystem", v => activity[ActivityPropertyNames.DatabaseManagementSystem] = v.GetString() ?? string.Empty), activity[ActivityPropertyNames.MobileFramework] = config.GetProperty("mobileFramework").GetString() ?? string.Empty;
("separateTenantSchema", v => activity[ActivityPropertyNames.IsSeparateTenantSchema] = ParseBool(v)), activity[ActivityPropertyNames.IncludeTests] = ParseBool(config.GetProperty("includeTests"));
("mobileFramework", v => activity[ActivityPropertyNames.MobileFramework] = v.GetString() ?? string.Empty), activity[ActivityPropertyNames.DynamicLocalization] = ParseBool(config.GetProperty("dynamicLocalization"));
("includeTests", v => activity[ActivityPropertyNames.IncludeTests] = ParseBool(v)), activity[ActivityPropertyNames.KubernetesConfiguration] = ParseBool(config.GetProperty("kubernetesConfiguration"));
("dynamicLocalization", v => activity[ActivityPropertyNames.DynamicLocalization] = ParseBool(v)), activity[ActivityPropertyNames.GrafanaDashboard] = ParseBool(config.GetProperty("grafanaDashboard"));
("kubernetesConfiguration", v => activity[ActivityPropertyNames.KubernetesConfiguration] = ParseBool(v)),
("grafanaDashboard", v => activity[ActivityPropertyNames.GrafanaDashboard] = ParseBool(v)),
};
foreach (var (key, apply) in map)
{
if (config.TryGetProperty(key, out var prop))
{
apply(prop);
}
}
} }
private List<Dictionary<string, object>> ExtractModules(string directoryPath, JsonElement modulesElement) private List<Dictionary<string, object>> ExtractModules(string solutionPath, JsonElement modulesElement)
{ {
var modules = new List<Dictionary<string, object>>(); var modules = new List<Dictionary<string, object>>();
foreach (var module in modulesElement.EnumerateObject()) foreach (var module in modulesElement.EnumerateObject())
{ {
if (!module.Value.TryGetProperty("path", out var pathElement)) var modulePath = GetModuleFilePath(solutionPath, module);
{ if (modulePath.IsNullOrEmpty())
continue;
}
var path = pathElement.GetString();
if (string.IsNullOrWhiteSpace(path))
{
continue;
}
var fullPath = Path.Combine(directoryPath, path);
if (!File.Exists(fullPath))
{ {
continue; continue;
} }
var moduleJson = File.ReadAllText(fullPath); var moduleJson = File.ReadAllText(modulePath);
using var moduleDoc = JsonDocument.Parse(moduleJson); using var moduleDoc = JsonDocument.Parse(moduleJson);
if (!moduleDoc.RootElement.TryGetProperty("imports", out var imports) || if (!moduleDoc.RootElement.TryGetProperty("imports", out var imports) ||
@ -201,6 +162,7 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityEventEnricher, IS
foreach (var import in imports.EnumerateObject()) foreach (var import in imports.EnumerateObject())
{ {
var version = import.Value.GetProperty("version").GetString(); var version = import.Value.GetProperty("version").GetString();
var creationTime = import.Value.TryGetProperty("creationTime", out var ct) var creationTime = import.Value.TryGetProperty("creationTime", out var ct)
? DateTimeOffset.Parse(ct.GetString()!) ? DateTimeOffset.Parse(ct.GetString()!)
: (DateTimeOffset?)null; : (DateTimeOffset?)null;
@ -230,6 +192,23 @@ public class TelemetrySolutionInfoEnricher : ITelemetryActivityEventEnricher, IS
return modules; return modules;
} }
private string? GetModuleFilePath(string solutionPath, JsonProperty module)
{
if (!module.Value.TryGetProperty("path", out var pathElement))
{
return null;
}
var path = pathElement.GetString();
if (path.IsNullOrEmpty())
{
return null;
}
var fullPath = Path.Combine(Path.GetDirectoryName(solutionPath)!, path);
return File.Exists(fullPath) ? fullPath : null;
}
private bool ParseBool(JsonElement element) private bool ParseBool(JsonElement element)
{ {
return element.ValueKind switch return element.ValueKind switch

Loading…
Cancel
Save