awesome-everything EN
↑ Обратно к восхождению

Наблюдаемость

Join-ключи и exemplar''''ы: как три сигнала становятся компонуемыми

Суть Как общие имена атрибутов соединяют метрики, логи и трейсы в единую навигационную поверхность, и как exemplar''''ы соединяют агрегированные метрики с конкретными трейсами.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 12 min

Метрика показывает скачок p99 на checkout. Открываешь поиск логов — но метрика использует route="/checkout", лог использует http_path="/checkout", а трейс использует http.route="/checkout". Три разных имени поля, три разрозненных поиска. Переход, который должен занять 10 секунд, занимает 20 минут.

Проблема join-ключей

Три сигнала на трёх разных backend’ах бесполезны, если между ними нельзя навигировать. Мост — небольшой набор общих ключей атрибутов, появляющихся идентично в метриках, логах и трейсах. Когда они расходятся — даже незначительно — каждый дашборд требует ad-hoc перевода запросов, а каждый on-call runbook хрупок.

Стандартный набор, формализованный в OpenTelemetry Semantic Conventions:

  • service.name — какой сервис эмитит эти данные
  • trace_id + span_id — какой запрос, какой шаг
  • http.route — шаблон маршрута (например, /orders/{id}, не полный URL /orders/42)
  • http.request.method, http.response.status_code
  • db.system, db.operation, db.namespace
  • messaging.system, messaging.destination.name

Когда метрики несут те же service.name и http.route что и лог-строки, а лог-строки несут trace_id запроса, их эмитировавшего, а трейсы несут тот же http.route атрибут что и метрика — именно тогда «клик от всплеска метрики к лог-строке к трейсу» работает меньше чем за 30 секунд.

Join-ключВ метрикахВ логахВ трейсах
service.namelabelполеresource attribute
trace_idexemplar (сэмплированный)обязательное полекорневой идентификатор
http.routelabel (шаблон)полеspan attribute
http.response.status_codelabel (класс)поле (полный код)span attribute (полный код)

Exemplar’ы: мост метрика → трейс

Exemplar — это сэмплированный trace_id, прикреплённый к наблюдению bucket’а histogram. Когда http_request_duration_seconds записывает наблюдение 1,5 с в bucket выше 1 с, клиент histogram опционально прикрепляет один trace_id, создавший это наблюдение. Grafana отображает их как точки на тепловой карте histogram; клик по точке открывает соответствующий трейс.

Exemplar’ы (стандартизированы в Prometheus 2.32, начало 2022, теперь стандартны в OTel exporters) устраняют разрыв: «метрики говорят, что что-то медленно, но нет конкретного примера запроса для анализа.» Цепочка перехода:

  1. Всплеск histogram метрики → клик по точке exemplar
  2. Exemplar открывает трейс конкретного медленного запроса
  3. Span трейса показывает db.query занял 1,3 с
  4. Лог отфильтрован по trace_id=<тот же> показывает полный текст запроса

Никакой ручной корреляции по временным меткам. Никакого поиска по дашбордам. Одна цепочка кликов.

OpenTelemetry: интеграционный слой

Проект OpenTelemetry (CNCF, рождён в 2019 из слияния OpenCensus и OpenTracing) стандартизирует три вещи:

  • API — поверхность, против которой пишут код инженеры: tracer.start_span(), meter.create_counter().
  • SDK — per-language реализация, строящая OTLP-сообщения.
  • OTLP — OpenTelemetry Protocol: binary protobuf через gRPC или HTTP, примерно на 50–70% меньше JSON через HTTP.

Суть: инструментировать один раз, маршрутизировать куда угодно. Код приложения вызывает OTel API, SDK строит OTLP-сообщения, OTel Collector пересылает их в любой backend — Honeycomb, Datadog, Jaeger, ClickHouse, Loki, Prometheus — всё, что говорит OTLP или имеет contrib exporter.

Почему это работает

Документ OTel Semantic Conventions — самый нагруженный элемент observability стека. Не SDK и не wire format — это сантехника. Имена полей — это семантика. Принять их для всех трёх сигналов — даже если storage backend’ы это Prometheus + Loki + Jaeger — самая высоко-леверидная инвестиция в observability гигиену, потому что именно это делает три pillar’а компонуемыми, а не конкурирующими.

Расставь шаги по порядку

Пройди трёх-pillar триаж для 'p99 latency checkout вырос только в us-east-1':

  1. 1 Открыть RED histogram с фильтром по region — подтвердить us-east-1 p99=1,4с, eu-west-1=90мс
  2. 2 Кликнуть по точке exemplar на bucket'е >1с гистограммы
  3. 3 Открыть трейс — увидеть 1,1с потраченных в span payment-gateway
  4. 4 Отфильтровать логи по service=payment-proxy, region=us-east-1, около timestamp трейса
  5. 5 Прочитать лог-строку: 'gateway upstream connect timeout, retrying'
  6. 6 Фикс: добавить region как label метрики, добавить gateway.upstream.host как span attribute
Викторина

Метрики команды используют route='/checkout', логи — http_path='/checkout', трейсы — http.route='/checkout'. Каково следствие?

Викторина

Почему OpenTelemetry Semantic Conventions нагружен даже для команд, остающихся на 1.0 backend'ах (Prometheus, Loki, Jaeger)?

Вспомните перед уходом
  1. 01
    Назови пять наиболее важных join-ключей для трёх-сигнального триажа и укажи, где каждый появляется.
  2. 02
    Объясни цепочку клика exemplar от медленной метрики к лог-строке.
  3. 03
    Почему OpenTelemetry появился из слияния OpenCensus и OpenTracing, и что он стандартизирует, чего не делал ни один предшественник в одиночку?
Итог

Три observability сигнала на отдельных backend’ах полезны только если они разделяют join-ключи — имена полей, появляющиеся идентично в label’ах метрик, полях логов и span attributes трейсов. OpenTelemetry Semantic Conventions определяет эти канонические имена: service.name, trace_id, http.route, db.system и другие. Без них переход от всплеска метрики к подходящей лог-строке требует ручного перевода; с ними — один клик. Exemplar’ы расширяют это: trace_id, прикреплённый к наблюдению bucket’а histogram, соединяет всплеск агрегированной метрики напрямую с трейсом одного конкретного медленного запроса. OpenTelemetry (API + SDK + OTLP wire format) — субстрат, который на практике делает все три сигнала разделяющими эти join-ключи при любой комбинации backend’ов.

Связанные уроки
встречается в167
Продолжить восхождение ↑Observability 2.0: широкие события и сдвиг стоимости
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.