Browse Source

Improve telemetry solution path handling and enrichment

Refactored telemetry logic to better handle and enrich solution path information, including moving TelemetryCliSessionProvider, updating activity tracking in commands, and enhancing TelemetrySolutionInfoEnricher to reliably find and set solution paths and IDs. Removed redundant service registrations and improved the order and conditions for telemetry activities.
pull/24395/head
SALİH ÖZKARA 5 months ago
parent
commit
39ad3e6d33
  1. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs
  2. 3
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs
  3. 10
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/AddPackageCommand.cs
  4. 1
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs
  5. 9
      framework/src/Volo.Abp.Cli/Volo/Abp/Cli/AbpCliModule.cs
  6. 21
      framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Telemetry/TelemetryCliSessionProvider.cs
  7. 57
      framework/src/Volo.Abp.Core/Volo/Abp/Internal/Telemetry/Activity/Providers/TelemetrySolutionInfoEnricher.cs
  8. 10
      framework/src/Volo.Abp.Core/Volo/Abp/Internal/Telemetry/Activity/TelemetryJsonExtensions.cs

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs

@ -38,8 +38,6 @@ public class AbpCliCoreModule : AbpModule
{ {
client.DefaultRequestHeaders.UserAgent.ParseAdd("MyAgent/1.0"); client.DefaultRequestHeaders.UserAgent.ParseAdd("MyAgent/1.0");
}); });
context.Services.RemoveAll(x => x.ImplementationType == typeof(TelemetrySessionInfoEnricher));
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

3
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs

@ -84,7 +84,6 @@ public class CliService : ITransientDependency
catch (CliUsageException usageException) catch (CliUsageException usageException)
{ {
Logger.LogWarning(usageException.Message); Logger.LogWarning(usageException.Message);
await TelemetryService.AddActivityAsync(ActivityNameConsts.AbpCliExit);
Environment.ExitCode = 1; Environment.ExitCode = 1;
} }
catch (Exception ex) catch (Exception ex)
@ -94,6 +93,8 @@ public class CliService : ITransientDependency
Logger.LogException(ex); Logger.LogException(ex);
throw; throw;
} }
await TelemetryService.AddActivityAsync(ActivityNameConsts.AbpCliExit);
} }
private async Task RunPromptAsync() private async Task RunPromptAsync()

10
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/AddPackageCommand.cs

@ -43,6 +43,9 @@ public class AddPackageCommand : IConsoleCommand, ITransientDependency
GetUsageInfo() GetUsageInfo()
); );
} }
await using var _ = TelemetryService.TrackActivityAsync(ActivityNameConsts.AbpCliCommandsNewPackage);
await using var __ = TelemetryService.TrackActivityAsync(ActivityNameConsts.AbpCliCommandsAddPackage);
var isNpmPackage = false; var isNpmPackage = false;
var isNugetPackage = true; var isNugetPackage = true;
@ -63,11 +66,6 @@ public class AddPackageCommand : IConsoleCommand, ITransientDependency
var slnFile = GetSolutionFile(commandLineArgs); var slnFile = GetSolutionFile(commandLineArgs);
var projectFile = GetProjectFile(commandLineArgs); var projectFile = GetProjectFile(commandLineArgs);
await using var _ = TelemetryService.TrackActivityAsync(ActivityNameConsts.AbpCliCommandsAddPackage, o =>
{
o[ActivityPropertyNames.SolutionPath] = slnFile;
});
await ProjectNugetPackageAdder.AddAsync( await ProjectNugetPackageAdder.AddAsync(
slnFile, slnFile,
projectFile, projectFile,
@ -80,8 +78,6 @@ public class AddPackageCommand : IConsoleCommand, ITransientDependency
} }
else if (isNpmPackage) else if (isNpmPackage)
{ {
await using var _ = TelemetryService.TrackActivityAsync(ActivityNameConsts.AbpCliCommandsAddPackage);
await ProjectNpmPackageAdder.AddNpmPackageAsync( await ProjectNpmPackageAdder.AddNpmPackageAsync(
GetAngularDirectory(commandLineArgs), GetAngularDirectory(commandLineArgs),
commandLineArgs.Target, commandLineArgs.Target,

1
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs

@ -112,7 +112,6 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien
{ {
o[ActivityPropertyNames.CreationTool] = AbpTool.OldCli; o[ActivityPropertyNames.CreationTool] = AbpTool.OldCli;
o[ActivityPropertyNames.Template] = template; o[ActivityPropertyNames.Template] = template;
o[ActivityPropertyNames.SolutionPath] = projectArgs.OutputFolder;
}); });
ExtractProjectZip(result, projectArgs.OutputFolder); ExtractProjectZip(result, projectArgs.OutputFolder);

9
framework/src/Volo.Abp.Cli/Volo/Abp/Cli/AbpCliModule.cs

@ -1,4 +1,6 @@
using Volo.Abp.Autofac; using System.Collections.Generic;
using Volo.Abp.Autofac;
using Volo.Abp.Internal.Telemetry.Activity.Providers;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace Volo.Abp.Cli; namespace Volo.Abp.Cli;
@ -9,5 +11,8 @@ namespace Volo.Abp.Cli;
)] )]
public class AbpCliModule : AbpModule public class AbpCliModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.RemoveAll(x => x.ImplementationType == typeof(TelemetrySessionInfoEnricher));
}
} }

21
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Telemetry/TelemetryCliSessionProvider.cs → framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Telemetry/TelemetryCliSessionProvider.cs

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -18,13 +19,31 @@ public class TelemetryCliSessionProvider : TelemetryActivityEventEnricher
} }
public override int ExecutionOrder { get; set; } = 10; public override int ExecutionOrder { get; set; } = 10;
protected override Type ReplaceParentType { get; set; } = typeof(TelemetrySessionInfoEnricher); protected override Type? ReplaceParentType { get; set; } = typeof(TelemetrySessionInfoEnricher);
protected override Task ExecuteAsync(ActivityContext context) protected override Task ExecuteAsync(ActivityContext context)
{ {
context.Current[ActivityPropertyNames.SessionType] = SessionType.AbpCli; context.Current[ActivityPropertyNames.SessionType] = SessionType.AbpCli;
context.Current[ActivityPropertyNames.SessionId] = Guid.NewGuid(); context.Current[ActivityPropertyNames.SessionId] = Guid.NewGuid();
context.Current[ActivityPropertyNames.IsFirstSession] = !File.Exists(TelemetryPaths.ActivityStorage); context.Current[ActivityPropertyNames.IsFirstSession] = !File.Exists(TelemetryPaths.ActivityStorage);
if (context.ExtraProperties.ContainsKey(ActivityPropertyNames.SolutionPath))
{
return Task.CompletedTask;
}
if(context.Current.TryGetValue(ActivityPropertyNames.SolutionPath, out var existingSolutionPath) && existingSolutionPath is string)
{
context.ExtraProperties[ActivityPropertyNames.SolutionPath] = existingSolutionPath;
return Task.CompletedTask;
}
if (context.Current.TryGetValue(ActivityPropertyNames.AdditionalProperties, out var additionalProperties) &&
additionalProperties is Dictionary<string, object> additionalPropertiesDict &&
additionalPropertiesDict.TryGetValue(ActivityPropertyNames.SolutionPath, out var solutionPath))
{
context.ExtraProperties[ActivityPropertyNames.SolutionPath] = solutionPath;
}
return Task.CompletedTask; return Task.CompletedTask;
} }

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

@ -21,12 +21,17 @@ internal sealed class TelemetrySolutionInfoEnricher : TelemetryActivityEventEnri
protected override Task<bool> CanExecuteAsync(ActivityContext context) protected override Task<bool> CanExecuteAsync(ActivityContext context)
{ {
if (context.SolutionId.HasValue && !context.SolutionPath.IsNullOrEmpty()) if (context.SolutionPath.IsNullOrEmpty())
{
return Task.FromResult(false);
}
if (context.SolutionId.HasValue)
{ {
return Task.FromResult(_telemetryActivityStorage.ShouldAddSolutionInformation(context.SolutionId.Value)); return Task.FromResult(_telemetryActivityStorage.ShouldAddSolutionInformation(context.SolutionId.Value));
} }
return Task.FromResult(false); return Task.FromResult(true);
} }
protected override Task ExecuteAsync(ActivityContext context) protected override Task ExecuteAsync(ActivityContext context)
@ -37,6 +42,14 @@ internal sealed class TelemetrySolutionInfoEnricher : TelemetryActivityEventEnri
{ {
return Task.CompletedTask; return Task.CompletedTask;
} }
var correctSolutionPath = FindCorrectSolutionPath(context.SolutionPath);
if (correctSolutionPath.IsNullOrEmpty())
{
return Task.CompletedTask;
}
context.ExtraProperties[ActivityPropertyNames.SolutionPath] = correctSolutionPath;
var jsonContent = File.ReadAllText(context.SolutionPath!); var jsonContent = File.ReadAllText(context.SolutionPath!);
using var doc = JsonDocument.Parse(jsonContent, new JsonDocumentOptions using var doc = JsonDocument.Parse(jsonContent, new JsonDocumentOptions
@ -45,6 +58,15 @@ internal sealed class TelemetrySolutionInfoEnricher : TelemetryActivityEventEnri
}); });
var root = doc.RootElement; var root = doc.RootElement;
var solutionId = TelemetryJsonExtensions.GetGuidOrNull(root, "id");
if (!solutionId.HasValue)
{
return Task.CompletedTask;
}
context.Current[ActivityPropertyNames.SolutionId] = solutionId;
if (root.TryGetProperty("versions", out var versions)) if (root.TryGetProperty("versions", out var versions))
{ {
@ -149,4 +171,35 @@ internal sealed class TelemetrySolutionInfoEnricher : TelemetryActivityEventEnri
var fullPath = Path.Combine(Path.GetDirectoryName(solutionPath)!, path); var fullPath = Path.Combine(Path.GetDirectoryName(solutionPath)!, path);
return File.Exists(fullPath) ? fullPath : null; return File.Exists(fullPath) ? fullPath : null;
} }
private static string? FindCorrectSolutionPath(string solutionPath)
{
if (solutionPath.EndsWith(".abpsln"))
{
return solutionPath;
}
if (solutionPath.EndsWith(".sln"))
{
solutionPath = solutionPath[..^4] + ".abpsln";
if (File.Exists(solutionPath))
{
return solutionPath;
}
}
var dir = Path.GetDirectoryName(solutionPath);
if (dir.IsNullOrEmpty())
{
return null;
}
var abpSolutionFiles = Directory.GetFiles(dir, "*.abpsln", SearchOption.TopDirectoryOnly);
return abpSolutionFiles.Length switch
{
1 => abpSolutionFiles[0],
_ => null
};
}
} }

10
framework/src/Volo.Abp.Core/Volo/Abp/Internal/Telemetry/Activity/TelemetryJsonExtensions.cs

@ -31,4 +31,14 @@ static internal class TelemetryJsonExtensions
return null; return null;
} }
static internal Guid? GetGuidOrNull(JsonElement element, string propertyName)
{
if (element.TryGetProperty(propertyName, out var guidProperty) && Guid.TryParse(guidProperty.GetString(), out var guidValue))
{
return guidValue;
}
return null;
}
} }
Loading…
Cancel
Save