当前位置: 首页 > 知识库问答 >
问题:

Istio Jaeger使用Spring Boot跟踪gRPC调用

司马彬
2023-03-14

我正在使用这个库(grpc spring boot starter),所以我可以在spring boot应用程序中使用grpc功能。

我想知道如何正确地将其与Istio Jaeger跟踪集成。

我需要知道发生这种情况所需的依赖关系是什么。

我有两(2)个应用程序,一个用作gRPC客户端,一个用作gRPC服务器,

期望gRPC客户端和gRPC服务器之间的跟踪必须反映在Jaeger中。但是这并没有发生。

我在一个有Istio的库伯内特斯星系团里。

真正发生的是HTTP请求-

如何制作gRPC客户端

是否存在需要导入的依赖项?

现在我有:

<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);
}

但它似乎不起作用。。

共有1个答案

韦德厚
2023-03-14

您所做的是针对超文本传输协议1. x,它不适用于http p2/grpc。请在springboodoc中深入研究grpc impl。

 类似资料:
  • 有没有更好的方法来追踪电话的时间?

  • 简介 Logify能够接受一个.h头文件作为输入,然后输出.xm文件(MobileSubstrate扩展),这个.xm文件hook这个类的所有方法,当这些方法被调用的时候打印log。这有助于你发现哪些方法被调用了。Logify在安装了Theos之后就有。 用法 在命令行下输入类似的命令: /opt/theos/bin/logify.pl MomoLocationManager.h > tweak.

  • 问题内容: 有没有一种方法可以为java中的特定线程输出调用跟踪? 我不需要堆栈跟踪。我想在每个对象上进行一系列调用以进行跟踪。 问题答案: 我想您可能会发现这很有趣。它是一个Java代理,它使用slf4j框架将日志记录添加到方法中,从而实际记录输出。然后,只需配置日志记录框架以仅打印出您感兴趣的线程即可。 http://www.slf4j.org/extensions.html#javaagen

  • 当想知道一个进程在做什么事情的时候,可以通过strace命令跟踪一个进程的所有系统调用。 1、运行 php start.php status 能看到workerman相关进程的信息 如下: Hello admin ---------------------------------------GLOBAL STATUS-----------------------------------------

  • 问题内容: 我编写了一个程序来列出命令执行的所有系统调用(例如/ bin / ls)。现在我想做的就是找到所有可能传递给它的系统调用参数,环境变量,命令行参数 示例:如果我打开一个文件。系统调用sys_access会打开文件吗?但是如何获得这些价值? 想要对系统调用(例如打开,读取,写入,关闭)执行此操作。 根据我的研究,这些必须在寄存器(ebx- edx)中。如果是,则这些寄存器值表示什么?我知

  • 我最近将我的项目从spring boot 1.4.1、spring cloud Sleuth 1.1.0、spring cloud Zipkin 1.1.0升级到spring boot 1.5.3、spring cloud Sleuth 1.2.0、spring cloud Zipkin 1.2.0。 在最新版本的spring cloud Sleuth中,他们添加了“错误”标签,一旦出现任何异常,