从零搭建 Prometheus 监控报警系统
什么是 Prometheus?
Prometheus 是由 SoundCloud 开发的开源监控报警系统和时序列数据库(TSDB).Prometheus 使用 Go 语言开发, 是 Google BorgMon 监控系统的开源版本.
2016 年由 Google 发起 Linux 基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将 Prometheus 纳入其下第二大开源项目.
Prometheus 目前在开源社区相当活跃.
Prometheus 和 Heapster(Heapster 是 K8S 的一个子项目, 用于获取集群的性能数据.)相比功能更完善, 更全面. Prometheus 性能也足够支撑上万台规模的集群.
Prometheus 的特点
多维度数据模型.
灵活的查询语言.
不依赖分布式存储, 单个服务器节点是自主的.
通过基于 HTTP 的 pull 方式采集时序数据.
可以通过中间网关进行时序列数据推送.
通过服务发现或者静态配置来发现目标服务对象.
支持多种多样的图表和界面展示, 比如 Grafana 等.
官网地址: https://prometheus.io/
架构图
基本原理
Prometheus 的基本原理是通过 HTTP 协议周期性抓取被监控组件的状态, 任意组件只要提供对应的 HTTP 接口就可以接入监控. 不需要任何 SDK 或者其他的集成过程. 这样做非常适合做虚拟化环境监控系统, 比如 VM,Docker,Kubernetes 等. 输出被监控组件信息的 HTTP 接口被叫做 exporter . 目前互联网公司常用的组件大部分都有 exporter 可以直接使用, 比如 Varnish,Haproxy,Nginx,MySQL,Linux 系统信息(包括磁盘, 内存, CPU, 网络等等).
服务过程
Prometheus Daemon 负责定时去目标上抓取 metrics(指标)数据, 每个抓取目标需要暴露一个 http 服务的接口给它定时抓取. Prometheus 支持通过配置文件, 文本文件, Zookeeper,Consul,DNS SRV Lookup 等方式指定抓取目标. Prometheus 采用 PULL 的方式进行监控, 即服务器可以直接通过目标 PULL 数据或者间接地通过中间网关来 Push 数据.
Prometheus 在本地存储抓取的所有数据, 并通过一定规则进行清理和整理数据, 并把得到的结果存储到新的时间序列中.
Prometheus 通过 PromQL 和其他 API 可视化地展示收集的数据. Prometheus 支持很多方式的图表可视化, 例如 Grafana, 自带的 Promdash 以及自身提供的模版引擎等等. Prometheus 还提供 HTTP API 的查询方式, 自定义所需要的输出.
PushGateway 支持 Client 主动推送 metrics 到 PushGateway, 而 Prometheus 只是定时去 Gateway 上抓取数据.
Alertmanager 是独立于 Prometheus 的一个组件, 可以支持 Prometheus 的查询语句, 提供十分灵活的报警方式.
三大套件
Server 主要负责数据采集和存储, 提供 PromQL 查询语言的支持.
Alertmanager 警告管理器, 用来进行报警.
Push Gateway 支持临时性 Job 主动推送指标的中间网关.
本飞猪教程内容简介
1. 演示安装 Prometheus Server
2. 演示通过 golang 和 node-exporter 提供 metrics 接口
3. 演示 pushgateway 的使用
4. 演示 grafana 的使用
5. 演示 alertmanager 的使用
安装准备
这里我的 IP 是 10.211.55.25, 登入, 建立相应文件夹
- mkdir -p /home/chenqionghe/promethues
- mkdir -p /home/chenqionghe/promethues/server
- mkdir -p /home/chenqionghe/promethues/client
- touch /home/chenqionghe/promethues/server/rules.YAML
- chmod 777 /home/chenqionghe/promethues/server/rules.YAML
下面开始三大套件的学习
一. 安装 Prometheus Server
通过 docker 方式
首先创建一个配置文件 / home/chenqionghe/test/prometheus/prometheus.YAML
挂载之前需要改变文件权限为 777, 要不会引起修改宿主机上的文件 会引起内容不同步的问题
- global:
- scrape_interval: 15s # 默认抓取间隔, 15 秒向目标抓取一次数据.
- external_labels:
- monitor: 'codelab-monitor'
- # 这里表示抓取对象的配置
- scrape_configs:
- #这个配置是表示在这个配置内的时间序例, 每一条都会自动添加上这个 {job_name:"prometheus"} 的标签 - job_name: 'prometheus'
- scrape_interval: 5s # 重写了全局抓取间隔时间, 由 15 秒重写成 5 秒
- static_configs:
- - targets: ['localhost:9090']
运行
- docker rm -f prometheus
- docker run --name=prometheus -d \
- -p 9090:9090 \
- -v /home/chenqionghe/promethues/server/prometheus.YAML:/etc/prometheus/prometheus.YAML \
- -v /home/chenqionghe/promethues/server/rules.YAML:/etc/prometheus/rules.YAML \
- prom/prometheus:v2.7.2 \
- --config.file=/etc/prometheus/prometheus.YAML \
- --web.enable-lifecycle
启动时加上 --Web.enable-lifecycle 启用远程热加载配置文件
调用指令是 curl -X POST http://localhost:9090/-/reload
访问 http://10.211.55.25:9090
我们会看到如下 l 界面
访问 http://10.211.55.25:9090/metrics
我们配置了 9090 端口, 默认 prometheus 会抓取自己的 / metrics 接口
在 Graph 选项已经可以看到监控的数据
二. 安装客户端提供 metrics 接口
1. 通过 golang 客户端提供 metrics
- mkdir -p /home/chenqionghe/promethues/client/golang/src
- cd !$
- export GOPATH=/home/chenqionghe/promethues/client/golang/
- # 克隆项目
- Git clone https://github.com/prometheus/client_golang.git
- # 安装需要 FQ 的第三方包
- mkdir -p $GOPATH/src/golang.org/x/
- cd !$
- Git clone https://github.com/golang/net.git
- Git clone https://github.com/golang/sys.git
- Git clone https://github.com/golang/tools.git
- # 安装必要软件包
- go get -u -v GitHub.com/prometheus/client_golang/prometheus
- # 编译
- cd $GOPATH/src/client_golang/examples/random
- go build -o random main.go
运行 3 个示例 metrics 接口
- ./random -listen-address=:8080 &
- ./random -listen-address=:8081 &
- ./random -listen-address=:8082 &
2. 通过 node exporter 提供 metrics
- docker run -d \
- --name=node-exporter \
- -p 9100:9100 \
- prom/node-exporter
然后把这两些接口再次配置到 prometheus.YAML, 重新载入配置 curl -X POST http://localhost:9090/-/reload
- global:
- scrape_interval: 15s # 默认抓取间隔, 15 秒向目标抓取一次数据.
- external_labels:
- monitor: 'codelab-monitor'
- rule_files:
- #- 'prometheus.rules'
- # 这里表示抓取对象的配置
- scrape_configs:
- #这个配置是表示在这个配置内的时间序例, 每一条都会自动添加上这个 {job_name:"prometheus"} 的标签 - job_name: 'prometheus'
- - job_name: 'prometheus'
- scrape_interval: 5s # 重写了全局抓取间隔时间, 由 15 秒重写成 5 秒
- static_configs:
- - targets: ['localhost:9090']
- - targets: ['http://10.211.55.25:8080', 'http://10.211.55.25:8081','http://10.211.55.25:8082']
- labels:
- group: 'client-golang'
- - targets: ['http://10.211.55.25:9100']
- labels:
- group: 'client-node-exporter'
可以看到接口都生效了
prometheus 还提供了各种 exporter 工具, 感兴趣小伙伴可以去研究一下
三. 安装 pushgateway
pushgateway 是为了允许临时作业和批处理作业向普罗米修斯公开他们的指标.
由于这类作业的存在时间可能不够长, 无法抓取到, 因此它们可以将指标推送到推网关中.
Prometheus 采集数据是用的 pull 也就是拉模型, 这从我们刚才设置的 5 秒参数就能看出来. 但是有些数据并不适合采用这样的方式, 对这样的数据可以使用 Push Gateway 服务.
它就相当于一个缓存, 当数据采集完成之后, 就上传到这里, 由 Prometheus 稍后再 pull 过来.
我们来试一下, 首先启动 Push Gateway
- mkdir -p /home/chenqionghe/promethues/pushgateway
- cd !$
- docker run -d -p 9091:9091 --name pushgateway prom/pushgateway
访问 http://10.211.55.25:9091 已经 pushgateway 运行起来了
接下来我们就可以往 pushgateway 推送数据了, prometheus 提供了多种语言的 sdk, 最简单的方式就是通过 shell
推送一个指标
echo "cqh_metric 3.14" | curl --data-binary @- http://Ubuntu-Linux:9091/metrics/job/cqh
推送多个指标
- cat <<EOF | curl --data-binary @- http://10.211.55.25:9091/metrics/job/cqh/instance/test
- # 锻炼场所价格
- muscle_metric{
- label="gym"
- } 8800
- # 三大项数据 kg
- bench_press 100
- dead_lift 160
- deep_squal 160
- EOF
然后我们再将 pushgateway 配置到 prometheus.YAML 里边, 重载配置
看到已经可以搜索出刚刚推送的指标了
四. 安装 Grafana 展示
Grafana 是用于可视化大型测量数据的开源程序, 它提供了强大和优雅的方式去创建, 共享, 浏览数据.
Dashboard 中显示了你不同 metric 数据源中的数据.
Grafana 最常用于因特网基础设施和应用分析, 但在其他领域也有用到, 比如: 工业传感器, 家庭自动化, 过程控制等等.
Grafana 支持热插拔控制面板和可扩展的数据源, 目前已经支持 Graphite,InfluxDB,OpenTSDB,Elasticsearch,Prometheus 等.
我们使用 docker 安装
docker run -d -p 3000:3000 --name grafana grafana/grafana
默认登录账户和密码都是 admin, 进入后界面如下
我们添加一个数据源
把 Prometheus 的地址填上
导入 prometheus 的模板
打开左上角选择已经导入的模板会看到已经有各种图
我们来添加一个自己的图表
指定自己想看的图标和关键字, 右上角保存
看到如下数据
到这里我们就已经实现了数据的自动收集和展示, 下面来说下 prometheus 如何自动报警
五. 安装 AlterManager
Pormetheus 的警告由独立的两部分组成.
Prometheus 服务中的警告规则发送警告到 Alertmanager.
然后这个 Alertmanager 管理这些警告. 包括 silencing, inhibition, aggregation, 以及通过一些方法发送通知, 例如: email,PagerDuty 和 HipChat.
建立警告和通知的主要步骤:
创建和配置 Alertmanager
启动 Prometheus 服务时, 通过 - alertmanager.url 标志配置 Alermanager 地址, 以便 Prometheus 服务能和 Alertmanager 建立连接.
创建和配置 Alertmanager
- mkdir -p /home/chenqionghe/promethues/alertmanager
- cd !$
创建配置文件 alertmanager.YAML
- global:
- resolve_timeout: 5m
- route:
- group_by: ['cqh']
- group_wait: 10s #组报警等待时间
- group_interval: 10s #组报警间隔时间
- repeat_interval: 1m #重复报警间隔时间
- receiver: 'web.hook'
- receivers:
- - name: 'web.hook'
- webhook_configs:
- - url: 'http://10.211.55.2:8888/open/test'
- inhibit_rules:
- - source_match:
- severity: 'critical'
- target_match:
- severity: 'warning'
- equal: ['alertname', 'dev', 'instance']
这里配置成了 Web.hook 的方式, 当 server 通知 alertmanager 会自动调用 webhook http://10.211.55.2:8888/open/test
下面运行 altermanager
- docker rm -f alertmanager
- docker run -d -p 9093:9093 \
- --name alertmanager \
- -v /home/chenqionghe/promethues/alertmanager/alertmanager.YAML:/etc/alertmanager/alertmanager.YAML \
- prom/alertmanager
访问 http://10.211.55.25:9093
接下来修改 Server 端配置报警规则和 altermanager 地址
修改规则 / home/chenqionghe/promethues/server/rules.YAML
- groups:
- - name: cqh
- rules:
- alert: cqh 测试
- expr: dead_lift> 150
- for: 1m
- labels:
- status: warning
- annotations:
- summary: "{{$labels.instance}}: 硬拉超标! lightweight baby!!!"
- description: "{{$labels.instance}}: 硬拉超标! lightweight baby!!!"
这条规则的意思是, 硬拉超过 150 公斤, 持续一分钟, 就报警通知
然后再修改 prometheus 添加 altermanager 配置
- global:
- scrape_interval: 15s # 默认抓取间隔, 15 秒向目标抓取一次数据.
- external_labels:
- monitor: 'codelab-monitor'
- rule_files:
- - /etc/prometheus/rules.YAML
- # 这里表示抓取对象的配置
- scrape_configs:
- #这个配置是表示在这个配置内的时间序例, 每一条都会自动添加上这个 {job_name:"prometheus"} 的标签 - job_name: 'prometheus'
- - job_name: 'prometheus'
- scrape_interval: 5s # 重写了全局抓取间隔时间, 由 15 秒重写成 5 秒
- static_configs:
- - targets: ['localhost:9090']
- - targets: ['10.211.55.25:8080', '10.211.55.25:8081','10.211.55.25:8082']
- labels:
- group: 'client-golang'
- - targets: ['10.211.55.25:9100']
- labels:
- group: 'client-node-exporter'
- - targets: ['10.211.55.25:9091']
- labels:
- group: 'pushgateway'
- alerting:
- alertmanagers:
- - static_configs:
- - targets: ["10.211.55.25:9093"]
重载 prometheus 配置, 规则就已经生效
接下来我们观察 grafana 中数据的变化
然后我们点击 prometheus 的 Alert 模块, 会看到已经由绿 ->黄 - 红, 触发了报警
然后我们再来看看提供的 webhook 接口, 这里的接口我是用的 golang 写的, 接到数据后将 body 内容报警到钉钉
钉钉收到报警内容如下
到这里, 从零开始搭建 Prometheus 实现自动监控报警就说介绍完了, 一条龙服务, 自动抓取接口 + 自动报警 + 优雅的图表展示, 你还在等什么, 赶紧 high 起来!
来源: https://www.cnblogs.com/chenqionghe/p/10494868.html