如何以编程方式在grafana面板中为1000个prometheus查询添加额外的标签



我在grafana面板中配置了近1000个prometheus查询,我需要在所有查询中再添加一个标签以获得正确的度量,因为这个标签是最近添加的,用于根据区域区分度量。我知道查询是什么,但在所有1000个查询中手动添加新标签似乎是一项乏味而重复的工作。有没有一种方法可以通过编程将标签添加到现有的查询字符串中(通过在任何编程语言或regex查询模式中使用一些解析库(?

例如,如果我有一个查询:

sum(increase(django_http_responses_total_by_status_view_method_total{view="some_api_function", status="200"}[5m]))

我需要再添加一个标签:

sum(increase(django_http_responses_total_by_status_view_method_total{view="some_api_function", status="200", region="us-east-1"}[5m]))

对于较少数量的查询,手动添加它不是问题,但对于1000个这样的查询,这变得很困难。我甚至能够解析grafana仪表板json,并使用以下片段获取其中的所有查询:

import json
with open("grafana-dashboad.json", "r") as f:
dashboard_data = json.load(f)
panels = dashboard_data["panels"]
queries = []
for panel in panels:
title = panel.get("title")
# print(f"Title: {title}")
targets = panel.get("targets", [])
for target in targets:
query = target["expr"]
queries.append(query)
inner_panels = panel.get("panels", [])
for inner_panel in inner_panels:
inner_targets = inner_panel.get("targets", [])
for inner_target in inner_targets:
query = inner_target["expr"]
queries.append(query)
for query in queries:
print(query)
print(len(queries))

但我不知道如何进一步以编程方式在查询中添加额外的标签。有没有什么最好的方法或库可以自动完成这项工作,而不是一个接一个地手动更新查询?度量是否可以以某种方式解析为python对象,以便更新标签?如果不是python,我也可以使用任何其他语言,只要它能让工作更容易。

我能够将promql查询字符串解析为python对象,并使用这个python库为其添加我自己的标签:https://github.com/pabluk/pygments-promql

from pygments import highlight, lex, format
from pygments.formatters import NullFormatter
from pygments.token import Name, Operator, Literal, Punctuation
from pygments_promql import PromQLLexer
query = 'sum(increase(django_http_responses_total_by_status_view_method_total{view="some_api_function", status="200"}[5m]))'
# print(highlight(query, PromQLLexer(), NullFormatter()))
promql_lex = list(lex(query, PromQLLexer()))
label_start_index = None
for index, token in enumerate(promql_lex):
if list(token)[0] == Name.Label and list(token)[1] == "view":
# print("First label", token, type(list(token)[0]))
label_start_index = index
break
print(format(lex(query, PromQLLexer()), NullFormatter()))
new_label = [(Name.Label, "region"), (Operator, '='), (Punctuation, '"'), (Literal.String, "us-east-1"), (Punctuation, '"'), (Punctuation, ',')]
# print(format(new_label, NullFormatter()))
# print(label_start_index)
promql_lex[label_start_index:label_start_index] = new_label
# print(promql_lex)
print(format(promql_lex, NullFormatter()))

我已经将此代码作为一个函数,并在grafana仪表板解析片段中使用了它,该片段是我在问题中添加的,用于更新仪表板json文件中的所有查询。

最新更新