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

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

Trace propagation: чтение кода и заголовков

Суть Прочитай traceparent-заголовок, сломанный сниппет async-propagation, пару producer/consumer с inject и tail-sampling-конфиг — и выбери поведение и фикс с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Баги propagation живут в заголовках, коде и конфигах — не в прозе. Читай каждый артефакт так, как читал бы в инциденте, и выбирай фикс, к которому senior-инженер потянется первым.

Цель

Отработай диагностический цикл любого инцидента propagation: распарси заголовок на проводе, найди, где context тихо теряется, и прочитай конфиг коллектора, решающий, какие трейсы выживут.

Сниппет 1 — заголовок на проводе

traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00
Викторина

Заголовок корректен. Что говорит хвостовой 00 принимающему сервису делать по умолчанию?

Сниппет 2 — отложенная работа

const { context, trace } = require('@opentelemetry/api');

app.post('/checkout', async (req, res) => {
  // span запроса активен здесь
  setTimeout(() => {
    writeAuditLog(req.body);   // эмитит span
  }, 200);
  res.status(202).end();
});
Викторина

Span audit-log появляется как собственный корневой trace, оторванный от /checkout. В чём причина и минимальный фикс?

Сниппет 3 — producer и consumer

// producer
const headers = {};
propagator.inject(context.active(), headers);
await producer.send({ topic: 'orders', messages: [{ value: body, headers }] });

// consumer
await consumer.run({
  eachMessage: async ({ message }) => {
    // headers доступны как message.headers
    await handleOrder(message.value);   // эмитит span
  },
});
Викторина

Producer инъектит корректно, но span консьюмера всё равно orphan'ы. Где баг?

Сниппет 4 — конфиг коллектора

processors:
  tail_sampling:
    decision_wait: 30s
    policies:
      - name: errors
        type: status_code
        status_code:
          status_codes: [ERROR]
      - name: probabilistic
        type: probabilistic
        probabilistic:
          sampling_percentage: 1
Викторина

Этот tail-sampling-конфиг OOM-нул коллектор при всплеске трафика. Какая одна самая важная отсутствующая строка?

Итог

Любой инцидент propagation читается в артефактах: байт trace-flags говорит, был ли сэмплирован корректный заголовок (а сброшенный флаг означает дроп всего trace, а не экспорт фрагмента); необёрнутый setTimeout осиротит внутрипроцессную работу, пока ты не сделаешь context.bind; Kafka round-trip требует inject на producer и парный extract на consumer; а tail-sampling-конфиг без num_traces буферизует неограниченно до OOM. Распарси заголовок, найди потерянный context, прочитай конфиг — и чини на границе, а не на дашборде.

Продолжить восхождение ↑Trace propagation: сшей сломанную систему в один trace
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.