Micrometer+Zipkin 分布式链路追踪

ops/2025/1/21 13:04:47/

Micrometer+Zipkin


分布式链路追踪(Distributed Tracing)是一种用于监控和分析分布式系统性能的技术。它允许开发人员和运维人员追踪请求在分布式系统中的传播路径,包括跨服务调用、数据库访问、缓存查询等操作。通过分布式链路追踪,可以深入了解系统的运行状况,快速定位和解决问题,提高系统的稳定性和性能。

分布式链路追踪的关键概念

  1. Trace一次分布式请求的全链路调用过程被称为一个Trace。Trace是分布式链路追踪的基本单位,它包含了请求在分布式系统中经过的所有节点和服务的信息。

  2. SpanSpan是Trace的基本组成单元,代表一个逻辑工作单元,例如一次远程调用或一次数据库查询。每个Span都有一个唯一的标识符(Span ID),以及一个可选的父Span标识符(Parent Span ID),用于表示Span之间的父子关系。

  3. AnnotationAnnotation是对Span的补充说明,用于记录一些关键事件,如请求的开始和结束时间、异常信息等。

  4. TagTag是Span的键值对标签,用于添加一些额外的信息,如HTTP请求的URL、方法名、状态码等。

  5. BaggageBaggage是一种跨进程传递的上下文信息,通常用于传递一些需要在整个Trace过程中共享的数据,如用户ID、会话ID等。

分布式链路追踪的实现方式

实现分布式链路追踪通常有以下几种方式:

  1. 基于日志的追踪:通过在每个服务中记录详细的日志信息,包括请求的起始时间、结束时间、调用链信息等,然后通过日志分析工具进行聚合和分析。这种方式实现简单,但分析和查询效率较低。

  2. 基于代理的追踪:通过在服务之间插入代理(如Nginx、HAProxy等),代理会记录并转发请求,并在请求头中添加Trace信息。这种方式不需要修改服务代码,但会增加系统复杂度。

  3. 基于字节码的追踪:通过修改服务代码,在方法调用前后插入字节码,以记录Trace信息。这种方式需要修改服务代码,但可以实现更细粒度的追踪。

  4. 基于API的追踪:服务提供API接口,允许外部系统通过API获取Trace信息。这种方式需要服务支持相应的API接口,但灵活性较高。

常见的分布式链路追踪系统

  • Zipkin

Zipkin 是 Twitter 开源的一个分布式链路追踪系统,能够帮助用户收集和分析系统中的跟踪数据。Zipkin 的核心组件包括 Zipkin Collector、Zipkin Query 和 Zipkin Web UI。

  • Jaeger

Jaeger 是 Uber 开源的分布式链路追踪系统,设计初衷是解决微服务架构中的监控和故障排除问题。Jaeger 提供了与 Zipkin 类似的功能,并在可扩展性和性能上进行了优化。

  • OpenTelemetry

OpenTelemetry 是一个联合的开源项目,由 OpenTracing 和 OpenCensus 项目合并而来,旨在为分布式系统提供统一的监控、跟踪和日志收集工具。OpenTelemetry 提供了 SDK 和 API,支持多种编程语言,并与多种后端系统兼容。

Trace ID:

Trace ID 是一个全局唯一的标识符,用于标识一个完整的请求链路。在一个分布式系统中,当一个请求从客户端发起,经过多个服务节点处理后,最终返回给客户端,这个过程中涉及的所有服务节点上的操作都会被记录在一个 Trace 中。而 Trace ID 就是用来唯一标识这个 Trace 的。(通常在请求进入系统时生成,可以使用 UUID、雪花算法等方式来确保全局唯一性。)

Span ID:

Span ID 是一个局部唯一的标识符,用于标识 Trace 中的一个单独的操作单元(Span)。在一个 Trace 中,可能会有多个 Span,每个 Span 代表了一个具体的操作,如一次数据库查询、一次远程调用等。(在每个操作开始时生成,同样需要保证在局部范围内的唯一性。)

Trace ID 和 Span ID 的关系

  • 包含关系一个 Trace 包含多个 Span,每个 Span 都有一个唯一的 Span ID,而所有 Span 共享同一个 Trace ID。

  • 层次结构:通过 Trace ID 和 Span ID,系统可以构建一个清晰的请求链路层次结构。每个 Span 可以有子 Span,形成一个树状结构,而 Trace ID 就是这棵树的根节点。

  • 联合作用:Trace ID 和 Span ID 联合作用,使得系统能够完整地记录和展示一个分布式请求链路中的所有操作及其相互关系。

Zipkin

Zipkin是一种分布式链路跟踪系统图形化的工具,Zipkin 是 Twitter 开源的分布式跟踪系统,能够收集微服务运行过程中的实时调用链路信息,并能够将这些调用链路信息展示到Web图形化界面上供开发人员分析,开发人员能够从ZipKin中分析出调用链路中的性能瓶颈,识别出存在问题的应用程序,进而定位问题和解决问题。

下载主页:Quickstart · OpenZipkin icon-default.png?t=O83Ahttps://zipkin.io/pages/quickstart

Zipkin 的核心组件

Zipkin 的核心组件主要包括:

  • Zipkin Collector负责收集来自各个服务节点的追踪数据。这些数据通常包括 Trace ID、Span ID、操作名称、开始时间、结束时间、标签等信息。

  • Zipkin Storage负责存储收集到的追踪数据。Zipkin 支持多种存储后端,如内存、MySQL、Cassandra、Elasticsearch 等,用户可以根据实际需求选择合适的存储方案。

  • Zipkin Query提供 API 接口,允许用户通过 Trace ID、Span ID 等条件查询追踪数据。

  • Zipkin Web UI提供可视化界面,用户可以通过该界面查看和分析追踪数据,包括请求链路图、服务依赖关系图、性能指标等。

操作流程:

====================改pom闻文件,添加相关依赖(在父工程中声明)=======================
<!--micrometer-tracing-bom导入链路追踪版本中心  1-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bom</artifactId><version>1.2.0</version><type>pom</type><scope>import</scope>
</dependency>
<!--micrometer-tracing指标追踪  2-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing</artifactId><version>1.2.0</version>
</dependency>
<!--micrometer-tracing-bridge-brave适配zipkin的桥接包 3-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bridge-brave</artifactId><version>1.2.0</version>
</dependency>
<!--micrometer-observation 4-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-observation</artifactId><version>1.12.0</version>
</dependency>
<!--feign-micrometer 5-->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-micrometer</artifactId><version>12.5</version>
</dependency>
<!--zipkin-reporter-brave 6-->
<dependency><groupId>io.zipkin.reporter2</groupId><artifactId>zipkin-reporter-brave</artifactId><version>2.17.0</version>
</dependency>
 
==========================写yml文件,配置相关信息==================================
management:zipkin:tracing:endpoint: http://localhost:9411/api/v2/spanstracing:sampling:probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。
 
java">========================业务类,接口方法声明=======================================
@RestController
public class PayMicrometerController
{/*** Micrometer(Sleuth)进行链路监控的例子* @param id* @return*/@GetMapping(value = "/pay/micrometer/{id}")public String myMicrometer(@PathVariable("id") Integer id){return "Hello, 欢迎到来myMicrometer inputId:  "+id+" \t    服务返回:" + IdUtil.simpleUUID();}
}
 
java">@RestController
@Slf4j
public class OrderMicrometerController
{@Resourceprivate PayFeignApi payFeignApi;
​@GetMapping(value = "/feign/micrometer/{id}")public String myMicrometer(@PathVariable("id") Integer id){return payFeignApi.myMicrometer(id);}
}


http://www.ppmy.cn/ops/151918.html

相关文章

WPF基础 | 初探 WPF:理解其核心架构与开发环境搭建

WPF基础 | 初探 WPF&#xff1a;理解其核心架构与开发环境搭建 一、前言二、WPF 核心架构2.1 核心组件2.2 布局系统2.3 数据绑定机制2.4 事件处理机制 三、WPF 开发环境搭建3.1 安装 Visual Studio3.2 创建第一个 WPF 应用程序 结束语优质源码分享 WPF基础 | 初探 WPF&#xff…

游戏引擎学习第79天

当前任务回顾 我们目前的工作重点是碰撞检测的更新&#xff0c;特别是将游戏的世界表示方式扩展到三维空间。尽管游戏本身是二维的&#xff0c;但我们希望它能够在三维空间中处理更多的内容&#xff0c;以支持那些需要考虑高度的游戏元素&#xff0c;如楼层、台阶等。我们的目…

【HF设计模式】06-命令模式

声明&#xff1a;仅为个人学习总结&#xff0c;还请批判性查看&#xff0c;如有不同观点&#xff0c;欢迎交流。 摘要 《Head First设计模式》第6章笔记&#xff1a;结合示例应用和代码&#xff0c;介绍命令模式&#xff0c;包括遇到的问题、采用的解决方案、遵循的 OO 原则、…

WinHttp API接口辅助类实现GET POST网络通讯

1、简述 近期需要在MFC基础上开发网络Http通讯,开始使用的WinINet进行通讯,后面发现WinINet对连接超时这块不支持设置,在网上搜索了几种方式效果都不太好,于是决定用WinHttp API接口进行通讯,分别对GET、POST进行了封装。 2、使用到接口 2.1、WinHttpOpen WinHttpOpen 是…

Golang Gin系列-2:搭建Gin 框架环境

开始网络开发之旅通常是从选择合适的工具开始的。在这个全面的指南中&#xff0c;我们将引导你完成安装Go编程语言和Gin框架的过程&#xff0c;Gin框架是Go的轻量级和灵活的web框架。从设置Go工作空间到将Gin整合到项目中&#xff0c;本指南是高效而强大的web开发路线图。 安装…

1.简单的爬虫

1.数据在哪里&#xff1f; 在页面源码里 直接获取数据 不在页面源码里 找到真正获取数据的URL&#xff0c;再获取数据 2.requests模块 安装 pip install requests pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests抓网站文字数据 import requestsurl &qu…

《重生到现代之从零开始的C++生活》—— 类和对象1

类 我嘞个豆&#xff0c;类可是太重要了&#xff0c;简直是重中之重 class为定义类的关键字&#xff0c;stack为类的名字&#xff0c;{}为类的主题 class stack {void add (int a,int b){return ab;}//类的方法&#xff0c;成员函数int _c;int _d;//类的属性&#xff0c;成…

最长递增子序列问题(Longest Increasing Subsequence),动态规划法解决,贪心算法 + 二分查找优化

问题描述&#xff1a;在一个大小乱序的数列中&#xff0c;找到一个最大长度的递增子序列&#xff0c;子序列中的数据在原始数列中的相对位置保持不变&#xff0c;可以不连续&#xff0c;但必须递增。 输入描述&#xff1a; 第一行输入数列的长度 n。(1 < n < 200) 第二…