Вимоги: В архітектурі мікросервісів, коли виникають проблеми, часто дуже складно усунути несправність, не знаючи, чи це виняток, створене сервісом, чи сервіс може написати помилку, або виникає проблема з інформацією, яку передає сервіс, що викликає сервіс. Якщо контекст усіх запитів можна зафіксувати, тобто посилання на повний транзакційний запит, критично важливо усунути та проаналізувати проблему.
Огляд:
Трасування стеку винятків ідеально підходить для застосувань, які орієнтовані на один процес, наприклад, монолітну систему застосування. Але з іншого боку, для роботи з розподіленими застосунками, такими як архітектури мікросервісів, стек-трасів недостатньо для відображення загальної трасування повідомлення. Саме тому інструменти та стандарти розподіленого трасування стають необхідними. W3C визначає стандарт для такого типу сліду, який називається Trace Context.
Стандарт Trace Context
Документація контексту W3C Trace:Вхід за гіперпосиланням видно.
Специфікація W3C Trace Context визначає стандарти та формати для HTTP-заголовків для поширення розподіленої контекстної інформації. Він визначає 2 поля, які використовуються для поширення потоку слідів у заголовку HTTP-запиту. Давайте розглянемо ці два поля у стандартному визначенні:
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
Поле traceparent
Специфікація для поля traceparent визначена у формі розширеної парадигми Баккоса (ABNF) і складається з 4 частин:
версія - traceid - parentid/spanid - traceflags Наприклад:
00-480e22a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,Значення в тому ж посиланні абсолютно однакове。
- Parent-id/span-id: 8 байт для вираження батьківської точки поточного діапазону у вхідному або вихідному запиті.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Усі поля кодуються у шістнадцятковому форматі, як показано на зображенні нижче:
Розподілене трасування .NET
Розподілене трасування — це діагностична методика, яка допомагає інженерам локалізувати збої та проблеми з продуктивністю в додатках, особливо тих, що можуть бути розподілені між кількома комп'ютерами або процесами. Ця техніка корелює роботу, виконану різними компонентами додатку, через відстеження запитів у додатку та відокремлює її від інших завдань, які додаток може виконувати при обробці одночасних запитів. Наприклад, балансувальник навантаження може спочатку отримати запит на типовий веб-сервіс, потім переслати його на веб-серверний процес, а потім надіслати кілька запитів до бази даних. За допомогою розподіленого трасування інженери можуть визначити, чи ці кроки не вдалися, скільки часу займає кожен крок і які повідомлення можуть зберігатися під час виконання кожного кроку.
У .NET бібліотека System.Diagnostics.Activity налаштована на використання стандарту W3C. Заголовок traceparent у стилі W3C Request-ID був доданий у ASP.NET Core 2.0. Щоб змінити його на заголовок traceparent, який відповідає контексту W3C Trace, встановіть статичну властивість Activity.DefaultIdFormat на W3C при запуску програми. Код виглядає так:
Процес тестування,Браузер -> A сервіс (/http, бекенд використовує HttpClient для запиту B-сервісу) інтерфейс -> B сервіс (/test), Сервіс A виводить власний Trace Context, а Trace Context Service B — Trace Context, код виглядає так:
Стартові сервіси A та B, як показано на наступному рисунку:
Браузер відкриває Сервіс A, як показано на наступному рисунку:
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Вміст відповіді:{"id":"00-9891603e6c4921598951f425d98e4df7-8874f9b2f9c0702e-00","traceId":"9891603e6c4921598951f425d98e4df7","spanId":"8874f9b2f9c0702e","parentId": "00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00","traceFlags":"None","isSampled":false}
--------------------------------------------------
Name: HttpHandlerDiagnosticListener
DateTime: 2025/12/22 9:37:22
Id: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: e0336cc56a4f2150
ParentId: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
Key: System.Net.Http.HttpRequestOut.Stop, Value: { Response = StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{ Дата: Пн, 22 грудня 2025, 01:37:21 GMT Офіціант: Kestrel Кодування передачі: chunked Зв'язок: залишати живим Тип контенту: application/json; charset=utf-8 }, Request = Метод: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', Версія: 1.1, Content: <null>, Headers:
{ Traceparent: 00-9891603E6C4921598951F425D98E4df7-E0336cc56A4F2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- Використовуючи інструмент захоплення пакетів Charles Proxy, запит і відповідь виглядають так:
Якщо ви хочете вимкнути передачу traceparent через HttpClient, змінні середовища встановлюються так:
Посилання:
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно. |