VictoriaMetrics/lib/promscrape/relabel_debug.qtpl

153 lines
5 KiB
Text
Raw Normal View History

{% import (
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promrelabel"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils"
) %}
{% stripspace %}
{% func MetricRelabelDebugSteps(dss []promrelabel.DebugStep, metric, relabelConfigs string, err error) %}
<!DOCTYPE html>
<html lang="en">
<head>
{%= commonHeader() %}
<title>Metric relabel debug</title>
</head>
<body>
{%= navbar() %}
<div class="container-fluid">
<a href="https://docs.victoriametrics.com/relabeling.html" target="_blank">Relabeling docs</a><br/>
{% if err != nil %}
{%= errorNotification(err) %}
{% endif %}
<div class="m-3">
<form method="POST">
<div>
Relabel configs:<br/>
<textarea name="relabel_configs" style="width: 50%; height: 10em">{%s relabelConfigs %}</textarea>
</div>
<div>
Metric with labels:<br/>
<textarea name="metric" style="width: 50%">{%s metric %}</textarea>
</div>
<input type="submit" value="Submit" />
</form>
</div>
<div class="row">
<main class="col-12">
{%= relabelDebugSteps(dss) %}
</main>
</div>
</div>
</body>
</html>
{% endfunc %}
{% func TargetRelabelDebugSteps(dss []promrelabel.DebugStep) %}
<!DOCTYPE html>
<html lang="en">
<head>
{%= commonHeader() %}
<title>Target relabel debug</title>
</head>
<body>
{%= navbar() %}
<div class="container-fluid">
<a href="https://docs.victoriametrics.com/relabeling.html" target="_blank">Relabeling docs</a><br/>
<div class="row">
<main class="col-12">
{%= relabelDebugSteps(dss) %}
</main>
</div>
</div>
</body>
</html>
{% endfunc %}
{% func relabelDebugSteps(dss []promrelabel.DebugStep) %}
{% if len(dss) > 0 %}
<div class="m-3">
<b>Original labels:</b> <samp>{%= mustFormatLabels(dss[0].In) %}</samp>
</div>
{% endif %}
<table class="table table-striped table-hover table-bordered table-sm">
<thead>
<tr>
<th scope="col" style="width: 5%">Step</th>
<th scope="col" style="width: 25%">Relabeling Rule</th>
<th scope="col" style="width: 35%">Input Labels</th>
<th scope="col" stile="width: 35%">Output labels</a>
</tr>
</thead>
<tbody>
{% for i, ds := range dss %}
{% code
inLabels := promutils.MustNewLabelsFromString(ds.In)
outLabels := promutils.MustNewLabelsFromString(ds.Out)
changedLabels := getChangedLabelNames(inLabels, outLabels)
%}
<tr>
<td>{%d i %}</td>
<td><b><pre class="m-2">{%s ds.Rule %}</pre></b></td>
<td>
<div class="m-2" style="font-size: 0.9em" title="deleted and updated labels highlighted in red">
{%= labelsWithHighlight(inLabels, changedLabels, "red") %}
</div>
</td>
<td>
<div class="m-2" style="font-size: 0.9em" title="added and updated labels highlighted in blue">
{%= labelsWithHighlight(outLabels, changedLabels, "blue") %}
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if len(dss) > 0 %}
<div class="m-3">
<b>Resulting labels:</b> <samp>{%= mustFormatLabels(dss[len(dss)-1].Out) %}</samp>
</div>
{% endif %}
{% endfunc %}
{% func labelsWithHighlight(labels *promutils.Labels, highlight map[string]struct{}, color string) %}
{% code
labelsList := labels.GetLabels()
metricName := ""
for i, label := range labelsList {
if label.Name == "__name__" {
metricName = label.Value
labelsList = append(labelsList[:i], labelsList[i+1:]...)
break
}
}
%}
{% if metricName != "" %}
{% if _, ok := highlight["__name__"]; ok %}
<span style="font-weight:bold;color:{%s color %}">{%s metricName %}</span>
{% else %}
{%s metricName %}
{% endif %}
{% if len(labelsList) == 0 %}{% return %}{% endif %}
{% endif %}
{
{% for i, label := range labelsList %}
{% if _, ok := highlight[label.Name]; ok %}
<span style="font-weight:bold;color:{%s color %}">{%s label.Name %}={%q label.Value %}</span>
{% else %}
{%s label.Name %}={%q label.Value %}
{% endif %}
{% if i < len(labelsList)-1 %},{% space %}{% endif %}
{% endfor %}
}
{% endfunc %}
{% func mustFormatLabels(s string) %}
{% code labels := promutils.MustNewLabelsFromString(s) %}
{%= labelsWithHighlight(labels, nil, "") %}
{% endfunc %}
{% endstripspace %}