简介

jaeger是一个比较有名的分布式链路追踪系统,底层用golang实现,兼容opentracing标准。

部署

我们用docker部署,集成整套环境all-in-one,docker地址:https://hub.docker.com/r/jaegertracing/all-in-one

注意: 在 all in one 模式下,jaeger 存储数据使用的是内存,因此重启 dockre 后就看不到之前的数据了。所以,该模式仅用于前期的 demo 或者测试验证,不可在生产环境中使用这种模式部署

直接运行docker命令安装:

docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 9411:9411 \
jaegertracing/all-in-one:latest

执行完成后,用

命令:docker ps

看看运行起来没,这里看结果已经运行了:

访问jaeger的web界面:

localhost:16686

如果你是远程,这里的localhost可以换成你的服务器ip,或者你配置的域名。

简单demo

先编写一个初始化jaeger tracer的initJaeger方法:

此时我们要在reporter中配置jaeger Agent的ip与端口,以便将tracer的信息发布到agent中。配置LocalAgentHostPort参数为127.0.0.1:6381,6381接口是接受压缩格式的thrift协议数据。如果是远程这里的 127.0.0.1 可以设置为你远程ip地址。

采样率暂且设置为1

func initJaeger(service string) (opentracing.Tracer, io.Closer) {
cfg := &config.Configuration{
Sampler:&config.SamplerConfig{
Type: "const",
Param:1,
},
Reporter: &config.ReporterConfig{
LogSpans: true,
LocalAgentHostPort: "127.0.0.1:6831",
},
}
tracer, closer, err := cfg.New(service, config.Logger(jaeger.StdLogger))
if err != nil {
panic(fmt.Sprintf("Error: connot init Jaeger: %v\n", err))
}
return tracer, closer
}

然后我们在main函数中创建调用InitJaeger,并创建一个root span,调用两个函数,分别表示调用两个分布式服务。

我们用ContextWithSpan来创建一个新的ctx,将span的信息与context关联,传到TestDemo中时,需要创建一个子span,父span是ctx中的span。

我们在TestDemo中调用StartSpanFromContext时,忽略了第二个参数,这是利用子span创建的新的context,当我们在TestDemo中再调用别的比如TestDemo2时,我们应该使用新的context,而不是传入的ctx。

注意StartSpanFromContext会用到opentracing.SetGlobalTracer()来启动新的span,所以在main函数中需要调用。

func TestDemo(req string, ctx context.Context) (reply string) {
// 1. 创建span
span, _ := opentracing.StartSpanFromContext(ctx, "span_testdemo")
defer func() {
// 4. 接口调用完,在tag中设置request和reply
span.SetTag("request", req)
span.SetTag("reply", reply)
span.Finish()
}() println(req)
//2. 模拟耗时
time.Sleep(time.Second/2)
//3. 返回reply
reply = "TestDemoReply"
return
} // TestDemo2, 和上面TestDemo 逻辑代码一样
func TestDemo2(req string, ctx context.Context) (reply string) {
span, _ := opentracing.StartSpanFromContext(ctx, "span_testdemo2")
defer func() {
span.SetTag("request", req)
span.SetTag("reply", reply)
span.Finish()
}() println(req)
time.Sleep(time.Second/2)
reply = "TestDemo2Reply"
return
} func main() {
tracer, closer := initJaeger("jager-test-demo")
defer closer.Close()
opentracing.SetGlobalTracer(tracer) span := tracer.StartSpan("span_root")
ctx := opentracing.ContextWithSpan(context.Background(), span)
r1 := TestDemo("Hello TestDemo", ctx)
r2 := TestDemo2("Hello TestDemo2", ctx)
fmt.Println(r1, r2)
span.Finish()
}

运行demo:

go run simple/main.go

运行提交的span信息会打印出来:

21:57:30 debug logging disabled

21:57:30 Initializing logging reporter

21:57:30 debug logging disabled

Hello TestDemo

21:57:30 Reporting span 2163520004cced2a:4155a263b5147904:2163520004cced2a:1

Hello TestDemo2

21:57:31 Reporting span 2163520004cced2a:01928bf482621c17:2163520004cced2a:1

TestDemoReply TestDemo2Reply

21:57:31 Reporting span 2163520004cced2a:2163520004cced2a:0000000000000000:1

然后在去jaeger UI上刷新查看,会出现记录:

可以发现有分层,时间耗时也明显,接口先后调用也很清晰。

点击上面的 jager-test-demo 进去,可以看到下面的这种调用情况:

参考

golang微服务实践:分布式链路追踪系统-jaeger安装与简单使用的更多相关文章

  1. NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

    对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操作查看日志,那么,随着业务越来越复杂,企业应用也进入了分布式服务化的 ...

  2. 分布式链路追踪系统Sleuth和ZipKin

    1.微服务下的链路追踪讲解和重要性 简介:讲解什么是分布式链路追踪系统,及使用好处 进行日志埋点,各微服务追踪. 2.SpringCloud的链路追踪组件Sleuth 1.官方文档 http://cl ...

  3. 基于zipkin分布式链路追踪系统预研第一篇

    本文为博主原创文章,未经博主允许不得转载. 分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Infras ...

  4. zipkin分布式链路追踪系统

    基于zipkin分布式链路追踪系统预研第一篇   分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Inf ...

  5. SkyWalking+SkyApm-dotnet分布式链路追踪系统

    SkyWalking+SkyApm-dotnet分布式链路追踪系统 对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操 ...

  6. 使用Skywalking分布式链路追踪系统

    使用Skywalking分布式链路追踪系统 https://www.cnblogs.com/sunyuliang/p/11424848.html 当我们用很多服务时,各个服务间的调用关系是怎么样的?各 ...

  7. 微服务架构学习与思考(09):分布式链路追踪系统-dapper论文学习

    一.技术产生的背景 1.1 背景 先来了解一下分布式链路追踪技术产生的背景. 在现在这个发达的互联网世界,互联网的规模越来越大,比如 google 的搜索,Netflix 的视频流直播,淘宝的购物等. ...

  8. 在spring boot中三分钟上手apache顶级分布式链路追踪系统skywalking

    原文:https://juejin.im/post/5cd10e81e51d453b560f2d53 skywalking在apache里全票通过成为了apache顶级链路追踪系统 项目地址:gith ...

  9. Golang微服务实践

    背景 在之前的文章<漫谈微服务>我已经简单的介绍过微服务,微服务特性是轻量级跨平台和跨语言的服务,也列举了比较了集中微服务通信的手段的利弊,本文将通过RPC通信的方式实现一个增删查Redi ...

  10. Golang微服务:Micro Trace使用opentracing jaeger

    trace Micro通过Wrapper实现了三种trace接口,aswxray,opencensus,opentracing,这里主要关注opentracing,opentracing已成为行业标准 ...

随机推荐

  1. [转帖]命令行非明文密码连接 TiDB

    https://tidb.net/blog/6794a34b#%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%9A%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BE ...

  2. [转帖] 记一次使用gdb诊断gc问题全过程

    记一次使用gdb诊断gc问题全过程   原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 上次解决了GC长耗时问题后,系统果然平稳了许多,这是之前的文章<G ...

  3. 疯狂GC的第二种处理方式-ChatGPT的学习之四

    疯狂GC的第二种处理方式-ChatGPT的学习之四 摘要 上一个脚本太复杂了. 而且要改启动脚本. 课间休息跟人扯淡聊起来 chatGPT 发现他的语法很有用 但是思路不太对. 不过突然根据文档里写的 ...

  4. [转帖]armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别

    ARM处理器指令集 一. 苹果模拟器指令集: 指令集 分析 i386 针对intel通用微处理器32架构的 x86_64 针对x86架构的64位处理器 i386|x86_64 是Mac处理器的指令集, ...

  5. [转帖]Python连接Oracle数据库进行数据处理操作

    https://www.dgrt.cn/a/2259443.html?action=onClick 解决以下问题: Python连接Oracle数据库,并查询.提取Oracle数据库中数据? 通过Py ...

  6. [转帖]Elasticsearch 技术分析(七): Elasticsearch 的性能优化

    https://www.cnblogs.com/jajian/p/10176604.html 硬件选择# Elasticsearch(后文简称 ES)的基础是 Lucene,所有的索引和文档数据是存储 ...

  7. [转帖]记录自己安装内存带宽测试工具——Stream过程

    测试环境: CPU:Kunpeng 920 8Core MEM:16G Storage:200G OS:openEuler 20.03 (LTS-SP3) 1 服务器资源监控工具--Stream 1. ...

  8. React中生命周期的讲解

    什么是生命周期? 从出生到成长,最后到死亡,这个过程的时间可以理解为生命周期. React中的组件也是这么一个过程. React的生命周期分为三个阶段:挂载期(也叫实例化期).更新期(也叫存在期).卸 ...

  9. NextJs 与 Tailwind 入门开发笔记

    前言 距离上次更新已经过去好久了,之前我在 StarBlog 博客2023年底更新一览的文章里说要使用 Next.js 来重构博客前端,最近也确实用 next.js 做了两个小项目,一个是单点认证项目 ...

  10. Python 潮流周刊第 29 期(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...