關於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的定義標准。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM