一篇文章讲懂 prometheus
作为云原生体系下的“默认”监控系统,prometheus 正在获得越来越广泛的关注。今天,我们就讲一下 prometheus 的设计理念,看看它是如何用非常简单的设计支撑起如此复杂的功能的。
首先,我们来思考一下,如果要做一个监控系统,都有哪些难点,比如
每个服务的监控需求都不一样,那么对于监控系统来说,要怎么设计其数据模型,才能取得易用性和通用性之间的平衡
大量的数据量要如何存储
怎样能实现各种复杂的报表
…
带着这些问题,我们就来看看 prometheus 是怎么设计的。
历史
让我们先从历史说起,prometheus 最早由 SoundCloud 开发,后来捐赠到开源社区。在 2016 年假如 CNCF, 即云原生计算基金会。Prometheus 是 CNCF 的第二个项目,仅次于 kubernets。 因此,可想而知,promethous 在整个云原生体系中有多么重要的作用。Prometheus 也逐渐成了云原生下监控系统的事实标准。
核心设计理念
对于一个监控系统来说,核心要解决的问题其实就三个:
监控指标用什么形式表示
怎么收集和存储指标
怎么利用指标生成报表
对于这三个问题,prometheus 都给出了很巧妙的解决方案。
数据模型
romethous 的数据模型,简而言之,就是一个「时序」的 Metric 数据。所谓 metric, 就是数据的测量值,而所谓时序,就是这些 metric, 会源源不断的产生不同时间点的数据。
Metric 有唯一的名称标识,也可以设置多个 label, 可以用于过滤和聚合,其格式如下。
这样,对于任何业务,我们都可以将监控数据设计成统一的 metric 格式。这样对于 promethous 来说,方案可以足够简单,只用处理这一种数据格式就可以。而同时又足以方便的应对千变万化的业务场景。
Prometheus 提供了 counter, gauge, histogram, summary 四种核心的 metric, 不过其区别仅体现在 client 端和 promQL 中。截至目前(2021.11), 不同的 metric 类型在 prometheus server 这一侧并不会有什么区别,
数据收集和存储
Prometheus server 会定时从要监控的服务暴露出的 http 接口上抓取数据,是一种典型的拉模型。
相对推模型,拉模型会有一些好处,比如更容易监测某一个节点是否正常;更容易本地调试等。当然,对于一个监控系统来说,采用推还是拉,其实并不是一个主要问题。
Prometheus 的数据是典型的时序数据,prometheus 本身会将数据存储在本地磁盘上。要注意的是,本地存储不可复制,无法构建集群,如果本地磁盘或节点出现故障,存储将无法扩展和迁移。因此一般只能把本地存储视为近期数据的短暂滑动窗口。
而关于持久化存储的问题,prometheus 实际上并没有试图解决。它的做法是定义出标准的读写接口,从而可以将数据存储到任意一个第三方存储上。
生成报表
Prometheus 定义了功能强大的 promQL, 可以满足各种复杂的查询场景,具体可参考 https://prometheus.io/docs/prometheus/latest/querying/basics/
周边生态
一个开源项目的发展,当然离不开周边生态的发展。而 prometheus 目前已经有了很完善的生态,在 java, go, python 等主流的开发语言下,都有完善的 client 包可以使用; 像 spring 中,可以很容易的为多种组件增加打点,这一点,在下边的实战环节我们会细讲;在 kubernetes 中,可以轻易的配置自动去各个节点抓取 prometheus 数据;借助 grafana 等工具,也可以配置出多种多样的报表。
实战
接下来,我们会以 springboot 项目为例,来看一看 prometheus 的实际效果。
其核心思路就是使用 spring-actuator 为 springboot 应用配置监控,并以 promethous 的结构暴露出来。
首先,引入依赖
然后添加 spring 配置
这个配置里,其实做了几件事:将数据以 prometheus 的格式暴露出来;自动为 http 请求添加 histogram 监控;增加一个 application 标识,这个标识会作为一个 label 出现在所有 metric 中。
之后,启动 springboot 项目,并且访问/actuator/prometheus 路径,就可以看到大量 metric, 比如
其中,除了我们显式配置的 http 监控,其实还有大量的 jvm, 机器负载等基础的监控信息。
除此之外,对于其他组件的监控也很容易添加,诸如线程池、http 连接池、自定义监控等,可以参考 https://github.com/lcy362/springboot-prometheus-demo
版权声明: 本文为 InfoQ 作者【流沙】的原创文章。
原文链接:【http://xie.infoq.cn/article/6e7a81f51abf8fdf1c0520da8】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论