基於docker部署prometheus監控平台


一、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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM