使用 OpenTelemetry 構(gòu)建可觀測(cè)性 04 - 收集器
在之前的博文中,我們討論了如何使用 SDK 和鏈路追蹤生產(chǎn)者來(lái)導(dǎo)出進(jìn)程中的遙測(cè)數(shù)據(jù)。盡管有多種類型的導(dǎo)出器可供選擇,但其中一個(gè)常見(jiàn)的目標(biāo)是將數(shù)據(jù)導(dǎo)出到??OpenTelemetry Collector(https://github.com/open-telemetry/opentelemetry-collector)。本篇文章將深入探討收集器以及如何使用它。
選 OTel Collector 還是其他
正如上一篇博客文章中提到的,我談到了使用 OTLP 導(dǎo)出器將數(shù)據(jù)發(fā)送到 OTel Collector。此外我還提到,對(duì)導(dǎo)出器來(lái)說(shuō)輸出遙測(cè)數(shù)據(jù)的目的地是多樣的。當(dāng)導(dǎo)出器可以直接發(fā)送到 Jaeger、Prometheus 或控制臺(tái)時(shí),為什么還要選擇 OTel Collector 呢?答案是由于靈活性:
將遙測(cè)數(shù)據(jù)從收集器同時(shí)發(fā)送給多個(gè)不同的目標(biāo)
在發(fā)送之前對(duì)數(shù)據(jù)加工處理(添加/刪除屬性、批處理等)
解耦生產(chǎn)者和消費(fèi)者
以下是 OTel Collector 工作原理的概覽:

收集器的主要組件包括:
接收模塊 - 從收集器外部收集遙測(cè)數(shù)據(jù)(例如 OTLP、Kafka、MySQL、syslog)
處理模塊 - 處理或轉(zhuǎn)換數(shù)據(jù)(例如屬性、批次、Kubernetes 屬性)
導(dǎo)出模塊 - 將處理后的數(shù)據(jù)發(fā)送到另一個(gè)目標(biāo)(例如 Jaeger、AWS Cloud Watch、Zipkin)
擴(kuò)展模塊 - 收集器增強(qiáng)功能的插件(例如 HTTP 轉(zhuǎn)發(fā)器)
在 Kubernetes 中運(yùn)行 OpenTelemetry Collector 的兩種方式
運(yùn)行 OTel Collector 的方法有多種,比如您可以將其作為獨(dú)立進(jìn)程運(yùn)行。不過(guò)也有很多場(chǎng)景都會(huì)涉及到 Kubernetes 集群的使用,在 Kubernetes 中,有兩種主要的方式來(lái)運(yùn)行 OpenTelemetry Collector 收集器的運(yùn)行方式主要有兩種。
第一種方式(也是示例應(yīng)用程序中使用的)是守護(hù)進(jìn)程( DaemonSet ),每個(gè)集群節(jié)點(diǎn)上都有一個(gè)收集器 pod:

在這種情況下,產(chǎn)生遙測(cè)數(shù)據(jù)的實(shí)例將導(dǎo)出到同節(jié)點(diǎn)中收集器的實(shí)例里面。通常,還會(huì)有一個(gè)網(wǎng)關(guān)收集器,從節(jié)點(diǎn)中收集器的實(shí)例中匯總數(shù)據(jù)。
在 Kubernetes 中運(yùn)行收集器的另一種方式是作為附加輔助容器和主程序部署在同一個(gè)Pod中的邊車模式( sidecars )。也就是說(shuō),應(yīng)用程序 Pod 和收集器實(shí)例之間存在一對(duì)一的映射關(guān)系,它們共享相同的資源,無(wú)需額外的網(wǎng)絡(luò)開(kāi)銷,緊密耦合并共享相同的生命周期。

在?OpenTelemetry Operator(https://github.com/open-telemetry/opentelemetry-operator#sidecar-injection)?中是使用注釋?sidecar.opentelemetry.io/inject?來(lái)實(shí)現(xiàn)將 sidecar 容器注入到應(yīng)用程序 Pod 中。
核心版與貢獻(xiàn)版的區(qū)別
正如您在上面所看到的,OTel Collector 是一個(gè)設(shè)計(jì)高度可插拔拓展的系統(tǒng)。這樣的設(shè)計(jì)非常靈活,因?yàn)殡S著當(dāng)前和未來(lái)各種接收模塊、處理模塊、導(dǎo)出模塊和擴(kuò)展模塊的增加,我們就可以利用插件機(jī)制進(jìn)行集成。 OpenTelemetry 引入收集器分發(fā)的概念,其含義是根據(jù)需要選擇不同組件,以創(chuàng)建滿足特定需求的定制化收集器版本。
在撰寫(xiě)本文時(shí),有兩個(gè)分發(fā)版:Core?和?contrib。核心分發(fā)版的命名恰如其分,僅包含核心模塊。但貢獻(xiàn)版呢?全部??梢钥吹剿艘婚L(zhǎng)串的接收模塊、處理模塊和導(dǎo)出模塊的列表。
定制化收集器分發(fā)版的構(gòu)建
如果核心版和貢獻(xiàn)版都無(wú)法完全滿足你的需求,你可以使用 OpenTelemetry 提供的?ocb?工具自定義自己的收集器分發(fā)版本。該工具可以幫助你選擇和組合需要的功能和組件,以創(chuàng)建符合你特定需求的自定義收集器分發(fā)版本。這樣你既可以獲得所需的功能,又能避免貢獻(xiàn)版中的不必要組件。
為了使用?ocb
?工具構(gòu)建自定義的收集器分發(fā)版本,你需要提供一個(gè) YAML 清單文件來(lái)指定構(gòu)建的方式。一種簡(jiǎn)單的做法是使用?contrib manifest.yaml(https://github.com/open-telemetry/opentelemetry-collector-releases/blob/main/distributions/otelcol-contrib/manifest.yaml)?,在該文件的基礎(chǔ)上刪除不需要的組件,以創(chuàng)建適合應(yīng)用程序需求的小型清單。這樣你就可以得到一個(gè)只包含必要組件的自定義收集器分發(fā)版本,以滿足當(dāng)前收集器場(chǎng)景,而且沒(méi)有多余的組件。
我修改了一些?dist?屬性并刪除了許多?exporters?、?processors?和?receivers??,F(xiàn)在可以根據(jù)需求構(gòu)建定制化的收集器分發(fā)版了!
最終輸出一個(gè)二進(jìn)制文件,在我的環(huán)境中,位于?./collector/dist/otel-shopping-cart-collector
?。不過(guò)還沒(méi)結(jié)束,由于要在 Kubernetes 中運(yùn)行這個(gè)收集器,所以需要?jiǎng)?chuàng)建一個(gè)容器映像。使用?contrib Dockerfile?作為基礎(chǔ)模版,最終得到以下內(nèi)容:
Dockerfile?Dockerfile
在本例中,我將?config.yaml?直接嵌入到鏡像中,但您可以通過(guò)使用 ConfigMap 來(lái)使其更加動(dòng)態(tài):
config.yaml
最后創(chuàng)建此鏡像后,我需要?jiǎng)?chuàng)建 DaemonSet 清單:
我使用的是Helm Chart(https://github.com/trstringer/otel-shopping-cart/tree/main/charts/otel-shopping-cart)?來(lái)部署,并設(shè)置了一些動(dòng)態(tài)設(shè)置的配置值。安裝時(shí)可以通過(guò)查看收集器的日志,來(lái)驗(yàn)證這些值是否正確地被應(yīng)用:
最后一行顯示了自定義分發(fā)版的名稱:“otel-shopping-cart-collector”。就像這樣,使用 Helm Chart 和自定義分發(fā)版的收集器可以提供靈活性和精確控制的優(yōu)勢(shì),即能夠滿足特定的需求,也不會(huì)添加不必要的額外部分。
總結(jié)
OpenTelemetry Collector 是一個(gè)功能強(qiáng)大的工具,它的一大優(yōu)點(diǎn)是您可以創(chuàng)建自己的收集器分發(fā)版來(lái)滿足您的需求。在我看來(lái),這種靈活性使得 OpenTelemetry Collector 在 OpenTelemetry 生態(tài)系統(tǒng)中具備重要作用。
本文翻譯自:https://trstringer.com/otel-part4-collector/
擴(kuò)展閱讀:
方法論:面向故障處理的可觀測(cè)性體系建設(shè)(https://flashcat.cloud/blog/construction-of-observability-system-for-fault-processing/)
白皮書(shū):事件 OnCall 中心建設(shè)方法(https://download.flashcat.cloud/flashduty-white-paper-v1.pdf)
好工具:FlashDuty - 一站式告警處理平臺(tái):告警降噪、排班OnCall(https://flashcat.cloud/product/flashduty/)