目录
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
英文文档:
中文文档:
查询 - 函数 - 《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.下载软件包
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: /metrics
static_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
2.Grafana
http://127.0.0.1:3000/?orgId=1
1.配置数据源为prometheus地址
2.配置监控大盘
注:
grafana为我们提供了很多集成好的大盘,只需引入即可使用
五、告警配置
grafana提供的相关的告警配置,需完成一下几步
1.在对应的监控大盘上配置对应的告警规则
2.配置对应的告警通道,这里grafana是通过配置一个webhook地址来调用,即当发生告警时会调用这个接口,我们只需要在接口中实现相关的告警逻辑即可
3.其支持的告警规则较为丰富,但有些并不支持,比如配置在规定时间区间内进行告警。我们可以通过webhook的接口来实现这种自定义的告警规则;或者可以直接查询Prometheus的数据库进行告警规则配置
4.告警的发出没有形成闭环,即告警发出后有没有人在处理。对此可以开发功能,如有人处理或处理完成的情况,也发送对应的告警信息,最终也能形成告警记录表
六、集群化部署
七、问题总结
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的时候