Prometheus 是一个很是优秀的监控工具。准确的说,应该是监控方案。Prometheus 提供了监控数据搜集、存储、处理、可视化和告警一套完整的解决方案。ios
Prometheus 架构以下:web
官网上的原始架构图比上面这张要复杂一些,为了集中你们的注意力,我只保留了最重要的组件。数据库
Prometheus Server架构
Prometheus Server 负责从 Exporter 拉取和存储监控数据,并提供一套灵活的查询语言(PromQL)供用户使用。app
Exporterwebapp
Exporter 负责收集目标对象(host, container…)的性能数据,并经过 HTTP 接口供 Prometheus Server 获取。函数
可视化组件工具
监控数据的可视化展示对于监控方案相当重要。之前 Prometheus 本身开发了一套工具,不事后来废弃了,由于开源社区出现了更为优秀的产品 Grafana。Grafana 可以与 Prometheus 无缝集成,提供完美的数据展现能力。性能
Alertmanager测试
用户能够定义基于监控数据的告警规则,规则会触发告警。一旦 Alermanager 收到告警,会经过预约义的方式发出告警通知。支持的方式包括 Email、PagerDuty、Webhook 等。
也许一些熟悉其余监控方案的同窗看了 Prometheus 的架构会不觉得然,“这些功能 Zabbix、Graphite、Nagios 这类监控系统也都有,没什么特别的啊!”。
Prometheus 最大的亮点和先进性是它的多维数据模型,下节咱们重点介绍。
本节讨论 Prometheus 的核心,多维数据模型。咱们先来看一个例子。
好比要监控容器 webapp1
的内存使用状况,最传统和典型的方法是定义一个指标 container_memory_usage_bytes_webapp1
来记录 webapp1
的内存使用数据。假如每1分钟取一次样,那么在数据库里就会有相似下面的记录。
time | container_memory_usage_bytes_webapp1 |
---|---|
00:01:00 | 37738736 |
00:02:00 | 37736822 |
00:03:00 | 37723425 |
。。。 | 。。。 |
好,如今需求发生了点变化,咱们须要知道全部 webapp 容器的内存使用状况。若是仍是采用前面的方法,就不得不增长新的指标 container_memory_usage_bytes_webapp2
、container_memory_usage_bytes_webapp3
…
像 Graphite 这类更高级的监控方案采用了更为优雅的层次化数据模型。为了知足上面的需求,Graphite 会定义指标 container.memory_usage_bytes.webapp1
、container.memory_usage_bytes.webapp2
、container.memory_usage_bytes.webapp3
…
而后就能够用 container.memory_usage_bytes.webapp*
获取全部的 webapp 的内存使用数据。
此外,Graphite 还支持 sum()
等函数对指标进行计算和处理,好比 sum(container.memory_usage_bytes.webapp*)
能够获得全部 webapp 容器占用的总内存量。
目前为止问题处理得都很好。但客户老是会提出更多的需求:如今不只要按容器名字统计内存使用量,还要按镜像来统计;或者想对比一下某一组容器在生产环境和测试环境中对内存使用的不一样状况。
固然你能够说:只要定义更多的指标就能知足这些需求。好比 container.memory_usage_bytes.image1.webapp1
、container.memory_usage_bytes.webapp1.prod
等。
但问题在于咱们没办法提早预知客户要用这些数据回答怎样的问题,因此咱们没办法提早定义好全部的指标。
下面来看看 Prometheus 的解决方案。Prometheus 只须要定义一个全局的指标 container_memory_usage_bytes
,而后经过添加不一样的维度数据来知足不一样的业务需求。
好比对于前面 webapp1 的三条取样数据,转换成 Prometheus 多维数据将变成:
time | container_memory_usage_bytes_webapp1 |
container_name | image | env |
---|---|---|---|---|
00:01:00 | 37738736 | webapp1 | mycom/webapp:1.2 | prod |
00:02:00 | 37736822 | webapp1 | mycom/webapp:1.2 | prod |
00:03:00 | 37723425 | webapp1 | mycom/webapp:1.2 | prod |
... | ... |
后面三列 container_name
、image
、env
就是数据的三个维度。想象一下,若是不一样 env
(prod、test、dev),不一样 image
(mycom/webapp:1.二、mycom/webapp:1.3)的容器,它们的内存使用数据中标注了这三个维度信息,那么将能知足不少业务需求,好比:
这里只列了几个例子,不过已经可以说明 Prometheus 数据模型的优点了:
user
维度,就能够按用户来统计容器内存使用量了。