Grafana+Prometheus 搭建 JuiceFS 可視化監控系統

  • 2022 年 5 月 25 日
  • 筆記

作為承載海量數據存儲的分散式文件系統,用戶通常需要直觀地了解整個系統的容量、文件數量、CPU 負載、磁碟 IO、快取等指標的變化。

JuiceFS 沒有重複造輪子,而是通過 Prometheus 兼容的 API 對外提供實時的狀態數據,只需將其添加到用戶自建的 Prometheus Server 建立時序數據,然後通過 Grafana 等工具即可輕鬆實現 JucieFS 文件系統的可視化監控。

快速上手

這裡假設你搭建的 Prometheus Server、Grafana 與 JuiceFS 客戶端都運行在相同的主機上。其中:

  • Prometheus Server:用於收集並保存各種指標的時序數據,安裝方法請參考官方文檔。
  • Grafana:用於從 Prometheus 讀取並可視化展現時序數據,安裝方法請參考官方文檔。

Ⅰ. 獲得實時數據

JuiceFS 通過 Prometheus 類型的 API 對外提供數據。文件系統掛載後,默認可以通過 //localhost:9567/metrics 地址獲得客戶端輸出的實時監控數據。

Ⅱ. 添加 API 到 Prometheus Server

編輯 Prometheus 的配置文件,添加一個新 job 並指向 JuiceFS 的 API 地址,例如:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "juicefs"    static_configs:      - targets: ["localhost:9567"]

假設配置文件名為 prometheus.yml,載入該配置啟動服務:

./prometheus --config.file=prometheus.yml

訪問 //localhost:9090 即可看到 Prometheus 的介面。

Ⅲ. 通過 Grafana 展現 Prometheus 的數據

如下圖所示,新建 Data Source:

  • Name: 為了便於識別,可以填寫文件系統的名稱。
  • URL: Prometheus 的數據介面,默認為 //localhost:9090

然後,使用 grafana_template.json 創建一個儀錶盤。進入新建的儀錶盤即可看到文件系統的可視化圖表了:

收集監控指標

根據部署 JuiceFS 的方式不同可以有不同的收集監控指標的方法,下面分別介紹。

掛載點

當通過 juicefs mount 命令掛載 JuiceFS 文件系統後,可以通過 //localhost:9567/metrics 這個地址收集監控指標,你也可以通過 --metrics 選項自定義。如:

$ juicefs mount --metrics localhost:9567 ...

你可以使用命令行工具查看這些監控指標:

$ curl //localhost:9567/metrics

除此之外,每個 JuiceFS 文件系統的根目錄還有一個叫做 .stats 的隱藏文件,通過這個文件也可以查看監控指標。例如(這裡假設掛載點的路徑是 /jfs):

$ cat /jfs/.stats

Kubernetes

JuiceFS CSI 驅動默認會在 mount pod 的 9567 埠提供監控指標,也可以通過在 mountOptions 中添加 metrics 選項自定義(關於如何修改 mountOptions 請參考 CSI 驅動文檔),如:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: juicefs-pv
  labels:
    juicefs-name: ten-pb-fs
spec:
  ...
  mountOptions:
    - metrics=0.0.0.0:9567

新增一個抓取任務到 prometheus.yml 來收集監控指標:

scrape_configs:
  - job_name: 'juicefs'
    kubernetes_sd_configs:
    - role: pod
    relabel_configs:
    - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name]
      action: keep
      regex: juicefs-mount
    - source_labels: [__address__]
      action: replace
      regex: ([^:]+)(:\d+)?
      replacement: $1:9567
      target_label: __address__
    - source_labels: [__meta_kubernetes_pod_node_name]
      target_label: node
      action: replace

這裡假設 Prometheus 服務運行在 Kubernetes 集群中,如果你的 Prometheus 服務運行在 Kubernetes 集群之外,請確保 Prometheus 服務可以訪問 Kubernetes 節點,請參考這個 issue 添加 api_server 和 tls_config 配置到以上文件:

scrape_configs:
  - job_name: 'juicefs'
    kubernetes_sd_configs:
    - api_server: <Kubernetes API Server>
      role: pod
      tls_config:
        ca_file: <...>
        cert_file: <...>
        key_file: <...>
        insecure_skip_verify: false
    relabel_configs:
    ...

S3 網關

JuiceFS S3 網關默認會在 //localhost:9567/metrics 這個地址提供監控指標,你也可以通過 --metrics 選項自定義。如:

$ juicefs gateway --metrics localhost:9567 ...

如果你是在 Kubernetes 中部署 JuiceFS S3 網關,可以參考 Kubernetes 小節的 Prometheus 配置來收集監控指標(區別主要在於 __meta_kubernetes_pod_label_app_kubernetes_io_name 這個標籤的正則表達式),例如:

scrape_configs:
  - job_name: 'juicefs-s3-gateway'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name]
        action: keep
        regex: juicefs-s3-gateway
      - source_labels: [__address__]
        action: replace
        regex: ([^:]+)(:\d+)?
        replacement: $1:9567
        target_label: __address__
      - source_labels: [__meta_kubernetes_pod_node_name]
        target_label: node
        action: replace

通過 Prometheus Operator 收集

Prometheus Operator 讓用戶在 Kubernetes 環境中能夠快速部署和管理 Prometheus,藉助 Prometheus Operator 提供的 ServiceMonitor CRD 可以自動生成抓取配置。例如(假設 JuiceFS S3 網關的 Service 部署在 kube-system 名字空間):

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: juicefs-s3-gateway
spec:
  namespaceSelector:
    matchNames:
      - kube-system
  selector:
    matchLabels:
      app.kubernetes.io/name: juicefs-s3-gateway
  endpoints:
    - port: metrics

Hadoop

JuiceFS Hadoop Java SDK 支援把監控指標上報到 Pushgateway 或者 Graphite。

Pushgateway

啟用指標上報到 Pushgateway:

<property>
  <name>juicefs.push-gateway</name>
  <value>host:port</value>
</property>

同時可以通過 juicefs.push-interval 配置修改上報指標的頻率,默認為 10 秒上報一次。

根據 Pushgateway 官方文檔的建議,Prometheus 的抓取配置中需要設置 honor_labels: true。

需要特別注意,Prometheus 從 Pushgateway 抓取的指標的時間戳不是 JuiceFS Hadoop Java SDK 上報時的時間,而是抓取時的時間,具體請參考 Pushgateway 官方文檔。

默認情況下 Pushgateway 只會在記憶體中保存指標,如果需要持久化到磁碟上,可以通過 --persistence.file 選項指定保存的文件路徑以及 --persistence.interval 選項指定保存到文件的頻率(默認 5 分鐘保存一次)。

每一個使用 JuiceFS Hadoop Java SDK 的進程會有唯一的指標,而 Pushgateway 會一直記住所有收集到的指標,導致指標數持續積累佔用過多記憶體,也會使得 Prometheus 抓取指標時變慢,建議定期清理 Pushgateway 上的指標。

定期使用下面的命令清理 Pushgateway 的指標數據,清空指標不影響運行中的 JuiceFS Hadoop Java SDK 持續上報數據。注意 Pushgateway 啟動時必須指定 --web.enable-admin-api 選項,同時以下命令會清空 Pushgateway 中的所有監控指標。

$ curl -X PUT //host:9091/api/v1/admin/wipe

Graphite

啟用指標上報到 Graphite:

<property>
  <name>juicefs.push-graphite</name>
  <value>host:port</value>
</property>

同時可以通過 juicefs.push-interval 配置修改上報指標的頻率,默認為 10 秒上報一次。

JuiceFS Hadoop Java SDK 支援的所有配置參數請參考文檔。

使用 Consul 作為註冊中心

JuiceFS 支援使用 Consul 作為監控指標 API 的註冊中心,默認的 Consul 地址是 127.0.0.1:8500,你也可以通過 --consul 選項自定義。如:

$ juicefs mount --consul 1.2.3.4:8500 ...

當配置了 Consul 地址以後,--metrics 選項不再需要配置,JuiceFS 將會根據自身網路與埠情況自動配置監控指標 URL。如果同時設置了 --metrics,則會優先嘗試監聽配置的 URL。

註冊到 Consul 上的每個實例,其 serviceName 都為 juicefs,serviceId 的格式為 <IP>:<mount-point>,例如:127.0.0.1:/tmp/jfs。

每個 instance 的 meta 都包含了 hostname 與 mountpoint 兩個維度,其中 mountpoint 為 s3gateway 代表該實例為 S3 網關。

可視化監控指標

Grafana 儀錶盤模板

JuiceFS 提供一些 Grafana 的儀錶盤模板,將模板導入以後就可以展示收集上來的監控指標。目前提供的儀錶盤模板有:

模板名稱 說明
grafana_template.json 用於展示自掛載點、S3 網關(非 Kubernetes 部署)及 Hadoop Java SDK 收集的指標
grafana_template_k8s.json 用於展示自 Kubernetes CSI 驅動、S3 網關(Kubernetes 部署)收集的指標

Grafana 儀錶盤示例效果如下圖:

總結

使用 Grafana 做為宏觀觀測工具,當出現異常情況時可以首先觀察其中是否存在異常指標,再進行進一步的分析。同時重要指標建議設置報警提示,以便實時獲取系統狀態異常的通知。

如有幫助的話歡迎關注我們項目 Juicedata/JuiceFS 喲! (0ᴗ0✿)

Tags: