@azure/mcp-win32-x64
Version:
Azure MCP Server - Model Context Protocol implementation for Azure, for win32 on x64
154 lines (118 loc) • 4.58 kB
Markdown
---
title: AddOpenTelemetry
category: api-reference
applies-to: 3.x
---
# services.AddOpenTelemetry()
> [!NOTE]
> This is the recommended approach for any application using the .NET Generic
> Host (ASP.NET Core, Worker Services, MAUI, etc.).
## When to use
- **ASP.NET Core** web apps and APIs.
- **Worker services** (`BackgroundService` / `IHostedService`).
- Any application that already calls `Host.CreateDefaultBuilder()` or
`WebApplication.CreateBuilder()`.
- Production services where you want **automatic lifecycle management** - no
manual `Dispose()` calls.
## Minimal example
```csharp
using OpenTelemetry.Trace;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry()
.ConfigureResource(r => r.AddService("my-web-api"))
.WithTracing(tracing => tracing
.AddAspNetCoreInstrumentation()
.AddConsoleExporter());
var app = builder.Build();
app.MapGet("/", () => "Hello World");
app.Run();
```
## Full multi-signal example
```csharp
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
var builder = WebApplication.CreateBuilder(args);
// Clear default log providers if you want OTel to be the sole log sink
builder.Logging.ClearProviders();
builder.Services.AddOpenTelemetry()
.ConfigureResource(r => r
.AddService(
serviceName: "my-web-api",
serviceVersion: "1.0.0"))
.WithTracing(tracing => tracing
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddSource("MyApp")
.AddOtlpExporter())
.WithMetrics(metrics => metrics
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddMeter("MyApp")
.AddOtlpExporter())
.WithLogging(logging => logging
.AddOtlpExporter());
var app = builder.Build();
app.MapGet("/", () => "Hello World");
app.Run();
```
## Worker service example
```csharp
using OpenTelemetry.Trace;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddOpenTelemetry()
.ConfigureResource(r => r.AddService("my-worker"))
.WithTracing(tracing => tracing
.AddSource("MyWorker")
.AddOtlpExporter());
builder.Services.AddHostedService<MyWorker>();
var host = builder.Build();
host.Run();
```
## API surface
`AddOpenTelemetry()` returns an `OpenTelemetryBuilder` that implements
`IOpenTelemetryBuilder`:
| Method | Purpose |
| --- | --- |
| `.WithTracing(Action<TracerProviderBuilder>)` | Configure tracing |
| `.WithMetrics(Action<MeterProviderBuilder>)` | Configure metrics |
| `.WithLogging(Action<LoggerProviderBuilder>)` | Configure logging |
| `.ConfigureResource(Action<ResourceBuilder>)` | Set resource attributes (shared across all signals) |
## Lifecycle
- **Host-managed.** The host starts the SDK via an `IHostedService` and
disposes it on graceful shutdown. You do **not** call `Dispose()` yourself.
- **Safe to call multiple times.** Calling `AddOpenTelemetry()` from multiple
libraries or configuration modules is safe - only one `TracerProvider` and
one `MeterProvider` are created per `IServiceCollection`.
- **DI-integrated.** Processors, exporters, and any custom services registered
in the DI container are available to the SDK. You can inject
`TracerProvider`, `MeterProvider`, or `ILoggerFactory` anywhere via
constructor injection.
## Dependency injection tips
### Accessing the TracerProvider
```csharp
app.MapGet("/trace-id", (TracerProvider tp) =>
{
// TracerProvider is available via DI
return Activity.Current?.TraceId.ToString() ?? "none";
});
```
### Registering a custom processor
```csharp
builder.Services.AddOpenTelemetry()
.WithTracing(tracing => tracing
.AddProcessor<MyFilteringProcessor>()); // resolved from DI
builder.Services.AddSingleton<MyFilteringProcessor>();
```
## Comparison with the non-hosted builders
| Concern | `AddOpenTelemetry()` | `OpenTelemetrySdk.Create()` |
| --- | --- | --- |
| Requires Generic Host | Yes | No |
| Lifecycle | Automatic (host) | Manual (`Dispose()`) |
| DI container | App's container | SDK-internal container |
| Safe to call multiple times | Yes | N/A (single call) |
| Builder API | Same `IOpenTelemetryBuilder` | Same `IOpenTelemetryBuilder` |
> [!TIP]
> **No host?** Use
> `OpenTelemetrySdk.Create()`(see in OpenTelemetrySdkCreate.md) for the same
> builder API with manual lifecycle control.