springboot sleuth 日志跟踪问题记录
作者:xiaogui918
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 可以通过 RestTemplate 和 Feign 来自动传递请求的上下文信息,只需要在 RestTemplate 和 Feign 中添加相应的配置即可:
@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:94113.查看分布式追踪信息
在启动 Spring Boot 应用程序后,可以通过访问应用程序的端点来触发请求,并在 Zipkin 的 Web 界面中查看分布式追踪信息。在 Zipkin 的 Web 界面中,可以查看每个请求的 Trace ID、请求流程中的服务节点、服务节点的执行时间和耗时等信息。
总结
分布式追踪技术是解决分布式系统中请求执行路径和时间无法追踪的问题的关键技术之一。
Spring Boot 集成了 Spring Cloud Sleuth 和 Zipkin,使得分布式追踪变得非常简单。
在 Spring Boot 应用程序中,可以通过添加相应的依赖和配置来实现分布式追踪功能,并将追踪信息发送到 Zipkin 服务器。
使用分布式追踪技术可以帮助开发人员更好地管理和监控分布式系统,并提高系统的可靠性和性能。
到此这篇关于Spring Boot 中的 Sleuth 简介及使用方法的文章就介绍到这了,更多相关Spring Boot Sleuth使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
