Spring Cloud集成jaeger

介绍

Jaeger 是Uber推出的一款开源分布式追踪系统,兼容OpenTracing API。分布式追踪系统用于记录请求范围内的信息。例如,一次远程方法调用的执行过程和耗时。是我们排查系统问题和系统性能的利器.它用于监视和诊断基于微服务的分布式系统,包括:

  • 分布式上下文传播
  • 分布式交易监控
  • 根本原因分析
  • 服务依赖性分析
  • 性能/延迟优化
    该文章讲解,cloud集成jaeger并修改jaeger的日志结构和sleuth一样

为什么使用Jaeger

  1. JaegerUI更加直观和丰富
  2. 采用udp传输协议,性能更高
  3. 兼容OpenTracing API
  4. 给系统的负担更小
  5. sdk丰富

jaeger组件介绍

**jaeger-client:**jaeger 的客户端,实现了opentracing协议;

**jaeger-agent:**jaeger client的一个代理程序,client将收集到的调用链数据发给agent,然后由agent发给collector;

**jaeger-collector:**负责接收jaeger client或者jaeger agent上报上来的调用链数据,然后做一些校验,比如时间范围是否合法等,最终会经过内部的处理存储到后端存储;

**jaeger-query:**专门负责调用链查询的一个服务,有自己独立的UI;

**jaeger-ingester:**可以从kafka读取数据然后写到jaeger的后端存储,比如Cassandra和Elasticsearch;

**spark-job:**基于spark的运算任务,可以计算服务的依赖关系,调用次数等;

在这里插入图片描述

端口介绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X1qQBVn5-1578298002730)(C:\Users\chenzhe\AppData\Roaming\Typora\typora-user-images\1578279068463.png)]

安装Jaeger

下载: https://www.jaegertracing.io/download/

这里使用windows版的进行测试.安装完成后,在cmd中启动jaeger-all-in-one.exe.

访问: http://localhost:16686 会看到下面的界面.

在这里插入图片描述

由集成sleuth改为jeager

创建一个服务提供者修改pom文件

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
   <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        
        <dependency>
            <groupId>io.opentracing.contrib</groupId>
            <artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
            <version>2.0.3</version>
        </dependency>
    </dependencies>

配置文件

eureka:
  client:
    healthcheck:
      enabled: false
    serviceUrl:
      defaultZone: http://localhost:9401/eureka/
server:
  port: 9402
spring:
  application:
    name: provide
    
    #开启jaeger链路跟踪的日志收集
opentracing:
  jaeger:
    enabled: true
    log-spans: true
    const-sampler:
      decision: true
   #将日志发送到agent
    udp-sender:
      host: localhost
      port: 6831

接下来添加一个服务方法

package cn.com.taiji.provide.web;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 
 * ClassName: DcController
 * @Description: TODO
 * @CreatDate 2020.1.6
 */
@RestController
public class DcController {
	@Autowired
	DiscoveryClient discoveryClient;
	/**
	 * 
	 * @Description 实现/dc请求处理接口,通过DiscoveryClient对象,在日志中打印出服务实例的相关内容
	 */
	//使用slf4j的Logger类记录日志,此条日志相关的追踪信息会由Sleuth自动生成并记录。
	private static Logger log=LoggerFactory.getLogger(DcController.class);

	@GetMapping("/dc")
	public String dc() throws InterruptedException {
	    String services = "Services: " + discoveryClient.getServices();
        //此处进行日志追踪
        log.info(services);
		return services;
	}
}

从上面的代码可以看到,当通过Fegin调用该服务时,会打印如下日志,同时发送到agent中.同时可以通过jaegerUI进行查看.

在这里插入图片描述

2020-01-06 10:59:01.929  INFO 15124 --- [nio-9402-exec-5] cn.com.taiji.provide.web.DcController    : Services: [provide, consumer]

但是这个和sleuth的日志结构差距还是比较大的,如果不修改这个结构,就需要在采集系统日志时重新匹配正则表达式,同时如果将traceId显示出来可以很方便的将当前请求的调用链日志筛选出来.所以我们要修改jaeger打印的默认日志结构.

修改日志结构

概括

想修改日志格式分为两个步骤

  1. 从jaeger的上下文中取出traceID放到MDC中
  2. 添加logback修改日志格式

从jaeger的上下文中取出traceID放到MDC中

项目使用的日志是logback,在logback中有一个MDC这个类,他负责存储数据当日志打印时可以使用**%X{X-B3-TraceId:-}这种方式直接输出.首先要做的是将TraceId取出来,jaeger有个类叫做ThreadLocalScopeManager**

它负责存储jaeger的 opentracing上下文信息同时进行传递.可以通过这个类取opentracing的trecId等信息将其放到MDC中

public class MDCScopeManager extends ThreadLocalScopeManager {
   
    @Override
    public Scope activate(Span span, boolean finishOnClose) {
   
        return super.activate(span, finishOnClose);
    }

    @Override
    public Scope activate(Span span) {
   
        return super.activate(span);
    }


    private static class ScopeWrapper implements Scope {
   
 
        private final Scope scope;
        private final String previousTraceId;
        private final String previousSpanId;
        private final String previousParentSpanId;
        private final String previousSampled;
 
        ScopeWrapper(
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值