opentracing(开放分布式追踪) + jaeger初探

简介: 以下是小马整理总结的入门理解笔记,助于入门和理解分布式链路追踪,opentracing(开放分布式追踪) + jaeger。

以下是小马整理总结的入门理解笔记,助于入门和理解分布式链路追踪,opentracing(开放分布式追踪) + jaeger。

一、背景

举个例子,一个场景下,一个请求进来,入口服务是 serviceA, serviceA 接到请求后访问数据库读取用户数据,然后向 serviceB 发起 rpc,serviceB 收到 rpc 请求时同时向后端服务 serviceC 和 serviceD 发起请求,等待请求回复后再返回 serviceA 的 rpc 调用。如果我们发现发起的请求失败,或者请求的时延很大,我们该如何去定位呢?

基于这个需求,我们将服务介入追踪系统。相比单体的系统,在分布式,微服务系统中似乎更能发挥重要性。

二、OpenTracing

opentracing(中文文档)是一套分布式追踪协议,与平台,语言无关,统一接口,方便开发接入不同的分布式追踪系统。

语义规范: 描述定义的数据模型 Tracer,Span和 SpanContext 等;

语义惯例: 罗列出 tag 和 logging 操作时,标准的key值;

trace和span:

小马把它通俗理解为这两为追踪系统的数据结构。用于传递链路调用中的信息。
image.png

三、Jaeger

那么这个数据结构/协议怎么在整个系统调用链路中穿梭呢?借助Jaeger来看看。

Jaeger (ˈyā-gər) 是Uber开源的一个基于Go的分布式追踪系统,受启发于 dapper 和 OpenZipkin,兼容 OpenTracing 标准,CNCF的开源项目。(这段百科是没有的哈)
image.png

组成部分


image.png

和上图一个意思


什么意思呢?借用一下别的朋友整理的内容来看。整个过程说起来非常简单,Client写入trace数据,传递到正在监听的Agent,Agent将span等数据发到Collector, Collector将数据存储,后面就是提供UI和query了。

四、代码中实现

如何部署呢?集成后镜像安装比较简单,这里就不赘述了。GO语言为例,来看下调用,以下样例代码来自其他文章,仅供参考理解,非小马亲践,感谢作者分享,原文传送门。

小马理解为就是在解决span数据的传递。

1、单体中通过上下文调用
image.png

关键代码


2、跨应用通过grpc中间件使用

在单体程序中, 父子Span通过context关联, 而context是在内存中的, 显而易见这样的方法在垮应用的场景下是行不通的。跨应用通讯使用的方式通常是"序列化", 在jaeger-client-go库中也是通过类似的操作去传递信息, 它们叫:Tracer.Inject() 与 Tracer.Extract()。

其中inject方法支持将span系列化成几种格式:

Binary: 二进制

TextMap: key=>value

HTTPHeaders: Http头, 其实也是key=>value

正好grpc支持传递metadata也是string的key=>value形式, 所以我们就能通过metadata实现在不同应用间传递Span了。

写好服务端,客户端后,在业务代码中封装方法监控到程序中的代码片段(如方法):
image.png

关键代码


调用:
image.png

可见,使用trace会入侵部分代码,特别是追踪一个方法,但这是不可避免的。甚至需要每个方法都需要添加上ctx。

思考:日志流水号是如何传递的,每条链路全局name还是span父级名称还是span中的某个数据?

image.png

相关文章
|
6月前
|
存储 数据采集 监控
SkyWalking全景解析:从原理到实现的分布式追踪之旅
SkyWalking全景解析:从原理到实现的分布式追踪之旅
1221 1
EMQ
|
6月前
|
存储 NoSQL API
EMQX Enterprise 5.4 发布:OpenTelemetry 分布式追踪、OCPP 网关、Confluent 集成支持
新版本提供 OpenTelemetry 分布式追踪与日志集成功能,新增了开放充电协议 OCPP 协议接入能力,并为数据集成添加了 Confluent 支持。此外,新版本还进行了多项改进以及 BUG 修复,进一步提升了整体性能和稳定性。
EMQ
1192 13
EMQX Enterprise 5.4 发布:OpenTelemetry 分布式追踪、OCPP 网关、Confluent 集成支持
|
6月前
|
Prometheus 监控 Cloud Native
Golang深入浅出之-Go语言中的分布式追踪与监控系统集成
【5月更文挑战第4天】本文探讨了Go语言中分布式追踪与监控的重要性,包括追踪的三个核心组件和监控系统集成。常见问题有追踪数据丢失、性能开销和监控指标不当。解决策略涉及使用OpenTracing或OpenTelemetry协议、采样策略以及聚焦关键指标。文中提供了OpenTelemetry和Prometheus的Go代码示例,强调全面可观测性对微服务架构的意义,并提示选择合适工具和策略以确保系统稳定高效。
220 5
|
6月前
|
数据采集 存储 运维
如何使用SkyWalking收集分析分布式系统的追踪数据
通过以上步骤,你可以使用 SkyWalking 工具实现对分布式系统的数据采集和可视化。SkyWalking 提供了强大的追踪和度量功能,帮助开发者和运维人员更好地理解系统的性能状况。欢迎关注威哥爱编程,一起学习成长。
157 0
|
存储 监控 数据可视化
使用Jaeger进行分布式跟踪:学习如何在服务网格中使用Jaeger来监控和分析请求的跟踪信息
使用Jaeger进行分布式跟踪:学习如何在服务网格中使用Jaeger来监控和分析请求的跟踪信息
128 0
|
前端开发 Cloud Native JavaScript
《深入分布式追踪:OpenTracing 实践手册》
《深入分布式追踪:OpenTracing 实践手册》
207 0
|
存储 监控 Java
Spring Boot 中的分布式追踪
Spring Boot 中的分布式追踪
|
JSON Java 数据格式
springboot 集成tlog 实现分布式日志标记追踪
springboot 集成tlog 实现分布式日志标记追踪
1244 0
|
存储 机器学习/深度学习 人工智能
一文读懂分布式追踪:过去、现在和未来
Hello folks,我是 Luga,今天我们来聊一下云原生生态体系可观测性核心之——分布式追踪技术。
498 0
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?

热门文章

最新文章