Какой стек технологий вы используете для распределенной трассировки (трейсинга)?

Ответ

Для построения полноценной системы observability, включая трейсинг, я использую комбинацию следующих инструментов, где каждый выполняет свою роль:

  1. Инструментация кода: OpenTelemetry (OTel)

    • Это стандарт де-факто для сбора телеметрии (трейсов, метрик, логов). Его главное преимущество — независимость от вендора. Вы инструментируете код один раз и можете отправлять данные в любой бэкенд (Jaeger, Prometheus, Datadog и т.д.).
    // Пример инициализации трассировщика с экспортом в Jaeger
    import (
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/exporters/jaeger"
        "go.opentelemetry.io/otel/sdk/trace"
        sdktrace "go.opentelemetry.io/otel/sdk/trace"
    )
    
    func initTracer() (*sdktrace.TracerProvider, error) {
        // Создаем экспортер, который будет отправлять данные в Jaeger
        exporter, err := jaeger.New(jaeger.WithCollectorEndpoint())
        if err != nil {
            return nil, err
        }
    
        // Создаем провайдер трассировки с батчером для эффективности
        tp := sdktrace.NewTracerProvider(
            sdktrace.WithBatcher(exporter),
        )
        otel.SetTracerProvider(tp)
        return tp, nil
    }
  2. Бэкенд для хранения и визуализации трейсов: Jaeger

    • Популярное open-source решение для анализа распределенных трейсов. Отлично интегрируется с OpenTelemetry и Kubernetes. Позволяет визуализировать цепочки вызовов между микросервисами, находить узкие места и ошибки.
    • Как более легковесную альтернативу можно рассмотреть Zipkin.
  3. Метрики и алертинг: Prometheus + Grafana

    • Prometheus используется для сбора и хранения метрик (например, http_requests_total, request_latency_seconds). Grafana — для их визуализации на дашбордах. Трейсы помогают понять, почему что-то произошло, а метрики показывают, что произошло в системе.
  4. Логирование: ELK Stack / Loki / ClickHouse

    • Для агрегации и анализа логов. Современные системы позволяют коррелировать логи с трейсами по TraceID, что дает полную картину запроса: от логов конкретного сервиса до его пути по всей системе.

Ответ 18+ 🔞

Да ты посмотри, какая у нас тут индустрия развелась, блядь! Раньше, сука, чтобы понять, что сервис сдох, надо было по логам ползать, как таракан по кухне, а сейчас — целая наука, observability называется, ёпта! Ну, слушай сюда, как я это обычно собираю, чтобы потом не орать «А хули оно не работает?!».

Первое и главное — OpenTelemetry (OTel), это, блядь, как священный Грааль. Раньше каждый вендор свой SDK впихивал, а теперь один раз в код воткнул — и пиздуй данные куда хочешь. Красота, а не жизнь! Главное, не накосячить с инициализацией, а то будет тебе не трейсинг, а одно расстройство.

Вот, смотри, как примерно это выглядит, только не пугайся:

// Пример инициализации трассировщика с экспортом в Jaeger
import (
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/exporters/jaeger"
    "go.opentelemetry.io/otel/sdk/trace"
    sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

func initTracer() (*sdktrace.TracerProvider, error) {
    // Создаем экспортер, который будет отправлять данные в Jaeger
    exporter, err := jaeger.New(jaeger.WithCollectorEndpoint())
    if err != nil {
        return nil, err
    }

    // Создаем провайдер трассировки с батчером для эффективности
    tp := sdktrace.NewTracerProvider(
        sdktrace.WithBatcher(exporter),
    )
    otel.SetTracerProvider(tp)
    return tp, nil
}

Второй акт в этом цирке — Jaeger. Это, сука, такой шкаф, куда все твои трейсы складываются. Зашёл, покликал — и видишь, как запрос, словно пьяный матрос, шатается между твоими микросервисами, и где именно он, блядь, споткнулся и упал. Иногда, если Jaeger — это как танк, а тебе велосипед нужен, можно Zipkin взять, он попроще.

Но трейсы — это только полдела! Чтобы понять масштаб трагедии, нужны метрики. Тут без вариантов — Prometheus и Grafana. Prometheus, этот ненасытный уёбок, каждые N секунд высасывает из всех твоих сервисов цифры: сколько запросов, какая задержка, сколько ошибок. А Grafana это всё красиво рисует, чтобы даже менеджер, блядь, понял, что «красная линия — это плохо». Метрики кричат «ОЙ, ВСЁ!», а трейсы показывают, кто именно накосячил.

Ну и куда же без логов, этих вечных спутников любого говнокода? Тут вариантов — овердохуища. Классика — ELK Stack (Elasticsearch, Logstash, Kibana), но он порой такой прожорливый, что проще новый дата-центр купить. Есть Loki — попроще, помельче, для бедных. А есть ClickHouse — ну, это для мазохистов, которые любят, чтобы всё летало, но пришлось немного пострадать при настройке. Главная магия — связать логи с трейсом по какому-нибудь TraceID, чтобы не гадать, а сразу видеть всю подноготную одного запроса, от входа до полного пиздеца.

Вот такая, блядь, нехитрая кухня. Собрал этот пазл — и можно хотя бы с иллюзией контроля спать спокойно. А так-то, конечно, всё равно всё упадёт в самый неподходящий момент, в рот меня чих-пых!