范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Java应用日志如何与Jaeger的trace关联

  欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览经过《Jaeger开发入门(java版)》的实战,相信您已经能将自己的应用接入Jaeger,并用来跟踪定位问题了,本文将介绍Jaeger一个小巧而强大的辅助功能,用少量改动大幅度提升定位问题的便利性:将业务日志与Jaeger的trace关联在正式开始前,咱们先来看一个具体的问题:一次web请求可能有多条业务日志(log4j或者logback配置的那种),这和您写代码执行log.info的次数有关,假设有10条,那么十次请求就有一百条业务日志;通过jaeger发现这十次请求中有一次耗时特别长,想定位一下具体原因,现在问题来了:一共有100条业务日志,到底哪些是和Jaeger中耗时长的哪一次请求有关?您可能会说:有些业务特征如user-id,咱们可以写入span的tag或者log中,这样通过span查到user-id,再去日志中查找含有此user-id的日志即可,这样确实可以,但未必每条日志都有user-id,所以并非最佳方式好在Jaeger官方给出了一种简单有效的方案:基于MDC,Jaeger的SDK在日志中注入trace相关的变量关于MDC关于sl4j的MDC不是本篇的重点,因此只把本篇用到的特性简单说说即可,经验丰富的您如果对MDC已经了解,请跳过此节 在sl4j的配置文件中可以配置日志的格式,例如logback的配置文件如下,可见模板中新增了一段内容 [user-id=%X{user-id}] :                      INFO                                            %d{HH:mm:ss} [%thread] %-5level %logger{10} [user-id=%X{user-id}] %msg%n             utf-8              再来看一段日志的代码,先调用 MDC.put 方法将一个键值对写入当前线程的诊断上下文map(diagnostic context map),键名和上面的模板中配置的%X{user-id} 一模一样:@GetMapping("/test")     public void test() {         MDC.put("user-id", "user-" + System.currentTimeMillis());         log.info("this is test request");     }现在把代码运行起来,打印日志看看,如下所示,之前模板中配置的 %X{user-id} 已被替换成了user-1632122267618 ,就是代码中MDC.put 设置的值:15:17:47 [http-nio-18081-exec-6] INFO  c.b.j.c.c.HelloConsumerController [user-id=user-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-service-consumer和jaeger-service-provider的源码,让它们的业务日志打印出Jaeger的trace信息首先从 jaeger-service-provider 工程开始,增加一个标准的logback日志配置文件logback.xml ,如下所示,日志模板中已添加了traceId 、spanId 、sampled 变量:<?xml version="1.0" encoding="UTF-8"?>        logback                                 INFO                                            %d{HH:mm:ss} [%thread] %-5level %logger{10} [traceId=%X{traceId} spanId=%X{spanId} sampled=%X{sampled}] %msg%n             utf-8                                   再去检查配置类,确认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;  @Configuration public class JaegerConfig {     @Bean     public TracerBuilderCustomizer mdcBuilderCustomizer() {         // 1.8新特性,函数式接口         return builder -> builder.withScopeManager(new MDCScopeManager.Builder().build());     } }接下来是在业务代码中随意加几行打印日志的代码,如下图红框所示:
  接下来继续修改 jaeger-service-consumer 子工程,具体步骤与刚才改造 jaeger-service-provider 时一模一样,就不多占用篇幅赘述了,记得在业务代码中随意加几行日志,如下图红框:
  开发完成,开始验证吧 验证像《Jaeger开发入门(java版)》那样操作,将 jaeger-service-consumer 和jaeger-service-provider 编译构建制作成docker镜像用docker-compose将所有服务启动,然后通过浏览器访问 jaeger-service-consumer 的服务,多访问几次打开jaeger的web页面,可以看到多次请求的trace,咱们随机选择一个,鼠标点击下图红框中的圆点:
  此时会跳转到该trace的详情页,注意页面的url,如下图红框,里面的 2037fe105d73f4a5 就是traceid:
  用 2037fe105d73f4a5 搜索 jaeger-service-provider 的日志,由于应用部署在docker中,咱们要用docker log和grep命令组合来过滤,如下所示,咱们代码写的日志都打印出来了,并且红框中就是traceid等关键信息
  再去查看 jaeger-service-consumer 的日志,如下图红框,本次请求相关的日志也可以通过traceid搜索到
  至此,本篇实战就完成了,Jaeger的web页面上的任何一个trace,现在都能轻易找到与之对应的所有业务日志,这在定位问题时简直是如虎添翼的效果,如果您的系统用了ELK或者EFK来汇总所有分布式服务的日志,那就更高效了 欢迎关注头条号:程序员欣宸学习路上,你不孤单,欣宸原创一路相伴...

亿吨级油气区4!太提气能源是经济发展的基石,在过去的十年里,我国能源自主保障能力显著提升,建成了全球最大的清洁发电体系,能源结构不断优化,有力地保障了国民经济的稳定运行。马翠华现在住在北京门头沟一个居民做好自己,其它的随心就好人生没有回头路,昨天再好,也无法再回去明天再难,也要继续。过日子过的就是心情,人无完人,事无完美,心态好了,就没有过不去的坎心情好了,就拥有了生活的全部。人这一辈子,有人羡慕你,有生活就该这样,希望我们都好有人说强扭的瓜不甜,可真有意思,我并不在乎它甜不甜,能扭下来我就很开心了世界那么大,分开了不一定相遇哪怕是一座小小的城,缘份尽了也很难再碰到我觉得生活就是这样,喜欢的就尽量去争取,小维的思考小维处在一片嘈杂声里,心里居然很平静,要是以前会觉得实在太吵了,不想在这样的环境里待着,感觉无法思考也无法集中精神做事。一天,两天,十天,一个月过去了。时间久了以后好像慢慢就习惯了我的杠精朋友我不知道大家是不是和我一样,身边也有这样的一类人。任何事情,话还没说完,直接就否定捂脸任何方案,都要先挑毛病,然后指手画脚任何对象,都要先批评,然后评头论足网图,侵删我是真的不太喜成为入殓师16年,处理数万具遗体我以真心渡人,以爱治愈自己人生是一段旅程,我们乘坐的生命列车,没有回头路,只有一往无前。在短短几十年里,我们遇见父母亲朋好友。入殓师是我们遇到的最后一个人,是生命的摆渡人,给亡灵最大的善意和温暖。死亡可能是物理学家对质子结构异常现象感到疑惑对质子结构在电场中如何变形的精确测量揭示了有关质子数据中一个无法解释的峰值的新细节。核物理学家已经证实,目前对质子结构的描述并不完美。在美国能源部的托马斯杰斐逊国家加速器设施对质子华为云数据库全新ALT功能,为企业业务保驾护航在企业业务实现过程中,用户会话中断是超70的用户在实操中会遇到的问题。一旦出现此类问题就需要用户使用的应用程序对会话的改变有一定的感知能力,并且为处理故障提供一系列的对策。如判断数城视当珠海金湾变成一颗颗小星球换个视角,认识城市。蓝天白云包裹环绕,海岸线与天际交融为一体,勾勒出一个完美的圆形,高楼公园路桥等城市地标正正坐落圆心,以新的姿态呈现,构成了一幅幅特别的城市景观图。近日,南方记者去尼泊尔只花500元,能享受到怎样的待遇?当地美女悄悄告诉你引言随着社会的发展和变化,物价也以相似的速度不断上升,原本只以几块钱能买到的物品,现在可能直接跃升到了十几块。当然,这与人们的收入水平也是有很大关系的,收入高了,买的东西自然也贵了黄毛山变身天空之城台州开放大学企创联盟助力学生创业从海拔700米左右的台州平田乡黄溪村的黄毛山茶园望去,高高低低的山丘环绕着长潭水库,能够看见云海升腾,星空璀璨。这里是85后丈夫黄国煌和90后妻子黄瑜寻到的一方秘境,他们一起打造了
评论丨再绘铁路蓝图,促进经济腾飞我们的重要任务就是服务和支撑中国式现代化建设的火车头,为地方经济的发展提供有力支撑。近日,全国人大代表,中国铁路广州局集团有限公司长沙铁路办事处党委书记主任兼中国铁路广州局集团有限无人跟进的灵动岛,为什么iPhone14Pro系列不得不上?去年9月,iPhone14系列如约而至,但迎接其出现的不是夸奖,而是众口一词的质疑。从硬件配置上来看,大众如此表现似乎并不奇怪。全新的Plus系列大屏产品并不惊艳,标准版没什么升级开足马力忙生产丨广西各地有序推动企业达产满产新春伊始,在柳州五菱新能源汽车有限公司总装车间钦州华谊新材料一体化基地等,一条条生产线火力全开,全力冲刺开门红。当前,我区正牢牢把握攻坚突破黄金期,组织各生产企业迅速按下生产加速键早期投资人我们已经不看虚拟数字人赛道了文数科星球,作者丨数数,编辑丨十里香在定义上,数字人虚拟人或数字替身都是将人物进行虚拟仿真。其三者概念略有不同,其中,虚拟人以抖音平台中的虚拟网红(比如阿喜)最受大众熟知而数字人,AI母婴宝宝树欲做行业变革的先行者最近ChatGPT很火,AI也很火,这项被誉为解放人类生产力的下一代人工智能产品再也不是停留在概念层面,不少专家断言,在不久的将来,人类或许就将进入人工智能时代,不少职业将会被智能iPhone遇冷,卢伟冰宣布再降300元,红米K60极致性价比杀手锏来了苹果CEO库克开始回念大中华市场,三月将进行访问。目前消息报道称苹果在印度生产iPhone遇到了不少技术困难,因为该苹果之前试图将其部分产能从大中华市场转移。然而,智能手机所需的高让屏幕时间点石成金教孩子和屏幕正确交往上周的文章,我们详细探讨了电子产品影响孩子身心健康的具体原理,如果你还有印象的话,我们聊了这么几点人们经常低估自己和孩子使用电子产品的时间,真实使用时间远超建议的健康时间游戏对孩子蜂王浆与蜂胶有什么区别?两者哪种功效更好?内行人告诉你答案关于蜂王浆和蜂胶哪种更好?哪种产品更有性价比,其实准确的来说,这应该是两个差别很大的产品,虽然名字上来说,都是蜂类产品,可从其生产源头来说,两者有着非常明显的差别,因此两者并且有什京东方大涨5创近1年来新高机构液晶电视面板订单需求即将复苏2月15日早盘,面板板块表现强势,彩虹股份率先涨停,TCL科技京东方华映科技凯盛科技涨幅靠前。其中,京东方大涨5,股价创出近1年来新高。消息面,根据Omdia电视显示和OEM资讯服跨越半世纪,三千件展品!这里有老蚌埠工业的记忆作为火车拉来的城市蚌埠有着深厚的工业底蕴随着时光流逝老蚌埠的工业印记逐渐减淡但是现在有机会带您来一趟穿越之旅位于燕山乡蚌官路上的金色农家博物馆正在举办老蚌埠工业展有大大小小老蚌埠工黄山迎来立春后首场降雪宛如童话世界2月13日,黄山迎来了立春后的第一场雪,雪花飘落,漫山遍野,流花飞琼,瑰丽无比。一夜银装素裹,把山峦草木都笼罩在一片白色的梦幻之中。身披银氅的黄山,别有风情,静静屹立于天地之间,以