From 050885baa9b5c960950b5321783f0d28c2cb7e0f Mon Sep 17 00:00:00 2001 From: Benjamin Michaelis Date: Fri, 15 May 2026 18:40:03 -0700 Subject: [PATCH] Skip Azure Monitor profiler on unsupported OS Gate AddAzureMonitorProfiler() to Windows/Linux while keeping Azure Monitor export enabled on all platforms, and log when profiler registration is skipped. --- EssentialCSharp.Web/Program.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/EssentialCSharp.Web/Program.cs b/EssentialCSharp.Web/Program.cs index 48094a92..78a8a061 100644 --- a/EssentialCSharp.Web/Program.cs +++ b/EssentialCSharp.Web/Program.cs @@ -1,4 +1,5 @@ using System.Security.Claims; +using System.Runtime.InteropServices; using System.Threading.RateLimiting; using ModelContextProtocol.Protocol; using EssentialCSharp.Chat.Common.Extensions; @@ -51,6 +52,8 @@ private static void Main(string[] args) string? appInsightsConnectionString = builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]; bool useAzureMonitor = !string.IsNullOrWhiteSpace(appInsightsConnectionString); bool useOtlp = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); + bool profilerSupportedPlatform = OperatingSystem.IsWindows() || OperatingSystem.IsLinux(); + bool profilerSkippedUnsupportedPlatform = false; builder.Logging.AddOpenTelemetry(logging => { @@ -91,7 +94,15 @@ private static void Main(string[] args) }); if (useAzureMonitor) - otel.UseAzureMonitor().AddAzureMonitorProfiler(); + { + // Azure Monitor export is supported cross-platform, but the profiler currently only + // supports Windows and Linux. + var azureMonitor = otel.UseAzureMonitor(); + if (profilerSupportedPlatform) + azureMonitor.AddAzureMonitorProfiler(); + else + profilerSkippedUnsupportedPlatform = true; + } else if (useOtlp) otel.UseOtlpExporter(); @@ -127,6 +138,8 @@ private static void Main(string[] args) var loggerFactory = LoggerFactory.Create(loggingBuilder => loggingBuilder.AddConsole().SetMinimumLevel(LogLevel.Information)); var initialLogger = loggerFactory.CreateLogger(); + if (profilerSkippedUnsupportedPlatform) + LogSkippingUnsupportedAzureMonitorProfiler(initialLogger, RuntimeInformation.OSDescription); builder.Services.AddDbContext(options => options.UseSqlServer(connectionString, sql => sql.EnableRetryOnFailure(5))); @@ -623,4 +636,7 @@ private static bool IsMcpTransportRequest(HttpRequest request) => [LoggerMessage(Level = LogLevel.Warning, Message = "Ignoring invalid TryDotNet origin in CSP: {Origin}")] private static partial void LogIgnoringInvalidTryDotNetOrigin(ILogger logger, string origin); + + [LoggerMessage(Level = LogLevel.Warning, Message = "Azure Monitor profiler is not supported on this platform ({Platform}). Skipping profiler registration and continuing with Azure Monitor telemetry export.")] + private static partial void LogSkippingUnsupportedAzureMonitorProfiler(ILogger logger, string platform); }