一、prometheus介紹
Prometheus是一套開源的系統監控報警框架。Prometheus作為新一代的雲原生監控系統,相比傳統監控監控系統(Nagios或者Zabbix)擁有如下優點。
易管理性
Prometheus: Prometheus核心部分只有一個單獨的二進制文件,可直接在本地工作,不依賴於分布式存儲。
Nagios: 需要有專業的人員進行安裝,配置和管理,並且過程很復雜。
業務數據相關性
Prometheus:監控服務的運行狀態,基於Prometheus豐富的Client庫,用戶可以輕松的在應用程序中添加對Prometheus的支持,從而讓用戶可以獲取服務和應用內部真正的運行狀態。
Nagios:大部分的監控能力都是圍繞系統的一些邊緣性的問題,主要針對系統服務和資源的狀態以及應用程序的可用性。
另外Prometheus還存在以下優點:
高效:單一Prometheus可以處理數以百萬的監控指標;每秒處理數十萬的數據點。
易於伸縮:通過使用功能分區(sharing)+聯邦集群(federation)可以對Prometheus進行擴展,形成一個邏輯集群;Prometheus提供多種語言的客戶端SDK,這些SDK可以快速讓應用程序納入到Prometheus的監控當中。
良好的可視化:Prometheus除了自帶有Prometheus UI,Prometheus還提供了一個獨立的基於Ruby On Rails的Dashboard解決方案Promdash。另外最新的Grafana可視化工具也提供了完整的Proetheus支持,基於Prometheus提供的API還可以實現自己的監控可視化UI。
二、prometheus框架
參考官網:官網
Prometheus Server:Prometheus Sever是Prometheus組件中的核心部分,負責實現對監控數據的獲取,存儲及查詢。Prometheus Server可以通過靜態配置管理監控目標,也可以配合使用Service Discovery的方式動態管理監控目標,並從這些監控目標中獲取數據。其次Prometheus Sever需要對采集到的數據進行存儲,Prometheus Server本身就是一個實時數據庫,將采集到的監控數據按照時間序列的方式存儲在本地磁盤當中。Prometheus Server對外提供了自定義的PromQL,實現對數據的查詢以及分析。另外Prometheus Server的聯邦集群能力可以使其從其他的Prometheus Server實例中獲取數據。
Exporters:Exporter將監控數據采集的端點通過HTTP服務的形式暴露給Prometheus Server,Prometheus Server通過訪問該Exporter提供的Endpoint端點,即可以獲取到需要采集的監控數據。可以將Exporter分為2類:
直接采集:這一類Exporter直接內置了對Prometheus監控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接內置了用於向Prometheus暴露監控數據的端點。
間接采集:原有監控目標並不直接支持Prometheus,因此需要通過Prometheus提供的Client Library編寫該監控目標的監控采集程序。例如:Mysql Exporter,JMX Exporter,Consul Exporter等。
AlertManager:在Prometheus Server中支持基於Prom QL創建告警規則,如果滿足Prom QL定義的規則,則會產生一條告警。在AlertManager從 Prometheus server 端接收到 alerts后,會進行去除重復數據,分組,並路由到對收的接受方式,發出報警。常見的接收方式有:電子郵件,pagerduty,webhook 等。
PushGateway:Prometheus數據采集基於Prometheus Server從Exporter pull數據,因此當網絡環境不允許Prometheus Server和Exporter進行通信時,可以使用PushGateway來進行中轉。通過PushGateway將內部網絡的監控數據主動Push到Gateway中,Prometheus Server采用針對Exporter同樣的方式,將監控數據從PushGateway pull到Prometheus Server。
三、Prometheus的工作流:
1.Prometheus server定期從配置好的jobs或者exporters中拉取metrics,或者接收來自Pushgateway發送過來的metrics,或者從其它的Prometheus server中拉metrics。
2.Prometheus server在本地存儲收集到的metrics,並運行定義好的alerts.rules,記錄新的時間序列或者向Alert manager推送警報。
3.Alertmanager根據配置文件,對接收到的警報進行處理,發出告警。
4.在圖形界面中,可視化采集數據。
四、基礎環境
主機名 | IP | 描述 | |
監控主機 | pro01 | 192.168.253.42 | docker, prometheus, grafana, exporter,alertmanager |
被監控主機 | exp02 | 192.168.253.57 192.168.253.42 | exporter |
五、prometheus安裝
docker的安裝這里就不說了。
docker pull prom/prometheus
5.1 創建prometheus工作目錄
mkdir -p /data/prometheus mkdir /data/prometheus/data chown 777 /data/prometheus/data mkdir /data/prometheus/rules
編寫prometheus.yml文件
chown 777 /data/prometheus/prometheus.yml
vim /data/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: ['193.168.253.42:9093'] # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: - "node_down.yml" # - "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' static_configs: - targets: ['localhost:9090']- job_name: 'node' scrape_interval: 8s static_configs: - targets: ['193.168.253.42:9100']
以上yml文件,配置了alertmanager,用於告警,匹配規則為node_down,節點如果down掉就會觸發警告,job_name 有三個,監控本機9090,8080,9100端口,分別為三種不同的組件
啟動prometheus
docker run -d -p 9090:9090 -v /data/prometheus/data:/prometheus \ -v /data/prometheus:/etc/prometheus \ --name pro prom/prometheus
瀏覽器訪問
六、安裝grafana
拉取鏡像
docker pull grafana/grafana
啟動grafana
docker run -p -d 3000:3000 --name grafana grafana/grafana
查看容器
瀏覽器訪問
瀏覽器訪問http://192.168.253.42:3000(IP:3000端口),即可打開grafana頁面,默認用戶名密碼都是admin,初次登錄會要求修改默認的登錄密碼
添加prometheus數據源
(1)點擊主界面"Add your first data source"
(2)選擇Prometheus
(3)填寫數據源設置項
URL處填寫Prometheus服務所在的IP地址,此處我們將Prometheus服務與Grafana安裝在同一台機器上,直接填寫localhost或者ip就行
點擊下方 【Save & Test】按鈕,保存設置
(4)Dashboards頁面選擇“Prometheus 2.0 Stats”
點擊Dashboards選項卡,選擇Prometheus 2.0 Stats
(5)查看監控
點擊Grafana圖標,切換到Grafana主頁面,然后點擊Home,選擇我們剛才添加的Prometheus 2.0 Stats,即可看到監控數據
七、安裝node-exporter
以下操作皆在被監控主機(pro01,exp02)上操作。
下載node-exporter地址:https://github.com/prometheus/node_exporter/releases
解壓node-exporter
tar xzf node_exporter-0.18.1.linux-amd64.tar.g mv node_exporter-0.18.1.linux-amd64 /data/node_exporter
啟動
cd /data/node_exporter
./node_exporter
瀏覽器訪問
設置node_exporter 以服務的方式啟動並設置開機自啟
添加系統服務
vim /etc/systemd/system/node_exporter.service
[Unit] Description=node_exporter After=network.target [Service] ExecStart=/data/node_exporter/node_exporter Restart=on-failure [Install] WantedBy=multi-user.target
啟動服務,設置開機自啟,並檢查服務開啟狀態
# systemctl daemon-reload
# systemctl enable node_exporter
# systemctl start node_exporter
# systemctl status node_exporter
瀏覽器訪問:
八、安裝alertmanager
拉取鏡像:
docker pull prom/alertmanager
創建工作目錄
mkdir -p /data/alertmanager/storage mkdir /data/alertmanager/template chown 777 /data/alertmanager/storage
修改配置
vim /data/alertmanager/alertmanager.yml
global: smtp_smarthost: 'smtp.qq.com:465' #smtp地址 smtp_from: '258xxx9221@qq.com' #誰發郵件 smtp_auth_username: '258xxx9221@qq.com' #郵箱用戶 smtp_auth_password: 'xxxxxxx' #郵箱smtp授權碼 smtp_require_tls: false templates: #定義模板 - 'template/*.tmp1' route: group_by: ['alertname'] #分組名 group_wait: 30s #當收到警報,等待30秒看是否還有警報,如果有就一起發出去 group_interval: 5m # 發送警告間隔時間 repeat_interval: 3h # 重復報警的間隔時間 receiver: mail # 全局報警組,這個參數是必選的,和下面報警組名要相同 receivers: - name: 'mail' # 報警組名 email_configs: - to: '{{ template "email.to" . }}' #發送給誰 html: '{{ template "email.to.html" . }}' send_resolved: true #告警抑制 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
簡單介紹一下主要配置的作用:
global: 全局配置,包括報警解決后的超時時間、SMTP 相關配置、各種渠道通知的 API 地址等等。
route: 用來設置報警的分發策略,它是一個樹狀結構,按照深度優先從左向右的順序進行匹配。
receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
inhibit_rules: 抑制規則配置,當存在與另一組匹配的警報(源)時,抑制規則將禁用與一組匹配的警報(目標)。
新建模板:
vim /data/alertmanager/template/email.tmpl
{{ define "email.from" }}11111111@qq.com{{ end }} {{ define "email.to" }}22222222@qq.com{{ end }} {{ define "email.to.html" }} {{ range .Alerts }} =========start==========<br> 告警程序: prometheus_alert <br> 告警級別: {{ .Labels.severity }} 級 <br> 告警類型: {{ .Labels.alertname }} <br> 故障主機: {{ .Labels.instance }} <br> 告警主題: {{ .Annotations.summary }} <br> 告警詳情: {{ .Annotations.description }} <br> 觸發時間: {{ .StartsAt.Format "2019-08-04 16:58:15" }} <br> =========end==========<br> {{ end }} {{ end }}
說明:
define 用來定義變量,配置3個變量,分別是:email.from、email.to、email.to.html ,可以在 alertmanager.yml 文件中直接配置引用。
這里 email.to.html 就是要發送的郵件內容,支持 Html 和 Text 格式。為了顯示好看,采用 Html 格式簡單顯示信息。
{{ range .Alerts }} 是個循環語法,用於循環獲取匹配的 Alerts 的信息,下邊的告警信息跟上邊默認郵件顯示信息一樣,只是提取了部分核心值來展示。
啟動服務
docker run -d \ -p 9093:9093 \ --name alertmanager \ --restart=always \ -v /data/alertmanager:/etc/alertmanager \ -v /data/alertmanager/storage:/alertmanager \ prom/alertmanager
瀏覽器訪問:
http://192.168.253.42:9093
九、prometheus監控報警
根據prometheus.yml文件,編寫匹配規則
cd /data/prometheus/rules
vim node_down.yml
groups: - name: node-up rules: - alert: node-up expr: up{job="node-exporter"} == 0 for: 15s labels: severity: 1 team: node annotations: summary: "{{ $labels.instance }} 已停止運行!" description: "{{ $labels.instance }} 檢測到異常停止!請重點關注!!!"
vim memory_over.yml
expr 是計算公式,(1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 表示獲取內存使用率
groups: - name: example rules: - alert: NodeMemoryUsage expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 80 for: 1m labels: severity: warning annotations: summary: "{{$labels.instance}}: High Memory usage detected" description: "{{$labels.instance}}: Memory usage is above 80% (current value is:{{ $value }})"
重啟peometheus
docker restart pro
訪問告警頁面
http://192.168.253.42:9090/alerts
測試報警
這里直接修改 /data/prometheus/rules/memory_over.yml文件,告警閾值改為10
expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 10
重啟prometheus
docker restart pro
等待一分鍾,出pending
再等待一分鍾,會出現Firing
查看郵件
如果有沒收到郵件,查看日志
docker logs -f alertmanager