• 基于 docker 搭建 grafana+prometheus 监控资源之mysql+docker+alertmanager配置(二)(超详细版)


    先去看第一篇(基础部署篇)看完后,才能接上本篇。

    环境信息

    hostnameip
    linux_204xxx.204
    linux_207xxx.207

    服务基本信息

    服务作用端口(默认)
    Prometheus普罗米修斯的主服务器9090
    Node_Exporter负责收集Host硬件信息和操作系统信息9100
    MySqld_Exporter负责收集mysql数据信息收集9104
    Cadvisor负责收集Host上运行的docker容器信息8080
    Grafana负责展示普罗米修斯监控界面3000
    Altermanager等待接收prometheus发过来的告警信息,altermanager再发送给定义的收件人9093

    一、安装Mysqld_exporter

    部署该容器后,mysqld_exporter会通过配置的DATA_SOURCE_NAME的信息去连接该mysql数据库,但由于我的mysql数据库是以docker swarm集群方式启动的,那么我的mysqld_exporter容器必须和该mysql数据库互通。因此,我将mysqld_exporter的网络也使用mysql数据库的网络,这样保证二者可以互相访问,那mysqld_exporter就使用docker-compose方式启动。下方我列出标准启动和docker-compose启动的命令,各位根据需求自取:

    1.1 标准启动
    # 启动mysqld_exporter
    
    docker run -d --name mysqld_exporter --restart=always -p 9104:9104 -e DATA_SOURCE_NAME="root:Password123@(172.17.0.2:3306)/" prom/mysqld-exporter
    
    • 1
    • 2
    • 3

    说明:

    • root -----> 账户
    • Password123 -----> 密码
    • 172.17.0.2:3306 -----> 地址和端口
    1.2 docker-compose启动
    # 启动mysqld_exporter
    
    vim mysqld_exporter.yml
    
    version: '3.2'
    services:
      mysqld_exporter:
        image: prom/mysqld-exporter
        restart: always
        networks:
          - pangu_middleware_pangu_online
        volumes:
          - ./.my.cnf:/home/.my.cnf    #用于mysqld_exporter去访问mysql数据库
        deploy:
          replicas: 1
        ports:
          - "9104:9104"
        environment:
          DATA_SOURCE_NAME: "mysqld_exporter:mysqld_exporter@(192.168.220.148:3306)/"    #这是mysql数据库的ip地址以及用户(用户需要单独创建)
    
    networks:
      pangu_middleware_pangu_online:    #该网络是mysql数据库所在的网段
        external: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    PS:正如上述文件的注释中写道:我们mysqld_exporter需要去访问mysql数据库,那么mysql数据库就需要创建一个用户和地址(mysqld_exporter@(192.168.220.148:3306))供mysqld_exporter访问,且mysqld_exporter也需要通过配置文件中的用户和密码(.my.cnf)才能够访问。

    1.2.1 创建mysql用户并配置权限
    create user 'mysqld_exporter'@'%' identified by 'mysqld_exporter';
    GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD ON *.* TO 'mysqld_exporter'@'%';
    
    • 1
    • 2

    在这里插入图片描述
    由于我是测试环境,且mysqld_exporter容器一直要重启,ip一直变,所以我就创建用户以及登录权限的时候给了"%",真实环境大家记得只给单独的ip,更加安全和规范。

    1.2.2 配置.my.cnf文件
    vim .my.cnf
    [client]
    user=mysqld_exporter
    password=mysqld_exporter
    
    • 1
    • 2
    • 3
    • 4

    输入http://ip:9104/metrics查看是否数据上报
    在这里插入图片描述
    配置prometheus.yml文件

    # 在后面添加以下数据
    
    vim prometheus/prometheus.yml
      - job_name: pangu_mysql
        static_configs:
          - targets: ["xxx.xxx.xxx.204:9104"]   # 收集mysql信息的mysqld_exporter的ip(这里是宿主机ip,ip映射到了宿主机)及端口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    #重启prometheus容器
    
    docker restart docker_prometheus
    
    • 1
    • 2
    • 3

    PS:这里一定是重启docker_prometheus,千万不要删除哈,不然所有已监控到的数据全部丢失了, 会重新监控,之前我修改了prometheus.yml后重启,容器内一直无法生效,索性就直接删除,重建了。当时还在想为什么数据全没了。。。但之所以无法生效是因为第一次docker run docker_prometheus容器时,没有使用-v指定映射文件,因此修改了容器外文件,重启也不会映射到容器内。

    完成后在http://ip:9090/targets中查看是否有刚刚配置的job_name: xxx信息出现
    在这里插入图片描述
    这里给出的全效果图
    打开Grafana倒入mysql监控信息模版
    在这里插入图片描述

    二、安装Cadvisor

    #启动cadvisor
    
    docker run -v /:/rootfs:ro -v /var/run:/var/run:rw -v /sys:/sys:ro -v /var/lib/docker/:/var/lib/docker:ro -v /dev/disk/:/dev/disk:ro -p 8080:8080 -d --name=cadvisor --restart=always google/cadvisor:latest
    
    • 1
    • 2
    • 3

    浏览器输入http://ip:8080/metrics 查看是否获取到数据
    在这里插入图片描述
    修改 prometheus.yml

    # 在后面添加以下数据
    
    vim prometheus/prometheus.yml
        - job_name: cadvisor_207
        static_configs:
          - targets: ["xxx.xxx.xxx.207:8080"]
      - job_name: cadvisor_204
        static_configs:
          - targets: ["xxx.xxx.xxx.204:8080"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    #重启prometheus容器
    
    docker restart docker_prometheus
    
    • 1
    • 2
    • 3

    完成后在http://ip:9090/targets中查看是否有刚刚配置的job_name: xxx信息出现
    在这里插入图片描述
    这里给出的全效果图
    打开Grafana倒入mysql监控信息模版
    在这里插入图片描述

    三、安装AlertManager

    # 1.启动容器
    docker run -itd --name alertmanager prom/alertmanager
    
    # 2.复制容器内部的配置文件到宿主机,不用事先创建$PWD/alertmanager目录
    docker cp -a alertmanager:/etc/alertmanager/ $PWD/alertmanager
    
    # 3.删除容器
    docker rm -f alertmanager
    
    # 4.启动服务 设置端口9093
    docker run -itd --name alertmanager -p 9093:9093 -v $PWD/alertmanager:/etc/alertmanager prom/alertmanager
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    浏览器输入http://ip:9093/#/alerts
    在这里插入图片描述

    3.1 AlertManager配置

    配置 vi alertmanager/alertmanager.yml 宿主机文件(本篇配置的qq邮箱报警,当然也可以163邮箱、企业微信、微信、钉钉等)

    # 配置好的文件内容 可直接复制
    alertmanager.yml
    global: # 全局配置
      resolve_timeout: 5m  # 处理超时时间,默认为5min
      smtp_from: ''  # 邮件发送地址(自行配置)
      smtp_smarthost: 'smtp.qq.com:465'  # 邮箱SMTP 服务地址
      smtp_auth_username: ''  # 邮件发送地址用户名(邮箱地址)
      smtp_auth_password: '英文'  # 邮件发送地址授权码(自行查看qq邮箱SMTP或POP3的授权码,百度可查如何配置)
      smtp_require_tls: false
      smtp_hello: 'qq.com'
    route:  # 设置报警的分发策略
      group_by: ['alertname']
      group_wait: 20s  #  最初即第一次等待多久时间发送一组警报的通知
      group_interval: 5m  # 在发送新警报前的等待时间
      repeat_interval: 5m  # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝
      receiver: 'email'
    receivers:  # 配置告警消息接受者信息
    - name: 'email'
      email_configs:
      - to: ''  # #邮件接收地址(自行配置)
        send_resolved: true
    inhibit_rules:  # 抑制规则配置
      - source_match:
          severity: 'critical'
        target_match:
          severity: 'warning'
        equal: ['alertname', 'dev', 'instance']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    # 重启alertmanager 容器
    docker restart alertmanager
    
    • 1
    • 2
    3.2 Prometheus 配置 AlertManager 告警规则

    新建Prometheus目录下 服务器 告警规则文件

    vim prometheus/node-exporter-record-rule.yml【注意看文内注释】
    
    groups:
    - name: server-alarm
      rules:
      - alert: "内存告警"
        expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 5   #正常情况下是80,这里写了5,是因为我看到真实使用是8,为了做告警出发,写了5
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "{{$labels.instance}}: 检测到 高内存 使用率!"
          description: "{{$labels.instance}}: 内存使用率在 80% 以上 (当前使用值为:{{ $value }})"
    
    
      - alert: "CPU告警"
        expr: (1 - avg(irate(node_cpu_seconds_total{mode="idle"}[2m])) by(instance)) * 100 > 80
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "{{$labels.instance}}: 检测到 高CPU 使用率!"
          description: "{{$labels.instance}}: CPU使用率在 80% 以上 (当前使用值为:{{ $value }})"
    
    
      - alert: "磁盘告警"
        expr: 100 - (node_filesystem_free_bytes{fstype=~"tmpfs|ext4"} / node_filesystem_size_bytes{fstype=~"tmpfs|ext4"} * 100) > 5
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "{{$labels.instance}}: 检测到 高磁盘 使用率!"
          description: "{{$labels.instance}}: 磁盘使用率在 80% 以上 (当前使用值为:{{ $value }})"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    新建Prometheus目录下 MySql 告警规则文件

    vim mysql-exporter-record-rule.yml
    
    groups:
    - name: mysql-alarm
      rules:
      - alert: "MySql is down"
        expr: mysql_up == 0
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "{{$labels.instance}}: 检测到 MySql服务 已停止运行!请重点关注!!!"
          description: "{{$labels.instance}}: 当前 MySql服务已停止! (当前状态mysql_up状态为:{{ $value }})"
    
    
      - alert: "MySql_High_QPS"
        expr: rate(mysql_global_status_questions[5m]) > 1500
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "{{$labels.instance}}: 检测到 MySql_High_QPS 过高!"
          description: "{{$labels.instance}}: 当前 MySql操作超过 1500/秒 (当前值为:{{ $value }})"
    
      - alert: "Mysql_Too_Many_Connections"
        expr: rate(mysql_global_status_threads_connected[5m]) > 300
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "{{$labels.instance}}: 检测到 MySql 连接过多!"
          description: "{{$labels.instance}}: 当前 MySql连接超过 300个/秒 (当前值为:{{ $value }})"
    
    
      - alert: "mysql_global_status_slow_queries"
        expr: rate(mysql_global_status_slow_queries[5m]) > 5
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "{{$labels.instance}}: 检测到 MySql 慢查询过多!"
          description: "{{$labels.instance}}: 当前 MySql慢查询 超过 5个/秒 (当前值为:{{ $value }})"
    
    
      - alert: "SQL thread stopped"
        expr: mysql_slave_status_slave_sql_running != 1
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "{{$labels.instance}}: 检测到 SQL 线程停止!请重点关注!!!"
          description: "{{$labels.instance}}: 当前 SQL线程 已停止! (当前值为:{{ $value }})"
    
      - alert: "IO thread stopped"
        expr: mysql_slave_status_slave_io_running != 1
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "{{$labels.instance}}: 检测到 IO 线程停止!请重点关注!!!"
          description: "{{$labels.instance}}: 当前 IO线程 已停止! (当前值为:{{ $value }})"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    修改Prometheus.yml文件

    vim prometheus/prometheus.yml
    
    # Alertmanager configuration
    alerting:
      alertmanagers:
        - static_configs:
            - targets: ["xxx.xxx.xxx.204:9093","xxx.xxx.xxx.207:9093"]   # 告警配置地址
    
    # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
    rule_files:
      # - "first_rules.yml"
      # - "second_rules.yml"
      - "*rule.yml" #告警通知文件信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    # 重启Prometheus 服务
    
    docker restart docker_prometheus
    
    • 1
    • 2
    • 3

    浏览器输入http://ip:9093/#/status检查是否配置成功
    在这里插入图片描述
    正常状态
    在这里插入图片描述

    四、触发告警(静等5分钟…)

    在这里插入图片描述
    将node-exporter-record-rule.yml中的内存使用率阀值改为80

    在这里插入图片描述
    告警解除
    在这里插入图片描述
    至此,基于 docker 搭建 grafana+prometheus 监控,以及监控项所有的配置全部完成。可以说比较简单,但是逻辑理清楚,出现问题知道是哪一块问题才是最主要的。送各位一句话:隧道的尽头总有光!!!加油,年轻的我们!

  • 相关阅读:
    C++学习笔记——链表基础算法
    产品化的GPT,能否为“百模大战”照亮未来?
    doris operator部署Doris集群教程
    进阶JAVA篇-深入了解 Set 系列集合
    html基本标签
    flink 1.13.2的pom.xml文件模板
    Unicode strings
    Axure RP中的相关概念及高保真原型构建方法
    JAVA毕业设计考研经网站系统计算机源码+lw文档+系统+调试部署+数据库
    绕不过的并发编程--synchronized原理
  • 原文地址:https://blog.csdn.net/D_Janrry/article/details/128115950