|
13 | 13 | using Microsoft.Extensions.Diagnostics.HealthChecks; |
14 | 14 | using Microsoft.IdentityModel.Tokens; |
15 | 15 | using Microsoft.OpenApi.Models; |
| 16 | +using OpenTelemetry; |
| 17 | +using OpenTelemetry.Exporter; |
| 18 | +using OpenTelemetry.Logs; |
16 | 19 | using OpenTelemetry.Metrics; |
17 | 20 | using OpenTelemetry.Resources; |
18 | 21 | using OpenTelemetry.Trace; |
19 | | - |
20 | 22 | //using QuestPDF.Infrastructure; |
21 | 23 | using Serilog; |
22 | 24 | using System.Reflection; |
|
48 | 50 |
|
49 | 51 | var redisSettings = builder.Configuration.GetSection("Redis").Get<RedisSettings>(); |
50 | 52 | bool isRedisEnabled = redisSettings?.Enabled == true; |
51 | | - |
52 | 53 | if (isRedisEnabled) |
53 | 54 | { |
54 | 55 | var redisConnectionString = builder.Configuration.GetConnectionString("Redis"); |
|
70 | 71 | builder.Services.AddSingleton(redisSettings ?? new RedisSettings()); |
71 | 72 | } |
72 | 73 |
|
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 => |
81 | 85 | { |
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 | + }); |
83 | 97 | }) |
84 | | - .AddHttpClientInstrumentation() |
85 | | - .AddEntityFrameworkCoreInstrumentation() |
86 | | - .AddOtlpExporter(options => |
| 98 | + .WithMetrics(metrics => |
87 | 99 | { |
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 => |
101 | 119 | { |
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 | +} |
105 | 126 |
|
106 | 127 | builder.Services.Configure<ApiBehaviorOptions>(options => |
107 | 128 | { |
|
294 | 315 | var healthChecksBuilder = builder.Services.AddHealthChecks() |
295 | 316 | .AddCheck<ApiHealthCheck>("API") |
296 | 317 | .AddCheck<DatabaseHealthCheck>("Database"); |
297 | | - |
298 | 318 | if (isRedisEnabled) |
299 | 319 | { |
300 | 320 | healthChecksBuilder.AddCheck<RedisHealthCheck>("Redis"); |
301 | 321 | } |
| 322 | +if (isOpenTelemetryEnabled) |
| 323 | +{ |
| 324 | + healthChecksBuilder.AddCheck<OpenTelemetryHealthCheck>("Open Telemetry"); |
| 325 | +} |
302 | 326 |
|
303 | 327 | var app = builder.Build(); |
304 | 328 |
|
|
0 commit comments