从零搭建Prometheus监控报警系统

分手后的思念是犯贱 2023-03-04 09:30 77阅读 0赞

参考文章:从零搭建Prometheus监控报警系统

一.安装Prometheus Server

具体参考《基于docker搭建Prometheus+Grafana监控报警系统》中Prometheus的安装。

二.安装客户端提供metrics接口

1.通过golang客户端提供metrics

  1. mkdir -p /home/chenqionghe/promethues/client/golang/src
  2. cd !$
  3. export GOPATH=/home/chenqionghe/promethues/client/golang/
  4. #克隆项目
  5. git clone https://github.com/prometheus/client_golang.git
  6. #安装需要翻墙的第三方包
  7. mkdir -p $GOPATH/src/golang.org/x/
  8. cd !$
  9. git clone https://github.com/golang/net.git
  10. git clone https://github.com/golang/sys.git
  11. git clone https://github.com/golang/tools.git
  12. #安装必要软件包
  13. go get -u -v github.com/prometheus/client_golang/prometheus
  14. #编译
  15. cd $GOPATH/src/client_golang/examples/random
  16. go build -o random main.go

运行3个示例metrics接口

  1. ./random -listen-address=:8080 &
  2. ./random -listen-address=:8081 &
  3. ./random -listen-address=:8082 &

2.通过node exporter提供metrics

  1. docker run -d \
  2. --name=node-exporter \
  3. -p 9100:9100 \
  4. prom/node-exporter

然后把这两些接口再次配置到prometheus.yml, 重新载入配置curl -X POST http://localhost:9090/-/reload

  1. global:
  2. scrape_interval: 15s # 默认抓取间隔, 15秒向目标抓取一次数据。
  3. external_labels:
  4. monitor: 'codelab-monitor'
  5. rule_files:
  6. #- 'prometheus.rules'
  7. # 这里表示抓取对象的配置
  8. scrape_configs:
  9. #这个配置是表示在这个配置内的时间序例,每一条都会自动添加上这个{job_name:"prometheus"}的标签 - job_name: 'prometheus'
  10. - job_name: 'prometheus'
  11. scrape_interval: 5s # 重写了全局抓取间隔时间,由15秒重写成5秒
  12. static_configs:
  13. - targets: ['localhost:9090']
  14. - targets: ['http://10.211.55.25:8080', 'http://10.211.55.25:8081','http://10.211.55.25:8082']
  15. labels:
  16. group: 'client-golang'
  17. - targets: ['http://10.211.55.25:9100']
  18. labels:
  19. group: 'client-node-exporter'

可以看到接口都生效了
format_png
prometheus还提供了各种exporter工具,感兴趣小伙伴可以去研究一下

三.安装pushgateway

pushgateway是为了允许临时作业和批处理作业向普罗米修斯公开他们的指标。
由于这类作业的存在时间可能不够长, 无法抓取到, 因此它们可以将指标推送到推网关中。
Prometheus采集数据是用的pull也就是拉模型,这从我们刚才设置的5秒参数就能看出来。但是有些数据并不适合采用这样的方式,对这样的数据可以使用Push Gateway服务。
它就相当于一个缓存,当数据采集完成之后,就上传到这里,由Prometheus稍后再pull过来。
我们来试一下,首先启动Push Gateway

使用Pushgateway原因:

  • Prometheus采用pull模式,可能由于不在一个子网或防火墙导致无法直接拉取各target数据
  • 需要将不同数据汇总后,再由Prometheus统一收集

其缺点:

  • pushgateway宕机影响范围会更大。
  • prometheus拉取状态up只针对pushgateway,无法做到对每个节点有效。
  • pushgateway可以持久化推送给它的所有监控数据

3.1 运行pushgateway

  1. docker run -d \
  2. --name pushgateway
  3. -p 9091:9091 \
  4. prom/pushgateway
  5. # pushgateway默认是不持久化数据的,如果需要,则可以通过启动时加入参数 :
  6. "-persistence.file=push_file"

访问http://10.211.55.25:9091 可以看到pushgateway已经运行起来了
format_png 1

3.2 使用API向Pushgateway推数据

prometheus提供了多种语言的sdk,最简单的方式就是通过shell

  • pushgateway推送数据:
  1. 使用Client SDK

  2. 直接使用API

3.2.1 直接使用API进行数据推送:

  1. echo "some_metric 3.14" | curl --data-binary @- http://localhost:9091/metrics/job/some_job

发送更复杂的数据,可以还上instance,表示来源位置:

  1. cat <<EOF | curl --data-binary @- http://localhost:9091/metrics/job/some_job/instance/some_instance
  2. # TYPE some_metric counter
  3. some_metric{label="val1"} 42
  4. # TYPE another_metric gauge
  5. # HELP another_metric Just an example.
  6. another_metric 2398.283
  7. EOF

format_png 2

删除数据:如果某个监控数据不再需要,则只有手动删除才生效,否则仍然采集的为旧值

  1. // 删除某个组下某个实例的所有数据
  2. curl -X DELETE http://localhost:9091/metrics/job/some_job/instance/some_instance
  3. // 删除某个组下的所有数据
  4. curl -X DELETE http://localhost:9091/metrics/job/some_job
  • 推送一个指标

    echo “cqh_metric 100” | 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里边,重载配置
看到已经可以搜索出刚刚推送的指标了
format_png 3

3.2.3 使用Client SDK向Pushgateway推数据

通过Client SDK推送metric信息到Pushgateway:

1.添加pom依赖:

  1. <dependency>
  2. <groupId>io.prometheus</groupId>
  3. <artifactId>simpleclient_pushgateway</artifactId>
  4. <version>0.6.0</version>
  5. </dependency>

2.添加配置:在Prometheus的配置文件中配置,让其从Pushgateway上进行数据采集,这里0.51.14.23:9091为我Pushgateway的地址端口。配置完后需要重启使其配置生效

  1. scrape_configs:
  2. - job_name: 'pushgateway'
  3. static_configs:
  4. - targets: ['10.51.14.23:9091']
  5. labels:
  6. instance: "pushgateway"

3.代码:

  1. @Test
  2. public void pushToGateWay() throws Exception {
  3. CollectorRegistry registry = new CollectorRegistry();
  4. Gauge duration = Gauge.build().name("my_batch_job_duration_seconds")
  5. .help("Duration of my batch job in second").register(registry);
  6. Gauge.Timer durationTimer = duration.startTimer();
  7. try {
  8. Gauge lastSuccess = Gauge.build().name("my_batch_job_last_success")
  9. .help("Last time my batch job successed, in unixtime")
  10. .register(registry);
  11. lastSuccess.setToCurrentTime();
  12. } finally {
  13. durationTimer.setDuration();
  14. PushGateway pg = new PushGateway("localhost:9091");
  15. pg.pushAdd(registry, "my_batch_job");
  16. }
  17. }

四.安装Grafana展示

具体参考《基于docker搭建Prometheus+Grafana监控报警系统》中Grafana的安装。

五.安装AlterManager

Pormetheus的警告由独立的两部分组成。
Prometheus服务中的警告规则发送警告到Alertmanager。
然后这个Alertmanager管理这些警告。包括silencing, inhibition, aggregation,以及通过一些方法发送通知,例如:email,PagerDuty和HipChat。
建立警告和通知的主要步骤:

  • 创建和配置Alertmanager
  • 启动Prometheus服务时,通过-alertmanager.url标志配置Alermanager地址,以便Prometheus服务能和Alertmanager建立连接。

创建和配置Alertmanager

  1. mkdir -p /home/chenqionghe/promethues/alertmanager
  2. cd !$

创建配置文件alertmanager.yml

  1. global:
  2. resolve_timeout: 5m
  3. route:
  4. group_by: ['cqh']
  5. group_wait: 10s #组报警等待时间
  6. group_interval: 10s #组报警间隔时间
  7. repeat_interval: 1m #重复报警间隔时间
  8. receiver: 'web.hook'
  9. receivers:
  10. - name: 'web.hook'
  11. webhook_configs:
  12. - url: 'http://10.211.55.2:8888/open/test'
  13. inhibit_rules:
  14. - source_match:
  15. severity: 'critical'
  16. target_match:
  17. severity: 'warning'
  18. equal: ['alertname', 'dev', 'instance']

这里配置成了web.hook的方式,当server通知alertmanager会自动调用webhook http://10.211.55.2:8888/open/test

下面运行altermanager

  1. docker rm -f alertmanager
  2. docker run -d -p 9093:9093 \
  3. --name alertmanager \
  4. -v /home/chenqionghe/promethues/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  5. prom/alertmanager

访问http://10.211.55.25:9093
format_png 4

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

  1. groups:
  2. - name: cqh
  3. rules:
  4. - alert: cqh测试
  5. expr: dead_lift > 150
  6. for: 1m
  7. labels:
  8. status: warning
  9. annotations:
  10. summary: "{
  11. {$labels.instance}}:硬拉超标!lightweight baby!!!"
  12. description: "{
  13. {$labels.instance}}:硬拉超标!lightweight baby!!!"

这条规则的意思是,硬拉超过150公斤,持续一分钟,就报警通知
然后再修改prometheus添加altermanager配置

  1. global:
  2. scrape_interval: 15s # 默认抓取间隔, 15秒向目标抓取一次数据。
  3. external_labels:
  4. monitor: 'codelab-monitor'
  5. rule_files:
  6. - /etc/prometheus/rules.yml
  7. # 这里表示抓取对象的配置
  8. scrape_configs:
  9. #这个配置是表示在这个配置内的时间序例,每一条都会自动添加上这个{job_name:"prometheus"}的标签 - job_name: 'prometheus'
  10. - job_name: 'prometheus'
  11. scrape_interval: 5s # 重写了全局抓取间隔时间,由15秒重写成5秒
  12. static_configs:
  13. - targets: ['localhost:9090']
  14. - targets: ['10.211.55.25:8080', '10.211.55.25:8081','10.211.55.25:8082']
  15. labels:
  16. group: 'client-golang'
  17. - targets: ['10.211.55.25:9100']
  18. labels:
  19. group: 'client-node-exporter'
  20. - targets: ['10.211.55.25:9091']
  21. labels:
  22. group: 'pushgateway'
  23. alerting:
  24. alertmanagers:
  25. - static_configs:
  26. - targets: ["10.211.55.25:9093"]

重载prometheus配置,规则就已经生效
接下来我们观察grafana中数据的变化
format_png 5
然后我们点击prometheus的Alert模块,会看到已经由绿->黄-红,触发了报警
format_png 6
format_png 7
format_png 8

然后我们再来看看提供的webhook接口,这里的接口我是用的golang写的,接到数据后将body内容报警到钉钉
format_png 9

钉钉收到报警内容如下
format_png 10

到这里,从零开始搭建Prometheus实现自动监控报警就说介绍完了,一条龙服务,自动抓取接口+自动报警+优雅的图表展示!

发表评论

表情:
评论列表 (有 0 条评论,77人围观)

还没有评论,来说两句吧...

相关阅读