OpenTelemetry 目前支持如下几类数据源,未来可能会继续扩展。
Traces
Traces 跟踪了单个请求的完整流程,它通常由组成一个应用的一组服务来处理得到。Trace 请求最初可能会是由一个用户或者一个应用来发起。分布式 Tracing 是指一种跨域进程、网络和安全边界的一种 Trace 形式。Trace 中的每个工作单元被成为 span,一个 Trace 通常由一组 spans 按树状结构组成。Span 是表示系统的一个请求中涉及的单个服务或组件完成的任务对象。每个 Span 都会包含一个上下文,它是一组全局唯一的标识符,同时也说明了该 span 所属的请求。Span 中会包含可用于定位可用性和性能问题相关的请求、错误、持续时间等指标。
一个 Trace 中会包含一个 root span,它会包括整个请求过程中的端到端延迟。你可以把这个过程当做一个单独的逻辑操作,例如单击 Web 应用程序中的某个按钮把商品添加到购物车。在这个 root span 中,将会向用户显示从用户点击按钮到整个操作处理完成所耗费的时间以及可能出现的某些错误等。一个 Trace 通常会包含一个 root span 和一组 child span,每个 child span 都表示该请求过程中的某部分任务。每个 span 中都会包含操作的元数据,例如它的名称、开始和结束时间点、属性、事件和状态等。
为了在 OpenTelemetry 中创建和管理 Span,OpenTelemetry API 设计中提供了 tracer 接口。该对象负责跟踪进程中的 active span,并允许操作当前的 span,例如添加属性、事件以及在其跟踪任务完成时中止它。在一个进程中,我们可以创建一个或多个 tracer 对象,tracer provider 将会是一个工厂模式,可以通过传入不同的选项来实例化多个 tracer 对象。
通常情况下,一个 span 的整个生命周期会包含如下内容:
- 服务接收到请求;
- 如果当前请求头中包含 Span 上下文,从取出对应信息,并创建一个新的 span 作为提取的 span 上下文的子级;
- 接下来,服务就要开始处理请求了,在处理请求的过程中,可能会给 span 中添加一些属性和事件从而有助于分析请求的状态,例如,可以添加一些请求所在的机器、请求的类型等等;
- 可以创建一个新的 span 来表示当前任务已经交给服务的一个子组件来处理了;
- 当服务对另外一个服务进行远程调用时,当前 span 的上下文将会被序列化并且传送给下一个服务,传送的方式通常会通过 Headers 等方式;
- 当前任务已经被处理完成后,span 的状态应该被正确的被修改并标记该 span 为完成状态。
Metrics
监控指标指的是针对一个服务的度量值,在运行的过程中生成。从逻辑上来看,生成这些度量值的时刻我们会称之为一个指标事件,指标事件中除了包含指标值本身之外,包含了指标采集的时间和相关的一些元数据。
应用和请求指标是衡量一个系统的可用性和性能的重要指标。自定义指标可以深入了解可用性指标如何影响用户体验或业务。收集到的指标数据可以用于报警提示或者触发一些调度决策,例如横向扩容等。
OpenTelemetry 目标支持如下三类指标:
- counter:一个随着时间流逝不断上涨的指标,类似于汽车的里程碑。
- measure:在一段时间内聚合得到的指标,代表某个时间段的值。
- observer:抓取指定时间点的一组指标,例如某个时间点的汽车燃油表。
除了上述三类指标之外,聚合也是非常重要的。通过聚合,可以将大量的指标按照一定的时间区间进行汇总统计,从而得到更有价值的统计数据。OpenTelemetry API 本身不允许用户来指定相关的聚合策略。而 OpenTelemetry SDK 通常会提供一些可视化工具和遥测后端服务支持的常见聚合操作,例如 sum, count, last value 和 histograms 。
与 Trace 不同,Metrics 的目标在于提供聚合后的统计数据,例如一些常见的指标包括:
- 一个服务支持的每种协议类型读取到的总请求量;
- 每个请求的平均大小;
- 系统调用的持续时间;
- 请求数量的变化趋势;
- 进程的 CPU 和 内存使用率;
- 账户的平均余额;
- 当前正在处理的请求的数量等。
Logs
日志是带有时间戳的文本记录,可以是结构化数据、也可以是非结构化数据,通常还会带有一些元数据。虽然日志是一个独立的数据源,但是它们也可以被附加到 span 上。在 OpenTelemetry 中,任何不属于分布式 trace 或 metric 的数据都是日志。例如,事件就是一种特殊的日志。日志通常用于定位问题的根因,其中通常还会包含一些谁操作了什么以及操作的结果等等。
Baggage
除了 Trace 传播之外,OpenTelemetry 来提供了一种简单的键值对传播的机制,我们称之为 baggage 。Baggage 可以用于在一个事务中将先前服务中提供的一些属性信息在多个事件进行传递,从而能建立多个事件之间的因果关系,从而提高系统的可观测性。
例如,下述这些值可以做为 Baggage 进行传递并用作指标的附加维度或者是日志、Trace 的上下文等:
- WEB 服务调用方;
- SaaS 服务提供的 API 调用用户或者 Token;
- 特定发起请求的浏览器版本等。