OpenTelemetry в .NET: SDK, инструментация, Activity, Meter
↑ 7.2 Observability: логи, метрики, трейсинг, OpenTelemetry · ← Предыдущая · → Следующая
Зачем это на собесе
OpenTelemetry — стандарт телеметрии. Ждут знания, как он лежит на .NET-примитивах.
Объяснение
OpenTelemetry (OTel) — вендор-нейтральный стандарт API/SDK/протокола (OTLP) для трейсов, метрик и логов.
В .NET он опирается на встроенные типы:
| Сигнал | .NET-примитив |
|---|---|
| Трейсы | ActivitySource, Activity (= span) |
| Метрики | Meter, Counter<T>, Histogram<T>, ObservableGauge<T> |
| Логи | ILogger + OTel-провайдер |
builder.Services.AddOpenTelemetry()
.ConfigureResource(r => r.AddService("orders", serviceVersion: "1.4.0"))
.WithTracing(t => t
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddEntityFrameworkCoreInstrumentation()
.AddSource("Orders") // свои спаны
.SetSampler(new ParentBasedSampler(new TraceIdRatioBasedSampler(0.1)))
.AddOtlpExporter())
.WithMetrics(m => m
.AddAspNetCoreInstrumentation().AddRuntimeInstrumentation()
.AddMeter("Orders").AddOtlpExporter());
builder.Logging.AddOpenTelemetry(o => o.AddOtlpExporter());Собственные сигналы:
static readonly ActivitySource Source = new("Orders");
static readonly Meter Meter = new("Orders");
static readonly Counter<long> Created = Meter.CreateCounter<long>("orders.created");
using var activity = Source.StartActivity("CreateOrder");
activity?.SetTag("order.items", items.Count);
Created.Add(1, new KeyValuePair<string, object?>("channel", "web"));Endpoint и заголовки экспортера задаются переменными окружения: OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_SERVICE_NAME, OTEL_RESOURCE_ATTRIBUTES.
Нюансы и подводные камни
- Метки метрик — только с ограниченным набором значений.
- Не создавайте
Meter/ActivitySourceна каждый запрос: статические экземпляры. - Атрибуты спана не должны содержать секретов и персональных данных.
- Без семплирования трейсы 100% запросов дорого хранить.
- Версии инструментаций и SDK нужно обновлять вместе.
Практика
- Подключите OTel к сервису и экспортируйте в локальный Collector.
- Добавьте собственный span и метрику.
- Настройте семплирование 10% и сохранение ошибок 100% (tail sampling на Collector).
Вопросы с ответами
Что такое OTLP?
Протокол передачи телеметрии OpenTelemetry (gRPC/HTTP).
Как Activity связан со span?
Activity— реализация span в .NET; OTel-SDK экспортирует Activity как span.