Java最全Java应用日志如何与Jaeger的trace关联,springboot底层原理面试题

写在最后

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 现在把代码运行起来,打印日志看看,如下所示,之前模板中配置的**%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:

在这里插入图片描述

最后

Java架构进阶面试及知识点文档笔记

这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理

image

Java分布式高级面试问题解析文档

其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!

image

互联网Java程序员面试必备问题解析及文档学习笔记

image

Java架构进阶视频解析合集

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当您在多个Spring Boot应用程序之间集成Jaeger时,可以按照以下步骤进行实现: 1. 添加依赖:在每个应用程序的`pom.xml`文件中添加Jaeger客户端库的依赖项。例如: ```xml <dependency> <groupId>io.jaegertracing</groupId> <artifactId>jaeger-client</artifactId> <version>1.6.0</version> </dependency> ``` 2. 配置Jaeger:在每个应用程序的配置文件(如`application.properties`或`application.yml`)中添加Jaeger的配置。确保每个应用程序具有唯一的`service-name`。例如: 应用程序1的配置: ```yaml # 应用程序1的Jaeger配置 jaeger: service-name: application1 udp-sender: host: localhost port: 6831 ``` 应用程序2的配置: ```yaml # 应用程序2的Jaeger配置 jaeger: service-name: application2 udp-sender: host: localhost port: 6831 ``` 3. 创建Jaeger Tracer Bean:在每个应用程序的配置类中创建一个Jaeger Tracer Bean。例如: 应用程序1的配置类: ```java import io.jaegertracing.Configuration; import io.jaegertracing.internal.samplers.ConstSampler; import io.opentracing.Tracer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JaegerConfig { @Bean public Tracer jaegerTracer() { Configuration.SamplerConfiguration samplerConfig = Configuration.SamplerConfiguration.fromEnv() .withType(ConstSampler.TYPE) .withParam(1); Configuration.ReporterConfiguration reporterConfig = Configuration.ReporterConfiguration.fromEnv() .withLogSpans(true); Configuration config = new Configuration("application1") .withSampler(samplerConfig) .withReporter(reporterConfig); return config.getTracer(); } } ``` 应用程序2的配置类: ```java import io.jaegertracing.Configuration; import io.jaegertracing.internal.samplers.ConstSampler; import io.opentracing.Tracer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JaegerConfig { @Bean public Tracer jaegerTracer() { Configuration.SamplerConfiguration samplerConfig = Configuration.SamplerConfiguration.fromEnv() .withType(ConstSampler.TYPE) .withParam(1); Configuration.ReporterConfiguration reporterConfig = Configuration.ReporterConfiguration.fromEnv() .withLogSpans(true); Configuration config = new Configuration("application2") .withSampler(samplerConfig) .withReporter(reporterConfig); return config.getTracer(); } } ``` 4. 使用Jaeger Tracer:在每个应用程序中使用注入的Jaeger Tracer实例进行跟踪。例如,在控制器类或服务类中: 应用程序1的控制器类: ```java import io.opentracing.Span; import io.opentracing.Tracer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @Autowired private Tracer tracer; @GetMapping("/app1") public String app1() { Span span = tracer.buildSpan("app1Span").start(); // 执行您的业务逻辑 span.finish(); return "Application 1"; } } ``` 应用程序2的控制器类: ```java import io.opentracing.Span; import io.opentracing.Tracer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @Autowired private Tracer tracer; @GetMapping("/app2") public String app2() { Span span = tracer.buildSpan("app2Span").start(); // 执行您的业务逻辑 span.finish(); return "Application 2"; } } ``` 在每个应用程序中,您可以创建不同的Span来跟踪各自的业务逻辑。这样,当应用程序之间进行调用时,每个跟踪都会被记录下来。 希望这个示例对您有所帮助!如有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值