| File: Extensions.cs | Web Access |
| Project: src\playground\AspireWithMaui\AspireWithMaui.MauiServiceDefaults\AspireWithMaui.MauiServiceDefaults.csproj (AspireWithMaui.MauiServiceDefaults) |
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Http; using Microsoft.Extensions.Logging; using Microsoft.Maui.Hosting; using Microsoft.Maui.LifecycleEvents; using OpenTelemetry; using OpenTelemetry.Logs; using OpenTelemetry.Metrics; using OpenTelemetry.Trace; using System.Text.RegularExpressions; namespace Microsoft.Extensions.Hosting; // Adds common Aspire services: service discovery, resilience, health checks, and OpenTelemetry. // This project should be referenced by each service project in your solution. // To learn more about using this project, see https://aka.ms/dotnet/aspire/service-defaults public static class Extensions { public static TBuilder AddServiceDefaults<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder { builder.ConfigureOpenTelemetry(); builder.Services.AddServiceDiscovery(); builder.Services.ConfigureHttpClientDefaults(http => { // Turn on resilience by default http.AddStandardResilienceHandler(); // Turn on service discovery by default http.AddServiceDiscovery(); }); // Uncomment the following to restrict the allowed schemes for service discovery. // builder.Services.Configure<ServiceDiscoveryOptions>(options => // { // options.AllowedSchemes = ["https"]; // }); return builder; } public static MauiAppBuilder AddServiceDefaults(this MauiAppBuilder builder) { builder.ConfigureOpenTelemetry(); builder.Services.AddServiceDiscovery(); builder.Services.ConfigureHttpClientDefaults(http => { // Turn on resilience by default http.AddStandardResilienceHandler(); // Turn on service discovery by default http.AddServiceDiscovery(); }); builder.Services.TryAddEnumerable( ServiceDescriptor.Transient<IMauiInitializeService, OpenTelemetryInitializer>(_ => new OpenTelemetryInitializer())); // Uncomment the following to restrict the allowed schemes for service discovery. // builder.Services.Configure<ServiceDiscoveryOptions>(options => // { // options.AllowedSchemes = ["https"]; // }); return builder; } public static TBuilder ConfigureOpenTelemetry<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder { builder.Logging.AddOpenTelemetry(logging => { logging.IncludeFormattedMessage = true; logging.IncludeScopes = true; }); builder.Services.AddOpenTelemetry() .WithMetrics(metrics => { // Uncomment the following line to enable reporting metrics coming from the .NET MAUI SDK, this might cause a lot of added telemetry //metrics.AddMeter("Microsoft.Maui"); metrics.AddHttpClientInstrumentation() .AddRuntimeInstrumentation(); }) .WithTracing(tracing => { // Uncomment the following line to enable reporting tracing coming from the .NET MAUI SDK, this might cause a lot of added telemetry //tracing.AddSource("Microsoft.Maui"); tracing.AddSource(builder.Environment.ApplicationName) // Uncomment the following line to enable gRPC instrumentation (requires the OpenTelemetry.Instrumentation.GrpcNetClient package) //.AddGrpcClientInstrumentation() .AddHttpClientInstrumentation(); }); builder.AddOpenTelemetryExporters(); return builder; } // OpenTelemetry initializer for MAUI private sealed class OpenTelemetryInitializer : IMauiInitializeService { public void Initialize(IServiceProvider services) { services.GetService<MeterProvider>(); services.GetService<TracerProvider>(); services.GetService<LoggerProvider>(); } } private static TBuilder AddOpenTelemetryExporters<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder { var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); if (useOtlpExporter) { builder.Services.AddOpenTelemetry().UseOtlpExporter(); } return builder; } }