diff options
| author | Ariel Costas Guerrero <ariel@costas.dev> | 2026-01-25 21:05:33 +0100 |
|---|---|---|
| committer | Ariel Costas Guerrero <ariel@costas.dev> | 2026-01-25 21:06:01 +0100 |
| commit | f9b7af64550be1320acc84d60184e8c8ce873b94 (patch) | |
| tree | d43e995319b4a3856aa929848b9ad807afb1cf86 /src/Enmarcha.Backend/Program.cs | |
| parent | c89353dede64bd2c21c0a1ebd6b6de6282998326 (diff) | |
feat: Add OpenTelemetry instrumentation and configuration for enhanced telemetry tracking
Diffstat (limited to 'src/Enmarcha.Backend/Program.cs')
| -rw-r--r-- | src/Enmarcha.Backend/Program.cs | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/Enmarcha.Backend/Program.cs b/src/Enmarcha.Backend/Program.cs index a13abec..8599a5c 100644 --- a/src/Enmarcha.Backend/Program.cs +++ b/src/Enmarcha.Backend/Program.cs @@ -1,14 +1,113 @@ using System.Text.Json.Serialization; +using Enmarcha.Backend; using Enmarcha.Backend.Configuration; using Enmarcha.Backend.Services; using Enmarcha.Backend.Services.Geocoding; using Enmarcha.Backend.Services.Processors; using Enmarcha.Backend.Services.Providers; +using Microsoft.AspNetCore.WebUtilities; +using OpenTelemetry.Logs; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; var builder = WebApplication.CreateBuilder(args); builder.Services.Configure<AppConfiguration>(builder.Configuration.GetSection("App")); +var appConfig = builder.Configuration.GetSection("App").Get<AppConfiguration>(); +var otelConfig = appConfig?.OpenTelemetry; + +builder.Logging.AddOpenTelemetry(options => +{ + options.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("Enmarcha.Backend")); + options.IncludeFormattedMessage = true; + options.IncludeScopes = true; + + if (otelConfig?.Endpoint != null) + { + options.AddOtlpExporter(exporterOptions => + { + exporterOptions.Endpoint = new Uri(otelConfig.Endpoint); + exporterOptions.Headers = otelConfig.Headers; + }); + } + +#if DEBUG + options.AddOtlpExporter(exporterOptions => + { + exporterOptions.Endpoint = new Uri("http://localhost:17011"); + }); +#endif +}); + +builder.Services.AddOpenTelemetry() + .WithTracing(tracing => + { + tracing + .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("Enmarcha.Backend")) + .AddSource(Telemetry.Source.Name) + .AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation(options => + { + options.EnrichWithHttpRequestMessage = (activity, req) => + { + var host = req.RequestUri?.Host; + if (host == null) return; + + // Set default peer service to host + activity.SetTag("peer.service", host); + activity.SetTag("server.address", host); + + if (host == "api.geoapify.com") + { + activity.SetTag("peer.service", "Geoapify"); + var query = QueryHelpers.ParseQuery(req.RequestUri!.Query); + if (query.ContainsKey("apiKey")) + { + var uriBuilder = new UriBuilder(req.RequestUri); + var newQuery = query.ToDictionary(x => x.Key, x => x.Value.ToString()); + newQuery["apiKey"] = "REDACTED"; + uriBuilder.Query = string.Join("&", newQuery.Select(x => $"{x.Key}={x.Value}")); + activity.SetTag("http.url", uriBuilder.ToString()); + } + } + else if (host.Contains("tussa.org")) + { + activity.SetTag("peer.service", "TUSSA"); + } + else if (host.Contains("itranvias.com")) + { + activity.SetTag("peer.service", "Tranvías Coruña"); + } + else if (host.Contains("vigo.org")) + { + activity.SetTag("peer.service", "Vitrasa"); + } + else if (appConfig?.OpenTripPlannerBaseUrl != null && req.RequestUri!.ToString().StartsWith(appConfig.OpenTripPlannerBaseUrl)) + { + activity.SetTag("peer.service", "OpenTripPlanner"); + } + }; + }) + .SetSampler(new TraceIdRatioBasedSampler(0.75)); + + if (otelConfig?.Endpoint != null) + { + tracing.AddOtlpExporter(exporterOptions => + { + exporterOptions.Endpoint = new Uri(otelConfig.Endpoint); + exporterOptions.Headers = otelConfig.Headers; + }); + } + +#if DEBUG + tracing.AddOtlpExporter(exporterOptions => + { + exporterOptions.Endpoint = new Uri("http://localhost:17011"); + }); +#endif + }); + builder.Services .AddControllers() .AddJsonOptions(options => @@ -40,9 +139,21 @@ builder.Services.AddScoped<ArrivalsPipeline>(); // builder.Services.AddKeyedScoped<IGeocodingService, NominatimGeocodingService>("Nominatim"); builder.Services.AddHttpClient<IGeocodingService, GeoapifyGeocodingService>(); builder.Services.AddHttpClient<OtpService>(); +builder.Services.AddHttpClient<Enmarcha.Sources.TranviasCoruna.CorunaRealtimeEstimatesProvider>(); +builder.Services.AddHttpClient<Enmarcha.Sources.Tussa.SantiagoRealtimeEstimatesProvider>(); +builder.Services.AddHttpClient<Costasdev.VigoTransitApi.VigoTransitApiClient>(); var app = builder.Build(); +app.Use(async (context, next) => +{ + if (context.Request.Headers.TryGetValue("X-Session-Id", out var sessionId)) + { + System.Diagnostics.Activity.Current?.SetTag("session.id", sessionId.ToString()); + } + await next(); +}); + app.MapControllers(); app.Run(); |
