import yaml
+from .util import replace_grafana_expr_variables
+
@dataclass
class InputSeries:
for variable, value in self.variables.items():
expr = self.promql_expr_test.expr
- regex = fr'\${variable}(?=\W)'
- new_expr = re.sub(regex, fr'{str(value)}', expr)
+ new_expr = replace_grafana_expr_variables(expr, variable, value)
self.set_expression(new_expr)
test_as_dict = asdict(self.test_file)
import json
+import re
from pathlib import Path
from typing import Any, Dict, Tuple, Union
for variable in dashboard_data['templating']['list']:
if 'name' in variable:
data['variables'][variable['name']] = 'UNSET VARIABLE'
+
+
+def replace_grafana_expr_variables(expr: str, variable: str, value: Any) -> str:
+ """ Replace grafana variables in expression with a value
+
+ It should match the whole word, 'osd' musn't match with the 'osd' prefix in 'osd_hosts'
+ >>> replace_grafana_expr_variables('metric{name~="$osd_hosts|$other|$osd"}', \
+ 'osd', 'replacement')
+ 'metric{name~="$osd_hosts|$other|replacement"}'
+
+ >>> replace_grafana_expr_variables('metric{name~="$osd_hosts|$other|$osd"}', \
+ 'other', 'replacement')
+ 'metric{name~="$osd_hosts|replacement|$osd"}'
+
+ It replaces words with dollar prefix
+ >>> replace_grafana_expr_variables('metric{name~="no_dollar|$other|$osd"}', \
+ 'no_dollar', 'replacement')
+ 'metric{name~="no_dollar|$other|$osd"}'
+ """
+ regex = fr'\${variable}(?=\W)'
+ new_expr = re.sub(regex, fr'{str(value)}', expr)
+ return new_expr