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通过CMD方式读取注册表任意键值对代码实践

    Java通过CMD方式读取注册表任意键值对代码实践

    这篇文章主要介绍了Java通过CMD方式读取注册表任意键值对代码实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • IDEA导入Eclipse项目的方法步骤(图文教程)

    IDEA导入Eclipse项目的方法步骤(图文教程)

    这篇文章主要介绍了IDEA导入Eclipse项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

    Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

    循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,这篇文章主要介绍了Spring Boot循环依赖原理、解决方案与最佳实践(全解析),需要的朋友可以参考下
    2025-04-04
  • 分析JAVA中几种常用的RPC框架

    分析JAVA中几种常用的RPC框架

    这篇文章主要介绍了JAVA中几种常用的RPC框架的相关知识点,对此有兴趣的朋友参考学习下吧。
    2018-03-03
  • Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法

    Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法

    这篇文章给大家介绍了spring-boot中如何定义过滤器、监听器和拦截器,对Spring Boot 编写Servlet、Filter、Listener、Interceptor的相关知识感兴趣的朋友一起看看吧
    2017-07-07
  • java中MVC模式与三层架构

    java中MVC模式与三层架构

    这篇文章主要让我们理解MVC模式和三层架构的基础知识,有兴趣的同学可以阅读,借鉴参考一下
    2023-03-03
  • MyBatis增删改查快速上手

    MyBatis增删改查快速上手

    这篇文章给大家讲解的是MyBatis 这门技术的 CURD (增删改查) ,非常的详细与实用,有需要的小伙伴可以参考下
    2020-02-02
  • java实现求只出现一次的数字

    java实现求只出现一次的数字

    本文主要介绍了java实现求只出现一次的数字,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 解决ObjectMapper.convertValue() 遇到的一些问题

    解决ObjectMapper.convertValue() 遇到的一些问题

    这篇文章主要介绍了解决ObjectMapper.convertValue() 遇到的一些问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java使用ffmpeg处理视频的方法

    java使用ffmpeg处理视频的方法

    这篇文章主要介绍了java使用ffmpeg处理视频的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论