Skip to content

Commit 0766f46

Browse files
Add OpenTelemetry support on yarp container (#2750)
* Add OpenTelemetry support on yarp container * Add YARP_UNSAFE_SKIP_OLTP_CERT_VALIDATION variable to skip oltp cert validation * Address comments * Fix build * Update Signing.props for OpenTelemetry.dll * Update Signing.props * Update Signing.props 2 * Fixes
1 parent 70360ad commit 0766f46

File tree

5 files changed

+137
-3
lines changed

5 files changed

+137
-3
lines changed

eng/Signing.props

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
11
<Project>
2-
<!-- Arcade currently requires this file, though it doesn't require any content in it I believe. -->
2+
<ItemGroup Label="File signing information">
3+
<!-- Third-party components which should be signed. -->
4+
<FileSignInfo Include="HealthChecks.ApplicationStatus.dll" CertificateName="3PartySHA2" />
5+
<FileSignInfo Include="OpenTelemetry.dll" CertificateName="3PartySHA2" />
6+
<FileSignInfo Include="OpenTelemetry.Api.dll" CertificateName="3PartySHA2" />
7+
<FileSignInfo Include="OpenTelemetry.Api.ProviderBuilderExtensions.dll" CertificateName="3PartySHA2" />
8+
<FileSignInfo Include="OpenTelemetry.Exporter.OpenTelemetryProtocol.dll" CertificateName="3PartySHA2" />
9+
<FileSignInfo Include="OpenTelemetry.Extensions.Hosting.dll" CertificateName="3PartySHA2" />
10+
<FileSignInfo Include="OpenTelemetry.Instrumentation.AspNetCore.dll" CertificateName="3PartySHA2" />
11+
<FileSignInfo Include="OpenTelemetry.Instrumentation.GrpcNetClient.dll" CertificateName="3PartySHA2" />
12+
<FileSignInfo Include="OpenTelemetry.Instrumentation.Http.dll" CertificateName="3PartySHA2" />
13+
<FileSignInfo Include="OpenTelemetry.Instrumentation.Runtime.dll" CertificateName="3PartySHA2" />
14+
</ItemGroup>
315
</Project>

eng/Versions.props

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,13 @@
3333
<JsonSchemaNetVersion>7.0.2</JsonSchemaNetVersion>
3434
<!-- Container app dependencies -->
3535
<YarpNugetVersion>2.3.0</YarpNugetVersion>
36-
<MicrosoftExtensionsServiceDiscovery>8.2.2</MicrosoftExtensionsServiceDiscovery>
37-
<MicrosoftExtensionsServiceDiscoveryYarp>8.2.2</MicrosoftExtensionsServiceDiscoveryYarp>
36+
<MicrosoftExtensionsServiceDiscovery>9.1.0</MicrosoftExtensionsServiceDiscovery>
37+
<MicrosoftExtensionsServiceDiscoveryYarp>9.1.0</MicrosoftExtensionsServiceDiscoveryYarp>
38+
<OpenTelemetryExporterOpenTelemetryProtocol>1.9.0 </OpenTelemetryExporterOpenTelemetryProtocol>
39+
<OpenTelemetryExtensionsHosting>1.9.0</OpenTelemetryExtensionsHosting>
40+
<OpenTelemetryInstrumentationAspNetCore>1.9.0</OpenTelemetryInstrumentationAspNetCore>
41+
<OpenTelemetryInstrumentationHttp>1.9.0</OpenTelemetryInstrumentationHttp>
42+
<OpenTelemetryInstrumentationRuntime>1.9.0</OpenTelemetryInstrumentationRuntime>
43+
<AspNetCoreHealthChecksApplicationStatus>9.0.0</AspNetCoreHealthChecksApplicationStatus>
3844
</PropertyGroup>
3945
</Project>

src/Application/Extensions.cs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
using System.Net;
2+
using System.Security.Cryptography;
3+
using System.Security.Cryptography.X509Certificates;
4+
using HealthChecks.ApplicationStatus.DependencyInjection;
5+
using Microsoft.AspNetCore.Builder;
6+
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
7+
using Microsoft.Extensions.DependencyInjection;
8+
using Microsoft.Extensions.Logging;
9+
using OpenTelemetry;
10+
using OpenTelemetry.Exporter;
11+
using OpenTelemetry.Logs;
12+
using OpenTelemetry.Metrics;
13+
using OpenTelemetry.Trace;
14+
using static System.Net.WebRequestMethods;
15+
16+
namespace Microsoft.Extensions.Hosting;
17+
18+
// Adds common .NET Aspire services: service discovery, resilience, health checks, and OpenTelemetry.
19+
// This project should be referenced by each service project in your solution.
20+
// To learn more about using this project, see https://aka.ms/dotnet/aspire/service-defaults
21+
public static class Extensions
22+
{
23+
public static TBuilder AddServiceDefaults<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
24+
{
25+
builder.ConfigureOpenTelemetry();
26+
27+
builder.AddDefaultHealthChecks();
28+
29+
builder.Services.AddServiceDiscovery();
30+
31+
return builder;
32+
}
33+
34+
public static TBuilder ConfigureOpenTelemetry<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
35+
{
36+
builder.Logging.AddOpenTelemetry(logging =>
37+
{
38+
logging.IncludeFormattedMessage = true;
39+
logging.IncludeScopes = true;
40+
});
41+
42+
builder.Services.AddOpenTelemetry()
43+
.WithMetrics(metrics =>
44+
{
45+
metrics.AddAspNetCoreInstrumentation()
46+
.AddHttpClientInstrumentation()
47+
.AddRuntimeInstrumentation()
48+
.SetExemplarFilter(ExemplarFilterType.TraceBased);
49+
})
50+
.WithTracing(tracing =>
51+
{
52+
tracing.AddAspNetCoreInstrumentation()
53+
.AddHttpClientInstrumentation()
54+
.AddOtlpExporter();
55+
});
56+
57+
builder.AddOpenTelemetryExporters();
58+
59+
return builder;
60+
}
61+
62+
private static TBuilder AddOpenTelemetryExporters<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
63+
{
64+
var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
65+
66+
if (useOtlpExporter)
67+
{
68+
69+
if (string.Equals(Environment.GetEnvironmentVariable("YARP_UNSAFE_OLTP_CERT_ACCEPT_ANY_SERVER_CERTIFICATE"), "true", StringComparison.InvariantCultureIgnoreCase))
70+
{
71+
// We cannot use UseOtlpExporter() since it doesn't support configuration via OtlpExporterOptions
72+
// https://github.com/open-telemetry/opentelemetry-dotnet/issues/5802
73+
builder.Services.Configure<OtlpExporterOptions>(ConfigureOtlpExporterOptions);
74+
builder.Services.AddOpenTelemetry()
75+
.WithLogging(logging => logging.AddOtlpExporter())
76+
.WithMetrics(metrics => metrics.AddOtlpExporter())
77+
.WithTracing(tracing => tracing.AddOtlpExporter());
78+
}
79+
else
80+
{
81+
builder.Services.AddOpenTelemetry().UseOtlpExporter();
82+
}
83+
}
84+
85+
static void ConfigureOtlpExporterOptions(OtlpExporterOptions options)
86+
{
87+
options.HttpClientFactory = () =>
88+
{
89+
var handler = new HttpClientHandler();
90+
handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
91+
var httpClient = new HttpClient(handler);
92+
return httpClient;
93+
};
94+
}
95+
96+
return builder;
97+
}
98+
99+
public static TBuilder AddDefaultHealthChecks<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
100+
{
101+
builder.Services.AddHealthChecks()
102+
// Add a default liveness check on application status.
103+
.AddApplicationStatus(tags: ["live"]);
104+
105+
return builder;
106+
}
107+
}

src/Application/Program.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Microsoft.AspNetCore.Builder;
55
using Microsoft.Extensions.Configuration;
66
using Microsoft.Extensions.DependencyInjection;
7+
using Microsoft.Extensions.Hosting;
78

89
// Load configuration
910
if (args.Length != 1)
@@ -23,6 +24,7 @@
2324
builder.Configuration.AddJsonFile(fileInfo.FullName, optional: false, reloadOnChange: true);
2425

2526
// Configure YARP
27+
builder.AddServiceDefaults();
2628
builder.Services.AddServiceDiscovery();
2729
builder.Services.AddReverseProxy()
2830
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"))

src/Application/Yarp.Application.csproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@
1616
<PackageReference Include="Yarp.ReverseProxy" Version="$(YarpNugetVersion)" />
1717
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" Version="$(MicrosoftExtensionsServiceDiscovery)" />
1818
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery.Yarp" Version="$(MicrosoftExtensionsServiceDiscoveryYarp)" />
19+
20+
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="$(OpenTelemetryExporterOpenTelemetryProtocol)" />
21+
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="$(OpenTelemetryExtensionsHosting)" />
22+
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="$(OpenTelemetryInstrumentationAspNetCore)" />
23+
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="$(OpenTelemetryInstrumentationHttp)" />
24+
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="$(OpenTelemetryInstrumentationRuntime)" />
25+
<PackageReference Include="AspNetCore.HealthChecks.ApplicationStatus" Version="$(AspNetCoreHealthChecksApplicationStatus)" />
1926
</ItemGroup>
2027

2128
</Project>

0 commit comments

Comments
 (0)