• Docker——Prometheus监控服务治理


    摘要

    Prometheus是继Kubernetes之后,第二个从云原生计算基金会(CNCF)毕业的项目。Prometheus是Google监控系统BorgMon类似实现的开源版,整套系统由监控服务、告警服务、时序数据库等几个部分,及周边生态的各种指标收集器(Exporter)组成,是在当下主流的云原生监控告警系统,Prometheus有这些特性:

    • 开箱即用的各种服务发现机制,可以自动发现监控端点;
    • 专为监控指标数据设计的高性能时序数据库TSDB;
    • 强大易用的查询语言PromQL以及丰富的聚合函数;
    • 可以配置灵活的告警规则,支持告警收敛(分组、抑制、静默)、多级路由等等高级功能;
    • 生态完善,有各种现成的开源Exporter实现,实现自定义的监控指标也非常简单。

    本博文将详细的介绍基于Prometheus的生产环境下的基础服务的监控与自定义服务的监控服务治理。帮助大家在项目生产环境中能够时间集监控与预警和自动化脚本处理等功能。

    一、Prometheus的基础原理简介

    二、Prometheus+Alertmanager实战

    通过Prometheus+Alertmanager+docker(部署该服务,包括四个组件:Prometheus Server、Node Exporter、cAdvrisor、Grafana。)其他组件来进行相关的配置实战。

    • Prometheus Server:Prometheus服务的主服务器 ;
    • Node Exporter:收集Host硬件和操作系统的信息;
    • cAdvrisor:负责收集Host上运行的容器信息;
    • Grafana:用来展示Prometheus监控操作界面(给我们提供一个友好的web界面)

    2.1 docker 运行组件

    运行Node Server容器:该组件需要运行在所有需要监控的主机上,也就是,我这里三台服务器都需要执行下面的命令,运行此容器组件。

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

    每台服务器运行上述命令后,浏览器访问docker服务器的IP地址+9100端口,能够看到以下界面,即说明容器运行没有问题。看到的网页如下就表示部署成功了: 

    运行cAdvisor容器:CAdvrisor是负责收集Host上运行的容器信息的,同样,在所有需要监控的服务器上执行下面的命令运行cAdvisor容器即可:

    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 google/cadvisor

    如果访问IP+8080断后的页面有这样的页面就表示cAdvrisor部署成功了。

    Prometheus Server:是监控的主f服务,所以只需要在其中一台运行此容器,也可以多台机器部署。本案例中就以一台为例子:

    1. [root@xjl ~]# docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus
    2. #先基于prom/prometheus镜像随便运行一个容器,我们需要将其主配置文件复制一份进行更改
    3. [root@xjl ~]# docker cp prometheus:/etc/prometheus/prometheus.yml /root/
    4. #复制prometheus容器中的主配置文件到宿主机本地
    5. [root@xjl ~]# docker rm -f prometheus
    6. [root@xjl ~]# vim prometheus.yml
    7. #找到如下行并修改
    8. - targets: ['localhost:9090','localhost:8080','localhost:9100']
    9. #修改为需要监控的数据端口。
    10. [root@xjl ~]# docker run -d -p 9090:9090 -v /root/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus --net=host prom/prometheus
    11. #执行上述命令,运行新的prometheus容器,并将刚刚修改的主配置文件挂载到容器中的指定位置
    12. #以后若要修改主配置文件,则直接修改本地的即可。
    13. #挂载主配置文件后,本地的和容器内的相当于同一份,在本地修改内容的话,会同步到容器中

    Grafana容器监控数据可视化:可以将Prometheus Server的监控数据展示在相关的看板上。

    1. [root@docker01 ~]# mkdir grafana-storage
    2. [root@docker01 ~]# chmod 777 -R grafana-storage/
    3. [root@docker01 ~]# docker run -d -p 3000:3000 --name grafana -v /root/grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=admin" grafana/grafana
    4. #上述命令中的“-e”选项是为了设置默认的登录用户admin,密码为“123.com”。
    5. #如果启动容器的过程中,提示iptables等相关的错误信息,
    6. #则需要执行命令systemctl restart docker,重启docker服务,然后重新运行容器
    7. #但是需要注意,若运行容器时没有增加“--restart=always”选项的话,
    8. #那么在重启docker服务后,还需将所有容器手动重启。
    9. #重启所有容器命令“docker ps -a -q | xargs docker start”

    上述配置完成后,我们就需要配置它以什么样的形式来给我们展示了,可以自定义,但是很麻烦,也选择直接去grafana官网寻找现成的模板。

    2.2 启动Alertmanager组件

    Prometheus的告警方式有好几种方式,邮箱、钉钉、微信等,我这里选择邮箱的告警方式。本案例选择以邮件的方式和web-hook的方式来完成的相关的告警,其他的方式类似.大家可以自行探索。

    1. [root@xjl ~]# docker run --name alertmanager -d -p 9093:9093 prom/alertmanager # 先简单运行一个容器
    2. [root@xjl ~]# doc
    3. ker cp alertmanager:/etc/alertmanager/alertmanager.yml /root # 将容器中的配置文件复制到本地
    4. [root@docker01 ~]# docker rm -f alertmanager # 然后卸磨杀驴,把他给删
    5. [root@docker01 ~]# vim alertmanager.yml
    6. #配置文件中可以分为以下几组:
    7. #global:全局配置。设置报警策略,报警渠道等;
    8. #route:分发策略;
    9. #receivers:接收者,指定谁来接收你发送的这些信息;
    10. #inhibit_rules:抑制策略。当存在于另一组匹配的警报,抑制规则将禁用于一组匹配的警报
    11. global:
    12. # 在没有报警的情况下声明为已解决的时间
    13. resolve_timeout: 2m
    14. # 配置邮件发送信息
    15. smtp_smarthost: 'smtp.qiye.aliyun.com:465'
    16. smtp_from: 'your_email'
    17. smtp_auth_username: 'your_email'
    18. smtp_auth_password: 'email_passwd' # 邮箱授权码,不是登录密码
    19. smtp_hello: 'your_email'
    20. smtp_require_tls: false
    21. # 所有报警信息进入后的根路由,用来设置报警的分发策略
    22. route:
    23. # 这里的标签列表是接收到报警信息后的重新分组标签,例如,接收到的报警信息里面有许多具有 cluster=A 和 alertname=LatncyHigh 这样的标签的报警信息将会批量被聚合到一个分组里面
    24. group_by: ['alertname', 'cluster']
    25. # 当一个新的报警分组被创建后,需要等待至少group_wait时间来初始化通知,这种方式可以确保您能有足够的时间为同一分组来获取多个警报,然后一起触发这个报警信息。
    26. group_wait: 30s
    27. # 当第一个报警发送后,等待'group_interval'时间来发送新的一组报警信息。
    28. group_interval: 5m
    29. # 如果一个报警信息已经发送成功了,等待'repeat_interval'时间来重新发送他们
    30. repeat_interval: 5m
    31. # 默认的receiver:如果一个报警没有被一个route匹配,则发送给默认的接收器
    32. receiver: default # 优先使用default发送
    33. # 上面所有的属性都由所有子路由继承,并且可以在每个子路由上进行覆盖。
    34. routes: #子路由,使用email发送
    35. - receiver: email
    36. match_re:
    37. serverity : email # label 匹配email
    38. group_wait: 10s
    39. receivers:
    40. - name: 'default'
    41. webhook_configs:
    42. - url: http://localhost:8060/web-hook/
    43. send_resolved: true # 发送已解决通知
    44. - name: 'email'
    45. email_configs:
    46. - to: 'email@qq.com'
    47. send_resolved: true
    48. [root@docker01 ~]# docker run -d --name alertmanger -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml --restart=always prom/alertmanager
    49. #运行新的alertmanager容器,并挂载更改后的配置文件 如果配置文件有错误,那么这个容器是运行不了的。

    配置prometheus与alertmanager通信

    vim prometheus.yml

    1. # my global config
    2. global:
    3. scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
    4. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
    5. # scrape_timeout is set to the global default (10s).
    6. # Alertmanager configuration
    7. alerting:
    8. alertmanagers:
    9. - static_configs:
    10. - targets: ["192.168.25.142:9093"] # 配置的Alertmanager的服务的ip+端口
    11. # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
    12. rule_files:
    13. - "/usr/local/prometheus/rules/*.yaml" # 配置的相关的rules路径,这个容器的内部地址。启动的时候需要挂载到容器内,采用的正则表达式的方式来实现。

    vim rules.yml

    1. groups: # 报警组
    2. - name: Node
    3. rules:
    4. # Alert for any instance that is unreachable for >5 minutes.
    5. - alert: InstanceDown
    6. expr: up == 0 # 监控状态的值为 0时,说明服务异常,1为正常
    7. for: 5m # 保持时间,上面的状态持续时间内都为 0 ,则触发告警
    8. labels:
    9. severity: error
    10. annotations:
    11. summary: "Instance {{ $labels.instance }} 停止工作"
    12. description: "{{ $labels.instance }} of job {{ $labels.job }} 已经停止1分钟以上."

    2.3 Prometheus+Alertmanager告警测试

    三、Prometheus+Alertmanager+Jenkins自动化实战

    四、基于Prometheus的自定义export监控服务实现

    博文参考

    Overview | Prometheus

    docker容器部署Prometheus服务——云平台监控利器 - 腾讯云开发者社区-腾讯云

  • 相关阅读:
    用户画像系列——布隆过滤器在策略引擎中的应用
    【pangolin】【pangolin实践】【pangolin的学习使用记录】
    云服务器 通过docker安装配置Nacos 图文操作
    注解的知识和应用案例
    Speedoffice(word)如何调整文档中形状的轮廓颜色
    STL常用遍历,查找,算法
    微信小程序业务域名保姆级配置教程
    开源代码安全 | 保护软件开发生命周期,你需要知道这些正确方法
    Maven自动化构建工具详解
    【软件测试】软件测试工程师职位核心任务?测试人测试职业发展?
  • 原文地址:https://blog.csdn.net/weixin_41605937/article/details/128049536