如何在 Spring Cloud 集成 Micrometer Tracing?

1.什么是 Micrometer Tracing?

Micrometer Tracing 是一个用于微服务架构的追踪库,它提供了一种简单而强大的方式来收集和报告分布式系统中的性能和调用链信息。它是 Micrometer 库的一部分,Micrometer 是一个用于应用程序监控的指标收集工具,支持多种监控系统,如 Prometheus、Graphite 和 InfluxDB。

Micrometer Tracing 旨在帮助开发者和运维人员理解微服务之间的交互,识别性能瓶颈,并提高系统的可观察性。通过追踪请求的生命周期,Micrometer Tracing 可以提供详细的调用链信息,帮助团队快速定位问题。

Micrometer Tracing 的优势

  • 简单易用:Micrometer Tracing 提供了简单的注解和 API,使得在应用程序中添加追踪变得非常容易。
  • 与 Micrometer 生态系统集成:作为 Micrometer 的一部分,Micrometer Tracing 可以与其他监控工具无缝集成,提供全面的监控解决方案。
  • 灵活的采样策略:用户可以根据需求自定义采样策略,以平衡追踪的详细程度和性能开销。
  • 丰富的上下文信息:通过 Tags 和 Span,用户可以获得丰富的上下文信息,帮助快速定位问题。

Micrometer Tracing 的核心概念

  1. Span:Span 是追踪的基本单位,表示一个操作的开始和结束。每个 Span 都有一个唯一的标识符(Span ID),并且可以包含父 Span 的信息,从而形成一个调用链。

  2. Trace:Trace 是由多个 Span 组成的,表示一个请求在系统中的完整生命周期。每个 Trace 都有一个唯一的标识符(Trace ID),可以用来追踪整个请求的路径。

  3. Tags:Tags 是附加到 Span 上的键值对,用于提供额外的上下文信息,例如服务名称、方法名称、状态码等。Tags 可以帮助用户更好地理解和分析追踪数据。

  4. Sampler:Sampler 决定哪些请求将被追踪。可以根据请求的特征(如请求类型、服务名称等)配置采样策略,以减少性能开销。

2.环境搭建

pull images

docker pull openzipkin/zipkin

run docker

docker run -d -p 9411:9411 openzipkin/zipkin

web UI

http://localhost:9411

3.代码工程

实验目标

在 Spring Cloud 应用程序中使用 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 {@Beanpublic 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> {@Overridepublic void onStart(Observation.Context context) {ObservationHandler.super.onStart(context);log.info("Starting context {} ", context);}@Overridepublic void onError(Observation.Context context) {ObservationHandler.super.onError(context);}@Overridepublic void onEvent(Observation.Event event, Observation.Context context) {ObservationHandler.super.onEvent(event, context);}@Overridepublic void onScopeOpened(Observation.Context context) {ObservationHandler.super.onScopeOpened(context);}@Overridepublic void onScopeClosed(Observation.Context context) {ObservationHandler.super.onScopeClosed(context);}@Overridepublic void onScopeReset(Observation.Context context) {ObservationHandler.super.onScopeReset(context);}@Overridepublic void onStop(Observation.Context context) {ObservationHandler.super.onStop(context);log.info("Stopping context {} ", context);}@Overridepublic 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 {@BeanNewSpanParser newSpanParser() {return new DefaultNewSpanParser();}@BeanMethodInvocationProcessor methodInvocationProcessor(NewSpanParser newSpanParser, Tracer tracer, BeanFactory beanFactory) {return new ImperativeMethodInvocationProcessor(newSpanParser, tracer, beanFactory::getBean, beanFactory::getBean);}@BeanSpanAspect 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
@EnableAspectJAutoProxypublic class SpringCloudApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudApplication.class, args);}
}

使用注解

在需要追踪的方法上使用 @NewSpan 注解,以创建新的 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 {@NewSpanpublic 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
@Slf4jpublic class MyController {@Autowiredcom.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-tracingserver:port: 8088servlet:context-path: /app
logging.pattern.level: "%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]"
management:zipkin:tracing:endpoint: http://localhost:9411/api/v2/spanstracing:sampling:probability: 1.0

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • GitHub - Harries/springcloud-demo: Spring Cloud tutorial about hystrix,eureka,config,admin,skywalking(Spring Cloud Sleuth)

4.测试

启动Spring Cloud应用

访问rest api

访问http://127.0.0.1:8088/app/hello,控制台输出日志

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

查看追踪数据

Micrometer Tracing 会自动收集追踪数据,并将其发送到配置的zipkin。你可以使用这些数据来分析请求的性能和调用链。

zipkin

5.结论

Micrometer Tracing 是一个强大的工具,可以帮助开发者和运维人员更好地理解和监控微服务架构中的请求流。通过简单的配置和使用,Micrometer Tracing 可以显著提高系统的可观察性,帮助团队快速识别和解决性能问题。在现代微服务架构中,采用 Micrometer Tracing 是提升应用程序性能和可靠性的有效手段。

6.引用

  • https://amithkumarg.medium.com/micrometer-tracing-in-spring-boot-context-propagation-for-async-scheduled-newspan-b80f4f4b2c9f
  • 如何在 Spring Cloud 集成 Micrometer Tracing? | Harries Blog™

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/61709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫专栏第五篇:Python BeautifulSoup 库全解析:从解析器到网页数据爬取实战

简介&#xff1a;本文围绕 Python 的 BeautifulSoup 库展开&#xff0c;介绍了其安装方式&#xff0c;详细解析了各类解析器&#xff08;如标准库、lxml 库、xml 库、html5lib 等&#xff09;的特点与作用&#xff0c;并通过代码案例展示不同解析器在实际应用中的表现。同时&am…

架构06-分布式共识

零、文章目录 架构06-分布式共识 1、分布式共识 &#xff08;1&#xff09;基本概念 **分布式共识&#xff1a;**在分布式系统中&#xff0c;多个节点之间达成一致的过程。**复杂性来源&#xff1a;**网络的不可靠性和请求的并发性。**应用场景&#xff1a;**如何确保重要数…

linux基础病毒编写

linux目录介绍 /bin二进制可执行命令/etc系统管理和配置文件/etc/rc.d启动的配置文件和脚本 /home用户主目录的基点/lib标准程序设计库&#xff0c;又叫动态链接共享库 /sbin超级管理命令&#xff0c;这里存放的是系统管理员使用的管理程序 /tmp公共的临时文件存储点 /root系统…

使用Apache HttpClient上传文件

Apache HttpClient是一个强大且灵活的库&#xff0c;用于处理Java中的HTTP请求。 它支持多种HTTP方法&#xff0c;并能处理不同类型的请求体&#xff0c;包括文件上传。本 教程将演示如何使用Apache HttpClient来向服务器上传文件。 Maven依赖 要使用Apache HttpClient&…

uni-app写的微信小程序每次换账号登录时出现缓存上一个账号数据的问题

uni-app写的微信小程序每次更换另外账号登录时出现缓存上一个账号数据的问题&#xff1f; 1&#xff0c; 清除缓存数据&#xff1a;在 onShow 钩子中&#xff0c;我们将 powerStations、list 和 responseRoles 的值重置为初始状态&#xff0c;以清除之前的缓存数据。 2&…

初始Python篇(9)—— 函数

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 函数的定义及调用 函数的概念 函数的定义 函数的调用 水仙花数等自幂数的练习 函数相关参数的概念 函数的返回值 变…

【题解】—— LeetCode一周小结48

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结47 25.网络延迟时间 题目链接&#xff1a;743. 网络延迟时间 …

RK3568国产处理器 + TensorFlow框架的张量创建实验案例分享

一、实验目的 本节视频的目的是了解张量定义、了解张量的表示形式、并学习基于TensorFlow框架的张量创建方法。 二、实验原理. 张量定义 1、张量是多维数组&#xff0c;这个定义常见于各种人工智能软件。 2、张量是某种几何对象&#xff0c;不会随着坐标系的改变而改变。 3…

SpringMVC:SpringMVC的bean加载机制

问题分析 入门案例的内容已经做完了&#xff0c;在入门案例中我们创建过一个SpringMvcConfig的配置类&#xff0c;再回想前面咱们学习Spring的时候也创建过一个配置类SpringConfig。这两个配置类都需要加载资源&#xff0c;那么它们分别都需要加载哪些内容? 我们先来看下目前…

张伟楠动手学强化学习笔记|第一讲(上)

张伟楠动手学强化学习笔记|第一讲&#xff08;上&#xff09; 人工智能的两种任务类型 预测型任务 有监督学习无监督学习 决策型任务 强化学习 序贯决策(Sequential Decision Making) 智能体序贯地做出一个个决策&#xff0c;并接续看到新的观测&#xff0c;知道最终任务结…

Navicat连接SQL Server

Navicat连接SQL Server 安装自带的SQL Server客户端 去到Navicat安装目录&#xff0c;找到安装程序&#xff0c;安装即可。 安装对应版本的Microsoft ODBC Driver for SQL Server 打开Navicat输入对应的SQL Server相关信息 然后点测试连接&#xff0c;提示连接成功。

子模块、Fork、NPM 包与脚手架概述

子模块 在 Git 仓库中嵌套另一个仓库&#xff0c;通过引用的方式引入到主项目&#xff0c;版本管理依赖 Git 提交记录或分支&#xff0c;更新需手动拉取并提交&#xff0c;适用于共享代码并保持项目独立性。 优点&#xff1a;子模块支持直接查看和修改&#xff0c;保持子模块…

将一个数组逆序输出。-多语言

目录 C 语言实现 方法 1: 交换元素 方法 2: 使用辅助数组 方法 3: 使用递归 方法 4: 使用标准库函数&#xff08;C99及以上&#xff09; 总结 Python 实现 方法 1: 交换元素 方法 2: 使用切片 方法 3: 使用 reversed() 函数 方法 4: 使用 list.reverse() 方法 方法…

传智杯 A字符串拼接

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 键盘输入两个字符串&#xff0c;将这两个字符串进行拼接后输出。 输入描述: 键盘输入两个字符串 输出描述: 输出两个字符串拼接后的结果 示例1 输入 hello nihao 输出 helloni…

js高级-ajax封装和跨域

ajax简介及相关知识 原生ajax AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。 按需请求&#xff0c;可以提高网站的性能 AJ…

WEB开发: 丢掉包袱,拥抱ASP.NET CORE!

今天的 Web 开发可以说进入了一个全新的时代&#xff0c;前后端分离、云原生、微服务等等一系列现代技术架构应运而生。在这个背景下&#xff0c;作为开发者&#xff0c;你一定希望找到一个高效、灵活、易于扩展且具有良好性能的框架。那么&#xff0c;ASP.NET Core 显然是一个…

D82【python 接口自动化学习】- pytest基础用法

day82 pytest初体验 学习日期&#xff1a;20241128 学习目标&#xff1a;pytest基础用法 -- pytest初体验 学习笔记&#xff1a; 文件命名规范 py测试文件必须以test_开头&#xff08;或_test结尾&#xff09;测试方法必须以test开头测试类必须以Test开头&#xff0c;并且…

前端面试热门题(二)[html\css\js\node\vue)

Vue 性能优化的方法 Vue 性能优化的方法多种多样&#xff0c;以下是一些常用的策略&#xff1a; 使用v-show替换v-if&#xff1a;v-show是通过CSS控制元素的显示与隐藏&#xff0c;而v-if是通过操作DOM来控制元素的显示与隐藏&#xff0c;频繁操作DOM会导致性能下降。因此&am…

HarmonyOS4+NEXT星河版入门与项目实战(23)------实现手机游戏摇杆功能

文章目录 1、案例效果2、案例实现1、代码实现2、代码解释4、总结1、案例效果 2、案例实现 1、代码实现 代码如下(示例): import router from @ohos.router import {ResizeDirection } from @ohos.UiTest import curves

MySQL--视图

目录 1 认识视图 1.1 视图的定义 1.1 创建视图 1.2 查询 1.3 修改 1.4 删除 1.5 视图的优缺点 1.5.1 优点 1.5.2 缺点 1.6 视图的类型 1.7 视图与物化视图 2 视图检查选项 2.1 CASCADED 2.2 LOCAL 3 视图更新及作用 3.1 视图案列结合 3.1.1 屏蔽敏感数据 3.1…