使用 Prometheus 監(jiān)控 Ceph

Prometheus

本文是在 Ubuntu 16.04 最新版基礎(chǔ)上安裝 Prometheus 監(jiān)控系統(tǒng),Ceph 版本為 Luminous 12.2.8。

1. 安裝 Prometheus

直接使用 apt 安裝的 Prometheus 版本較低,很多新的配置選項都已不再支持,建議使用 Prometheus 的安裝包,接下來看看安
裝包部署的步驟。

先下載安裝包,這里用的是 2.0.0 版本,目前為止,最新的應(yīng)該為 2.4.0,安裝方法都是一樣的。

$ wget https://github.com/prometheus/prometheus/releases/download/v2.0.0/prometheus-2.0.0.linux-amd64.tar.gz
$ tar zxvf prometheus-2.0.0.linux-amd64.tar.gz
$ cd prometheus-2.0.0.linux-amd64/
$ sudo cp prometheus /usr/bin/
$ sudo cp promtool /usr/bin/
$ vim /lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus: the monitoring system
Documentation=http://prometheus.io/docs/

[Service]
ExecStart=/usr/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries --web.listen-address=0.0.0.0:9090 --web.external-url=
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target
$ sudo mkdir /etc/prometheus/ 
$ sudo cp -R consoles console_libraries prometheus.yml /etc/prometheus/
$ sudo mkdir /var/lib/prometheus/
$ sudo systemctl daemon-reload
$ sudo systemctl enable prometheus.service
$ sudo systemctl start prometheus.service

在下一步裝好 ceph_exporter 后,還需要在 Promethues 中添加相應(yīng)配置,不過現(xiàn)在執(zhí)行到這一步就可以了。

2. 安裝 ceph_exporter

2.1 安裝 Go 語言環(huán)境

導(dǎo)出 Ceph 信息到 Prometheus 有多種方式,本文采用的是 DigitalOcean 的 ceph_exporter,ceph_exporter 使用 go 語言編寫的,所以需要先安裝 go 語言環(huán)境。還是一條命令解決:

$ sudo apt install -y golang

安裝好后執(zhí)行 $ go env 命令驗證并查看一下 go 環(huán)境信息。

$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH=""
GORACE=""
GOROOT="/usr/lib/go-1.6"
GOTOOLDIR="/usr/lib/go-1.6/pkg/tool/linux_amd64"
GO15VENDOREXPERIMENT="1"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"

然后需要設(shè)置 Go 環(huán)境變量:

$ cat /etc/profile.d/go.sh 
export GOROOT=/usr/lib/go-1.6
export GOBIN=$GOROOT/bin
export GOPATH=/home/<user-name>/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

$ source /etc/profile.d/go.sh

已經(jīng)配置好 Go 環(huán)境了,接下來創(chuàng)建 GOPATH 指定的目錄:

$ mkdir /home/<user-name>/go

2.2 安裝 ceph_exporter

Go 環(huán)境安裝好后,我們接下來下載 ceph_exporter 代碼,然后編譯出可執(zhí)行程序。

$ mkdir -p /home/<user-name>/go/src/github.com/digitalocean
$ cd /home/<user-name>/go/github.com/src/digitalocean
$ git clone https://github.com/digitalocean/ceph_exporter
$ cd ceph_exporter
$ go build

這時編譯會報錯,原因是需要依賴 ceph rados 相關(guān)的頭文件,需要安裝 librados-dev 包。

$ sudo apt install -y librados-dev

安裝好后,在編譯,復(fù)制可執(zhí)行文件到對應(yīng)目錄完成安裝。
再運行 go build 完成安裝。

$ go get
$ go build 
$ mkdir /home/<user-name>/go/bin
$ cp ceph_exporter /home/<user-name>/go/bin

執(zhí)行 ceph_exporter 來驗證一下是否可以正常使用

$ ceph_exporter --help
Usage of ceph_exporter:
  -ceph.config string
        path to ceph config file
  -ceph.user string
        Ceph user to connect to cluster. (default "admin")
  -exporter.config string
        Path to ceph exporter config. (default "/etc/ceph/exporter.yml")
  -rgw.mode int
        Enable collection of stats from RGW (0:disabled 1:enabled 2:background)
  -telemetry.addr string
        host:port for ceph exporter (default ":9128")
  -telemetry.path string
        URL path for surfacing collected metrics (default "/metrics")

接下來要配置 ceph_exporter 的自動啟動:

$ cat /lib/systemd/system/ceph_exporter.service 
[Unit]
Description=Prometheus's ceph metrics exporter
After=prometheus.ervice

[Service]
User=<user-name>
Group=<group-name>
ExecStart=/home/<user-name>/go/bin/ceph_exporter

[Install]
WantedBy=multi-user.target
Alias=ceph_exporter.service

$ sudo systemctl daemon-reload
$ sudo systemctl enable ceph_exporter.service
$ sudo systemctl start ceph_exporter.service

2.3 修改 Promethues 配置

接下來需要修改 Prometheus 的配置,添加一會要安裝的 ceph_exporter 的相關(guān)信息:

$ sudo vim /etc/prometheus/prometheus.yml
...
scrape_configs:
  - job_name: 'ceph_exporter'
    static_configs:
    - targets: ['localhost:9128']
      labels:
        alias: ceph_exporter
...

改好后,重啟:

$ sudo systemctl restart prometheus.service

3. 安裝 Grafana

3.1 安裝

Grafana 也不推薦使用 APT 安裝,原因也是版本太低,安裝官方打包好的版本是更優(yōu)的選擇。

$ sudo apt-get install -y adduser libfontconfig
$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_5.2.4_amd64.deb 
$ sudo dpkg -i grafana_5.2.4_amd64.deb 
$ sudo systemctl enable grafana-server
$ sudo systemctl start grafana-server

至此 Grafana 也已經(jīng)安裝好了,接下來登錄 grafana 界面。

3.2 配置 dashboard

Grafana

訪問 http://localhost:3000 來登錄 Grafana,默認(rèn)用戶為 admin,密碼也是 admin。

data-source

登錄后首先需要配置 data source,訪問地址 http://localhost:3000/datasources,會出現(xiàn)如上圖所示的界面,按照圖中顯示的信息配置即可。

import

最后需要導(dǎo)入 Ceph 相關(guān)的界面,如圖所示,導(dǎo)入的是編號為 917 的 dashboard(從 grafana.com 上,導(dǎo)入編號為 917 的 dashboard)。

ceph-cluster

完成后,終于可以看到 Ceph 的監(jiān)控信息了。

4. 告警系統(tǒng)

現(xiàn)在已經(jīng)有了圖形化界面的狀態(tài)監(jiān)控,但出現(xiàn)緊急情況我們肯定不希望要登錄到界面上才能察覺到,在 Prometheus 系統(tǒng)中,這個工作由 AlertManager 組件負(fù)責(zé),接下來我們就以釘釘消息通知為例,看一下如何配置告警系統(tǒng)。

4.1 安裝 AlertManager

AlertManager 的安裝流程和 Prometheus 很像,也是需要下載對應(yīng)的安裝包。

$ wget https://github.com/prometheus/alertmanager/releases/download/v0.15.2/alertmanager-0.15.2.linux-amd64.tar.gz
$ tar zxvf alertmanager-0.15.2.linux-amd64.tar.gz
$ cd alertmanager-0.15.2.linux-amd64
$ sudo cp alertmanager amtool /usr/bin/
$ sudo cp alertmanager.yml /etc/prometheus/

接下來配置 systemd 的 unit 文件。

$ cat /lib/systemd/system/alertmanager.service
[Unit]
Description=Prometheus: the alerting system
Documentation=http://prometheus.io/docs/
After=prometheus.service

[Service]
ExecStart=/usr/bin/alertmanager --config.file=/etc/prometheus/alertmanager.yml
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target

啟動 alermanager 服務(wù),并配置開機(jī)啟動。

$ sudo systemctl enable alertmanager.service
$ sudo systemctl start alertmanager.service

在 Prometheus 中添加 AlertManager 的信息,并重啟 Prometheus。

$ cat /etc/prometheus/prometheus.yml
...
alerting:
  alertmanagers:
    - static_configs:
      - targets: ["localhost:9093"]
$ sudo systemctl restart prometheus.service

4.2 獲取釘釘?shù)?webhook

要往釘釘發(fā)消息,當(dāng)然要先知道 webhook 是多少,首先是在釘釘群里添加一個機(jī)器人,然后查看機(jī)器人的設(shè)置,就可以看到 webhook:

Dingtalk robot API

4.3 配置消息轉(zhuǎn)發(fā)的 API

配置 Prometheus 直接向釘釘 Webhook 發(fā)消息應(yīng)該是發(fā)不過去的,Prometheus 的消息格式和釘釘 webhook 并不兼容,而且就算是拿到消息中的字符串再發(fā)過去,沒經(jīng)過格式化的消息也太難看了。截個未經(jīng)處理的釘釘消息的圖給大家感受一下:

Unformatted prometheus message

所以我們需要配置一個轉(zhuǎn)發(fā)并格式化 Prometheus 消息的 API 服務(wù)器,在網(wǎng)上搜了一下還真的找到一個已經(jīng)做好的格式化 Prometheus 消息的開源項目,完全滿足需求:https://github.com/timonwong/prometheus-webhook-dingtalk,感謝 Timon Wong 的貢獻(xiàn)。接下來介紹一下如何以 Docker 形式部署該 API 服務(wù)。

4.3.1 安裝 Docker

首先當(dāng)然是要先安裝 Docker ,并配置 Docker 從國內(nèi)鏡像源下載鏡像。

$ sudo apt install -y docker.io
$ sudo vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
$ sudo systemctl restart docker.service

4.3.2 啟動 prometheus-webhook-dingtalk

先下載鏡像。

$ sudo docker pull timonwong/prometheus-webhook-dingtalk:v0.3.0

啟動鏡像。
這里解釋一下兩個變量:

  • <web-hook-name> :prometheus-webhook-dingtalk 支持多個釘釘 webhook,不同 webhook 就是靠名字對應(yīng)到 URL 來做映射的。要支持多個釘釘 webhook,可以用多個 --ding.profile 參數(shù)的方式支持,例如:sudo docker run -d --restart always -p 8060:8060 timonwong/prometheus-webhook-dingtalk:v0.3.0 --ding.profile="webhook1=https://oapi.dingtalk.com/robot/send?access_token=token1" --ding.profile="webhook2=https://oapi.dingtalk.com/robot/send?access_token=token2"。而名字和 URL 的對應(yīng)規(guī)則如下,ding.profile="webhook1=......",對應(yīng)的 API URL 為:http://localhost:8060/dingtalk/webhook1/send
  • <dingtalk-webhook>:這個就是之前獲取的釘釘 webhook。
$ sudo docker run -d --restart always -p 8060:8060 timonwong/prometheus-webhook-dingtalk:v0.3.0 --ding.profile="<web-hook-name>=<dingtalk-webhook>"

4.4 配置 AlertManager 告警規(guī)則

首先修改 alertmanager.yml,在下面這個例子中指定了名為 web.hook 的消息接收方,url 為剛剛啟動的 prometheus-webhook-dingtalk 的地址。

$ cat /etc/prometheus/alertmanager.yml
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'web.hook'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://localhost:8060/dingtalk/web.hook/send'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

然后修改 /etc/prometheus/prometheus.yml,添加告警規(guī)則文件。

$ cat /etc/prometheus/prometheus.yml
......
rule_files:
    - /etc/prometheus/rules/ceph.yaml

接下來輪到剛剛提到的告警規(guī)則文件了,下面這個例子中定義了在 ceph 可用存儲空間小于總存儲空間 70% 的情況下,發(fā)出告警消息。

$ cat /etc/prometheus/rules/ceph.yaml
groups:
- name: ceph-rule
  rules:
  - alert: CephCapacityUsage
    expr: ceph_cluster_available_bytes / ceph_cluster_capacity_bytes * 100 > 70 
    for: 2m
    labels:
      product: ceph
    annotations:
      summary: "{{$labels.instance}}: Not enough capacity in Ceph detected"
      description: "{{$labels.instance}}: Available capacity is used up to 70% (current value is: {{ $value }}"

好了,最后重啟 AlertManager 和 Prometheus 就大功告成了。

$ sudo systemctl restart alertmanager.service
$ sudo systemctl restart prometheus.service

最后我們來看看發(fā)出來的消息效果如何,確實比之前好看多了,總算是沒有白費一番功夫。

formatted prometheus message

好了,Prometheus 監(jiān)控 Ceph 到這里就結(jié)束了,多謝各位看官,下期見。

5. 參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 主機(jī)數(shù)據(jù)收集 主機(jī)數(shù)據(jù)的采集是集群監(jiān)控的基礎(chǔ);外部模塊收集各個主機(jī)采集到的數(shù)據(jù)分析就能對整個集群完成監(jiān)控和告警等功...
    梅_梅閱讀 6,787評論 0 7
  • 大家晚上好
    好運常在_ab2a閱讀 237評論 0 0
  • 從前有一個花園,花兒們自由快樂的生長著,有些顏色艷麗,有些素雅,有些濃烈,每一朵都不一樣,花園里還有各種各樣的...
    yoga唯閱讀 665評論 0 4
  • 在美食群里混,每天熱情高漲地學(xué)習(xí)手藝,而且越學(xué)越帶勁,甚至覺得那個詞應(yīng)該叫“上癮”,就像某些男士們的煙癮酒癮一樣,...
    清清小胖閱讀 453評論 2 4
  • 文字經(jīng)過加工成為語言,語言經(jīng)過加工成為文章,文章經(jīng)過加工成為一個人的思想。一層層的加工,簡單的文字是否已失去了它的...
    1cc3a6bd86d4閱讀 411評論 0 0

友情鏈接更多精彩內(nèi)容