关于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)
}

官方文档-快速上手(强烈建议按文档操作一遍)

https://opencensus.io/quickstart/go/metrics/

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),
	)),
)	

官方文档-快速上手(强烈建议按文档操作一遍)

https://opentelemetry.io/docs/go/getting-started/

名词概念

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的定义标准。

原文地址:https://www.cnblogs.com/Ghostant/p/15560792.html