From 7ced2df3a494730995cd50abfd2fcc3061008058 Mon Sep 17 00:00:00 2001 From: Miroslav Adamec Date: Thu, 18 Apr 2024 13:16:09 +0200 Subject: [PATCH 1/2] feat: app insights - add grouped operation name --- .../OperationNameTelemetryInitializer.cs | 31 +++++++++++++++++++ .../TracingBuilderExtensions.cs | 1 + ...VM.Tracing.ApplicationInsights.Owin.csproj | 1 + .../OperationNameTelemetryInitializer.cs | 24 ++++++++++++++ .../TracingBuilderExtensions.cs | 1 + 5 files changed, 58 insertions(+) create mode 100644 src/Tracing/ApplicationInsights.AspNetCore/OperationNameTelemetryInitializer.cs create mode 100644 src/Tracing/ApplicationInsights.Owin/OperationNameTelemetryInitializer.cs diff --git a/src/Tracing/ApplicationInsights.AspNetCore/OperationNameTelemetryInitializer.cs b/src/Tracing/ApplicationInsights.AspNetCore/OperationNameTelemetryInitializer.cs new file mode 100644 index 0000000000..1fe87fb3fb --- /dev/null +++ b/src/Tracing/ApplicationInsights.AspNetCore/OperationNameTelemetryInitializer.cs @@ -0,0 +1,31 @@ +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 url = _accessor.HttpContext?.GetDotvvmContext()?.Route?.Url; + if (string.IsNullOrWhiteSpace(url) == false && telemetry is RequestTelemetry) + { + var method = _accessor.HttpContext.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..f8fe79ab08 --- /dev/null +++ b/src/Tracing/ApplicationInsights.Owin/OperationNameTelemetryInitializer.cs @@ -0,0 +1,24 @@ +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 url = HttpContext.Current?.GetOwinContext()?.GetDotvvmContext()?.Route?.Url; + if (string.IsNullOrWhiteSpace(url) == false && telemetry is RequestTelemetry) + { + var method = HttpContext.Current.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(); From 19dbeed66568bba122492dd1934b9f14321399f2 Mon Sep 17 00:00:00 2001 From: Miroslav Adamec Date: Mon, 22 Apr 2024 14:59:49 +0200 Subject: [PATCH 2/2] improve http context operations for telemetry --- .../OperationNameTelemetryInitializer.cs | 7 ++++--- .../OperationNameTelemetryInitializer.cs | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Tracing/ApplicationInsights.AspNetCore/OperationNameTelemetryInitializer.cs b/src/Tracing/ApplicationInsights.AspNetCore/OperationNameTelemetryInitializer.cs index 1fe87fb3fb..bc39bc5823 100644 --- a/src/Tracing/ApplicationInsights.AspNetCore/OperationNameTelemetryInitializer.cs +++ b/src/Tracing/ApplicationInsights.AspNetCore/OperationNameTelemetryInitializer.cs @@ -17,10 +17,11 @@ public OperationNameTelemetryInitializer(IHttpContextAccessor accessor) public void Initialize(ITelemetry telemetry) { - var url = _accessor.HttpContext?.GetDotvvmContext()?.Route?.Url; - if (string.IsNullOrWhiteSpace(url) == false && telemetry is RequestTelemetry) + var context = _accessor.HttpContext; + var url = context?.GetDotvvmContext()?.Route?.Url; + if (url != null && telemetry is RequestTelemetry) { - var method = _accessor.HttpContext.Request.Method; + var method = context.Request.Method; var operationName = $"{method} /{url}"; var requestTelemetry = telemetry as RequestTelemetry; diff --git a/src/Tracing/ApplicationInsights.Owin/OperationNameTelemetryInitializer.cs b/src/Tracing/ApplicationInsights.Owin/OperationNameTelemetryInitializer.cs index f8fe79ab08..d0cda14c33 100644 --- a/src/Tracing/ApplicationInsights.Owin/OperationNameTelemetryInitializer.cs +++ b/src/Tracing/ApplicationInsights.Owin/OperationNameTelemetryInitializer.cs @@ -10,10 +10,11 @@ public class OperationNameTelemetryInitializer : ITelemetryInitializer { public void Initialize(ITelemetry telemetry) { - var url = HttpContext.Current?.GetOwinContext()?.GetDotvvmContext()?.Route?.Url; - if (string.IsNullOrWhiteSpace(url) == false && telemetry is RequestTelemetry) + var context = HttpContext.Current; + var url = context?.GetOwinContext()?.GetDotvvmContext()?.Route?.Url; + if (url != null && telemetry is RequestTelemetry) { - var method = HttpContext.Current.Request.HttpMethod; + var method = context.Request.HttpMethod; var operationName = $"{method} /{url}"; var requestTelemetry = telemetry as RequestTelemetry;