Logs & Observability

Парсер traceparentи валидатор W3C Trace Context

Вставьте заголовок traceparent, чтобы увидеть version, trace-id, parent-id и flags, разобранные по полям, или переключитесь в режим пакетной проверки или генерации.

Парсер traceparent

заголовок traceparent

Разбор и генерация полностью выполняются в браузере. Ничего не отправляется на сервер или в систему трассировки.

Результат

Вставьте заголовок traceparent или загрузите пример, чтобы начать.

Заголовок traceparent выглядит просто — четыре поля через дефис — пока в логах одного из сервисов не обнаружится trace-id из одних нулей, или прокси незаметно не подменит байт версии значением, явно запрещённым спецификацией. Этот парсер traceparent проверяет заголовок по реальной грамматике W3C Trace Context, а не просто по количеству дефисов, чтобы отличить действительно сломанный заголовок от просто непривычно выглядящего.

Используйте его, когда распределённый трейс теряется между двумя сервисами и нужно понять, был ли сам заголовок вообще валиден; когда вручную реализуете распространение заголовков и нужен пример для теста; или когда просматриваете логи и нужно разобрать сразу пачку значений traceparent, а не по одному.

Зачем нужен этот парсер traceparent

Создан, чтобы находить реальные ошибки в заголовках, а не просто красиво показывать уже валидный заголовок.

Каждое поле разобрано и выделено цветом

Этот парсер traceparent разбивает заголовок на version, trace-id, parent-id и trace-flags, каждое поле — своим цветом, плюс понятная расшифровка байта flags: сэмплирован ли трейс и не установлен ли неожиданно какой-то зарезервированный бит.

Заголовок traceparent, разбитый на четыре поля разного цвета: version, trace-id, parent-id и trace-flags

Точно ловит случаи, прямо запрещённые спецификацией

version, равная ff, trace-id из одних нулей и parent-id из одних нулей формально выглядят как валидное шестнадцатеричное число, но W3C Trace Context прямо их запрещает — этот парсер traceparent называет каждый случай по имени, а не просто проверяет длину и набор символов.

Три случая, запрещённые спецификацией: version ff, trace-id из одних нулей и parent-id из одних нулей

Что этот парсер проверяет такого, чего не видно с первого взгляда

Три вещи, которые полезно знать перед тем, как вставить заголовок из production-логов.

01

Вставьте один заголовок или загрузите граничный пример

Разбор запускается автоматически через 300 мс после остановки ввода — кнопка не нужна, если только автоматический разбор не отключён. Три кнопки-примера выбраны не случайно: они загружают валидный заголовок, заголовок с version ff и заголовок с trace-id из одних нулей — именно те три граничных случая, которые спецификация называет по имени.

  • Ctrl/Cmd+Enter запускает разбор немедленно, минуя задержку
02

Добавьте значение tracestate или переключитесь в пакетный режим

Поле tracestate по умолчанию свёрнуто, так как не в каждом заголовке оно есть — включите его, чтобы проверить пары vendor=value по ограничениям спецификации (32 элемента, 256 символов). Если нужно проверить не один заголовок, а целую выгрузку логов, переключитесь в пакетный режим и вставьте по одному traceparent на строку.

  • Пакетный режим специально сделан ручным: он не перезапускается при каждом нажатии клавиши, пока вы ещё вставляете текст
03

Изучите результат по полям, затем скопируйте или экспортируйте

Заголовок с version 00 проверяется полностью; всё, что выше, разбирается, но лишние поля в конце только отображаются как есть и никогда не интерпретируются. Копирование и скачивание отключаются сразу при изменении ввода, чтобы вы никогда случайно не экспортировали устаревший результат.

  • Переключитесь в режим генерации, чтобы получить новый, полностью валидный traceparent для тестового запроса

Что на самом деле делают парсер и генератор

Настоящая валидация по W3C Trace Context, а не регулярное выражение, проверяющее только позиции дефисов.

Полный разбор всех четырёх полей

version, trace-id, parent-id и trace-flags разбираются и подписываются по отдельности, включая понятную расшифровку бита сэмплирования.

Строгая проверка по спецификации

Отклоняет version ff, trace-id из одних нулей, parent-id из одних нулей, неверную длину полей и шестнадцатеричные символы в верхнем регистре — именно те случаи, которые обычно пропускает нестрогое регулярное выражение.

Пакетная проверка со сводкой по строкам

Вставьте целый фрагмент логов со значениями traceparent и получите количество валидных, невалидных и пустых строк, а также точное проблемное поле для каждой ошибочной строки.

Проверка структуры tracestate

Проверяет элементы key=value по набору символов из спецификации, формату tenant@vendor, ограничению в 256 символов на значение, лимиту в 32 элемента и запрету на повторяющиеся ключи.

Генерация валидного тестового заголовка

Генерирует traceparent с version 00 и криптографически случайными, гарантированно ненулевыми trace-id и parent-id, чтобы вы никогда случайно не протестировали с невалидным значением-заглушкой.

Что этот инструмент проверяет, а что намеренно не делает

Прочитайте это, прежде чем считать зелёный результат доказательством здорового трассировочного пайплайна.

Валидный заголовок не доказывает существование трейса
Этот инструмент только проверяет строку по грамматике W3C Trace Context. Он никогда не обращается к Jaeger, Datadog, Honeycomb или любому другому бэкенду, поэтому «валиден» означает лишь «правильно сформирован», а не «действительно записан».
Поддерживается только W3C Trace Context
Заголовки B3 от Zipkin, X-Cloud-Trace-Context от Google Cloud и sentry-trace от Sentry используют другое количество полей и другие разделители. Этот парсер не читает и не конвертирует эти форматы.
Невалидный ввод сообщается, но никогда не исправляется втихую
trace-id из 31 символа не дополняется нулём, а шестнадцатеричные символы в верхнем регистре не приводятся к нижнему перед проверкой — это как раз те реальные ошибки, которые ломают распространение трейса, поэтому они показываются, а не скрываются.
Пакетный ввод ограничен 500 строками
Всё выполняется во вкладке браузера, поэтому вставка очень больших логов ограничена доступной памятью устройства. Разбивайте большие выгрузки на части по 500 строк или меньше.

Частые вопросы про парсер traceparent

Реальные вопросы, которые возникают при отладке заголовков W3C Trace Context.

Что означает флаг sampled (01) в trace-flags?

trace-flags — это один байт, записанный как два шестнадцатеричных символа; бит 0 и есть флаг sampled. 01 означает, что вызывающая сторона рекомендует записать этот трейс в бэкенде трассировки, 00 — что не рекомендует. Это рекомендация, передаваемая по цепочке вызовов, а не гарантия того, что какая-то система действительно захватила трейс.

Чем отличается trace id от span id?

trace-id уникально идентифицирует весь распределённый трейс целиком и общий для всех сервисов, через которые проходит запрос. span-id (в спецификации W3C называется parent-id) идентифицирует конкретный участок этой цепочки и обычно меняется на каждом сервисе, оставаясь при этом с тем же trace-id.

Чем отличается traceparent от tracestate?

traceparent переносит четыре обязательных поля — version, trace-id, parent-id и trace-flags, — которые обязана понимать любая система, совместимая с W3C. tracestate — необязательное поле с данными key=value, специфичными для конкретного поставщика, которое одна система трассировки может добавить, не требуя, чтобы другие системы его понимали.

Почему версия ff запрещена в traceparent?

Спецификация W3C Trace Context резервирует ff, чтобы её никогда не спутали с номером будущей версии — она прямо запрещена независимо от того, насколько правильно оформлена остальная часть заголовка. Этот парсер отклоняет её по имени, а не обрабатывает как обычную двузначную шестнадцатеричную версию.

Почему trace-id из одних нулей невалиден?

trace-id из одних нулей ничего не может идентифицировать, поэтому спецификация прямо его запрещает, хотя «32 нуля» формально проходят наивную проверку шестнадцатеричного формата. То же правило действует и для parent-id (span-id) из одних нулей.

Как исправить невалидный заголовок W3C Trace Context?

Сначала разберите его здесь, чтобы точно увидеть, какое поле не проходит проверку и почему. Большинство реальных проблем возникает из-за того, что прокси или пайплайн логирования обрезает заголовок, подмешивает шестнадцатеричные символы в верхнем регистре или по ошибке пересылает шаблонное значение вроде одних нулей вместо реально сгенерированного идентификатора.

Нашли заголовок, который этот парсер разбирает неправильно?

Используйте парсер traceparent прямо сейчас

Разберите заголовок traceparent, проверьте сразу несколько пакетно или сгенерируйте новый тестовый заголовок — всё в браузере, без загрузки данных куда-либо.

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

Часть категории Developer Tools & DevOps на HeyUtils.