指标与日志的集成:提升分布式系统可观测性
1. 上下文感知的指标 API
在分布式系统中,当指标由跟踪工具发出时,为指标添加基于上下文的标签是一种有效的方法。然而,应用程序通常会生成许多其他自定义指标,如内部缓存大小、当前队列深度等。有些与 RPC 相关的指标,可能难以通过跟踪工具发出。例如,要测量请求负载的字节大小,工具需要访问请求对象,但这超出了 OpenTracing API 的范围,因此无法被之前使用的装饰器跟踪器实现捕获。
在这种情况下,工具会退回到传统的指标 API,例如直接调用指标系统的客户端库(如 Prometheus 客户端),或使用抽象层,如 Java 中的 Micrometer。大多数传统指标 API 在创建时不支持分布式上下文,这使得为指标添加额外的请求范围元数据变得更加困难。
在通过线程局部变量或类似机制传递请求上下文的语言中,仍然可以在不改变 API 的情况下增强传统指标 API,从上下文中提取额外的标签。在其他语言(如 Go)中,指标 API 需要增强,以接受上下文作为进行测量的函数的参数之一。例如,流行的微服务框架 Go kit 定义的 Counter 接口如下:
type Counter interface {
With(labelValues ...string) Counter
Add(delta float64)
}
Add() 函数用于收集实际测量值,但它不接受 Context 对象。我们可以创建一个辅助函数来解决这个问题,该函数从上下文中提取上下文范围的标签值: