转载自博客:zhuanlan.zhihu.com/p/519951985 监控系统使用情况分布 开源监控报警系统——Prometheus Prometheus(普罗米修斯)是由SoundCloud开发的开源监控报警系统和时间序列数据库(TSDB),它是一个监控采集与数据存储框架(监控服务器端),支持多种exporter采集指标数据,并支持PushGateway进行数据上报,性能足够支撑上万台规模的集群,相较于其它监控系统使用的 push 数据的方式,Prometheus 则使用的是 pull 的方式。 1、基本原理:
Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态。这样做的好处是,任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程,这样做非常适合虚拟化环境,如:VM、Docker 。Prometheus是为数不多同时适合Docker、Mesos、Kubernetes环境的监控系统之一。
2、Exporter:
输出被监控组件信息的HTTP接口被称为exporter 。目前互联网公司常用的组件大部分都有可以直接使用的exporter,如:Varnish、Haproxy、Nginx、MySQL、Linux 系统信息 (包括磁盘、内存、CPU、网络等等)。具体采集的数据类型依赖于Exporter(监控客户端),例如采集MySQL的数据需要使用mysql_exporter。当Prometheus调用mysql_expoter采集到MySQL的监控指标之后,把采集数据存放到Prometheus所在服务器的磁盘数据文件中。它的各个组件基本都是用Golang编写的,对编译和部署十分友好,并且没有特殊依赖,基本都是独立工作。
Exporter种类如下:
官方Exporter地址:github.com/prometheus; node_exporter:Linux类操作系统相关数据的采集程序; jmx_exporter:Java进程指标采集程序; mysqld_exporter:MySQLserver数据采集程序; redis_exporter:Redis数据采集程序 3、Prometheus架构:
Prometheus架构概览图
1)Prometheus Server
主要负责数据采集和存储,提供 PromQL 查询语言的支持。Server 通过配置文件、文本文件、ZooKeeper、Consul、DNS SRV Lookup 等方式指定抓取目标。根据这些目标,Server 定时去抓取 metrics 数据,每个抓取目标需要暴露一个 http 服务的接口用于Prometheus定时抓取。这种调用被监控对象获取监控数据的方式被称为Pull。Pull方式体现了Prometheus独特的设计哲学,这一点与大多数采用Push方式的监控系统不同。
2)PushGateway
Prometheus支持临时性 Job 主动推送指标的中间网关。某些现有系统是通过Push方式实现的,为了接入这个系统,Prometheus提供对PushGateway的支持。这些系统主动推送metrics到PushGateway,而Prometheus只是定时去Gateway上抓取数据。
3)AlertManager
AlertManager是独立于Prometheus的一个组件,可以支持 Prometheus 的查询语句,并在触发了预先设置在Prometheus中的高级规则后,Prometheus便会推送告警信息到AlertManager。
4)Exporter
Exporter Exporter是 Prometheus 的一类数据采集组件的总称。它负责从目标处搜集数据,并将其转化为 Prometheus 支持的格式。与传统的数据采集组件不同,它并不向中央服务器发送数据,而是等待中央服务器主动前来抓取。Prometheus 提供多种类型的 Exporter 用于采集各种不同服务的运行状态。目前支持的有数据库、硬件、消息中间件、存储系统、HTTP 服务器、JMX 等。
5)HTTP API
这是一种查询方式,可以自定义所需要的输出。
6)Prometheus支持两种存储方式
第一种是本地存储,通过Prometheus自带的时序数据库将数据保存到本地磁盘,为了性能考虑,建议使用SSD。但本地存储的容量毕竟有限,建议不要保存超过一个月的数据。
另一种是远程存储,适用于存储大量监控数据。通过中间层适配器的转化,目前Prometheus支持OpenTSDB、InfluxDB、Elasticsearch等后端存储。通过适配器实现Prometheus存储的remote write和remote read接口,便可以接入Prometheus作为远端存储使用。
7)Prometheus核心价值
系统监控:主要是跟进操作系统的基本监控项目,如CPU、内存硬盘、IO、TCP连接、进出口流量; 程序监控:一般需要和开发人员配合,在程序中主动上报各种获取到的数据或者特定的日志格式; 业务监控:可以包含用户访问QPS、DAU日活、访问状态(Http code)、业务接口(登入、注册、聊天、上传、留言、短信、搜索)
基于Prometheus的监控架构
开源分析监视平台——Grafana
1、基本简介
Grafana 是一套开源的分析监视平台,支持 Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch 等数据源,其 UI 非常漂亮且高度定制化,选择 Prometheus + Grafana 的方案,可以满足大部分中小团队的监控需求。
集群Pod资源监控
2、五步上手集成springboot项目
第一步 新建springboot项目,依赖如下:
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
io.micrometer
micrometer-registry-prometheus
runtime
springboot配置文件:
Actuator Web 访问端口
management.server.port=8081
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.endpoint.prometheus.enable=true
management.metrics.export.prometheus.enable=true
第二步 启动服务,浏览器查看服务
http://ip:8081/actuator/prometheus
HELP process_start_time_seconds Start time of the process since unix epoch.
TYPE process_start_time_seconds gauge
process_start_time_seconds{application="springboot-prometheus",} 1.652688867103E9
HELP system_cpu_usage The "recent cpu usage" for the whole system
TYPE system_cpu_usage gauge
system_cpu_usage{application="springboot-prometheus",} 1.0
HELP tomcat_sessions_active_current_sessions
TYPE tomcat_sessions_active_current_sessions gauge
tomcat_sessions_active_current_sessions{application="springboot-prometheus",} 0.0
HELP jvm_gc_live_data_size_bytes Size of old generation memory pool after a full GC
TYPE jvm_gc_live_data_size_bytes gauge
jvm_gc_live_data_size_bytes{application="springboot-prometheus",} 0.0
HELP logback_events_total Number of error level events that made it to the logs
TYPE logback_events_total counter
logback_events_total{application="springboot-prometheus",level="info",} 16.0
HELP jvm_classes_unloaded_classes_total The total number of classes unloaded since the Java virtual machine has started execution
TYPE jvm_classes_unloaded_classes_total counter
HELP tomcat_sessions_rejected_sessions_total
TYPE tomcat_sessions_rejected_sessions_total counter
tomcat_sessions_rejected_sessions_total{application="springboot-prometheus",} 0.0
以上数据为Prometheus收集的数据格式,包含指标及数据。
第三步 将上面的应用接口作为job接入Prometheus,修改Prometheus的/prometheus.yml
修改/prometheus.yml
第四步 重启prometheus
systemctl restart prometheus,此时prometheus的targets中便会增加一个
重启prometheus
以上便是我们提供给Prometheus默认收集的指标,我们可以基于这些指标通过PromQL查询,查询结果在Grafana中做展示。
PromQL查询结果展示
第五步 为方便展示,我们在Grafana中添加面板,保存即可展示到我们的仪表盘中。
添加JVM模板
JVM相关的常用指标监控,到此便配置完成,以上配置也可以根据实际情况,调整每个模块的展示信息。
各模块展示信息
3、配置告警通知
1)告警通知模块
到这一阶段,我们已经能够通过Grafana展示收集并查看数据。想一想,系统还缺失什么功能?监控最重要的目的是,判断监控系统是否正常,并在系统不正常时,告知相关人员及时排查和解除问题,即告警通知。因此,还缺少一个有关告警通知的模块。prometheus的告警机制由以下两部分组成:
告警规则 prometheus会根据告警规则rule_files,将告警发送给Alertmanager。
管理告警和通知 该模块是Alertmanager,它负责管理告警、去除重复数据、告警通知。通知方式有多种选择,如Email、HipChat、Slack、WebHook等等。
实际操作为:新创建一个规则文件alert_rules.yml
groups:
- name: example
rules:
Alert for any instance that is unreachable for >5 minutes.
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: page
instance: 127.0.0.1:8081
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ labels.instance }} of job {{ labels.job }} has been down for more than 5 minutes."
以上代码的大意是创建了1条alert规则——InstanceDown。
InstanceDown就是实例宕机(up == 0)触发告警,5分钟后告警(for:5m)。
alert:告警规则的名称。 expr:基于PromQL 表达式告警触发条件,用于计算是否有时间序列满足该条件。 for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。 labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。 annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。 summary 描述告警的概要信息,description 用于描述告警的详细信息。 Alertmanager 的UI 也会根据以上两个标签值,显示告警信息。 向promethues.yml添加告警规则:
添加告警规则
重启promethues即可在Alerts中看到我们定义的告警规则:
Alerts展示告警规则
- 状态说明:Prometheus Alert 告警状态有三种状态,包括Inactive、Pending、Firing;
- Inactive:非活动状态,表示正在监控,但是还未有任何警报触发;
- Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所以要等待验证,一旦所有的验证都通过,则转到Firing 状态;
- Firing:将警报发送到AlertManager,它将按照配置将警报发送给所有接收者。一旦警报解除,则转到Inactive状态,如此循环
模拟服务宕机:kill进程
模拟服务宕机
此时满足条件 up == 0,State变成为PENDING
PENDING状态
当时间超过评估等待时间5m后 (for:5m),State变成FIRING,此时会产生告警。并发送给Alertmanager处理。