@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.
- package/NOTICE.txt +6129 -5295
- package/README.md +185 -32
- package/dist/Azure.Mcp.Tools.AzureMigrate.xml +1060 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/ActivityProcessors.md +119 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/AddApplicationInsightsTelemetry.md +129 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/AddOpenTelemetry.md +153 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/AzureMonitorExporter.md +137 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/ConfigureOpenTelemetryProvider.md +195 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/ConfigureResource.md +119 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/LogProcessors.md +99 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/OpenTelemetrySdkCreate.md +146 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/Sampling.md +86 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/SdkCreateTracerProviderBuilder.md +127 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/UseAzureMonitor.md +96 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/UseAzureMonitorExporter.md +146 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/WithLogging.md +109 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/WithMetrics.md +105 -0
- package/dist/Instrumentation/Resources/api-reference/dotnet/WithTracing.md +91 -0
- package/dist/Instrumentation/Resources/concepts/dotnet/azure-monitor-distro.md +102 -0
- package/dist/Instrumentation/Resources/concepts/dotnet/opentelemetry-pipeline.md +57 -0
- package/dist/Instrumentation/Resources/examples/dotnet/aspnetcore-setup.md +156 -0
- package/dist/Instrumentation/Resources/migration/dotnet/appinsights-2x-to-3x-code-migration.md +134 -0
- package/dist/Instrumentation/Resources/migration/dotnet/appinsights-2x-to-3x-no-code-change.md +92 -0
- package/dist/appsettings.json +5 -0
- package/dist/azmcp +0 -0
- 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.
|