链路追踪工具之Zipkin

2023-11-16

Zipkin是一个分布式跟踪系统,Zipkin的设计是基于谷歌的Google Dapper论文,它可以帮助收集时间数据,在microservice架构下,通过链路追踪,可以便捷的分析服务调用延迟问题。每个应用程序向Zipkin server端报告数据,Zipkin UI呈现了一个依赖图表来展示多少跟踪请求经过了每个应用程序。

追踪器驻留在应用程序里,并且记录发生操作的时间和元数据。他们经常装配在库上,所以对用户来说是透明的。举个例子,一个装配过的 Web 服务器,会在接收请求和发送响应进行记录。收集的追踪数据叫做 Span(跨度)。用于向 Zipkin 发送数据的组件叫做 Reporter。Reporter 通过 Transport 发送追踪数据到 Zipkin 的 Collector,Collector 持久化数据到 Storage 中。之后,API 从 Storage 中查询数据提供给 UI。

如下图所示,装配库发送的跨度必须由装配的服务Transport传输到 Collector,当追踪数据抵达Zipkin Collector守护进程,Zipkin Collector为了查询,会对其进行校验、存储和索引。Storage部分,Zipkin最初将数据存储在Cassandra中,因为Cassandra易跨站,支持灵活的schema,并且在Twitter内部被大规模使用。后来将Storage修改成了可插拔式的,除Cassandra之外,原生支持ElasticSearch和MySQL,可作为第三方扩展提供给其它后端。一旦数据被存储索引,就需要一种方式提取它。查询守护进程提供了一个简单的JSON API查询和获取追踪数据。API的主要消费者就是Web UI。Web UI提供了基于服务、时间和标记(annotation)查看追中数据的方法。

上面是从架构方面来了解Zipkin,接下来了解一些链路追踪的基本概念。

Trace:代表一个完整的调用链。一个 trace 对应一个随机生成的唯一的 traceId。例如一个 HTTP 请求到响应是一个trace。一个 trace 内部包含多个 span。

Span:Trace 中的一个基本单元。一个 span 同样对应一个随机生成的唯一的 spanId。例如一个 HTTP 请求到响应过程中,内部可能会访问型数据库执行一条 SQL,这是一个新的span,或者内部调用另外一个服务的 HTTP API也是一个新的span。一个trace中的所有span是一个树形结构,树的根节点叫做root span。除root span外,其他span都会包含一个parentId,表示父级 span 的 spanId。

Annotation:每个span中包含多个annotation,用来记录关键事件的时间点。例如一个对外的HTTP请求从开始到结束,依次有以下几个 annotation:

cs Client Send,客户端发起请求的,这是一个span的开始

sr Server Receive,服务端收到请求开始处理

ss Server Send,服务端处理请求完成并响应

cr Client Receive,客户端收到响应,这个 span 到此结束

如下图所示,在一个简单的应用中埋点后,即可在Zipkin server的UI上查看到链路信息,可以看到链路中显示了Span Id、Parent Id、Annotation等信息。除了这些信息外,还有tag信息,tag如果不进行自定义的话,就显示默认生成的tag信息。

那如何在应用中实现埋点收集应用的追踪数据呢?Zipkin支持很多Instrument libraries,支持不同技术栈语言,对于Java而言,Instrument Libraries可以选择Brave或者Spring-cloud-sleuth等。Brave是Zipkin官网提供的Instrument Library,此篇博客使用Brave Library,介绍如何在客户端应用埋点完成trace数据收集。实际Zipkin官网提供了用Brave编写的多个example例子。以webmvc4-boot example为例,最重要的配置文件是TracingAutoConfiguration。为了实现埋点收集数据,需要创建Tracing对象。

如上图所示,在创建Tracing对象时,各个参数含义是什么呢?

localServiceName:服务的名称

spanReporter:指定一个 Reporter<zipkin2.Span> 对象作为埋点数据的提交方式,这里通常会使用静态方法 AsyncReporter.create(Sender sender) 来创建一个 AsyncReporter 对象,当然如果有特殊需求也可以自己实现Reporter接口来自定义提交方式。创建AsyncReporter对象需要提供一个 Sender,下面列出了一些官方提供的 Sender 可供选择:

zipkin-sender-okhttp3 使用 OkHttp3 提交,使用方法:sender = OkHttpSender.create("http://localhost:9411/api/v2/spans")

zipkin-sender-urlconnection 使用 Java 自带的 java.net.HttpURLConnection 提交,使用方法:sender = URLConnectionSender.create("http://localhost:9411/api/v2/spans")

zipkin-sender-activemq-client 使用 ActiveMQ 消息队列提交,使用方法:sender = ActiveMQSender.create("failover:tcp://localhost:61616")

zipkin-sender-kafka 使用 Kafka 消息队列提交,使用方法:sender = KafkaSender.create("localhost:9092")

zipkin-sender-amqp-client 使用 RabbitMQ 消息队列提交,使用方法:sender = RabbitMQSender.create("localhost:5672")

currentTraceContext:指定一个 CurrentTraceContext 对象来设置 TraceContext 对象的作用范围,通常会使用 ThreadLocalCurrentTraceContext,也就是用 ThreadLocal 来存放 TraceContext。TraceContext 包含了一个 trace 的相关信息,例如 traceId。

在CurrentTraceContext中可以添加 ScopeDecorator,通过 MDC (Mapped Diagnostic Contexts)机制关联一些日志框架:

brave-context-slf4j SLF4J

brave-context-log4j2 Log4J 2

brave-context-log4j12 Log4J v1.2

为了在Zipkin中显示链路显示,除了在webmvc4-boot启动Frontend和Backend服务外,还需要启动Zipkin服务端应用,启动命令如下:服务端启动成功后,即可在Zipkin UI中查看链路调用信息。

curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar

上面介绍了采用brave instrument采集trace信息,对于Java应用还可以用Spring-cloud-sleuth。Spring-cloud-sleuth使用brave框架完成trace信息收集。如果要使用spring-cloud-sleuth,首先在pom.xml文件中添加相关依赖。下面是frontend服务的主要代码,可以看到自动注入了RestTemplate,通过RestTemplate调用后端服务。因为注入了一个RestTemplate拦截器,故可以将所有跟踪信息传递给请求。每次调用时,会创建一个新的Span。需要注意一点是:必须将RestTemplate注册为bean,以便注入拦截器。如果使用new关键字创建RestTemplate实例,instrument将不起作用。

在backend服务中,如果要在跟踪信息中自定义tag等,那么可以通过tracer对象添加tag信息,如果想自定义追踪的信息,那么可以通过设置SleuthCommonRequestFilter完成。例如,下面设置了filter.setIncludeHeader(true),那么在上传到zipkin的追踪信息中就包含每次请求的header信息。

利用Tracer对象可以创建新的span,给span定义tag等,具体代码如下所示:

启动zipkin server端,启动frontend服务和backend服务,调用frontend的api,即可在zipkin上查看到链路追踪信息。追踪信息如下图所示,可以看到自定义的tag信息,以及追踪信息里面包含header等信息。

上面演示的Demo代码都已经上传到了github,可以下载进行尝试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链路追踪工具之Zipkin 的相关文章

随机推荐

  • Linq使用方法

    Linq是一种面向对象的查询方式 它和SQL语句及其类似 sql写法 select from 表 Linq写法 from n in 数据源 select n 为什么不跟sql写法一样将select一同写在语句的开头呢 主要是当时做IDE时考
  • elasticsearch安装部署和期间遇到的问题和解决

    因为工作需要用到elasticsearch 最近在测试环境部署单机版的elasticsearch服务 可以说是相当的波折 一个问题解决一个问题又来 都要吐血了已经 还好最终都得以解决 解决后那一刻真尼玛的爽啊啊啊 问题列表 elastics
  • 将本地项目上传到gitlab

    1 安装git https git scm com downloads 2 新建工程 3 创建密钥 a 桌面右键 b cd ssh 如果提示 No such file or directory 你可以手动的创建一个 ssh文件夹即可 mkd
  • 日本“性爱机器人”上线1小时被抢空

    来源 正商参阅 局座召忠 李开复 蒋东平网络等 日本 妻子 机器人被哄抢 不要房车不要彩礼 日本研发出一款 美女机器人 将其命名为 妻子 光看她的外形 你能识别出她其实只是一个机器人吗 60分钟售出万台 第一点就是人们所关注的价格方面 在日
  • node.js 环境安装(windows)

    准备需要安装的电脑 下载node js的安装包 地址 http nodejs cn download 下载的安装包双击打开 依次按照下图指示执行 下图点击接受 后下一步 下图 根据实际情况选择安装位置 如果记不住建议选择默认位置 直接点击n
  • 使用Python+VTK获取3D体渲染模型任意角度切面(更新中)

    目录 效果图 实现目标 安装依赖 Code 其他需求 效果图 废话少说先上效果图 右边红色的plane是想要获取3D模型对应切面的平面 左边是这个切面的切片的图像 实现目标 定义一个任意角度的切面 都能把体绘制模型的这个切面的图像获取 并且
  • LADRC的离散化实现(Mark一下,重新开始)

    LADRC的离散化实现 一 感慨 上一次写博客是两年前了 现在已经过了那么久 期间经历了许多事 有好有坏 不多大多时候是丧的 到了现在 终究让我相通了一件事情 深刻理解并追求自己想要做的事情是会幸福的 通过读了许多书 在b站上看了许多视频
  • 正则匹配emoji字符

    寻找emoji的编码范围 在这个网站中可以查看所有的emoji unicode Emoji Unicode table 用js代码找出这个页面所有emoji unicode 的范围 let list document querySelect
  • PostgreSql 数据库的访问权限配置

    本文主要简单的描述以下几个 在使用PostgreSql数据库时常见的 有关访问权限以及远程连接数据库的问题 及其解决办法 以下所述问题及解决办法都在postgresql8 0及windows 2003server的范围内 1 在本地使用po
  • 漫谈拥塞控制: pacing rate

    我基于综合效能结合排队论解释过 pacing 发送的益处 为什么 pacing 但该解释仍没有揭露 pacing 的本质 pacing 的本质是出让时间槽 出让时间槽无法降低整体等待时延 但可降低甚至消除抖动 即在任意短的采样周期内保持等待
  • CTF MISC解题思路BUUCTF MISC1-8刷题

    1 签题 扫描二维码到得flag 2 金 胖 题目为gif动画 用wps打开每帧保存成图片 flag就在其中几张图片 3 二维码 下载题目解压得到一个二维码图片 扫描没发现flag 使用010editor打开图片发现文件头为89 50 4E
  • [C语言]offseto宏的认识与模拟实现

    目录 1 offseto的认识 2 offseto的模拟实现 1 offseto的认识 在结构体中 因为内存对齐的存在我们需要进行计算才能知道结构体成员的地址对于结构体首地址的偏移量为多少 今天认识的offseto就是将结构体中成员地址对于
  • Day 13 - 正则表达式习题

    利用正则表达式完成下面的操作 1 用户名匹配 要求 1 用户名只能包含数字 字母 下划线 2 不能以数字开头 3 度在 6 到 16 位范围内 re username re compile r a zA Z w 5 15 print re
  • 2-3 处理缺失数据

    2 3 处理缺失数据 与本节相关的视频课程 处理缺失数据 检查缺失数据 基础知识 def foo pass f foo print f None type f NoneType None 2 TypeError unsupported op
  • sql月度汇总_【转】SQL语句统计每天、每月、每年的数据

    原文 https www cnblogs com fooo p 3435687 html sql语句统计每天 每月 每年的数据 1 每年 select year ordertime 年 sum total 销售合计 from 订单表 gro
  • C/C++面向过程与面向对象的区别

    C 是面向对象的 object oriented programming OOP 强调对象 由对象实施动作 C是面向过程的 procedure oriented programming POP 强调执行的过程 总结起来就是 面向对象是首先抽
  • 给mp3播放器增加音乐波形显示功能

    给mp3播放器增加音乐波形显示功能 2008 04 02 16 18 18 分类 应用编程 标签 字号大中小 订阅 用过winamp的人都知道 winamp有一个音乐波形显示功能 当播放音乐的时候 有一些音乐波形跟着上下跳动 翩翩起舞 又好
  • 运动控制初始化

    1 设置控制器的名称 类型 2 加载控制器的dll 3 初始化X 输入 Y 输出 轴映射 4 设置每个轴的回零参数 5 设置每个轴的预备位 起点位 6 配置各个轴的限位信号 包括报警 复位 正负限位 原点 Ready信号 7 配置各个轴的运
  • js四舍五入

    1 Math round方法 Math round 方法可把一个数字舍入为最接近的整数 例如 Math round x 则是将x取其最接近的整数 简单例子 var num Math round 568 58 console log num
  • 链路追踪工具之Zipkin

    Zipkin是一个分布式跟踪系统 Zipkin的设计是基于谷歌的Google Dapper论文 它可以帮助收集时间数据 在microservice架构下 通过链路追踪 可以便捷的分析服务调用延迟问题 每个应用程序向Zipkin server