OpenTelemetry в .NET: SDK, инструментация, Activity, Meter

↑ 7.2 Observability: логи, метрики, трейсинг, OpenTelemetry · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

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 нужно обновлять вместе.

Практика

  1. Подключите OTel к сервису и экспортируйте в локальный Collector.
  2. Добавьте собственный span и метрику.
  3. Настройте семплирование 10% и сохранение ошибок 100% (tail sampling на Collector).

Вопросы с ответами

Связанные темы