天天看点

promql中使用rate/irate等函数__name__丢失处理

先描述一下情况,我使用prometheus接入hbase监控,采用的方案是用jvm_exporter将hbase自身监控的metrics dump里的json数据转换成prometheus的数据

jmx_exporter https://github.com/prometheus/jmx_exporter

大佬们的教程 https://blog.godatadriven.com/hbase-prometheus-monitoring

https://www.along.party/hadoop集群监控.html

整个流程部署下来没啥问题,就是java进程开个jvm端口,然后起个javaagent让jvm_exporter把jvm里的数据转化一波完事

然后画图的时候踩坑了(hbase我居然在grafana上一个prometheus的模板图都没找到!)

我需要显示出每个table的每秒读请求

拿到的数据示例如下,然后我需要再把集群的每个节点数据sum汇聚一下,然后再irate,想想好像没啥问题

Hadoop_HBase_Namespace_data_xxx_table_testtable_xxx_result_metric_readRequestCount{name=“RegionServer”,sub=“Tables”,} 37500.0

我这么写promql

sum(irate({__name__=~"Hadoop_HBase_Namespace_.*_table_.*_metric_readRequestCount",sub="Tables",cluster=~"$cluster",instance=~"$instance"}[1m])) by (tables_name)

简化一下大概就是这个意思:
sum(irate({__name__=~"metric_readRequestCount",cluster=~"$cluster"}[1m])) by (__name__)
           

于是问题就出来了irate,rate,delta等对时间范围向量操作的一些运算符,执行完后对会把__name__给去掉,只剩下{}里面的labels,那么我再用sum() by (__name__) 肯定就不行了(赶时间的大佬们可直接跳到最后看结果,中间都是在记录排错过程)

一、recording rules

于是最先想到,用recording rules把采取的指标在server处理一下,把table_name加到lable里面

recording rules官方文档如下→。→ https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/

我的配置示例

groups:
- name: hbase_table_readRequestCount
  rules:
  - record: Hadoop_HBase_test_record
    expr: '{__name__=~"Hadoop_HBase_Namespace_.*_table_.*_metric_readRequestCount",__name__!~ ".*region.*"}'
    labels:
      table_name: "{{ $lable.__name__ }}"
           

他完美的奏效了,他在成功的在匹配的metric里加上了一个labels,

table_name={{ $lable.__name__ }} ,当成普通字符传递了

orz,没有找到为什么recording rules里面的labels不能传递变量,同样的方法用在alerting rules里就可以,比如说像这样

groups:
- name: hbase_table_readRequestCount
  rules:
  - alert: "hbase_tables_test"
    expr: '{__name__=~"Hadoop_HBase_Namespace_.*_table_.*_metric_readRequestCount",__name__!~ ".*region.*"}'  > 0
    for: 3s
    labels:
      table_name: "{{ $lable.__name__ }}"
           

然后可以在Alertmanager或者在Alerts页面里看到触发的告警项,里面都是能够成功把table_name加入到labels里的。

所以这里为什么recording rules不能传递变量,没找到原因!有知道的大佬求回复

二、metric_relabel_configs

继续一顿搜,终于找到了一篇博客刚好介绍我这个问题的

https://www.robustperception.io/whats-in-a-name

于是继续看看这个metric_relabel_configs是啥玩意

官方描述(完全看不懂→。→): https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs

反正是能够实现在prometheus刮擦后进行对label修改

于是配置方法

- job_name: 'hbase_test'
    metric_relabel_configs:
      - source_labels: ["__name__"]
        target_label: "tables_name"
    file_sd_configs:
      - files: ['./file_sd_configs/configs_hbase.json']
        refresh_interval: 30s
           

大功告成,成功将__name__写到了label里

那么最后promql也就换成下面这样

sum(irate({tables_name=~"metric_readRequestCount",sub="Tables",cluster=~"$cluster"}[1m])) by (tables_name)
           

最后附上出自同一个大佬的

relabel_configs 与 metric_relabel_configs 区别

https://www.robustperception.io/relabel_configs-vs-metric_relabel_configs