Docker监控之Prometheus

 

1、Prometheus简介

Prometheus(普罗米修斯),是一套开源的系统监控报警框架。它以给定的时间间隔从已配置的目标收集指标,评估规则表达式,显示结果,并在发现某些情况为真时触发警报。
作为新一代的监控框架,Prometheus 具有以下特点:

* 多维数据模型:由度量名称和键值对标识的时间序列数据
* PromSQL:一种灵活的查询语言,可以利用多维数据完成复杂的查询
* 不依赖分布式存储,单个服务器节点可直接工作
* 基于HTTP的pull方式采集时间序列数据
* 推送时间序列数据通过PushGateway组件支持
* 通过服务发现或静态配置发现目标
* 多种图形模式及仪表盘支持(grafana)
* 适用于以机器为中心的监控以及高度动态面向服务架构的监控

 

Prometheus架构图

大致的工作流程是:

* Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,
或者从其他的 Prometheus server 中拉 metrics;
* Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报;
* Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警;
* 在图形界面中,可视化采集数据;

 

 

2、环境准备

2.1环境规划

主机名称 IP地址 安装组件
docker01 10.3.104.52 NodeEXporter、cAdvisor、Prometheus Server、Grafana
docker02 10.3.104.56 NodeEXporter、cAdvisor

注:部署该服务,包括四个组件:Prometheus Server、Node Exporter、cAdvrisor、Grafana其作用如下:

* Prometheus Server: 普罗米修斯的主服务器。(端口:9090)
* NodeEXporter: 负责收集Host硬件信息和操作系统信息。(端口:9100)
* cAdvisor: 负责收集Host上运行的容器信息。(端口:8080)
* Grafana:负责展示普罗米修斯监控界面。(端口:3000)
* Alertmanager:用来接收Prometheus发送的报警信息,并且执行设置好的报警方式,报警内容(同样也是在dockerA主机上部署,端口:9093);

各组件的关系:NodeEXporter、cAdvisor负责收集信息发送给 Prometheus server,在由 Prometheus server交给Grafana进行图形化的显示。如需报警,则由prometheus向Alertmanager组件发送信息!

 

2.2 部署Node-EXporter收集硬件和系统信息

注:实验环境,全部关闭防火墙,禁用selinux,两台dockerhost主机,全部部署Node-EXporter和cAdvisor

1)创建Node-EXpoter容器

复制代码
[root@docker01 ~]# docker run -d \
--name node \
-p 9100:9100 \
-v /proc:/host/proc \
-v /sys:/host/sys \
-v /:/rootfs prom/node-exporter \
--path.procfs /host/proc \
--path.sysfs /host/sys \
--collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

Ps:部署node-EXporter,负责收集硬件和系统信息。
使用prom/node-exporter 镜像创建一个名为node的容器,用于收集硬件和系统信息;
并映射9100端口
复制代码

 

2)验证:打开浏览器验证结果

注:出现这个结果表示Node-Exporter组件安装成功,注意:另外两台dockerhost主机也需安装Node-Exporter组件组件操作完全一样,安装完成后请自行打开浏览器验证。

 

2.3 部署cAdvisor收集节点容器信息

1)部署cAdvisor容器

复制代码
[root@docker01 ~]# 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
复制代码

2) 
验证:打开浏览器验证结果

注:出现这个结果表示cAdvisor组件安装成功,注意:另外两台dockerhost主机也需安装cAdvisor组件操作完全一样,安装完成后请自行打开浏览器验证。

 

2.4 部署Prometheus Server服务

1)在部署prometheus之前,我们需要对它的配置文件进行修改,所以我们先运行一个容器,先将其配置文件拷贝出来。

复制代码
[root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus prom/prometheus
[root@docker01 ~]# docker cp prometheus:/etc/prometheus/prometheus.yml ./
[root@docker01 ~]# vim prometheus.yml
static_configs:
- targets: ['localhost:9090','localhost:8080','localhost:9100','10.3.104.56:8080','10.3.104.56:9100']

Ps:用于指定监控本机的9090、8080、9100这三个端口,docker02主机的8080、9100也是这两个端口。
8080端口运行的是cAdvisor服务
9100端口运行的是node-exporter服务
9090端口运行的就是Prometheus服务
注:这里指定了prometheus的监控项,包括它也会监控自己本地主机的数据
复制代码

 

2)重新运行一个prometheus容器,将刚才修改完成的配置文件挂载到容器中

[root@docker01 ~]# docker rm prometheus -f //将刚才运行的容器删除
prometheus
[root@docker01 ~]# docker run -d \
-p 9090:9090 \
--name prometheus \
-v /data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

 

3)验证:打开浏览器验证结果

 注:上述代表两台主机信息采集正常

 

 

2.5 部署grafana服务图形化展示

1)容器部署grafana服务

[root@docker01 ~]# mkdir -p /data/grafana-storage
[root@docker01 ~]# chmod 777 -R /data/grafana-storage/
[root@docker01 ~]# docker run -d \
-p 3000:3000 \
--name grafana \
-v /data/grafana-storage:/var/lib/grafana \
-e "GF_SECURITY_ADMIN_PASSWORD=123.com" \
grafana/grafana

 

2)浏览器访问

 

 

3)添加prometheus数据源

 

 

4)导入grafana模板,模板ID可以在grafana官网查找,如下

 

 

 

 

5)Grafana数据展示

 注:至此web界面的监控就部署完成了!

 

 

2.6 配置Prometheus监控实现报警

Prometheus的报警方式有好几种,比如:邮箱、微信、钉钉等,本次案例采用邮箱告警的方式。接下来,我们需要启动 AlertManager 来接受 Prometheus 发送过来的报警信息,并执行各种方式的告警。同样以 Docker 方式启动AlertManager,最简单的启动命令如下:

1)运行alertmanager容器只需在docker01上操作即可如下:

[root@docker01 ~]# mkdir -p /data/alertmanager && cd/data/alertmanager
[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 alertmanager:v0.14.0
//随便运行一个容器,其目的就是将容器中服务的配置文件拿到本地   

[root@docker01 ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml . //将altermanager服务的yml配置文件复制到本地

 

2)以qq邮箱为例查看授权码

 

 

 

3)配置alertmanager.yml

复制代码
[root@docker01 ~]# vim alertmanager.yml 
global:
  resolve_timeout: 5m
  smtp_from: '2567195852@qq.com'     //发送者信息
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '2567195852@qq.com   //用户名
  smtp_auth_password: 'tdcwcwvevmqwdjgg'    //使用自己qq邮箱生成的授权码
  smtp_require_tls: false
  smtp_hello: 'qq.com'
route:
  group_by: ['alertname']                     //采用默认组
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 5m
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: '2567195852@qq.com'               //接受者信息
    send_resolved: true                         //当容器恢复正常时,也会发送一份邮件
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
复制代码

 简单介绍一下主要配置的作用:

*  global: 全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。
*  route: 用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配。
*  receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
*  inhibit_rules: 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。

[root@docker01 ~]# docker rm -f alertmanager        //将原本的alertmanager 容器删除
[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 -v /data/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager:v0.14.0
//重新运行alertmanager 容器,并将配置文件挂载到容器中 //建议运行容器之后,使用docker ps | grep alertmanager 确保容器正常运行
//如果配置文件编写错误,那么这个容器是无法启动的

 

 4)配置alertmanager报警规则

复制代码
[root@docker01 ~]# mkdir -p /data/prometheus/rules && cd /data/prometheus/rules
//创建目录用于存放规则的目录
[root@dockerA rules]# vim node-up.rules         //编写规则
groups:
- name: node-up               //自定义名称
  rules:
  - alert: node-up
    expr: up{job="prometheus"} == 0               
// job的名称必须和prometheus配置文件中的 - job_name: 'prometheus'对应
    for: 15s
    labels:
      severity: 1
      team: node
    annotations:
      summary: "{{ $labels.instance }} 已停止运行超过 15s!"
复制代码

 注:该 rules 目的是监测 node 是否存活,expr 为 PromQL 表达式验证特定节点 job=“node-exporter” 是否活着,for 表示报警状态为Pending 后等待 15s 变成 Firing 状态,一旦变成 Firing 状态则将报警发送到 AlertManager,labels 和 annotations 对该 alert 添加更多的标识说明信息,所有添加的标签注解信息,以及 prometheus.yml 中 该 job 已添加 label 都会自动添加到邮件内容中,更多关于 rule 详细配置可以参考它的官方文档:  https://prometheus.io/docs/prometheus/latest/configuration/recording_rules

 

 

5)关联Prometheus

复制代码
[root@docker01 ~]# vim prometheus.yml
# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
       - 10.3.104.52:9093     //此行将原本的内容更改为alertmanager容器的IP+端口

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  -  "/usr/local/prometheus/rules/*.rules"    //手动添加这一行
复制代码

 

6)重建prometheus并挂载文件

[root@docker01 ~]# docker rm -f prometheus      //修改完配置为文件后,需要将容器删除,重新运行一台新的容器
prometheus
[root@docker01 ~]# docker run -d \
-p 9090:9090 \
--name prometheus \
-v /data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /data/prometheus/rules/node-up.rules:/usr/local/prometheus/rules/node-up.rules \
functions/prometheus

 

 

异常待处理:

创建完的容器报错,提示rules文件格式不对

复制代码
[root@docker01 prometheus]# docker logs prometheus
time
="2021-08-26T09:14:29Z" level=info msg="Starting prometheus (version=1.5.2, branch=master, revision=bd1182d29f462c39544f94cc822830e1c64cf55b)" source="main.go:75" time="2021-08-26T09:14:29Z" level=info msg="Build context (go=go1.7.5, user=root@1a01c5f68840, date=20170210-16:23:28)" source="main.go:76" time="2021-08-26T09:14:29Z" level=info msg="Loading configuration file /etc/prometheus/prometheus.yml" source="main.go:248" time="2021-08-26T09:14:29Z" level=error msg="Failed to apply configuration: error loading rules, previous rule set restored: error parsing /usr/local/prometheus/rules/node-up.rules: parse error at line 2, char 2: unexpected <op:-> in record statement, expected \"=\"" source="main.go:275" time="2021-08-26T09:14:29Z" level=error msg="Error loading config: one or more errors occurred while applying the new configuration (-config.file=/etc/prometheus/prometheus.yml)" source="main.go:150" //检查宿主机上rules格式,提示就是格式错误 [root@docker01 rules]# promtool check config node-up.rules Checking node-up.rules FAILED: parsing YAML file node-up.rules: yaml: unmarshal errors: line 1: field groups not found in type config.plain
复制代码

 

 上述rules格式问题,到官网上复制一个样例,check格式还是报错,不知道啥原因,未完待续。。。

 

复制代码
[root@docker01 ~]# cat test.yml 
groups:
- name: example
  rules:
  - alert: HighRequestLatency
    expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
    for: 10m
    labels:
      severity: page
    annotations:
      summary: High request latency
[root@docker01 ~]# promtool check config test.yml 
Checking test.yml
  FAILED: parsing YAML file test.yml: yaml: unmarshal errors:
  line 1: field groups not found in type config.plain
复制代码

 

posted @   杰宏唯一  阅读(961)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示