diff --git a/core/Azure.Mcp.Core/src/Areas/Server/Commands/ServiceStartCommand.cs b/core/Azure.Mcp.Core/src/Areas/Server/Commands/ServiceStartCommand.cs index 91bd5fc168..335470aa51 100644 --- a/core/Azure.Mcp.Core/src/Areas/Server/Commands/ServiceStartCommand.cs +++ b/core/Azure.Mcp.Core/src/Areas/Server/Commands/ServiceStartCommand.cs @@ -405,7 +405,6 @@ private IHost CreateStdioHost(ServiceStartOptions serverOptions) .ConfigureLogging(logging => { logging.ClearProviders(); - logging.ConfigureOpenTelemetryLogger(); logging.AddEventSourceLogger(); if (serverOptions.Debug) @@ -451,7 +450,6 @@ private IHost CreateHttpHost(ServiceStartOptions serverOptions) // Configure logging builder.Logging.ClearProviders(); - builder.Logging.ConfigureOpenTelemetryLogger(); builder.Logging.AddEventSourceLogger(); builder.Logging.AddConsole(); ConfigureSupportLogging(builder.Logging, serverOptions); @@ -629,7 +627,6 @@ private IHost CreateIncomingAuthDisabledHttpHost(ServiceStartOptions serverOptio // Configure logging builder.Logging.ClearProviders(); - builder.Logging.ConfigureOpenTelemetryLogger(); builder.Logging.AddEventSourceLogger(); builder.Logging.AddConsole(); ConfigureSupportLogging(builder.Logging, serverOptions); diff --git a/core/Azure.Mcp.Core/src/Extensions/OpenTelemetryExtensions.cs b/core/Azure.Mcp.Core/src/Extensions/OpenTelemetryExtensions.cs index 0b20b2ef9a..b0ae283231 100644 --- a/core/Azure.Mcp.Core/src/Extensions/OpenTelemetryExtensions.cs +++ b/core/Azure.Mcp.Core/src/Extensions/OpenTelemetryExtensions.cs @@ -10,6 +10,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Microsoft.Mcp.Core.Commands; using OpenTelemetry.Logs; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; @@ -48,14 +49,6 @@ public static void ConfigureOpenTelemetry(this IServiceCollection services) EnableAzureMonitor(services); } - public static void ConfigureOpenTelemetryLogger(this ILoggingBuilder builder) - { - builder.AddOpenTelemetry(logger => - { - logger.AddProcessor(new TelemetryLogRecordEraser()); - }); - } - private static void EnableAzureMonitor(this IServiceCollection services) { #if DEBUG @@ -92,7 +85,7 @@ private static void EnableAzureMonitor(this IServiceCollection services) if (!string.IsNullOrWhiteSpace(userProvidedAppInsightsConnectionString)) { // Configure telemetry to be sent to user-provided Application Insights instance regardless of build configuration. - ConfigureAzureMonitorExporter(otelBuilder, userProvidedAppInsightsConnectionString, "UserProvided"); + ConfigureUserProvidedAzureMonitorExporter(otelBuilder, userProvidedAppInsightsConnectionString); } // Configure Microsoft-owned telemetry only in RELEASE builds to avoid polluting telemetry during development. @@ -105,7 +98,7 @@ private static void EnableAzureMonitor(this IServiceCollection services) if (shouldCollectMicrosoftTelemetry) { - ConfigureAzureMonitorExporter(otelBuilder, MicrosoftOwnedAppInsightsConnectionString, "Microsoft"); + ConfigureMicrosoftAzureMonitorExporter(otelBuilder, MicrosoftOwnedAppInsightsConnectionString); } #endif @@ -118,7 +111,39 @@ private static void EnableAzureMonitor(this IServiceCollection services) } } - private static void ConfigureAzureMonitorExporter(OpenTelemetry.OpenTelemetryBuilder otelBuilder, string appInsightsConnectionString, string name) + /// + /// Configures OpenTelemetry to use Azure Monitor exporters with Microsoft's Application Insights instance. + /// + /// The OpenTelemetry builder to configure. + /// The Application Insights connection string for Microsoft's telemetry instance. + private static void ConfigureMicrosoftAzureMonitorExporter(OpenTelemetry.OpenTelemetryBuilder otelBuilder, string appInsightsConnectionString) + { + // We don't configure logging for Microsoft telemetry to avoid sending potentially sensitive log data to Microsoft. + otelBuilder.WithMetrics(metrics => + { + metrics.AddAzureMonitorMetricExporter(options => + { + options.ConnectionString = appInsightsConnectionString; + }, + name: AppInsightsInstanceType.Microsoft); + }); + + otelBuilder.WithTracing(tracing => + { + tracing.AddAzureMonitorTraceExporter(options => + { + options.ConnectionString = appInsightsConnectionString; + }, + name: AppInsightsInstanceType.Microsoft); + }); + } + + /// + /// Configures OpenTelemetry to use Azure Monitor exporters with a user-provided Application Insights connection string. + /// + /// The OpenTelemetry builder to configure. + /// The Application Insights connection string provided by the user. + private static void ConfigureUserProvidedAzureMonitorExporter(OpenTelemetry.OpenTelemetryBuilder otelBuilder, string appInsightsConnectionString) { otelBuilder.WithLogging(logging => { @@ -126,7 +151,7 @@ private static void ConfigureAzureMonitorExporter(OpenTelemetry.OpenTelemetryBui { options.ConnectionString = appInsightsConnectionString; }, - name: name); + name: AppInsightsInstanceType.UserProvided); }); otelBuilder.WithMetrics(metrics => @@ -135,7 +160,7 @@ private static void ConfigureAzureMonitorExporter(OpenTelemetry.OpenTelemetryBui { options.ConnectionString = appInsightsConnectionString; }, - name: name); + name: AppInsightsInstanceType.UserProvided); }); otelBuilder.WithTracing(tracing => @@ -144,7 +169,7 @@ private static void ConfigureAzureMonitorExporter(OpenTelemetry.OpenTelemetryBui { options.ConnectionString = appInsightsConnectionString; }, - name: name); + name: AppInsightsInstanceType.UserProvided); }); } } diff --git a/core/Microsoft.Mcp.Core/src/Commands/TelemetryConstants.cs b/core/Microsoft.Mcp.Core/src/Commands/TelemetryConstants.cs index 57947f962d..9e603b4a2b 100644 --- a/core/Microsoft.Mcp.Core/src/Commands/TelemetryConstants.cs +++ b/core/Microsoft.Mcp.Core/src/Commands/TelemetryConstants.cs @@ -40,3 +40,9 @@ public class ActivityName public const string ToolExecuted = "ToolExecuted"; public const string ServerStarted = "ServerStarted"; } + +public class AppInsightsInstanceType +{ + public const string Microsoft = "Microsoft"; + public const string UserProvided = "UserProvided"; +} diff --git a/servers/Azure.Mcp.Server/changelog-entries/1770145613303.yaml b/servers/Azure.Mcp.Server/changelog-entries/1770145613303.yaml new file mode 100644 index 0000000000..a763eb93fb --- /dev/null +++ b/servers/Azure.Mcp.Server/changelog-entries/1770145613303.yaml @@ -0,0 +1,4 @@ +pr: 1638 +changes: + - section: "Features Added" + description: "Add log telemetry support for customer-owned AppInsights" \ No newline at end of file diff --git a/servers/Azure.Mcp.Server/src/Program.cs b/servers/Azure.Mcp.Server/src/Program.cs index c50d0fc156..6f8a165133 100644 --- a/servers/Azure.Mcp.Server/src/Program.cs +++ b/servers/Azure.Mcp.Server/src/Program.cs @@ -44,7 +44,6 @@ private static async Task Main(string[] args) services.AddLogging(builder => { - builder.ConfigureOpenTelemetryLogger(); builder.AddConsole(); builder.SetMinimumLevel(LogLevel.Information); }); diff --git a/servers/Fabric.Mcp.Server/src/Program.cs b/servers/Fabric.Mcp.Server/src/Program.cs index c4ef999bcb..8331dad09b 100644 --- a/servers/Fabric.Mcp.Server/src/Program.cs +++ b/servers/Fabric.Mcp.Server/src/Program.cs @@ -37,7 +37,6 @@ private static async Task Main(string[] args) services.AddLogging(builder => { - builder.ConfigureOpenTelemetryLogger(); builder.AddConsole(); builder.SetMinimumLevel(LogLevel.Information); }); diff --git a/servers/Template.Mcp.Server/src/Program.cs b/servers/Template.Mcp.Server/src/Program.cs index 928fb730f3..4d6f0c1f1b 100644 --- a/servers/Template.Mcp.Server/src/Program.cs +++ b/servers/Template.Mcp.Server/src/Program.cs @@ -34,7 +34,6 @@ private static async Task Main(string[] args) services.AddLogging(builder => { - builder.ConfigureOpenTelemetryLogger(); builder.AddConsole(); builder.SetMinimumLevel(LogLevel.Information); });