springboot sleuth 日志跟踪问题记录

 更新时间:2023年07月06日 10:42:11   作者:xiaogui918  
Spring Cloud Sleuth是一个在应用中实现日志跟踪的强有力的工具,使用Sleuth库可以应用于计划任务 、多线程服务或复杂的Web请求,尤其是在一个由多个服务组成的系统中,这篇文章主要介绍了springboot sleuth 日志跟踪,需要的朋友可以参考下

springboot sleuth 日志跟踪

Spring Cloud Sleuth是一个在应用中实现日志跟踪的强有力的工具。使用Sleuth库可以应用于计划任务 、多线程服务或复杂的Web请求,尤其是在一个由多个服务组成的系统中。当我们在这些应用中来诊断问题时,即使有日志记录也很难判断出一个请求需要将哪些操作关联在一起。

如果想要诊断复杂操作,通常的解决方案是在请求中传递唯一的ID到每个方法来识别日志。而Sleuth可以与日志框架Logback、SLF4J轻松地集成,通过添加独特的标识符来使用日志跟踪和诊断问题。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

SLF4J 配置 https://www.jb51.net/article/71692.htm

在使用slf4j打印日志时会打印traceId,通过这ID可以把整个请求链给找出来.

如下是打印出来的实例

2019-06-19 17:16:21.453 [00c62017e97b7823,00c62017e97b7823] [http-nio-8777-exec-1]

需要把traceId给前端,使用aop,在每个返回结果中增加traceId字段

import brave.Tracer;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;;import javax.servlet.http.HttpServletRequest;
@Aspect   //定义一个切面
@Configuration
@Slf4j
public class TraceAspect {
    // 定义切点Pointcut
    @Pointcut("execution(* com.gf.controller..*.*(..))")
    public void excudeService() {
    }
    @Autowired
    Tracer tracer;
    @Around("excudeService()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        HttpServletRequest request = sra.getRequest();
        String url = request.getRequestURL().toString();
        String method = request.getMethod();
        String uri = request.getRequestURI();
        String queryString = request.getQueryString();
        log.info("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString);
        // result的值就是被拦截方法的返回值
        Object result = pjp.proceed();
        JSONObject dd = JSONObject.parseObject(JSON.toJSONString(result));
        dd.put("traceId",tracer.currentSpan().context().traceIdString());
        log.info("请求结束,controller的返回值是 {} - {}", tracer.currentSpan().toString(), dd.toJSONString());
        return dd;
    }
}

Spring Boot 中的分布式追踪及使用

随着互联网应用程序的复杂性不断增加,分布式系统已经成为了许多企业级应用程序的标配。在分布式系统中,由于服务之间的调用关系错综复杂,很难追踪到一个请求在整个系统中的执行路径和时间,这就给排查问题和性能优化带来了巨大的挑战。为了解决这个问题,分布式追踪技术应运而生。本文将介绍 Spring Boot 中的分布式追踪技术及其使用方法。

分布式追踪的概念

分布式追踪(Distributed Tracing)是一种用于追踪分布式系统中请求的执行路径和时间的技术。在分布式系统中,由于请求可能会经过多个服务节点,因此需要在请求流程中添加唯一的标识符(Trace ID),并将 Trace ID 传递给所有相关的服务节点。每个服务节点在处理请求时,都需要将 Trace ID 记录在请求的上下文中,并将请求的上下文信息传递给下一个服务节点。这样,就可以通过 Trace ID 来追踪一个请求在整个系统中的执行路径和时间。在追踪过程中,还需要记录每个服务节点处理请求的时间和耗时,以便分析和优化系统性能。

Spring Cloud Sleuth

Spring Cloud Sleuth 是 Spring Cloud 中的一个分布式追踪框架,它提供了基于 Trace ID 的请求追踪功能,可以协助开发人员快速追踪分布式系统中的请求执行路径和时间,并帮助排查问题和优化性能。

Spring Cloud Sleuth 使用 Zipkin 来存储和展示分布式追踪信息,Zipkin 是一个开源的分布式追踪系统,可以用于存储和展示分布式系统中的请求追踪信息。

Spring Boot 中的分布式追踪

Spring Boot 集成了 Spring Cloud Sleuth,可以非常方便地实现分布式追踪功能。在 Spring Boot 应用程序中,只需要添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

添加这些依赖后,Spring Boot 应用程序就可以自动配置分布式追踪功能,并将追踪信息发送到 Zipkin 服务器。

在应用程序中,可以通过 Tracer 接口来创建 Trace ID,并将 Trace ID 记录在请求的上下文中:

@Autowired
private Tracer tracer;
@GetMapping("/hello")
public String hello() {
    Span span = tracer.nextSpan().name("hello").start();
    try (Tracer.SpanInScope ws = tracer.withSpan(span)) {
        // 处理请求
        return "Hello World!";
    } finally {
        span.finish();
    }
}

在每个服务节点中,都需要将 Trace ID 记录在请求的上下文中,并将请求的上下文信息传递给下一个服务节点。Spring Boot 可以通过 RestTemplateFeign 来自动传递请求的上下文信息,只需要在 RestTemplateFeign 中添加相应的配置即可:

@Bean
public RestTemplate restTemplate() {
    return new RestTemplateBuilder()
            .interceptors(new TraceRestTemplateInterceptor(tracer()))
            .build();
}
@Bean
public Feign.Builder feignBuilder() {
    return Feign.builder().requestInterceptor(new TraceFeignRequestInterceptor(tracer()));
}

Zipkin 的使用

Zipkin 是一个用于存储和展示分布式追踪信息的系统,可以用于分析和优化分布式系统的性能。在 Spring Boot 中,可以通过以下步骤来使用 Zipkin:

1.下载并启动 Zipkin 服务器

可以从 Zipkin 的官网下载 Zipkin 服务器,并启动 Zipkin 服务器。启动 Zipkin 服务器后,可以在浏览器中访问 http://localhost:9411 来查看 Zipkin 的 Web 界面。

2.配置 Spring Boot 应用程序发送追踪信息到 Zipkin 服务器

在 Spring Boot 应用程序中,可以通过以下配置来将追踪信息发送到 Zipkin 服务器:

spring:
  zipkin:
    base-url: http://localhost:9411

3.查看分布式追踪信息

在启动 Spring Boot 应用程序后,可以通过访问应用程序的端点来触发请求,并在 Zipkin 的 Web 界面中查看分布式追踪信息。在 Zipkin 的 Web 界面中,可以查看每个请求的 Trace ID、请求流程中的服务节点、服务节点的执行时间和耗时等信息。

总结

分布式追踪技术是解决分布式系统中请求执行路径和时间无法追踪的问题的关键技术之一。

Spring Boot 集成了 Spring Cloud Sleuth 和 Zipkin,使得分布式追踪变得非常简单。

在 Spring Boot 应用程序中,可以通过添加相应的依赖和配置来实现分布式追踪功能,并将追踪信息发送到 Zipkin 服务器。

使用分布式追踪技术可以帮助开发人员更好地管理和监控分布式系统,并提高系统的可靠性和性能。

到此这篇关于Spring Boot 中的 Sleuth 简介及使用方法的文章就介绍到这了,更多相关Spring Boot Sleuth使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 中运行字符串表达式的方法

    Java 中运行字符串表达式的方法

    这篇文章主要介绍了Java 中运行字符串表达式的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • springboot 整合 seata的配置过程

    springboot 整合 seata的配置过程

    本文给大家介绍springboot 整合 seata的配置过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08
  • java两个线程同时写一个文件

    java两个线程同时写一个文件

    这篇文章主要为大家详细介绍了java两个线程同时写一个文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Go Java算法重复的DNA序列详解

    Go Java算法重复的DNA序列详解

    这篇文章主要为大家介绍了Go Java算法之重复的DNA序列的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 全网最新Log4j 漏洞修复和临时补救方法

    全网最新Log4j 漏洞修复和临时补救方法

    Apache Log4j 远程代码执行漏洞,如何快速修复log4j2漏洞,本文给大家介绍下Log4j 漏洞修复和临时补救方法,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • Java实现的求逆矩阵算法示例

    Java实现的求逆矩阵算法示例

    这篇文章主要介绍了Java实现的求逆矩阵算法,涉及java基于数组的矩阵遍历与运算相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • java基于mongodb实现分布式锁的示例代码

    java基于mongodb实现分布式锁的示例代码

    本文主要介绍了java基于mongodb实现分布式锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • jpa介绍以及在spring boot中使用详解

    jpa介绍以及在spring boot中使用详解

    最近在项目中使用了一下jpa,发现还是挺好用的。这里就来讲一下jpa以及在spring boot中的使用。在这里我们先来了解一下jpa,希望能给你带来帮助
    2021-08-08
  • Java如何使用正则表达式查找指定字符串

    Java如何使用正则表达式查找指定字符串

    在软件开发中正则表达式是个很有用的功能,使用正则表达式可以简化代码,省去不少时间,下面这篇文章主要给大家介绍了关于Java如何使用正则表达式查找指定字符串的相关资料,需要的朋友可以参考下
    2022-09-09
  • Java如何实现通过证书访问Https请求

    Java如何实现通过证书访问Https请求

    这篇文章主要介绍了Java如何实现通过证书访问Https请求,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论