關於Metrics和Tracing介紹

2022-09-14 15:30:23 字數 2981 閱讀 1672

metrics和tracing屬於開箱即用的一套api,其目的是為了監控跟蹤程式呼叫。本身使用起來很簡單,但希望通過這篇文章,讓使用者能明白其工作原理和更好的使用。

logging應該是我們最熟悉的乙個組成,其目的是在於記錄程式執行的狀態,便於我們debug。

我們可以在日誌中記錄例如api被呼叫的次數

但對於觀測者非常不方便,因為我們需要在大量的日誌中去尋找這個值,而且如果我們想對這些值進行採集,則需要去解析日誌,而對於不同的人寫的程式來說,日誌輸出的格式都是不同的,這就導致了重複且無意義的工作,這時metrics和tracing便應運而生。

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

// 3.註冊view試圖

view.register(mcountview)

// 4.開啟http埠

if err := http.listenandserve(":8888", mux); err != nil

官方文件-快速上手(強烈建議按文件操作一遍)

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

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的定義標準。

關於業務和IT

偶爾翻開 程式設計師 雜誌2007年6月刊,看到一些關於soa與業務敏捷的文章,提醒我,我們的軟體設計忽略了一些很重要的東西。我們在anydata的設計過程中,實現了對資料表現方式的靈活應變,在某種程度上實現了流程上的應變,但是很多東西都是由專業的it人員對系統進行調整實現的,因此如果客戶的業務出現...

類和物件 關於繼承 關於介面

一 類和物件 物件將資料和操作打包在一起,類描述一切 用構造器建立物件 類和類之間的關係 關聯 組合,聚集 泛化二 關於繼承 祖先類object 方法重寫 tostring方法 equals方法 is a 是乙個 繼承關係 has a 有乙個 組合關係 三 關於介面 定義了一組功能 comparab...

關於BSP,BIOS,和bootloader區別

bsp是板級支援包,是介於主機板硬體和作業系統之間的一層,應該說是屬於作業系統的一部分,主要目的是為了支援作業系統,使之能夠更好的執行於硬體主機板。bsp是相對於作業系統而言的,不同的作業系統對應於不同定義形式的bsp,例如vxworks的bsp和linux的bsp相對於某一cpu來說儘管實現的功能...