diff --git a/src/Tracing/ApplicationInsights.AspNetCore/OperationNameTelemetryInitializer.cs b/src/Tracing/ApplicationInsights.AspNetCore/OperationNameTelemetryInitializer.cs new file mode 100644 index 0000000000..bc39bc5823 --- /dev/null +++ b/src/Tracing/ApplicationInsights.AspNetCore/OperationNameTelemetryInitializer.cs @@ -0,0 +1,32 @@ +using DotVVM.Framework.Hosting; +using Microsoft.ApplicationInsights.DataContracts; +using Microsoft.ApplicationInsights.Extensibility; +using Microsoft.ApplicationInsights.Channel; +using Microsoft.AspNetCore.Http; + +namespace DotVVM.Tracing.ApplicationInsights.AspNetCore; + +public class OperationNameTelemetryInitializer : ITelemetryInitializer +{ + private readonly IHttpContextAccessor _accessor; + + public OperationNameTelemetryInitializer(IHttpContextAccessor accessor) + { + _accessor = accessor; + } + + public void Initialize(ITelemetry telemetry) + { + var context = _accessor.HttpContext; + var url = context?.GetDotvvmContext()?.Route?.Url; + if (url != null && telemetry is RequestTelemetry) + { + var method = context.Request.Method; + var operationName = $"{method} /{url}"; + + var requestTelemetry = telemetry as RequestTelemetry; + requestTelemetry.Name = operationName; + requestTelemetry.Context.Operation.Name = operationName; + } + } +} diff --git a/src/Tracing/ApplicationInsights.AspNetCore/TracingBuilderExtensions.cs b/src/Tracing/ApplicationInsights.AspNetCore/TracingBuilderExtensions.cs index bf370072cf..114564f26d 100644 --- a/src/Tracing/ApplicationInsights.AspNetCore/TracingBuilderExtensions.cs +++ b/src/Tracing/ApplicationInsights.AspNetCore/TracingBuilderExtensions.cs @@ -30,6 +30,7 @@ public static IDotvvmServiceCollection AddApplicationInsightsTracing(this IDotvv services.AddDotvvmApplicationInsights(); services.Services.AddApplicationInsightsTelemetryProcessor(); + services.Services.AddSingleton(); services.Services.TryAddSingleton(); services.Services.AddTransient, ApplicationInsightSetup>(); diff --git a/src/Tracing/ApplicationInsights.Owin/DotVVM.Tracing.ApplicationInsights.Owin.csproj b/src/Tracing/ApplicationInsights.Owin/DotVVM.Tracing.ApplicationInsights.Owin.csproj index 80f82fc59a..25a52f73b1 100644 --- a/src/Tracing/ApplicationInsights.Owin/DotVVM.Tracing.ApplicationInsights.Owin.csproj +++ b/src/Tracing/ApplicationInsights.Owin/DotVVM.Tracing.ApplicationInsights.Owin.csproj @@ -11,6 +11,7 @@ + diff --git a/src/Tracing/ApplicationInsights.Owin/OperationNameTelemetryInitializer.cs b/src/Tracing/ApplicationInsights.Owin/OperationNameTelemetryInitializer.cs new file mode 100644 index 0000000000..d0cda14c33 --- /dev/null +++ b/src/Tracing/ApplicationInsights.Owin/OperationNameTelemetryInitializer.cs @@ -0,0 +1,25 @@ +using System.Web; +using DotVVM.Framework.Hosting; +using Microsoft.ApplicationInsights.DataContracts; +using Microsoft.ApplicationInsights.Extensibility; +using Microsoft.ApplicationInsights.Channel; + +namespace DotVVM.Tracing.ApplicationInsights.Owin; + +public class OperationNameTelemetryInitializer : ITelemetryInitializer +{ + public void Initialize(ITelemetry telemetry) + { + var context = HttpContext.Current; + var url = context?.GetOwinContext()?.GetDotvvmContext()?.Route?.Url; + if (url != null && telemetry is RequestTelemetry) + { + var method = context.Request.HttpMethod; + var operationName = $"{method} /{url}"; + + var requestTelemetry = telemetry as RequestTelemetry; + requestTelemetry.Name = operationName; + requestTelemetry.Context.Operation.Name = operationName; + } + } +} diff --git a/src/Tracing/ApplicationInsights.Owin/TracingBuilderExtensions.cs b/src/Tracing/ApplicationInsights.Owin/TracingBuilderExtensions.cs index 5941e8717e..582d2bde0e 100644 --- a/src/Tracing/ApplicationInsights.Owin/TracingBuilderExtensions.cs +++ b/src/Tracing/ApplicationInsights.Owin/TracingBuilderExtensions.cs @@ -18,6 +18,7 @@ public static class TracingBuilderExtensions public static IDotvvmServiceCollection AddApplicationInsightsTracing(this IDotvvmServiceCollection services) { TelemetryConfiguration.Active.TelemetryProcessorChainBuilder.Use(next => new RequestTelemetryFilter(next)).Build(); + TelemetryConfiguration.Active.TelemetryInitializers.Add(new OperationNameTelemetryInitializer()); services.Services.TryAddSingleton(); services.AddDotvvmApplicationInsights();