文章目錄
前言
(頹廢了頹廢了,低產如老狗)
公司最近正在調研服務的監控方案,目前本人知道的比較流行的有zabbix和prometheus,綜合的考量了一下之後決定使用prometheus,至於爲什麼選它,以及它和zabbix的優劣,可以看看這些文章
監控 prometheus 與zabbix對比
prometheus比zabbix好在哪點?
爲什麼說 Prometheus 是足以取代 Zabbix 的監控神器?
都是google上能夠輕易搜到的文章,能對prometheus有一個初步的瞭解
prometheus簡介
Prometheus是一套開源的監控&報警&時間序列數據庫的組合,起始是由SoundCloud公司開發的。成立於2012年,之後許多公司和組織接受和採用prometheus,他們便將它獨立成開源項目,並且有公司來運作。該項目有非常活躍的社區和開發人員,目前是獨立的開源項目,任何公司都可以使用它,2016年,Prometheus加入了雲計算基金會,成爲kubernetes之後的第二個託管項目。google SRE的書內也曾提到跟他們BorgMon監控系統相似的實現是Prometheus。現在最常見的Kubernetes容器管理系統中,通常會搭配Prometheus進行監控。
我們使用prometheus的場景就是對系統服務做監控啦,接下來我們就開始在我們自己的機器上進行配置吧(過程中我會把一些踩過的坑儘量標註出來~)
開始
配置過程中我們要時刻注意權限的問題,爲了方便,我們將所有下文所有目錄的擁有者均設爲www-pro(這個用戶自己確認一個就行了),確保權限這塊不會出現異常
首先就是這兩個目錄:
# 可執行文件
/etc/prometheus/
# 配置文件
/var/lib/prometheus
下載並安裝 Node Exporter
由於 Prometheus 僅具備採集系統指標的功能,因此我們需要通過 Node Exporter 來擴展它的能力(這樣的exporter非常的多,還有用於redis的,mongo的,等等,這裏只用一個基本的exporter做演示)。Node Exporter 是一款收集系統 CPU、磁盤、內存用量信息並將它們公開以供抓取的工具。
我們挑最新的release版本進行下載:),記得自己點進去看看列表裏的最新的那個,我這個只是在當時是最新的
wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
之後執行解壓操作
tar xvf node_exporter-0.18.1.linux-amd64.tar.gz
解壓後的目錄中包含了可執行文件、README、以及許可證文件
我們將可執行文件node_exporter複製到/usr/local/bin
下
cp node_exporter /usr/local/bin/
好了,其他文件刪除即可:)
配置自動啓動
# 創建一個服務文件
vim /etc/systemd/system/node_exporter.service
# 以下是需要編輯到文件的內容
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=www-pro
Group=www-pro
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
Node Expoter中, 收集器(Collectors
)用於蒐集系統信息,一部分收集器已被開啓,你可以在 README 文件中查看具體列表。如果你想要使用某些特定的收集器,可以在以上文件的 ExecStart 配置中進行定義。例如:
ExecStart=/usr/local/bin/node_exporter --collectors.enabled meminfo,hwmon,entropy
啓用Node Exporter
# 重啓以便能夠使用新創建的服務
sudo systemctl daemon-reload
# 啓動 Node Exporter
sudo systemctl start node_exporter
# 查看服務運行狀態
sudo systemctl status node_exporter
查看狀態,出現以下字樣基本就沒問題了
● node_exporter.service - Node Exporter
Loaded: loaded (/etc/systemd/system/node_exporter.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2019-10-25 15:59:17 CST; 8s ago
Main PID: 32052 (node_exporter)
CGroup: /system.slice/node_exporter.service
└─32052 /usr/local/bin/node_exporter
設置開機啓動
sudo systemctl enable node_exporter
下載安裝 Prometheus
同樣選取最新版進行下載:)
wget https://github.com/prometheus/prometheus/releases/download/v2.13.1/prometheus-2.13.1.linux-amd64.tar.gz
解壓後,我們將可執行文件prometheus
(Promethenus主程序)以及promtool
加入到/usr/local/bin/
目錄
sudo cp ./prometheus /usr/local/bin/
sudo cp ./promtool /usr/local/bin/
同樣記得配置一下權限
sudo chown www-pro:www-pro /usr/local/bin/prometheus
sudo chown www-pro:www-pro /usr/local/bin/promtool
將console
,console_libraries
目錄複製到/etc/prometheus
# 分別包含了 Web 接口、示例配置以及許可證文件
sudo cp -r ./consoles /etc/prometheus
sudo cp -r ./console_libraries /etc/prometheus
同樣修改文件擁有者
sudo chown -R www-pro:www-pro /etc/prometheus/consoles
sudo chown -R www-pro:www-pro /etc/prometheus/console_libraries
將解壓文件中的prometheus.yml
保留,將其他不再需要的下載文件刪除。
配置Prometheus
到了這裏,可以正式開始Prometheus基本配置了
打開之前的prometheus.yml
, 裏面的內容大概長這樣
# my global config
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 configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
metrics_path: '/prometheus/metrics' # 默認'/metrics', 此處需要加上前綴
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
Prometheus 的配置文件分爲4個部分:
- global
- alerting
- rule_files
- scrape_configs
-
在 global 部分內,可以找到一些通用配置:
scrape_interval
用於設置 Prometheus 多久抓取一次目標(Targets)evaluation_interval
用於設置多久計算一次規則(Rules),而規則用於控制存儲預先計算的數據,以及何時生成告警(Alert)- 以上兩者都被設置成15s,這適用於多數情況
-
在alerting部分內,包含了用於資源告警的一些配置(現在還沒有)
-
在 rule_files 部分內,包含了 Prometheus 加載的規則文件路徑(這個也暫時沒有)
-
配置文件的最後一個部分名爲 scrape_configs,包含了 Prometheus 監控的資源信息。
- 默認的配置文件中自帶了一個導出器(
Exporter
) , 用於Prometheus監控它自己,我們將該任務(Job)的 scrape_interval 降低爲 5 秒 static_configs
的targets
參數表示導出器的監聽地址。由於是同一服務器,所以我們使用localhost
以及 Prometheus 自己的端口9090
- Prometheus 將會抓取在
scrape_configs
內定義的導出器,因此我們需要將 Node Exporter 添加至該文件,就像上文中監控 Prometheus 自己一樣
- 默認的配置文件中自帶了一個導出器(
在加一個Exporter
- job_name: 'node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
這裏再次覆蓋了全局的 scrape_interval
配置並設置爲 5 秒。並且 Node Exporter 與 Prometheus 運行在同一服務器,所以我們可以直接使用 localhost
以及 Node Exporter 的默認端口:9100
若是從外部服務器抓取數據,你需要使用遠程服務器的 IP 地址替換 localhost
官方詳細配置文檔
我們將該文件放到/etc/prometheus/
並配置權限
cp prometheus.yml /etc/prometheus/
sudo chown www-pro:www-pro /etc/prometheus/prometheus.yml
配置nginx代理轉發
由於服務器只開放了80端口,我們需要通過nginx將請求轉發到本地服務,以下爲一個簡要的nginx配置
server {
listen 80;
server_name 47.96.186.125;
access_log /data/log/nginx/prometheus_access.log;
error_log /data/log/nginx/prometheus_error.log;
location / {
root html;
index index.html index.htm;
# proxy_pass http://127.0.0.1:9090/;
}
# location /grafana/ {
# proxy_pass http://127.0.0.1:3000/;
# }
location /prometheus/ {
proxy_pass http://127.0.0.1:9090/prometheus/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
運行Prometheus
以www-pro用戶的身份運行啓動命令
sudo -u www-cem /usr/local/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.external-url=prometheus
注意這裏的--web.external-url=prometheus
配置,由於我在nginx中是這麼配置的
location /prometheus/ {
proxy_pass http://127.0.0.1:9090/prometheus/;
}
多加了一個prometheus單詞,所以啓動prometheus時要多添加一個屬性,不然就會找不到,這是個小坑~
瀏覽器中輸入
http://你的服務器IP/prometheus/
現在應該能夠看到頁面了
配置開機啓動
# 該文件將會指明使用 www-cem 用戶運行 Prometheus,並指定其配置文件的路徑。
vim /etc/systemd/system/prometheus.service
# 以下爲填入的內容
[Unit]
Description=Prometheus Monitoring
Wants=network-online.target
After=network-online.target
[Service]
User=www-cem
Group=www-cem
Type=simple
ExecStart=/usr/local/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.external-url=prometheus
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
之後
# 重載systemd
sudo systemctl daemon-reload
# 開機自啓
sudo systemctl enable prometheus
# 啓動Prometheus
sudo systemctl start prometheus
# 查看運行狀態
sudo systemctl status prometheus
grafana安裝配置
grafana簡而言之就是能夠讓你監控的數據通過豐富多彩的報表進行呈現,我們這裏不多講,只聊聊其配置的過程。
wget https://dl.grafana.com/oss/release/grafana-6.4.3-1.x86_64.rpm
sudo yum localinstall grafana-6.4.3-1.x86_64.rpm
同樣使用nginx代理(nginx上文已配置好),需要修改/etc/grafana/
下的grafana.ini
# 找到並修改對應行
[server]
...
# 去掉對應的protocal和domain的註釋
root_url = %(protocol)s://%(domain)s:/grafana
啓動三連
sudo systemctl daemon-reload && sudo systemctl enable grafana-server && sudo systemctl start grafana-server
之後我們可以通過http://你的IP地址/grafana/
對grafana進行訪問
我們可以爲prometheus配置一些數據面板,也可以使用一些現成的模版展示prometheus的監控數據。
告警組件Alertmanager安裝配置
在監控的同時,我們需要配置告警功能以便發生問題時及時處理
# 下載最新安裝包
wget https://github.com/prometheus/alertmanager/releases/download/v$VERSION/alertmanager-0.19.0.linux-amd64.tar.gz
# 解壓
tar xfv alertmanager-0.19.0.linux-amd64.tar.gz
現在在/etc/prometheus/
下新建一個alertmanager
目錄,將解壓出來的內容複製到alertmanager
目錄下
mv alertmanager-0.19.0.linux-amd64.tar.gz/* ../alertmanager
同樣修改下用戶權限
sudo chown www-pro:www-pro /etc/prometheus/alertmanager/alertmanager
sudo chown www-pro:www-pro /etc/prometheus/alertmanager/data/
sudo chown www-pro:www-pro /etc/prometheus/alertmanager/alertmanager.yml
Alermanager會將數據保存到本地中,默認的存儲路徑爲data/
, 我們可以在啓動時通過添加參數改變需要讀取的配置文件路徑以及數據存儲的路徑
sudo -u www-cem /etc/prometheus/alertmanager/alertmanager --config.file /etc/prometheus/alertmanager/alertmanager.yml --storage.path /etc/prometheus/alertmanager/data/
其中, --config.file
用於指定alertmanager配置文件路徑,--storage.path
用於指定數據存儲路徑
嘗試啓動,成功後我們把服務關閉,配置alertmanager系統服務啓動文件
vim /usr/lib/systemd/system/alertmanager.service
# 以下是添加的文件內容
[Unit]
Description=Alertmanager
After=network.target
[Service]
Type=simple
User=www-cem
ExecStart=/etc/prometheus/alertmanager/alertmanager \
--config.file=/etc/prometheus/alertmanager/alertmanager.yml \
--storage.path=/etc/prometheus/alertmanager/data/
Restart=on-failure
[Install]
WantedBy=multi-user.target
啓動4連:)
systemctl daemon-reload
systemctl enable alertmanager.service
systemctl start alertmanager.service
systemctl status alertmanager.service
配置規則文件
prometheus能夠正確的採集系統數據,現在需要給出一個規則,使得監控過程中能夠捕捉到預警信息,我們在/etc/prometheus/alertmanager/alert_rules/
目錄下創建一個node-stats-alert.rules
文件,添加如下內容
groups:
- name: hostStatsAlert
rules:
- alert: InstanceDown
expr: up == 0
for: 1m
labels:
severity: page
annotations:
summary: "Instance {{$labels.instance}} down"
description: "{{$labels.instance}} of job {{$labels.job}} has been down for more than 5 minutes."
內容很簡單,當實例掛掉了之後,我們就發出預警,一個基於node_exporter 的簡單告警規則就完成了。
其中expr
採用的是基於PromQL(Prometheus內置的數據查詢語言)的表達式,我們可以編寫任意的規則來匹配想要的監控數據
我們需要將這個告警規則文件應用到prometheus中,另外目前alertmanager還沒有和prometheus關聯上
關聯prometheus
集成alertmanager
將alertmanager集成到prometheus中,在配置文件下加入如下內容
# /etc/prometheus/prometheus.yml
...
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093'] # 這一句是新加的
...
加入規則文件
# /etc/prometheus/prometheus.yml
...
rule_files:
- "/etc/prometheus/alertmanager/alert_rules/node-stats-alert.rules"
...
保存退出後,重啓prometheus和alertmanager服務即可
systemctl restart prometheus.service
systemctl status prometheus.service
systemctl restart prometheus.service
systemctl status prometheus.service
alertmanager 配置郵件告警
現在已經到了可以捕捉告警的階段了,最後一步,我們需要將告警信息通過郵件的方式發送
備份一下/etc/prometheus/alertmanager/alertmanager.yml
後,我們將該文件內容修改如下:
global:
resolve_timeout: 5m # 超時自動解決
smtp_smarthost: 'smtp.exmail.qq.com:465' # 發件服務器
smtp_from: '[email protected]' # 發件郵箱
smtp_auth_username: '[email protected]' # 發件郵箱名稱
smtp_auth_password: 'xxx' # 密碼
smtp_require_tls: false
smtp_hello: 'xxx.com'
# 定義告警信息模板,這裏使用的默認模版,所以不需要配置
# templates:
# - 'template/*.tmpl'
# 路由樹信息
route:
group_by: ['alertname','cluster','service'] # 報警分組,沒用上
group_wait: 10s # 最初即第一次等待多久時間發送一組警報的通知
group_interval: 10s # 在發送新警報前的等待時間
repeat_interval: 1h # 發送重複警報的週期 對於email配置中,此項不可以設置過低,否則將會由於郵件發送太多頻繁,被smtp服務器拒絕
receiver: 'email-receiver' # 發送警報的接收者的名稱,以下receivers name的名稱
receivers:
- name: 'email-receiver'
email_configs:
- to: '[email protected]'
# html: '{{ template "test.html" . }}' # 設定郵箱的內容模板, 如果設定了模版,則可以開啓此設置
headers: {Subject: "Prometheus 告警郵件"}
# 一個inhibition規則是在與另一組匹配器匹配的警報存在的條件下,使匹配一組匹配器的警報失效的規則。兩個警報必須具有一組相同的標籤。
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
保存退出,重啓prometheus
和alertmanager
即可
至此,prometheus配置基本完成:)
拓展
上文的配置中,我們在prometheus中只有兩個target
採集信息,一個是node_exporter
,另外一個是prometheus
自身
expoter拓展
我們如果需要監控其他服務(etc. redis, mongo等), 可以按照配置node_expoter
的流程集成相應的exporter
多渠道告警
alertmanager除了郵件告警之外,還可以配置企業微信
,slack
等告警渠道。
其他
以上就只是講了有關於prometheus的配置相關的東西,關於使用部分並沒有提及,讀者可以自行搜索學習,或許以後我也會繼續更新prometheus的使用。這裏建議將PromQL多熟悉熟悉,這樣我們可以寫出自己想要的過濾監控數據源的邏輯:)
參考文檔
nginx 設置prometheus和grafana的反向代理
配置 Prometheus 服務器監控和 Grafana 看板
慣例: