Трассировка Istio + Jaeger с вызовами gRPC с использованием Spring Boot

Я использую эту библиотеку (grpc-spring-boot-starter), поэтому У меня могут быть возможности gRPC в приложении Spring Boot.

Я хочу знать, как правильно интегрировать это с трассировкой Istio + Jaeger.

Мне нужно знать, какие зависимости необходимы, чтобы это произошло.

У меня есть два (2) приложения, одно служит клиентом gRPC, а другое - сервером gRPC,

Ожидается, что трассировка между клиентом gRPC и сервером gRPC должна быть отражена в Jaeger. Но этого не происходит.

Я нахожусь внутри кластера Kubernetes с Istio.

На самом деле происходит HTTP-запрос -> Приставка Envoy -> Spring Boot @RestController клиента gRPC -> получить заголовки из HTTP-запроса -> скопировать их в вызов gRPC перед вызовом -> Служба gRPC.

Как я могу сделать так, чтобы трассировка gRPC client ‹-> gRPC Service отображалась Jaeger?

Есть ли какие-либо зависимости, которые нужно импортировать?

Прямо сейчас у меня есть:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<!-- Used together with Sleuth to be able to trace gRPC calls. -->
<dependency>
    <groupId>io.zipkin.brave</groupId>
    <artifactId>brave-instrumentation-grpc</artifactId>
</dependency>
<!-- Add'l dependency for Istio + Jaeger gRPC tracing -->
<dependency>
    <groupId>io.jaegertracing</groupId>
    <artifactId>jaeger-client</artifactId>
</dependency>

Я также сделал что-то вроде этого, чтобы «распространить заголовки»:

private void propagateHeaders(HttpHeaders headers) {
    // TODO: adding these string values to a final / constant.
    // get these tracing headers from HTTP request, (coming from Envoy)
    String xRequestIdFromHttpHeader = headers.getFirst("x-request-id");
    String xB3TraceIdFromHttpHeader = headers.getFirst("x-b3-traceid");
    String xB3SpanIdFromHttpHeader = headers.getFirst("x-b3-spanid");
    String xB3ParentSpanIdFromHttpHeader = headers.getFirst("x-b3-parentspanid");
    String xB3SampledFromHttpHeader = headers.getFirst("x-b3-sampled");
    String xB3FlagsFromHttpHeader = headers.getFirst("x-b3-flags");
    String xOtSpanContextFromHttpHeader = headers.getFirst("x-ot-span-context");

    // create a custom gRPC header, they call it Metadata
    Metadata xRequestIdMetadata = new Metadata();
    Metadata xB3TraceIdMetadata = new Metadata();
    Metadata xB3SpanIdMetadata = new Metadata();
    Metadata xB3ParentSpanIdMetadata = new Metadata();
    Metadata xB3SampledMetadata = new Metadata();

    // TODO: refactor. putting to List<> and using foreach to attach this one.
    // assign value of the x-request-id Metadata to the value of the HTTP Header
    xRequestIdMetadata.put(Metadata.Key.of("x-request-id", Metadata.ASCII_STRING_MARSHALLER), xRequestIdFromHttpHeader);
    xB3TraceIdMetadata.put(Metadata.Key.of("x-b3-traceid", Metadata.ASCII_STRING_MARSHALLER), xB3TraceIdFromHttpHeader);
    xB3SpanIdMetadata.put(Metadata.Key.of("x-b3-spanid", Metadata.ASCII_STRING_MARSHALLER), xB3SpanIdFromHttpHeader);
    xB3ParentSpanIdMetadata.put(Metadata.Key.of("x-b3-parentspanid", Metadata.ASCII_STRING_MARSHALLER), xB3ParentSpanIdFromHttpHeader);
    xB3SampledMetadata.put(Metadata.Key.of("x-b3-sampled", Metadata.ASCII_STRING_MARSHALLER), xB3SampledFromHttpHeader);

    // TODO: refactor. putting to List<> and using foreach to attach this one.
    // use MetadataUtils to attach that new Metadata to our stub before requesting to our gRPC Server via gRPC
    greetingServiceStub = MetadataUtils.attachHeaders(greetingServiceStub, xRequestIdMetadata);
    greetingServiceStub = MetadataUtils.attachHeaders(greetingServiceStub, xB3TraceIdMetadata);
    greetingServiceStub = MetadataUtils.attachHeaders(greetingServiceStub, xB3SpanIdMetadata);
    greetingServiceStub = MetadataUtils.attachHeaders(greetingServiceStub, xB3ParentSpanIdMetadata);
    greetingServiceStub = MetadataUtils.attachHeaders(greetingServiceStub, xB3SampledMetadata);
}

Но вроде не работает ..


person Ken Flake    schedule 17.06.2020    source источник
comment
Не могли бы вы объяснить, что не так? Ваши приложения работают, но вы не видите трассировки? Вы настроили jaeger и выборку трассировки, как указано в документации istio? Кроме того, ознакомьтесь с этой статьей.   -  person Jakub    schedule 17.06.2020
comment
Ой, извините, да, проблема в том, что я должен ожидать трассировки / промежутка между моим клиентом grpc (Spring Boot) и сервером grpc (Spring Boot). Но я этого не вижу. Запрос проходит, поскольку я получаю действительный ответ, но следов нет. Я также вижу HTTP-запросы, которые я прошел перед тем, как перейти к части gRPC ... но не сам трассировку gRPC. Сейчас я выясняю, что это связано с зависимостью Spring Cloud Sleuth + brave-instrumentation-grpc, предполагая, что Istio работает так, как задумано.   -  person Ken Flake    schedule 17.06.2020
comment
Я не углублялся в часть Istio, просто предполагаю, что она настроена правильно. Кстати, мы используем Rancher для включения Istio. Я проверю документы и статьи, как вы упомянули, большое вам спасибо за это! На данный момент я не могу точно определить, виновато ли мое приложение или отсутствует конфигурация Istio.   -  person Ken Flake    schedule 17.06.2020
comment
@KenFlake ты нашел ответ? Не могли бы вы опубликовать решение?   -  person kane    schedule 17.03.2021
comment
привет @kane, общая идея заключается в том, что Istio позаботится о распространении трассировки Jaeger, а НЕ на уровне приложения. Тем самым я обновил службу K8s моего клиента gRPC. Имя службы K8s должно начинаться с префикса grpc (важно, он также включен в документацию Istio), затем для порта по какой-то причине порт 8080 не работал. Я использовал 50101, и он работал. Я не могу объяснить почему ...   -  person Ken Flake    schedule 19.03.2021


Ответы (1)


То, что вы сделали, предназначено для http 1.x, а для http2 / grpc это не работает. Пожалуйста, погрузитесь в grpc impl в Springboot doc.

person feuyeux    schedule 23.09.2020