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