Skip to content

Commit ba6d622

Browse files
committed
fix for open telemetry
1 parent 25fafe2 commit ba6d622

5 files changed

Lines changed: 115 additions & 31 deletions

File tree

Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,6 @@
5858
<PackageVersion Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.15.0-beta.1" />
5959
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.15.0" />
6060
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.15.0" />
61+
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.15.0" />
6162
</ItemGroup>
6263
</Project>

backend/AirportAutomationApi/AirportAutomation.Api.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
<PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" />
5656
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
5757
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
58+
<PackageVersion Include="OpenTelemetry.Exporter.Console" />
5859
</ItemGroup>
5960

6061
<ItemGroup>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using Microsoft.Extensions.Diagnostics.HealthChecks;
2+
using System.Net.Http.Headers;
3+
4+
namespace AirportAutomation.Api.HealthChecks
5+
{
6+
public class OpenTelemetryHealthCheck : IHealthCheck
7+
{
8+
private readonly IConfiguration _configuration;
9+
private readonly IHttpClientFactory _httpClientFactory;
10+
11+
public OpenTelemetryHealthCheck(IConfiguration configuration, IHttpClientFactory httpClientFactory)
12+
{
13+
_configuration = configuration;
14+
_httpClientFactory = httpClientFactory;
15+
}
16+
17+
public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
18+
{
19+
try
20+
{
21+
var endpoint = _configuration["OpenTelemetry:Endpoint"]?.TrimEnd('/');
22+
var authHeader = _configuration["OpenTelemetry:Headers"];
23+
24+
if (string.IsNullOrEmpty(endpoint) || string.IsNullOrEmpty(authHeader))
25+
{
26+
return HealthCheckResult.Unhealthy("OpenTelemetry configuration is missing (Endpoint or Headers).");
27+
}
28+
29+
var client = _httpClientFactory.CreateClient();
30+
31+
var headerParts = authHeader.Split('=');
32+
if (headerParts.Length == 2)
33+
{
34+
client.DefaultRequestHeaders.TryAddWithoutValidation(headerParts[0], headerParts[1]);
35+
}
36+
37+
var response = await client.GetAsync($"{endpoint}/v1/traces", cancellationToken);
38+
39+
if (response.IsSuccessStatusCode || response.StatusCode == System.Net.HttpStatusCode.MethodNotAllowed)
40+
{
41+
return HealthCheckResult.Healthy("OpenTelemetry is reachable.");
42+
}
43+
44+
if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
45+
{
46+
return HealthCheckResult.Unhealthy("OpenTelemetry authentication failed (401 Unauthorized). Check your token.");
47+
}
48+
49+
return HealthCheckResult.Unhealthy($"OpenTelemetry gateway returned status: {response.StatusCode}");
50+
}
51+
catch (Exception ex)
52+
{
53+
return HealthCheckResult.Unhealthy($"OpenTelemetry health check failed: {ex.Message}");
54+
}
55+
}
56+
}
57+
}

backend/AirportAutomationApi/Program.cs

Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
using Microsoft.Extensions.Diagnostics.HealthChecks;
1414
using Microsoft.IdentityModel.Tokens;
1515
using Microsoft.OpenApi.Models;
16+
using OpenTelemetry;
17+
using OpenTelemetry.Exporter;
18+
using OpenTelemetry.Logs;
1619
using OpenTelemetry.Metrics;
1720
using OpenTelemetry.Resources;
1821
using OpenTelemetry.Trace;
19-
2022
//using QuestPDF.Infrastructure;
2123
using Serilog;
2224
using System.Reflection;
@@ -48,7 +50,6 @@
4850

4951
var redisSettings = builder.Configuration.GetSection("Redis").Get<RedisSettings>();
5052
bool isRedisEnabled = redisSettings?.Enabled == true;
51-
5253
if (isRedisEnabled)
5354
{
5455
var redisConnectionString = builder.Configuration.GetConnectionString("Redis");
@@ -70,38 +71,58 @@
7071
builder.Services.AddSingleton(redisSettings ?? new RedisSettings());
7172
}
7273

73-
builder.Services.AddOpenTelemetry()
74-
.WithTracing(tracing => tracing
75-
.SetResourceBuilder(ResourceBuilder.CreateDefault()
76-
.AddService(
77-
serviceName: builder.Configuration["OpenTelemetry:ServiceName"]!,
78-
serviceVersion: builder.Configuration["OpenTelemetry:ServiceVersion"]!
79-
))
80-
.AddAspNetCoreInstrumentation(options =>
74+
bool isOpenTelemetryEnabled = builder.Configuration.GetValue<bool>("OpenTelemetry:Enabled");
75+
if (isOpenTelemetryEnabled)
76+
{
77+
var otelResource = ResourceBuilder.CreateDefault()
78+
.AddService(
79+
serviceName: builder.Configuration["OpenTelemetry:ServiceName"]!,
80+
serviceVersion: builder.Configuration["OpenTelemetry:ServiceVersion"]!
81+
);
82+
83+
builder.Services.AddOpenTelemetry()
84+
.WithTracing(tracing =>
8185
{
82-
options.RecordException = true;
86+
tracing.SetResourceBuilder(otelResource)
87+
.AddAspNetCoreInstrumentation(options => options.RecordException = true)
88+
.AddHttpClientInstrumentation()
89+
.AddEntityFrameworkCoreInstrumentation();
90+
91+
tracing.AddOtlpExporter(options =>
92+
{
93+
options.Endpoint = new Uri($"{builder.Configuration["OpenTelemetry:Endpoint"]!.TrimEnd('/')}/v1/traces");
94+
options.Headers = builder.Configuration["OpenTelemetry:Headers"];
95+
options.Protocol = OtlpExportProtocol.HttpProtobuf;
96+
});
8397
})
84-
.AddHttpClientInstrumentation()
85-
.AddEntityFrameworkCoreInstrumentation()
86-
.AddOtlpExporter(options =>
98+
.WithMetrics(metrics =>
8799
{
88-
options.Endpoint = new Uri(builder.Configuration["OpenTelemetry:Endpoint"]!);
89-
options.Headers = builder.Configuration["OpenTelemetry:Headers"]!;
90-
}))
91-
.WithMetrics(metrics => metrics
92-
.SetResourceBuilder(ResourceBuilder.CreateDefault()
93-
.AddService(
94-
serviceName: builder.Configuration["OpenTelemetry:ServiceName"]!,
95-
serviceVersion: builder.Configuration["OpenTelemetry:ServiceVersion"]!
96-
))
97-
.AddAspNetCoreInstrumentation()
98-
.AddHttpClientInstrumentation()
99-
.AddRuntimeInstrumentation()
100-
.AddOtlpExporter(options =>
100+
metrics.SetResourceBuilder(otelResource)
101+
.AddAspNetCoreInstrumentation()
102+
.AddHttpClientInstrumentation()
103+
.AddRuntimeInstrumentation();
104+
105+
metrics.AddOtlpExporter(options =>
106+
{
107+
options.Endpoint = new Uri($"{builder.Configuration["OpenTelemetry:Endpoint"]!.TrimEnd('/')}/v1/metrics");
108+
options.Headers = builder.Configuration["OpenTelemetry:Headers"];
109+
options.Protocol = OtlpExportProtocol.HttpProtobuf;
110+
});
111+
});
112+
113+
builder.Logging.AddOpenTelemetry(logging =>
114+
{
115+
logging.SetResourceBuilder(otelResource);
116+
logging.IncludeFormattedMessage = true;
117+
logging.IncludeScopes = true;
118+
logging.AddOtlpExporter(options =>
101119
{
102-
options.Endpoint = new Uri(builder.Configuration["OpenTelemetry:Endpoint"]!);
103-
options.Headers = builder.Configuration["OpenTelemetry:Headers"]!;
104-
}));
120+
options.Endpoint = new Uri($"{builder.Configuration["OpenTelemetry:Endpoint"]!.TrimEnd('/')}/v1/logs");
121+
options.Headers = builder.Configuration["OpenTelemetry:Headers"];
122+
options.Protocol = OtlpExportProtocol.HttpProtobuf;
123+
});
124+
});
125+
}
105126

106127
builder.Services.Configure<ApiBehaviorOptions>(options =>
107128
{
@@ -294,11 +315,14 @@
294315
var healthChecksBuilder = builder.Services.AddHealthChecks()
295316
.AddCheck<ApiHealthCheck>("API")
296317
.AddCheck<DatabaseHealthCheck>("Database");
297-
298318
if (isRedisEnabled)
299319
{
300320
healthChecksBuilder.AddCheck<RedisHealthCheck>("Redis");
301321
}
322+
if (isOpenTelemetryEnabled)
323+
{
324+
healthChecksBuilder.AddCheck<OpenTelemetryHealthCheck>("Open Telemetry");
325+
}
302326

303327
var app = builder.Build();
304328

backend/AirportAutomationApi/appsettings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"SlidingExpirationInMinutes": 10
4141
},
4242
"OpenTelemetry": {
43+
"Enabled": false,
4344
"Endpoint": "https://otlp-gateway-prod-eu-central-0.grafana.net/otlp",
4445
"Headers": "Authorization=Basic YOUR_BASE64_TOKEN",
4546
"ServiceName": "airport-automation-api",

0 commit comments

Comments
 (0)