/
aprogrammer
/
dotnet-docs
Обзор
Документация
Войти
/
aprogrammer
/
dotnet-docs
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
docs/core/diagnostics/snippets/OTLP-Example/csharp/Program.cs
139 строк
4 KB
Sam Spencer
Fixes from reviewing the content previews
23 авг 2024, 01:47
23 авг 2024, 01:47
f41e96e
Код
Авторство
О чём код?
// <WholeProgram> using System.Diagnostics; using System.Diagnostics.Metrics; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; using OpenTelemetry.Trace; using OpenTelemetry.Exporter; using OpenTelemetry.Logs; using OpenTelemetry; using Azure.Monitor.OpenTelemetry.AspNetCore; var builder = WebApplication.CreateBuilder(args); // <Snippet_CustomMetrics> // Custom metrics for the application var greeterMeter = new Meter("OTel.Example", "1.0.0"); var countGreetings = greeterMeter.CreateCounter<int>("greetings.count", description: "Counts the number of greetings"); // Custom ActivitySource for the application var greeterActivitySource = new ActivitySource("OTel.Example"); // </Snippet_CustomMetrics> // <Snippet_HttpClientFactory> builder.Services.AddHttpClient(); // </Snippet_HttpClientFactory> // <Snippet_OTEL> // Setup logging to be exported via OpenTelemetry builder.Logging.AddOpenTelemetry(logging => { logging.IncludeFormattedMessage = true; logging.IncludeScopes = true; }); var otel = builder.Services.AddOpenTelemetry(); // Add Metrics for ASP.NET Core and our custom metrics and export via OTLP otel.WithMetrics(metrics => { // Metrics provider from OpenTelemetry metrics.AddAspNetCoreInstrumentation(); //Our custom metrics metrics.AddMeter(greeterMeter.Name); // Metrics provides by ASP.NET Core in .NET 8 metrics.AddMeter("Microsoft.AspNetCore.Hosting"); metrics.AddMeter("Microsoft.AspNetCore.Server.Kestrel"); }); // Add Tracing for ASP.NET Core and our custom ActivitySource and export via OTLP otel.WithTracing(tracing => { tracing.AddAspNetCoreInstrumentation(); tracing.AddHttpClientInstrumentation(); tracing.AddSource(greeterActivitySource.Name); }); // Export OpenTelemetry data via OTLP, using env vars for the configuration var OtlpEndpoint = builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]; if (OtlpEndpoint != null) { otel.UseOtlpExporter(); } //</Snippet_OTEL> //<Snippet_AzureMonitor> if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"])) { otel.UseAzureMonitor(); } //</Snippet_AzureMonitor> var app = builder.Build(); //<Snippet_MapGet> app.MapGet("/", SendGreeting); //</Snippet_MapGet> //<Snippet_MapNested> app.MapGet("/NestedGreeting", SendNestedGreeting); //</Snippet_MapNested> app.Run(); //<Snippet_SendGreeting> async Task<String> SendGreeting(ILogger<Program> logger) { // Create a new Activity scoped to the method using var activity = greeterActivitySource.StartActivity("GreeterActivity"); // Log a message logger.LogInformation("Sending greeting"); // Increment the custom counter countGreetings.Add(1); // Add a tag to the Activity activity?.SetTag("greeting", "Hello World!"); return "Hello World!"; } //</Snippet_SendGreeting> //<Snippet_SendNestedGreeting> async Task SendNestedGreeting(int nestlevel, ILogger<Program> logger, HttpContext context, IHttpClientFactory clientFactory) { // Create a new Activity scoped to the method using var activity = greeterActivitySource.StartActivity("GreeterActivity"); if (nestlevel <= 5) { // Log a message logger.LogInformation("Sending greeting, level {nestlevel}", nestlevel); // Increment the custom counter countGreetings.Add(1); // Add a tag to the Activity activity?.SetTag("nest-level", nestlevel); await context.Response.WriteAsync($"Nested Greeting, level: {nestlevel}\r\n"); if (nestlevel > 0) { var request = context.Request; var url = new Uri($"{request.Scheme}://{request.Host}{request.Path}?nestlevel={nestlevel - 1}"); // Makes an http call passing the activity information as http headers var nestedResult = await clientFactory.CreateClient().GetStringAsync(url); await context.Response.WriteAsync(nestedResult); } } else { // Log a message logger.LogError("Greeting nest level {nestlevel} too high", nestlevel); await context.Response.WriteAsync("Nest level too high, max is 5"); } } //</Snippet_SendNestedGreeting>