using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Musify.Infrastructure.Configuration; using OpenTelemetry.Exporter; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; using OpenTelemetry.Trace; using SixLabors.ImageSharp; namespace Musify.Infrastructure.Observability { public static class OpenTelemetryDependencyInjection { public static IServiceCollection AddInfrastructureOpenTelemetry(this IServiceCollection serviceDescriptors, IConfiguration configuration) { serviceDescriptors .AddOptionsWithValidateOnStart() .Bind(configuration.GetRequiredSection(OpenTelemetryConfiguration.SectionName)) .ValidateDataAnnotations(); serviceDescriptors.AddSingleton(serviceProvider => serviceProvider.GetRequiredService>().Value); serviceDescriptors .AddOptions() .Configure((exporterOptions, openTelemetryConfiguration) => { exporterOptions.Endpoint = new Uri(openTelemetryConfiguration.OtlpEndpoint); } ); serviceDescriptors .AddOpenTelemetry() .ConfigureResource(resource => { resource.AddService("Musify"); } ) .WithTracing(tracing => tracing.AddSource("MassTransit") .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddEntityFrameworkCoreInstrumentation() .AddOtlpExporter() ) .WithMetrics(metrics => metrics.AddMeter("MassTransit") .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddRuntimeInstrumentation() .AddProcessInstrumentation() .AddOtlpExporter() ); return serviceDescriptors; } } }