如何在 Prometheus (k8s) 中动态定义指标

Posted

技术标签:

【中文标题】如何在 Prometheus (k8s) 中动态定义指标【英文标题】:How to dynamically define metrics in Prometheus (k8s) 【发布时间】:2020-11-26 02:33:13 【问题描述】:

我正在编写一个导出器,但在收集器的指标方面遇到问题。据我所知,Prometheus 中的指标需要事先定义。有没有办法在运行时动态定义它们?在代码运行之前,我不知道我将拥有多少指标或需要哪些指标。 (例如,如果 k8s 找到连接到集群的所有卷,我需要每个卷都获得自己的 total_capacity/available_capacity 指标)。

【问题讨论】:

【参考方案1】:

您可以通过使用动态标签值而不是动态指标名称来处理此问题。也就是说,你可以在运行时调用prometheus.Register() 就好了,client_golang 不会知道区别。

【讨论】:

我不知道该怎么做,我找不到太多关于这个主题的信息。据我所知,要定义一个指标,我必须在我的收集器结构中定义它,用 prometheus.NewDesc() 在构造函数中填充它,将它传递给 Describe() 中的 prometheus desc 通道,并确定如何收集它收藏()。我可以随时使用 prometheus.MustRegister() 注册收集器,但是如何更改该收集器的指标? 重申一下,您应该使用标签,但您只需根据需要制作新的收藏家。或者,如果您需要更动态的内容,只需将整个 client_golang 打包并编写自己的,序列化格式不是很难:) @TrevorJordy,不,您没有在构造函数中调用 NewDesc。是的,您必须在“描述和收集”中使用描述,但它如何到达那里完全取决于您。我同意您应该只使用标签,在这种情况下,您确实提前知道描述(在 Describe 中发送描述然后不在 Collect 中使用它是没有害处的)。 @coderanger 我正在研究标签并试图理解。我是否可以拥有 total_volume_capacity 指标的多个副本,每个副本都带有不同的标签?例如:total_volume_capacityname:"volume1", total_volume_capacityname:"volume2" 就是这样,是的:)【参考方案2】:

到目前为止,我只使用过 Python 和 Java Prometheus 客户端,但这不只是建议预先定义指标吗?在 Java 中,我可以在运行时在方法内部或任何我想要的地方创建指标。我只需要确保不会再次创建相同的指标,否则库会抛出异常。

【讨论】:

以上是关于如何在 Prometheus (k8s) 中动态定义指标的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#K8S 之 Prometheus 监控步骤

利用prometheus监控K8S

k8s部署-54-如何完善k8s中Prometheus(普罗米修斯)监控项目呢?本文带你了解

prometheus配置详解

关于Prometheus在K8S中的部署方案如何选择,以及分享手工部署的YAML

kube-prometheus中grafana在k8s环境下持久化