一:下載prometheus+grafana安裝包,并部署安裝包
1.0 上傳軟件包
從清華源(https://mirrors.tuna.tsinghua.edu.cn/)的鏡像庫下載安裝包,根據(jù)系統(tǒng)選擇相應版本,我選擇的是prometheus-2.52.0.linux-amd64.tar.gz+grafana-10.4.2-1.x86_64.rpm

1.1 安裝prometheus
1.上傳prometheus-2.52.0.linux-amd64.tar.gz 包到服務器/data目錄下

2.解壓prometheus-2.52.0.linux-amd64.tar.gz 包并重命名
[root@rancher data]#tar xvf prometheus-2.52.0.linux-amd64.tar.gz [root@rancher data]#mv prometheus-2.52.0.linux-amd64 prometheus

3.prometheus 配置systemctl 啟動并設置開機自啟[root@rancher prometheus]#vim /usr/lib/systemd/system/prometheus.service
[Unit] Description=Prometheus Documentation=https://prometheus.io/ After=network.target [Service] Type=simple ExecStart=/data/prometheus/prometheus --config.file=/data/prometheus/prometheus.yml --storage.tsdb.path=/data/prometheus/data --storage.tsdb.retention=365d ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target
[root@rancher prometheus]#systemctl start prometheus ###啟動prometheus [root@rancher prometheus]#systemctl enable prometheus ###配置prometheus開機自啟
[root@rancher prometheus]# systemctl status prometheus.service ###查看prometheus狀態(tài)
prometheus的端口是9090,正常啟動后直接訪問主機IP:9090 即可訪問web界面

通過瀏覽器訪問http://10.12.121.198:9090/

1.2 安裝grafana
1.上傳grafana-10.4.2-1.x86_64.rpm 包到主機/data目錄下,并安裝
[root@rancher data]# rpm -ivh grafana-10.4.2-1.x86_64.rpm

2.啟動grafana 并配置開機自啟
[root@rancher data]# systemctl start grafana-server.service [root@rancher data]# systemctl enable grafana-server.service [root@rancher data]# systemctl status grafana-server.service

3.grafana的服務端口3000,使用IP+端口登陸grafana,修改默認密碼,默認賬號密碼:admin/admin

4.web訪問grafana并配置數(shù)據(jù)源

二:監(jiān)控配置
2.1 監(jiān)控Linux 主機
1.下載node_exporter
從https://github.com/prometheus/node_exporter/releases/tag/v1.8.0下載對應版本node_exporter
prometheus使用node_exporter插件監(jiān)控機器硬件資源,prometheus主動從安裝了node_exporter服務的網(wǎng)絡互通的機器上抓取所需的數(shù)據(jù)
2.安裝node_exporter
下載node_exporter-1.8.0.linux-amd64.tar.gz包并上傳到客戶機/usr/local 目錄下,解壓安裝包并改名
[root@rancher local]# tar xvf node_exporter-1.8.0.linux-amd64.tar.gz
[root@rancher local]# mv node_exporter-1.8.0.linux-amd64 node_exporter
配置systemctl 啟動并設置隨機自啟
[root@rancher node_exporter]# vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
[root@rancher node_exporter]#systemctl enable node_exporter ###配置開機自啟
[root@rancher node_exporter]#systemctl start node_exporter ###啟動node_exporter服務
[root@rancher node_exporter]#systemctl status node_exporter ###查看node_exporter服務狀態(tài)

3.修改prometheus.yml并重新加載prometheus.yaml 文件
在/data/prometheus/ 下創(chuàng)建conf 目錄存放客戶機配置
[root@rancher prometheus]# mkdir conf && cd conf [root@rancher conf]# pwd /data/prometheus/conf [root@rancher conf]# vim rancher.yml - targets: - "10.12.121.198:9100" [root@rancher prometheus]# vim prometheus.yml ##在prometheus.yml 最后一行增加job_name ##### ranhcer ###### - job_name: 'rancher' file_sd_configs: - refresh_interval: 1m files: - /data/prometheus/conf/rancher.yml relabel_configs: - source_labels: [__address__] regex: "([^:]+):\\d+" target_label: instance
[root@rancher prometheus]# systemctl reload prometheus.service ##重新加載配置文件
成功以后在prometheus 上可以看到Targets

4.引入grafana監(jiān)控面板



看板展示效果

三:告警配置
3.1 安裝告警軟件alertmanager
在https://github.com/prometheus/alertmanager/releases/tag/v0.27.0 下載對應版本的alertmanager,并上傳到服務器/data目錄下
Prometheus通過組件alertmanager實現(xiàn)告警,Alertmanager接收prometheus發(fā)送的告警并對告警進行一系列的處理后發(fā)送給指定的用戶。
prometheus--->觸發(fā)閾值--->超出持續(xù)時間--->alertmanager--->分組|抑制|靜默--->媒體類型--->郵件、釘釘、微信等。
[root@rancher data]# tar xvf alertmanager-0.27.0.linux-amd64.tar.gz ##解壓alertmanager-0.27.0.linux-amd64.tar.gz [root@rancher data]# mv alertmanager-0.27.0.linux-amd64 alertmanager ##給alertmanager-0.27.0.linux-amd64目錄改名alertmanager
[root@rancher data]# vim /usr/lib/systemd/system/alertmanager.service ##配置systemctl 啟動并增加隨機自啟
[Unit]
Description=https://prometheus.io
[Service]
Restart=on-failure
ExecStart=/data/alertmanager/alertmanager --config.file=/data/alertmanager/alertmanager.yml
[Install]
WantedBy=multi-user.target
[root@rancher data]# systemctl enable alertmanager ##增加自啟
[root@rancher data]# systemctl start alertmanager ##啟動alertmanager服務
[root@rancher data]# systemctl status alertmanager ##查看alertmanager服務狀態(tài)

3.2 配置告警模版及告警規(guī)則
##alertmanager 配置郵件告警
[root@rancher alertmanager]#cd /data/alertmanager
[root@rancher alertmanager]#vim alert.tmp
{{ define "email.from" }}pengdadie1@163.com{{ end }}
{{ define "email.to" }}pengdadie1@163.com{{ end }}
{{ define "email.to.html" }}
{{- if gt (len .Alerts.Firing) 0 -}}{{ range .Alerts }}
<h2>@告警通知</h2>
告警程序: prometheus_alert <br>
告警級別: {{ .Labels.severity }} 級 <br>
告警類型: {{ .Labels.alertname }} <br>
故障主機: {{ .Labels.instance }} <br>
告警主題: {{ .Annotations.summary }} <br>
告警詳情: {{ .Annotations.description }} <br>
觸發(fā)時間: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }} <br>
{{ end }}{{ end -}}
{{- if gt (len .Alerts.Resolved) 0 -}}{{ range .Alerts }}
<h2>@告警恢復</h2>
告警程序: prometheus_alert <br>
故障主機: {{ .Labels.instance }}<br>
故障主題: {{ .Annotations.summary }}<br>
告警詳情: {{ .Annotations.description }}<br>
告警時間: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }}<br>
恢復時間: {{ .EndsAt.Local.Format "2006-01-02 15:04:05" }}<br>
{{ end }}{{ end -}}
{{- end }}
[root@rancher alertmanager]#vim alertmanager.yml
# global:全局配置,主要配置告警方式,如郵件、webhook等。 global: resolve_timeout: 5m # 超時,默認5min smtp_smarthost: 'smtp.163.com:465' # 這里為 QQ 郵箱 SMTP 服務地址,官方地址為 smtp.qq.com 端口為 465 或 587,同時要設置開啟 POP3/SMTP 服務。 smtp_from: 'pengdadi@163.com' smtp_auth_username: 'pengdadi@163.com' smtp_auth_password: 'VCBJAACBYEZ' # 這里為第三方登錄 QQ 郵箱的授權碼,非 QQ 賬戶登錄密碼,否則會報錯,獲取方式在 QQ 郵箱服務端設置開啟 POP3/SMTP 服務時會提示。 smtp_require_tls: false # 是否使用 tls,根據(jù)環(huán)境不同,來選擇開啟和關閉。如果提示報錯 email.loginAuth failed: 530 Must issue a STARTTLS command first,那么就需要設置為 true。著重說明一下,如果開啟了 tls,提示報錯 starttls failed: x509: certificate signed by unknown authority,需要在 email_configs 下配置 insecure_skip_verify: true 來跳過 tls 驗證。 templates: # # 模板 - '/data/alertmanager/alert.tmp' # route:用來設置報警的分發(fā)策略。Prometheus的告警先是到達alertmanager的根路由(route),alertmanager的根路由不能包含任何匹配項,因為根路由是所有告警的入口點。 # 另外,根路由需要配置一個接收器(receiver),用來處理那些沒有匹配到任何子路由的告警(如果沒有配置子路由,則全部由根路由發(fā)送告警),即缺省 # 接收器。告警進入到根route后開始遍歷子route節(jié)點,如果匹配到,則將告警發(fā)送到該子route定義的receiver中,然后就停止匹配了。因為在route中 # continue默認為false,如果continue為true,則告警會繼續(xù)進行后續(xù)子route匹配。如果當前告警仍匹配不到任何的子route,則該告警將從其上一級( # 匹配)route或者根route發(fā)出(按最后匹配到的規(guī)則發(fā)出郵件)。查看你的告警路由樹,https://www.prometheus.io/webtools/alerting/routing-tree-editor/, # 將alertmanager.yml配置文件復制到對話框,然后點擊"Draw Routing Tree" route: group_by: ['alertname'] # 用于分組聚合,對告警通知按標簽(label)進行分組,將具有相同標簽或相同告警名稱(alertname)的告警通知聚合在一個組,然后作為一個通知發(fā)送。如果想完全禁用聚合,可以設置為group_by: [...] group_wait: 30s # 當一個新的告警組被創(chuàng)建時,需要等待'group_wait'后才發(fā)送初始通知。這樣可以確保在發(fā)送等待前能聚合更多具有相同標簽的告警,最后合并為一個通知發(fā)送。 group_interval: 2m # 當?shù)谝淮胃婢ㄖl(fā)出后,在新的評估周期內(nèi)又收到了該分組最新的告警,則需等待'group_interval'時間后,開始發(fā)送為該組觸發(fā)的新告警,可以簡單理解為,group就相當于一個通道(channel)。 repeat_interval: 10m # 告警通知成功發(fā)送后,若問題一直未恢復,需再次重復發(fā)送的間隔。 receiver: 'email' # 配置告警消息接收者,與下面配置的對應。例如常用的 email、wechat、slack、webhook 等消息通知方式。 receivers: # 配置報警信息接收者信息。 - name: 'email' # 警報接收者名稱 email_configs: - to: '{{ template "email.to"}}' # 接收警報的email(這里是引用模板文件中定義的變量) html: '{{ template "email.to.html" .}}' # 發(fā)送郵件的內(nèi)容(調(diào)用模板文件中的) # headers: { Subject: " {{ .CommonLabels.instance }} {{ .CommonAnnotations.summary }}" } # 郵件標題,不設定使用默認的即可 send_resolved: true # 故障恢復后通知
##prometheus 配置
[root@rancher alertmanager]# cd /data/prometheus/
[root@rancher prometheus]#mkdir rules && cd rules
[root@rancher rules]# vim node_rules.yml ###配置告警規(guī)則
groups: - name: 服務器實例存活告警規(guī)則 rules: - alert: 實例存活告警 # 告警規(guī)則的名稱(alertname) expr: up == 0 # expr 是計算公式,up指標可以獲取到當前所有運行的Exporter實例以及其狀態(tài),即告警閾值為up==0 for: 30s # for語句會使 Prometheus 服務等待指定的時間, 然后執(zhí)行查詢表達式。(for 表示告警持續(xù)的時長,若持續(xù)時長小于該時間就不發(fā)給alertmanager了,大于該時間再發(fā)。for的值不要小于prometheus中的scrape_interval,例如scrape_interval為30s,for為15s,如果觸發(fā)告警規(guī)則,則再經(jīng)過for時長后也一定會告警,這是因為最新的度量指標還沒有拉取,在15s時仍會用原來值進行計算。另外,要注意的是只有在第一次觸發(fā)告警時才會等待(for)時長。) labels: # labels語句允許指定額外的標簽列表,把它們附加在告警上。 severity: Disaster annotations: # annotations語句指定了另一組標簽,它們不被當做告警實例的身份標識,它們經(jīng)常用于存儲一些額外的信息,用于報警信息的展示之類的。 summary: "節(jié)點失聯(lián)" description: "服務器實例節(jié)點斷聯(lián)已超過1分鐘!" - name: 服務器實例內(nèi)存告警規(guī)則 rules: - alert: "內(nèi)存使用率告警" expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes )) / node_memory_MemTotal_bytes * 100 > 99 # 告警閾值為當內(nèi)存使用率大于75% for: 30s labels: severity: warning annotations: summary: "服務器內(nèi)存報警" description: "服務器實例內(nèi)存資源利用率大于75%!(當前值: {{ $value }}%)" - name: 服務器實例磁盤報警規(guī)則 rules: - alert: 磁盤使用率告警 expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100 > 80 # 告警閾值為某個掛載點使用大于80% for: 1m labels: severity: warning annotations: summary: "服務器 磁盤報警" description: "服務器實例磁盤設備使用超過80%!(掛載點: {{ $labels.mountpoint }} 當前值: {{ $value }}%)" - name: 服務器實例CPU報警規(guī)則 rules: - alert: CPU使用率告警 expr: ( 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 70 # 告警閾值為CPU使用大于80% for: 1m labels: severity: warning annotations: summary: "服務器 CPU報警" description: "服務器實例CPU使用超過80%!當前值: {{ $value }}%" - name: 服務器實例磁盤I/O讀報警規(guī)則 rules: - alert: 磁盤讀 I/O 超過 30MB/s expr: irate(node_disk_read_bytes_total{device="sda"}[1m]) > 30000000 for: 30s labels: severity: warning annotations: summary: "磁盤讀I/O 讀負載 告警通知" description: "服務器實例I/O 每分鐘讀已超過 30MB/s,當前值: {{ $value }}" - name: 服務器實例磁盤I/O寫報警規(guī)則 rules: - alert: 磁盤寫 I/O 超過 30MB/s expr: irate(node_disk_written_bytes_total{device="sda"}[1m]) > 30000000 for: 30s labels: severity: warning annotations: summary: "磁盤寫I/O 寫負載 告警通知" description: "服務器實例I/O 每分鐘寫已超過 30MB/s,當前值: {{ $value }}" - name: 服務器實例網(wǎng)卡流出速率報警規(guī)則 rules: - alert: "網(wǎng)卡流出速率大于 10MB/s" expr: (irate(node_network_transmit_bytes_total{device!~"lo"}[1m]) / 1000) > 10000000 for: 30s labels: severity: warning annotations: summary: "服務器實例 網(wǎng)卡流量負載 告警通知" description: "網(wǎng)卡流量已經(jīng)超過 10MB/s, 當前值: {{ $value }}" - name: 服務器實例負載報警規(guī)則 rules: - alert: "服務器負載大于4" expr: node_load5 > 4 for: 30s labels: severity: warning annotations: summary: "服務器實例 負載 告警通知" description: "服務器實例負載已大于4, 當前值: {{ $value }}"
[root@rancher prometheus]# vim /data/prometheus/prometheus.yml ### 配置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:
- 10.12.121.198:9093 ##配置告警服務
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "/data/prometheus/rules/*.yml" ##配置告警規(guī)則
# - "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'.
static_configs:
- targets: ["localhost:9090"]
####rancher
- job_name: 'rancher'
file_sd_configs:
- refresh_interval: 1m
files:
- /data/prometheus/conf/rancher.yml
relabel_configs:
- source_labels: [__address__]
regex: "([^:]+):\\d+"
target_label: instance
##重啟alertmanager,prometheus 服務加載配置
[root@rancher rules]# systemctl restart alertmanager.service
[root@rancher rules]# systemctl restart prometheus.service
正常收到告警

3.3 配置企業(yè)微信群通知告警
企微群通知是通過webhook-adapter插件實現(xiàn)的
通過https://github.com/guyongquan/webhook-adapter 下載webhook-adapter-master.zip 包
首先在企微建一個企微群,創(chuàng)建接收機器人,獲取webhook地址


####將webhook-adapter-master.zip 包上傳到服務器/usr/local 目錄下
[root@rancher local]# unzip webhook-adapter-master.zip ##解壓
[root@rancher local]# mv webhook-adapter-master webhook-adapter ## 改名
[root@rancher local]# vim /usr/lib/systemd/system/webhook-adapter.service ##webhook-adapter 服務做成systemctl啟動
[Unit] Description=https://prometheus.io [Service] Restart=on-failure ExecStart=/opt/alertmanager-0.21.0/alertmanager --config.file=/opt/alertmanager-0.21.0/alertmanager.yml [Unit] Description=prometheus-webhook-dingtalk After=network-online.target [Service] Restart=on-failure ExecStart=/usr/local/node-v18.12.0/bin/node /usr/local/webhook-adapter/index.js --port=8070 --adapter=/usr/local/webhook-adapter/prometheusalert/wx.js=/wx=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=405d4e4c-81bc-4e2a38942c9 [Install] WantedBy=multi-user.target
[root@rancher webhook-adapter]# systemctl restart webhook-adapter.service ###啟動webhook-adapter 服務
[root@rancher webhook-adapter]#systemctl enable webhook-adapter.service ##配置開機自啟
或者使用docker 直接安裝webhook-adapter
docker run --name webhook-adapter -p 8070:80 -d guyongquan/webhook-adapter --adapter=/app/prometheusalert/wx.js=/wx=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=405d4e4c-81bc-4e38648c9
###!!!!此配置僅使用微信群告警
[root@rancher alertmanager]# vim alertmanager.yml global: resolve_timeout: 5m templates: - '/data/alertmanager/email.tmpl' route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'web.hook' receivers: - name: 'web.hook' webhook_configs: - url: 'http://10.12.121.198:8070/adapter/wx' #默認端口 send_resolved: true inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'
[root@rancher alertmanager]# systemctl restart alertmanager.service ##重啟加載配置
告警成功如圖

浙公網(wǎng)安備 33010602011771號