【问题标题】:How to send entire logs to jeager span in Quarkus?如何将整个日志发送到 Quarkus 中的 jeager span?
【发布时间】:2020-10-21 12:40:55
【问题描述】:

有什么方法可以将应用程序提供的 std 日志和错误放到一个 span 中? 我想把提供的 slf4j 日志放在 quarkus 中,它应该出现在 jeager-Ui 中

Quarkus log information

application.properties

quarkus.http.port=8200
quarkus.swagger-ui.always-include=true
quarkus.jaeger.service-name=myservice
quarkus.jaeger.reporter-log-spans=true
quarkus.jaeger.log-trace-context=true
quarkus.jaeger.propagation=jaeger
quarkus.jaeger.sampler-type=const
quarkus.jaeger.sampler-param=1
quarkus.log.console.format=%d{HH:mm:ss} %-5p traceId=%X{traceId}, spanId=%X{spanId}, sampled=%X{sampled} [%c{2.}] (%t) %s%e%n

quarkus.log.handler.gelf.enabled=true
quarkus.log.handler.gelf.host=localhost
quarkus.log.handler.gelf.port=12201

以下是我用来实现集中式日志管理(ELK)的依赖项。为此,我使用的是 quarkus quarkus-centralized-log-managemt guide 提供的指南

pom.xml

<dependencies>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-junit5</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>io.rest-assured</groupId>
      <artifactId>rest-assured</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-smallrye-opentracing</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-hibernate-validator</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-rest-client</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-smallrye-openapi</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy-jackson</artifactId>
    </dependency>
    <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-logging-gelf</artifactId>
    </dependency>
    <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-smallrye-metrics</artifactId>
    </dependency>
  </dependencies>
    

【问题讨论】:

  • 嗯,我认为将日志发送到 Jaeger 并不是一个好主意。 Jaeger 的主要目的是可追溯性和可观察性,它应该非常轻量级以避免性能下降。一个不错的选择是在您的日志中打印 Jaeger 跟踪 id 和 span id(通常它们也被聚合到一些集中式日志堆栈中,例如 EFK)并使用跟踪 id 或 span id 过滤您的日志。
  • 感谢您为我提供了一个不错的选择。但我想知道 quarkus 中是否有任何方法可以获取 preHandle 和 afterCompletion 事件,其中包含有关在请求执行期间调用的类/方法的信息,就像我们在 springboot 中一样
  • 我认为您可以在 CDI 拦截器 (docs.jboss.org/weld/reference/1.0.0/en-US/html/…) 周围找到有关此问题的答案。 Quarkus 也支持它。简单示例 (tomee.apache.org/examples-trunk/simple-cdi-interceptor)。
  • 我已经实现了你建议的替代方案,即通过在我的日志中打印 traceId 和 spanId 并且我尝试在 Windows 服务器上使用 elasticsearch 配置 jeager,而不使用 docker,通过搜索所有可用的选项,但成功率为零。我想不知何故我走错了路。你能帮我一下吗?
  • 首先,是单独使用弹性搜索还是使用某种堆栈,如 EFK(Elastic/Fluentd & Kibana) ?其次,“搜索所有可用选项但成功率为零”是什么意思?如果 traceId 和 spanId 在日志中,您应该能够过滤它们。

标签: quarkus


【解决方案1】:

您可以@Inject Tracer 并在其中添加您自己的东西。

但我以为 Jaeger 会自动记录错误,但我可能错了。

【讨论】:

  • 感谢您的建议。是的,错误会在 Jeager 中自动记录,但我想知道我们需要在什么条件下创建跨度并使用 span.log(),因为我是 Open tracking 和 Jeager 的新手
【解决方案2】:

在配置您的日志以接受 Jaeger 属性后,例如 for ex:

quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) [traceId=%X{traceId},spanId=%X{spanId},%X{sampled}] %s%e%n

然后您需要通过以下属性将 Jaeger 上下文传播到您的日志:

quarkus.jaeger.log-trace-context=true

quarkus.jaeger.propagation=jaeger

【讨论】:

  • 我忘了提你,我正在使用 quarkus-logging-gelf 扩展并根据quarkus-centralized-log-management-guide 中提到的相同完成配置将日志发送到 ELK。通过使用您在答案中提到的上述配置我试过了,但是 traceId 和 spanId 没有被发送。
  • 请分享您的属性文件和 pom.xml
  • 我将只编辑我的问题以共享属性文件和 pom.xml
  • 您是否正确配置了属性“quarkus.jaeger.endpoint”?!
  • 是的,我已经配置了类似 quarkus.jaeger.endpoint=localhost:14268/api/traces 的属性
【解决方案3】:

我在我的 application.properties 中添加了一个新的 gelf 配置属性。通过这个我们可以将带有 traceId 和 spanId 的日志发送到 ELK 堆栈。

application.properties

quarkus.http.port=8200
quarkus.swagger-ui.always-include=true
quarkus.jaeger.service-name=myservice
quarkus.jaeger.reporter-log-spans=true //This can be excluded
quarkus.jaeger.propagation=jaeger //This can be excluded
quarkus.jaeger.sampler-type=const
quarkus.jaeger.sampler-param=1
quarkus.log.console.format=%d{HH:mm:ss} %-5p traceId=%X{traceId}, spanId=%X{spanId}, sampled=%X{sampled} [%c{2.}] (%t) %s%e%n

quarkus.log.handler.gelf.enabled=true
quarkus.log.handler.gelf.host=localhost
quarkus.log.handler.gelf.port=12201
quarkus.log.handler.gelf.include-full-mdc=true //newly added property

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多