关于Metrics、Tracing和Logging
监控(Metrics),链路(Tracing),日志(Logging) 都是用于监测系统在运行时的情况,在这3个领域中都有着不同的解决方案,同时3点也可能会重合在一起进行使用.
监控
监控指标的定义特征是它们是可聚合的:它们是在一段时间内组成单个逻辑指标、计数器或直方图的原子。
通俗来讲就是监控主要记录的是系统一定时间内的指标次数,例如请求次数,失败次数,系统状态情况等
链路
链路将记录处理请求范围内的信息--任何可以绑定到系统中单个事务对象的生命周期的数据或元数据。
例如一次请求的请求栈,栈运行时间,运行数据等
日志
日志的定义特征是它处理离散事件。
日志无法直接定义一个请求事件情况,因为它是异步,乱序,离散的记录集合,如果需要提取有用的信息,则需要对日志进行下一步的处理,例如找出日志中的traceId进行分组统计,这样就得到了一个链路数据,如果对请求状态码的日志进行统计,这样就得到了请求次数
在实际的使用中,日志作为流量最大的数据,是无法直接使用的,只能进行二次清理汇总,根据汇总的需求,和汇总的数据压缩性,可以得到 单次请求的执行日志(链路),得到一段时间内的请求次数(监控),这3者区别在于对数据的分类汇总
而openTracing记录的,就是基于 部分日志+链路 的聚合体
OpenTracing是什么
Opentracing 是分布式链路追踪的一种规范标准,是 CNCF(云原生计算基金会)下的项目之一。和一般的规范标准不同,Opentracing 不是传输协议,消息格式层面上的规范标准,而是一种语言层面上的 API 标准。以 Go 语言为例,只要某链路追踪系统实现了 Opentracing 规定的接口(interface),符合Opentracing 定义的表现行为,那么就可以说该应用符合 Opentracing 标准。这意味着开发者只需修改少量的配置代码,就可以在符合 Opentracing 标准的链路追踪系统之间自由切换。
openTracing模型
span
span是一条链路追踪的基本组成要素,一个span表示一个独立的工作单元(可以用于表示一次函数调用,一次http请求调用,mysql语句调用等等)
span将记录以下字段:
1:服务名称(operation name)
2:服务的开始时间和结束时间
3:key->value 的tags
4:key->value 的logs
5:span的上下文 (spanContext)
6:该span对一个或多个span的引用 (References)
tags
tags以key->value形式记录了该span的自定义标签,主要用于链路追踪结果的查询过滤,该tag不会传给下一个span.
logs
logs与tags 类似,但是logs将记录时间
SpanContext
spancontext携带了用于跨服务/跨进程 通信数据,主要为:
1:标识该span的信息,例如span_id(自身的span_id),trace_id(链路id)
2:Baggage Items 例如tags,但是此数据将会传递给后续所有的span,用于给整条链路保存用户自定义数据
References
References分为了2种方式:
1:childOf,表示该span作为父级span的引用,同步调用,例如父级span调用此span,需要等待span执行成功才能进行下一步执行
2:followFrom,表示该span只是被span调用(大多数为异步调用)了,不在乎此span的执行结果,也不会影响父span的执行时间
Trace
Trace表示一次完整的链路追踪,由多个span组成:
请求流程为:
本文参考: