Огляд
Розподілений трейсинг дозволяє користувачам відстежувати запит через мережу, розподілену між кількома сервісами. Це дозволяє глибше зрозуміти затримки запиту, серіалізацію та паралелізм через візуалізацію.
Istio використовує розподілений трейсинг Envoy, щоб забезпечити інтеграцію трейсингу з коробки.
Більшість бекендів трейсингу зараз приймають протокол OpenTelemetry для отримання трейсів, хоча Istio також підтримує застарілі протоколи для таких проєктів, як Zipkin та Apache SkyWalking.
Налаштування трейсингу
Istio надає Telemetry API, за допомогою якого можна налаштувати розподілений трейсинг, включаючи вибір провайдера, встановлення частоти дискретизації та зміну заголовків.
Постачальники розширень
Провайдери розширень визначаються у MeshConfig
і дозволяють визначити конфігурацію для бекенду трейсингу. Підтримувані провайдери: OpenTelemetry, Zipkin, SkyWalking, Datadog та Stackdriver.
Створення застосунків для підтримки поширення контексту трейсингу
Хоча проксі Istio можуть автоматично надсилати відрізки, додаткова інформація потрібна для зʼєднання цих відрізків в один трейс. Застосунки повинні пропагувати цю інформацію в HTTP-заголовках, щоб, коли проксі надсилають відрізки, бекенд міг обʼєднати їх у єдиний трейс.
Для цього кожний застосунок має збирати заголовки з кожного вхідного запиту і передавати заголовки всім вихідним запитам, що ініціюються цим вхідним запитом. Вибір заголовків для передачі залежить від налаштованого бекенду трейсингу. Набір заголовків для передачі описується на кожній сторінці специфічних завдань трейсингу. Ось короткий огляд:
Усі застосунки повинні передавати наступні заголовки:
x-request-id
: це заголовок, специфічний для Envoy, який використовується для послідовного відбору логів та трейсів.traceparent
таtracestate
: W3C standard headers
Для Zipkin слід передавати формат B3 multi-header:
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
Щодо комерційних інструментів спостереження, зверніться до їхньої документації.
Якщо подивитися на приклад сервісу Python productpage
, наприклад, ви побачите, що застосунок витягує необхідні заголовки для всіх трейсерів з HTTP-запиту за допомогою бібліотек OpenTelemetry:
def getForwardHeaders(request):
headers = {}
# x-b3-*** заголовки можуть бути поширені за допомогою відрізку OpenTelemetry
ctx = propagators.extract(carrier={k.lower(): v for k, v in request.headers})
propagators.inject(headers, ctx)
# ...
incoming_headers = ['x-request-id',
'x-ot-span-context',
'x-datadog-trace-id',
'x-datadog-parent-id',
'x-datadog-sampling-priority',
'traceparent',
'tracestate',
'x-cloud-trace-context',
'grpc-trace-bin',
'user-agent',
'cookie',
'authorization',
'jwt',
]
# ...
for ihdr in incoming_headers:
val = request.headers.get(ihdr)
if val is not None:
headers[ihdr] = val
return headers
Застосунок reviews (Java) робить щось подібне за допомогою requestHeaders
:
@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(@PathParam("productId") int productId, @Context HttpHeaders requestHeaders) {
// ...
if (ratings_enabled) {
JsonObject ratingsResponse = getRatings(Integer.toString(productId), requestHeaders);
Коли ви робите подальші виклики у ваших застосунках, переконайтеся, що включаєте ці заголовки.