备注:以下操作均在root权限下进行的操作

安装前置环境:

已安装docker

已安装docker-compose

在/opt目录新建目录prom

在对应的prom目录下分别创建prometheus、alertmanager,grafana相关目录

  1. mkdir -p /opt/prom/{prometheus,prometheus/data,alertmanager,grafana}
  2. #prom目录结构
  3. prom/
  4. ├── alertmanager
  5. ├── grafana
  6. └── prometheus
  7. └── data

赋予相关目录对应的权限

chmod 777 /opt/prom/{prometheus/data,grafana}

编写docker-compose.yml文件,放在目录/opt/prom下

  1. touch /opt/prom/docker-compose.yml
  2. vim /opt/prom/docker-compose.yml

docker-compose.yml文件内容

  1. version: '3.3'
  2. services:
  3. node-exporter:
  4. image: prom/node-exporter:latest
  5. ports:
  6. - "9101:9100" #node-exporter默认端口9100,不过由于metersphere的node-exporter已经占用了9100了,这里调整为9101
  7. networks:
  8. - prom
  9. dingtalk:
  10. image: timonwong/prometheus-webhook-dingtalk:latest
  11. volumes:
  12. - type: bind
  13. source: ./alertmanager/config.yml
  14. target: /etc/prometheus-webhook-dingtalk/config.yml
  15. read_only: true
  16. ports:
  17. - "8060:8060"
  18. networks:
  19. - prom
  20. alertmanager:
  21. depends_on:
  22. - dingtalk
  23. image: prom/alertmanager:latest
  24. volumes:
  25. - type: bind
  26. source: ./alertmanager/alertmanager.yml
  27. target: /etc/alertmanager/alertmanager.yml
  28. read_only: true
  29. ports:
  30. - "9093:9093"
  31. - "9094:9094"
  32. networks:
  33. - prom
  34. prometheus:
  35. depends_on:
  36. - alertmanager
  37. image: prom/prometheus:latest
  38. volumes:
  39. - type: bind
  40. source: ./prometheus/prometheus.yml
  41. target: /etc/prometheus/prometheus.yml
  42. read_only: true
  43. - type: bind
  44. source: ./prometheus/alert-rules.yml
  45. target: /etc/prometheus/alert-rules.yml
  46. read_only: true
  47. - type: volume
  48. source: prometheus
  49. target: /prometheus
  50. ports:
  51. - "9200:9090" #prometheus默认端口9090,不过ms-prometheus占用该端口,这里换成9200
  52. networks:
  53. - prom
  54. grafana:
  55. depends_on:
  56. - prometheus
  57. image: grafana/grafana:latest
  58. volumes:
  59. - type: volume
  60. source: grafana
  61. target: /var/lib/grafana
  62. ports:
  63. - "3000:3000"
  64. networks:
  65. - prom
  66. volumes:
  67. prometheus:
  68. driver: local
  69. driver_opts:
  70. type: none
  71. o: bind
  72. device: /opt/prom/prometheus/data
  73. grafana:
  74. driver: local
  75. driver_opts:
  76. type: none
  77. o: bind
  78. device: /opt/prom/grafana
  79. networks:
  80. prom:
  81. driver: bridge

编写prometheus的配置文件prometheus.yml,放在/opt/prom/prometheus目录下

  1. touch /opt/prom/prometheus/prometheus.yml
  2. vim /opt/prom/prometheus/prometheus.yml
  1. global:
  2. scrape_interval: 15s
  3. evaluation_interval: 15s
  4. alerting:
  5. alertmanagers:
  6. - static_configs:
  7. - targets:
  8. - alertmanager:9093
  9. rule_files:
  10. - "*rules.yml"
  11. scrape_configs:
  12. - job_name: 'prometheus'
  13. static_configs:
  14. - targets: ['prometheus:9091']
  15. - job_name: 'node_prom_localhost'
  16. static_configs:
  17. - targets: ['node-exporter:9101']
  18. - job_name: 'alertmanager'
  19. static_configs:
  20. - targets: ['alertmanager:9093']

编写告警规则alert-rules.yml文件,放在目录/opt/prom/prometheus下

  1. touch /opt/prom/prometheus/alert-rules.yml
  2. vim /opt/prom/prometheus/alert-rules.yml
  1. groups:
  2. - name: node-alert
  3. rules:
  4. - alert: NodeDown
  5. expr: up{job="node"} == 0
  6. for: 5m
  7. labels:
  8. severity: critical
  9. instance: "{{ $labels.instance }}"
  10. annotations:
  11. summary: "instance: {{ $labels.instance }} down"
  12. description: "Instance: {{ $labels.instance }} 已经宕机 5分钟"
  13. value: "{{ $value }}"
  14. - alert: NodeCpuHigh
  15. expr: (1 - avg by (instance) (irate(node_cpu_seconds_total{job="node",mode="idle"}[5m]))) * 100 > 80
  16. for: 5m
  17. labels:
  18. severity: warning
  19. instance: "{{ $labels.instance }}"
  20. annotations:
  21. summary: "instance: {{ $labels.instance }} cpu使用率过高"
  22. description: "CPU 使用率超过 80%"
  23. value: "{{ $value }}"
  24. - alert: NodeCpuIowaitHigh
  25. expr: avg by (instance) (irate(node_cpu_seconds_total{job="node",mode="iowait"}[5m])) * 100 > 50
  26. for: 5m
  27. labels:
  28. severity: warning
  29. instance: "{{ $labels.instance }}"
  30. annotations:
  31. summary: "instance: {{ $labels.instance }} cpu iowait 使用率过高"
  32. description: "CPU iowait 使用率超过 50%"
  33. value: "{{ $value }}"
  34. - alert: NodeLoad5High
  35. expr: node_load5 > (count by (instance) (node_cpu_seconds_total{job="node",mode='system'})) * 1.2
  36. for: 5m
  37. labels:
  38. severity: warning
  39. instance: "{{ $labels.instance }}"
  40. annotations:
  41. summary: "instance: {{ $labels.instance }} load(5m) 过高"
  42. description: "Load(5m) 过高,超出cpu核数 1.2倍"
  43. value: "{{ $value }}"
  44. - alert: NodeMemoryHigh
  45. expr: (1 - node_memory_MemAvailable_bytes{job="node"} / node_memory_MemTotal_bytes{job="node"}) * 100 > 90
  46. for: 5m
  47. labels:
  48. severity: warning
  49. instance: "{{ $labels.instance }}"
  50. annotations:
  51. summary: "instance: {{ $labels.instance }} memory 使用率过高"
  52. description: "Memory 使用率超过 90%"
  53. value: "{{ $value }}"
  54. - alert: NodeDiskRootHigh
  55. expr: (1 - node_filesystem_avail_bytes{job="node",fstype=~"ext.*|xfs",mountpoint ="/"} / node_filesystem_size_bytes{job="node",fstype=~"ext.*|xfs",mountpoint ="/"}) * 100 > 90
  56. for: 10m
  57. labels:
  58. severity: warning
  59. instance: "{{ $labels.instance }}"
  60. annotations:
  61. summary: "instance: {{ $labels.instance }} disk(/ 分区) 使用率过高"
  62. description: "Disk(/ 分区) 使用率超过 90%"
  63. value: "{{ $value }}"
  64. - alert: NodeDiskBootHigh
  65. expr: (1 - node_filesystem_avail_bytes{job="node",fstype=~"ext.*|xfs",mountpoint ="/boot"} / node_filesystem_size_bytes{job="node",fstype=~"ext.*|xfs",mountpoint ="/boot"}) * 100 > 80
  66. for: 10m
  67. labels:
  68. severity: warning
  69. instance: "{{ $labels.instance }}"
  70. annotations:
  71. summary: "instance: {{ $labels.instance }} disk(/boot 分区) 使用率过高"
  72. description: "Disk(/boot 分区) 使用率超过 80%"
  73. value: "{{ $value }}"
  74. - alert: NodeDiskReadHigh
  75. expr: irate(node_disk_read_bytes_total{job="node"}[5m]) > 20 * (1024 ^ 2)
  76. for: 5m
  77. labels:
  78. severity: warning
  79. instance: "{{ $labels.instance }}"
  80. annotations:
  81. summary: "instance: {{ $labels.instance }} disk 读取字节数 速率过高"
  82. description: "Disk 读取字节数 速率超过 20 MB/s"
  83. value: "{{ $value }}"
  84. - alert: NodeDiskWriteHigh
  85. expr: irate(node_disk_written_bytes_total{job="node"}[5m]) > 20 * (1024 ^ 2)
  86. for: 5m
  87. labels:
  88. severity: warning
  89. instance: "{{ $labels.instance }}"
  90. annotations:
  91. summary: "instance: {{ $labels.instance }} disk 写入字节数 速率过高"
  92. description: "Disk 写入字节数 速率超过 20 MB/s"
  93. value: "{{ $value }}"
  94. - alert: NodeDiskReadRateCountHigh
  95. expr: irate(node_disk_reads_completed_total{job="node"}[5m]) > 3000
  96. for: 5m
  97. labels:
  98. severity: warning
  99. instance: "{{ $labels.instance }}"
  100. annotations:
  101. summary: "instance: {{ $labels.instance }} disk iops 每秒读取速率过高"
  102. description: "Disk iops 每秒读取速率超过 3000 iops"
  103. value: "{{ $value }}"
  104. - alert: NodeDiskWriteRateCountHigh
  105. expr: irate(node_disk_writes_completed_total{job="node"}[5m]) > 3000
  106. for: 5m
  107. labels:
  108. severity: warning
  109. instance: "{{ $labels.instance }}"
  110. annotations:
  111. summary: "instance: {{ $labels.instance }} disk iops 每秒写入速率过高"
  112. description: "Disk iops 每秒写入速率超过 3000 iops"
  113. value: "{{ $value }}"
  114. - alert: NodeInodeRootUsedPercentHigh
  115. expr: (1 - node_filesystem_files_free{job="node",fstype=~"ext4|xfs",mountpoint="/"} / node_filesystem_files{job="node",fstype=~"ext4|xfs",mountpoint="/"}) * 100 > 80
  116. for: 10m
  117. labels:
  118. severity: warning
  119. instance: "{{ $labels.instance }}"
  120. annotations:
  121. summary: "instance: {{ $labels.instance }} disk(/ 分区) inode 使用率过高"
  122. description: "Disk (/ 分区) inode 使用率超过 80%"
  123. value: "{{ $value }}"
  124. - alert: NodeInodeBootUsedPercentHigh
  125. expr: (1 - node_filesystem_files_free{job="node",fstype=~"ext4|xfs",mountpoint="/boot"} / node_filesystem_files{job="node",fstype=~"ext4|xfs",mountpoint="/boot"}) * 100 > 80
  126. for: 10m
  127. labels:
  128. severity: warning
  129. instance: "{{ $labels.instance }}"
  130. annotations:
  131. summary: "instance: {{ $labels.instance }} disk(/boot 分区) inode 使用率过高"
  132. description: "Disk (/boot 分区) inode 使用率超过 80%"
  133. value: "{{ $value }}"
  134. - alert: NodeFilefdAllocatedPercentHigh
  135. expr: node_filefd_allocated{job="node"} / node_filefd_maximum{job="node"} * 100 > 80
  136. for: 10m
  137. labels:
  138. severity: warning
  139. instance: "{{ $labels.instance }}"
  140. annotations:
  141. summary: "instance: {{ $labels.instance }} filefd 打开百分比过高"
  142. description: "Filefd 打开百分比 超过 80%"
  143. value: "{{ $value }}"
  144. - alert: NodeNetworkNetinBitRateHigh
  145. expr: avg by (instance) (irate(node_network_receive_bytes_total{device=~"eth0|eth1|ens33|ens37"}[1m]) * 8) > 20 * (1024 ^ 2) * 8
  146. for: 3m
  147. labels:
  148. severity: warning
  149. instance: "{{ $labels.instance }}"
  150. annotations:
  151. summary: "instance: {{ $labels.instance }} network 接收比特数 速率过高"
  152. description: "Network 接收比特数 速率超过 20MB/s"
  153. value: "{{ $value }}"
  154. - alert: NodeNetworkNetoutBitRateHigh
  155. expr: avg by (instance) (irate(node_network_transmit_bytes_total{device=~"eth0|eth1|ens33|ens37"}[1m]) * 8) > 20 * (1024 ^ 2) * 8
  156. for: 3m
  157. labels:
  158. severity: warning
  159. instance: "{{ $labels.instance }}"
  160. annotations:
  161. summary: "instance: {{ $labels.instance }} network 发送比特数 速率过高"
  162. description: "Network 发送比特数 速率超过 20MB/s"
  163. value: "{{ $value }}"
  164. - alert: NodeNetworkNetinPacketErrorRateHigh
  165. expr: avg by (instance) (irate(node_network_receive_errs_total{device=~"eth0|eth1|ens33|ens37"}[1m])) > 15
  166. for: 3m
  167. labels:
  168. severity: warning
  169. instance: "{{ $labels.instance }}"
  170. annotations:
  171. summary: "instance: {{ $labels.instance }} 接收错误包 速率过高"
  172. description: "Network 接收错误包 速率超过 15个/秒"
  173. value: "{{ $value }}"
  174. - alert: NodeNetworkNetoutPacketErrorRateHigh
  175. expr: avg by (instance) (irate(node_network_transmit_packets_total{device=~"eth0|eth1|ens33|ens37"}[1m])) > 15
  176. for: 3m
  177. labels:
  178. severity: warning
  179. instance: "{{ $labels.instance }}"
  180. annotations:
  181. summary: "instance: {{ $labels.instance }} 发送错误包 速率过高"
  182. description: "Network 发送错误包 速率超过 15个/秒"
  183. value: "{{ $value }}"
  184. - alert: NodeProcessBlockedHigh
  185. expr: node_procs_blocked{job="node"} > 10
  186. for: 10m
  187. labels:
  188. severity: warning
  189. instance: "{{ $labels.instance }}"
  190. annotations:
  191. summary: "instance: {{ $labels.instance }} 当前被阻塞的任务的数量过多"
  192. description: "Process 当前被阻塞的任务的数量超过 10个"
  193. value: "{{ $value }}"
  194. - alert: NodeTimeOffsetHigh
  195. expr: abs(node_timex_offset_seconds{job="node"}) > 3 * 60
  196. for: 2m
  197. labels:
  198. severity: info
  199. instance: "{{ $labels.instance }}"
  200. annotations:
  201. summary: "instance: {{ $labels.instance }} 时间偏差过大"
  202. description: "Time 节点的时间偏差超过 3m"
  203. value: "{{ $value }}"

编写alertmanager配置文件alertmanager.yml

  1. touch /opt/prom/alertmanager/alertmanager.yml
  2. vim /opt/prom/alertmanager/alertmanager.yml
  1. global:
  2. resolve_timeout: 5m
  3. smtp_smarthost: 'smtp.163.com:465' #邮箱smtp服务器代理,启用SSL发信, 端口一般是465
  4. smtp_from: 'test@163.com' #发送邮箱名称
  5. smtp_auth_username: 'test@163.com' #邮箱名称
  6. smtp_auth_password: 'test@123' #邮箱密码或授权码
  7. smtp_require_tls: false
  8. route:
  9. receiver: 'default'
  10. group_wait: 10s
  11. group_interval: 1m
  12. repeat_interval: 1h
  13. group_by: ['alertname']
  14. inhibit_rules:
  15. - source_match:
  16. severity: 'critical'
  17. target_match:
  18. severity: 'warning'
  19. equal: ['alertname', 'instance']
  20. receivers:
  21. - name: 'default'
  22. email_configs:
  23. - to: 'receiver@163.com'
  24. send_resolved: true
  25. webhook_configs:
  26. - url: 'http://dingtalk:8060/dingtalk/webhook/send' #这里是钉钉的接口
  27. send_resolved: true

编写钉钉告警相关配置文件config.yml放在/opt/prom/alertmanager/目录下

  1. touch /opt/prom/alertmanager/config.yml
  2. vim /opt/prom/alertmanager/config.yml
  1. targets:
  2. webhook:
  3. url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx #修改为钉钉机器人的webhook
  4. mention:
  5. all: true

切到/opt/prom目录下,使用docker-compose up -d去起相关服务

docker-compose up -d

posted on 2022-09-23 18:14  砖头哥-  阅读(502)  评论(0)    收藏  举报