OpenTelemetry和Prometheus的整合,能提供更全面的可觀測性。OpenTelemetry收集器作為核心元件,透過接收器、處理器和匯出器,實作對遙測資料的收集、處理和匯出。要將兩者整合,首先需組態Prometheus接收器,使OpenTelemetry收集器能從應用程式收集Prometheus指標。接著,設定Prometheus匯出器,將收集到的指標傳送到Prometheus伺服器,實作監控和告警。過程中,YAML組態檔案定義了接收器、匯出器和處理流程,而Python程式碼則示範瞭如何組態OpenTelemetry收集器和處理指標資料。

將Prometheus與OpenTelemetry整合

OpenTelemetry收集器架構概述

OpenTelemetry收集器是接收、處理和匯出遙測資料的關鍵元件。它由三個主要部分組成:接收器(Receivers)、處理器(Processors)和匯出器(Exporters)。

接收器(Receivers)

接收器是OpenTelemetry收集器的第一道工序,負責接收來自各類別來源的遙測資料。這些來源可以是應用程式、日誌檔案或其他監控系統。接收器支援多種協定和格式,例如OTLP(OpenTelemetry Protocol)、Prometheus遠端寫入協定等。

處理器(Processors)

處理器是OpenTelemetry收集器的中介軟體,用於對接收到的資料進行過濾和轉換。處理器提供了一個強大的工具,用於新增通用元資料、過濾和合併遙測資料。

匯出器(Exporters)

匯出器是OpenTelemetry收集器處理遙測資料的最後階段。它們組態資料的傳送目的地,例如將日誌傳送到日誌儲存後端,或將指標推播到Prometheus例項。

OpenTelemetry收集器Contrib倉函式庫

OpenTelemetry收集器的Contrib倉函式庫提供了大量的額外外掛,包括接收器、處理器和匯出器。這些外掛擴充套件了OpenTelemetry收集器的功能,使其能夠與更多的系統和服務整合。

與Prometheus整合

要將OpenTelemetry收集器與Prometheus整合,首先需要使用Prometheus接收器從已暴露Prometheus指標的應用程式收集資料。

組態OpenTelemetry收集器

receivers:
  prometheus:
    config:
      scrape_configs:
        - job_name: "otel-collector"
          scrape_interval: 15s
          static_configs:
            - targets: ["127.0.0.1:8888"]

exporters:
  debug:
    verbosity: detailed

service:
  pipelines:
    metrics:
      receivers: [prometheus]
      exporters: [debug]

執行上述組態後,OpenTelemetry收集器將抓取自身的Prometheus指標,並使用Debug匯出器將資料輸出到終端。

程式碼解析

import logging
import yaml

def configure_opentelemetry_collector(config_file):
    """
    組態OpenTelemetry收集器
    :param config_file: 組態檔案路徑
    """
    try:
        with open(config_file, 'r') as f:
            config = yaml.safe_load(f)
        logging.info("OpenTelemetry收集器組態成功")
    except Exception as e:
        logging.error(f"組態OpenTelemetry收集器失敗: {e}")

# 使用範例
configure_opentelemetry_collector("otelcol-config-debug.yaml")

圖表:OpenTelemetry收集器工作流程

  flowchart TD
    A[啟動OpenTelemetry收集器] --> B{組態載入成功?}
    B -->|是| C[初始化接收器]
    B -->|否| D[記錄錯誤並離開]
    C --> E[啟動抓取任務]
    E --> F[抓取Prometheus指標]
    F --> G[處理指標資料]
    G --> H[匯出資料到目標系統]

圖表翻譯:

此圖示展示了OpenTelemetry收集器的基本工作流程。首先,收集器啟動並嘗試載入組態檔案。如果組態載入成功,則初始化接收器並啟動抓取任務。抓取任務負責從目標應用程式抓取Prometheus指標。抓取到的指標資料會被處理並最終匯出到組態的目標系統。

將指標傳送到Prometheus

要將指標傳送到Prometheus,需要使用OpenTelemetry收集器的Prometheus匯出器。

設定Prometheus匯出器

exporters:
  prometheus:
    endpoint: "0.0.0.0:1234"
    namespace: "otel"
    const_labels:
      label1: "value1"

service:
  pipelines:
    metrics:
      receivers: [prometheus]
      exporters: [prometheus]

上述組態將OpenTelemetry收集器接收到的指標透過Prometheus匯出器暴露在http://0.0.0.0:1234/metrics

程式碼:指標處理範例

from opentelemetry import metrics

def process_metrics(meter_name):
    """
    處理指標資料
    :param meter_name: 計量器名稱
    """
    meter = metrics.get_meter(meter_name)
    counter = meter.create_counter("example_counter")
    counter.add(1, {"label1": "value1"})

# 使用範例
process_metrics("example_meter")

圖表:指標傳送流程

  sequenceDiagram
    participant OTEL as "OpenTelemetry收集器"
    participant Prometheus as "Prometheus伺服器"
    OTEL->>Prometheus: 暴露指標
    Prometheus->>OTEL: 抓取指標
    OTEL->>Prometheus: 傳回指標資料

圖表翻譯:

此圖示展示了OpenTelemetry收集器與Prometheus之間的指標傳送流程。OpenTelemetry收集器首先將指標資料暴露出來,Prometheus伺服器定期抓取這些指標。抓取過程中,Prometheus向OpenTelemetry收集器傳送HTTP請求,收集器則傳回指標資料。

與 OpenTelemetry 整合 Prometheus

設定 Prometheus 以支援 OTLP 接收器

要讓 Prometheus 支援 OpenTelemetry 的 OTLP 接收器,需要調整 Helm 圖表來安裝較新版本的 Prometheus,並在 Prometheus 程式中新增 --enable-feature=otlp-write-receiver 旗標。

Helm 值檔案範例

grafana:
  enabled: true
  defaultDashboardsTimezone: browser
  adminUser: root
  adminPassword: m@ster1ngPr0m3th3us

prometheus:
  prometheusSpec:
    serviceMonitorSelectorNilUsesHelmValues: false
    enableFeatures:
      - otlp-write-receiver
    image:
      tag: v2.49.1
    cleanPrometheusOperatorObjectNames: true

設定 OpenTelemetry 收集器

要將指標資料從 OpenTelemetry 收集器傳送到 Prometheus,需要更改收集器組態中的匯出器。

組態OpenTelemetry收集器

exporters:
  otlphttp:
    endpoint: http://localhost:9090/api/v1/otlp

service:
  pipelines:
    metrics:
      receivers: [prometheus]
      exporters: [otlphttp]

整合 Prometheus 與 OpenTelemetry 的考量

將 OpenTelemetry 收集器的指標資料傳送到 Prometheus 需要謹慎使用。不要依賴 Prometheus 接收器來確保資料傳送過程的成功。

超越 Prometheus:擴充套件可觀測性的新境界

認識未知的未知

「未知的未知」指的是我們不知道自己不知道什麼。在與Prometheus相關的上下文中,「未知的未知」可能是指尚不存在的指標。

邁向動態遙測

為了實作更動態的遙測,需要超越Prometheus,考慮其他更適合的遙測訊號,即日誌和追蹤。

日誌的複雜性

日誌的核心問題在於大多數日誌是非結構化的。結構化日誌正變得越來越普遍,但要達到人類可讀性與機器可解析性的完美平衡仍然困難。

程式碼:解析logfmt格式的日誌

import re

def parse_logfmt(log_line):
    pattern = r'(\S+)=(".*?"|\S+)'
    matches = re.findall(pattern, log_line)
    return {key: value.strip('"') for key, value in matches}

# 示例日誌行
log_line = 'ts=2024-01-27T03:00:01.861Z caller=head.go:1287 level=info component=tsdb msg="WAL checkpoint complete" first=70 last=71 duration=1.18069471s'
parsed_log = parse_logfmt(log_line)
print(parsed_log)

圖表:日誌處理流程

  flowchart TD
    A[開始處理日誌] --> B{檢查日誌格式}
    B -->|格式正確| C[解析日誌內容]
    B -->|格式錯誤| D[回報錯誤]
    C --> E[提取指標]
    D --> E
    E --> F[完成處理]

圖表翻譯:

此圖示展示了日誌處理的基本流程。首先檢查日誌格式是否正確,如果正確則進行解析;如果格式錯誤,則回報錯誤。無論日誌格式是否正確,流程最終都會進入提取指標的階段,並完成處理。

Prometheus 作為監控系統的根本,與 OpenTelemetry 的整合已成為雲原生時代可觀測性的關鍵趨勢。深入剖析 OpenTelemetry 的收集器架構,可以發現其靈活的外掛機制和多協定支援為整合 Prometheus 指標資料提供了高效便捷的途徑。透過 Prometheus 接收器,OpenTelemetry 可以有效地收集現有應用程式的指標,並利用處理器進行資料轉換和增強,最終透過不同匯出器將資料傳送到 Prometheus 或其他後端系統。然而,技術限制深析顯示,單純依靠 Prometheus 接收器並不能完全保證資料的可靠傳輸,尤其在網路不穩定或系統負載高的情況下。

此外,技術演進預測顯示,未來的可觀測性將超越單純的指標監控,整合日誌和追蹤資料才能提供更全面的系統洞察。結構化日誌的興起和動態遙測的需求,都驅使我們探索更先進的日誌解析和處理技術,例如文中提到的 logfmt 解析範例。這也意味著,技術團隊應著重於提升日誌的結構化程度和處理效率,才能更好地應對日益複雜的系統監控挑戰。隨著 OpenTelemetry 生態的持續發展,我們預見其與 Prometheus 的整合將更加緊密,並推動整個可觀測性領域向更動態、更全面的方向演進。玄貓認為,主動擁抱 OpenTelemetry 並探索其與 Prometheus 的整合方案,將是企業提升可觀測效能力,在雲原生時代保持競爭力的關鍵策略。