历史文章推荐:
《【原创|译】Prometheus的Counter、Gauge、Summary、Histogram是如何工作的?(完整版)》
《【原创|译】Prometheus2.X(从2.0.0到2.13.0)十四个重大版本变迁说明》
《【原创|译】Prometheus将规则Rules从1.X转化为2.0的格式》
《【原创|译】Prometheus 2.X里程碑更新及Prometheus 2.X访问1.X数据》
《Grafana JVM Micrometer(4701)指标图解》
《匠心打磨,《HikariCP数据库连接池实战》书背后的故事(上):创作团队和封面故事》
《【文末双十一购书大促】HikariCP可视化监控已支持Prometheus接入》
一、Prometheus
Prometheus 是由前 Google 工程师从 2012 年开始在 Soundcloud 以开源软件的形式进行研发的系统监控和告警工具包,自此以后,许多公司和组织都采用了 Prometheus 作为监控告警工具。Prometheus 的开发者和用户社区非常活跃,它现在是一个独立的开源项目,可以独立于任何公司进行维护。为了证明这一点,Prometheus 于 2016 年 5 月加入 CNCF 基金会,成为继 Kubernetes 之后的第二个 CNCF 托管项目。
数据模型
Prometheus 所有采集的监控数据均以指标(metric)的形式保存在内置的时间序列数据库当中(TSDB):属于同一指标名称,同一标签集合的、有时间戳标记的数据流。
指标名称和标签:每一条时间序列由指标名称(Metrics Name)以及一组标签(键值对)唯一标识。其中指标的名称(metric name)可以反映被监控样本的含义(例如,http_requests_total — 表示当前系统接收到的 HTTP 请求总量)。
通过使用标签,Prometheus 开启了强大的多维数据模型:对于相同的指标名称,通过不同标签列表的集合,会形成特定的度量维度实例。改变任何度量指标上的任何标签值(包括添加或删除指标),都会创建新的时间序列。
注意:
同一指标名称的标签的键必须相同
标签的值不能为空,且不能反复赋值
指标类型
Counter(计数器)
Counter 类型代表一种样本数据单调递增的指标,即只增不减,除非监控系统发生了重置。例如,你可以使用 Counter 类型的指标来表示服务的请求数、已完成的任务数、错误发生的次数等。
Guage(仪表盘)
Guage 类型代表一种样本数据可以任意变化的指标,即可增可减。Guage 通常用于像温度或者内存使用率这种指标数据,也可以表示能随时增加或减少的“总数”,例如:当前并发请求的数量。
Histogram(直方图)
在大多数情况下人们都倾向于使用某些量化指标的平均值,例如 CPU 的平均使用率、页面的平均响应时间。这种方式的问题很明显,以系统 API 调用的平均响应时间为例:如果大多数 API 请求都维持在 100ms 的响应时间范围内,而个别请求的响应时间需要 5s,这种现象被称为长尾问题。
为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在 0~10ms 之间的请求数有多少而 10~20ms 之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram 就是能够解决这样问题的存在,通过 Histogram 类型的监控指标,我们可以快速了解监控样本的分布情况。
Histogram 在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中,后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。
Summary(摘要)
与 Histogram 类型类似,用于表示一段时间内的数据采样结果(通常是请求持续时间或响应大小等),但它直接存储了分位数(通过客户端计算,然后展示出来),而不是通过区间来计算。
Prometheus 适用于什么场景
Prometheus 适用于记录文本格式的时间序列。它既适用于以机器为中心的监控,也适用于高度动态的面向服务架构的监控。在微服务的世界中,它对多维数据收集和查询的支持有特殊优势。Prometheus 是专为提高系统可靠性而设计的,它可以在断电期间快速诊断问题,每个 Prometheus Server 都是相互独立的,不依赖于网络存储或其他远程服务。当基础架构出现故障时,你可以通过 Prometheus 快速定位故障点,而且不会消耗大量的基础架构资源。
Prometheus 不适合什么场景
Prometheus 非常重视可靠性,即使在出现故障的情况下,你也可以随时查看有关系统的可用统计信息。如果你需要百分之百的准确度,例如按请求数量计费,那么 Prometheus 不太适合你,因为它收集的数据可能不够详细完整。这种情况下,你最好使用其他系统来收集和分析数据以进行计费,并使用 Prometheus 来监控系统的其余部分。
二、Micrometer
Spring Boot有个子项目Spring Boot Actuator,它为应用提供了强大的监控能力。从Spring Boot 2.0开始,Actuator将底层改为Micrometer,提供了更强、更灵活的监控能力。Micrometer是一个监控门面,可以类比成监控界的 Slf4j 。
借助Micrometer,应用能够对接各种监控系统,例如:
AppOptics
Atlas
Datadog
Dynatrace
Elastic
Ganglia
Graphite
Humio
Influx
JMX
KairosDB
New Relic
Prometheus
SignalFx
Simple (in-memory)
StatsD
Wavefront
概念
Meter:收集关于应用的一系列指标的接口。
Micrometer提供一系列原生的Meter,包括Timer , Counter , Gauge , DistributionSummary , LongTaskTimer , FunctionCounter , FunctionTimer , TimeGauge。不同的Meter类型有不同的时间序列指标值。例如,增量计数用Counter 表示,单个指标值用Gauge表示,计时事件的次数和总时间用Timer表示。每一项指标都有一个唯一标识的指标名称(metric name)和标签(tags)。
MeterRegistry:Meter是由MeterRegistry创建的。每个支持的监控系统都必须实现MeterRegistry。
下面演示如何对接 Prometheus
,并使用 Grafana
实现数据的可视化。
三、使用Micrometer接入Prometheus
Spring Boot 2.X
加依赖
<!--监控系统健康情况的工具-->复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.2.X.RELEASE</version>
</dependency><!--桥接Prometheus-->复制<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.3.0</version>
</dependency><!--micrometer核心包,按需引入,使用Meter注解或手动埋点时需要-->复制<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>1.3.0</version>
</dependency>
这里,我们为应用引入了 micrometer-registry-prometheus ,事实上,你想对接上文列表中的哪款监控系统,就写啥。例如想对接 Influx ,则需添加依赖 micrometer-registry-influx。
写配置
server:
port: 8080
spring:
application:
name: prometheus-test
management:
endpoints:
web:
exposure:
include: 'prometheus'
metrics:
tags:
application: ${spring.application.name}
如配置所示,指定应用名为 prometheus-test ,并将 Actuator 的 /actuator/prometheus 端点暴露出来; management.metrics.tags.application=prometheus-test 作用是为指标设置一个名为application="prometheus-test" 的Tag。
Spring Boot 1.5.X
加依赖
<!--监控系统健康情况的工具-->复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.X.RELEASE</version>
</dependency><!--桥接Prometheus-->复制<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.3.0</version>
</dependency><!--micrometer核心包,按需引入,使用Meter注解或手动埋点时需要-->复制<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>1.3.0</version>
</dependency><!--低版本1.5.x版本springboot兼容micrometer-->复制<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-spring-legacy</artifactId>
<version>1.3.0</version>
</dependency>
写配置
endpoints.sensitive=false
management.metrics.tags.application=${spring.application.name}
JVM监控
<!--micrometer获取jvm相关信息,用于展示在Grafana上-->复制<dependency>
<groupId>io.github.mweirauch</groupId>
<artifactId>micrometer-jvm-extras</artifactId>
<version>0.1.4</version>
</dependency>
使用Micrometer API
使用Micrometer注解监控Spring MVC REST API
@RestController
@Timed // 针对整个Controller Class注解,Controller下的API都会生效
public class MyController {
@GetMapping("/api/people")
@Timed(value = "all.people", extraTags = { "region", "us-east-1" }, longTask = true) // 单个方法定制
public List<Person> listPeople() { ... }
}
注意:Micrometer的此类注解仅针对Controller,用于监控API的通用指标,比如计数、请求耗时等,不针对具体的功能业务。当然,如果应用方想要监控的目标业务具有通用性,可自定义注解,利用AOP完成监控。
手动编码埋点,完成业务监控
测试
启动应用,访问http://localhost:8080/actuator/prometheus(或http://localhost:8080/prometheus)可获得类似如下的结果:
应用端的配置已基本完成。联系运维,将被监控的endpoint配置到Prometheus服务器,Prometheus就能采集数据。
四、Grafana可视化
至此,已经用Prometheus实现了监控数据的可视化,然而使用体验并不好。下面来用Grafana实现更友好、更贴近生产的监控可视化。
Grafana是一个开源的跨平台度量分析、告警的可视化工具。
登录Grafana(http://grafana.XXX.net),无账号请联系运维。
添加Prometheus数据源,填写Prometheus服务器信息,点击Save&Test。(运维已添加)
3. 创建监控Dashboard,主要有两种方式:手动创建和从Grafana Dashboard市场导入
4.点击Dashboard按钮新建Dashbord,选择Dashabord的类型,一般为Graph(图标),创建后进行编辑。
在General面板下填写标题、描述等基本信息(一定要填写清楚,方便使用者知道图表的含义与作用)
在Metrics面板下,按需选择Data Source,这里我们使用的是prometheus。使用PromQL展示指标,绘制曲线,Grafana会给你较好的提示,并且支持较为复杂的计算,例如聚合、求和、平均等。如果想要绘制多个线条,可点击Add Query按钮,如下图所示。
5、手动创建的操作虽然不难,但还是挺费时间,那么是否有配置好的又强大、又通用、拿来即用的Dashboard呢?答案是肯定的!前往 Grafana Lab - Dashboards ,输入关键词即可搜索指定Dashboard。在导入页填写Dashboard url或id即可完成导入。
6、配置报警
五、参考文档
Prometheus 中文文档
Prometheus Documentation
Micrometer Documentation
Grafana Documentation
欢迎大家购买我的新书《HikariCP数据库连接池实战》。
《HikariCP数据库连接池实战》京东的数据库专题上线,轮转推荐
https://pro.m.jd.com/mall/active/2sfniwqTJWrqUQbWozxWvWrAW7tk/index.html
豆瓣书评:
https://book.douban.com/subject/34659722/
中关村软件园1024无bug市集现场书展
双十一大促,促销费用都是出版社来承担,京东双十一期间100-50元,预购从速!
京东购书二维码:
欢迎转发海报:
你点的每个“在看”,我都认真当成了喜欢 复制