什么是OpenTelemetry器钟?
OpenTelemetry合并了OpenTracing和OpenCensus項(xiàng)目,提供了一組API和庫來標(biāo)準(zhǔn)化遙測數(shù)據(jù)的采集和傳輸攒读。OpenTelemetry提供了一個(gè)安全廓旬,廠商中立的工具凿蒜,這樣就可以按照需要將數(shù)據(jù)發(fā)往不同的后端哥艇。
OpenTelemetry項(xiàng)目由如下組件構(gòu)成:
- 推動在所有項(xiàng)目中使用一致的規(guī)范
- 基于規(guī)范的绝编,包含接口和實(shí)現(xiàn)的APIs
- 不同語言的SDK(APIs的實(shí)現(xiàn)),如 Java, Python, Go, Erlang等
- Exporters:可以將數(shù)據(jù)發(fā)往一個(gè)選擇的后端
- Collectors:廠商中立的實(shí)現(xiàn)貌踏,用于處理和導(dǎo)出遙測數(shù)據(jù)
術(shù)語
如果剛接觸Opentelemetry十饥,那么需要了解如下術(shù)語:
Traces:記錄經(jīng)過分布式系統(tǒng)的請求活動,一個(gè)trace是spans的有向無環(huán)圖
Spans:一個(gè)trace中表示一個(gè)命名的祖乳,基于時(shí)間的操作逗堵。Spans嵌套形成trace樹。每個(gè)trace包含一個(gè)根span眷昆,描述了端到端的延遲蜒秤,其子操作也可能擁有一個(gè)或多個(gè)子spans。
-
Metrics:在運(yùn)行時(shí)捕獲的關(guān)于服務(wù)的原始度量數(shù)據(jù)隙赁。Opentelemetry定義的metric instruments(指標(biāo)工具)如下垦藏。Observer支持通過異步API來采集數(shù)據(jù),每個(gè)采集間隔采集一個(gè)數(shù)據(jù)伞访。
ame Synchronous Adding Monotonic Counter Yes Yes Yes UpDownCounter Yes Yes No ValueRecorder Yes No No SumObserver No Yes Yes UpDownSumObserver No Yes No ValueObserver No No No Context:一個(gè)span包含一個(gè)span context,它是一個(gè)全局唯一的標(biāo)識轰驳,表示每個(gè)span所屬的唯一的請求厚掷,以及跨服務(wù)邊界轉(zhuǎn)移trace信息所需的數(shù)據(jù)弟灼。OpenTelemetry 也支持correlation context,它可以包含用戶定義的屬性冒黑。correlation context不是必要的田绑,組件可以選擇不攜帶和存儲該信息。
Context propagation:表示在不同的服務(wù)之間傳遞上下文信息抡爹,通常通過HTTP首部掩驱。 Context propagation是Opentelemetry系統(tǒng)的關(guān)鍵功能之一。除了tracing之外冬竟,還有一些有趣的用法欧穴,如,執(zhí)行A/B測試泵殴。OpenTelemetry支持通過多個(gè)協(xié)議的Context propagation來避免可能發(fā)生的問題涮帘,但需要注意的是,在自己的應(yīng)用中最好使用單一的方法笑诅。
OpenTelemetry的好處
通過將OpenTracing 和OpenCensus 合并為一個(gè)開放的標(biāo)準(zhǔn)调缨,OpenTelemetry提供了如下便利:
- 選擇簡單:不必在兩個(gè)標(biāo)準(zhǔn)之間進(jìn)行選擇,OpenTelemetry可以同時(shí)兼容 OpenTracing和OpenCensus吆你。
- 跨平臺:OpenTelemetry 支持各種語言和后端弦叶。它代表了一種廠商中立的方式,可以在不改變現(xiàn)有工具的情況下捕獲并將遙測數(shù)據(jù)傳輸?shù)胶蠖恕?/li>
- 簡化可觀測性:正如OpenTelemetry所說的"高質(zhì)量的觀測下要求高質(zhì)量的遙測"妇多。希望看到更多的廠商轉(zhuǎn)向OpenTelemetry伤哺,因?yàn)樗奖悖覂H需測試單一標(biāo)準(zhǔn)砌梆。
如何使用OpenTelemetry
OpenTelemetry APIs 和SDKs有很多快速使用指南和文檔幫助快速入門默责,如Java快速指南展示了如何獲取跟蹤程序、創(chuàng)建spans咸包、添加屬性桃序,以及跨不同spans傳遞context。
將OpenTelemetry trace APIs插裝到應(yīng)用程序后烂瘫,就可以使用預(yù)先編譯好的OpenTelemetry 庫中的exporters 將trace數(shù)據(jù)發(fā)送到觀測平臺媒熊,如New Relic或其他后端。
metrics和logs的規(guī)范仍在開發(fā)階段坟比,但一旦完成芦鳍,它們將在實(shí)現(xiàn)OpenTelemetry的主要目標(biāo)中發(fā)揮重要作用:確保庫和框架包含所有內(nèi)置的遙測數(shù)據(jù)類型,使開發(fā)人員無需進(jìn)行檢測即可提取遙測數(shù)據(jù)葛账。
OpenTelemetry 架構(gòu)組件
由于OpenTelemetry旨在成為一個(gè)為廠商和可觀察性后端提供的跨語言框架柠衅,因此它非常靈活且可擴(kuò)展,但同時(shí)也很復(fù)雜籍琳。OpenTelemetry的默認(rèn)實(shí)現(xiàn)中菲宴,其架構(gòu)可以分為如下三部分:
- OpenTelemetry API
- OpenTelemetry SDK贷祈,包括
- Tracer pipeline
- Meter pipeline
- shared Context layer
- Collector
OpenTelemetry API
應(yīng)用開發(fā)者會使用 Open Telemetry API對其代碼進(jìn)行插樁,庫作者會用它(在庫中)直接編寫樁功能喝峦。API不處理操作問題势誊,也不關(guān)心如何將數(shù)據(jù)發(fā)送到廠商后端。
API分為四個(gè)部分:
- A Tracer API
- A Metrics API
- A Context API
- 語義規(guī)范
Tracer API
Tracer API 支持生成spans谣蠢,可以給span分配一個(gè)traceId
粟耻,也可以選擇性地加上時(shí)間戳。一個(gè)Tracer會給spans打上名稱和版本眉踱。當(dāng)查看數(shù)據(jù)時(shí)挤忙,名稱和版本會與一個(gè)Tracer關(guān)聯(lián),通過這種方式可以追蹤生成sapan的插裝庫勋锤。
Metric API
Metric API提供了多種類型的Metric instruments(樁功能)饭玲,如Counters 和Observers。Counters 允許對度量進(jìn)行計(jì)算叁执,Observers允許獲取離散時(shí)間點(diǎn)上的測量值茄厘。例如,可以使用Observers 觀察不在Span上下文中出現(xiàn)的數(shù)值谈宛,如當(dāng)前CPU負(fù)載或磁盤上空閑的字節(jié)數(shù)次哈。
Context API
Context API 會在使用相同"context"的spans和traces中添加上下文信息,如W3C Trace Context, Zipkin B3首部, 或 New Relic distributed tracing 首部吆录。此外該API允許跟蹤spans是如何在一個(gè)系統(tǒng)中傳遞的窑滞。當(dāng)一個(gè)trace從一個(gè)處理傳遞到下一個(gè)處理時(shí)會更新上下文信息。Metric instruments可以訪問當(dāng)前上下文恢筝。
語義規(guī)范
OpenTelemetry API包含一組語義規(guī)范哀卫,該規(guī)范包含了命名spans,屬性以及與spans相關(guān)的錯(cuò)誤撬槽。通過將該規(guī)范編碼到API接口規(guī)范中此改,OpenTelemetry 項(xiàng)目保證所有的instrumentation(不論任何語言)都包含相同的語義信息。對于希望為所有用戶提供一致的APM體驗(yàn)的廠商來說侄柔,該功能非常有價(jià)值共啃。
OpenTelemetry SDK
OpenTelemetry SDK是OpenTelemetry API的實(shí)現(xiàn)。該SDK包含三個(gè)部分暂题,與上面的API類似:Tracer, 一個(gè)Meter, 和一個(gè)shared Context layer
理想情況下移剪,SDK應(yīng)該滿足99%的標(biāo)準(zhǔn)使用場景,但如果有必要薪者,可以自定義SDK纵苛。例如,可以在Tracer pipeline實(shí)現(xiàn)中自定義除核心實(shí)現(xiàn)(如何與共享上下文層交互)外的其他任何內(nèi)容,如Tracer pipeline使用的采樣算法赶站。
Tracer pipeline
當(dāng)配置SDK時(shí)幔虏,需要將一個(gè)或多個(gè)SpanProcessors
與Tracer pipeline的實(shí)現(xiàn)進(jìn)行關(guān)聯(lián)纺念。SpanProcessors
會查看spans的生命周期贝椿,然后在合適的時(shí)機(jī)將spans傳送到一個(gè)SpanExporter
。SDK中內(nèi)置了一個(gè)簡單的SpanProcessor陷谱,可以將完成的spans直接轉(zhuǎn)發(fā)給exporter 烙博。
SDK還包含一個(gè)批處理實(shí)現(xiàn),按照可配置的間隔分批次轉(zhuǎn)發(fā)已完成的spans烟逊。但由于SpanProcessor
的實(shí)現(xiàn)可以接受插件渣窜,因此可以在完成自己的實(shí)現(xiàn)后賦予其自定義的行為。例如宪躯,如果遙測后端支持觀測"正在進(jìn)行的"spans乔宿,那么可以創(chuàng)建一個(gè)SpanProcessor實(shí)現(xiàn),將所有span狀態(tài)變更涉及的spans轉(zhuǎn)發(fā)出去访雪。
Tracer pipeline的最后是SpanExporter
详瑞。一個(gè)exporter的工作很簡單:將OpenTelemetry 的spans轉(zhuǎn)換為遙測后端要求的表達(dá)格式,然后轉(zhuǎn)發(fā)給該后端即可臣缀。提供定制化的SpanExporter是遙測廠商參與OpenTelemetry生態(tài)系統(tǒng)的最簡單方式坝橡。
Meter pipeline
Meter pipeline
Meter pipeline要遠(yuǎn)比Tracer pipeline負(fù)載,而metrics也遠(yuǎn)比span復(fù)雜精置。下面的描述基于java SDK實(shí)現(xiàn)计寇,可能跨語言會有所不同。
Meter pipeline會創(chuàng)建和維護(hù)多種類型的metric工具脂倦,包括Counters 和Observers番宁。每個(gè)工具的實(shí)例都需要以某種方式聚合。默認(rèn)情況下赖阻,Counters通過累加數(shù)值進(jìn)行聚合蝶押,而Observers通過采集記錄到的最后一個(gè)數(shù)值進(jìn)行聚合。所有的工具默認(rèn)都有一個(gè)聚合政供。
(在本文編寫之際播聪,metric工具的自定義聚合配置仍然在起草階段)。
不同語言的Meter pipeline的實(shí)現(xiàn)會有所不同布隔,但所有場景下离陶,metric的聚合結(jié)果都會被傳遞到MetricExporter
。與spans類似衅檀,供應(yīng)商可以提供自己的exporter招刨,將由metric aggregators生成的聚合數(shù)據(jù)轉(zhuǎn)換為遙測后端所需的類型。
OpenTelemetry支持兩種類型的exporter:基于exporters的"push"哀军,即exporter按照時(shí)間間隔將數(shù)據(jù)發(fā)送到后端沉眶;基于exporters的"pull"打却,即后端按照需要請求數(shù)據(jù)。New Relic 是一個(gè)基于push的后端谎倔,而Prometheus是一個(gè)基于push的后端柳击。
shared Context layer
shared Context layer位于Tracer和Meter pipeline之間,允許在一個(gè)執(zhí)行的span的上下文中記錄所有非observer的metric片习“齐龋可以使用propagators自定義Context,在系統(tǒng)內(nèi)外傳遞span上下文藕咏。OpenTelemetry SDK提供了一個(gè)基于W3C Trace Context規(guī)范的實(shí)現(xiàn)状知,但也可以根據(jù)需要來包含 Zipkin B3 propagation等。
Collector
下面對collector的描述來自官方文檔
OpenTelemetry Collector提供了一種廠商中立的實(shí)現(xiàn)孽查,無縫地接收饥悴,處理和導(dǎo)出遙測數(shù)據(jù)。此外盲再,它移除了為支持發(fā)送到多個(gè)開源或商業(yè)后端而使用的開源可觀察性數(shù)據(jù)格式(如Jaeger西设,Prometheus等)的運(yùn)行,操作和維護(hù)洲胖。
OpenTelemetry collector可以擴(kuò)展或嵌入其他應(yīng)用中济榨。下面應(yīng)用擴(kuò)展了collector:
如果要?jiǎng)?chuàng)建自己的collector發(fā)行版,可以參見這篇blog: Building your own OpenTelemetry Collector distribution绿映。
如果要構(gòu)建自己的發(fā)行版擒滑,可以使用OpenTelemetry Collector Builder 。