暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于Prometheus搭建SpringCloud全方位立体监控体系

工匠人生 2019-11-08
1699

深耕HikariCP、数据库领域的公众号


历史文章推荐:

【原创|译】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数据

《技术长文|盘点Go语言开发的那些架构、中间件和系统

Grafana JVM Micrometer(4701)指标图解

匠心打磨,《HikariCP数据库连接池实战》书背后的故事(上):创作团队和封面故事

HikariCP常用监控指标与故障排查实战

《【追光者系列】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 开启了强大的多维数据模型:对于相同的指标名称,通过不同标签列表的集合,会形成特定的度量维度实例改变任何度量指标上的任何标签值(包括添加或删除指标),都会创建新的时间序列。


注意

  1. 同一指标名称的标签的键必须相同

  2. 标签的值不能为空,且不能反复赋值

指标类型

  1. Counter(计数器)

    Counter 类型代表一种样本数据单调递增的指标,即只增不减,除非监控系统发生了重置。例如,你可以使用 Counter 类型的指标来表示服务的请求数、已完成的任务数、错误发生的次数等。


  2. Guage(仪表盘)

    Guage 类型代表一种样本数据可以任意变化的指标,即可增可减。Guage 通常用于像温度或者内存使用率这种指标数据,也可以表示能随时增加或减少的“总数”,例如:当前并发请求的数量。


  3. Histogram(直方图)

    在大多数情况下人们都倾向于使用某些量化指标的平均值,例如 CPU 的平均使用率、页面的平均响应时间。这种方式的问题很明显,以系统 API 调用的平均响应时间为例:如果大多数 API 请求都维持在 100ms 的响应时间范围内,而个别请求的响应时间需要 5s,这种现象被称为长尾问题

    为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在 0~10ms 之间的请求数有多少而 10~20ms 之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram 就是能够解决这样问题的存在,通过 Histogram 类型的监控指标,我们可以快速了解监控样本的分布情况。

    Histogram 在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中,后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。


  4. 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)

  • MeterRegistryMeter是由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是一个开源的跨平台度量分析、告警的可视化工具。

  1. 登录Grafana(http://grafana.XXX.net),无账号请联系运维

  2. 添加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元,预购从速


京东购书二维码:

欢迎转发海报:






你点的每个“在看”,我都认真当成了喜欢
复制
文章转载自工匠人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论