springboot?sleuth?日志跟蹤問題記錄
springboot sleuth 日志跟蹤
Spring Cloud Sleuth是一個在應(yīng)用中實(shí)現(xiàn)日志跟蹤的強(qiáng)有力的工具。使用Sleuth庫可以應(yīng)用于計(jì)劃任務(wù) 、多線程服務(wù)或復(fù)雜的Web請求,尤其是在一個由多個服務(wù)組成的系統(tǒng)中。當(dāng)我們在這些應(yīng)用中來診斷問題時,即使有日志記錄也很難判斷出一個請求需要將哪些操作關(guān)聯(lián)在一起。
如果想要診斷復(fù)雜操作,通常的解決方案是在請求中傳遞唯一的ID到每個方法來識別日志。而Sleuth可以與日志框架Logback、SLF4J輕松地集成,通過添加獨(dú)特的標(biāo)識符來使用日志跟蹤和診斷問題。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> <version>2.1.1.RELEASE</version> </dependency>
SLF4J 配置 http://www.dbjr.com.cn/article/71692.htm
在使用slf4j打印日志時會打印traceId,通過這ID可以把整個請求鏈給找出來.
如下是打印出來的實(shí)例
2019-06-19 17:16:21.453 [00c62017e97b7823,00c62017e97b7823] [http-nio-8777-exec-1]
需要把traceId給前端,使用aop,在每個返回結(jié)果中增加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 { // 定義切點(diǎn)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("請求開始, 各個參數(shù), 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("請求結(jié)束,controller的返回值是 {} - {}", tracer.currentSpan().toString(), dd.toJSONString()); return dd; } }
Spring Boot 中的分布式追蹤及使用
隨著互聯(lián)網(wǎng)應(yīng)用程序的復(fù)雜性不斷增加,分布式系統(tǒng)已經(jīng)成為了許多企業(yè)級應(yīng)用程序的標(biāo)配。在分布式系統(tǒng)中,由于服務(wù)之間的調(diào)用關(guān)系錯綜復(fù)雜,很難追蹤到一個請求在整個系統(tǒng)中的執(zhí)行路徑和時間,這就給排查問題和性能優(yōu)化帶來了巨大的挑戰(zhàn)。為了解決這個問題,分布式追蹤技術(shù)應(yīng)運(yùn)而生。本文將介紹 Spring Boot 中的分布式追蹤技術(shù)及其使用方法。
分布式追蹤的概念
分布式追蹤(Distributed Tracing)是一種用于追蹤分布式系統(tǒng)中請求的執(zhí)行路徑和時間的技術(shù)。在分布式系統(tǒng)中,由于請求可能會經(jīng)過多個服務(wù)節(jié)點(diǎn),因此需要在請求流程中添加唯一的標(biāo)識符(Trace ID),并將 Trace ID 傳遞給所有相關(guān)的服務(wù)節(jié)點(diǎn)。每個服務(wù)節(jié)點(diǎn)在處理請求時,都需要將 Trace ID 記錄在請求的上下文中,并將請求的上下文信息傳遞給下一個服務(wù)節(jié)點(diǎn)。這樣,就可以通過 Trace ID 來追蹤一個請求在整個系統(tǒng)中的執(zhí)行路徑和時間。在追蹤過程中,還需要記錄每個服務(wù)節(jié)點(diǎn)處理請求的時間和耗時,以便分析和優(yōu)化系統(tǒng)性能。
Spring Cloud Sleuth
Spring Cloud Sleuth 是 Spring Cloud 中的一個分布式追蹤框架,它提供了基于 Trace ID 的請求追蹤功能,可以協(xié)助開發(fā)人員快速追蹤分布式系統(tǒng)中的請求執(zhí)行路徑和時間,并幫助排查問題和優(yōu)化性能。
Spring Cloud Sleuth 使用 Zipkin 來存儲和展示分布式追蹤信息,Zipkin 是一個開源的分布式追蹤系統(tǒng),可以用于存儲和展示分布式系統(tǒng)中的請求追蹤信息。
Spring Boot 中的分布式追蹤
Spring Boot 集成了 Spring Cloud Sleuth,可以非常方便地實(shí)現(xiàn)分布式追蹤功能。在 Spring Boot 應(yīng)用程序中,只需要添加以下依賴:
<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 應(yīng)用程序就可以自動配置分布式追蹤功能,并將追蹤信息發(fā)送到 Zipkin 服務(wù)器。
在應(yīng)用程序中,可以通過 Tracer
接口來創(chuàng)建 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(); } }
在每個服務(wù)節(jié)點(diǎn)中,都需要將 Trace ID 記錄在請求的上下文中,并將請求的上下文信息傳遞給下一個服務(wù)節(jié)點(diǎn)。Spring Boot 可以通過 RestTemplate
和 Feign
來自動傳遞請求的上下文信息,只需要在 RestTemplate
和 Feign
中添加相應(yīng)的配置即可:
@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 是一個用于存儲和展示分布式追蹤信息的系統(tǒng),可以用于分析和優(yōu)化分布式系統(tǒng)的性能。在 Spring Boot 中,可以通過以下步驟來使用 Zipkin:
1.下載并啟動 Zipkin 服務(wù)器
可以從 Zipkin 的官網(wǎng)下載 Zipkin 服務(wù)器,并啟動 Zipkin 服務(wù)器。啟動 Zipkin 服務(wù)器后,可以在瀏覽器中訪問 http://localhost:9411
來查看 Zipkin 的 Web 界面。
2.配置 Spring Boot 應(yīng)用程序發(fā)送追蹤信息到 Zipkin 服務(wù)器
在 Spring Boot 應(yīng)用程序中,可以通過以下配置來將追蹤信息發(fā)送到 Zipkin 服務(wù)器:
spring: zipkin: base-url: http://localhost:9411
3.查看分布式追蹤信息
在啟動 Spring Boot 應(yīng)用程序后,可以通過訪問應(yīng)用程序的端點(diǎn)來觸發(fā)請求,并在 Zipkin 的 Web 界面中查看分布式追蹤信息。在 Zipkin 的 Web 界面中,可以查看每個請求的 Trace ID、請求流程中的服務(wù)節(jié)點(diǎn)、服務(wù)節(jié)點(diǎn)的執(zhí)行時間和耗時等信息。
總結(jié)
分布式追蹤技術(shù)是解決分布式系統(tǒng)中請求執(zhí)行路徑和時間無法追蹤的問題的關(guān)鍵技術(shù)之一。
Spring Boot 集成了 Spring Cloud Sleuth 和 Zipkin,使得分布式追蹤變得非常簡單。
在 Spring Boot 應(yīng)用程序中,可以通過添加相應(yīng)的依賴和配置來實(shí)現(xiàn)分布式追蹤功能,并將追蹤信息發(fā)送到 Zipkin 服務(wù)器。
使用分布式追蹤技術(shù)可以幫助開發(fā)人員更好地管理和監(jiān)控分布式系統(tǒng),并提高系統(tǒng)的可靠性和性能。
到此這篇關(guān)于Spring Boot 中的 Sleuth 簡介及使用方法的文章就介紹到這了,更多相關(guān)Spring Boot Sleuth使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java通過CMD方式讀取注冊表任意鍵值對代碼實(shí)踐
這篇文章主要介紹了Java通過CMD方式讀取注冊表任意鍵值對代碼實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下2019-06-06IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟(圖文教程)
這篇文章主要介紹了IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Spring?Boot循環(huán)依賴原理、解決方案與最佳實(shí)踐(全解析)
循環(huán)依賴指兩個或多個Bean相互直接或間接引用,形成閉環(huán)依賴關(guān)系,這篇文章主要介紹了Spring?Boot循環(huán)依賴原理、解決方案與最佳實(shí)踐(全解析),需要的朋友可以參考下2025-04-04Spring Boot 編寫Servlet、Filter、Listener、Interceptor的方法
這篇文章給大家介紹了spring-boot中如何定義過濾器、監(jiān)聽器和攔截器,對Spring Boot 編寫Servlet、Filter、Listener、Interceptor的相關(guān)知識感興趣的朋友一起看看吧2017-07-07java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字
本文主要介紹了java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02解決ObjectMapper.convertValue() 遇到的一些問題
這篇文章主要介紹了解決ObjectMapper.convertValue() 遇到的一些問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06