lib/promrelabel: prevent panic caused by invalid label name or value in debug interface

### Describe Your Changes

Previously, invalid label name or value could cause a panic of vmselect
or vmsingle as it was using MustNewLabelsFromString which was added for
usage in tests only.

Fix this by properly handling and propagating error to user interface if
there is any.

See: https://github.com/VictoriaMetrics/VictoriaMetrics/issues/8661

Signed-off-by: Zakhar Bessarab <z.bessarab@victoriametrics.com>
This commit is contained in:
Zakhar Bessarab
2025-05-30 21:22:48 +04:00
committed by GitHub
parent b1582b3012
commit aef59d9281
5 changed files with 369 additions and 248 deletions

View File

@@ -154,13 +154,13 @@ const Relabel: FC = () => {
<div className="vm-relabeling-steps-item__row">
<span>Input Labels:</span>
<code>
<pre dangerouslySetInnerHTML={{ __html: step.inLabels }}/>
<pre dangerouslySetInnerHTML={{ __html: step.errors?.inLabels || step.inLabels }}/>
</code>
</div>
<div className="vm-relabeling-steps-item__row">
<span>Output labels:</span>
<code>
<pre dangerouslySetInnerHTML={{ __html: step.outLabels }}/>
<pre dangerouslySetInnerHTML={{ __html: step.errors?.outLabels || step.outLabels }}/>
</code>
</div>
</div>

View File

@@ -138,6 +138,10 @@ export interface RelabelStep {
rule: string;
inLabels: string;
outLabels: string;
errors: {
inLabels: string;
outLabels: string;
}
}
export interface RelabelData {

View File

@@ -26,6 +26,7 @@ See also [LTS releases](https://docs.victoriametrics.com/victoriametrics/lts-rel
* BUGFIX: [vmalert-tool](https://docs.victoriametrics.com/victoriametrics/vmalert-tool/): fix access conflicts for the temporary test folder when multiple users run tests on the same host. Thanks to @evkuzin for the [pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/9015).
* BUGFIX: [alerts](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/deployment/docker/rules): fix the alerting rule `ScrapePoolHasNoTargets`. Previously, it may cause false positive in [sharding mode](https://docs.victoriametrics.com/victoriametrics/vmagent/#scraping-big-number-of-targets).
* BUGFIX: [vmsingle](https://docs.victoriametrics.com/victoriametrics/single-server-victoriametrics/) and `vmstorage` in [VictoriaMetrics cluster](https://docs.victoriametrics.com/cluster-victoriametrics/): fixed a regression in downsampling logic introduced in [#7440](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/7440) and released in [v1.106.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.106.0), where downsampling rules with filters `filter:offset:interval` could be incorrectly skipped in favor of unfiltered rules `offset:interval`. See [#8969](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/8969).
* BUGFIX: [vmsingle](https://docs.victoriametrics.com/victoriametrics/single-server-victoriametrics/) and `vmselect` in [VictoriaMetrics cluster](https://docs.victoriametrics.com/cluster-victoriametrics/): prevent panic caused by invalid label name in metric relabeling debugging interface. Error is now properly propagated and displayed in the interface. See [#8661](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/8661).
## [v1.118.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.118.0)

View File

@@ -100,22 +100,36 @@ function submitRelabelDebugForm(e) {
<tbody>
{% for i, ds := range dss %}
{% code
inLabels := promutil.MustNewLabelsFromString(ds.In)
outLabels := promutil.MustNewLabelsFromString(ds.Out)
inLabels, inErr := promutil.NewLabelsFromString(ds.In)
outLabels, outErr := promutil.NewLabelsFromString(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, "#D15757") %}
</div>
{% if inErr == nil %}
<div class="m-2" style="font-size: 0.9em" title="deleted and updated labels highlighted in red">
{%= labelsWithHighlight(inLabels, changedLabels, "#D15757") %}
</div>
{% else %}
<div class="m-2" style="font-size: 0.9em; color: red" title="error parsing input labels">
<pre>{%s inErr.Error() %}</pre>
</div>
{% break %}
{% endif %}
</td>
<td>
<div class="m-2" style="font-size: 0.9em" title="added and updated labels highlighted in blue">
{%= labelsWithHighlight(outLabels, changedLabels, "#4495e0") %}
</div>
{% if outErr == nil %}
<div class="m-2" style="font-size: 0.9em" title="added and updated labels highlighted in blue">
{%= labelsWithHighlight(outLabels, changedLabels, "#4495e0") %}
</div>
{% else %}
<div class="m-2" style="font-size: 0.9em; color: red" title="error parsing output labels">
<pre>{%s outErr.Error() %}</pre>
</div>
{% break %}
{% endif %}
</td>
</tr>
{% endfor %}
@@ -143,26 +157,39 @@ function submitRelabelDebugForm(e) {
"status": "error",
"error": {%q= fmt.Sprintf("Error: %s", err) %}
{% else %}
{% code var hasError bool %}
"status": "success",
{% if len(dss) > 0 %}
"originalLabels": {%q= mustFormatLabels(dss[0].In) %},
"resultingLabels": {%q= mustFormatLabels(dss[len(dss)-1].Out) %},
{% endif %}
"steps": [
{% for i, ds := range dss %}
{% code
inLabels := promutil.MustNewLabelsFromString(ds.In)
outLabels := promutil.MustNewLabelsFromString(ds.Out)
inLabels, inErr := promutil.NewLabelsFromString(ds.In)
outLabels, outErr := promutil.NewLabelsFromString(ds.Out)
changedLabels := getChangedLabelNames(inLabels, outLabels)
%}
{
"inLabels": {%q= labelsWithHighlight(inLabels, changedLabels, "#D15757") %},
"outLabels": {%q= labelsWithHighlight(outLabels, changedLabels, "#4495e0") %},
"rule": {%q= ds.Rule %}
"rule": {%q= ds.Rule %},
"errors": {
{% if inErr != nil %}
"inLabels": {%q= `<span style="color: #D15757">`+inErr.Error()+`</span>` %}{% if outErr != nil %},{% endif %}
{%code hasError = true %}
{% else %}
{% endif %}
{% if outErr != nil %}
"outLabels": {%q= `<span style="color: #D15757">`+outErr.Error()+`</span>` %}
{%code hasError = true %}
{% endif %}
}
}
{% if i != len(dss)-1 %},{% endif %}
{% endfor %}
]
{% if len(dss) > 0 && !hasError %}
,
"originalLabels": {%q= mustFormatLabels(dss[0].In) %},
"resultingLabels": {%q= mustFormatLabels(dss[len(dss)-1].Out) %}
{% endif %}
{% endif %}
}
{% endfunc %}
@@ -200,8 +227,12 @@ function submitRelabelDebugForm(e) {
{% endfunc %}
{% func mustFormatLabels(s string) %}
{% code labels := promutil.MustNewLabelsFromString(s) %}
{%= labelsWithHighlight(labels, nil, "") %}
{% code labels, err := promutil.NewLabelsFromString(s) %}
{% if err != nil %}
<span style="color: red" title="error parsing labels: {%s err.Error() %}">{%s "error parsing labels: " + err.Error() %}</span>
{% else %}
{%= labelsWithHighlight(labels, nil, "") %}
{% endif %}
{% endfunc %}
{% endstripspace %}

View File

@@ -236,8 +236,8 @@ func streamrelabelDebugSteps(qw422016 *qt422016.Writer, dss []DebugStep, targetU
//line lib/promrelabel/debug.qtpl:101
for i, ds := range dss {
//line lib/promrelabel/debug.qtpl:103
inLabels := promutil.MustNewLabelsFromString(ds.In)
outLabels := promutil.MustNewLabelsFromString(ds.Out)
inLabels, inErr := promutil.NewLabelsFromString(ds.In)
outLabels, outErr := promutil.NewLabelsFromString(ds.Out)
changedLabels := getChangedLabelNames(inLabels, outLabels)
//line lib/promrelabel/debug.qtpl:106
@@ -249,189 +249,258 @@ func streamrelabelDebugSteps(qw422016 *qt422016.Writer, dss []DebugStep, targetU
//line lib/promrelabel/debug.qtpl:109
qw422016.E().S(ds.Rule)
//line lib/promrelabel/debug.qtpl:109
qw422016.N().S(`</pre></b></td><td><div class="m-2" style="font-size: 0.9em" title="deleted and updated labels highlighted in red">`)
//line lib/promrelabel/debug.qtpl:112
streamlabelsWithHighlight(qw422016, inLabels, changedLabels, "#D15757")
//line lib/promrelabel/debug.qtpl:112
qw422016.N().S(`</div></td><td><div class="m-2" style="font-size: 0.9em" title="added and updated labels highlighted in blue">`)
//line lib/promrelabel/debug.qtpl:117
streamlabelsWithHighlight(qw422016, outLabels, changedLabels, "#4495e0")
//line lib/promrelabel/debug.qtpl:117
qw422016.N().S(`</div></td></tr>`)
//line lib/promrelabel/debug.qtpl:121
}
//line lib/promrelabel/debug.qtpl:121
qw422016.N().S(`</tbody></table>`)
//line lib/promrelabel/debug.qtpl:124
if len(dss) > 0 {
//line lib/promrelabel/debug.qtpl:124
qw422016.N().S(`<div class="m-3"><b>Resulting labels:</b> <samp>`)
//line lib/promrelabel/debug.qtpl:126
streammustFormatLabels(qw422016, dss[len(dss)-1].Out)
//line lib/promrelabel/debug.qtpl:126
qw422016.N().S(`</samp>`)
//line lib/promrelabel/debug.qtpl:127
if targetURL != "" {
//line lib/promrelabel/debug.qtpl:127
qw422016.N().S(`<div><b>Target URL:</b>`)
//line lib/promrelabel/debug.qtpl:129
qw422016.N().S(` `)
//line lib/promrelabel/debug.qtpl:129
qw422016.N().S(`<a href="`)
//line lib/promrelabel/debug.qtpl:129
qw422016.E().S(targetURL)
//line lib/promrelabel/debug.qtpl:129
qw422016.N().S(`" target="_blank">`)
//line lib/promrelabel/debug.qtpl:129
qw422016.E().S(targetURL)
//line lib/promrelabel/debug.qtpl:129
qw422016.N().S(`</a>`)
//line lib/promrelabel/debug.qtpl:130
if targetID != "" {
//line lib/promrelabel/debug.qtpl:131
qw422016.N().S(` `)
//line lib/promrelabel/debug.qtpl:131
qw422016.N().S(`(<a href="target_response?id=`)
//line lib/promrelabel/debug.qtpl:132
qw422016.E().S(targetID)
//line lib/promrelabel/debug.qtpl:132
qw422016.N().S(`" target="_blank" title="click to fetch target response on behalf of the scraper">response</a>)`)
//line lib/promrelabel/debug.qtpl:133
}
//line lib/promrelabel/debug.qtpl:133
qw422016.N().S(`</pre></b></td><td>`)
//line lib/promrelabel/debug.qtpl:111
if inErr == nil {
//line lib/promrelabel/debug.qtpl:111
qw422016.N().S(`<div class="m-2" style="font-size: 0.9em" title="deleted and updated labels highlighted in red">`)
//line lib/promrelabel/debug.qtpl:113
streamlabelsWithHighlight(qw422016, inLabels, changedLabels, "#D15757")
//line lib/promrelabel/debug.qtpl:113
qw422016.N().S(`</div>`)
//line lib/promrelabel/debug.qtpl:135
//line lib/promrelabel/debug.qtpl:115
} else {
//line lib/promrelabel/debug.qtpl:115
qw422016.N().S(`<div class="m-2" style="font-size: 0.9em; color: red" title="error parsing input labels"><pre>`)
//line lib/promrelabel/debug.qtpl:117
qw422016.E().S(inErr.Error())
//line lib/promrelabel/debug.qtpl:117
qw422016.N().S(`</pre></div>`)
//line lib/promrelabel/debug.qtpl:119
break
//line lib/promrelabel/debug.qtpl:120
}
//line lib/promrelabel/debug.qtpl:120
qw422016.N().S(`</td><td>`)
//line lib/promrelabel/debug.qtpl:123
if outErr == nil {
//line lib/promrelabel/debug.qtpl:123
qw422016.N().S(`<div class="m-2" style="font-size: 0.9em" title="added and updated labels highlighted in blue">`)
//line lib/promrelabel/debug.qtpl:125
streamlabelsWithHighlight(qw422016, outLabels, changedLabels, "#4495e0")
//line lib/promrelabel/debug.qtpl:125
qw422016.N().S(`</div>`)
//line lib/promrelabel/debug.qtpl:127
} else {
//line lib/promrelabel/debug.qtpl:127
qw422016.N().S(`<div class="m-2" style="font-size: 0.9em; color: red" title="error parsing output labels"><pre>`)
//line lib/promrelabel/debug.qtpl:129
qw422016.E().S(outErr.Error())
//line lib/promrelabel/debug.qtpl:129
qw422016.N().S(`</pre></div>`)
//line lib/promrelabel/debug.qtpl:131
break
//line lib/promrelabel/debug.qtpl:132
}
//line lib/promrelabel/debug.qtpl:132
qw422016.N().S(`</td></tr>`)
//line lib/promrelabel/debug.qtpl:135
qw422016.N().S(`</div>`)
//line lib/promrelabel/debug.qtpl:137
}
//line lib/promrelabel/debug.qtpl:135
qw422016.N().S(`</tbody></table>`)
//line lib/promrelabel/debug.qtpl:138
}
if len(dss) > 0 {
//line lib/promrelabel/debug.qtpl:138
func writerelabelDebugSteps(qq422016 qtio422016.Writer, dss []DebugStep, targetURL, targetID string) {
//line lib/promrelabel/debug.qtpl:138
qw422016 := qt422016.AcquireWriter(qq422016)
//line lib/promrelabel/debug.qtpl:138
streamrelabelDebugSteps(qw422016, dss, targetURL, targetID)
//line lib/promrelabel/debug.qtpl:138
qt422016.ReleaseWriter(qw422016)
//line lib/promrelabel/debug.qtpl:138
}
//line lib/promrelabel/debug.qtpl:138
func relabelDebugSteps(dss []DebugStep, targetURL, targetID string) string {
//line lib/promrelabel/debug.qtpl:138
qb422016 := qt422016.AcquireByteBuffer()
//line lib/promrelabel/debug.qtpl:138
writerelabelDebugSteps(qb422016, dss, targetURL, targetID)
//line lib/promrelabel/debug.qtpl:138
qs422016 := string(qb422016.B)
//line lib/promrelabel/debug.qtpl:138
qt422016.ReleaseByteBuffer(qb422016)
//line lib/promrelabel/debug.qtpl:138
return qs422016
//line lib/promrelabel/debug.qtpl:138
}
qw422016.N().S(`<div class="m-3"><b>Resulting labels:</b> <samp>`)
//line lib/promrelabel/debug.qtpl:140
func StreamRelabelDebugStepsJSON(qw422016 *qt422016.Writer, targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) {
streammustFormatLabels(qw422016, dss[len(dss)-1].Out)
//line lib/promrelabel/debug.qtpl:140
qw422016.N().S(`{`)
//line lib/promrelabel/debug.qtpl:142
if err != nil {
//line lib/promrelabel/debug.qtpl:142
qw422016.N().S(`"status": "error","error":`)
qw422016.N().S(`</samp>`)
//line lib/promrelabel/debug.qtpl:141
if targetURL != "" {
//line lib/promrelabel/debug.qtpl:141
qw422016.N().S(`<div><b>Target URL:</b>`)
//line lib/promrelabel/debug.qtpl:143
qw422016.N().S(` `)
//line lib/promrelabel/debug.qtpl:143
qw422016.N().S(`<a href="`)
//line lib/promrelabel/debug.qtpl:143
qw422016.E().S(targetURL)
//line lib/promrelabel/debug.qtpl:143
qw422016.N().S(`" target="_blank">`)
//line lib/promrelabel/debug.qtpl:143
qw422016.E().S(targetURL)
//line lib/promrelabel/debug.qtpl:143
qw422016.N().S(`</a>`)
//line lib/promrelabel/debug.qtpl:144
qw422016.N().Q(fmt.Sprintf("Error: %s", err))
if targetID != "" {
//line lib/promrelabel/debug.qtpl:145
} else {
qw422016.N().S(` `)
//line lib/promrelabel/debug.qtpl:145
qw422016.N().S(`"status": "success",`)
qw422016.N().S(`(<a href="target_response?id=`)
//line lib/promrelabel/debug.qtpl:146
qw422016.E().S(targetID)
//line lib/promrelabel/debug.qtpl:146
qw422016.N().S(`" target="_blank" title="click to fetch target response on behalf of the scraper">response</a>)`)
//line lib/promrelabel/debug.qtpl:147
if len(dss) > 0 {
}
//line lib/promrelabel/debug.qtpl:147
qw422016.N().S(`"originalLabels":`)
//line lib/promrelabel/debug.qtpl:148
qw422016.N().Q(mustFormatLabels(dss[0].In))
//line lib/promrelabel/debug.qtpl:148
qw422016.N().S(`,"resultingLabels":`)
qw422016.N().S(`</div>`)
//line lib/promrelabel/debug.qtpl:149
qw422016.N().Q(mustFormatLabels(dss[len(dss)-1].Out))
//line lib/promrelabel/debug.qtpl:149
qw422016.N().S(`,`)
//line lib/promrelabel/debug.qtpl:150
}
//line lib/promrelabel/debug.qtpl:150
qw422016.N().S(`"steps": [`)
//line lib/promrelabel/debug.qtpl:149
qw422016.N().S(`</div>`)
//line lib/promrelabel/debug.qtpl:151
}
//line lib/promrelabel/debug.qtpl:152
for i, ds := range dss {
}
//line lib/promrelabel/debug.qtpl:152
func writerelabelDebugSteps(qq422016 qtio422016.Writer, dss []DebugStep, targetURL, targetID string) {
//line lib/promrelabel/debug.qtpl:152
qw422016 := qt422016.AcquireWriter(qq422016)
//line lib/promrelabel/debug.qtpl:152
streamrelabelDebugSteps(qw422016, dss, targetURL, targetID)
//line lib/promrelabel/debug.qtpl:152
qt422016.ReleaseWriter(qw422016)
//line lib/promrelabel/debug.qtpl:152
}
//line lib/promrelabel/debug.qtpl:152
func relabelDebugSteps(dss []DebugStep, targetURL, targetID string) string {
//line lib/promrelabel/debug.qtpl:152
qb422016 := qt422016.AcquireByteBuffer()
//line lib/promrelabel/debug.qtpl:152
writerelabelDebugSteps(qb422016, dss, targetURL, targetID)
//line lib/promrelabel/debug.qtpl:152
qs422016 := string(qb422016.B)
//line lib/promrelabel/debug.qtpl:152
qt422016.ReleaseByteBuffer(qb422016)
//line lib/promrelabel/debug.qtpl:152
return qs422016
//line lib/promrelabel/debug.qtpl:152
}
//line lib/promrelabel/debug.qtpl:154
inLabels := promutil.MustNewLabelsFromString(ds.In)
outLabels := promutil.MustNewLabelsFromString(ds.Out)
func StreamRelabelDebugStepsJSON(qw422016 *qt422016.Writer, targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) {
//line lib/promrelabel/debug.qtpl:154
qw422016.N().S(`{`)
//line lib/promrelabel/debug.qtpl:156
if err != nil {
//line lib/promrelabel/debug.qtpl:156
qw422016.N().S(`"status": "error","error":`)
//line lib/promrelabel/debug.qtpl:158
qw422016.N().Q(fmt.Sprintf("Error: %s", err))
//line lib/promrelabel/debug.qtpl:159
} else {
//line lib/promrelabel/debug.qtpl:160
var hasError bool
//line lib/promrelabel/debug.qtpl:160
qw422016.N().S(`"status": "success","steps": [`)
//line lib/promrelabel/debug.qtpl:163
for i, ds := range dss {
//line lib/promrelabel/debug.qtpl:165
inLabels, inErr := promutil.NewLabelsFromString(ds.In)
outLabels, outErr := promutil.NewLabelsFromString(ds.Out)
changedLabels := getChangedLabelNames(inLabels, outLabels)
//line lib/promrelabel/debug.qtpl:157
//line lib/promrelabel/debug.qtpl:168
qw422016.N().S(`{"inLabels":`)
//line lib/promrelabel/debug.qtpl:159
qw422016.N().Q(labelsWithHighlight(inLabels, changedLabels, "#D15757"))
//line lib/promrelabel/debug.qtpl:159
qw422016.N().S(`,"outLabels":`)
//line lib/promrelabel/debug.qtpl:160
qw422016.N().Q(labelsWithHighlight(outLabels, changedLabels, "#4495e0"))
//line lib/promrelabel/debug.qtpl:160
qw422016.N().S(`,"rule":`)
//line lib/promrelabel/debug.qtpl:161
qw422016.N().Q(ds.Rule)
//line lib/promrelabel/debug.qtpl:161
qw422016.N().S(`}`)
//line lib/promrelabel/debug.qtpl:163
if i != len(dss)-1 {
//line lib/promrelabel/debug.qtpl:163
qw422016.N().S(`,`)
//line lib/promrelabel/debug.qtpl:163
}
//line lib/promrelabel/debug.qtpl:164
}
//line lib/promrelabel/debug.qtpl:164
qw422016.N().S(`]`)
//line lib/promrelabel/debug.qtpl:166
}
//line lib/promrelabel/debug.qtpl:166
qw422016.N().S(`}`)
//line lib/promrelabel/debug.qtpl:168
}
//line lib/promrelabel/debug.qtpl:168
func WriteRelabelDebugStepsJSON(qq422016 qtio422016.Writer, targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) {
//line lib/promrelabel/debug.qtpl:168
qw422016 := qt422016.AcquireWriter(qq422016)
//line lib/promrelabel/debug.qtpl:168
StreamRelabelDebugStepsJSON(qw422016, targetURL, targetID, dss, metric, relabelConfigs, err)
//line lib/promrelabel/debug.qtpl:168
qt422016.ReleaseWriter(qw422016)
//line lib/promrelabel/debug.qtpl:168
}
//line lib/promrelabel/debug.qtpl:168
func RelabelDebugStepsJSON(targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) string {
//line lib/promrelabel/debug.qtpl:168
qb422016 := qt422016.AcquireByteBuffer()
//line lib/promrelabel/debug.qtpl:168
WriteRelabelDebugStepsJSON(qb422016, targetURL, targetID, dss, metric, relabelConfigs, err)
//line lib/promrelabel/debug.qtpl:168
qs422016 := string(qb422016.B)
//line lib/promrelabel/debug.qtpl:168
qt422016.ReleaseByteBuffer(qb422016)
//line lib/promrelabel/debug.qtpl:168
return qs422016
//line lib/promrelabel/debug.qtpl:168
}
//line lib/promrelabel/debug.qtpl:170
func streamlabelsWithHighlight(qw422016 *qt422016.Writer, labels *promutil.Labels, highlight map[string]struct{}, color string) {
qw422016.N().Q(labelsWithHighlight(inLabels, changedLabels, "#D15757"))
//line lib/promrelabel/debug.qtpl:170
qw422016.N().S(`,"outLabels":`)
//line lib/promrelabel/debug.qtpl:171
qw422016.N().Q(labelsWithHighlight(outLabels, changedLabels, "#4495e0"))
//line lib/promrelabel/debug.qtpl:171
qw422016.N().S(`,"rule":`)
//line lib/promrelabel/debug.qtpl:172
qw422016.N().Q(ds.Rule)
//line lib/promrelabel/debug.qtpl:172
qw422016.N().S(`,"errors": {`)
//line lib/promrelabel/debug.qtpl:174
if inErr != nil {
//line lib/promrelabel/debug.qtpl:174
qw422016.N().S(`"inLabels":`)
//line lib/promrelabel/debug.qtpl:175
qw422016.N().Q(`<span style="color: #D15757">` + inErr.Error() + `</span>`)
//line lib/promrelabel/debug.qtpl:175
if outErr != nil {
//line lib/promrelabel/debug.qtpl:175
qw422016.N().S(`,`)
//line lib/promrelabel/debug.qtpl:175
}
//line lib/promrelabel/debug.qtpl:176
hasError = true
//line lib/promrelabel/debug.qtpl:177
} else {
//line lib/promrelabel/debug.qtpl:178
}
//line lib/promrelabel/debug.qtpl:179
if outErr != nil {
//line lib/promrelabel/debug.qtpl:179
qw422016.N().S(`"outLabels":`)
//line lib/promrelabel/debug.qtpl:180
qw422016.N().Q(`<span style="color: #D15757">` + outErr.Error() + `</span>`)
//line lib/promrelabel/debug.qtpl:181
hasError = true
//line lib/promrelabel/debug.qtpl:182
}
//line lib/promrelabel/debug.qtpl:182
qw422016.N().S(`}}`)
//line lib/promrelabel/debug.qtpl:185
if i != len(dss)-1 {
//line lib/promrelabel/debug.qtpl:185
qw422016.N().S(`,`)
//line lib/promrelabel/debug.qtpl:185
}
//line lib/promrelabel/debug.qtpl:186
}
//line lib/promrelabel/debug.qtpl:186
qw422016.N().S(`]`)
//line lib/promrelabel/debug.qtpl:188
if len(dss) > 0 && !hasError {
//line lib/promrelabel/debug.qtpl:188
qw422016.N().S(`,"originalLabels":`)
//line lib/promrelabel/debug.qtpl:190
qw422016.N().Q(mustFormatLabels(dss[0].In))
//line lib/promrelabel/debug.qtpl:190
qw422016.N().S(`,"resultingLabels":`)
//line lib/promrelabel/debug.qtpl:191
qw422016.N().Q(mustFormatLabels(dss[len(dss)-1].Out))
//line lib/promrelabel/debug.qtpl:191
qw422016.N().S(`,`)
//line lib/promrelabel/debug.qtpl:192
}
//line lib/promrelabel/debug.qtpl:193
}
//line lib/promrelabel/debug.qtpl:193
qw422016.N().S(`}`)
//line lib/promrelabel/debug.qtpl:195
}
//line lib/promrelabel/debug.qtpl:195
func WriteRelabelDebugStepsJSON(qq422016 qtio422016.Writer, targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) {
//line lib/promrelabel/debug.qtpl:195
qw422016 := qt422016.AcquireWriter(qq422016)
//line lib/promrelabel/debug.qtpl:195
StreamRelabelDebugStepsJSON(qw422016, targetURL, targetID, dss, metric, relabelConfigs, err)
//line lib/promrelabel/debug.qtpl:195
qt422016.ReleaseWriter(qw422016)
//line lib/promrelabel/debug.qtpl:195
}
//line lib/promrelabel/debug.qtpl:195
func RelabelDebugStepsJSON(targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) string {
//line lib/promrelabel/debug.qtpl:195
qb422016 := qt422016.AcquireByteBuffer()
//line lib/promrelabel/debug.qtpl:195
WriteRelabelDebugStepsJSON(qb422016, targetURL, targetID, dss, metric, relabelConfigs, err)
//line lib/promrelabel/debug.qtpl:195
qs422016 := string(qb422016.B)
//line lib/promrelabel/debug.qtpl:195
qt422016.ReleaseByteBuffer(qb422016)
//line lib/promrelabel/debug.qtpl:195
return qs422016
//line lib/promrelabel/debug.qtpl:195
}
//line lib/promrelabel/debug.qtpl:197
func streamlabelsWithHighlight(qw422016 *qt422016.Writer, labels *promutil.Labels, highlight map[string]struct{}, color string) {
//line lib/promrelabel/debug.qtpl:199
labelsList := labels.GetLabels()
metricName := ""
for i, label := range labelsList {
@@ -442,137 +511,153 @@ func streamlabelsWithHighlight(qw422016 *qt422016.Writer, labels *promutil.Label
}
}
//line lib/promrelabel/debug.qtpl:182
//line lib/promrelabel/debug.qtpl:209
if metricName != "" {
//line lib/promrelabel/debug.qtpl:183
//line lib/promrelabel/debug.qtpl:210
if _, ok := highlight["__name__"]; ok {
//line lib/promrelabel/debug.qtpl:183
//line lib/promrelabel/debug.qtpl:210
qw422016.N().S(`<span style="font-weight:bold;color:`)
//line lib/promrelabel/debug.qtpl:184
//line lib/promrelabel/debug.qtpl:211
qw422016.E().S(color)
//line lib/promrelabel/debug.qtpl:184
//line lib/promrelabel/debug.qtpl:211
qw422016.N().S(`">`)
//line lib/promrelabel/debug.qtpl:184
//line lib/promrelabel/debug.qtpl:211
qw422016.E().S(metricName)
//line lib/promrelabel/debug.qtpl:184
//line lib/promrelabel/debug.qtpl:211
qw422016.N().S(`</span>`)
//line lib/promrelabel/debug.qtpl:185
//line lib/promrelabel/debug.qtpl:212
} else {
//line lib/promrelabel/debug.qtpl:186
//line lib/promrelabel/debug.qtpl:213
qw422016.E().S(metricName)
//line lib/promrelabel/debug.qtpl:187
//line lib/promrelabel/debug.qtpl:214
}
//line lib/promrelabel/debug.qtpl:188
//line lib/promrelabel/debug.qtpl:215
if len(labelsList) == 0 {
//line lib/promrelabel/debug.qtpl:188
//line lib/promrelabel/debug.qtpl:215
return
//line lib/promrelabel/debug.qtpl:188
//line lib/promrelabel/debug.qtpl:215
}
//line lib/promrelabel/debug.qtpl:189
//line lib/promrelabel/debug.qtpl:216
}
//line lib/promrelabel/debug.qtpl:189
//line lib/promrelabel/debug.qtpl:216
qw422016.N().S(`{`)
//line lib/promrelabel/debug.qtpl:191
//line lib/promrelabel/debug.qtpl:218
for i, label := range labelsList {
//line lib/promrelabel/debug.qtpl:192
//line lib/promrelabel/debug.qtpl:219
if _, ok := highlight[label.Name]; ok {
//line lib/promrelabel/debug.qtpl:192
//line lib/promrelabel/debug.qtpl:219
qw422016.N().S(`<span style="font-weight:bold;color:`)
//line lib/promrelabel/debug.qtpl:193
//line lib/promrelabel/debug.qtpl:220
qw422016.E().S(color)
//line lib/promrelabel/debug.qtpl:193
//line lib/promrelabel/debug.qtpl:220
qw422016.N().S(`">`)
//line lib/promrelabel/debug.qtpl:193
//line lib/promrelabel/debug.qtpl:220
qw422016.E().S(label.Name)
//line lib/promrelabel/debug.qtpl:193
//line lib/promrelabel/debug.qtpl:220
qw422016.N().S(`=`)
//line lib/promrelabel/debug.qtpl:193
//line lib/promrelabel/debug.qtpl:220
qw422016.E().Q(label.Value)
//line lib/promrelabel/debug.qtpl:193
//line lib/promrelabel/debug.qtpl:220
qw422016.N().S(`</span>`)
//line lib/promrelabel/debug.qtpl:194
//line lib/promrelabel/debug.qtpl:221
} else {
//line lib/promrelabel/debug.qtpl:195
//line lib/promrelabel/debug.qtpl:222
qw422016.E().S(label.Name)
//line lib/promrelabel/debug.qtpl:195
//line lib/promrelabel/debug.qtpl:222
qw422016.N().S(`=`)
//line lib/promrelabel/debug.qtpl:195
//line lib/promrelabel/debug.qtpl:222
qw422016.E().Q(label.Value)
//line lib/promrelabel/debug.qtpl:196
//line lib/promrelabel/debug.qtpl:223
}
//line lib/promrelabel/debug.qtpl:197
//line lib/promrelabel/debug.qtpl:224
if i < len(labelsList)-1 {
//line lib/promrelabel/debug.qtpl:197
//line lib/promrelabel/debug.qtpl:224
qw422016.N().S(`,`)
//line lib/promrelabel/debug.qtpl:197
//line lib/promrelabel/debug.qtpl:224
qw422016.N().S(` `)
//line lib/promrelabel/debug.qtpl:197
//line lib/promrelabel/debug.qtpl:224
}
//line lib/promrelabel/debug.qtpl:198
//line lib/promrelabel/debug.qtpl:225
}
//line lib/promrelabel/debug.qtpl:198
//line lib/promrelabel/debug.qtpl:225
qw422016.N().S(`}`)
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
}
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
func writelabelsWithHighlight(qq422016 qtio422016.Writer, labels *promutil.Labels, highlight map[string]struct{}, color string) {
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
qw422016 := qt422016.AcquireWriter(qq422016)
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
streamlabelsWithHighlight(qw422016, labels, highlight, color)
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
qt422016.ReleaseWriter(qw422016)
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
}
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
func labelsWithHighlight(labels *promutil.Labels, highlight map[string]struct{}, color string) string {
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
qb422016 := qt422016.AcquireByteBuffer()
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
writelabelsWithHighlight(qb422016, labels, highlight, color)
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
qs422016 := string(qb422016.B)
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
qt422016.ReleaseByteBuffer(qb422016)
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
return qs422016
//line lib/promrelabel/debug.qtpl:200
//line lib/promrelabel/debug.qtpl:227
}
//line lib/promrelabel/debug.qtpl:202
//line lib/promrelabel/debug.qtpl:229
func streammustFormatLabels(qw422016 *qt422016.Writer, s string) {
//line lib/promrelabel/debug.qtpl:203
labels := promutil.MustNewLabelsFromString(s)
//line lib/promrelabel/debug.qtpl:230
labels, err := promutil.NewLabelsFromString(s)
//line lib/promrelabel/debug.qtpl:204
streamlabelsWithHighlight(qw422016, labels, nil, "")
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:231
if err != nil {
//line lib/promrelabel/debug.qtpl:231
qw422016.N().S(`<span style="color: red" title="error parsing labels:`)
//line lib/promrelabel/debug.qtpl:232
qw422016.E().S(err.Error())
//line lib/promrelabel/debug.qtpl:232
qw422016.N().S(`">`)
//line lib/promrelabel/debug.qtpl:232
qw422016.E().S("error parsing labels: " + err.Error())
//line lib/promrelabel/debug.qtpl:232
qw422016.N().S(`</span>`)
//line lib/promrelabel/debug.qtpl:233
} else {
//line lib/promrelabel/debug.qtpl:234
streamlabelsWithHighlight(qw422016, labels, nil, "")
//line lib/promrelabel/debug.qtpl:235
}
//line lib/promrelabel/debug.qtpl:236
}
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
func writemustFormatLabels(qq422016 qtio422016.Writer, s string) {
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
qw422016 := qt422016.AcquireWriter(qq422016)
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
streammustFormatLabels(qw422016, s)
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
qt422016.ReleaseWriter(qw422016)
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
}
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
func mustFormatLabels(s string) string {
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
qb422016 := qt422016.AcquireByteBuffer()
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
writemustFormatLabels(qb422016, s)
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
qs422016 := string(qb422016.B)
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
qt422016.ReleaseByteBuffer(qb422016)
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
return qs422016
//line lib/promrelabel/debug.qtpl:205
//line lib/promrelabel/debug.qtpl:236
}