Prometheus 的 relabel 功能可以在目标的 label 被抓取之前重写它,每个采集配置可以配置多个 relabel,并按照配置的顺序来应用于每个 target 的 label。利用这个特性,我们可以实现动态的 metrics-path。
需求描述
现在 Alliot 有如下的 metrics endpoint 需要被监控:
1 | http://192.168.1.1:80/payment-service/metrics |
这种情况下,我们的 target 均为 192.168.1.1:80,不同的是 metrics_path,这样我们就不得不写3个 job 来监控,因为在 prometheus 的配置中,target 字段只能是 [host]:[ip] 不能包含路径。
https://github.com/prometheus/prometheus/issues/1852 官方仓库也有人提出了这样的需求,但是并没有被通过。
众所周知,Prometheus 在 scrape 的过程中,有个十分好用的 feature: relabel。 通过 relabel 可以将 scrape 到的标签进行修改、重打标签。通过 [prometheus URL]:9090/targets 下对各个 target 的查看,我们可以发现,endpoint 的 Before relabeling 中存在一个名为 __metrics_path__ 的 label, 因此,我们可以通过设置一个新的 relabel 作为动态的值,之后将其 relabel 重打标来达到我们的目的:
static config下的实现
静态配置下,通过为每个 target 指定一个新的 label 并将其 replace 为 __metrics_path__ 即可:
1 | - job_name: prometheus_dynamic_metrics_path |
在如上配置下,我们仅需要配置一个 Job 即可完成对多个 metric endpoint 的 scrape。
动态发现场景下
同样的,这种 relabel 的方式在自动发现等机制场景下,也能很方便的通过添加一个额外的 label 来达到简化配置的目的。
1 | - job_name: ecs_jvm_actuator |