Как в haproxy добавить ID трассировки для OpenTelemetry
Чтобы добавить ID трассировки для OpenTelemetry в HAProxy и передать его клиенту (или между сервисами), можно использовать настройку добавления и обработки HTTP-заголовков. Это позволяет вставить заголовок traceparent в соответствии со спецификацией W3C Trace Context.
Шаги для добавления ID трассировки
1. Добавление статического или динамического traceparent заголовка
Вы можете сгенерировать ID трассировки в HAProxy и добавить его в запросы, направляемые к клиенту или backend’у.
Пример конфигурации:
|
1 2 3 4 5 6 7 8 |
frontend http-in bind *:80 http-request set-header traceparent 00-$(uuid)-$(uuid:short)-01 default_backend servers backend servers server server1 192.168.1.100:8080 |
http-request set-header traceparent— добавляет заголовок.$(uuid)— уникальный 16-байтовый идентификатор трассировки.$(uuid:short)— 8-байтовый идентификатор спана.
Формат заголовка traceparent:
|
1 2 |
00-<trace-id>-<span-id>-<flags> |
Где:
00— версия.<trace-id>— уникальный идентификатор трассировки (16 байт, 32 символа).<span-id>— идентификатор спана (8 байт, 16 символов).<flags>— индикатор включения трассировки (например,01для активной трассировки).
2. Перенаправление уже существующего traceparent заголовка
Если клиентский запрос уже содержит заголовок traceparent, его можно просто проксировать дальше.
Пример конфигурации:
|
1 2 3 4 5 6 7 8 |
frontend http-in bind *:80 default_backend servers backend servers http-request set-header traceparent %[req.hdr(traceparent)] server server1 192.168.1.100:8080 |
%[req.hdr(traceparent)]— извлекает заголовокtraceparentиз входящего HTTP-запроса.- Заголовок проксируется к серверу.
3. Добавление заголовка для ответа клиента
Вы можете также добавить traceparent в ответ от backend’а, чтобы клиент мог его использовать.
Пример:
|
1 2 3 4 5 6 7 8 |
frontend http-in bind *:80 default_backend servers backend servers http-response set-header traceparent 00-$(uuid)-$(uuid:short)-01 server server1 192.168.1.100:8080 |
Советы по интеграции
- Совместимость с OpenTelemetry:
- Убедитесь, что формат заголовка соответствует спецификации W3C Trace Context.
- Используйте корректные длины
trace-id(32 символа) иspan-id(16 символов).
- Кастомизация логов: Добавьте трассировочный ID в логи HAProxy, чтобы упрощать отладку:
12log-format "%ci:%cp [%t] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %{+Q}[traceparent:%[req.hdr(traceparent)]]"
Работа с другими сервисами: Убедитесь, что backend’ы (или downstream сервисы) поддерживают работу с traceparent.
Пример итоговой конфигурации
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
global log stdout format raw local0 defaults log global option httplog timeout connect 5s timeout client 30s timeout server 30s frontend http-in bind *:80 http-request set-header traceparent 00-$(uuid)-$(uuid:short)-01 default_backend servers backend servers http-request set-header traceparent %[req.hdr(traceparent)] http-response set-header traceparent %[req.hdr(traceparent)] server server1 192.168.1.100:8080 |
Результат
- Клиент получает заголовок
traceparentв ответе. - Backend-сервисы получают либо новый, либо перенаправленный ID трассировки.
- В HAProxy можно отследить трассировочные данные через логи.
Это простой способ интеграции OpenTelemetry в существующую инфраструктуру через HAProxy.
