链路追踪工具之Zipkin

news2024/11/27 21:05:53

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,可以下载进行尝试。

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

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

相关文章

【高光谱、多光谱和全色图像融合】

HyperFusion: A Computational Approach for Hyperspectral, Multispectral, and Panchromatic Image Fusion &#xff08;超融合&#xff1a;高光谱、多光谱和全色图像融合的计算方法&#xff09; 高空间分辨率的高光谱图像&#xff08;HSI&#xff09;和多光谱图像&#xff…

链表热门面试题(二)

目录前言一、删除链表的倒数第 N 个结点二、两两交换链表中的节点三、旋转链表四、删除排序链表中的重复元素五、删除排序链表中的重复元素 II六、反转链表II七、删除链表中的节点八、奇偶链表前言 一、删除链表的倒数第 N 个结点 题目&#xff1a; 方法1&#xff1a;找到删除…

【Java多线程】创建多线程方式一

线程的创建和启动 *Java语言的JVM允许程序运行多个线程&#xff0c;它通过java.lang.Thread类来体现。 *Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的&#xff0c;经常 把run()方法的主体称为线程体 通过该Thread对象的start()方法来启动这个…

判断两条线段是否相交

参考链接&#xff1a; 1 2 一、判断线段是否相交需要下面两步&#xff1a; &#xff08;1&#xff09;快速排斥实验 &#xff08;2&#xff09;跨立实验 二、第一步快速排斥实验 对上图两条L1,L2线段来说&#xff0c;L1 x的最大值为d端点x5&#xff0c;L2 x的最小值为a端点x…

RobotFramework环境安装和入门

环境安装1、安装python建议版本3.7&#xff0c;Robot Framework不支持python最新版。 可以通过以下地址下载https://www.python.org/ftp/python/3.7.3/python-3.7.3-amd64.exe安装过程中选择添加到环境变量。2、安装Robot Framework以及所需组件注意各个组件的版本号&#xff0…

LVGL学习笔记15 - 文本框TextArea

目录 1. Parts 2. 样式 2.1 修改背景bg 2.2 修改边界border 2.3 修改文本 2.3.1 lv_textarea_add_char 2.3.2 lv_textarea_add_text 2.3.3 lv_textarea_set_text 2.3.4 设定可输入的字符 2.3.5 删除字符 2.3.6 设定字符串最大长度 2.4 滚动条 2.4.1 滚动方向 2.4.2 …

RHCE学习笔记-133-1

RH133-01 installation 光盘引导后,在提示符下输入:linux askmethod 可以支持:local cdrom,hard drive,nfs image,ftp,http方式 cpu on x86 2个物理超线程CPU 使用smp or hugemem kernel可以支持 32个物理cpus 内存 标准x86 kernel 4G smp i686/athlon kernel 16G hugemem SMP …

创建新分支,基于某一分支创建新分支,git push --set-upstream origin

背景&#xff1a; 基于hcc1.2的开发分支拉去hcc_hotfix_1.2.0分支&#xff0c;解读&#xff1a;在仓库中基于某个分支&#xff0c;创建一个新的分支 做法&#xff08;解决&#xff09;&#xff1a; 1、第一步&#xff1a;git branch hcc_hotfix_1.2.0 2、第二步&#xff1a;g…

葡萄城邀您参与「表格技术开发者新年分享会」,共话表格技术新未来!

数据资产是企业最重要的资产之一&#xff0c;表格也是企业最普遍的数据整理手段。在数字经济时代&#xff0c;各行业飞速发展&#xff0c;拥抱数字化、进行数字化升级已成为大势所趋&#xff0c;企业对协同办公、大数据分析、表格智能化应用等领域的需求也呈爆发式增长&#xf…

GrapeCity Documents Image Viewer JavaScript Crack

GrapeCity Documents Image Viewer 是跨平台 JavaScript 图像查看器 允许用户使用我们的 JavaScript 图像查看器在您的 Web 应用程序中查看和编辑图像。采集 by Ω578867473 支持多种图像格式 适用于所有现代浏览器和框架&#xff0c;包括 Edge、Chrome、Firefox、Opera、Saf…

【UE4 第一人称射击游戏】33-创建一个小地图

上一篇&#xff1a;【UE4 第一人称射击游戏】32-添加击杀AI的提示功能&#xff08;使用到控件蓝图的动画功能&#xff09;本篇效果&#xff1a;可以看到左上角完成了小地图的制作步骤&#xff1a;打开名为“FPSHUD”的控件蓝图&#xff0c;拖入一个图像控件&#xff0c;表示迷你…

Diffusion 和Stable Diffusion的数学和工作原理详细解释

扩散模型的兴起可以被视为人工智能生成艺术领域最近取得突破的主要因素。而稳定扩散模型的发展使得我们可以通过一个文本提示轻松地创建美妙的艺术插图。所以在本文中&#xff0c;我将解释它们是如何工作的。 扩散模型 Diffusion 扩散模型的训练可以分为两部分: 正向扩散→在图…

输出全排列(C++版)

目录 输出全排列 一、问题描述 二、运行环境说明 ​三、代码段 四、效果展示 输出全排列 备注&#xff1a;大二&#xff08;上&#xff09;数据结构课程设计A题 一、问题描述 请编…

我是如何利用cps平台赚钱的?

你好&#xff0c;我是你们熟悉而又陌生的好朋友梦龙&#xff0c;一个创业期的年轻人 今天跟你做个分享&#xff0c;众所周知互联网是一块非常大的蛋糕&#xff0c;几位互联网巨头也做不到完全吃透&#xff0c;这次梦龙给你分享的是实际的经验&#xff0c;实际的案例分享。 最开…

Spring存储和读取对象 -- 2

Spring存储和读取对象 -- 2前言一、存储 Bean 对象1.1 前置工作&#xff1a;配置扫描路径 (重要)1.2 添加注解存储 Bean 对象1.2.1 五大类注解Bean 命名规则1.2.2 方法注解 BeanBean 命名规则与重命名二、获取 Bean 对象 (对象注入)2.1 属性注入优点分析缺点分析2.2 Setter 注入…

如何在Jetbrain Rider中使用EntityFrameWork (Core) 命令行,如添加迁移和更新数据库

在Visual Studio中&#xff0c;EntityFrameWork命令如Add-Migration和Update-Database通常在包管理器控制台中运行。这在Visual Studio中工作得很好&#xff0c;但不幸的是&#xff0c;它不是可移植的。这些命令是基于powershell的&#xff0c;并且包管理器控制台绑定了Visual …

开源的文档型数据库--MongoDB(安装)

1、简介 MongoDB 是一个开源的、文档数据库管理系统。它提供了高性能、高可扩展性和高可用性。 MongoDB 使用了一种称为 BSON 的二进制形式的 JSON 来存储数据。这使得 MongoDB 可以轻松地存储各种数据类型&#xff0c;包括大型对象和二进制文件。 MongoDB 的一个重要特性是它的…

多线程1.

多线程1 1.如果想对地址空间的堆区做更细腻化的空间管理&#xff0c;怎么办&#xff1f; 搞一个vim_area_struct&#xff0c;他是一个双向链表。每一个节点是一块堆区空间&#xff0c;用链表串起来。 2.如何管理物理内存&#xff1f; 设定一个数据结构&#xff0c;如&#x…

电子会议桌牌

产品特色&#xff1a; 低功耗&#xff0c;常规使用3-5年电池寿命支持空中唤醒&#xff0c;刷新快速&#xff0c;几秒钟内看到结果点阵电子纸屏幕&#xff0c;视角接近180基于Web的应用界面&#xff0c;支持跨平台操作安装简单&#xff0c;快速布置电池供电不需要布线双面显示&…

神经网络模型的参数量和FlOPS

一、FLOPS、FLOPs和GFLOPs的概念 FLOPS&#xff1a;注意S是大写&#xff0c;是 “每秒所执行的浮点运算次数”&#xff08;floating-point operations per second&#xff09;的缩写。它常被用来估算电脑的执行效能&#xff0c;尤其是在使用到大量浮点运算的科学计算领域中。正…