webprogr.ru Новости

RSS

{{toodo.preview}}

...
{{toodo.name}}

{{toodo.preview}}

далее..

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

смотреть..

toodo.name

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

перейти...

{{toodo.preview}}

...
{{toodo.name}}

{{toodo.preview}}

далее..

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

смотреть..

toodo.name

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

перейти...


Последние новости

Spring Cloud Sleuth: инструмент распределенной трассировки запросов

Spring Cloud Sleuth: инструмент распределенной трассировки запросов. Он прозрачно встраивается в каждый микросервис и решает проблему корреляции логов. В монолите отслеживать поток выполнения просто – все лог-сообщения в одном файле, можно фильтровать по threadId. В микросервисах же один запрос пользователя может породить десятки логов в разных сервисах. Sleuth как раз добавляет уникальный идентификатор Trace ID во все логи, относящиеся к одному запросу
. Он делает это так: когда запрос приходит на сервис (входящая HTTP-реквест), Sleuth генерирует Trace ID (если нет) и Span ID для текущей операции, и помещает их в MDC (mapped diagnostic context) логгера. Например, log-фреймворки покажут это как [traceId, spanId] в каждом сообщении
. Затем, если этот сервис вызывает другой через RestTemplate/WebClient, Sleuth перехватит HTTP-запрос и добавит заголовки X-B3-TraceId, X-B3-SpanId, X-B3-ParentSpanId (формат B3 от Twitter Zipkin) к исходящему запросу. Второй сервис, получив HTTP-запрос, увидит эти заголовки (Spring Cloud Sleuth интегрируется с Servlet фильтром) и восстановит контекст Trace: будет использовать тот же Trace ID для своих логов, а Span ID сгенерирует новый (и укажет родительский). Таким образом, все сервисы в цепочке используют один Trace ID для конкретного запросного потока
. В логах мы можем собрать все строки с данным traceId – получим полную картину прохождения.

Кроме traceId, Sleuth управляет понятием Span – отрезок работы. Каждый вызов RPC – отдельный span. Сохраняется и тайминг каждого spанa (начало/конец). Sleuth может отправлять информацию о спанах во внешнюю систему трассировки (по умолчанию – Zipkin). Также Sleuth помечает входные/выходные события: можно видеть дерево вызовов (parent/child спаны). Например: TraceID 123, spans: [OrderService GET /orders, SpanId a1] -> [PaymentService POST /charge, SpanId b1] -> [PaymentService - call bank API, SpanId b2].

В логах Sleuth добавляет by default: сервис имя (spring.application.name), trace id и span id. Например:

INFO [order-service,traceId=4f8e9c1e,spanId=4f8e9c1e] Starting new order...
INFO [payment-service,traceId=4f8e9c1e,spanId=abc123de,parentId=4f8e9c1e] Charging credit card...

Мы видим, что payment-service запись имеет тот же traceId, другой span (abc123de), parentId указывает на span order-service. Это позволяет вручную сопоставлять, но вручную – сложно, лучше доверить системе вроде Zipkin или Jaeger.

Рейтинг@Mail.ru