**

一、各种配置文件和容器准备

**

1、数据监测端口
docker run -d -p 9100:9100 -v /proc:/bridge/proc -v /sys:/bridge/sys -v /:/rootfs --net=bridge prom/node-exporter --path.procfs /bridge/proc --path.sysfs /bridge/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|bridge|etc)($|/)"
会生成一个容器,docker ps查看容器,如果启动不了,直接执行:
docker run  -d \
  -p 9100:9100 \
  prom/node-exporter
  或者docker pull prom/node-exporter,先把镜像拉下来,然后根据这个镜像生成容器,这个应该不需要挂载。访问http://192.168.1.150:9090/targets,可以看到一大排数据信息
  2、生成prometheus数据采集端口
  执行 vim /opt/prometheus/prometheus.yml,在路径下生成一个prometheus.yml文件,执行vim /opt/prometheus/rulesnode_status.yml,分别写入配置如下:
  
global:
scrape_interval:     15s
evaluation_interval: 15s


alerting:
  alertmanagers:
  - scheme: http
    static_configs:
    - targets:
      - "172.17.0.5:9093" #这个是读取告警的信息端口,正常来将是当前主机IP,但是我的不知道为啥访问不到,只能用docker inspect 容器ID查看真正的地址了
 
rule_files:
  - "/etc/prometheus/rules/node_status.yml" #这个是集成在9090端口的报警配置,读取的系统信息,注意这个是容器里的地址,也就是说,不挂载容器外的路径,在容器里是没有这个文件的,所以访问不到

scrape_configs:
  - job_name: 'loaclhost'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: '192.168.1.161'
    static_configs:
      - targets: ['192.168.1.161:9100']

node_status.yml文件配置:
  
groups:
- name: Node_Down
  rules:
  - alert: Node实例已宕机
    expr: up == 0
    for: 10s
    labels:
      user: root
      severity: Warning
annotations:
    summary: "Instance {{ $labels.instance }} Down"
    description: "{{ $labels.instance }} 任务 {{ $labels.job }} 挂了."
 可以访问ip+9090,看到信息显示,如果访问不了,看看是不是容器没有启动,切记,配置信息一定要格式正确无误,要不然会启动不起来容器!
 
 生成容器:
 docker run  -d \
  -p 9090:9090 \
  --name prometheus\
  --restart=always \
  -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml  \
  -v /opt/prometheus/rules/node_status.yml:/etc/prometheus/rules/node_status.yml \
  prom/prometheus
  此时,在/opt/prometheus 路径下面应结构该是:prometheus.yml(文件),rules(文件夹,包含:node_status.yml文件)

3、生成告警的端口alertmanager
执行vim /opt/alertmansger/alertmanager.yml  vim opt/alertmanager/template/wechat.tmpl
docker run -d \
  -p 9093:9093 \
  --name alertmanager \
  --restart=always \
  -v  /opt/alertmanager/template/wechat.tmpl:/etc/alertmanager/template/wechat.tmpl \
  -v /opt/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  prom/alertmanager
  生成alertmanager 访问ip+9093验证成功
  容器起不来:Restarting (1) Less than a second ago,查看容器日志,可能是配置文件写的有误。
同理/opt/alertmansger下面会有 :alertmanager.yml文件,opt/alertmanager/template/wechat.tmpl文件。
alertmanager.yml配置内容:
global:
  resolve_timeout: 2m # 每2分钟检查是否恢复

#自定义通知模板
templates:
  - '/etc/alertmanager/template/wechat.tmpl'#模板的路径,也是挂载到容器里面的路径
# route用来设置报警的分发策略
route:
# 采用哪个标签来作为分组依据
  group_by: ['alertname']
# 组告警等待时间。也就是告警产生后等待10s,如果有同组告警一起发出
  group_wait: 10s
# 两组告警的间隔时间
  group_interval: 10s
# 重复告警的间隔时间,减少相同微信告警的发送频率
  repeat_interval: 5m
 # 设置默认接收人
  receiver: 'wechat'
  routes:   # 可以指定哪些组接收哪些消息
    - receiver: 'wechat'
      continue: true
      group_wait: 10s

receivers:
- name: 'wechat'
  wechat_configs:
  - corp_id: 'ww92d183382fe731f6'#企业微信的企业id
    to_party: '2'#发到哪个组
    agent_id: '1000002'#添加的自动告警的应用的id
    api_secret: '2myxjF3yUYsPh7TSajlXusu9MyQKQq7pGruEq6RixMA'#添加的自动告警的应用的密钥
    send_resolved: true
wechat.tmpl配置内容:
{{ 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 "2020-4-16 15:55:19" }}
===========end============
{{ end }}
{{ end }}
4、建立集成面板grafana
docker run -d -p 3000:3000 --name grafana grafana/grafana(--name指定名称为grafana,依赖grafana/grafana镜像),还可以加入--restart=always,开机自动启动
访问这个端口,初次登入需要设置密码,然后在数据源里添加数据源,9090端口,我出现了添加数据源不成功的问题,原因是容器之间不能相互通信,只能用他们的实际IP地址,具体看另一篇文章看参考下面的截图。

到这时候我们启动的容器因该是:

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_http

二、其它操作

1、容器建立完毕,我们的9090端口应该是:

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_python_02


绿色存活,黄色未发送告警,红色已发送告警,如果企业微信不能接收到报警信息,有可能Prometheus.yml文件中的alertmanager地址不对,切记每个配置文件的关联性!!!!!

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_http_03


9093端口:

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_python_04


告警信息:

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_http_05

==============================================================================

使用中的一些记录

# 启动node-exporter
docker run -d -p 9100:9100 -v /proc:/bridge/proc -v /sys:/bridge/sys -v /:/rootfs --net=bridge prom/node-exporter --path.procfs /bridge/proc --path.sysfs /bridge/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|bridge|etc)($|/)"

# 然后访问 http://192.168.1.150:9090/targets
# 可以看到:

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_docker_06

'''意思是我们可以监测到这个http://192.168.1.150:9100/metrics地址的系统信息了'''

启动prometheus
新建prometheus.yml,在路径opt/prometheus下,vim进行编辑
global:
  scrape_interval:     60s
  evaluation_interval: 60s
 
scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['localhost:9090']
        labels:
          instance: prometheus
 
  - job_name: '192.168.1.161'
    static_configs:
      - targets: ['192.168.1.161:9100']

  - job_name: '192.168.1.150'
    static_configs:
      - targets: ['192.168.1.150:9100']

执行:
docker run  -d \
  -p 9090:9090 \
  -v /home/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml  \
  -v /home/prometheus/server/rules.yml:/etc/prometheus/rules.yml \
  不在opt路径下,挂载目录启动会出现问题,不知为啥

生成容器 docker ps -a查看容器
访问:http://192.168.1.150:9090/graph
如下

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_docker_07


访问:http://192.168.1.150:9090/targets

如下:

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_数据源_08


新建空文件夹grafana-storage,用来存储数据

mkdir /opt/grafana-storage

docker pull grafana/grafana:8.1.2 拉取镜像,最新的8.2.0不好用,出现数据源不可用

设置权限:

chmod 777 -R /home/grafana-storage

启动:docker run -d -p 3000:3000 --name=grafana grafana/grafana

访问: http://192.168.1.150:3000/

如下:

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_vim_09


初次登录会让我们设置密码

1、添加数据源:

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_docker_10


选择:prometheus

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_http_11


2、添加数据源url就是我们Prometheus的端口,负责收集数据的

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_http_12


将地址写入,点击下面的保存

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_docker_13


prometheus alertmanager推送到企微微信群 prometheus企业微信告警_http_14


导入数据源报错,161正常,150报错为啥

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_http_15

上述badgetway解决了,继续:

docker run -d
-p 9093:9093
–name alertmanager
–restart=always
-v /opt/alertmanager/template/wechat.tmpl:/etc/alertmanager/template/wechat.tmpl
-v /opt/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
prom/alertmanager
生成alertmanager 访问ip+9093验证成功
容器起不来:Restarting (1) Less than a second ago,查看容器日志,可能是配置文件写的有误。
参考: https://www.yangxinghui.com/682.html

注意

:1、Prometheus.yml文件里面,要配置alertmanager的IP地址,要不然会识别不到报警信息,如图

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_数据源_16


2、监测容器状况的篇日志文件要写容器里面的地址,在生成容器的时候挂载进去

docker run -d

-p 9090:9090

-v /home/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

-v /home/prometheus/server/rules.yml:/etc/prometheus/rules.yml

prom/prometheus

要是不挂载进去的话,Prometheus就找不到报警信息,打开9090端口,查看信息

告警信息如图

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_python_17


配置地址如图

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_vim_18


3、配置alertmanager 文件

global:
  resolve_timeout: 2m # 每2分钟检查是否恢复

#自定义通知模板
templates:
  - '/etc/alertmanager/template/wechat.tmpl'
# route用来设置报警的分发策略
route:
# 采用哪个标签来作为分组依据
  group_by: ['alertname']
# 组告警等待时间。也就是告警产生后等待10s,如果有同组告警一起发出
  group_wait: 10s
# 两组告警的间隔时间
  group_interval: 10s
# 重复告警的间隔时间,减少相同微信告警的发送频率
  repeat_interval: 1m
 # 设置默认接收人
  receiver: 'wechat'
  routes:   # 可以指定哪些组接收哪些消息
    - receiver: 'wechat'
      continue: true
      group_wait: 10s

receivers:
- name: 'wechat'
  wechat_configs:
  - corp_id: 'ww92d183382fe731f6'
    to_party: '2'
    agent_id: '1000002'
    api_secret: '2myxjF3yUYsPh7TSajlXusu9MyQKQq7pGruEq6RixMA'
    send_resolved: true

其中,templates:

  • ‘/etc/alertmanager/template/wechat.tmpl’,指的是容器中的模板地址,在生成容器的时候一样要挂载进去,要不然找不到
    4、告警模板
{{ 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 "2020-4-16 15:55:19" }}
===========end============
{{ end }}
{{ end }}

模板合集:

groups:
- name: 磁盘使用率报警规则
  rules:
  - alert: 磁盘使用率告警
    expr: 100 - node_filesystem_free_bytes{fstype=~"xfs|ext4"} / node_filesystem_size_bytes{fstype=~"xfs|ext4"} * 100 > 80
    for: 20m
    labels:
      severity: warning
    annotations:
      summary: "硬盘分区使用率过高"
      description: "分区使用大于80%(当前值:{{ $value }}%)"

- name: CPU报警规则
  rules:
  - alert: CPU使用率告警
    expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]) )) * 100 > 50
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "CPU使用率正在飙升。"
      description: "CPU使用率超过50%(当前值:{{ $value }}%)"

- name: 内存报警规则
  rules:
  - alert: 内存使用率告警
    expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 50
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "服务器可用内存不足。"
      description: "内存使用率已超过50%(当前值:{{ $value }}%)"


- name: 内存报警规则
  rules:
  - alert: 内存使用率告警
    expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 50
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "服务器可用内存不足。"
      description: "内存使用率已超过50%(当前值:{{ $value }}%)"

prometheus alertmanager推送到企微微信群 prometheus企业微信告警_python_19