Logging,Metrics 与 Tracing 关系

:都是为了提高基础设施和应用程序的可观测性

区别

---- Logging Metrics Tracing
特点 记录离散的事件 记录可聚合的数据 记录请求范围内的信息
典型指标 用户自行打印的调试信息… QPS, 接口时延分布 一个具体 RPC 调用中的过程:各个服务的耗时占比
典型应用 ELK(收集,分析), log4j(记录)… Prometheus… Dapper, OpenZipkin,Jaeger…

它们之间有重叠,但各自关注的重点不同

OpenTracing 是什么

  • 当今乃是微服务的天下,Tracing 是给跨进程、服务的追踪提供了一种解决方案
  • OpenTracing API 提供了一个标准的、厂商中立的规范。其允许系统中存在多种分布式追踪方案 - 只要符合规范

OpenTracing 数据模型

Trace(调用链):一个调用链代表一个事务或者流程在(分布式)系统中的执行过程。在OpenTracing标准中,调用链是多个Span组成的一个有向无环图(Directed Acyclic Graph,简称DAG)

Span(跨度):一个名字、有时间的操作,代表工作流程的一个部分。span 上一般有以下信息:span 名字,span 起始时间、结束时间,tag,log,span context,span 之间的引用关系。

SpanContext:伴随着分布式的跟踪信息,它通过网络或通过消息总线透传上下文信息。span 上下文包含 tracing 标识符、span 标识符以及追踪系统需要传播给下游服务的任何其他数据。

span 之间的关系:

单个Trace中Span间的因果关系[Span A]  ←←←(The root span)|+------+------+|             |[Span B]      [Span C] ←←←(Span C是Span A的子节点,ChildOf)|             |[Span D]      +---+-------+|           |[Span E]    [Span F] >>> [Span G] >>> [Span H]↑↑↑(Span G在Span F后被调用, FollowsFrom)

Jaeger 是什么

Jaeger 受 Dapper 和 OpenZipkin 的启发,是 Uber的开源分布式追踪系统,已同和 k8s,Prometheus 等著名项目成为云原生计算基金会 CNCF 所支持的项目。它用于监控和排除基于微服务的分布式系统的故障,包括:

  • 分布式上下文传播
  • 分布式事务监控
  • 根因分析
  • 服务依赖分析
  • 性能/延时优化

特性:

  1. 兼容 OpenTracing
  2. 高扩展性
  3. 支持多个存储组件:Cassandra, Elasticsearch,内存…
  4. 现代 web 界面
  5. 云原生部署
  6. 系统拓扑图

整体架构

Geting Start

  1. docker 启动 jaeger collector
docker run -d --name jaeger \-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \-p 5775:5775/udp \-p 6831:6831/udp \-p 6832:6832/udp \-p 5778:5778 \-p 16686:16686 \-p 14268:14268 \-p 14250:14250 \-p 9411:9411 \jaegertracing/all-in-one:1.28
  1. UI 界面:http://localhost:16686
  2. 应用程序中使用 jaeger-client 直接上报数据,这里的 demo 例子没有使用 jaeger-agent

如下有一个简单的 web 应用:具有两个接口 api1 和 api2

package mainimport ("net/http"
)func main() {// web 示例http.HandleFunc("/api1", http.HandlerFunc(api1))http.HandleFunc("/api2", http.HandlerFunc(api2))err := http.ListenAndServe(":1234", nil)if err != nil {panic(err)}
}
package mainimport ("fmt""net/http"
)func api1(w http.ResponseWriter, r *http.Request) {fmt.Println("hello api1")
}func api2(w http.ResponseWriter, r *http.Request) {fmt.Println("hello api2")
}

使用 jaeger client 监控每一个接口,引用以下两个包

 go get github.com/uber/jaeger-client-go
go get github.com/opentracing/opentracing-go

jaeger client 的初始化,和 简单使用

package mainimport ("net/http""github.com/opentracing/opentracing-go""github.com/uber/jaeger-client-go/config"
)func main() {// 初始化 jaeger client,参数需要服务名,采样机制,上报数据地址tracing, closer, err := config.Configuration{ServiceName: "hello.service",Sampler:     &config.SamplerConfig{Type: "const", Param: 1},Reporter:    &config.ReporterConfig{CollectorEndpoint: "http://localhost:14268/api/traces"},}.NewTracer()if err != nil {panic(err)}defer closer.Close()// 设置成全局默认opentracing.SetGlobalTracer(tracing)// web 示例http.HandleFunc("/api1", jaegerTracing(http.HandlerFunc(api1)))http.HandleFunc("/api2", jaegerTracing(http.HandlerFunc(api2)))err = http.ListenAndServe(":1234", nil)if err != nil {panic(err)}
}// 添加jaeger 分布式追踪中间件
func jaegerTracing(handler http.Handler) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {// 记录 tracing 中的一个 span 上报span := opentracing.StartSpan(r.URL.String())// span 结束defer span.Finish()handler.ServeHTTP(w, r)}
}

jaeger 的作用是追踪服务间的调用关系,上述使用意义不大,以下是模拟多服务调用使用 jaeger 的作用

package mainimport ("context""fmt""net/http""time""github.com/opentracing/opentracing-go"
)func api1(w http.ResponseWriter, r *http.Request) {// 根 ctxctx := context.Background()// 记录 sever1.api 的调动耗时等信息span, c := opentracing.StartSpanFromContext(ctx, "server1.api1")defer span.Finish()fmt.Println("hello api1")time.Sleep(time.Second)// 模拟一个跨服务的调用,ctx 上下文信息传递service2XXX(c)
}func service2XXX(ctx context.Context) {// 从 ctx 获取 span, 这样就能把在一条调用链的 span 聚合在一起span, c := opentracing.StartSpanFromContext(ctx, "server2.XXX")defer span.Finish()time.Sleep(time.Second * 2)fmt.Println("hello server2 xxx", c)
}func api2(w http.ResponseWriter, r *http.Request) {fmt.Println("hello api2")
}

效果如下

demo 仓库

参考

  1. https://github.com/jaegertracing/jaeger
  2. https://www.jaegertracing.io/docs/1.29/
  3. https://opentracing.io/
  4. https://github.com/yurishkuro/opentracing-tutorial/tree/master/go

分布式链路追踪Jaeger快速入门-01相关推荐

  1. 分布式链路调用Zipkin快速入门

    简单讲今天就是看看怎么在微服务间找错误找问题,挑刺儿,抬杠的 调用链:随着分布式架构,服务和服务间都有远程调用,这时候,如果出现问题,如何跟踪调用链路哪块出现问题. 线上每个请求会经过多个业务系统,并 ...

  2. 分布式链路追踪SkyWalking进阶实战之RPC上报和WebHook通知(三)

    目录 1.自定义SkyWalking链路追踪配置 1.1 什么是TraceId 1.2 使用的背景 1.3 编码 2.SkyWalking-RocketBot性能剖析 3.SkyWalking链路追踪 ...

  3. 分布式链路追踪-skywalking入门体验

    背景 旁友,你的线上服务是不是偶尔来个超时,或者突然抖动一下,造成用户一堆反馈投诉.然后你费了九牛二虎之力,查了一圈圈代码和日志才总算定位到问题原因了.或者公司内部有链路追踪系统,虽然可以很轻松地通过 ...

  4. 怎么理解分布式链路追踪技术?

    ▲ 点击上方"分布式实验室"关注公众号 回复"1"抽取纸质技术书 - 1 - 为什么需要链路追踪 在学习分布式链路追踪之前,我们需要先理解这项技术产生的背景,以 ...

  5. 如何理解分布式链路追踪技术

    什么是链路追踪?微服务引发了怎样的问题? 在深入了解分布式链路追踪技术之前,我们需要先理解这项技术产生的背景,以及它能够帮我们解决哪些棘手的问题. 提到分布式链路追踪,我们要先提到微服务.相信很多人都 ...

  6. 原来10张图就可以搞懂分布式链路追踪系统原理

    分布式系统为什么需要链路追踪? 随着互联网业务快速扩展,软件架构也日益变得复杂,为了适应海量用户高并发请求,系统中越来越多的组件开始走向分布式化,如单体架构拆分为微服务.服务内缓存变为分布式缓存.服务 ...

  7. 链路追踪jaeger

    1. 什么是链路追踪 分布式链路追踪(Distributed Tracing),也叫 分布式链路跟踪,分布式跟踪,分布式追踪 等等. 本文使用分布式Trace来简称分布式链路追踪. 本篇文章只是从大致 ...

  8. 分布式链路追踪之SkyWalking

    一 链路追踪简介   在微服务架构中,一次请求往往涉及到多个模块,多个中间件,多台机器的相互协作才能完成.这一系列调用请求中,有些是串行的,有些是并行的,那么如何确定这个请求背后调用了哪些应用,哪些模 ...

  9. 分布式链路追踪框架的基本实现原理

    目录 分布式追踪 分布式系统 分布式追踪 分布式追踪有什么用呢 什么是分布式追踪 Dapper 分布式追踪系统的实现 跟踪树和 span Jaeger 和 OpenTracing OpenTracin ...

最新文章

  1. 编程第一个Apple Watch程序创建项目
  2. TCP三次握手、四次挥手过程及原理
  3. Linux学习之系统编程篇:ps 和 kill 命令以及父子进程间数据共享模式
  4. OpenCV equalizeHist直方图均衡化的实例(附完整代码)
  5. IT增值服务实践心得体会:企业客户的钱比个人客户好赚得多
  6. Docker 精通之入门
  7. openssl生成自签名证书
  8. Linux strace命令 一
  9. 结对项目 浪曦计时器
  10. 【facenet人脸识别】利用LFW数据集进行人脸比对测试
  11. VS 2015 卸载所有组件工具
  12. 地狱已满 服务器无响应,steam地狱已满怎么联网
  13. 数据库管理员详细介绍
  14. 撰写科技论文的意义-李正海
  15. cisco sla 简单配置
  16. 对于幸福不是悖论的证明,在现代对于幸福探寻
  17. 古城钟楼微博地支报时程序铛,100行代码实现,价值一天20万粉丝
  18. %3c php 能用什么代替,Phpwind9
  19. Google 就业岗分析
  20. 字节跳动2019校招笔试题(后端开发)一

热门文章

  1. 手撸一款属于自己的Maven插件,说干就干
  2. 一个高频开关电路设计与仿真
  3. heap 内存管理 dlmalloc
  4. 深度学习6---案例:人民币识别实现
  5. 拖拽生成html页面,简单拖拽即生成网页 VvvebJs
  6. 2018CCPC吉林赛区 题解
  7. 国务院将灵活就业列入“放管服”重点任务分工方案
  8. android录音波浪动画_Android自定义View实现波浪动画
  9. 用java输出自己的名字_java 实现输出姓和名
  10. postgresql 查看用户名