Skip to content

Commit 9d64187

Browse files
Added a healthcheck to the OpenTelemetry Collector container (#858)
* Added a healthcheck to the OpenTelemetry Collector container * Adding basic tests * Added healthchecks to the otel collector * Fixing some broken tests --------- Co-authored-by: Aaron Powell <[email protected]>
1 parent cf7da1a commit 9d64187

File tree

3 files changed

+73
-2
lines changed

3 files changed

+73
-2
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: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ public void CanCreateTheCollectorResource()
3030
public async Task CanCreateTheCollectorResourceWithCustomConfig()
3131
{
3232
var builder = DistributedApplication.CreateBuilder();
33-
builder.AddOpenTelemetryCollector("collector")
33+
builder.AddOpenTelemetryCollector("collector", settings =>
34+
{
35+
36+
settings.DisableHealthcheck = true;
37+
})
3438
.WithConfig("./config.yaml")
3539
.WithAppForwarding();
3640

@@ -137,6 +141,7 @@ public void CanDisableBothEndpoints()
137141
{
138142
settings.EnableHttpEndpoint = false;
139143
settings.EnableGrpcEndpoint = false;
144+
settings.DisableHealthcheck = true;
140145
})
141146
.WithAppForwarding();
142147

@@ -157,7 +162,10 @@ public async Task ContainerHasAspireEnvironmentVariables()
157162
.WithTestAndResourceLogging(testOutputHelper);
158163
builder.Configuration["APPHOST:ContainerHostname"] = "what.ever";
159164

160-
var collector = builder.AddOpenTelemetryCollector("collector")
165+
var collector = builder.AddOpenTelemetryCollector("collector", settings =>
166+
{
167+
settings.DisableHealthcheck = true;
168+
})
161169
.WithAppForwarding();
162170

163171
using var app = builder.Build();
@@ -259,6 +267,7 @@ public void CanConfigureOnlyGrpcEndpoint()
259267
{
260268
settings.EnableGrpcEndpoint = true;
261269
settings.EnableHttpEndpoint = false;
270+
settings.DisableHealthcheck = true;
262271
})
263272
.WithAppForwarding();
264273

@@ -285,6 +294,7 @@ public void CanConfigureOnlyHttpEndpoint()
285294
{
286295
settings.EnableGrpcEndpoint = false;
287296
settings.EnableHttpEndpoint = true;
297+
settings.DisableHealthcheck = true;
288298
})
289299
.WithAppForwarding();
290300

@@ -618,4 +628,48 @@ public void DevCertificateExecutableResourceHasCorrectConfiguration()
618628
Assert.Contains("Pem", argsContext.Args);
619629
Assert.Contains("--no-password", argsContext.Args);
620630
}
631+
632+
[Theory]
633+
[InlineData(true)]
634+
[InlineData(false)]
635+
public void CanDisableHealthcheckOnCollectorResource(bool disableHealthcheck)
636+
{
637+
var builder = DistributedApplication.CreateBuilder();
638+
639+
builder.AddOpenTelemetryCollector("collector", settings =>
640+
{
641+
settings.DisableHealthcheck = disableHealthcheck;
642+
})
643+
.WithAppForwarding();
644+
645+
using var app = builder.Build();
646+
647+
var appModel = app.Services.GetRequiredService<DistributedApplicationModel>();
648+
649+
var collectorResource = appModel.Resources.OfType<OpenTelemetryCollectorResource>().SingleOrDefault();
650+
Assert.NotNull(collectorResource);
651+
652+
var hasHealthCheck = collectorResource.Annotations.OfType<HealthCheckAnnotation>().Any();
653+
if (disableHealthcheck)
654+
{
655+
Assert.False(hasHealthCheck);
656+
}
657+
else
658+
{
659+
Assert.True(hasHealthCheck);
660+
var argsAnnotations = collectorResource.Annotations.OfType<CommandLineArgsCallbackAnnotation>().ToList();
661+
Assert.NotEmpty(argsAnnotations);
662+
663+
var argsContext = new CommandLineArgsCallbackContext([]);
664+
foreach (var arg in argsAnnotations)
665+
{
666+
arg.Callback(argsContext);
667+
}
668+
669+
Assert.Contains("--feature-gates=confmap.enableMergeAppendOption", argsContext.Args);
670+
Assert.Contains("--config=yaml:extensions::health_check/aspire::endpoint: 0.0.0.0:13233", argsContext.Args);
671+
Assert.Contains("--config=yaml:service::extensions: [ health_check/aspire ]", argsContext.Args);
672+
}
673+
674+
}
621675
}

0 commit comments

Comments
 (0)