084、Prometheus 到底NB在哪里?(2019-05-06 周一)

 
本节学习Prometheus的核心,多维数据模型
 
比如要监控容器 webapp1 的内存使用情况,最传统和经典的方法是定义一个指标 container_memory_usage_bytes_webapp1 来记录webapp1的内存使用数据。假如每分钟取一次样,那么在数据库里就会有类似的记录。
 
 
现在需求变了,我们需要知道所有 webapp 容器的内存使用情况。如果还是采用前面的方法,就不得不增加新的指标 container_memory_usage_bytes_webapp2container_memory_usage_bytes_webapp3 。。。
 
像Graphite这类更高级的监控方案采用了更为优雅的层次化数据模型。为了满足上面的需求,Graphite会定义指标 container.memory_usage_bytes.webapp1container.memory_usage_bytes.webapp2container.memory_usage_bytes.webapp3。。。然后就可以用 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多维数据如下
 
 
后面三列 container_name  、 image 、 env 就是数据的三个维度。想象一下,如果不同的env(prod、test、dev),不同的image(webapp1.2 、 webapp1.3 )的容器,他们的内存使用数据中标注了这三个维度的信息,那么将能满足很多的业务需求,比如:
 
    1、计算 webapp2 的平均内存使用情况  avg(container_memory_usage_bytes{container_name="webapp2"})
    2、计算运行 webapp1.2 镜像的所有容器内存使用情况  sum(container_memory_usage_bytes{image="webapp1.2"})
    3、统计不同运行环境中 webapp 容器内存使用总量 sum(container_memory_usage_bytes{container_name="webapp"}) by (env)
 
这里只是列举了几个例子,不过已经能够体现Prometheus数据模型的优势了。
 
    1、通过维度对数据进行说明,附加更多的业务信息,进而满足不同业务的需求。同时维度是可以动态添加的,比如再给数据加上一个user维度,就可以按用户来统计容器的内存使用量了
 
    2、Prometheus 丰富的查询语言能够灵活、充分的挖掘数据的价值。前面示例中的  avg、sum 、by 只是查询语言中很小的一部分功能,已经为我们展现了 Prometheus 对多维数据进行分片、聚合的强大能力。
 
posted @ 2019-05-06 15:54  三角形  阅读(199)  评论(0编辑  收藏  举报