分布式追踪
Logging、Metrics、Logging
如图所属的韦恩图描述了三个核心概念:
- Logging:即日志描述,用于记录一系列的离散事件。
- Metrics:即指标,具有原子性。每个指标是一个逻辑计量单位。用于记录一段时间内的相关指标的状态。
- Tracing:即追踪。用于记录单次请求范围以内的信息。常用于微服务中分析服务调用路径和排查系统性能问题。
这三者之间并不是相互独立的,会有一定程度的重叠,完善的监控系统一般是包含多个维度的。
分布式追踪的原理:
分布式追踪的概念可以看看谷歌的论文《Dapper, a large-scale distributed systems tracing infrastructure》
Dapper的核心思想是在分布式请求的上下文中记录 span id 和 parent id,用于记录上下级关系。
分布式日志追踪的作用:
- 追踪单体服务中的执行逻辑,如函数的监控。由于单体服务中可能存在异步执行,直接输出日志不便于分析执行逻辑,而分布式日志追踪系统可以提供可视化页面,方便分析、发现问题。
- 追踪分布式环境中微服务的调用、执行情况。
OpenTracing
OpenTracing是CNCF托管的分布式追踪项目,官方定位是针对分布式系统的追踪的API标准库,旨在为不同的分布式追踪系统提供统一的对外API接入层。它位于应用程序/类库和追踪或日志分析程序之间。
OpenTracing 数据模型
OpenTracing 中的 Trace(调用链)通过归属于此调用链的 Span 来隐性的定义。
特别说明,一条 Trace(调用链)可以被认为是一个由多个 Span 组成的有向无环图(DAG图),Span 与 Span 的关系被命名为 References。Trace调用链可以用树形结构或者基于时间轴的时序图表示。下图为树形结构表示调用关系:
每个 Span 包含以下的状态:(译者注:由于这些状态会反映在 OpenTracing API 中,所以会保留部分英文说明)
- An operation name,操作名称
- A start timestamp,起始时间
- A finish timestamp,结束时间
- Span Tag,一组键值对构成的 Span 标签集合。键值对中,键必须为 string,值可以是字符串,布尔,或者数字类型。
- Span Log,一组 span 的日志集合。
每次 log 操作包含一个键值对,以及一个时间戳。
键值对中,键必须为 string,值可以是任意类型。
但是需要注意,不是所有的支持 OpenTracing 的 Tracer,都需要支持所有的值类型。
- SpanContext,Span 上下文对象 (下面会详细说明)
- References(Span间关系),相关的零个或者多个 Span(Span 间通过 SpanContext 建立这种关系)
每一个 SpanContext 包含以下状态:
- 任何一个 OpenTracing 的实现,都需要将当前调用链的状态(例如:trace 和 span 的 id),依赖一个独特的 Span 去跨进程边界传输
- Baggage Items,Trace 的随行数据,是一个键值对集合,它存在于 trace 中,也需要跨进程边界传输
更多关于 OpenTracing 数据模型的知识,请参考 OpenTracing语义标准。
Jaeger
Jeager架构介绍
jaeger组件介绍:
- jaeger-client:jaeger 的客户端,实现了opentracing协议;
- jaeger-agent:jaeger client的一个代理程序,client将收集到的调用链数据发给agent,然后由agent发给collector;
- jaeger-collector:负责接收jaeger client或者jaeger agent上报上来的调用链数据,然后做一些校验,比如时间范围是否合法等,最终会经过内部的处理存储到后端存储;
- jaeger-query:专门负责调用链查询的一个服务,有自己独立的UI;
- spark-job:基于spark的运算任务,可以计算服务的依赖关系,调用次数等;
基础编程接口
config配置
cfg := &config.Configuration{
Sampler: &config.SamplerConfig{
//采样类型设置
Type: samplerType,
Param: samplerParam,
},
Reporter: &config.ReporterConfig{
LogSpans: true,
LocalAgentHostPort:"${your_agent_ip}:6831",
},
}
其中SamplerConfig
用于设置采样类型,Type分为:
- const,全量采集。param采样率设置0,1 分别对应打开和关闭
- probabilistic ,概率采集。param默认万份之一,0~1之间取值,
- rateLimiting ,限速采集。param每秒采样的个数
- remote 动态采集策略。param值于probabilistic的参数一样。在收到实际值之前的初始采样率。改值可以通过环境变量的JAEGER_SAMPLER_PARAM设定
生成jaeger tracer
func (c Configuration) NewTracer(options ...Option) (opentracing.Tracer, io.Closer, error)
设置为全局的单例tracer
func SetGlobalTracer(tracer Tracer)
生成开始一个Span
StartSpan(operationName string, opts ...StartSpanOption) Span
获得span的上下文
func ContextWithSpan(ctx context