暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

docker-compose编排Prometheus+Alertmanager+Grafana+Exporter实现监控报警系统

HorizonLight 2020-11-06
1155

在生产环境中,除了会用到日志系统查看日志排查问题外,还需要针对整个系统的运行进行监控,比如监控到数据库出现异常,那么触发报警通知运维去紧急处理。目前比较流行使用Prometheus+Alertmanager+Grafana+Exporter搭建监控报警系统,以下是从官网截取的生态图:

介绍:

  1. Prometheus:中文译普罗米修斯,是一套开源的监控&报警&时间序列数据库的组合,包含Alertmanager报警组件和各类Exporter

  2. 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的仪表盘,可自行了解!

文章转载自HorizonLight,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论