本篇文章將延續昨天的 Collector 元件介紹,探討將 Collector 部署到生產環境時的幾個策略。
根據官方文件,Collector 的部署可分為三種類型,分別是 No Collector、Agent和Gateway,各個類型有其適用場景及優缺點。
顧名思義,就是不使用 Collector!OpenTelemetry 可以單純使用 SDK 將 telemetry 送到儲存後端。
在這種模式下,應用程式直接透過 OpenTelemetry SDK 將 traces、metrics 和 logs 發送到觀測性後端,如 Jaeger、Prometheus 或其他雲端服務。
優點:
缺點:
因此,No Collector 的部署通常被建議用於開發或測試環境。畢竟當需求變動時,No Collector 相較起來還是比較沒有彈性的。
Agent 模式是將 Collector 部署在接近應用程式的位置,例如 Kubernetes中的 sidecar(用以觀察 Pod)或者 DaemonSet(用以觀察各個節點)。
優點:
缺點:
Gateway 模式採用集中式架構,將 Collector 部署為閘道服務,處理來自多個來源的 telemetry 資料。
優點:
缺點:
由於我在閱讀這兩個部署方式時,對這兩者間的差異有些搞混,所以在此比較一下這兩者的不同。
比較項目 | Agent 模式 | Gateway 模式 |
---|---|---|
部署位置 | 應用程式本地(同節點/Pod) | 集中式服務 |
資料傳輸 | 本地處理,無網路延遲 | 透過網路傳輸到遠端 |
部署密度 | 每個節點/Pod 一個 | 每個叢集/區域一個或多個 |
故障影響範圍 | 僅影響單一節點 | 可能影響整個叢集 |
擴展方式 | 隨應用程式線性擴展 | 可獨立擴展處理能力 |
適用場景 | 低延遲、故障隔離需求 | 集中處理、統一策略需求 |
簡單來說,Agent 在本地處理資料,Gateway 透過網路集中處理資料。
不過,這兩種模式並非互斥,實務上經常混合使用。在官方文件中有個很好的例子:
以 Agent 來說:
以 Gateway 來說:
因此,像這樣 Agent 和 Gateway 混合使用的架構分工通常如下:
這種架構既滿足了技術需求,也實現了效能和管理的最佳平衡。
講完三種部署理論後,讓我們在本地快速啟動一個 Collector,確認它能夠接收並輸出資料吧。
receivers:
otlp:
protocols:
grpc:
http:
exporters:
debug:
verbosity: detailed
service:
pipelines:
traces:
receivers: [otlp]
exporters: [debug]
metrics:
receivers: [otlp]
exporters: [debug]
這個設定讓我們:
官方支援使用 Container 或者二進位檔的方式執行,這邊我選用 Container 的方式
docker run --rm -p 4317:4317 -p 4318:4318 \
-v $(pwd)/otel-config.yaml:/config.yaml \
otel/opentelemetry-collector:latest \
--config /config.yaml
觀察 container log,會看到已經成功啟動 gRPC 和 HTTP server
開啟另一個終端機視窗,使用 curl
手動送一筆 OTLP 格式的 metrics 到 http endpoint。
編按:其實,若我們使用 SDK,就不需要手動組合 OTLP 格式的資料了,這我們會在明天的章節進行介紹。
curl -X POST -v http://127.0.0.1:4318/v1/metrics \
-H "Content-Type: application/json" \
-d '{
"resourceMetrics": [{
"resource": {
"attributes": [{
"key": "service.name",
"value": {"stringValue": "my-service"}
}]
},
"scopeMetrics": [{
"metrics": [{
"name": "http_requests_total",
"unit": "1",
"sum": {
"dataPoints": [{
"startTimeUnixNano": "1634000000000000000",
"timeUnixNano": "1634000001000000000",
"asInt": "100"
}]
}
}]
}]
}]
}'
如果成功,你應該會在 Collector Container 中看到 debug 輸出顯示收到的 metrics 資料。
今天探討了 Collector 常用的三種部署模式。明天,我們將介紹 OpenTelemetry 的 API 與 SDK,來了解要如何從應用程式發送 OTLP 資料。
ControlTheory - OpenTelemetry Collector Deployment Patterns: A Guide
OpenTelemetry Docs - Deployment
OpenTelemetry Docs - Install the Collector