前言
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的定義標准。