| File: TerminalHostTelemetryTests.cs | Web Access |
| Project: src\tests\Aspire.TerminalHost.Tests\Aspire.TerminalHost.Tests.csproj (Aspire.TerminalHost.Tests) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Aspire.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using OpenTelemetry; using OpenTelemetry.Logs; using OpenTelemetry.Metrics; using OpenTelemetry.Trace; namespace Aspire.TerminalHost.Tests; [Collection(nameof(TerminalHostAppTestsCollection))] public class TerminalHostTelemetryTests { [Theory] [InlineData(null)] [InlineData("false")] [InlineData("")] [InlineData(" ")] [InlineData("not-a-bool")] [InlineData("0")] public void TelemetryRequiresExplicitOptIn(string? enabled) { var configuration = new ConfigurationBuilder().AddInMemoryCollection(new Dictionary<string, string?> { [KnownConfigNames.TerminalHostTelemetryEnabled] = enabled, ["OTEL_EXPORTER_OTLP_ENDPOINT"] = "http://localhost:4317", ["OTEL_SERVICE_NAME"] = "myapp-terminalhost-0", ["ASPIRE_TERMINAL_HOST_LOG_LEVEL"] = "Trace", }).Build(); Assert.Null(TerminalHostApp.CreateTelemetryHostBuilder(configuration)); } [Theory] [InlineData(null)] [InlineData("")] public void TelemetryRequiresOtlpEndpoint(string? endpoint) { var configuration = new ConfigurationBuilder().AddInMemoryCollection(new Dictionary<string, string?> { [KnownConfigNames.TerminalHostTelemetryEnabled] = "true", ["OTEL_EXPORTER_OTLP_ENDPOINT"] = endpoint, }).Build(); Assert.Null(TerminalHostApp.CreateTelemetryHostBuilder(configuration)); } [Theory] [InlineData("myapp-terminalhost-0", "myapp-terminalhost-0", "true")] [InlineData("myapp-terminalhost-1", "myapp-terminalhost-1", "true")] [InlineData(null, TerminalHostTelemetry.SourceName, "true")] [InlineData("", TerminalHostTelemetry.SourceName, "true")] [InlineData("myapp-terminalhost-0", "myapp-terminalhost-0", "1")] [InlineData("myapp-terminalhost-0", "myapp-terminalhost-0", "-1")] public void EnabledTelemetryRegistersAllSignalsWithResourceIdentity(string? serviceName, string expectedServiceName, string enabled) { var configuration = new ConfigurationBuilder().AddInMemoryCollection(new Dictionary<string, string?> { [KnownConfigNames.TerminalHostTelemetryEnabled] = enabled, ["OTEL_EXPORTER_OTLP_ENDPOINT"] = "http://localhost:4317", ["OTEL_SERVICE_NAME"] = serviceName, ["OTEL_RESOURCE_ATTRIBUTES"] = "service.instance.id=test-instance", ["ASPIRE_TERMINAL_HOST_LOG_LEVEL"] = "Debug", }).Build(); var builder = Assert.IsType<HostApplicationBuilder>(TerminalHostApp.CreateTelemetryHostBuilder(configuration)); using var host = builder.Build(); var tracerProvider = host.Services.GetRequiredService<TracerProvider>(); var meterProvider = host.Services.GetRequiredService<MeterProvider>(); Assert.Single(host.Services.GetServices<ILoggerProvider>().OfType<OpenTelemetryLoggerProvider>()); Assert.Equal(expectedServiceName, tracerProvider.GetResource().Attributes.Single(attribute => attribute.Key == "service.name").Value); Assert.Equal(expectedServiceName, meterProvider.GetResource().Attributes.Single(attribute => attribute.Key == "service.name").Value); Assert.Equal("test-instance", tracerProvider.GetResource().Attributes.Single(attribute => attribute.Key == "service.instance.id").Value); Assert.Equal("test-instance", meterProvider.GetResource().Attributes.Single(attribute => attribute.Key == "service.instance.id").Value); Assert.True(TerminalHostTelemetry.ActivitySource.HasListeners()); Assert.True(TerminalHostTelemetry.UpstreamRecycles.Enabled); Assert.True(host.Services.GetRequiredService<ILogger<TerminalHostApp>>().IsEnabled(LogLevel.Debug)); } }