Java микро-сервис распределенной трассировки с Istio - PullRequest
0 голосов
/ 27 февраля 2020

Kubernetes и Istio уже установлены в кластере. Три микро сервисы развернуты как POD. Поток:

Micro service A to Micro Service B calls => HTTP
Micro service B to Micro service C calls => via Kafka
Micro service A expose a HTTP API to outside 

Я предполагаю, что когда клиент нажал на Ingres, Istio сгенерирует traceId и spanId в заголовке HTTP и войдет в службу A. Являются ли эти spanId и traceId распространяющимися на службу Micro B и C без использования отдельный API, как Spring Cloud Sleuth?

1 Ответ

0 голосов
/ 27 февраля 2020

Нет, Istio не обеспечивает распространение заголовков трассировки. Однако его можно настроить на стороне приложения без использования сторонних API.

Согласно документации Istio :

Istio использует Распределенная трассировка Посланника функция для обеспечения интеграции трассировки из коробки. В частности, Istio предоставляет опции для установки различного бэкэнда трассировки и настройки прокси для автоматической отправки им трасс трассировки. См. Zipkin , Jaeger и LightStep о том, как Istio работает с этими системами трассировки.


Документация Istio также имеет пример распространения заголовка на стороне приложения для демонстрационного приложения bookinfo:

Распространение контекста трассировки

Хотя прокси-серверы Istio могут автоматически посылая пролеты, им нужны некоторые подсказки для t ie вместе всей трассы. Приложения должны распространять соответствующие заголовки HTTP, чтобы при передаче прокси информации о промежутках прокси-серверы могли правильно соотноситься с одной трассой.

Для этого приложение должно собирать и распространять следующие заголовки из входящий запрос на любые исходящие запросы:

  • x-request-id
  • x-b3-traceid
  • x-b3-spanid
  • x-b3-parentspanid
  • x-b3-sampled
  • x-b3-flags
  • x-ot-span-context

Кроме того, распространяются интеграции трассировки на основе OpenCensus (например, Stackdriver) следующие заголовки:

  • x-cloud-trace-context
  • traceparent
  • grpc-trace-bin

Если вы посмотрите на образец * Служба 1087 * productpage, например, вы видите, что приложение извлекает необходимые заголовки из HTTP-запроса, используя библиотеки OpenTracing :

def getForwardHeaders(request):
    headers = {}

    # x-b3-*** headers can be populated using the opentracing span
    span = get_current_span()
    carrier = {}
    tracer.inject(
        span_context=span.context,
        format=Format.HTTP_HEADERS,
        carrier=carrier)

    headers.update(carrier)

    # ...

    incoming_headers = ['x-request-id']

    # ...

    for ihdr in incoming_headers:
        val = request.headers.get(ihdr)
        if val is not None:
            headers[ihdr] = val

    return headers

Отзывы приложение (Java) делает что-то похожее:

@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(@PathParam("productId") int productId,
                            @HeaderParam("end-user") String user,
                            @HeaderParam("x-request-id") String xreq,
                            @HeaderParam("x-b3-traceid") String xtraceid,
                            @HeaderParam("x-b3-spanid") String xspanid,
                            @HeaderParam("x-b3-parentspanid") String xparentspanid,
                            @HeaderParam("x-b3-sampled") String xsampled,
                            @HeaderParam("x-b3-flags") String xflags,
                            @HeaderParam("x-ot-span-context") String xotspan) {

  if (ratings_enabled) {
    JsonObject ratingsResponse = getRatings(Integer.toString(productId), user, xreq, xtraceid, xspanid, xparentspanid, xsampled, xflags, xotspan);

Когда вы делаете вниз по течению звонки в ваших приложениях, обязательно включите эти заголовки.

...