iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
Cloud Native

時光之鏡:透視過去、現在與未來的 Observability系列 第 26

Grafana Agent 與 Cloud — 想喝牛奶不必養牛,專業團隊協助維運

  • 分享至 

  • xImage
  •  

系列文章介紹至此,我們已涵蓋了多種 Observability 工具,從生成、收集、儲存,到使用各方面。然而,這些工具通常分散在不同平台和服務中,要建立一個全面的監控系統還得自行架設和維護。對於有專門團隊負責監控的大型組織來說,這或許不是問題;但對小團隊或個人開發者而言,這意味著需要投注不少時間在基礎設施的架設和維護上,而這些時間原本可以用於開發。

SaaS 服務應運而生,讓使用者能快速建立監控系統,無需耗費過多時間在架設與維運上。市場上提供這類服務的公司有很多,例如 DatadogNew RelicGrafana Cloud 等,它們提供一站式的監控解決方案,我們只需要生成資訊並將資訊傳送到服務上,就可以快速的建立監控系統。

Grafana Cloud

Grafana Cloud 是由 Grafana Labs 推出的 SaaS 服務,提供全面的監控解決方案,包括 Prometheus Metrics、Loki、Tempo、Pyroscope 和 Grafana 等工具。透過代管的資料儲存服務與 Grafana,使用者能快速建立監控系統。免費方案包括每類 50GB 的 Logs、Traces 和 Profiles,以及 1 萬筆的 Prometheus Metrics,資料保存期限為14天。如需更多資源,可參考官方網站查看付費方案,但如果只是小型的個人專案,免費方案的額度應該是相當足夠。

Grafana Cloud
Grafana Cloud 提供的服務

Grafana Labs 收購了負載測試工具 k6 後,也將其整合到 Grafana Cloud 平台上。透過雲端機器進行負載測試,不僅能避免本地硬體資源不足,還能測試不同地區用戶的使用體驗。測試結果可直接在 Grafana Cloud 的介面查看,並與其他觀測數據相結合,以便更快速地定位問題。

Grafana Cloud k6
k6 在 Grafana Cloud 上的負載測試結果報告

Grafana Agent

過去,Grafana Agent 主要為 Grafana Cloud 設計,負責收集並上傳資料。但其功能已轉型為一款通用的 Telemetry Collector,並支援使用 OpenTelemetry Protocol 來收集和輸出 Logs、Metrics 和 Traces 等資料。不過 Grafana Agent 仍有對 Grafana 的 LGTM(Loki、Grafana、Tempo、Mimir) Stack 進行了最佳化,因此在這些方面的支援度最高。

Grafana Agent Pipeline

Mode

Grafana Agent 的使用方式分為兩種:

  1. Static Mode:這是預設模式,從初始版本就有,與 Grafana Cloud 整合較為緊密。
  2. Flow Mode:自 2022 年 9 月的 0.29 版本開始提供,採用類似 Terraform 的語法,支援 OpenTelemetry 並附帶 UI 供排查 Pipeline 問題。

本篇將主要以 Flow Mode 為例,其基礎設定檔格式如下:

BLOCK_NAME "BLOCK_LABEL" {
  // Block body
  IDENTIFIER = EXPRESSION // Attribute
}

每個區塊都對應一個 Component,例如可抓取 Prometheus Metrics 的 prometheus.scrape,或是可讀取檔案的 local.file,以及能以 OTLP 格式輸出資料的 otelcol.exporter.otlp。透過這些 Component,可以建立一個完整的 Pipeline。完整的 Component 清單可以參考 Components reference

Grafana Agent UI
透過 Grafana Agent UI 可以看到設定了哪些 Component,以及其設定內容與健康狀態

Metrics

以最基本的 Metrics 收集為例,Grafana Agent 能協助爬取指定的 Path,然後透過 Prometheus remote write API 上傳至 Prometheus。

prometheus.scrape "default" {
  // 指定要爬取的服務,透過 __address__ 這個 Label 設定 Domain 或 IP 與 Port 號,預設 Path 為 /metrics
  targets = [{"__address__" = "localhost:12345"}]
  forward_to = [prometheus.remote_write.prom.receiver]
}

prometheus.scrape "app" {
  targets = [
    {"__address__" = "app-a:8000", "app" = "app-a"},
    {"__address__" = "app-b:8000", "app" = "app-b"},
    {"__address__" = "app-c:8000", "app" = "app-c"},
  ]
  forward_to = [prometheus.remote_write.prom.receiver]
}

prometheus.remote_write "prom" {
  endpoint {
    url = "http://prometheus:9090/api/v1/write"
  }
}

Grafana Metrics Pipeline
Grafana Agent UI Pipeline 示意圖

Grafana Agent 的 UI 可以將設定檔轉換為 Pipeline 圖,能夠清楚地看到資料流向。從上面的設定檔可見,已建立兩個爬取元件。這些抓取到的資料指標會先傳送到 prometheus.remote_write.prom 元件的 receiver,再透過 prometheus.remote_write.prom 元件中的 endpoint 轉送至 Prometheus。

Logs

在 Logs 方面,除了基本的檔案讀取外,Grafana Agent 也提供以下方式來獲取 Container 的 Log,並加上跟 Container 相關的 Label:

loki.source.docker "default" {
  host       = "unix:///var/run/docker.sock"
  targets    = discovery.docker.linux.targets 
  forward_to = [loki.write.local.receiver]
  relabel_rules = loki.relabel.docker_label.rules
}

discovery.docker "linux" {
  host = "unix:///var/run/docker.sock"
}

loki.relabel "docker_label" {
  forward_to = [loki.write.local.receiver]

  rule {
    source_labels = ["__meta_docker_container_name"]
    regex         = "/(.*)"
    target_label  = "container"
  }
}

loki.write "local" {
  endpoint {
    url = "http://loki:3100/loki/api/v1/push"
  }
}

Grafana Logs Pipeline
Grafana Agent UI Pipeline 示意圖

  1. discovery.docker:取得 Docker Container 的清單
  2. loki.source.docker:取得指定清單的 Container 的 Log 以及 Label
  3. loki.relabel:將取得的 Label 轉換非 __ 開頭的 Label,以供後續在 Loki 中使用
  4. loki.write 將資料輸出至 Loki

discovery.docker data
discovery.docker 取得資訊可透過 Grafana Agent UI 檢視

Traces

Grafana Agent 自稱 Telemetry Collector 當然也是支援 OpenTelemetry Protocol,能夠接入與輸出 OTLP 格式的資料。例如,可以使用 otelcol.receiver.otlp 接收 Trace 資料,再透過 otelcol.exporter.otlp 輸出至 Tempo。

otelcol.receiver.otlp "default" {
  grpc {
    endpoint = "0.0.0.0:4317"
  }

  output {
    traces  = [otelcol.exporter.otlp.tempo.input]
  }
}

otelcol.exporter.otlp "tempo" {
  client {
    endpoint = "http://tempo:4317"
    tls {
      insecure = true
    }
  }
}

Grafana Traces Pipeline
Grafana Agent UI Pipeline 示意圖

To Grafana Cloud

前面的範例都是將資料收集至本地,如果要將資料收集至 Grafana Cloud,只需要將 Grafana Cloud API Key 與 Grafana Cloud 中對應服務的 URL 和 User 設定在對應的元件中即可,例如:

Grafana Cloud Prometheus
Grafana Cloud Prometheus 中的設定檔

prometheus.remote_write "cloud" {
  endpoint {
    url = env("PROMETHEUS_URL")
    basic_auth {
      username = env("PROMETHEUS_USERNAME")
      password = env("GRAFANA_CLOUD_API_KEY")
    }
  }
}

loki.write "cloud" {
  endpoint {
    url = env("LOKI_URL")
    basic_auth {
      username = env("LOKI_USERNAME")
      password = env("GRAFANA_CLOUD_API_KEY")
    }
  }
}

otelcol.exporter.otlp "cloud" {
  client {
    endpoint = env("TEMPO_URL")
    auth     = otelcol.auth.basic.grafana_cloud_tempo.handler
  }
}

otelcol.auth.basic "grafana_cloud_tempo" {
    username = env("TEMPO_USERNAME")
    password = env("GRAFANA_CLOUD_API_KEY")
}

透過環境變數的方式設定 API KEY 與 URL 等,可以避免將敏感資訊寫在設定檔中,就能夠將當案也放在版本控制系統中。

Lab

範例程式碼:26-grafana-agent-and-cloud

Quick Start

Grafana Agent

  1. 啟動所有服務

    docker-compose up -d
    
  2. 檢視服務

    1. FastAPI App
      1. app-a: http://localhost:8000
      2. app-b: http://localhost:8001
      3. app-c: http://localhost:8002
    2. Prometheus: http://localhost:9090
    3. Grafana Agent: http://localhost:12345
    4. Grafana: http://localhost:3000,登入帳號密碼為 admin/admin
      1. 使用 k6 發送 Request

        k6 run --vus 1 --duration 300s k6-script.js
        
      2. 使用 Explore 檢視 Tempo、Loki、Prometheus 資料

  3. 關閉所有服務

    docker-compose down
    

Grafana Cloud

  1. 註冊 Grafana Cloud 帳號

  2. 建立 API Key

  3. 將 Grafana Cloud 上 Prometheus、Loki、Tempo 的資訊填入 cloud.env.template,並且將檔名改為 cloud.env

  4. 啟動所有服務

    docker-compose -f docker-compose.cloud.yaml up -d
    
  5. 檢視服務

    1. FastAPI App
      1. app-a: http://localhost:8000
      2. app-b: http://localhost:8001
      3. app-c: http://localhost:8002
    2. Prometheus: http://localhost:9090
    3. Grafana Agent: http://localhost:12345
    4. Grafana: 進入 Grafana Cloud 上的 Grafana
      1. 使用 k6 發送 Request

        k6 run --vus 1 --duration 300s k6-script.js
        
      2. 使用 Explore 檢視 Tempo、Loki、Prometheus 資料

  6. 關閉所有服務

    docker-compose -f docker-compose.cloud.yaml down
    

Goals

Grafana Agent

  1. 建立 FastAPI App(app-a、app-b、app-c)
    1. 透過 OpenTelemetry Manual Instrumentation 產生與收集 Traces,並發送至 Grafana Agent
    2. 透過 OpenTelemetry Manual Instrumentation,將 Trace id 加入 Log 中,輸出於 console
    3. 透過 Prometheus Client 產生 OpenMetrics 格式的 Metrics,揭露於 /metrics endpoint
  2. 建立 Grafana Agent
    1. 爬取 Prometheus Metrics 後 Remote Write 至 Prometheus
    2. 爬取 Docker Container Log 後轉送至 Loki
    3. 接收 OTEL 格式的 Trace 資料後轉發至 Tempo
  3. 建立 Tempo,接收 Traces 資料
  4. 建立 Loki,搭配 Loki Docker Driver 收集 Container Log
  5. 建立 Prometheus,啟用 Exemplar 功能,收集 app-a、app-b、app-c 的 Metrics
  6. 建立 Grafana,查詢 Tempo、Loki、Prometheus 資料

Grafana Cloud

  1. 建立 FastAPI App(app-a、app-b、app-c)
    1. 透過 OpenTelemetry Manual Instrumentation 產生與收集 Traces,並發送至 Grafana Agent
    2. 透過 OpenTelemetry Manual Instrumentation,將 Trace id 加入 Log 中,輸出於 console
    3. 透過 Prometheus Client 產生 OpenMetrics 格式的 Metrics,揭露於 /metrics endpoint
  2. 建立 Grafana Agent
    1. 爬取 Prometheus Metrics 後 Remote Write 至 Grafana Cloud Prometheus
    2. 爬取 Docker Container Log 後轉送至 Grafana Cloud Loki
    3. 接收 OTEL 格式的 Trace 資料後轉發至 Grafana Cloud Tempo

小結

Grafana Agent 不僅能收集多種 Observability Signals 並存至不同後端,也開始大力支援 OpenTelemetry。許多 OpenTelemetry Collector 的功能也可在 Grafana Agent 上使用,例如前面我們介紹過的 Spanmetrics Connector。雖然在一眾 Data Collector 中,Grafana Agent 的功能算是比較少的,但是 Grafana Agent 的優勢在於可以透過 UI 進行排查,如果本來就熟悉 Terraform 的話,學習上會更容易上手。就算不是搭配 Grafna Cloud 也可以有不錯的應用場景,例如負責收集機器上不同的服務的 Prometheus Metrics,再轉發給 Prometheus。

目前,各種開源專案的公司主要透過提供 SaaS 服務來盈利,這些服務包括資料收集和視覺化平台。透過規模經濟,使用者能迅速建立監控系統,而不必花太多時間在建置和維護上。就如 IKEA 的工具租賃服務,客戶真正需要的不是電鑽,而是「一個洞」,SaaS 服務正是提供這「洞」的解決方案。

參考資料

  1. Introducing programmable pipelines with Grafana Agent Flow
  2. Why we created a Prometheus Agent mode from the Grafana Agent

上一篇
Profiles 與 eBPF — Unlocking The Kernel
下一篇
In Production - 準備釋放你的 Observability 原力吧!
系列文
時光之鏡:透視過去、現在與未來的 Observability30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言