Microsoft.OpenTelemetry
1.0.4
Prefix Reserved
dotnet add package Microsoft.OpenTelemetry --version 1.0.4
NuGet\Install-Package Microsoft.OpenTelemetry -Version 1.0.4
<PackageReference Include="Microsoft.OpenTelemetry" Version="1.0.4" />
<PackageVersion Include="Microsoft.OpenTelemetry" Version="1.0.4" />
<PackageReference Include="Microsoft.OpenTelemetry" />
paket add Microsoft.OpenTelemetry --version 1.0.4
#r "nuget: Microsoft.OpenTelemetry, 1.0.4"
#:package Microsoft.OpenTelemetry@1.0.4
#addin nuget:?package=Microsoft.OpenTelemetry&version=1.0.4
#tool nuget:?package=Microsoft.OpenTelemetry&version=1.0.4
Microsoft.OpenTelemetry
A unified OpenTelemetry distribution for .NET. One-line onboarding for ASP.NET Core apps, Microsoft Agent Framework, and Agent365 — Microsoft's managed observability backend for AI agents.
Targets: net8.0, netstandard2.0
Install
dotnet add package Microsoft.OpenTelemetry
Quick Start
ASP.NET Core / Worker Services (hosted)
using Microsoft.OpenTelemetry;
var builder = WebApplication.CreateBuilder(args);
builder.UseMicrosoftOpenTelemetry(o =>
{
o.Exporters = ExportTarget.AzureMonitor;
});
var app = builder.Build();
app.Run();
Console / non-hosted apps
using Microsoft.OpenTelemetry;
using OpenTelemetry;
var sdk = OpenTelemetrySdk.Create(otel =>
{
otel.UseMicrosoftOpenTelemetry(o =>
{
o.Exporters = ExportTarget.AzureMonitor;
});
});
// Your application logic here.
// The SDK must stay alive for the lifetime of the app.
// Disposing the SDK flushes pending telemetry and shuts down all providers.
sdk.Dispose();
Important: Do not dispose the SDK until your application is shutting down. Disposing it early stops all telemetry collection and export — you will lose data.
UseMicrosoftOpenTelemetry()works on anyIOpenTelemetryBuilder— both the host-integrated andOpenTelemetrySdk.Create()paths are supported.
Signals & destinations
| Signal | Azure Monitor | Agent365 | OTLP | Console |
|---|---|---|---|---|
| Traces | ✅ | ✅ | ✅ | ✅ |
| Metrics | ✅ | — | ✅ | ✅ |
| Logs | ✅ | — | ✅ | ✅ |
Exporters auto-detect when Exporters isn't set:
- Azure Monitor — enabled when
ConnectionStringis set (code, env varAPPLICATIONINSIGHTS_CONNECTION_STRING, orIConfiguration). - Agent365 — enabled when
TokenResolveris set (or when the DI token cache is registered byMicrosoft.Agents.A365.Observability.Hosting).
Set explicitly to override auto-detection: o.Exporters = ExportTarget.AzureMonitor | ExportTarget.Agent365;
Instrumentation (always active)
- ASP.NET Core incoming HTTP requests
- HTTP client outbound calls (with Azure SDK dedup filter)
- SQL client queries
- Azure SDK client calls
- Resource detection (Azure App Service, VM, Container Apps)
- Agent365 scopes (
InvokeAgentScope,InferenceScope,ExecuteToolScope,OutputScope) and baggage propagation - Microsoft Agent Framework —
Experimental.Microsoft.Agents.AIactivity sources - Semantic Kernel —
Microsoft.SemanticKernel*activity sources - OpenAI / Azure OpenAI —
Azure.AI.OpenAI*,OpenAI.*,Experimental.Microsoft.Extensions.AI - Azure SDK EventSource →
ILoggerlog forwarding - Metrics —
Microsoft.AspNetCore.Hosting,System.Net.Http
Onboarding by scenario
Pick the section that matches your workload. All can be combined in the same app.
1. Azure Monitor
Send traces, metrics, and logs to Application Insights / Azure Monitor.
builder.UseMicrosoftOpenTelemetry(o =>
{
o.Exporters = ExportTarget.AzureMonitor;
o.AzureMonitor.ConnectionString = "InstrumentationKey=...";
});
Configuration sources — the connection string can be set via code, appsettings.json, or the APPLICATIONINSIGHTS_CONNECTION_STRING environment variable.
📖 Full guide: Azure Monitor Getting Started
2. Microsoft Agent Framework
Capture activity from Agent Framework agents and export to Azure Monitor, OTLP, or both.
builder.UseMicrosoftOpenTelemetry(o =>
{
o.Exporters = ExportTarget.AzureMonitor | ExportTarget.Otlp;
});
Agent Framework activity sources are captured automatically — no extra configuration needed.
📖 Full guide: Agent Framework Getting Started
3. Agent365
Send agent telemetry (invoke agent, inference, tool execution, output) to the Agent365 observability backend.
builder.UseMicrosoftOpenTelemetry(o =>
{
o.Exporters = ExportTarget.Agent365;
o.Agent365.TokenResolver = async (agentId, tenantId) =>
{
return await MyTokenService.GetTokenAsync(agentId, tenantId);
};
});
📖 Full guide: Agent365 Getting Started
4. Microsoft Fabric / Azure Data Explorer
Send traces, metrics, and logs to Microsoft Fabric Real-Time Intelligence or Azure Data Explorer via an OpenTelemetry Collector with the Azure Data Explorer exporter.
builder.UseMicrosoftOpenTelemetry(o =>
{
o.Exporters = ExportTarget.Otlp;
});
The app sends OTLP to a collector, which forwards to Fabric/ADX. No code changes needed — just configure the collector.
📖 Full guide: Fabric Getting Started
Combining destinations
builder.UseMicrosoftOpenTelemetry(o =>
{
o.Exporters = ExportTarget.AzureMonitor | ExportTarget.Agent365 | ExportTarget.Otlp;
o.AzureMonitor.ConnectionString = "InstrumentationKey=...";
o.Agent365.TokenResolver = async (agentId, tenantId) =>
{
return await MyTokenService.GetTokenAsync(agentId, tenantId);
};
});
Options reference
Full surface of MicrosoftOpenTelemetryOptions. Everything is opt-in; values shown are defaults.
builder.UseMicrosoftOpenTelemetry(o =>
{
// --- Export targets (pick one or combine with |) ---
o.Exporters = ExportTarget.Console // Console output (dev)
| ExportTarget.Agent365 // Agent365 observability platform
| ExportTarget.AzureMonitor // Application Insights
| ExportTarget.Otlp; // OTLP (Aspire, Jaeger, Grafana)
// --- Azure Monitor settings ---
o.AzureMonitor.ConnectionString = "InstrumentationKey=...";
o.AzureMonitor.Credential = new DefaultAzureCredential(); // Optional AAD auth
o.AzureMonitor.SamplingRatio = 1.0f;
o.AzureMonitor.TracesPerSecond = 5.0; // Rate-limited sampling (default)
o.AzureMonitor.EnableLiveMetrics = true;
o.AzureMonitor.EnableStandardMetrics = true;
o.AzureMonitor.EnablePerfCounters = true;
o.AzureMonitor.EnableTraceBasedLogsSampler = true;
o.AzureMonitor.DisableOfflineStorage = false;
o.AzureMonitor.StorageDirectory = null;
// --- Agent365 exporter settings ---
// Option A: Auto-managed tokens via DI (recommended for Agent Framework apps).
// The Microsoft.Agents.A365.Observability.Hosting package registers
// IExporterTokenCache<AgenticTokenStruct>. No TokenResolver needed.
// Option B: Custom token resolver (non-agent apps, S2S, custom auth)
o.Agent365.TokenResolver = async (agentId, tenantId) =>
{
return await MyTokenService.GetTokenAsync(agentId, tenantId);
};
// Optional: custom domain resolver (default: agent365.svc.cloud.microsoft)
o.Agent365.DomainResolver = tenantId => "agent365.svc.cloud.microsoft";
// Optional: use S2S endpoint path
o.Agent365.UseS2SEndpoint = false;
// Optional: batch export tuning
o.Agent365.MaxQueueSize = 2048;
o.Agent365.MaxExportBatchSize = 512;
o.Agent365.ScheduledDelayMilliseconds = 5000;
o.Agent365.ExporterTimeoutMilliseconds = 30000;
// --- Instrumentation options (all default to true) ---
o.Instrumentation.EnableTracing = true;
o.Instrumentation.EnableMetrics = true;
o.Instrumentation.EnableLogging = true;
o.Instrumentation.EnableAspNetCoreInstrumentation = true;
o.Instrumentation.EnableHttpClientInstrumentation = true;
o.Instrumentation.EnableSqlClientInstrumentation = true;
o.Instrumentation.EnableAzureSdkInstrumentation = true;
o.Instrumentation.EnableOpenAIInstrumentation = true;
o.Instrumentation.EnableSemanticKernelInstrumentation = true;
o.Instrumentation.EnableAgentFrameworkInstrumentation = true;
o.Instrumentation.EnableAgent365Instrumentation = true;
});
Token resolver: auto vs custom
| Approach | When to use | How it works |
|---|---|---|
| Auto (DI) — default | Agent Framework apps that reference Microsoft.Agents.A365.Observability.Hosting |
IExporterTokenCache<AgenticTokenStruct> is registered automatically. Per-request token exchange happens via ExchangeTurnTokenAsync. |
| Custom resolver | Non-agent apps, service-to-service, or custom auth | Set o.Agent365.TokenResolver directly. You own token acquisition. |
If
TokenResolveris set explicitly, the auto DI token cache is not registered — your resolver wins.
Verify it works
Send a request through your agent (e.g., a Teams message). In the console output you should see activity spans from the instrumented sources:
Activity.DisplayName: chat gpt-*
Activity.DisplayName: invoke_agent *
Activity.DisplayName: MessageProcessor
And a successful Agent365 export:
Received HTTP response headers after *ms - 200
Internal logging
The distro's internal components (exporters, span processors) use ILoggerFactory from DI when available.
In ASP.NET Core and hosted apps, this means internal diagnostics flow through the app's configured logging pipeline automatically.
Non-DI / console apps: If your app does not register ILoggerFactory in DI, internal diagnostics are silently discarded (NullLoggerFactory). To see internal log output, add Microsoft.Extensions.Logging.Console and wire it up:
dotnet add package Microsoft.Extensions.Logging.Console
builder.Services.AddLogging(logging => logging.AddConsole());
Documentation
- Azure Monitor Getting Started — Send traces, metrics, and logs to Application Insights
- Agent Framework Getting Started — Instrument Agent Framework agents with Azure Monitor and OTLP
- Customization Guide — Resource configuration, enrichment, filtering, and OTLP exporter tuning
- Agent 365 Getting Started — Add Agent365 observability using the distro
- Agent 365 Migration Guide — Migrate from the standalone Agent365 SDK to the distro
- Agent 365 Migration Testing — Detailed migration checklist with auto-instrumentation, env vars, and span comparison
- Fabric Getting Started — Send telemetry to Microsoft Fabric / Azure Data Explorer via OTLP + OTel Collector
- Aspire Dashboard — Validate telemetry locally with the .NET Aspire Dashboard
Examples
- Azure.Monitor.OpenTelemetry.AspNetCore.Demo — ASP.NET Core → Azure Monitor
- Microsoft.OpenTelemetry.Agent365.Demo — Agent Framework app → Agent365
- Microsoft.OpenTelemetry.AgentFramework.Demo — Agent Framework → OTLP / Azure Monitor
- Microsoft.OpenTelemetry.Fabric.Demo — ASP.NET Core → OTLP → OTel Collector → Microsoft Fabric / Azure Data Explorer
AI-Assisted Setup & Migration Skills
The skills/ folder contains portable skills that help AI coding agents set up or migrate to the Microsoft OpenTelemetry distro.
What They Do
microsoft-opentelemetry-setup: Guides new setup for ASP.NET Core, Console, and Agent Framework apps — covers exporters, token resolver, baggage, and instrumentation optionsmicrosoft-opentelemetry-migration: Walks through A365 Observability SDK → distro migration with code change detection, package swap, and validation checklist
Installation by Agent
GitHub Copilot:
cp -r skills/microsoft-opentelemetry-setup .github/skills/microsoft-opentelemetry-setup
cp -r skills/microsoft-opentelemetry-migration .github/skills/microsoft-opentelemetry-migration
Copilot discovers skills in .github/skills/ automatically. Works with Copilot coding agent and agent mode in VS Code.
Claude Code:
cp -r skills/microsoft-opentelemetry-setup .claude/skills/microsoft-opentelemetry-setup
cp -r skills/microsoft-opentelemetry-migration .claude/skills/microsoft-opentelemetry-migration
Cursor:
cp -r skills/microsoft-opentelemetry-setup .cursor/skills/microsoft-opentelemetry-setup
cp -r skills/microsoft-opentelemetry-migration .cursor/skills/microsoft-opentelemetry-migration
Codex:
cp -r skills/microsoft-opentelemetry-setup .agents/skills/microsoft-opentelemetry-setup
cp -r skills/microsoft-opentelemetry-migration .agents/skills/microsoft-opentelemetry-migration
Other agents:
Copy the skills/ folders into your project's agent skills directory. If your agent doesn't support the Agent Skills standard, copy the references/ markdown files into whatever instruction mechanism your agent uses.
Usage
Once installed, ask your AI coding agent:
- "Add observability to my agent"
- "Set up Microsoft.OpenTelemetry"
- "Migrate from A365 SDK to the distro"
- "Configure Agent 365 export"
The skill automatically detects your app type and provides the correct guidance.
Build & test
dotnet build Microsoft.OpenTelemetry.slnx
dotnet test Microsoft.OpenTelemetry.slnx
Microsoft Open Source Code of Conduct
This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.
Data Collection
As this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.
The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.
Internal Telemetry
Internal telemetry can be disabled by setting the environment variable APPLICATIONINSIGHTS_STATSBEAT_DISABLED to true.
Trademarks
This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft’s Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.
Reporting Security Issues
See SECURITY.md.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Azure.Monitor.OpenTelemetry.Exporter (>= 1.8.1)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.2)
- Microsoft.Extensions.Logging (>= 10.0.2)
- OpenTelemetry.Exporter.Console (>= 1.15.3)
- OpenTelemetry.Exporter.OpenTelemetryProtocol (>= 1.15.3)
- OpenTelemetry.Extensions.Hosting (>= 1.15.3)
- OpenTelemetry.Instrumentation.AspNetCore (>= 1.15.2)
- OpenTelemetry.Instrumentation.Http (>= 1.15.1)
- OpenTelemetry.Instrumentation.SqlClient (>= 1.15.2)
-
net8.0
- Azure.Monitor.OpenTelemetry.Exporter (>= 1.8.1)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.2)
- Microsoft.Extensions.Logging (>= 10.0.2)
- OpenTelemetry.Exporter.Console (>= 1.15.3)
- OpenTelemetry.Exporter.OpenTelemetryProtocol (>= 1.15.3)
- OpenTelemetry.Extensions.Hosting (>= 1.15.3)
- OpenTelemetry.Instrumentation.AspNetCore (>= 1.15.2)
- OpenTelemetry.Instrumentation.Http (>= 1.15.1)
- OpenTelemetry.Instrumentation.SqlClient (>= 1.15.2)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Microsoft.OpenTelemetry:
| Package | Downloads |
|---|---|
|
Azure.AI.AgentServer.Core
Shared foundation for Azure AI Agent Server packages — provides port binding, health probes, OpenTelemetry, graceful shutdown, and the composable AgentHostBuilder. |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on Microsoft.OpenTelemetry:
| Repository | Stars |
|---|---|
|
Azure/azure-sdk-for-net
This repository is for active development of the Azure SDK for .NET. For consumers of the SDK we recommend visiting our public developer docs at https://learn.microsoft.com/dotnet/azure/ or our versioned developer docs at https://azure.github.io/azure-sdk-for-net.
|
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.4 | 125 | 6/1/2026 |
| 1.0.3 | 234 | 5/22/2026 |
| 1.0.2 | 337 | 5/6/2026 |
| 1.0.1 | 510 | 5/1/2026 |
| 1.0.0-beta.2 | 54 | 4/30/2026 |
| 1.0.0-beta.1 | 3,667 | 4/27/2026 |
| 1.0.0-alpha.3 | 272 | 4/23/2026 |
| 1.0.0-alpha.2 | 71 | 4/21/2026 |
| 1.0.0-alpha.1 | 54 | 4/20/2026 |
See CHANGELOG.md for release notes.