阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

从零开始搭建Prometheus自动监控报警系统

199次阅读
没有评论

共计 7487 个字符,预计需要花费 19 分钟才能阅读完成。

从零搭建 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 自动监控报警系统
 从零开始搭建 Prometheus 自动监控报警系统

基本原理

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.yml
chmod 777 /home/chenqionghe/promethues/server/rules.yml

下面开始三大套件的学习

一. 安装 Prometheus Server

通过 docker 方式
首先创建一个配置文件 /home/chenqionghe/test/prometheus/prometheus.yml
挂载之前需要改变文件权限为 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.yml:/etc/prometheus/prometheus.yml \
-v /home/chenqionghe/promethues/server/rules.yml:/etc/prometheus/rules.yml \
prom/prometheus:v2.7.2 \
--config.file=/etc/prometheus/prometheus.yml \
--web.enable-lifecycle

启动时加上 –web.enable-lifecycle 启用远程热加载配置文件
调用指令是 curl -X POST http://localhost:9090/-/reload

访问 http://10.211.55.25:9090
我们会看到如下 l 界面
从零开始搭建 Prometheus 自动监控报警系统

访问 http://10.211.55.25:9090/metrics
从零开始搭建 Prometheus 自动监控报警系统

我们配置了 9090 端口,默认 prometheus 会抓取自己的 /metrics 接口
在 Graph 选项已经可以看到监控的数据
从零开始搭建 Prometheus 自动监控报警系统

二. 安装客户端提供 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.yml, 重新载入配置 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 自动监控报警系统
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 运行起来了
从零开始搭建 Prometheus 自动监控报警系统

接下来我们就可以往 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.yml 里边, 重载配置
看到已经可以搜索出刚刚推送的指标了
从零开始搭建 Prometheus 自动监控报警系统

四. 安装 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 的地址填上
从零开始搭建 Prometheus 自动监控报警系统
导入 prometheus 的模板
 从零开始搭建 Prometheus 自动监控报警系统
打开左上角选择已经导入的模板会看到已经有各种图
从零开始搭建 Prometheus 自动监控报警系统

我们来添加一个自己的图表
从零开始搭建 Prometheus 自动监控报警系统
 从零开始搭建 Prometheus 自动监控报警系统
从零开始搭建 Prometheus 自动监控报警系统
指定自己想看的图标和关键字,右上角保存
 从零开始搭建 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.yml

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.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager

访问 http://10.211.55.25:9093
从零开始搭建 Prometheus 自动监控报警系统

接下来修改 Server 端配置报警规则和 altermanager 地址
修改规则 /home/chenqionghe/promethues/server/rules.yml

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.yml
# 这里表示抓取对象的配置
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 自动监控报警系统
然后我们点击 prometheus 的 Alert 模块,会看到已经由绿 -> 黄 - 红,触发了报警
 从零开始搭建 Prometheus 自动监控报警系统
从零开始搭建 Prometheus 自动监控报警系统
 从零开始搭建 Prometheus 自动监控报警系统

然后我们再来看看提供的 webhook 接口,这里的接口我是用的 golang 写的,接到数据后将 body 内容报警到钉钉
从零开始搭建 Prometheus 自动监控报警系统

钉钉收到报警内容如下
从零开始搭建 Prometheus 自动监控报警系统

到这里,从零开始搭建 Prometheus 实现自动监控报警就说介绍完了,一条龙服务,自动抓取接口 + 自动报警 + 优雅的图表展示,你还在等什么,赶紧 high 起来!

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计7487字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中