【问题标题】:Customize spring-boot jaeger auto-configuration自定义 spring-boot jaeger 自动配置
【发布时间】:2020-11-06 22:53:42
【问题描述】:

我正在开发 POC,并且能够将 2 个微服务与 JaegerUI 集成。

对 serviceA 中的端点的请求调用 serviceB 中的端点并返回响应。

我使用了以下依赖项:

spring.boot.version : 2.1.4.RELEASE

<groupId>io.opentracing.contrib</groupId>
            <artifactId>opentracing-spring-jaeger-web-starter</artifactId>
            <version>3.1.1</version>

 <groupId>io.opentracing.contrib</groupId>
        <artifactId>opentracing-spring-cloud-starter</artifactId>
        <version>0.4.0</version>

Spring 自动配置会处理所有事情,因此只需添加所需的属性:

opentracing.jaeger.http-sender.url

opentracing.jaeger.service-name

opentracing.jaeger.enabled

opentracing.spring.cloud.async.enabled

我想实现以下目标:

  1. 我想将应用程序日志添加到 span,以便它们在 JaegerUI 中可见。
  2. 我想为 span 标签添加一些字段,以便在 JaegerUI 中轻松搜索。
  3. 另外,我希望将 spanId 和 traceId 写入应用程序日志。
  4. 是否可以根据 spanId/traceId 在 JaegerUI 中进行搜索?如果是,怎么做?

基于以下 SO 问题中的答案:

How to enrich Jaeger opentracing data with the application logs (produced by slf4j) for Spring Boot?

opentracing-spring-cloud-starter 依赖项应该自动负责将应用程序日志发送到 JaegerUI 中。

我在 serviceA 中有如下日志语句:

logger.info("向serviceB发送请求");

但上面的日志没有在相应的范围内被捕获,并且在 JaegerUI 中不可见。

对如何实现上述场景的任何建议表示赞赏!

【问题讨论】:

    标签: spring-boot jaeger opentracing


    【解决方案1】:

    我正在学习 Opentracing 和 Jeager,并使用本教程来熟悉基本的可能性: https://github.com/yurishkuro/opentracing-tutorial/tree/master/java

    如果您查看案例 1(Hello World),它会解释如何“Annotate the Trace with Tags and Logs”。 这将回答您的问题 1、2 和 3,因为您可以在跨度和日志中添加您想要的所有信息。

    这是来自存储库的一个 sn-p(但我建议在那里查看,因为它有更详细的解释):

    Span span = tracer.buildSpan("say-hello").start();
    span.setTag("hello-to", helloTo);
    

    在这种情况下,helloTo 是一个包含名称的变量,应用程序会向其打招呼。它将使用来自执行的值创建一个名为 hello-to 的 span 标签。

    下面我们有一个日志案例的例子,整个helloStr消息被添加到日志中:

    // this goes inside the sayHello method
    String helloStr = String.format("Hello, %s!", helloTo);
    span.log(ImmutableMap.of("event", "string-format", "value", helloStr));
    
    System.out.println(helloStr);
    span.log(ImmutableMap.of("event", "println"));
    

    关于最后一个问题,那会更简单,你可以使用 Jaeger UI 搜索你想要的踪迹,左上角有一个字段:

    【讨论】:

    • 感谢您的回复。你的回答是相关的。但是,我想使用 Spring-Boot 提供的自动配置跟踪器实例。我已经想通了。基本上,我们可以注入 Spring 提供的跟踪器并使用它来访问活动跨度。我将添加我自己的答案。
    【解决方案2】:

    你去。

    1. 我想将应用程序日志添加到 span,以便它们在 JaegerUI 中可见。
    Span span = tracer.buildSpan("my-span-name").start();
    span.setTag("my-tag-name", "my-tag-value");
    

    有多种重载方法如下

    Span setTag(String key, String value);
    Span setTag(String key, boolean value);
    Span setTag(String key, Number value);
    
    1. 我想为 span 标签添加一些字段,以便在 JaegerUI 中轻松搜索。

      Jaeger API 提供log方法来记录多个需要添加到地图的字段,方法签名如下,

    Span log(Map&lt;String, ?&gt; fields);

    例如:

    span.log(
       ImmutableMap.Builder<String, Object>()
         .put("event", "soft error")
         .put("type", "cache timeout")
         .put("waited.millis", 1500)
         .build()
    ); 
    
    1. 另外,我希望将 spanId 和 traceId 写入应用程序日志。

    spanId和traceId存储在JaegerSpanContext类中,可以从Span类的context()方法中获取。

        JaegerSpanContext spanContext = (JaegerSpanContext)sprintSpan.context();
        long spanId = spanContext.getSpanId();
        long traceId = spanContext.getTraceId();
    
    1. 是否可以根据 spanId/traceId 在 JaegerUI 中进行搜索?如果是,怎么做?

    Jaeger UI 的导航栏中有一个搜索框,您可以在其中按跟踪 ID 搜索跟踪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2018-12-24
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2017-01-19
      相关资源
      最近更新 更多