开源监控报警系统——Prometheus

62 阅读8分钟

转载自博客: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架构:

1f18f81fe0680c4286543b34b14a29bd_v2-a69be52599bc10b5ec80e595238f0f1a_1440w.jpg

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)、业务接口(登入、注册、聊天、上传、留言、短信、搜索)

460ec379444039b6b17d3fea7295f36c_v2-bec653e7a93cd233d725be58dbd279b9_1440w.jpg

基于Prometheus的监控架构

开源分析监视平台——Grafana

1、基本简介

Grafana 是一套开源的分析监视平台,支持 Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch 等数据源,其 UI 非常漂亮且高度定制化,选择 Prometheus + Grafana 的方案,可以满足大部分中小团队的监控需求。

ba31ca85681ddbcc600313fab0f9a8cc_v2-3febe7ad25c49a6b67a1324ea3bd4bae_1440w.jpg

c1f71a4fbe95cfccd41f345625fe9006_v2-797beeb60ec850c39082642eb8ff73eb_1440w.jpg

c1f71a4fbe95cfccd41f345625fe9006_v2-797beeb60ec850c39082642eb8ff73eb_1440w.jpg

集群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

951f6d934ad653c868141681c26f7d43_v2-3bb991d428e36e2d6724b84186a8ddac_1440w.jpg

修改/prometheus.yml

第四步 重启prometheus

systemctl restart prometheus,此时prometheus的targets中便会增加一个

389fbfe4dc78b1ceb26d747cf1057a9f_v2-34d636321029db3ca7d03c93e0008b51_1440w.jpg

重启prometheus

以上便是我们提供给Prometheus默认收集的指标,我们可以基于这些指标通过PromQL查询,查询结果在Grafana中做展示。

e6faa78b1a8da6f17232bc79be941e64_v2-214c05dfd05c8ba639cc475d0abd57a2_1440w.jpg

PromQL查询结果展示

第五步 为方便展示,我们在Grafana中添加面板,保存即可展示到我们的仪表盘中。

950d1696a085d849be0bff376476ae70_v2-7725a82253baeb393513a19b716a63bd_1440w.jpg

2d3d4684191dc9a6ac45d11718bd28e1_v2-4ec770e51d2ac54e61d62adad673b599_1440w.jpg

添加JVM模板

JVM相关的常用指标监控,到此便配置完成,以上配置也可以根据实际情况,调整每个模块的展示信息。

255baf012e3fbb817ece1a47fb549251_v2-9ece0fcabd1c29186c32e02e9277918e_1440w.jpg

各模块展示信息

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添加告警规则:

6895cb0524fae6962af7b7717af5ea9e_v2-d4d803629eadda2b29722f6ce94dd8fd_1440w.jpg

添加告警规则

重启promethues即可在Alerts中看到我们定义的告警规则:

849bca4429dd462989fce879acc80a76_v2-cfad268e8405fdab2329d97cba3cc875_1440w.jpg

Alerts展示告警规则

  • 状态说明:Prometheus Alert 告警状态有三种状态,包括Inactive、Pending、Firing;
  • Inactive:非活动状态,表示正在监控,但是还未有任何警报触发;
  • Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所以要等待验证,一旦所有的验证都通过,则转到Firing 状态;
  • Firing:将警报发送到AlertManager,它将按照配置将警报发送给所有接收者。一旦警报解除,则转到Inactive状态,如此循环

模拟服务宕机:kill进程

776edd6f43624fc38edd42cbffe410d6_v2-cbb0035a111de5d553fbeb82ab71d985_1440w.jpg

模拟服务宕机

此时满足条件 up == 0,State变成为PENDING

0b66d4a19f18f8afcc3ea67b4cc20678_v2-50577a2457d36ff64d9c3df97b4234c1_1440w.jpg

PENDING状态

当时间超过评估等待时间5m后 (for:5m),State变成FIRING,此时会产生告警。并发送给Alertmanager处理。

0d62ba1c34b1eb65bdbe7a4751a8667c_v2-d1ecaa7d51bf7d034773205e2b98618d_1440w.jpg