关于Metrics和Tracing介绍
前言
Metrics和Tracing属于开箱即用的一套API,其目的是为了监控、跟踪程序调用。本身使用起来很简单,但希望通过这篇文章,让使用者能明白其工作原理和更好的使用。
Metrics、Tracing和Logging
logging应该是我们最熟悉的一个组成,其目的是在于记录程序运行的状态,便于我们Debug。
我们可以在日志中记录例如 API被调用的次数。
但对于观测者非常不方便,因为我们需要在大量的日志中去寻找这个值,而且如果我们想对这些值进行采集,则需要去解析日志,而对于不同的人写的程序来说,日志输出的格式都是不同的,这就导致了重复且无意义的工作,这时Metrics和Tracing便应运而生。
Metrics
Metrics即度量指标。其原理是,将要监测的值记录在特定的全局变量中,然后通过HTTP的形式向外提供查询这些指标的接口,即Exporter。Prometheus会通过Exporter拉取这些数据,并存放在时序数据库中,可通过PromQL进行查询。
View
View定义了Metrics展示的形式,例如 某一metrics在代码中最近的值(LastValue)、某一metrics的值在某一范围的分布(Distribution)
Exporter
Exporter即View向外展示的一个httpHandler。
opencensus使用步骤
// 1.定义Metrics
var MCounter = stats.Int64("api/counter", "The counter of request", "by")
// 2.定义View视图
MCountView = &view.View{
Name: "api/counter",
Measure: MCounter,
Description: "The counter of request",
Aggregation: view.Count(),
}
// 3.注册View试图
view.Register(MCountView)
// 4.开启http端口
pe, err := prometheus.NewExporter(prometheus.Options{
Namespace: "ocmetricstutorial",
})
mux := http.NewServeMux()
mux.Handle("/metrics", pe)
if err := http.ListenAndServe(":8888", mux); err != nil {
log.Fatalf("Failed to run Prometheus scrape endpoint: %v", err)
}
官方文档-快速上手(强烈建议按文档操作一遍)
Tracing
Tracing即链路跟踪。其目的是在分布式系统中,完成一个用户请求可能需要多个子系统之间的相互调用,而子系统为了实现高可用都会有多个节点,导致排查问题非常困难。Tracing相对于Metrics来说,实现会更复杂,我们先了解一些概念。
Trace
Trace表示一个调用链路,由全局唯一的TraceID标识。Trace由Span组成。
Span
Span(一般)表示一个函数调用,由全局唯一的SpanID标识。Span组成的Trace实际上是一颗树结构,除了根Span外,每个Span都会有一个父Span。
Context
Context表示Tracing的上下文,用于生成Trace和Span。当我们使用sdk生成一个span时需要传入ctx,如果ctx中不存在trace和span的相关信息,则会生成trace和一个根span,并记录在ctx中。如果ctx中已经存在了trace和span的相关信息,则生成的span会指向这个父span,通过在代码中传递ctx来实现span的生成。
在进程间的rpc通信,需要将ctx序列化后,例如作为http的请求头参数进行传递。
Opentelemetry + Jaeger使用步骤总结
// 1.通过ctx生成span
_, span := otel.Tracer(name).Start(ctx, "Poll")
defer span.End()
// 2.生成JaegerExporter
exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))
// 3.生成Provider
tp := tracesdk.NewTracerProvider(
// Always be sure to batch in production.
tracesdk.WithBatcher(exp),
// Record information about this application in an Resource.
tracesdk.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String(service),
attribute.Int64("ID", id),
)),
)
官方文档-快速上手(强烈建议按文档操作一遍)
名词概念
Prometheus
采集并存储各类Exporter数据的服务,采用pull模型。
Zabbix
采集并存储各类Exporter数据的服务,采用push模型。
Opencensus
metrics实现的第三方库
Opentracing
tracing实现的第三方库,已暂停维护,合并入Opentelemetry
Opentelemetry
谷歌定义的一套tracing、metrics标准和第三方库,合并了opencensus和opentracing。
由于其中metrics版本尚未稳定,所以londobell中仍然使用opencensus。
Jaeger
Uber对tracing数据采集的服务,符合Opentelemetry的定义标准。
Opentelemetry-Collector
官方对tracing数据采集的服务,符合Opentelemetry的定义标准。