Підтримка трасування запитів (OpenTelemetry-підхід)
1. Загальна схема взаємодії
Інтеграція працює за наступною схемою:
Сервіси Expirenza надсилають інтегратору команду через WebSocket.
Інтеграція виконує необхідні дії (свій бізнес-процес, звернення до внутрішніх сервісів тощо).
Інтеграція повертає результат у Expirenza через HTTP callback.
Увесь шлях запиту має бути пов’язаний одним і тим самим
traceId.
Логічний ланцюжок виглядає так:
Expirenza (internal service) → Expirenza External Connector → API інтегратора → Expirenza External Connector → Expirenza (internal service)
На кожному новому сервісі створюється новий spanId, при цьому:
traceIdзалишається незмінним протягом усього життєвого циклу запиту;parent-span-idвказує, з якого span прийшов запит.
2. Структура повідомлень у WebSocket
Усі WebSocket-повідомлення від Expirenza до інтегратора мають службове поле __headers__.
Приклад вхідного повідомлення:
{
"rID" : "2021-03-13 00:32:04.942046#UP57RxE",
"operation" : "categoriesInfo",
"__headers__": {
"traceId": "c0a8017f6f2c4d98bd70a35c90f1f01",
"spanId": "7b9a3d3c4e2f1a90"
}
}2.1. Поля в __headers__
__headers__traceIdУнікальний ідентифікатор всього запиту (end-to-end).
Є обов’язковим до збереження та передачі назад у відповідь (HTTP callback).
Інтеграція не повинна змінювати формат чи значення
traceId. Сприймайте його як “чорну скриньку”.
spanIdІдентифікатор поточного етапу (span) усередині загального запиту.
Для інтеграції він виконує роль
parent-span-id– тобто span, від якого “відгалужується” робота інтеграції.Обробка
spanIdє рекомендованою, але не обов’язковою (див. розділ 4).
3. Обов’язкові вимоги до інтеграції
3.1. Збереження traceId в контексті
traceId в контекстіПісля отримання WebSocket-повідомлення інтеграція повинна:
Прочитати
traceIdзmessage.__headers__.['traceId'].Зберегти його в контексті обробки запиту (thread context, request-scoped context, MDC/лог-контекст тощо).
Використовувати цей
traceIdпри всіх логуваннях, що стосуються даного запиту.
3.2. Передача traceId в HTTP callback
traceId в HTTP callbackПри формуванні HTTP-відповіді (callback) інтеграція обов’язково має додати заголовок:
Приклад HTTP callback:
Це дозволяє Expirenza “зшити” логи WebSocket-команди, внутрішніх сервісів та відповіді інтеграції в один наскрізний трейс.
Важливо: передача traceId у callback – обов’язкова вимога.
Якщо traceId буде відсутній або змінений, трасування буде порушене.
4. Рекомендована (опційна) підтримка spanId та parent-span-id
spanId та parent-span-idПідтримка spanId/parent-span-id на стороні інтеграції рекомендована, але не є обов’язковою.
Вона потрібна для більш детального трасування всередині системи інтеграції та між сервісами.
4.1. Що рекомендується робити
Прочитати вхідний:
traceIdspanId(якparent-span-idдля інтеграції)
Створити *новий *
spanIdдля роботи інтеграції (наприклад,spanIdінтеграції):parent-span-id= вхіднийspanIdз WebSocket.spanId= нове згенероване значення.
Якщо інтеграція викликає свої внутрішні сервіси:
передавати:
той самий
traceId,spanId(власний) (внутрішній сервіс запише його якparent-span-id)Внутрішній сервіс сгенерує новий
spanIdдля кожного дочірнього виклику.
При поверненні відповіді в Expirenza (HTTP callback) можна (опційно) передавати:
Ще раз: для Expirenza обов’язковим є тільки traceId.
Передача/ланцюжок spanId та parent-span-id – опція, яка дозволить глибше аналізувати ланцюжок викликів, якщо інтегратор цього бажає.
5. Навіщо це потрібно інтеграції
Підтримка traceId (мінімально) та spanId (опційно) дає інтеграції такі переваги:
Швидкий пошук інцидентів
Можна отримати
traceIdвід Expirenza (наприклад, з технічного запиту) і швидко знайти всі пов’язані логи та виклики у своїй системі.
Кореляція логів між системами
Expirenza та інтеграції дивляться на один і той самий
traceId, що спрощує спільну діагностику.
Глибинний аналіз продуктивності (якщо використовуєте
spanId)Можна будувати детальні діаграми: скільки часу зайняла обробка в інтеграції, скільки – у внутрішніх сервісах інтеграції, де “вузьке місце”.
Сумісність із OpenTelemetry та APM-системами
Якщо інтеграція вже використовує OpenTelemetry,
traceId,spanIdтаparent-span-idможна напряму мапити на відповідні сутності (trace/span/parent span).
6. Діаграма проходження запиту (послідовність)
Якщо інтеграція не реалізує spanId/parent-span-id, ви все одно повинні зберігати і повертати traceId – тоді всі вузли будуть пов’язані хоча б на рівні трейсів.
7. Підсумок вимог
Обов’язково для інтеграції:
Прочитати
traceIdіз WebSocket-повідомлення (__headers__.traceId).Зберігати
traceIdв контексті обробки запиту.Логувати
traceIdдля всіх дій у межах одного запиту.Передавати
traceIdу HTTP callback як заголовокtraceId.
Опційно (рекомендовано):
Використовувати
spanIdіз WebSocket-повідомлення якparent-span-id.Генерувати власні
spanIdдля операцій інтеграції.Передавати
spanIdу HTTP callback.Інтегрувати цю схему з OpenTelemetry / APM системами для розширеної візуалізації трейсів.
Last updated