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來說儘管實現的功能...