SpringCloud集成Micrometer Tracing的代碼工程
1.什么是 Micrometer Tracing?
Micrometer Tracing 是一個(gè)用于微服務(wù)架構(gòu)的追蹤庫,它提供了一種簡單而強(qiáng)大的方式來收集和報(bào)告分布式系統(tǒng)中的性能和調(diào)用鏈信息。它是 Micrometer 庫的一部分,Micrometer 是一個(gè)用于應(yīng)用程序監(jiān)控的指標(biāo)收集工具,支持多種監(jiān)控系統(tǒng),如 Prometheus、Graphite 和 InfluxDB。
Micrometer Tracing 旨在幫助開發(fā)者和運(yùn)維人員理解微服務(wù)之間的交互,識(shí)別性能瓶頸,并提高系統(tǒng)的可觀察性。通過追蹤請(qǐng)求的生命周期,Micrometer Tracing 可以提供詳細(xì)的調(diào)用鏈信息,幫助團(tuán)隊(duì)快速定位問題。
Micrometer Tracing 的優(yōu)勢(shì)
- 簡單易用:Micrometer Tracing 提供了簡單的注解和 API,使得在應(yīng)用程序中添加追蹤變得非常容易。
- 與 Micrometer 生態(tài)系統(tǒng)集成:作為 Micrometer 的一部分,Micrometer Tracing 可以與其他監(jiān)控工具無縫集成,提供全面的監(jiān)控解決方案。
- 靈活的采樣策略:用戶可以根據(jù)需求自定義采樣策略,以平衡追蹤的詳細(xì)程度和性能開銷。
- 豐富的上下文信息:通過 Tags 和 Span,用戶可以獲得豐富的上下文信息,幫助快速定位問題。
Micrometer Tracing 的核心概念
Span:Span 是追蹤的基本單位,表示一個(gè)操作的開始和結(jié)束。每個(gè) Span 都有一個(gè)唯一的標(biāo)識(shí)符(Span ID),并且可以包含父 Span 的信息,從而形成一個(gè)調(diào)用鏈。
Trace:Trace 是由多個(gè) Span 組成的,表示一個(gè)請(qǐng)求在系統(tǒng)中的完整生命周期。每個(gè) Trace 都有一個(gè)唯一的標(biāo)識(shí)符(Trace ID),可以用來追蹤整個(gè)請(qǐng)求的路徑。
Tags:Tags 是附加到 Span 上的鍵值對(duì),用于提供額外的上下文信息,例如服務(wù)名稱、方法名稱、狀態(tài)碼等。Tags 可以幫助用戶更好地理解和分析追蹤數(shù)據(jù)。
Sampler:Sampler 決定哪些請(qǐng)求將被追蹤??梢愿鶕?jù)請(qǐng)求的特征(如請(qǐng)求類型、服務(wù)名稱等)配置采樣策略,以減少性能開銷。
2.環(huán)境搭建
pull images
docker pull openzipkin/zipkin
run docker
docker run -d -p 9411:9411 openzipkin/zipkin
web UI
http://localhost:9411
3.代碼工程
實(shí)驗(yàn)?zāi)繕?biāo)
在 Spring Cloud 應(yīng)用程序中使用 Micrometer Tracing
添加依賴
在 pom.xml
中添加 Micrometer Tracing 和 Spring Cloud Sleuth 的依賴:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springcloud-demo</artifactId> <groupId>com.et</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>spring-cloud-sleuth</artifactId> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-otel</artifactId> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project>
配置類
package com.et.config; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.aop.ObservedAspect; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ObservedAspectConfiguration { @Bean public ObservedAspect observedAspect(ObservationRegistry observationRegistry) { observationRegistry.observationConfig().observationHandler(new SimpleLoggingHandler()); return new ObservedAspect(observationRegistry); } } package com.et.config; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationHandler; import lombok.extern.slf4j.Slf4j; @Slf4j public class SimpleLoggingHandler implements ObservationHandler<Observation.Context> { @Override public void onStart(Observation.Context context) { ObservationHandler.super.onStart(context); log.info("Starting context {} ", context); } @Override public void onError(Observation.Context context) { ObservationHandler.super.onError(context); } @Override public void onEvent(Observation.Event event, Observation.Context context) { ObservationHandler.super.onEvent(event, context); } @Override public void onScopeOpened(Observation.Context context) { ObservationHandler.super.onScopeOpened(context); } @Override public void onScopeClosed(Observation.Context context) { ObservationHandler.super.onScopeClosed(context); } @Override public void onScopeReset(Observation.Context context) { ObservationHandler.super.onScopeReset(context); } @Override public void onStop(Observation.Context context) { ObservationHandler.super.onStop(context); log.info("Stopping context {} ", context); } @Override public boolean supportsContext(Observation.Context context) { return true; } }
為了使tracking的newspan注解生效,需要額外配置如下
package com.et.config; import io.micrometer.tracing.Tracer; import io.micrometer.tracing.annotation.DefaultNewSpanParser; import io.micrometer.tracing.annotation.ImperativeMethodInvocationProcessor; import io.micrometer.tracing.annotation.MethodInvocationProcessor; import io.micrometer.tracing.annotation.NewSpanParser; import io.micrometer.tracing.annotation.SpanAspect; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) public class SpanAspectConfiguration { @Bean NewSpanParser newSpanParser() { return new DefaultNewSpanParser(); } @Bean MethodInvocationProcessor methodInvocationProcessor( NewSpanParser newSpanParser, Tracer tracer, BeanFactory beanFactory) { return new ImperativeMethodInvocationProcessor( newSpanParser, tracer, beanFactory::getBean, beanFactory::getBean); } @Bean SpanAspect spanAspect(MethodInvocationProcessor methodInvocationProcessor) { return new SpanAspect(methodInvocationProcessor); } }
啟用 Tracing:
在 Spring Boot 的主類上添加 @EnableAspectJAutoProxy
注解,以啟用 AOP 支持:
package com.et; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.EnableAspectJAutoProxy; @SpringBootApplication @EnableAspectJAutoProxy public class SpringCloudApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudApplication.class, args); } }
使用注解:
在需要追蹤的方法上使用 @NewSpan
注解,以創(chuàng)建新的 Span。例如:
package com.et.service; import io.micrometer.tracing.annotation.NewSpan; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** * @author liuhaihua * @version 1.0 * @ClassName DemoService * @Description todo * @date 2024/12/03/ 17:37 */ @Service @Slf4j public class DemoService { @NewSpan public String sayHello(String name){ log.info("hello "+name); return "hello "+name; } }
controller
package com.et.controller; import io.micrometer.tracing.SpanName; import io.micrometer.tracing.annotation.NewSpan; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @Slf4j public class MyController { @Autowired com.et.service.DemoService demoService; @GetMapping("/hello") @NewSpan @SpanName("customSpanName") public String hello() { log.info("into controller "); return demoService.sayHello("jack"); } }
application.yml
spring.application.name: demo-tracing server: port: 8088 servlet: context-path: /app logging.pattern.level: "%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]" management: zipkin: tracing: endpoint: http://localhost:9411/api/v2/spans tracing: sampling: probability: 1.0
以上只是一些關(guān)鍵代碼
4.測(cè)試
啟動(dòng)Spring Cloud應(yīng)用
訪問rest api
訪問http://127.0.0.1:8088/app/hello,控制臺(tái)輸出日志
2024-12-03T18:18:30.845+08:00 INFO [demo-tracing,d0f7eb048278e2374cf99e898d8cffb9,59da48fe2de9af72] 13304 --- [demo-tracing] [nio-8088-exec-4] [d0f7eb048278e2374cf99e898d8cffb9-59da48fe2de9af72] com.et.controller.MyController : into controller 2024-12-03T18:18:30.846+08:00 INFO [demo-tracing,d0f7eb048278e2374cf99e898d8cffb9,62a3992306bc6344] 13304 --- [demo-tracing] [nio-8088-exec-4] [d0f7eb048278e2374cf99e898d8cffb9-62a3992306bc6344] com.et.service.DemoService : hello jack
查看追蹤數(shù)據(jù):
Micrometer Tracing 會(huì)自動(dòng)收集追蹤數(shù)據(jù),并將其發(fā)送到配置的zipkin。你可以使用這些數(shù)據(jù)來分析請(qǐng)求的性能和調(diào)用鏈。
5.結(jié)論
Micrometer Tracing 是一個(gè)強(qiáng)大的工具,可以幫助開發(fā)者和運(yùn)維人員更好地理解和監(jiān)控微服務(wù)架構(gòu)中的請(qǐng)求流。通過簡單的配置和使用,Micrometer Tracing 可以顯著提高系統(tǒng)的可觀察性,幫助團(tuán)隊(duì)快速識(shí)別和解決性能問題。在現(xiàn)代微服務(wù)架構(gòu)中,采用 Micrometer Tracing 是提升應(yīng)用程序性能和可靠性的有效手段。
以上就是SpringCloud集成Micrometer Tracing的代碼工程的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud集成Micrometer Tracing的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Unity&Springboot實(shí)現(xiàn)本地登陸驗(yàn)證
本文主要介紹了Unity&Springboot服務(wù)器/本地登陸驗(yàn)證,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07SpringData @Query和@Modifying注解原理解析
這篇文章主要介紹了SpringData @Query和@Modifying注解原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Java高級(jí)架構(gòu)之FastDFS分布式文件集群詳解
這篇文章主要介紹了Java高級(jí)架構(gòu)之FastDFS分布式文件集群詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04idea進(jìn)程結(jié)束但是項(xiàng)目頁面正常運(yùn)行怎么辦
這篇文章主要介紹了idea進(jìn)程結(jié)束但是項(xiàng)目頁面正常運(yùn)行怎么辦,很多朋友遇到這樣的情況不知道該如何解決了,下面小編給大家?guī)砹薸dea進(jìn)程結(jié)束但是項(xiàng)目頁面正常運(yùn)行的解決方法,需要的朋友可以參考下2023-03-03Java 遞歸遍歷實(shí)現(xiàn)linux tree命令方式
這篇文章主要介紹了Java 遞歸遍歷實(shí)現(xiàn)linux tree命令方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09