链路追踪学习三:跨服务,跨进程追踪

本文涉及的产品
可观测链路 OpenTelemetry 版,每月50GB免费额度
简介: 链路追踪学习三:跨服务,跨进程追踪

traceId

首先,我们要了解,跨服务追踪需要有个traceId标识,以及其他需要传递的链路数据:

carrier := opentracing.HTTPHeadersCarrier{}  //声明一个数据载体
err := span.Tracer().Inject(span.Context(), opentracing.HTTPHeaders, carrier) //将span的数据格式化进载体
for key, value := range carrier {
   fmt.Printf("traceId: %v => %v \\n", key, value)
}

获取traceId以及组装父span做调用

获取到载体数据后,可通过http header,rpc等方式将数据传递,在调用方接收:

var carrierHeader http.Header
carrierHeader = http.Header(carrier)   //carrier为调用的数据,格式化为header
carrier := opentracing.HTTPHeadersCarrier{}
carrier.Set("uber-trace-id", traceId)  //记录traceId
tracer := opentracing.GlobalTracer() //声明tracer
wireContext, err := tracer.Extract( 
   opentracing.HTTPHeaders,
   opentracing.HTTPHeadersCarrier(header),
)
parentSpan := opentracing.StartSpan(
   "request-server",
   ext.RPCServerOption(wireContext))  //将carrier获得的数据存入新声明的span,这个span即为父span
defer parentSpan.Finish() //结束后完成该span
ctx = opentracing.ContextWithSpan(context.Background(), parentSpan) //通过该span获取上下文,之后的子span基于该上下文
//创建子span
span, _ := jaegerTool.WithSpan(ctx, "writeLog")
defer span.Finish() //结束后调用完成
span.LogFields(
   log.String("log", data),
)

最后结果:

image.png

相关实践学习
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
目录
相关文章
|
2月前
|
Linux C语言 C++
C/C++进程超详细详解【下部分】(系统性学习day8)
C/C++进程超详细详解【下部分】(系统性学习day8)
|
2月前
|
消息中间件 Linux API
C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)
C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)
|
2月前
|
Linux
Linux有名管道学习——实现两个进程的简单聊天
Linux有名管道学习——实现两个进程的简单聊天
76 0
|
17天前
|
存储 缓存 NoSQL
Redis系列学习文章分享---第十三篇(Redis多级缓存--JVM进程缓存+Lua语法)
Redis系列学习文章分享---第十三篇(Redis多级缓存--JVM进程缓存+Lua语法)
32 1
|
18天前
|
编解码 算法 程序员
老程序员分享:OpenGL学习进程(10)第七课:四边形绘制与动画基础
老程序员分享:OpenGL学习进程(10)第七课:四边形绘制与动画基础
|
21天前
|
存储 数据安全/隐私保护 Windows
逆向学习Windows篇:进程句柄操作详解
逆向学习Windows篇:进程句柄操作详解
12 0
|
2月前
|
算法 小程序 Java
多线程与并发编程【多线程与并发编程、 进程、线程的区别、 线程的创建】(一)-全面详解(学习总结---从入门到深化)
多线程与并发编程【多线程与并发编程、 进程、线程的区别、 线程的创建】(一)-全面详解(学习总结---从入门到深化)
50 1
|
2月前
|
Java 调度
【JAVA学习之路 | 提高篇】进程与线程(Thread)
【JAVA学习之路 | 提高篇】进程与线程(Thread)
|
2月前
|
消息中间件 Unix Linux
Linux的学习之路:17、进程间通信(1)
Linux的学习之路:17、进程间通信(1)
36 1
|
2月前
|
自然语言处理 Java Linux
【Linux】开始学习进程替换吧!
通过学习进程替换,我们可以体会到多语言混搭的快乐,可以从C语言直接蹦到python ,也可以从c++里运行java代码。是不是很厉害!这是通过调度多个进程的效果,联系我们之前学习的进程,进程控制等概念。我们可以想要运行其他代码可以通过创建子进程来实现,但是这样也肯定是同一种语言,如果想要运行其他语言,那是不是有种方法可以调度一个进程来当做子进程呢??? 我们开始今天的学习吧!
19 0