先描述一下情况,我使用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