diff --git a/src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/OpenTelemetryCollectorExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/OpenTelemetryCollectorExtensions.cs index 735cdedea..fbea7286b 100644 --- a/src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/OpenTelemetryCollectorExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/OpenTelemetryCollectorExtensions.cs @@ -69,6 +69,18 @@ public static IResourceBuilder AddOpenTelemetryC $@"--config=yaml:receivers::otlp::protocols::grpc::tls::key_file: ""{certKeyPath}"""); } } + + if (!settings.DisableHealthcheck) + { + const int healthPort = 13233; + resourceBuilder.WithEndpoint(targetPort: healthPort, name: "health", scheme: "http") + .WithHttpHealthCheck("/health", endpointName: "health") + .WithArgs( + "--feature-gates=confmap.enableMergeAppendOption", + $"--config=yaml:extensions::health_check/aspire::endpoint: 0.0.0.0:{healthPort}", + "--config=yaml:service::extensions: [ health_check/aspire ]" + ); + } return resourceBuilder; } diff --git a/src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/OpenTelemetryCollectorSettings.cs b/src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/OpenTelemetryCollectorSettings.cs index ddf8c79dc..916cb4179 100644 --- a/src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/OpenTelemetryCollectorSettings.cs +++ b/src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/OpenTelemetryCollectorSettings.cs @@ -43,4 +43,9 @@ public class OpenTelemetryCollectorSettings /// Note: this will also setup SSL if Aspire is configured for HTTPS /// public bool EnableHttpEndpoint { get; set; } = true; + + /// + /// Disable the healthcheck on the collector container + /// + public bool DisableHealthcheck { get; set; } = false; } diff --git a/tests/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.Tests/ResourceCreationTests.cs index 4478a444b..88f9c1f84 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.Tests/ResourceCreationTests.cs @@ -30,7 +30,11 @@ public void CanCreateTheCollectorResource() public async Task CanCreateTheCollectorResourceWithCustomConfig() { var builder = DistributedApplication.CreateBuilder(); - builder.AddOpenTelemetryCollector("collector") + builder.AddOpenTelemetryCollector("collector", settings => + { + + settings.DisableHealthcheck = true; + }) .WithConfig("./config.yaml") .WithAppForwarding(); @@ -137,6 +141,7 @@ public void CanDisableBothEndpoints() { settings.EnableHttpEndpoint = false; settings.EnableGrpcEndpoint = false; + settings.DisableHealthcheck = true; }) .WithAppForwarding(); @@ -157,7 +162,10 @@ public async Task ContainerHasAspireEnvironmentVariables() .WithTestAndResourceLogging(testOutputHelper); builder.Configuration["APPHOST:ContainerHostname"] = "what.ever"; - var collector = builder.AddOpenTelemetryCollector("collector") + var collector = builder.AddOpenTelemetryCollector("collector", settings => + { + settings.DisableHealthcheck = true; + }) .WithAppForwarding(); using var app = builder.Build(); @@ -259,6 +267,7 @@ public void CanConfigureOnlyGrpcEndpoint() { settings.EnableGrpcEndpoint = true; settings.EnableHttpEndpoint = false; + settings.DisableHealthcheck = true; }) .WithAppForwarding(); @@ -285,6 +294,7 @@ public void CanConfigureOnlyHttpEndpoint() { settings.EnableGrpcEndpoint = false; settings.EnableHttpEndpoint = true; + settings.DisableHealthcheck = true; }) .WithAppForwarding(); @@ -618,4 +628,48 @@ public void DevCertificateExecutableResourceHasCorrectConfiguration() Assert.Contains("Pem", argsContext.Args); Assert.Contains("--no-password", argsContext.Args); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void CanDisableHealthcheckOnCollectorResource(bool disableHealthcheck) + { + var builder = DistributedApplication.CreateBuilder(); + + builder.AddOpenTelemetryCollector("collector", settings => + { + settings.DisableHealthcheck = disableHealthcheck; + }) + .WithAppForwarding(); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var collectorResource = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(collectorResource); + + var hasHealthCheck = collectorResource.Annotations.OfType().Any(); + if (disableHealthcheck) + { + Assert.False(hasHealthCheck); + } + else + { + Assert.True(hasHealthCheck); + var argsAnnotations = collectorResource.Annotations.OfType().ToList(); + Assert.NotEmpty(argsAnnotations); + + var argsContext = new CommandLineArgsCallbackContext([]); + foreach (var arg in argsAnnotations) + { + arg.Callback(argsContext); + } + + Assert.Contains("--feature-gates=confmap.enableMergeAppendOption", argsContext.Args); + Assert.Contains("--config=yaml:extensions::health_check/aspire::endpoint: 0.0.0.0:13233", argsContext.Args); + Assert.Contains("--config=yaml:service::extensions: [ health_check/aspire ]", argsContext.Args); + } + + } }