在生产环境中,除了会用到日志系统查看日志排查问题外,还需要针对整个系统的运行进行监控,比如监控到数据库出现异常,那么触发报警通知运维去紧急处理。目前比较流行使用Prometheus+Alertmanager+Grafana+Exporter搭建监控报警系统,以下是从官网截取的生态图:
介绍:
Prometheus:中文译普罗米修斯,是一套开源的监控&报警&时间序列数据库的组合,包含Alertmanager报警组件和各类Exporter;
Grafana:根据定义的模板图形化展示metrics指标数据;
这里贴上本人做的一个流程图加以说明其具体步骤:
可阅官网了解更多细节:
Prometheus/Alertmanager/Exporter官网地址:`https://prometheus.io/`
Granfana官网地址:`https://grafana.com/`
(一)部署安装
系统环境说明:
Linux版本:Ubuntu18.04
docker-compose编排部署,自行了解Docker知识
因资源有限,只在一台服务器操作演示,实际生产环境应该实现被监控目标与监控系统分离
1)添加docker-compose.yml文件
version: '3.4'services: #PGE监控报警系统 prometheus: image: prom/prometheus:master #prometheus镜像,用于拉取指标数据 container_name: prometheus #容器名 restart: on-failure ports: - "9090:9090" #映射端口为9090 command: - "--config.file=/etc/prometheus/prometheus.yml" #以配置文件的方式启动 - "--web.enable-lifecycle" #允许热更新配置和规则文件 通过post/put请求 /-/reload 端点 - "--storage.tsdb.retention.time=7d" #数据保存时长,默认15天 volumes: #数据挂载 - /media/pge/prometheus/data:/prometheus/data #配置挂载 - /media/pge/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml - /media/pge/prometheus/conf/rules.yml:/etc/prometheus/rules.yml networks: #网络命名空间 用于隔离服务 - pge alertmanager: image: prom/alertmanager:master #alertmanager镜像,报警组件 container_name: alertmanager #容器名 restart: on-failure ports: - "9093:9093" #映射端口为9093 command: - "--config.file=/etc/alertmanager/alertmanager.yml" volumes: #数据挂载 - /media/pge/prometheus/alertmanager/data:/alertmanager/data #配置挂载 - /media/pge/prometheus/alertmanager/conf/alertmanager.yml:/etc/alertmanager/alertmanager.yml networks: #网络命名空间 用于隔离服务 - pge grafana: image: grafana/grafana:master #grafana镜像,用于图形化展示指标数据 container_name: grafana #容器名 restart: on-failure environment: #设置用户密码 默认是admin/admin - "GF_SECURITY_ADMIN_USER=admin" - "GF_SECURITY_ADMIN_PASSWORD=123456" #引入插件 不建议设置(可登录控制台配置),因为启动时需要下载,比较缓慢,造成服务启动十分钟左右后才能访问grafana控制台 #- "GF_INSTALL_PLUGINS=alexanderzobnin-zabbix-app" ports: - "3000:3000" #映射端口为3000 volumes: #挂载数据(模板信息等) - /media/blog/pge/grafana/data:/var/lib/grafana networks: #网络命名空间 用于隔离服务 - pge #############exporter相关镜像,用于收集指标数据############# node-exporter: image: prom/node-exporter:master #node-exporter用于收集本机cpu、内存等指标数据并暴露http接口给Prometheus拉取数据(Prometheus官方的exporter) container_name: node-exporter #容器名 restart: on-failure ports: - "9100:9100" #映射端口为9100 networks: #网络命名空间 用于隔离服务 - pge mysqld-exporter: image: prom/mysqld-exporter:master #mysqld-exporter用于收集mysql数据库的指标数据并暴露http接口给Prometheus拉取数据(Prometheus官方的exporter) container_name: mysqld-exporter #容器名 restart: on-failure environment: #mysql数据库连接地址 - DATA_SOURCE_NAME=root:123456@(106.52.202.31:3306)/ ports: - "9104:9104" #映射端口为9104 networks: #网络命名空间 用于隔离服务 - pge redis-exporter: image: oliver006/redis_exporter:v1.13.1 #redis-exporter用于收集redis数据库的指标数据并暴露http接口给Prometheus拉取数据(第三方的exporter) container_name: redis-exporter #容器名 restart: on-failure environment: #redis地址以及用户密码 - REDIS_ADDR=redis://106.52.202.31:6379 - REDIS_PASSWORD=123456 ports: - "9121:9121" #映射端口为9121 networks: #网络命名空间 用于隔离服务 - pge networks: pge: external: true
说明:
需要做好数据卷挂载,参照文件中的路径挂载
`/media/pge/prometheus/data`、`/media/blog/pge/grafana/data `和`/media/pge/prometheus/alertmanager/data`这三个文件夹涉及写操作,所以需要授权,执行如下命令:
chmod 777 /media/pge/prometheus/data
可以创建 pge 网络以隔离服务,执行创建命令:
docker network create pge
2)添加Prometheus相关配置文件
Prometheus配置文件prometheus.yml:
############## Promethus Config ####################全局配置global: scrape_interval: 15s #默认抓取目标的采集数据周期为15秒 #和外部系统(例如AlertManager)通信时为时间序列或者警情(Alert)强制添加的标签列表,比如以下的minitor定义值会在收到的报警邮件信息中出现 external_labels: monitor: 'gpe-monitor'#引入触发报警条件的文件(注意路径应为容器内的路径)rule_files: - "./rules.yml"#Promethus 抓取目标的配置列表#exporter可理解为各种数据指标收集器(比如mysql-exporter、redis-exporter等),然后Promethus会定时主动请求对应的exporter拉取数据,然后在Grafana作数据展示分析scrape_configs: #node-exporter用于收集本机cpu等系统资源的指标数据 - job_name: 'node-exporter' #抓取目标名 #这里配置的采集数据周期会覆盖全局配置,优先级最高 scrape_interval: 5s #抓取目标的访问url static_configs: - targets: ['106.52.202.31:9100'] #mysqld-exporter用于收集mysql数据库的指标数据 - job_name: 'mysqld-exporter' #抓取目标名 #这里配置的采集数据周期会覆盖全局配置,优先级最高 scrape_interval: 5s #抓取目标的访问url static_configs: - targets: ['106.52.202.31:9104'] #redis-exporter用于收集redis数据库的指标数据 - job_name: 'redis-exporter' #抓取目标名 #这里配置的采集数据周期会覆盖全局配置,优先级最高 scrape_interval: 5s #抓取目标的访问url static_configs: - targets: ['106.52.202.30:9121']#alertmanager报警设置alerting: alertmanagers: - static_configs: - targets: ["106.52.202.31:9093"]
Prometheus报警规则配置文件rules.yml:
#############alert rule config##############groups:- name: redis-downline-rule rules: - alert: "离线报警" #alertname 可在分发策略定义alertname进行分组 expr: sum(up{job="redis-exporter"}) == 0 #触发条件:统计在线节点数量,当在线数量等于0时触发 for: 1m #持续多长时间才触发报警 labels: #附加标签 severity: warning annotations: #附加信息 summary: "redis-{{ $labels.instance }} has been down" #获取labels标签的instance值 description: "redis服务离线报警" value: "{{ $labels.job }}在线服务数量:{{ $value }}" #value为expr表达式值- name: memory-rule rules: - alert: "内存开销过高报警" expr: (sum(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / sum(node_memory_MemTotal_bytes))*100 > 70 #node_memory_MemAvailable_bytes可通过Grafana面板查看metrics名称 for: 1m labels: severity: warning annotations: summary: "memory:{{ $labels.alertname }}" description: "内存超额使用报警" value: "已用内存/总内存: {{ $value }}%"
说明:
当在 `docker-compose.yml` 配置了Prometheus的 `--web.enable-lifecycle` 环境参数,可通过 put/post 请求 `/-/reload` 接口实现服务热更新配置文件
3)添加alertmanager配置文件:
配置文件alertmanager.yml:
############alertmanager config#############全局配置global: #配置邮箱信息 smtp_smarthost: 'smtp.163.com:465' #163邮箱的SMTP服务器地址+端口 使用25端口会报错email-receiver/email[0]: notify retry canceled after 2 attempts: establish connection to server: dial tcp 220.181.12.18:25: i/o timeout smtp_from: 'xxx@163.com' #写信人邮箱 smtp_auth_username: 'xxx@163.com' #邮箱授权用户 smtp_auth_password: 'xxxxxx' #邮箱授权码,需要登录邮箱开启POP3/SMTP/IMAP服务获取 smtp_require_tls: false #不使用tls协议#定义报警的分发策略route: #分组规则 根据rules.yml的触发规则的alertname进行分组,同一组的会聚合再发送 group_by: ['alertname'] group_wait: 30s #组报警等待时间 默认30秒 group_interval: 5s #组报警间隔时间 默认5分钟 repeat_interval: 1h #重复报警间隔时间 默认3小时 receiver: email-receiver ## 默认发送的接收器#定义报警接受者信息receivers:- name: 'email-receiver' #接收器名称 email_configs: #邮箱配置,还可以选择配置钉钉、微信等,自行看官方文档了解 - to: 'xxx@163.com' #收信人邮箱
说明:
可直接通过 put/post 请求 `/-/reload` 接口实现服务热更新配置文件
按步骤开启163邮箱SMTP服务:
(三)启动服务并访问测试
切换到 `docker-compose.yml` 文件的路径下,执行启动命令:
docker-compose up -d
可通过以下命令查看服务状态:
docker-compose ps
以及查看输出日志:
docker-compose logs
成功启动后,访问Prometheus控制台(ip+映射的端口,默认是9090),可看到监控的节点信息、报警规则以及报警触发详情等等:
为了测试报警,可以停止 redis-exporter 服务,执行命令:
docker-compose stop redis-exporter
根据设定的值,在停掉服务的一分钟内,redis-exporter对应的redis-downline-rule会变成Pending状态
说明:
Alerts可看到三种状态,分别为 Inactive(服务正常,非触发状态)、Pengding(服务出现异常,但在触发规则的for值时间内,待定状态)以及 Firing(服务异常,触发状态,发送报警)
当服务恢复正常,又会回到 Inactive 状态
当报警条件触发后,会上报信息给Alertmanager处理并发送到指定邮箱:
访问Grafana控制台(ip+映射的端口,默认是3000,账号密码可在 `docker-compose.yml` 配置,默认为admin/admin):
下面示例如何添加一个Prometheus面板展示数据:
添加Prometheus数据源:
输入Prometheus的访问地址并保存:
导入Prometheus仪表盘:
说明:
导入仪表盘的方式有三种,一个是到Grafana的官网找到合适的仪表盘下载对应的json文件导进去;第二种是贴对应的链接加载,如`https://grafana.com/grafana/dashboards/11173`;第三种是直接贴json格式的数据结构体。
最后就能展示出 node-exporter 监控的系统指标数据:
其他如MySQL和Redis的仪表盘,可自行了解!