Skip to content

Commit d430a9b

Browse files
committed
Added healthchecks to the otel collector
1 parent cf7da1a commit d430a9b

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/OpenTelemetryCollectorExtensions.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,18 @@ public static IResourceBuilder<OpenTelemetryCollectorResource> AddOpenTelemetryC
6969
$@"--config=yaml:receivers::otlp::protocols::grpc::tls::key_file: ""{certKeyPath}""");
7070
}
7171
}
72+
73+
if (!settings.DisableHealthcheck)
74+
{
75+
const int healthPort = 13233;
76+
resourceBuilder.WithEndpoint(targetPort: healthPort, name: "health", scheme: "http")
77+
.WithHttpHealthCheck("/health", endpointName: "health")
78+
.WithArgs(
79+
"--feature-gates=confmap.enableMergeAppendOption",
80+
$"--config=yaml:extensions::health_check/aspire::endpoint: 0.0.0.0:{healthPort}",
81+
"--config=yaml:service::extensions: [ health_check/aspire ]"
82+
);
83+
}
7284
return resourceBuilder;
7385
}
7486

src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/OpenTelemetryCollectorSettings.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,9 @@ public class OpenTelemetryCollectorSettings
4343
/// Note: this will also setup SSL if Aspire is configured for HTTPS
4444
/// </summary>
4545
public bool EnableHttpEndpoint { get; set; } = true;
46+
47+
/// <summary>
48+
/// Disable the healthcheck on the collector container
49+
/// </summary>
50+
public bool DisableHealthcheck { get; set; } = false;
4651
}

tests/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.Tests/ResourceCreationTests.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,4 +618,48 @@ public void DevCertificateExecutableResourceHasCorrectConfiguration()
618618
Assert.Contains("Pem", argsContext.Args);
619619
Assert.Contains("--no-password", argsContext.Args);
620620
}
621+
622+
[Theory]
623+
[InlineData(true)]
624+
[InlineData(false)]
625+
public void CanDisableHealthcheckOnCollectorResource(bool disableHealthcheck)
626+
{
627+
var builder = DistributedApplication.CreateBuilder();
628+
629+
builder.AddOpenTelemetryCollector("collector", settings =>
630+
{
631+
settings.DisableHealthcheck = disableHealthcheck;
632+
})
633+
.WithAppForwarding();
634+
635+
using var app = builder.Build();
636+
637+
var appModel = app.Services.GetRequiredService<DistributedApplicationModel>();
638+
639+
var collectorResource = appModel.Resources.OfType<OpenTelemetryCollectorResource>().SingleOrDefault();
640+
Assert.NotNull(collectorResource);
641+
642+
var hasHealthCheck = collectorResource.Annotations.OfType<HealthCheckAnnotation>().Any();
643+
if (disableHealthcheck)
644+
{
645+
Assert.False(hasHealthCheck);
646+
}
647+
else
648+
{
649+
Assert.True(hasHealthCheck);
650+
var argsAnnotations = collectorResource.Annotations.OfType<CommandLineArgsCallbackAnnotation>().ToList();
651+
Assert.NotEmpty(argsAnnotations);
652+
653+
var argsContext = new CommandLineArgsCallbackContext([]);
654+
foreach (var arg in argsAnnotations)
655+
{
656+
arg.Callback(argsContext);
657+
}
658+
659+
Assert.Contains("--feature-gates=confmap.enableMergeAppendOption", argsContext.Args);
660+
Assert.Contains("--config=yaml:extensions::health_check/aspire::endpoint: 0.0.0.0:13233", argsContext.Args);
661+
Assert.Contains("--config=yaml:service::extensions: [ health_check/aspire ]", argsContext.Args);
662+
}
663+
664+
}
621665
}

0 commit comments

Comments
 (0)