当前位置: 代码迷 >> 综合 >> Prometheus+Grafana搭建监控告警系统
  详细解决方案

Prometheus+Grafana搭建监控告警系统

热度:35   发布时间:2023-11-18 05:51:16.0

目录

一、前言

1.是什么

2.文档&资源

3.优点

4.架构图及各组件作用

二、服务搭建

1.Prometheus

2.Grafana

三、可监控的服务

1.介绍

2.SpringBoot项目

四、查询与展示

1.Prometheus-UI

2.Grafana

五、告警配置

六、集群化部署

七、问题总结

1.需要监控项目都在prometheus.yml中,每次新增、修改需要监控的项目我都需要修改该文件吗?

2.你在使用过程中遇到过哪些问题,或者有哪些是需要注意的呢?


一、前言

1.是什么

Prometheus受启发于Google的Brogmon监控系统,从2012年开始由前Google工程师在Soundcloud以开源软件的形式进行研发,并且于2015年早期对外发布早期版本。2016年5月继Kubernetes之后成为第二个正式加入CNCF基金会的项目,同年6月正式发布1.0版本。2017年底发布了基于全新存储层的2.0版本,能更好地与容器平台、云平台配合。是监控告警系统。

2.文档&资源

官网:

Prometheus - Monitoring system & time series database

英文文档:

Query functions | Prometheus

中文文档:

查询 - 函数 - 《Prometheus 非官方中文手册》 - 书栈网 · BookStack

第2章 探索PromQL - prometheus-book

3.优点

  • 易于管理:Prometheus核心部分只有一个单独的二进制文件,不存在任何的第三方依赖(数据库,缓存等等)。唯一需要的就是本地磁盘,因此不会有潜在级联故障的风险。
  • 强大的数据模型:所有采集的监控数据均以指标(metric)的形式保存在内置的时间序列数据库当中(TSDB)。所有的样本除了基本的指标名称以外,还包含一组用于描述该样本特征的标签。
  • 强大的查询语言PromQL:Prometheus内置了一个强大的数据查询语言PromQL。 通过PromQL可以实现对监控数据的查询、聚合。同时PromQL也被应用于数据可视化(如Grafana)以及告警当中。
  • 高效:对于监控系统而言,大量的监控任务必然导致有大量的数据产生。而Prometheus可以高效地处理这些数据,对于单一Prometheus Server实例而言它可以处理:数以百万的监控指标,每秒处理数十万的数据点。
  • 易于集成:使用Prometheus可以快速搭建监控服务,并且可以非常方便地在应用程序中进行集成。目前支持: Java, JMX, Python, Go,Ruby, .Net, js等等语言的客户端SDK,基于这些SDK可以快速让应用程序纳入到Prometheus的监控当中,或者开发自己的监控数据收集程序。同时这些客户端收集的监控数据,不仅仅支持Prometheus,还能支持Graphite这些其他的监控工具。同时Prometheus还支持与其他的监控系统进行集成:Graphite, Statsd, Collected, Scollector, muini, Nagios等。Prometheus社区还提供了大量第三方实现的监控数据采集支持:JMX, CloudWatch, EC2, MySQL, PostgresSQL, Haskell, Bash, SNMP, Consul, Haproxy, Mesos, Bind, CouchDB, Django, Memcached, RabbitMQ, Redis, RethinkDB, Rsyslog等等。
  • 可视化:Prometheus Server中自带了一个Prometheus UI,通过这个UI可以方便地直接对数据进行查询,并且支持直接以图形化的形式展示数据。同时Prometheus还提供了一个独立的基于Ruby On Rails的Dashboard解决方案Promdash。最新的Grafana可视化工具也已经提供了完整的Prometheus支持,基于Grafana可以创建更加精美的监控图标。基于Prometheus提供的API还可以实现自己的监控可视化UI。

4.架构图及各组件作用

  • Prometheus Server:是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询。
  • Exporters:Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。
  • 直接采集:这一类Exporter直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。
  • 间接采集:间接采集,原有监控目标并不直接支持Prometheus,因此我们需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如: Mysql Exporter,JMX Exporter,Consul Exporter等
  • AlertManager:AlertManager即Prometheus体系中的告警处理中心。在Prometheus Server中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警,而告警的后续处理流程则由AlertManager进行管理。在AlertManager中我们可以与邮件,Slack等等内置的通知方式进行集成,也可以通过Webhook自定义告警处理方式。
  • PushGateway:由于Prometheus数据采集基于Pull模型进行设计,因此在网络环境的配置上必须要让Prometheus Server能够直接与Exporter进行通信。 当这种网络需求无法直接满足时,就可以利用PushGateway来进行中转。可以通过PushGateway将内部网络的监控数据主动Push到Gateway当中。而Prometheus Server则可以采用同样Pull的方式从PushGateway中获取到监控数据。

二、服务搭建

1.Prometheus

1.下载软件包

wget https://github.com/prometheus/prometheus/releases/download/v2.15.2/prometheus-2.15.2.linux-amd64.tar.gz

2.解压软件包

tar -zxvf prometheus-2.15.2.linux-amd64.tar.gz

#将软件包移动到服务器存放软件的目录

mv prometheus-2.15.2.linux-amd64 /data/prometheus

3.安装go环境。go version:       go1.13.5 。

yum install golang

4.启动prometheus

cd /data/prometheus

sudo nohup ./prometheus  --config.file="prometheus.yml" --web.enable-lifecycle &

prometheus.yml文件:

# my global config
global:scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. 数据采集频率evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. 告警规则检测频率scrape_timeout: 15s # scrape_timeout is set to the global default (10s). 数据采集超时时间# scrape_timeout is set to the global default (10s).# Alertmanager configuration
alerting:alertmanagers:- static_configs:- targets: ['172.17.67.214:9093']# - alertmanager:9093# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:- "rules/node_rules.yml"# - "first_rules.yml"# - "second_rules.yml"# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: 'prometheus'# metrics_path defaults to '/metrics'# scheme defaults to 'http'.file_sd_configs:- files:- ./conf.d/prometheus.json- job_name: 'node_ali'metrics_path: /metricsstatic_configs:- targets: ['60.205.219.147:9100']- job_name: 'grab_platfrom'metrics_path: '/prometheus'file_sd_configs:- files:- ./conf.d/grab_platfrom.json

2.Grafana

1.安装grafana 服务器

#grafana-5.3.4-1.x86_64.rpm

wget https://dl.grafana.com/oss/release/grafana-5.4.3-1.x86_64.rpm

yum localinstall grafana-5.3.4-1.x86_64.rpm

2.启动grafana

service grafana-server start

#重启

service grafana-server restart

2.Grafana监听端口为3000,可以使用netstat查看监听状态

$ netstat -antpu | grep 3000

tcp6 0 0 :::3000 :::* LISTEN 7147/grafana-server

13.浏览器访问登录 127.0.0.1:3000 配置grafana数据源

三、可监控的服务

1.介绍

Exporter为prometheus的监控对象,Exporter会暴露对应的接口,接口中有当前需要监控的指标项及对应的值。

有一些服务内置了对prometheus的支持,如cAdvisor,Kubernetes,Etcd,Gokit等,promtheus可直接对其监控

还有些服务并不支持内置监控,因此Prometheus提供的Client Library,封装了各个服务的Exporter,完成对其监控,如Mysql Exporter,JMX Exporter,Consul Exporter等

Prometheus支持的Exporter列表 Exporters and integrations | Prometheus

2.SpringBoot项目

对于SpringBoot项目,只需要引入对应的maven依赖,即会完成监控指标的暴露。默认的监控项有http接口请求耗时,hikaricp连接池,jvm,tomcat,jdbc,系统cpu等,其提供的各种埋点的方式,我们可以自定义监控埋点,监控业务指标

四、查询与展示

1.Prometheus-UI

http://127.0.0.1:9090/graph

2.Grafana

http://127.0.0.1:3000/?orgId=1

1.配置数据源为prometheus地址

2.配置监控大盘

注:

grafana为我们提供了很多集成好的大盘,只需引入即可使用

Dashboards | Grafana Labs

五、告警配置

grafana提供的相关的告警配置,需完成一下几步

1.在对应的监控大盘上配置对应的告警规则

2.配置对应的告警通道,这里grafana是通过配置一个webhook地址来调用,即当发生告警时会调用这个接口,我们只需要在接口中实现相关的告警逻辑即可

3.其支持的告警规则较为丰富,但有些并不支持,比如配置在规定时间区间内进行告警。我们可以通过webhook的接口来实现这种自定义的告警规则;或者可以直接查询Prometheus的数据库进行告警规则配置

4.告警的发出没有形成闭环,即告警发出后有没有人在处理。对此可以开发功能,如有人处理或处理完成的情况,也发送对应的告警信息,最终也能形成告警记录表

六、集群化部署

官方推荐:联邦集群 - prometheus-book

阿里开源 Thanos:Thanos:开源的大规模Prometheus集群解决方案 - DockOne.io

https://segmentfault.com/a/1190000022164038

七、问题总结

1.需要监控项目都在prometheus.yml中,每次新增、修改需要监控的项目我都需要修改该文件吗?

答:prometheus集成了consul自动服务发现,如果你在使用consul,可直接在prometheus中配置consul的地址;如果没有使用,可以考虑二次开发,将修改该文件的操作集成在一个后台管理页面中;项目的元数据可以包括项目名称、项目负责人、项目的地址、项目是springboot/mysql/node等,如果是springboot,包括项目的版本

2.你在使用过程中遇到过哪些问题,或者有哪些是需要注意的呢?

答:

遇到的问题a,prometheus整个挂掉,不再收集数据。后来排查是因为我们有个grafana的大盘配置监控项比较多,每次加载需要查询大量的数据,而且当前页面配置了每5s刷新一次,即可能出现上一次的数据还没有加载完成,就又重新加载了,当多个人打开该页面时就出现了prometheus挂掉的局面。优化:把页面的每5s刷新一次关掉;集群化部署;将大盘里的多个监控项拆分到不同的大盘里,减轻一次加载的压力

遇到的问题b,rate函数的使用,其表示速率,如我们收集指标的间隔为每15s一次,某指标从0s的3变到了60s的9,rate{x}[1m]的计算方法为 (9-3)/45,并不是除60,rate一分钟内的数据,一分钟内上报了4个点,第4个点是45s的时候