一/prometheus+grafana+alertmanager監控系統與ELK(Beat)對比
a.前者搭建比較簡單,後者組件更多稍微複雜,但功能稍更強大;
b.前者性能自帶時序數據庫,性能好成本低,後者數據存ES比較吃內存,都不太適合大規模監控場景;
c.前者是拉模式,prometheus根據配置的target週期性去目標節點通過暴露的http端點拉取監控數據到Prometheus時序數據庫,後者推模式,通過各種Beat採集log,metric,hearbeat推送到ES
d.前者Prometheus提供了簡易的web UI,可通過promQL查詢一些監控信息,但比較low,需要grafana加持;後者ES本身沒有UI,一般通過kibana 通過 Lucene語言查詢,兩者都可以自己定製dashboard並導出,也可導入別人的做好的dashboard模板
e.報警方面前者依賴alertmanager等或grafana添加報警,後者kibana依賴elasticAlert/sentinl,都支持微信/丁丁/郵件/短信等
f.系統指標:前者主要nodeExporter,cadvisor,後者主要是metricbeat
g.應用指標:前者通過json格式NG日誌或aop日誌需要監控接口性能,請求錯誤信息等還得依賴ELK部分組件,展示可用grafana;後者專業採集機構化的日誌文件無入侵入;兩者都可以通過JMX較簡單監控JVM等信息
h.業務監控方面:前者通過埋點採集訂單數/令牌桶等業務數據到pushgateway(exporter),後者不便埋點採集;
i.兩者都沒調用鏈路監控功能,需要單獨skywalking/CAT/zipkin等進行監控,或使用arthas進行臨時鏈路分析
二/普羅米修斯原理圖
原理圖https://prometheus.io/docs/introduction/overview/
三/安裝Prometheus
#先把鏡像拉下來啓動起來,進去把配置文件copy到宿主機
docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus
docker cp prometheus:/etc/prometheus/prometheus.yml ./
docker rm -f prometheus
#這裏先不改配置文件啓動,掛載的報警觸發規則文件alert.yml可以先不要
docker run -d -p 9090:9090 -v /root/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/alertmanager/alert.yml:/etc/prometheus/alert.yml --name prometheus --net=host --restart=always(隨docker自動重啓) prom/prometheus --config.file=/etc/prometheus/prometheus.yml --web.enable-lifecycle
#在瀏覽器打開http://IP:9090打開Prometheus的UI,點擊status--targets這裏能夠查看到我們各個監控項,默認暫時只監控自己,也在graph選項通過promQL查詢監控數據。
#關於熱加載
容器啓動增加參數--web.enable-lifecycle,配置在最後,必須同時指定--config.file,發送post請求進行觸發熱加載: curl -XPOST localhost:9090/-/reload
Prometheus.yml
#全局配置可被覆蓋
global:
scrape_interval: 1m # 每次數據收集的間隔,默認1m,
evaluation_interval: 30s #評估週期,默認1m
scrape_timeout: 10s #抓取超時時間,默認10s
# 報警配置,主要配置Alertmanager
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
timeout: 10s
# 報警配置
#報警原理:週期性拉取到指標後評估如果滿足規則文件裏的觸發條件並且保持到指定的“for時間”,報警狀態由inactive=>pending=>iring,
#通過配置的alertmanager URL發送http請求給alertmanager,alertmanager收到一個alert並根據alertmanager.yml配置的郵件或webhook丁丁微信等及rules報警
rule_files:
- '/etc/prometheus/alert.yml' #掛載到容器內的路徑
#抓取配置
scrape_configs:
- job_name: 'prometheus'
metrics_path: '/metrics' #默認
scheme: 'http' #默認
scrape_interval: 30s #覆蓋全局
static_configs:
- targets: ['localhost:9090']
# labels:
# instance: xxx
- job_name: 'node-exporter'
static_configs:
- targets: ['localhost:9100']
# labels:
# instance: yyy
alert.yml
groups:
- name: prometheus
rules:
- alert: prometheus節點UP狀態
expr: sum(up{job="prometheus"})==1
for: 1m
labels:
severity: 嚴重
team: node-prometheus
annotations:
summary: "{{ $labels.job }} 已停止運行超過 1分鐘!"
description: "{{ $labels.instance }} 異常停止,請儘快處理!"
value: '{{ $value }}'
四/安裝XXexporter拉取其它監控指標
如服務器運行指標。需要在被監控的服務器安裝一個nodeexporter,官網https://prometheus.io/download/有多種XXexporter用以暴露一個Prometheus拉去該服務器運行指標的端點。這裏有多種exporter,類似ELK是通過XXbeat推送各種被監控端的信息。除了通過exporter間接拉取外,如springboot是通過@EnablePrometheusEndpoint來暴露端點的。官網有二進制壓縮包可以減壓安裝,爲方便還是用的docker
docker run -d -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --net=host prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
#mysql監控:docker run -p 9104:9104 -e DATA_SOURCE_NAME="root:password@(127.0.0.1:3306)/databaseName" --net=host prom/mysqld-exporter
#容器監控cadvisor(高版本可能有BUG,啓動報錯缺少XX文件或文件夾): docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro --net=host --detach=true --name=cadvisor google/cadvisor:v0.24.1
啓動該nodeexporter容器後在Prometheus配置文件的target選項追加一個localhost:9100,然後docker restart prometheus然後監控頁面即可看到新增的target,graph也會增加node_XX的一些指標如下可用內存node_memory_MemAvailable_bytes。(指標命名特徵:被監控主體名_指標名_其它描述,指標名很多只需要記得關鍵字即可,如node_memory_MemAvailable_bytes,只需要輸出nodemem即可很快找到,也可以從"Excute"按鈕後下拉選。)
四/安裝gragana,展示prometheus監控數據
1.mkdir /root/grafana-storage
2.chmod 777 -R /root/grafana-storage
3.docker run -d -p 3000:3000 --name grafana -v /root/grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123456" grafana/grafana
#tar安裝:wget https://dl.grafana.com/oss/release/grafana-6.6.1.linux-amd64.tar.gz 直接解壓啓動,訪問http:IP:3000,賬號密碼默認admin/admin
1.從啓動grafana及其配置文件,可以看到並沒有指定prometheus或其它datasourse(grafana支持的數據源:如mysql/es/PG/influxdb等,但是不是很友好),故登錄進去後首先要鏈接數據源,如Prometheus/mysql/es等.
2.從grafana官網https://grafana.com/grafana/dashboards下載別人做的json格式的模板,可以把json文件內容貼過來或通過模板ID或通過本地json等方式導入模板,這點比ELK kibana導入模板做得好,如圖是8919面板,如果沒數據,可能有兩個原因:創建數據源填寫的Name要與json模板裏的datasourse對應;創建datasourse的那個URL默認的placeholder顯示灰色不能使用,即使是默認的localhost:9090也得手動敲一下。
也可以自定義dashboard面板:dashboad是多個panel組合到一起顯示的一個面板。可以對每個pannel編輯保持:Queris選擇數據源編寫promQ=> Visualization選擇可視化方式,XY軸等=> General通用設置如pannel標題等屬性 =>Alert添加報警
插件安裝(插件庫:https://grafana.com/grafana/plugins?orderBy=weight&direction=asc)
如果比較常用的餅圖/世界地圖安裝:grafana的bin目錄執行安裝命令(插件默認安裝到/var/lib/grafana),安裝重啓後如果還是沒有兩個插件,修改一下配置文件的defualts.ini的plugins掃描目錄(全局搜,約25行,改爲plugins = /var/lib/grafana/plugins)
./grafana-cli plugins install grafana-piechart-panel
./grafana-cli plugins install raintank-worldping-app (需要官網申請一個api key)
五/alertManager報警
安裝alertManger,也提供了web ui,訪問IP:9093可查看報警配置及報警信息,配置信息,可以在web ui配置靜默silence攔截指定時間段滿足指定條件的alert等
先拉下來啓動
docker run -d -p 9093:9093 --net=host --name alertmanager docker.io/prom/alertmanager:latest
#進入容器查看配置文件
docker exec -it alertmanager /bin/bash 發現報錯找不到/bin/bash目錄,Prometheus鏡像也有這個問題,解決:docker exec -it alertmanager /bin/sh
#到宿主機/root/alertmanager/config.yml配置,重啓掛載啓動
docker run -d -p 9093:9093 -v /root/alertmanager/config.yml:/etc/alertmanager/alertmanager.yml -v /root/alertmanager/email.tmpl/:/etc/alertmanager/email.tmpl --net=host --name alertmanager docker.io/prom/alertmanager:latest
alertmanager.yml
global:
resolve_timeout: 5m
smtp_from: '[email protected]'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '[email protected]'
smtp_auth_password: 'dyfXXXXXX' #非Q密
smtp_require_tls: false
smtp_hello: 'qq.com'
templates:
- '/etc/alertmanager/email.tmpl' #郵件模板文件,容器內的路徑
route:
receiver: 'email'
group_by: ['alertname'] #按alertname等進行分組
group_wait: 1m #週期內有同一組的報警到來則一起發送
group_interval: 10m #報警發送週期
repeat_interval: 30m #與上次相同的報警延遲30m才發送,這裏應該是(10+30)m左右
routes:
- match: #可以使用match_re正則匹配
severity: 嚴重
receiver: email #匹配上則發給下面的name=email的receivers
receivers:
# - name: 'email'
# email_configs:
# - to: '[email protected]'
# send_resolved: true
- name: 'email'
email_configs:
- to: '[email protected]'
html: '{{ template "email.jwolf.html" . }}'
send_resolved: true
- name: 'dingding'
slack_configs:
- send_resolved: true
api_url: 丁丁機器人鉤子
text: "{{ .CommonAnnotations.description }}"
#抑制規則
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
email.tmpl (go語言)
{{ define "email.jwolf.html" }}
{{ range $i ,$alert := .Alerts }}
=========start==========<br>
告警級別: {{ $alert.Labels.severity }} 級 <br>
告警類型: {{ $alert.Labels.alertname }} <br>
故障主機: {{ $alert.Labels.instance }} <br>
告警主題: {{ $alert.Annotations.summary }} <br>
告警詳情: {{ $alert.Annotations.description }} <br>
告警閾值: {{ $alert.Annotations.value }} <br>
觸發時間: {{ $alert.StartsAt }} <br>
=========end==========<br>
{{ end }}
grafana配置報警也可以設置報警:如郵件需要修改配置tar解壓安裝的在config目錄的defaults.ini搜索STMP,yum安裝的應該在 /etc/grafana/grafana.ini
添加Email/丁丁等通知渠道已,以備設置報警頁面選擇使用
這裏需要注意勾選發送提醒:send reminders,如果不勾選alert一直處於alerting狀態只會告警一次,勾選也是alerting狀態但可以週期性發追發提醒郵件。只有報警條件解除後才能恢復OK,這點不同於Prometheus。
選擇panel->edit->小鈴鐺進行報警設置,評估週期和保持時間(同Prometheus),及condition(注意A代表"queries選項"設置的promQL,如果queries設置了多個,代號依次是ABCD...,第二個爲多少時間內,第三個爲從何時開始),然後選擇上步的channel填寫其它東西,保存panel即可,參考https://blog.csdn.net/Fickle_actor/article/details/89310878?utm_source=app
清理戰場:docker ps -a |grep Exited |awk '{print $1}'|xargs docker rm -f
推薦閱讀:https://github.com/yunlzheng/prometheus-book;http://dockone.io/article/5716