前言
最近对公司的Kafka 集群集成了 exporter + prometheus + granfana 服务,我们将 topic 变量抽象成模板变量,此时发现 granfana 变量有 10k 的个数限制。导致我们显示 topic 名称不全。
效果如下:全选后只有 10k 个变量。

解决
一番百度后,发现 granfana 没有修改这个限制的计划,并且开发者认为 超过数千个选定值的模板变量可能会导致服务崩溃。
推荐方案
并且开发者推荐了,通过将多个模板变量连接在一起来解决此类问题。
类似于:
具体实现
那我们也只能使用上面的方案,类似于前面加一个前缀过滤变量。通过前缀来过滤下级的 topic 名称。
-
新建一个
custom类型的变量

-
传入自定义参数内容
-
效果如下

-
新建"下级"变量
新建一个名称叫 topic 的query 类型的变量

5. query 查询语句

我这里的query 语句
label_values(kafka_log_log_size{topic=~"$prefix.*"}, topic)
这里的query 语句,大家可以参考grafana + Prometheus 的文档
https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels
https://yunlzheng.gitbook.io/prometheus-book/part-ii-prometheus-jin-jie/grafana/templating
- 最终实现:


扩展
grafana里prometheus查询语法
| 名称 | 描述 |
|---|---|
| label_values(label) | 返回Promthues所有监控指标中,标签名为label的所有可选值 |
| label_values(metric, label) | 返回Promthues所有监控指标metric中,标签名为label的所有可选值 |
| metrics(metric) | 返回所有指标名称满足metric定义正则表达式的指标名称 |
| query_result(query) | 返回prometheus查询语句的查询结果 |
Prometheus匹配模式
匹配模式
- 完全匹配
- 正则匹配
完全匹配
语法:
key = "value"
key != "value"
查询状态码为200的:
http_server_requests_seconds_count{application="hubble-biz-aiops", uri="/actuator/metrics",status="200"}
查询状态码为非200的:
http_server_requests_seconds_count{application="hubble-biz-aiops", uri="/actuator/metrics",status!="200"}
正则匹配
正则匹配分为正向匹配和反向匹配:
- 正向匹配:使用
label=~regx表示选择那些标签符合正则表达式定义的时间序列。 - 反向匹配:使用
label!~regx进行排除。
案例:
我想查询指标 kafka_log_log_size中,所有 topic 标签以 “a” 开头的记录,那么我的表达式为:
kafka_log_log_size{topic=~"a.*"}
参考
- https://community.grafana.com/t/size-limit-in-templating-variables/8920
- https://github.com/grafana/grafana/issues/12664



















