首页 > 作文

关于Java应用日志与Jaeger的trace关联的问题

更新时间:2023-04-04 15:56:35 阅读: 评论:0

欢迎访问我的github

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及java、docker、kubernetes、devops等;

本篇概览

经过[《jaeger开发入门(java版)》]的实战,相信您已经能将自己的应用接入jaeger,并用来跟踪定位问题了,本文将介绍jaeger一个小巧而强大的辅助功能,用少量改动大幅度提升定位问题的便利性:将业务日志与jaeger的trace关联在正式开始前,咱们先来看一个具体的问题:

一次web请求可能有多条业务日志(log4j或者logback配置的那种),这和您写代码执行log.info的次数有关,假设有10条,那么十次请求就有一百条业务日志;

通过jaeger发现这十次请求中有一次耗时特别长,想定位一下具体原因,现在问题来了:一共有100条业务日志,到底哪些是和jaeger中耗时长的那一次请求有关?

您可能会说:有些业务特征如ur-id,咱们可以写入span的tag或者log中,这样通过span查到ur-id,再去日志中查找含有此ur-id的日志即可,这样确实可以,但未必每条日志都有ur-id,所以并非最佳方式好在jaeger官方给出了一种简单有效的方案:基于mdc,jaeger的sdk在日志中注入trace相关的变量

关于mdc

关于sl4j的mdc不是本篇的重点,因此只把本篇用到的特性简单说说即可,经验丰富的您如果对mdc已经了解,请跳过此节在sl4j的配置文件中可以配置日志的格式,例如logback的配置文件如下,可见模板中新增了一段内容[ur-id=%x{ur-id}]:
<appender name="console" class="ch.qos.logback.core.consoleappender">        <filter class="ch.qos.logback.classic.filter.thresholdfilter">            <level>info</level>        </filter>        <encoder>            <!--%logger{10}表示类名过登高的古诗长时会自动缩写-->       南通大学专业     <pattern>%d{hh:mm:ss} [%thread] %-5level %logger{10} [ur-id=%x{ur-id}] %msg%n</pattern>            <chart>utf-8</chart>        </encoder>    </appender>

再来看一段日志的代码,先调用mdc.put方法将一个键值对写入当前线程的诊断上下文map(diagnostic context map),键名和上面的模板中配置的%x{ur-id}一模一样:

@getmapping("/test")    public void test() {        mdc.put("ur-id", "ur-" + system.currenttimemillis());        log.info("this is test request");    }

现在把代码运行起来,打印日志看看,如下所示,之前模板中配置的%x{ur-id}已被替换成了ur-1632122267618,就是代码中mdc.put设置的值:

15:17:47 [http-nio-18081-exec-6] info c.b.j.c.c.helloconsumercontroller [ur-id=ur-1632122267618] this is test request

以上就是mdc的基本功能:对日志模板中的变量进行填充,填充的内容可以用mdc.put方法随意设置;

此刻聪明的您应该能猜到jaeger官方的方案是如何实现的了,没错,就是借助mdc将trace信息填充到日志模板中,这样每行日志都有了trace信息,咱们在jaeger web页面中感兴趣的任何一次trace,都能找到对应的日志了

关于jaeger的官方方案

jaeger的官方方案如下图所示,sdk已经把traceid、spanid、sampled写入当前线程的诊断上下文map(diagnostic context map),只要日志模板中配置上述三个变量,就会在所有业务日志中输出它们具体的值:

看起来似乎非常简单,那就动手编码试试吧

编码实战

jaeger与mdc的关联只是个小功能,没必要大张旗鼓的新建项目,基于[《jaeger开发入门(java版)》]的代码继续开发即可,也就是说修改两个子工程jaeger-rvice-consumer和jaeger-rvice-provider的源码,让它们的业务日志打印出jaeger的trace信息首先从jaeger-rvice-provider工程开始,增加一个标准的logback日志配置文件logback.xml,如下所示,日志模板中已添加了traceid、spanid、sampled变量:
<?xml version="1.0" encoding="utf-8"?><configuration scan="true" scanperiod="60 conds" debug="fal">    <contextname>logback</contextname>    <!--输出到控制台-->    <appender name="console" class="ch.qos.logback.core.consoleappender">        <filter class="ch.qos.logback.classic.filter.thresholdfilter">            <level>info</level>        </filter>        <encoder>            <!--%logger{10}表示类名过长时会自动缩写-->            <pattern>%d{hh:mm:ss} [%thread] %-5level %logger{10} [traceid=%x{traceid} spanid=%x{spanid} sampled=%x{sampled}] %msg%n</pattern>            <chart>utf-8</chart>        </encoder>    </appender>    <root level="info">        <appender-ref ref="console" />    </root></configuration>

再去检查配置类,确认jaegertracer实例化时用了mdcscopemanager参数,如下所示,咱们在上一章已经这么做了,可以维持不变:

package com.bolingcavalry.jaeger.provider.config;import io.jaegertracing.internal.mdcscopemanager;import io.opentracing.contrib.java.spring.jaeger.starter.tracerbuildercustomizer;import org.springframework.context.annotation.bean;import org.springframework.context.annotation.configuration;@configurationpublic class jaegerconfig {    @bean    public tracerbuildercustomizer mdcbuildercustomizer() {        // 1.8新特性,函数式接口        return builder -> builder.withscopemanager(new mdcscopemanager.builder().build());    }}

接下来是在业务代码中随意加几行打印日志的代码,如下图红框所示:

接下来继续修改jaeger-rvice-consumer子工程,具体步骤与刚才改造jaeger-rvice-provider时一模一样,就不多占用篇幅赘述了,记得在业务代码中随意加几行日志,如下图红框:

开发完成,开始验证吧

验证

像[《jaeger开发入门(java版)》]那样操作,将jaeger-rvice-consumer和jaeger-rvice-provider编译构建制作成docker镜像用docker-compos家教收费e将所有服务启动,然后通过浏览器访问jaeger-rvice-consumer的服务,多访问几次打开jaeger的web页面,可以看到多次请求的trace,咱们随机选择一个,鼠标点击下图红框中的圆点:

此时会跳转到该trace的详情页,注意页面的url,如下图红框,里面的2037fe105d73f4a5就是traceid:

用2037fe105d73f4a5搜索jaeger-rvice-provider的日志,由于应用部署在docker中,咱们要用docker log和grep命令组合来过滤,如下所示,咱们代码写的日志都打印出来了,并且红框中就是traceid等关键信息

再去查看jaeger-rvice-consumer的日志,如下图红框,本次请求相关的日志也可以通过traceid搜索到:

至此,本篇实战就完成了,对党的认识50字jaeger的web页面上的任何一个trace,现在都能轻易找到与之对应的所有业务日志,这在定位问题时简直是如虎添翼的效果,如果您的系统用了elk或者efk来汇总所有分布式服务的日志,那就更高效了

到此这篇关于java应用日志如何与jaeger的trace关联的文章就介绍到这了,更多相关ja一到十的成语va应用日志与jaeger的trace关联内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 15:56:33,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/f186c0e52b9a25eb9728bf7b227f011d.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:关于Java应用日志与Jaeger的trace关联的问题.doc

本文 PDF 下载地址:关于Java应用日志与Jaeger的trace关联的问题.pdf

标签:日志   业务   代码   所示
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图