@azure/mcp-linux-arm64 2.0.0-beta.3 → 2.0.0-beta.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/NOTICE.txt +6129 -5295
  2. package/README.md +185 -32
  3. package/dist/Azure.Mcp.Tools.AzureMigrate.xml +1060 -0
  4. package/dist/Instrumentation/Resources/api-reference/dotnet/ActivityProcessors.md +119 -0
  5. package/dist/Instrumentation/Resources/api-reference/dotnet/AddApplicationInsightsTelemetry.md +129 -0
  6. package/dist/Instrumentation/Resources/api-reference/dotnet/AddOpenTelemetry.md +153 -0
  7. package/dist/Instrumentation/Resources/api-reference/dotnet/AzureMonitorExporter.md +137 -0
  8. package/dist/Instrumentation/Resources/api-reference/dotnet/ConfigureOpenTelemetryProvider.md +195 -0
  9. package/dist/Instrumentation/Resources/api-reference/dotnet/ConfigureResource.md +119 -0
  10. package/dist/Instrumentation/Resources/api-reference/dotnet/LogProcessors.md +99 -0
  11. package/dist/Instrumentation/Resources/api-reference/dotnet/OpenTelemetrySdkCreate.md +146 -0
  12. package/dist/Instrumentation/Resources/api-reference/dotnet/Sampling.md +86 -0
  13. package/dist/Instrumentation/Resources/api-reference/dotnet/SdkCreateTracerProviderBuilder.md +127 -0
  14. package/dist/Instrumentation/Resources/api-reference/dotnet/UseAzureMonitor.md +96 -0
  15. package/dist/Instrumentation/Resources/api-reference/dotnet/UseAzureMonitorExporter.md +146 -0
  16. package/dist/Instrumentation/Resources/api-reference/dotnet/WithLogging.md +109 -0
  17. package/dist/Instrumentation/Resources/api-reference/dotnet/WithMetrics.md +105 -0
  18. package/dist/Instrumentation/Resources/api-reference/dotnet/WithTracing.md +91 -0
  19. package/dist/Instrumentation/Resources/concepts/dotnet/azure-monitor-distro.md +102 -0
  20. package/dist/Instrumentation/Resources/concepts/dotnet/opentelemetry-pipeline.md +57 -0
  21. package/dist/Instrumentation/Resources/examples/dotnet/aspnetcore-setup.md +156 -0
  22. package/dist/Instrumentation/Resources/migration/dotnet/appinsights-2x-to-3x-code-migration.md +134 -0
  23. package/dist/Instrumentation/Resources/migration/dotnet/appinsights-2x-to-3x-no-code-change.md +92 -0
  24. package/dist/appsettings.json +5 -0
  25. package/dist/azmcp +0 -0
  26. package/package.json +3 -2
@@ -0,0 +1,195 @@
1
+ ---
2
+ title: ConfigureOpenTelemetryProvider
3
+ category: api-reference
4
+ applies-to: 3.x
5
+ ---
6
+
7
+ # ConfigureOpenTelemetry*Provider Extensions
8
+
9
+ These `IServiceCollection` extension methods register actions used to
10
+ configure OpenTelemetry providers. They work anywhere you have access to an
11
+ `IServiceCollection` - in application startup, inside a builder's
12
+ `ConfigureServices` callback, or in a shared extension method.
13
+
14
+ ## When to use
15
+
16
+ - You want to **register sources, meters, or logging configuration separately**
17
+ from where the provider is created (e.g., different files, methods, or
18
+ packages).
19
+ - You need to **add configuration from inside a `ConfigureServices` callback**
20
+ on a provider builder.
21
+ - Your app has **modular startup** where each feature area configures its own
22
+ instrumentation independently.
23
+ - You are a **library author** registering instrumentation without owning the
24
+ provider creation call.
25
+ - You need access to `IServiceProvider` at configuration time to resolve
26
+ services such as `IConfiguration`.
27
+
28
+ > [!IMPORTANT]
29
+ > These methods register configuration but **do not create a
30
+ > provider**. A provider must still be created via
31
+ > Host & DI-Integrated (`AddOpenTelemetry`)(see in AddOpenTelemetry.md),
32
+ > Unified Multi-Signal (`OpenTelemetrySdk.Create`)(see in OpenTelemetrySdkCreate.md), or
33
+ > Per-Signal / Legacy (`Sdk.CreateTracerProviderBuilder`)(see in SdkCreateTracerProviderBuilder.md)
34
+ > for the configuration to take effect.
35
+
36
+ ## Namespaces
37
+
38
+ | Method | Namespace |
39
+ | --- | --- |
40
+ | `ConfigureOpenTelemetryTracerProvider` | `OpenTelemetry.Trace` |
41
+ | `ConfigureOpenTelemetryMeterProvider` | `OpenTelemetry.Metrics` |
42
+ | `ConfigureOpenTelemetryLoggerProvider` | `OpenTelemetry.Logs` |
43
+
44
+ ## Available methods
45
+
46
+ | Method | Signal |
47
+ | --- | --- |
48
+ | `services.ConfigureOpenTelemetryTracerProvider(...)` | Tracing |
49
+ | `services.ConfigureOpenTelemetryMeterProvider(...)` | Metrics |
50
+ | `services.ConfigureOpenTelemetryLoggerProvider(...)` | Logging |
51
+
52
+ ### Overload 1 - `Action<*ProviderBuilder>` (executed immediately)
53
+
54
+ ```csharp
55
+ public static IServiceCollection ConfigureOpenTelemetryTracerProvider(
56
+ this IServiceCollection services,
57
+ Action<TracerProviderBuilder> configure);
58
+
59
+ public static IServiceCollection ConfigureOpenTelemetryMeterProvider(
60
+ this IServiceCollection services,
61
+ Action<MeterProviderBuilder> configure);
62
+
63
+ public static IServiceCollection ConfigureOpenTelemetryLoggerProvider(
64
+ this IServiceCollection services,
65
+ Action<LoggerProviderBuilder> configure);
66
+ ```
67
+
68
+ The `configure` delegate is **invoked immediately** (not deferred). Internally
69
+ it creates a `*ProviderServiceCollectionBuilder` (e.g.,
70
+ `TracerProviderServiceCollectionBuilder`) wrapping the `IServiceCollection` and
71
+ passes it to the delegate. Because the delegate receives the builder before the
72
+ `IServiceProvider` exists, it is **safe to register services** (e.g., call
73
+ `AddSource`, `AddMeter`, `AddInstrumentation<T>`, etc.).
74
+
75
+ ### Overload 2 - `Action<IServiceProvider, *ProviderBuilder>` (deferred)
76
+
77
+ ```csharp
78
+ public static IServiceCollection ConfigureOpenTelemetryTracerProvider(
79
+ this IServiceCollection services,
80
+ Action<IServiceProvider, TracerProviderBuilder> configure);
81
+
82
+ public static IServiceCollection ConfigureOpenTelemetryMeterProvider(
83
+ this IServiceCollection services,
84
+ Action<IServiceProvider, MeterProviderBuilder> configure);
85
+
86
+ public static IServiceCollection ConfigureOpenTelemetryLoggerProvider(
87
+ this IServiceCollection services,
88
+ Action<IServiceProvider, LoggerProviderBuilder> configure);
89
+ ```
90
+
91
+ This overload registers the delegate as an `IConfigureTracerProviderBuilder` /
92
+ `IConfigureMeterProviderBuilder` / `IConfigureLoggerProviderBuilder` singleton
93
+ in the `IServiceCollection`. The delegate is **not invoked until the provider
94
+ is being constructed** (when the `IServiceProvider` is available). Because the
95
+ service container is already built at that point, **you cannot register new
96
+ services** inside this callback - many builder helper extensions that register
97
+ services will throw `NotSupportedException`.
98
+
99
+ ```csharp
100
+ services.ConfigureOpenTelemetryTracerProvider((sp, tracing) =>
101
+ {
102
+ var config = sp.GetRequiredService<IConfiguration>();
103
+ tracing.SetSampler(new TraceIdRatioBasedSampler(
104
+ config.GetValue<double>("Telemetry:SamplingRate")));
105
+ });
106
+ ```
107
+
108
+ ## Example - separating source registration from exporter setup
109
+
110
+ Register instrumentation sources early in startup, then configure exporters
111
+ separately:
112
+
113
+ ```csharp
114
+ var builder = WebApplication.CreateBuilder(args);
115
+
116
+ // Register sources (could be in a different file or method)
117
+ builder.Services.ConfigureOpenTelemetryTracerProvider(tracing =>
118
+ tracing.AddSource("MyApp"));
119
+
120
+ builder.Services.ConfigureOpenTelemetryMeterProvider(metrics =>
121
+ metrics.AddMeter("MyApp"));
122
+
123
+ // Configure exporters and create the provider
124
+ builder.Services.AddOpenTelemetry()
125
+ .ConfigureResource(r => r.AddService("my-app"))
126
+ .WithTracing(tracing => tracing.AddOtlpExporter())
127
+ .WithMetrics(metrics => metrics.AddOtlpExporter());
128
+
129
+ var app = builder.Build();
130
+ app.Run();
131
+ ```
132
+
133
+ ## Example - library author registering sources
134
+
135
+ A library can register its instrumentation without depending on the app's
136
+ startup code:
137
+
138
+ ```csharp
139
+ public static class MyLibraryExtensions
140
+ {
141
+ public static IServiceCollection AddMyLibrary(this IServiceCollection services)
142
+ {
143
+ services.AddSingleton<MyService>();
144
+
145
+ services.ConfigureOpenTelemetryTracerProvider(tracing =>
146
+ tracing.AddSource("MyLibrary"));
147
+ services.ConfigureOpenTelemetryMeterProvider(metrics =>
148
+ metrics.AddMeter("MyLibrary"));
149
+
150
+ return services;
151
+ }
152
+ }
153
+ ```
154
+
155
+ The host application composes everything:
156
+
157
+ ```csharp
158
+ var builder = WebApplication.CreateBuilder(args);
159
+
160
+ builder.Services.AddMyLibrary(); // library registers its sources
161
+
162
+ builder.Services.AddOpenTelemetry() // app owns the provider
163
+ .ConfigureResource(r => r.AddService("my-app"))
164
+ .WithTracing(tracing => tracing.AddOtlpExporter())
165
+ .WithMetrics(metrics => metrics.AddOtlpExporter());
166
+
167
+ var app = builder.Build();
168
+ app.Run();
169
+ ```
170
+
171
+
172
+
173
+ ## Relationship with `WithTracing` / `WithMetrics` / `WithLogging`
174
+
175
+ These methods are **complementary** with the `With*` methods, not
176
+ interchangeable. `WithTracing()` / `WithMetrics()` / `WithLogging()` **register
177
+ the provider**; `ConfigureOpenTelemetry*Provider` only **queues configuration
178
+ actions**. Without a `With*` call (or equivalent provider creation), queued
179
+ actions are never consumed.
180
+
181
+ ## Hosting package not required
182
+
183
+ These methods are defined in `OpenTelemetry.Api.ProviderBuilderExtensions` and
184
+ work with **any `IServiceCollection`** — hosted or non-hosted. The only
185
+ requirement is that a provider is eventually resolved from the same
186
+ `IServiceCollection` for the queued actions to take effect.
187
+
188
+ ## Related methods
189
+
190
+ | Method | Defined on | Purpose |
191
+ | --- | --- | --- |
192
+ | Host & DI-Integrated (`AddOpenTelemetry`)(see in AddOpenTelemetry.md) | `IServiceCollection` | Creates the provider and starts the hosted service |
193
+ | `.WithTracing()` / `.WithMetrics()` / `.WithLogging()` | `IOpenTelemetryBuilder` | Registers a provider for the signal and optionally configures it |
194
+ | `.ConfigureResource()` | `IOpenTelemetryBuilder` | Shared resource configuration (internally uses `ConfigureOpenTelemetry*Provider`) |
195
+
@@ -0,0 +1,119 @@
1
+ ---
2
+ title: ConfigureResource
3
+ category: api-reference
4
+ applies-to: 1.x
5
+ ---
6
+
7
+ # .ConfigureResource()
8
+
9
+ ## API surface
10
+
11
+ ### On `IOpenTelemetryBuilder` (shared across all signals)
12
+
13
+ | Method | Purpose |
14
+ | --- | --- |
15
+ | `.ConfigureResource(Action<ResourceBuilder>)` | Modify the resource for traces, metrics, **and** logs |
16
+
17
+ ### On individual provider builders
18
+
19
+ | Method | Purpose |
20
+ | --- | --- |
21
+ | `TracerProviderBuilder.ConfigureResource(Action<ResourceBuilder>)` | Modify resource for tracing only |
22
+ | `MeterProviderBuilder.ConfigureResource(Action<ResourceBuilder>)` | Modify resource for metrics only |
23
+ | `LoggerProviderBuilder.ConfigureResource(Action<ResourceBuilder>)` | Modify resource for logging only |
24
+ | `*.SetResourceBuilder(ResourceBuilder)` | Replace the resource builder entirely (all three builders) |
25
+
26
+ ### `ResourceBuilder` static methods
27
+
28
+ | Method | Purpose |
29
+ | --- | --- |
30
+ | `ResourceBuilder.CreateDefault()` | Create builder with SDK defaults + env var detector |
31
+ | `ResourceBuilder.CreateEmpty()` | Create builder with no attributes |
32
+
33
+ ### `ResourceBuilder` instance methods
34
+
35
+ | Method | Purpose |
36
+ | --- | --- |
37
+ | `.AddService(string serviceName, ...)` | Add `service.name`, `service.namespace`, `service.version`, `service.instance.id` |
38
+ | `.AddAttributes(IEnumerable<KeyValuePair<string, object>>)` | Add arbitrary resource attributes |
39
+ | `.AddTelemetrySdk()` | Add `telemetry.sdk.*` attributes (included in `CreateDefault()`) |
40
+ | `.AddEnvironmentVariableDetector()` | Parse `OTEL_RESOURCE_ATTRIBUTES` and `OTEL_SERVICE_NAME` env vars |
41
+ | `.AddDetector(IResourceDetector)` | Add a custom resource detector |
42
+ | `.AddDetector(Func<IServiceProvider, IResourceDetector>)` | Add a custom detector resolved from DI |
43
+ | `.Clear()` | Remove all previously added detectors/resources |
44
+
45
+ ## When to use
46
+
47
+ - Set `service.name`, `service.version`, and other resource attributes that identify your application.
48
+ - Apply a shared resource across all three signals (traces, metrics, logs) via the top-level `IOpenTelemetryBuilder`.
49
+ - Override or extend the default resource for a single signal's provider builder.
50
+ - Add custom `IResourceDetector` implementations for cloud metadata or environment-specific attributes.
51
+ - Call multiple times safely — each configuration action is applied sequentially.
52
+
53
+ ## Minimal example
54
+
55
+ ```csharp
56
+ using OpenTelemetry;
57
+ using OpenTelemetry.Resources;
58
+ using OpenTelemetry.Trace;
59
+
60
+ var builder = WebApplication.CreateBuilder(args);
61
+
62
+ builder.Services.AddOpenTelemetry()
63
+ .ConfigureResource(r => r.AddService("my-api"))
64
+ .WithTracing(t => t.AddOtlpExporter());
65
+
66
+ var app = builder.Build();
67
+ app.Run();
68
+ ```
69
+
70
+ ## Full example
71
+
72
+ ```csharp
73
+ using OpenTelemetry;
74
+ using OpenTelemetry.Resources;
75
+ using OpenTelemetry.Trace;
76
+ using OpenTelemetry.Metrics;
77
+
78
+ var builder = WebApplication.CreateBuilder(args);
79
+
80
+ builder.Services.AddOpenTelemetry()
81
+ .ConfigureResource(resource => resource
82
+ .AddService(
83
+ serviceName: "order-api",
84
+ serviceNamespace: "ecommerce",
85
+ serviceVersion: "2.1.0",
86
+ autoGenerateServiceInstanceId: true)
87
+ .AddAttributes(new Dictionary<string, object>
88
+ {
89
+ ["deployment.environment"] = "production",
90
+ ["host.name"] = Environment.MachineName,
91
+ })
92
+ .AddEnvironmentVariableDetector())
93
+ .WithTracing(t => t.AddOtlpExporter())
94
+ .WithMetrics(m => m.AddOtlpExporter());
95
+
96
+ var app = builder.Build();
97
+ app.Run();
98
+ ```
99
+
100
+ ## Key parameters
101
+
102
+ `AddService()` parameters:
103
+
104
+ | Parameter | Type | Default | Description |
105
+ | --- | --- | --- | --- |
106
+ | `serviceName` | `string` | *(required)* | Value for `service.name` |
107
+ | `serviceNamespace` | `string?` | `null` | Value for `service.namespace` |
108
+ | `serviceVersion` | `string?` | `null` | Value for `service.version` |
109
+ | `autoGenerateServiceInstanceId` | `bool` | `true` | Auto-generate a GUID for `service.instance.id` |
110
+ | `serviceInstanceId` | `string?` | `null` | Explicit `service.instance.id` (overrides auto-generate) |
111
+
112
+ ## Behavior notes
113
+
114
+ - `ConfigureResource()` on `IOpenTelemetryBuilder` delegates to `ConfigureResource()` on all three signal builders (tracer, meter, logger).
115
+ - `ConfigureResource()` is **additive** — each call appends to the existing resource.
116
+ - `SetResourceBuilder()` **replaces** the entire resource builder. Use `ConfigureResource()` unless you specifically need a full reset.
117
+ - `CreateDefault()` includes `telemetry.sdk.*` attributes, `OTEL_RESOURCE_ATTRIBUTES`, `OTEL_SERVICE_NAME`, and a fallback `service.name` of `unknown_service:<process_name>`.
118
+ - `AddDetector(Func<IServiceProvider, IResourceDetector>)` throws `NotSupportedException` if `ResourceBuilder.Build()` is called directly without an `IServiceProvider`.
119
+ - Resource attributes are merged in registration order. Later values for the same key overwrite earlier ones.
@@ -0,0 +1,99 @@
1
+ ---
2
+ title: LogProcessors
3
+ category: api-reference
4
+ applies-to: 1.x
5
+ ---
6
+
7
+ # Log Processors — Enrichment & Redaction
8
+
9
+ ## Key concepts
10
+
11
+ - Subclass `BaseProcessor<LogRecord>`. Only `OnEnd` is called (not `OnStart`).
12
+ - Register via `.AddProcessor<T>()` — see WithLogging.md.
13
+ - **Log filtering:** Use `ILoggingBuilder.AddFilter<OpenTelemetryLoggerProvider>()` — processor-level filtering is not reliable because `CompositeProcessor` iterates all processors regardless and `LogRecord` has no `Recorded` flag.
14
+
15
+ ## Filtering — use `AddFilter`
16
+
17
+ ```csharp
18
+ builder.Logging.AddFilter<OpenTelemetryLoggerProvider>("Microsoft.AspNetCore", LogLevel.Warning);
19
+ builder.Logging.AddFilter<OpenTelemetryLoggerProvider>("System.Net.Http", LogLevel.Warning);
20
+ ```
21
+
22
+ This prevents log records from entering the OpenTelemetry pipeline entirely.
23
+
24
+ ## Enrichment — add attributes
25
+
26
+ ```csharp
27
+ using OpenTelemetry;
28
+ using OpenTelemetry.Logs;
29
+
30
+ public class LogEnrichmentProcessor : BaseProcessor<LogRecord>
31
+ {
32
+ public override void OnEnd(LogRecord data)
33
+ {
34
+ var attributes = data.Attributes?.ToList()
35
+ ?? [];
36
+
37
+ attributes.Add(new("deployment.environment", "production"));
38
+ attributes.Add(new("host.name", Environment.MachineName));
39
+
40
+ data.Attributes = attributes;
41
+
42
+ base.OnEnd(data);
43
+ }
44
+ }
45
+ ```
46
+
47
+ ## Redaction — mask sensitive data
48
+
49
+ ```csharp
50
+ using System.Linq;
51
+ using OpenTelemetry;
52
+ using OpenTelemetry.Logs;
53
+
54
+ public class RedactionProcessor : BaseProcessor<LogRecord>
55
+ {
56
+ private static readonly HashSet<string> SensitiveKeys = new(StringComparer.OrdinalIgnoreCase)
57
+ {
58
+ "password", "token", "secret", "authorization", "api_key"
59
+ };
60
+
61
+ public override void OnEnd(LogRecord data)
62
+ {
63
+ if (data.Attributes != null)
64
+ {
65
+ data.Attributes = data.Attributes.Select(attr =>
66
+ SensitiveKeys.Contains(attr.Key)
67
+ ? new KeyValuePair<string, object?>(attr.Key, "[REDACTED]")
68
+ : attr).ToList();
69
+ }
70
+
71
+ base.OnEnd(data);
72
+ }
73
+ }
74
+ ```
75
+
76
+ ## Inspectable `LogRecord` properties
77
+
78
+ `CategoryName`, `LogLevel`, `EventId`, `FormattedMessage` (when `IncludeFormattedMessage = true`), `Attributes`, `TraceId`, `SpanId`, `Timestamp`.
79
+
80
+ ## Migration from Application Insights 2.x
81
+
82
+ If the old `ITelemetryInitializer` or `ITelemetryProcessor` touched `TraceTelemetry` or `EventTelemetry`, those now map to `LogRecord`:
83
+
84
+ | 2.x Property | LogRecord equivalent |
85
+ | --- | --- |
86
+ | `trace.Properties["key"]` / `GlobalProperties["key"]` | Add to `data.Attributes` |
87
+ | `trace.SeverityLevel` | `data.LogLevel` |
88
+ | `trace.Message` | `data.FormattedMessage` or `data.Attributes` |
89
+ | `if (item is TraceTelemetry)` type check | Check `data.CategoryName` or `data.LogLevel` |
90
+ | Severity-based filtering in processor | `ILoggingBuilder.AddFilter<OpenTelemetryLoggerProvider>()` |
91
+
92
+ ## Telemetry type mapping
93
+
94
+ | Source | Application Insights telemetry type |
95
+ | --- | --- |
96
+ | `ILogger` logs | `TraceTelemetry` |
97
+ | `ILogger` logs with `microsoft.custom_event.name` attribute | `EventTelemetry` |
98
+
99
+ See ActivityProcessors.md for `ActivityKind` → `RequestTelemetry`/`DependencyTelemetry` mapping.
@@ -0,0 +1,146 @@
1
+ ---
2
+ title: OpenTelemetrySdk.Create
3
+ category: api-reference
4
+ applies-to: 3.x
5
+ ---
6
+
7
+ # OpenTelemetrySdk.Create()
8
+
9
+ > [!IMPORTANT]
10
+ > **Introduced in 1.10.0.** This is the recommended way to initialize the SDK
11
+ > in non-hosted applications.
12
+
13
+ ## When to use
14
+
15
+ - **Console apps, CLI tools, background jobs** that do not use the .NET Generic
16
+ Host.
17
+ - Any non-hosted process that needs **multiple signals** (traces + metrics +
18
+ logs) under a single lifecycle boundary.
19
+
20
+ ## Minimal example
21
+
22
+ ```csharp
23
+ using OpenTelemetry;
24
+
25
+ using var sdk = OpenTelemetrySdk.Create(builder => builder
26
+ .ConfigureResource(r => r.AddService("my-console-app"))
27
+ .WithTracing(tracing => tracing
28
+ .AddSource("MyApp")
29
+ .AddConsoleExporter())
30
+ .WithMetrics(metrics => metrics
31
+ .AddMeter("MyApp")
32
+ .AddConsoleExporter()));
33
+
34
+ // Application logic goes here.
35
+ // sdk.Dispose() is called by `using`, which flushes all signals.
36
+ ```
37
+
38
+ ## Using logging
39
+
40
+ `OpenTelemetrySdk` exposes an `ILoggerFactory` via the `GetLoggerFactory()`
41
+ extension method:
42
+
43
+ ```csharp
44
+ using Microsoft.Extensions.Logging;
45
+ using OpenTelemetry;
46
+ using OpenTelemetry.Logs;
47
+
48
+ using var sdk = OpenTelemetrySdk.Create(builder => builder
49
+ .WithLogging(logging => logging.AddConsoleExporter()));
50
+
51
+ var logger = sdk.GetLoggerFactory().CreateLogger<Program>();
52
+ logger.LogInformation("Hello from {Source}", "OpenTelemetry");
53
+ ```
54
+
55
+ ## Full multi-signal example
56
+
57
+ ```csharp
58
+ using System.Diagnostics;
59
+ using System.Diagnostics.Metrics;
60
+ using Microsoft.Extensions.Logging;
61
+ using OpenTelemetry;
62
+ using OpenTelemetry.Logs;
63
+ using OpenTelemetry.Metrics;
64
+ using OpenTelemetry.Trace;
65
+
66
+ var activitySource = new ActivitySource("MyApp");
67
+ var meter = new Meter("MyApp");
68
+ var requestCounter = meter.CreateCounter<long>("requests");
69
+
70
+ using var sdk = OpenTelemetrySdk.Create(builder => builder
71
+ .ConfigureResource(r => r.AddService("my-console-app"))
72
+ .WithTracing(tracing => tracing
73
+ .AddSource("MyApp")
74
+ .AddOtlpExporter())
75
+ .WithMetrics(metrics => metrics
76
+ .AddMeter("MyApp")
77
+ .AddOtlpExporter())
78
+ .WithLogging(logging => logging
79
+ .AddOtlpExporter()));
80
+
81
+ var logger = sdk.GetLoggerFactory().CreateLogger<Program>();
82
+
83
+ using (var activity = activitySource.StartActivity("ProcessRequest"))
84
+ {
85
+ requestCounter.Add(1);
86
+ logger.LogInformation("Request processed");
87
+ }
88
+ // sdk.Dispose() flushes and shuts down all three providers.
89
+ ```
90
+
91
+ ## API surface
92
+
93
+ `OpenTelemetrySdk.Create()` accepts an `Action<IOpenTelemetryBuilder>`. The
94
+ builder exposes the same extension methods used by the hosted
95
+ `AddOpenTelemetry()` path:
96
+
97
+ | Method | Purpose |
98
+ | --- | --- |
99
+ | `.WithTracing(Action<TracerProviderBuilder>)` | Configure tracing |
100
+ | `.WithMetrics(Action<MeterProviderBuilder>)` | Configure metrics |
101
+ | `.WithLogging(Action<LoggerProviderBuilder>)` | Configure logging |
102
+ | `.ConfigureResource(Action<ResourceBuilder>)` | Set resource attributes (shared across all signals) |
103
+
104
+ ## Returned object
105
+
106
+ ```mermaid
107
+ classDiagram
108
+ class OpenTelemetrySdk {
109
+ +IDisposable
110
+ +TracerProvider TracerProvider
111
+ +MeterProvider MeterProvider
112
+ +LoggerProvider LoggerProvider
113
+ +GetLoggerFactory() ILoggerFactory
114
+ }
115
+ note for OpenTelemetrySdk "GetLoggerFactory() is an extension method"
116
+ ```
117
+
118
+ Unconfigured signals return **no-op** provider instances - safe to access but
119
+ they emit nothing.
120
+
121
+ ## Lifecycle
122
+
123
+ - **Single disposal.** Calling `sdk.Dispose()` shuts down the internal
124
+ `IServiceProvider`, which gracefully flushes and disposes all configured
125
+ providers.
126
+ - **Internally creates its own DI container.** Processors, exporters, and
127
+ other services registered via `.ConfigureServices()` live inside this
128
+ container.
129
+ - **Environment-variable support.** An `IConfiguration` instance backed by
130
+ environment variables is created automatically, so standard `OTEL_*`
131
+ environment variables are respected.
132
+
133
+ ## Comparison with the per-signal builders
134
+
135
+ | Concern | `OpenTelemetrySdk.Create()` | `Sdk.CreateTracerProviderBuilder()` |
136
+ | --- | --- | --- |
137
+ | Signals | All in one builder | One builder per signal |
138
+ | Resource config | Shared `.ConfigureResource()` | Must repeat per builder |
139
+ | Disposal | Single `Dispose()` | One `Dispose()` per provider |
140
+ | Internal DI | Yes | No |
141
+ | Minimum SDK version | 1.10.0 | Any |
142
+
143
+ > [!TIP]
144
+ > **Need the .NET Host?** Use
145
+ > `services.AddOpenTelemetry()`(see in AddOpenTelemetry.md) instead -- same
146
+ > builder API, but lifecycle is managed by the host.
@@ -0,0 +1,86 @@
1
+ ---
2
+ title: Sampling
3
+ category: api-reference
4
+ applies-to: 1.x
5
+ ---
6
+
7
+ # SetSampler()
8
+
9
+ ## API surface
10
+
11
+ ### `SetSampler` overloads
12
+
13
+ | Method | Purpose |
14
+ | --- | --- |
15
+ | `.SetSampler(Sampler)` | Set a sampler instance directly |
16
+ | `.SetSampler<T>()` | Set a sampler resolved from DI (registered as singleton) |
17
+ | `.SetSampler(Func<IServiceProvider, Sampler>)` | Set a sampler via factory delegate |
18
+
19
+ ### `SamplingDecision` enum
20
+
21
+ | Value | `IsAllDataRequested` | `Recorded` flag | Description |
22
+ | --- | --- | --- | --- |
23
+ | `Drop` | `false` | `false` | Activity created but not recorded or exported |
24
+ | `RecordOnly` | `true` | `false` | Activity recorded (spans visible to processors) but not exported |
25
+ | `RecordAndSample` | `true` | `true` | Activity fully recorded and exported |
26
+
27
+ ## When to use
28
+
29
+ - Control the volume of traces exported to your backend by sampling a percentage of requests.
30
+ - Honor parent sampling decisions for distributed traces while applying custom logic to root spans.
31
+ - Drop traces entirely for specific scenarios (e.g., health checks) using a custom sampler.
32
+ - Replace the SDK default sampler (`ParentBasedSampler(AlwaysOnSampler)`).
33
+
34
+ ## Minimal example
35
+
36
+ ```csharp
37
+ using OpenTelemetry;
38
+ using OpenTelemetry.Trace;
39
+
40
+ var builder = WebApplication.CreateBuilder(args);
41
+
42
+ builder.Services.AddOpenTelemetry()
43
+ .WithTracing(tracing => tracing
44
+ .AddSource("MyApp")
45
+ .SetSampler(new TraceIdRatioBasedSampler(0.1))
46
+ .AddOtlpExporter());
47
+
48
+ var app = builder.Build();
49
+ app.Run();
50
+ ```
51
+
52
+ ## Full example
53
+
54
+ ```csharp
55
+ using OpenTelemetry;
56
+ using OpenTelemetry.Trace;
57
+
58
+ var builder = WebApplication.CreateBuilder(args);
59
+
60
+ builder.Services.AddOpenTelemetry()
61
+ .WithTracing(tracing => tracing
62
+ .AddSource("MyApp")
63
+ .SetSampler(new ParentBasedSampler(
64
+ rootSampler: new TraceIdRatioBasedSampler(0.25),
65
+ remoteParentSampled: new AlwaysOnSampler(),
66
+ remoteParentNotSampled: new AlwaysOffSampler(),
67
+ localParentSampled: new AlwaysOnSampler(),
68
+ localParentNotSampled: new AlwaysOffSampler()))
69
+ .AddOtlpExporter());
70
+
71
+ var app = builder.Build();
72
+ app.Run();
73
+ ```
74
+
75
+ ## Behavior notes
76
+
77
+ - The SDK default sampler is `ParentBasedSampler(new AlwaysOnSampler())` — all root spans are sampled, child spans follow the parent decision.
78
+ - `SetSampler()` replaces any previously set sampler. Only the last call takes effect.
79
+ - `TraceIdRatioBasedSampler` is deterministic: the same trace ID always produces the same sampling decision, ensuring consistency across services.
80
+ - `SamplingResult` can carry additional attributes and a `TraceStateString` that are attached to the span if sampled.
81
+ - Samplers are invoked **before** the span is fully created. Returning `Drop` means the `Activity` object is created but receives no data and is not exported.
82
+ - To implement a custom sampler, subclass `Sampler` and override `ShouldSample(in SamplingParameters)`.
83
+
84
+ ## See also
85
+
86
+ - Use `AddProcessor` with a filtering processor if you need to drop spans **after** they are recorded (post-sampling). See ActivityProcessors.md for filtering and enrichment patterns.