Skip to content

Commit 9429080

Browse files
committed
Added healthchecks to the Otel Collector component
1 parent 9709412 commit 9429080

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
@@ -649,4 +649,48 @@ public void DevCertificateExecutableResourceHasCorrectConfiguration()
649649
Assert.Contains("Pem", argsContext.Args);
650650
Assert.Contains("--no-password", argsContext.Args);
651651
}
652+
653+
[Theory]
654+
[InlineData(true)]
655+
[InlineData(false)]
656+
public void CanDisableHealthcheckOnCollectorResource(bool disableHealthcheck)
657+
{
658+
var builder = DistributedApplication.CreateBuilder();
659+
660+
builder.AddOpenTelemetryCollector("collector", settings =>
661+
{
662+
settings.DisableHealthcheck = disableHealthcheck;
663+
})
664+
.WithAppForwarding();
665+
666+
using var app = builder.Build();
667+
668+
var appModel = app.Services.GetRequiredService<DistributedApplicationModel>();
669+
670+
var collectorResource = appModel.Resources.OfType<OpenTelemetryCollectorResource>().SingleOrDefault();
671+
Assert.NotNull(collectorResource);
672+
673+
var hasHealthCheck = collectorResource.Annotations.OfType<HealthCheckAnnotation>().Any();
674+
if (disableHealthcheck)
675+
{
676+
Assert.False(hasHealthCheck);
677+
}
678+
else
679+
{
680+
Assert.True(hasHealthCheck);
681+
var argsAnnotations = collectorResource.Annotations.OfType<CommandLineArgsCallbackAnnotation>().ToList();
682+
Assert.NotEmpty(argsAnnotations);
683+
684+
var argsContext = new CommandLineArgsCallbackContext([]);
685+
foreach (var arg in argsAnnotations)
686+
{
687+
arg.Callback(argsContext);
688+
}
689+
690+
Assert.Contains("--feature-gates=confmap.enableMergeAppendOption", argsContext.Args);
691+
Assert.Contains("--config=yaml:extensions::health_check/aspire::endpoint: 0.0.0.0:13233", argsContext.Args);
692+
Assert.Contains("--config=yaml:service::extensions: [ health_check/aspire ]", argsContext.Args);
693+
}
694+
695+
}
652696
}

0 commit comments

Comments
 (0)