Day12- GPT 陪我讀 Grafana OpenTelemetry
本文旨在指導您如何配置 OpenTelemetry Collector,以便將遙測數據有效地發送到 Grafana Cloud。透過 OpenTelemetry Demo 應用程式的實際例子,您不僅可以了解數據的流動,還能夠對 Collector 的配置過程有深入的了解。
OpenTelemetry Collector 是一個中間件,用於連接遙測數據的來源和可靠地存儲數據的後端,同時在其中進行數據的處理和清潔。本文指導您配置 OpenTelemetry Collector,將數據發送到 Grafana Cloud Metrics、Traces 和 Logs。
注意:Grafana Labs 也提供了一個 OpenTelemetry Protocol (OTLP)端點 ,該端點直接將 OTLP 數據發送到 Grafana Cloud 資料庫的單一端點。如果您的遙測數據格式是 OTLP,我們鼓勵您今天就嘗試它。
本指南使用 OpenTelemetry Demo 應用程式進行日誌、指標和追踪。閱讀完此指南後,您將對遙測數據的流程有很好的了解,並且對使用生產質量配置運行收集器充滿信心。
儘管此指南使用 OpenTelemetry Demo 應用程式,但相同的概念也適用於生成 OTLP 數據的應用程式,很可能使用 OpenTelemetry SDK。請注意,OpenTelemetry Demo 本身就可以生成 OTLP 指標和追踪,使其成為使用 Grafana Cloud 的 OTLP 端點的絕佳選擇。日誌是從 pods 的 stdout
獲得的,與您運行 kubectl logs
時看到的類似。然後由 Collector 將其轉換為 OTLP。
該示範包含多個透過 Docker Compose 或 Kubernetes 部署的微服務和工具。本指南已根據上游示範進行調整,以便收集來自 Kubernetes pods 的日誌。未來會根據對上游示範項目進行的更改來調整此指南。
${METRICS_URL}
。同樣注意 “Username / Instance ID”,例如 123456。我們將此稱為 ${METRICS_USER_ID}
。${TRACES_URL}
,例如 tempo-us-central1.grafana.net:443。同樣注意 “Username / Instance ID”,例如 12345。我們將此稱為 ${TRACES_USER_ID}
。 ${LOGS_URL}
。注意 “Username / Instance ID”,例如 12345。我們將此稱為 ${LOGS_USER_ID}
。eyJ...fQ==
。我們將此稱為 ${API_KEY}
。grafana.yaml
的文件中,創建一個自定義 Helm values 文件,並替換之前獲得的 “${…}” 值。default:
envOverrides:
- name: 'OTEL_COLLECTOR_NAME'
value: $(OTEL_K8S_NODE_NAME)
opentelemetry-collector:
mode: daemonset
presets:
logsCollection:
enabled: true
includeCollectorLogs: false
config:
extensions:
basicauth/traces:
client_auth:
username: "${TRACES_USER_ID}"
password: "${API_KEY}"
basicauth/metrics:
client_auth:
username: "${METRICS_USER_ID}"
password: "${API_KEY}"
basicauth/logs:
client_auth:
username: "${LOGS_USER_ID}"
password: "${API_KEY}"
exporters:
otlp:
endpoint: ${TRACES_URL}
tls:
insecure: false
auth:
authenticator: basicauth/traces
prometheusremotewrite:
endpoint: ${METRICS_URL}
auth:
authenticator: basicauth/metrics
loki:
endpoint: ${LOGS_URL}
auth:
authenticator: basicauth/logs
processors:
spanmetrics:
metrics_exporter: prometheusremotewrite
service:
extensions: [ basicauth/traces, basicauth/metrics, basicauth/logs, health_check , memory_ballast ]
pipelines:
metrics:
exporters: [prometheusremotewrite]
logs:
receivers: [filelog]
exporters: [loki]
注意:在生產系統上,您將憑證添加到 Kubernetes
Secret
,然後在 Collector 部署中將憑證設置為環境變量,而不是直接在配置中替換值。
helm upgrade my-otel-demo open-telemetry/opentelemetry-demo --values grafana.yaml
如果您尚未安裝圖表,請改用以下命令:
helm install my-otel-demo open-telemetry/opentelemetry-demo --values grafana.yaml
Explore
頁面,選擇您的 traces 數據源,然後在 Query Type
下單擊 Search
。 frontend
、adservice
、cartservice
等名稱。frontend
並在右上角單擊 Run query
。注意:來自不同服務的 spans 可能在不同的時間到達存儲,這解釋了
<root span not yet received>
消息。最終,應該可以使用 root span。
rate(calls_total{service_name="frontend"}[5m])
注意:目前,OpenTelemetry Collector 的日誌功能尚在開發中。也就是說,您可以使用一些組件從如
journald
和本地磁盤文件等來源捕獲日誌條目,然後將它們轉換為 OTLP 數據並使它們對像 OTLP 和 Loki exporters 這樣的導出器可用。我們目前缺乏可以從我們的容器或 Kubernetes pods 抓取日誌條目的接收器。因此,我們的示例部署了一個 OpenTelemetry Collector 作為DaemonSet
,在 pod 上掛載 logs node 路徑。我們使用filelog
接收器來讀取 pods 的日誌。
您應該看到 frontend
服務的幾個日誌條目:
OpenTelemetry 示範包含了多個微服務,模擬了常見的分布式系統模式。每一個服務都使用 OpenTelemetry SDK 進行了儀表化,並使用 OTLP Exporter 為各自的 SDK 導出它的遙測數據。每個微服務都將遙測數據發送到我們部署為 DaemonSet 的 Collector,然後 Collector 將數據發送到最終目的地:Grafana Cloud 的各個數據庫,如 Grafana Cloud Metrics 和 Grafana Cloud Traces。我們還讓 Collector 抓取集群中的 pods 的本地日誌文件,將原始日誌行轉換為 OTLP,最終將它們導出到 Grafana Cloud Logs。
如果您遇到速率限制錯誤,如:the request has been rejected because the tenant exceeded the ingestion rate limit, set to 1500 items/s with a maximum allowed burst of 15000
請減少從負載生成器(http://localhost:8080/loadgen/)產生的合成用戶數量和生成速率。
Grafana Cloud Traces 的 URL 只應包含主機名和端口。在我們的例子中,它應該是 tempo-us-central1.grafana.net:443
。否則,可能會出現以下錯誤:transport: Error while dialing dial tcp: address tempo-us-central1.grafana.net/tempo: missing port in address
在本文中,您學會了如何通過 OpenTelemetry Collector 將生成 OTLP 數據的應用程序連接到 Grafana Cloud Metrics 和 Grafana Cloud Traces。您還學會了如何獲取本地日誌並將它們發送到 Grafana Cloud Logs。雖然這仍然是 Grafana Cloud 中有 SLA 的官方支持的解決方案,但我們鼓勵您嘗試我們的新 OTLP 端點,它簡化了本指南中使用的許多配置。