Grafana+Prometheus 搭建 JuiceFS 可視化監控系統
- 2022 年 5 月 25 日
- 筆記
作為承載海量數據存儲的分散式文件系統,用戶通常需要直觀地了解整個系統的容量、文件數量、CPU 負載、磁碟 IO、快取等指標的變化。
JuiceFS 沒有重複造輪子,而是通過 Prometheus 兼容的 API 對外提供實時的狀態數據,只需將其添加到用戶自建的 Prometheus Server 建立時序數據,然後通過 Grafana 等工具即可輕鬆實現 JucieFS 文件系統的可視化監控。
快速上手
這裡假設你搭建的 Prometheus Server、Grafana 與 JuiceFS 客戶端都運行在相同的主機上。其中:
Ⅰ. 獲得實時數據
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✿)
