如何在 Prometheus 中使用两个指标执行查询?

Fel*_*ipe 3 prometheus

我正在使用 Prometheus 从 Apache Flink 查询指标。我想测量 Map 函数每秒输入和输出的记录数。当我在 Prometheus 中查询两个不同的指标时,图表只显示其中之一。

flink_taskmanager_job_task_operator_numRecordsInPerSecond{operator_name="Map"} 
or flink_taskmanager_job_task_operator_numRecordsOutPerSecond{operator_name="Map"}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 如果我将运算符更改orand. 该图表仅显示第一个 ( flink_taskmanager_job_task_operator_numRecordsInPerSecond)。我也尝试过编辑 Prometheus 配置文件,/etc/prometheus/prometheus.yml但我对 Prometheus 没有太多经验,而且我的配置有问题。我的解决方案基于这篇文章

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'node_exporter'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9100']   
  - job_name: 'flink'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9250', 'localhost:9251', '192.168.56.20:9250']
    metrics_path: /
# HOW TO ADD THE OPERATOR NAME ON THE METRIC NAME?
    metric_relabel_configs:
      - source_labels: [__name__]
      regex: '(flink_taskmanager_job_task_operator)_(\w+)'
      replacement: '${2}'
      target_label: pool
      - source_labels: [__name__]
      regex: '(flink_taskmanager_job_task_operator)_(\w+)'
      replacement: '${1}_bytes'
      target_label: __name__
Run Code Online (Sandbox Code Playgroud)

val*_*ala 11

__name__通过在标签上使用正则表达式过滤器,可以通过单个 PromQL 查询选择多个指标名称:

{__name__=~"flink_taskmanager_job_task_operator_numRecords(In|Out)PerSecond",operator_name="Map"}
Run Code Online (Sandbox Code Playgroud)

请参阅此处__name__有关标签的文档。

使用与 Prometheus 兼容的查询引擎(例如MetricsQL)时,还有另一种解决方案,即使用union函数:

union(
 
 flink_taskmanager_job_task_operator_numRecordsInPerSecond{operator_name="Map"},
 
 flink_taskmanager_job_task_operator_numRecordsOutPerSecond{operator_name="Map"}
)
Run Code Online (Sandbox Code Playgroud)

请注意,如果所选系列包含在任何 PromQL 函数中,则通过正则表达式选择多个时间系列__name__可能会导致错误。vector cannot contain metrics with the same labelset例如:

max_over_time(
 
 {__name__=~"flink_taskmanager_job_task_operator_numRecords(In|Out)PerSecond",operator_name="Map"}[5m]
)
Run Code Online (Sandbox Code Playgroud)

这是因为 Prometheus 在应用 PromQL 函数时从输入系列中删除指标名称。VictoriaMetrics 的MetricsQL为这个问题提供了一个解决方案 -keep_metric_names修饰符(有关详细信息,请参阅这些文档):

max_over_time(
 
 {__name__=~"flink_taskmanager_job_task_operator_numRecords(In|Out)PerSecond",operator_name="Map"}[5m]
)
keep_metric_names
Run Code Online (Sandbox Code Playgroud)

PS 我从事 VictoriaMetrics 和 MetricsQL 工作。


Mic*_*ski 6

首先,对于更复杂的图形,您绝对应该研究Grafana。内置的 Prometheus 图很有用,例如。用于调试,但绝对更有限。特别是一张图只会显示一个查询的结果。

现在对于我绝对不推荐的 hack:

flink_taskmanager_job_task_operator_numRecordsInPerSecond{operator_name="Map"}
or
label_replace(flink_taskmanager_job_task_operator_numRecordsOutPerSecond{operator_name="Map"}, "distinct", "foo", "job", ".*")
Run Code Online (Sandbox Code Playgroud)

因为,据记载

vector1 or vector2产生一个向量,其中包含 的所有原始元素(标签集 + 值)vector1以及所有在vector2中没有匹配标签集的元素vector1

您可以将第一个向量的标签中不存在的新标签添加到第二个向量,从而保留两者中的所有元素。

  • @Felipe 我的意思是在 Grafana 中,您可以简单地向一个面板添加几个查询。 (2认同)