# 自定義 Prometheus Exporter 實現多 RDS 數據采集## 背景1. Prometheus 官網提供的 MySQL Exporter 對于 MySQL 實例只能一個進程監控一個實例,數據庫實例很多的情況下,不方便管理。
2. 內部有定制化監控需求,RDS 默認無法實現,比如對數據庫增長的監控。
3. 默認 Prometheus 官網提供的 MySQL Exporter 采集 MySQL 幾乎所有的指標,但實際用到的卻不多,浪費存儲空間。## 思路> 先了解對于數據庫的監控需求:- 一個 Exporter 可以采集所有 RDS 實例數據。
- RDS 實例采集指標不用全部采集,按需即可。
- 定制化需求:- 數據庫磁盤使用率,默認 MySQL 的 status/variables 中沒有該指標。- 統計數據庫、表的總大小(數據大小+索引大小)。### 針對第一個需求之前在使用 Prometheus 監控 Redis 的時候,有個 Exporter 實現了可以同時監控多個實例的情況,大概的思路是:把實例名稱或者地址作為 target 參數傳遞給一個 URL,這個 URL 就是一個 Exporter,然后根據傳遞的不同 `target` 采集相同指標。### 針對第二個需求做過監控的人都知道 MySQL 的監控指標其實都是采集的 `show global status` 和 `show global variables` 的結果然后做相關匯總或者計算。所以我們很容易就可以通過這兩個 SQL 的結果帥選出需要的選項保存在一個配置文件,采集的時候讀取該配置文件選項,按需采集即可。### 針對第三個需求數據庫磁盤使用率 / 統計數據庫、表的總大小都不是從 status/variables 能獲取到的。所以了解 Prometheus 架構的就知道,可以使用 Pushgateway 來實現。## 自定義 Exporter 介紹```bash
cws-mysql-exporter
├── aliyunapi.py
├── config.py
├── generate-instance-yml.py
├── instance.yml
├── metrics.yml
├── utils.py
├── pushgateway.py
├── push_cron_dbsize.py
├── push_cron_rds_cpumemiops.py
└── rds-exporter.py
aliyunapi.py
是封裝的阿里云相關的 API 接口,因為磁盤和 CPU 只能從阿里云獲取,它和主機有關系。config.py
里面定義阿里云 API 的 ak/sk,以及 Exporter 連接數據庫用到的賬號和密碼,這個賬號密碼是所有實例共用的。generate-instance-yml.py
這個是首次需要執行的腳本,生成instance.yml
配置文件,主要是獲取所有 RDS 的實例名稱和連接地址,及instance_id
(因為有些接口入參必須是 instance_id)。
rds-xxxx:host: rm-xxxxxx.mysql.rds.aliyuncs.comid: rm-xxxxxxrds-yyyyy:host: rm-yyyyy.mysql.rds.aliyuncs.comid: rm-yyyyy
metrics.yml
是需要采集的監控指標,分variables
和status
,格式如下:
variables:max_connections: ""max_user_connections: ""... ...
status:Aborted_connects: ""Aborted_clients: ""... ...
utils.py
是封裝的公共函數。pushgateway.py
是封裝的需要推送的 Pushgateway 的監控指標。push_cron_dbsize.py
和push_cron_rds_cpumemiops.py
是包裝的不同維度需要推送到 Pushgateway 的腳本,最終需要在 crontab 中定時去執行。rds-exporter.py
是 Exporter 的入口,這里借助了 Flask 來運行 server。
Exporter 開源地址詳見: 自定義 Exporter 實現多 RDS 數據采集
啟動 rds-exporter,默認端口在 5005。
Prometheus 及組件安裝
這里介紹簡單的安裝和配置,具體的 Prometheus 及其架構介紹網上有很多資料,大家自行查閱即可。
1. 安裝 Prometheus
#!/usr/bin/env bash
# encoding: utf-8
# Author: Eagle
# Desc: 自動化安裝 Prometheus
# version="2.36.1"
if [ $# -eq 1 ]
thenversion="$1"
fiecho "Will install prometheus ${version} version"# download
wget "https://github.com/prometheus/prometheus/releases/download/v${version}/prometheus-${version}.linux-amd64.tar.gz"# untar and set link
tar -zxf prometheus-${version}.linux-amd64.tar.gz -C /opt/app
ln -s /opt/app/prometheus-${version}.linux-amd64 /opt/app/prometheus
2. 安裝 Pushgateway
#!/usr/bin/env bash
# encoding: utf-8
# Author: Eagle
# Desc: 自動化安裝 Prometheus Pushgateway
# version="1.4.3"
if [ $# -eq 1 ]
thenversion="$1"
fiecho "Will install prometheus pushgatewa ${version} version"
wget "https://github.com/prometheus/pushgateway/releases/download/v${version}/pushgateway-${version}.linux-amd64.tar.gz"# untar and set link
tar -zxf pushgateway-${version}.linux-amd64.tar.gz -C /opt/app
ln -s /opt/app/pushgateway-${version}.linux-amd64 /opt/app/pushgateway
3. 啟動 Pushgateway
配置 systemd service,文件位置 /usr/lib/systemd/system/pushgateway.service
Description=Prometheus Pushgateway Service
Requires=network-online.target
After=network-online.target[Service]
Restart=on-failure
ExecStart=/opt/app/pushgateway/bin/pushgateway[Install]
WantedBy=multi-user.target
- 配置開啟自啟動
systemctl enable pushgateway
- 啟動/停止/重啟
systemctl start/stop/restart pushgateway
Pushgateway 不需要額外的配置,默認是在 9091 端口。
4. 配置 Prometheus 并啟動
配置 systemd service,文件位置 /usr/lib/systemd/system/prometheus.service
Description=Prometheus Server
Requires=network-online.target
After=network-online.target[Service]
Restart=on-failure
ExecStart=/opt/app/prometheus/bin/prometheus --config.file=/opt/app/prometheus/prometheus.yml --storage.tsdb.retention=60d --web.enable-lifecycle --web.enable-admin-api --storage.tsdb.path=/data/prometheus-data[Install]
WantedBy=multi-user.target
注意提前創建 Prometheus 數據目錄。
- 配置開啟自啟動
systemctl enable prometheus
- 啟動/停止/重啟
systemctl start/stop/restart prometheus
配置 Prometheus
# 這里是全局變量的配置
global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.# scrape_timeout is set to the global default (10s).# 這里是配置 alertmanager, Prometheus會根據 rules 規則把告警信息發送給 alertmanager 組件,alertmanager 負責實際告警信息的發送
alerting:alertmanagers:- static_configs:- targets: ['192.168.xx.yyy:9093']# 這里是配置告警規則,本次不是講解重點先忽略
# rule_files:
# - "rules/rds_rules.yml"# 配置Prometheus從那些 endpoint 或者叫 exporter 采集監控數據
scrape_configs:# 默認監控 Prometheus服務本身- job_name: "prometheus"static_configs:- targets: ["localhost:9090"]labels:instance: prometheus# 自定義的mysql targets ,這里的targets是通過直接配置的方式# 另外還有通過文件的方式、通過consul等自動發現的方式,# 這兩種方式這里不展開介紹,感興趣的關注后續文章- job_name: 'mysql_targets'scrape_interval: 60sscrape_timeout: 12smetrics_path: /scrapestatic_configs:- targets:- rds-xxx- rds-yyy# relabel_configs 是通過label重寫實現我們最終需要的標簽# 另外這里是通過重寫target,重新定義了 endpoint 地址relabel_configs:- source_labels: [__address__]target_label: __param_target- source_labels: [__param_target]target_label: instance- target_label: __address__replacement: 192.168.3.108:5005# pushgateway - job_name: 'pushgateway'scrape_interval: 60sstatic_configs:- targets:- 192.168.3.108:9091# 這里是對自定義的 mysql-exporter 做監控- job_name: 'rds-exporter'scrape_interval: 60sstatic_configs:- targets:- 192.168.3.108:5005
重啟 Prometheus 或者執行 reload 操作 curl -XPUT http://192.168.3.108:9090/-/reload
使配置生效。
最終在 Prometheus 的 WebUI 界面的 Status -> Targets
里面看到如下:
Grafana 配置 MySQL 監控大盤
具體的 Grafana 安裝和配置請參考教程 或者網上自動查閱。
打開 Grafana 界面進行 Dashboard 的導入,如下圖所示:
點擊左側 +
選擇 import
,然后通過三種不同的方式導入 Dashboard 模板:
- 在 Grafana 官網找到合適的模板之后,記住 ID,輸入該 ID 然后點擊 Load。
- 通過右上角的
Upload .json file
上傳本地的模板 JSON 文件。 - 直接把本地的模板 JSON 文件內容 copy 到
Or paste JSON
下方的框中即可。
這里提供自定義的模板 JSON 文件 下載地址
最終的效果如下: