Prometheus监控docker容器
@
Prometheus(普羅米修斯)監控
Prometheus是最初在SoundCloud上構建的開源系統監視和警報工具包 。自2012年成立以來,許多公司和組織都采用了Prometheus,該項目擁有非?;钴S的開發人員和用戶社區 。
使用prometheus的特性
- 易管理性
Prometheus核心部分只有一個單獨的二進制文件,可直接在本地工作,不依賴于分布式存儲
-
不依賴分布式存儲,單服務器節點是自治的
-
高效
單一Prometheus可以處理數以百萬的監控指標;每秒處理數十萬
的數據點
-
易于伸縮
Prometheus提供多種語言 的客戶端SDK,這些SDK可以快速讓應用程序納入到Prometheus的監控當中
-
通過服務發現或靜態配置發現目標
-
良好的可視化
除了自帶的可視化web界面,還有另外最新的Grafana可視化工具也提供了完整的Proetheus支持,基于 Prometheus提供的API還可以實現自己的監控可視化UI
docker搭建prometheus監控
環境:
- 全部關閉防火墻,禁用selinux
| machine | 172.16.46.111 | NodeEXporter、cAdvisor、 Prometheus Server、Grafana |
| node01 | 172.16.46.112 | NodeEXporter、cAdvisor |
| node02 | 172.16.46.113 | NodeEXporter、cAdvisor |
安裝prometheus組件說明:
Prometheus Server: 普羅米修斯的主服務器,端口號9090
NodeEXporter: 負責收集Host硬件信息和操作系統信息,端口號9100
cAdvisor:負責收集Host上運行的容器信息,端口號占用8080
Grafana:負責展示普羅米修斯監控界面,端口號3000
altermanager:等待接收prometheus發過來的告警信息,altermanager再發送給定義的收件人
部署node-EXporter,收集硬件和系統信息
#3臺主機都要安裝 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)($|/)"PS:注意,為了網絡的高效率,我們的網絡使用的是host
驗證收集效果
部署安裝cAdvisor,收集節點容器信息
#3臺都要安裝 docker run -v /:/rootfs:ro -v /var/run:/var/run/:rw -v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro -p 8080:8080 --detach=true --name=cadvisor --net=host google/cadvisor驗證收集效果傳遞
部署prometheus-server服務
先啟動一個prometheus服務,目的是復制他的配置文件,修改配置文件,prometheus掛載這個文件
mkdir /prometheus docker run -d --name test -P prom/prometheus docker cp test:/etc/prometheus/prometheus.yml /prometheus #編輯prometheus配置文件,在static_configs下面修改為 #以下添加的ip都將會被監控起來- targets: ['localhost:9090','localhost:8080','localhost:9100','172.16.46.112:8080','172.16.46.112:9100','172.16.46.113:8080','172.16.46.113:9100']重新運行prometheus服務
收集cAdvisor和nodexporter的信息到prometheus
docker rm -f test docker run -d --name prometheus --net host -p 9090:9090 -v /prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus訪問測試
進入首頁會看到
在這里會出現簡單的圖形展示,和顯然,這樣看的話還得根據條件篩選著看,而且界面很簡單,所以我們還要接入grafana
在prometheus服務器上部署grafana
grafana主要概念
- 插件:擴展功能作用,完成不能完成的事
- 數據源:連接數據源,通過數據源提供數據 來出圖
- dashboard:展示面板,出什么樣的圖
grafana在zabbix應用參考: https://blog.csdn.net/weixin_43815140/article/details/106109605
部署grafana
mkdir /grafana chmod 777 -R /grafana docker run -d -p 3000:3000 --name grafana -v /grafana:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123.com" grafana/grafana訪問測試
默認的用戶名和密碼:
username:admin
password:123.com
登錄進去,添加數據源
連接prometheus
點擊save&test開始開始連接
看到以上說明連接成功,不過還需要dashboard來展示圖案
prometheus提供3種自帶的方案
import后看一下效果
看起來效果比原來好的太多了,不過
grafana官網提供了更多的模板讓我們選擇 官網模板根據我們的需求可以在官網挑選一款合適自己環境的模板不是很難。
導入模板的2種方式
- 下載JSON文件到本地,uoload上傳導入
- 直接輸入ID,load就會自動加載到這個模板
我們就導入上面的模板為例
小微調試以后,會出現
不過這只是監控的宿主機資源信息,如果我們想看docker容器的信息
在官網查找與docker有關的模板導入并使用
找到一款全部適合的(ID:11600)
配置Alertmanager報警
啟動 AlertManager 來接受 Prometheus 發送過來的報警信息,并執行各種方式的報警。
alertmanager與prometheus工作流程如下
- prometheus收集監測的信息
- prometheus.yml文件定義rules文件,rules里包括了告警信息
- prometheus把報警信息push給alertmanager ,alertmanager里面有定義收件人和發件人
- alertmanager發送文件給郵箱或微信
告警等級
同樣以 Docker 方式啟動 AlertManager
同prometheus一樣,先啟動一個test容器,拷貝下來alertmanager的配置文件
mkdir /alertmanager docker run -d --name test -p 9093:9093 prom/alertmanager docker cp test:/etc/alertmanager/alertmanager.yml /alertmanager cp alertmanager.yml alertmanager.yml.bakAlertManager 默認配置文件為 alertmanager.yml,在容器內路徑為/etc/alertmanager/alertmanager.yml
這里 AlertManager 默認啟動的端口為 9093,啟動完成后,瀏覽器訪問http://:9093 可以看到默認提供的 UI 頁面,不過現在是沒有任何告警信息的,因為我們還沒有配置報警規則來觸發報警
配置alertmanager郵箱報警
查看alertmanager的配置文件
簡單介紹一下主要配置的作用:簡單介紹一下主要配置的作用:
global: 全局配置,包括報警解決后的超時時間、SMTP 相關配置、各種渠道通知的 API 地址等等。
route: 用來設置報警的分發策略,它是一個樹狀結構,按照深度優先從左向右的順序進行匹配。
receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
inhibit_rules: 抑制規則配置,當存在與另一組匹配的警報(源)時,抑制規則將禁用與一組匹配的報警(目標)。
配置郵箱報警,首先我們郵箱需要開啟SMTP服務,并獲取唯一標識碼
編輯alertmanager.yml文件
編輯報警媒介等相關信息
global:resolve_timeout: 5msmtp_from: 'Sunny_lzs@foxmail.com' #定義發送的郵箱smtp_smarthost: 'smtp.qq.com:465'smtp_auth_username: 'Sunny_lzs@foxmail.com'smtp_auth_password: 'iwxrdwmdgofdbbdc'smtp_require_tls: falsesmtp_hello: 'qq.com' route:group_by: ['alertname']group_wait: 5sgroup_interval: 5srepeat_interval: 5mreceiver: 'email' receivers: - name: 'email'email_configs:- to: 'Sunny_lzs@foxmail.com' #定義接收的郵箱send_resolved: true inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']重啟alertmanager容器
docker rm -f test docker run -d --name alertmanager -p 9093:9093 -v /alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanagerprometheus添加alertmanager報警規則
接下來,我們需要在 Prometheus 配置 AlertManager 服務地址以及告警規則,新建報警規則文件 node-up.rules 如下
mkdir /prometheus/rules cd /prometheus/rules vim node-up.rules groups: - name: node-uprules:- alert: node-upexpr: up{job="prometheus"} == 0for: 15slabels:severity: 1 team: nodeannotations:summary: "{{ $labels.instance }} 已停止運行超過 15s!"修改prometheus.yml文件,添加rules規則
PS:這里 rule_files 為容器內路徑,需要將本地 node-up.rules 文件掛載到容器內指定路徑,修改 Prometheus 啟動命令如下,并重啟服務。
docker rm -f prometheus docker run -d --name prometheus -p 9090:9090 -v /prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /prometheus/rules:/usr/local/prometheus/rules --net host prom/prometheus在prometheus上查看相應的規則
觸發報警發送郵件
關掉其中一個服務就ok
[root@docker02 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8d1cc177b58e google/cadvisor "/usr/bin/cadvisor -…" 4 hours ago Up 4 hours cadvisor b2417dbd850f prom/node-exporter "/bin/node_exporter …" 4 hours ago Up 4 hours gallant_proskuriakova [root@docker02 ~]# docker stop 8d1cc177b58e 8d1cc177b58e查看郵件
Alertmanager自定義郵件報警
上面雖然已經可以做出報警,但是我們想讓報警信息更加直觀一些
alertmanager支持自定義郵件模板的
首先新建一個模板文件 email.tmpl
mkdir /alertmanager/template vim email.tmpl {{ define "email.from" }}Sunny_lzs@foxmail.com{{ end }} {{ define "email.to" }}Sunny_lzs@foxmail.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> 觸發時間: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br> =========end==========<br> {{ end }} {{ end }}修改alertmanager文件
重建altermanager
[root@docker01 ~]# docker rm -f alertmanager [root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /alertmanager/template:/etc/alertmanager-tmpl prom/alertmanager測試
PS:模板里面的{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}是我們添加東八區時間以后的樣子.
擴展案例:添加主機CPU,內存,磁盤等報警監控規則
recording_rules規則: 記錄規則允許您預先計算經常需要的或計算開銷較大的表達式,并將它們的結果保存為一組新的時間序列。查詢預先計算的結果通常比每次需要執行原始表達式時要快得多
alert_rules規則: 警報規則允許您基于Prometheus表達式語言表達式定義警報條件,并向外部服務發送關于觸發警報的通知
PS: 記錄和警報規則的名稱必須是有效的指標名稱
因為我們已經定義了規則存放在/prometheus/rules/*.rules結尾的文件
所以,我們可以把所有的規則寫到這里
在prometheus.yml同級目錄下創建兩個報警規則配置文件node-exporter-record-rule.yml,node-exporter-alert-rule.yml。第一個文件用于記錄規則,第二個是報警規則。
#prometheus關于報警規則配置 rule_files:- "/usr/local/prometheus/rules/*.rules"PS:*.rules里面的job一定要與prometheus里面對應
scrape_configs:# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: 'node-exporter'添加記錄
#關于node-exporter-record.rules groups:- name: node-exporter-recordrules:- expr: up{job="node-exporter"}record: node_exporter:uplabels:desc: "節點是否在線, 在線1,不在線0"unit: " "job: "node-exporter"- expr: time() - node_boot_time_seconds{}record: node_exporter:node_uptimelabels:desc: "節點的運行時間"unit: "s"job: "node-exporter" ############################################################################################## # cpu #- expr: (1 - avg by (environment,instance) (irate(node_cpu_seconds_total{job="node-exporter",mode="idle"}[5m]))) * 100record: node_exporter:cpu:total:percentlabels:desc: "節點的cpu總消耗百分比"unit: "%"job: "node-exporter"- expr: (avg by (environment,instance) (irate(node_cpu_seconds_total{job="node-exporter",mode="idle"}[5m]))) * 100record: node_exporter:cpu:idle:percentlabels:desc: "節點的cpu idle百分比"unit: "%"job: "node-exporter"- expr: (avg by (environment,instance) (irate(node_cpu_seconds_total{job="node-exporter",mode="iowait"}[5m]))) * 100record: node_exporter:cpu:iowait:percentlabels:desc: "節點的cpu iowait百分比"unit: "%"job: "node-exporter"- expr: (avg by (environment,instance) (irate(node_cpu_seconds_total{job="node-exporter",mode="system"}[5m]))) * 100record: node_exporter:cpu:system:percentlabels:desc: "節點的cpu system百分比"unit: "%"job: "node-exporter"- expr: (avg by (environment,instance) (irate(node_cpu_seconds_total{job="node-exporter",mode="user"}[5m]))) * 100record: node_exporter:cpu:user:percentlabels:desc: "節點的cpu user百分比"unit: "%"job: "node-exporter"- expr: (avg by (environment,instance) (irate(node_cpu_seconds_total{job="node-exporter",mode=~"softirq|nice|irq|steal"}[5m]))) * 100record: node_exporter:cpu:other:percentlabels:desc: "節點的cpu 其他的百分比"unit: "%"job: "node-exporter" ############################################################################################################################################################################################ # memory #- expr: node_memory_MemTotal_bytes{job="node-exporter"}record: node_exporter:memory:totallabels:desc: "節點的內存總量"unit: bytejob: "node-exporter"- expr: node_memory_MemFree_bytes{job="node-exporter"}record: node_exporter:memory:freelabels:desc: "節點的剩余內存量"unit: bytejob: "node-exporter"- expr: node_memory_MemTotal_bytes{job="node-exporter"} - node_memory_MemFree_bytes{job="node-exporter"}record: node_exporter:memory:usedlabels:desc: "節點的已使用內存量"unit: bytejob: "node-exporter"- expr: node_memory_MemTotal_bytes{job="node-exporter"} - node_memory_MemAvailable_bytes{job="node-exporter"}record: node_exporter:memory:actualusedlabels:desc: "節點用戶實際使用的內存量"unit: bytejob: "node-exporter"- expr: (1-(node_memory_MemAvailable_bytes{job="node-exporter"} / (node_memory_MemTotal_bytes{job="node-exporter"})))* 100record: node_exporter:memory:used:percentlabels:desc: "節點的內存使用百分比"unit: "%"job: "node-exporter"- expr: ((node_memory_MemAvailable_bytes{job="node-exporter"} / (node_memory_MemTotal_bytes{job="node-exporter"})))* 100record: node_exporter:memory:free:percentlabels:desc: "節點的內存剩余百分比"unit: "%"job: "node-exporter" ############################################################################################## # load #- expr: sum by (instance) (node_load1{job="node-exporter"})record: node_exporter:load:load1labels:desc: "系統1分鐘負載"unit: " "job: "node-exporter"- expr: sum by (instance) (node_load5{job="node-exporter"})record: node_exporter:load:load5labels:desc: "系統5分鐘負載"unit: " "job: "node-exporter"- expr: sum by (instance) (node_load15{job="node-exporter"})record: node_exporter:load:load15labels:desc: "系統15分鐘負載"unit: " "job: "node-exporter"############################################################################################## # disk #- expr: node_filesystem_size_bytes{job="node-exporter" ,fstype=~"ext4|xfs"}record: node_exporter:disk:usage:totallabels:desc: "節點的磁盤總量"unit: bytejob: "node-exporter"- expr: node_filesystem_avail_bytes{job="node-exporter",fstype=~"ext4|xfs"}record: node_exporter:disk:usage:freelabels:desc: "節點的磁盤剩余空間"unit: bytejob: "node-exporter"- expr: node_filesystem_size_bytes{job="node-exporter",fstype=~"ext4|xfs"} - node_filesystem_avail_bytes{job="node-exporter",fstype=~"ext4|xfs"}record: node_exporter:disk:usage:usedlabels:desc: "節點的磁盤使用的空間"unit: bytejob: "node-exporter"- expr: (1 - node_filesystem_avail_bytes{job="node-exporter",fstype=~"ext4|xfs"} / node_filesystem_size_bytes{job="node-exporter",fstype=~"ext4|xfs"}) * 100record: node_exporter:disk:used:percentlabels:desc: "節點的磁盤的使用百分比"unit: "%"job: "node-exporter"- expr: irate(node_disk_reads_completed_total{job="node-exporter"}[1m])record: node_exporter:disk:read:count:ratelabels:desc: "節點的磁盤讀取速率"unit: "次/秒"job: "node-exporter"- expr: irate(node_disk_writes_completed_total{job="node-exporter"}[1m])record: node_exporter:disk:write:count:ratelabels:desc: "節點的磁盤寫入速率"unit: "次/秒"job: "node-exporter"- expr: (irate(node_disk_written_bytes_total{job="node-exporter"}[1m]))/1024/1024record: node_exporter:disk:read:mb:ratelabels:desc: "節點的設備讀取MB速率"unit: "MB/s"job: "node-exporter"- expr: (irate(node_disk_read_bytes_total{job="node-exporter"}[1m]))/1024/1024record: node_exporter:disk:write:mb:ratelabels:desc: "節點的設備寫入MB速率"unit: "MB/s"job: "node-exporter"############################################################################################## # filesystem #- expr: (1 -node_filesystem_files_free{job="node-exporter",fstype=~"ext4|xfs"} / node_filesystem_files{job="node-exporter",fstype=~"ext4|xfs"}) * 100record: node_exporter:filesystem:used:percentlabels:desc: "節點的inode的剩余可用的百分比"unit: "%"job: "node-exporter" ############################################################################################# # filefd #- expr: node_filefd_allocated{job="node-exporter"}record: node_exporter:filefd_allocated:countlabels:desc: "節點的文件描述符打開個數"unit: "%"job: "node-exporter"- expr: node_filefd_allocated{job="node-exporter"}/node_filefd_maximum{job="node-exporter"} * 100record: node_exporter:filefd_allocated:percentlabels:desc: "節點的文件描述符打開百分比"unit: "%"job: "node-exporter"############################################################################################# # network #- expr: avg by (environment,instance,device) (irate(node_network_receive_bytes_total{device=~"eth0|eth1|ens33|ens37"}[1m]))record: node_exporter:network:netin:bit:ratelabels:desc: "節點網卡eth0每秒接收的比特數"unit: "bit/s"job: "node-exporter"- expr: avg by (environment,instance,device) (irate(node_network_transmit_bytes_total{device=~"eth0|eth1|ens33|ens37"}[1m]))record: node_exporter:network:netout:bit:ratelabels:desc: "節點網卡eth0每秒發送的比特數"unit: "bit/s"job: "node-exporter"- expr: avg by (environment,instance,device) (irate(node_network_receive_packets_total{device=~"eth0|eth1|ens33|ens37"}[1m]))record: node_exporter:network:netin:packet:ratelabels:desc: "節點網卡每秒接收的數據包個數"unit: "個/秒"job: "node-exporter"- expr: avg by (environment,instance,device) (irate(node_network_transmit_packets_total{device=~"eth0|eth1|ens33|ens37"}[1m]))record: node_exporter:network:netout:packet:ratelabels:desc: "節點網卡發送的數據包個數"unit: "個/秒"job: "node-exporter"- expr: avg by (environment,instance,device) (irate(node_network_receive_errs_total{device=~"eth0|eth1|ens33|ens37"}[1m]))record: node_exporter:network:netin:error:ratelabels:desc: "節點設備驅動器檢測到的接收錯誤包的數量"unit: "個/秒"job: "node-exporter"- expr: avg by (environment,instance,device) (irate(node_network_transmit_errs_total{device=~"eth0|eth1|ens33|ens37"}[1m]))record: node_exporter:network:netout:error:ratelabels:desc: "節點設備驅動器檢測到的發送錯誤包的數量"unit: "個/秒"job: "node-exporter"- expr: node_tcp_connection_states{job="node-exporter", state="established"}record: node_exporter:network:tcp:established:countlabels:desc: "節點當前established的個數"unit: "個"job: "node-exporter"- expr: node_tcp_connection_states{job="node-exporter", state="time_wait"}record: node_exporter:network:tcp:timewait:countlabels:desc: "節點timewait的連接數"unit: "個"job: "node-exporter"- expr: sum by (environment,instance) (node_tcp_connection_states{job="node-exporter"})record: node_exporter:network:tcp:total:countlabels:desc: "節點tcp連接總數"unit: "個"job: "node-exporter"############################################################################################# # process #- expr: node_processes_state{state="Z"}record: node_exporter:process:zoom:total:countlabels:desc: "節點當前狀態為zoom的個數"unit: "個"job: "node-exporter" ############################################################################################# # other #- expr: abs(node_timex_offset_seconds{job="node-exporter"})record: node_exporter:time:offsetlabels:desc: "節點的時間偏差"unit: "s"job: "node-exporter"#############################################################################################- expr: count by (instance) ( count by (instance,cpu) (node_cpu_seconds_total{ mode='system'}) )record: node_exporter:cpu:count關于報警文件
#關于node-exporer-alert.rules groups:- name: node-exporter-alertrules:- alert: node-exporter-downexpr: node_exporter:up == 0for: 1mlabels:severity: 'critical'annotations:summary: "instance: {{ $labels.instance }} 宕機了"description: "instance: {{ $labels.instance }} \n- job: {{ $labels.job }} 關機了, 時間已經1分鐘了。"value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-cpu-highexpr: node_exporter:cpu:total:percent > 80for: 3mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} cpu 使用率高于 {{ $value }}"description: "instance: {{ $labels.instance }} \n- job: {{ $labels.job }} CPU使用率已經持續三分鐘高過80% 。"value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-cpu-iowait-highexpr: node_exporter:cpu:iowait:percent >= 12for: 3mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} cpu iowait 使用率高于 {{ $value }}"description: "instance: {{ $labels.instance }} \n- job: {{ $labels.job }} cpu iowait使用率已經持續三分鐘高過12%"value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-load-load1-highexpr: (node_exporter:load:load1) > (node_exporter:cpu:count) * 1.2for: 3mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} load1 使用率高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-memory-highexpr: node_exporter:memory:used:percent > 85for: 3mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} memory 使用率高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-disk-highexpr: node_exporter:disk:used:percent > 88for: 10mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} disk 使用率高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-disk-read:count-highexpr: node_exporter:disk:read:count:rate > 3000for: 2mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} iops read 使用率高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-disk-write-count-highexpr: node_exporter:disk:write:count:rate > 3000for: 2mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} iops write 使用率高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-disk-read-mb-highexpr: node_exporter:disk:read:mb:rate > 60for: 2mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} 讀取字節數 高于 {{ $value }}"description: ""instance: "{{ $labels.instance }}"value: "{{ $value }}"- alert: node-exporter-disk-write-mb-highexpr: node_exporter:disk:write:mb:rate > 60for: 2mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} 寫入字節數 高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-filefd-allocated-percent-highexpr: node_exporter:filefd_allocated:percent > 80for: 10mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} 打開文件描述符 高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-network-netin-error-rate-highexpr: node_exporter:network:netin:error:rate > 4for: 1mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} 包進入的錯誤速率 高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-network-netin-packet-rate-highexpr: node_exporter:network:netin:packet:rate > 35000for: 1mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} 包進入速率 高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-network-netout-packet-rate-highexpr: node_exporter:network:netout:packet:rate > 35000for: 1mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} 包流出速率 高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-network-tcp-total-count-highexpr: node_exporter:network:tcp:total:count > 40000for: 1mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} tcp連接數量 高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-process-zoom-total-count-highexpr: node_exporter:process:zoom:total:count > 10for: 10mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} 僵死進程數量 高于 {{ $value }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"- alert: node-exporter-time-offset-highexpr: node_exporter:time:offset > 0.03for: 2mlabels:severity: infoannotations:summary: "instance: {{ $labels.instance }} {{ $labels.desc }} {{ $value }} {{ $labels.unit }}"description: ""value: "{{ $value }}"instance: "{{ $labels.instance }}"配置企業微信報警
新建一個存放wechat.tmpl的目錄
mkdir /alertmanager/template/ cd /alertmanager/template/ vim wechat.tmpl ## 帶恢復告警的模版 注:alertmanager.yml wechat_configs中加上配置send_resolved: true {{ define "wechat.default.message" }} {{ range $i, $alert :=.Alerts }} ===alertmanager監控報警=== 告警狀態:{{ .Status }} 告警級別:{{ $alert.Labels.severity }} 告警類型:{{ $alert.Labels.alertname }} 告警應用:{{ $alert.Annotations.summary }} 故障主機: {{ $alert.Labels.instance }} 告警主題: {{ $alert.Annotations.summary }} 觸發閥值:{{ $alert.Annotations.value }} 告警詳情: {{ $alert.Annotations.description }} 觸發時間: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }} ===========end============ {{ end }} {{ end }}修改alertmanager里面的收件人
global:resolve_timeout: 5mwechat_api_corp_id: 'ww2b0ab679438a91fc'wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'wechat_api_secret: 'Zl6pH_f-u2R1bwqDVPfLFygTR-JaYpH08vcTBr8xb0A' templates:- '/etc/alertmanager/template/wechat.tmpl' route:group_by: ['alertname']group_wait: 10sgroup_interval: 10srepeat_interval: 1hreceiver: 'wechat' receivers: - name: 'wechat'wechat_configs:- send_resolved: trueto_party: '2'to_user: 'LiZhiSheng'agent_id: 1000005corp_id: 'ww2b0ab679438a91fc'api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'api_secret: 'Zl6pH_f-u2R1bwqDVPfLFygTR-JaYpH08vcTBr8xb0A' inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']prometheus配置不要變,我們還使用以前的rules規則
重啟alertmanager
docker run -d --name alertmanager -p 9093:9093 -v /alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /alertmanager/template/:/etc/alertmanager/template prom/alertmanager參數說明:
- corp_id: 企業微信賬號唯一 ID, 可以在我的企業中查看。
- to_party: 需要發送的組。
- to_user: 需要發送的用戶
- agent_id: 第三方企業應用的 ID,可以在自己創建的第三方企業應用詳情頁面查看。
- api_secret: 第三方企業應用的密鑰,可以在自己創建的第三方企業應用詳情頁面查看。
驗證:
停掉一臺docker容器
恢復消息如下
總結
以上是生活随笔為你收集整理的Prometheus监控docker容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hui后台框架html页面中的图标,HU
- 下一篇: 从ChatGPT到ChatCAD:基于大