From f395e5db4950fe59335ce67ad2ac7f5992be5e9e Mon Sep 17 00:00:00 2001 From: Jiekun Date: Sun, 8 Mar 2026 23:17:28 +0800 Subject: [PATCH] relabel debug: support multiple lines metrics input --- lib/promrelabel/debug.go | 35 +- lib/promrelabel/debug.qtpl | 77 ++-- lib/promrelabel/debug.qtpl.go | 736 ++++++++++++++++++---------------- 3 files changed, 450 insertions(+), 398 deletions(-) diff --git a/lib/promrelabel/debug.go b/lib/promrelabel/debug.go index 7c3064a17e..9febe277c6 100644 --- a/lib/promrelabel/debug.go +++ b/lib/promrelabel/debug.go @@ -35,12 +35,6 @@ func writeRelabelDebug(w io.Writer, isTargetRelabel bool, targetID, metric, rela return } - labels, err := promutil.NewLabelsFromString(metric) - if err != nil { - err = fmt.Errorf("cannot parse metric: %w", err) - WriteRelabelDebugSteps(w, targetURL, targetID, format, nil, metric, relabelConfigs, err) - return - } pcs, err := ParseRelabelConfigsData([]byte(relabelConfigs)) if err != nil { err = fmt.Errorf("cannot parse relabel configs: %w", err) @@ -48,8 +42,33 @@ func writeRelabelDebug(w io.Writer, isTargetRelabel bool, targetID, metric, rela return } - dss, targetURL := newDebugRelabelSteps(pcs, labels, isTargetRelabel) - WriteRelabelDebugSteps(w, targetURL, targetID, format, dss, metric, relabelConfigs, nil) + // metric input may contain multiple lines, and it's good to add support and print the debug steps for each of them. + // however, the target URL won't change + metrics := strings.Split(metric, "\n") + dsss := make([][]DebugStep, 0, len(metrics)) + var lastErr error + + for _, m := range metrics { + // try to trim all the special characters and space first + m = strings.TrimSpace(m) + labels, err := promutil.NewLabelsFromString(m) + if err != nil { + lastErr = err + continue + } + dss, tURL := newDebugRelabelSteps(pcs, labels, isTargetRelabel) + targetURL = tURL + dsss = append(dsss, dss) + } + + // break here if all failed + if len(dsss) == 0 && lastErr != nil { + err = fmt.Errorf("cannot parse metric: %w", err) + WriteRelabelDebugSteps(w, targetURL, targetID, format, nil, metric, relabelConfigs, lastErr) + return + } + + WriteRelabelDebugSteps(w, targetURL, targetID, format, dsss, metric, relabelConfigs, nil) } func newDebugRelabelSteps(pcs *ParsedConfigs, labels *promutil.Labels, isTargetRelabel bool) ([]DebugStep, string) { diff --git a/lib/promrelabel/debug.qtpl b/lib/promrelabel/debug.qtpl index f97690cd5b..437d34d7df 100644 --- a/lib/promrelabel/debug.qtpl +++ b/lib/promrelabel/debug.qtpl @@ -6,15 +6,15 @@ {% stripspace %} -{% func RelabelDebugSteps(targetURL, targetID, format string, dss []DebugStep, metric, relabelConfigs string, err error) %} +{% func RelabelDebugSteps(targetURL, targetID, format string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) %} {% if format == "json" %} - {%= RelabelDebugStepsJSON(targetURL, targetID, dss, metric, relabelConfigs, err) %} + {%= RelabelDebugStepsJSON(targetURL, targetID, dsss, metric, relabelConfigs, err) %} {% else %} - {%= RelabelDebugStepsHTML(targetURL, targetID, dss, metric, relabelConfigs, err) %} + {%= RelabelDebugStepsHTML(targetURL, targetID, dsss, metric, relabelConfigs, err) %} {% endif %} {% endfunc %} -{% func RelabelDebugStepsHTML(targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) %} +{% func RelabelDebugStepsHTML(targetURL, targetID string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) %} @@ -60,11 +60,13 @@ function submitRelabelDebugForm(e) { + {% for _, dss := range dsss %}
{%= relabelDebugSteps(dss, targetURL, targetID) %}
+ {% endfor %} @@ -77,7 +79,7 @@ function submitRelabelDebugForm(e) {
- Labels:
+ Labels (One label set per line. Multiple lines will be treated as multiple label sets):
{% endfunc %} @@ -151,45 +153,52 @@ function submitRelabelDebugForm(e) { {% endif %} {% endfunc %} -{% func RelabelDebugStepsJSON(targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) %} +{% func RelabelDebugStepsJSON(targetURL, targetID string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) %} { {% if err != nil %} "status": "error", "error": {%q= fmt.Sprintf("Error: %s", err) %} {% else %} - {% code var hasError bool %} "status": "success", - "steps": [ - {% for i, ds := range dss %} - {% code - inLabels, inErr := promutil.NewLabelsFromString(ds.In) - outLabels, outErr := promutil.NewLabelsFromString(ds.Out) - changedLabels := getChangedLabelNames(inLabels, outLabels) - %} + "metrics": [ + {% for idx, dss := range dsss %} + {% code var hasError bool %} { - "inLabels": {%q= labelsWithHighlight(inLabels, changedLabels, "#D15757") %}, - "outLabels": {%q= labelsWithHighlight(outLabels, changedLabels, "#4495e0") %}, - "rule": {%q= ds.Rule %}, - "errors": { - {% if inErr != nil %} - "inLabels": {%q= ``+inErr.Error()+`` %}{% if outErr != nil %},{% endif %} - {%code hasError = true %} - {% else %} - {% endif %} - {% if outErr != nil %} - "outLabels": {%q= ``+outErr.Error()+`` %} - {%code hasError = true %} - {% endif %} - } + "steps": [ + {% for i, ds := range dss %} + {% code + 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 %}, + "errors": { + {% if inErr != nil %} + "inLabels": {%q= ``+inErr.Error()+`` %}{% if outErr != nil %},{% endif %} + {%code hasError = true %} + {% else %} + {% endif %} + {% if outErr != nil %} + "outLabels": {%q= ``+outErr.Error()+`` %} + {%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 %} } - {% if i != len(dss)-1 %},{% endif %} + {% if idx != len(dsss)-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 %} diff --git a/lib/promrelabel/debug.qtpl.go b/lib/promrelabel/debug.qtpl.go index d9a29dec16..8720d1cac4 100644 --- a/lib/promrelabel/debug.qtpl.go +++ b/lib/promrelabel/debug.qtpl.go @@ -1,504 +1,528 @@ // Code generated by qtc from "debug.qtpl". DO NOT EDIT. // See https://github.com/valyala/quicktemplate for details. -//line lib/promrelabel/debug.qtpl:1 +//line debug.qtpl:1 package promrelabel -//line lib/promrelabel/debug.qtpl:1 +//line debug.qtpl:1 import ( "fmt" "github.com/VictoriaMetrics/VictoriaMetrics/lib/htmlcomponents" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promutil" ) -//line lib/promrelabel/debug.qtpl:9 +//line debug.qtpl:9 import ( qtio422016 "io" qt422016 "github.com/valyala/quicktemplate" ) -//line lib/promrelabel/debug.qtpl:9 +//line debug.qtpl:9 var ( _ = qtio422016.Copy _ = qt422016.AcquireByteBuffer ) -//line lib/promrelabel/debug.qtpl:9 -func StreamRelabelDebugSteps(qw422016 *qt422016.Writer, targetURL, targetID, format string, dss []DebugStep, metric, relabelConfigs string, err error) { -//line lib/promrelabel/debug.qtpl:10 +//line debug.qtpl:9 +func StreamRelabelDebugSteps(qw422016 *qt422016.Writer, targetURL, targetID, format string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) { +//line debug.qtpl:10 if format == "json" { -//line lib/promrelabel/debug.qtpl:11 - StreamRelabelDebugStepsJSON(qw422016, targetURL, targetID, dss, metric, relabelConfigs, err) -//line lib/promrelabel/debug.qtpl:12 +//line debug.qtpl:11 + StreamRelabelDebugStepsJSON(qw422016, targetURL, targetID, dsss, metric, relabelConfigs, err) +//line debug.qtpl:12 } else { -//line lib/promrelabel/debug.qtpl:13 - StreamRelabelDebugStepsHTML(qw422016, targetURL, targetID, dss, metric, relabelConfigs, err) -//line lib/promrelabel/debug.qtpl:14 +//line debug.qtpl:13 + StreamRelabelDebugStepsHTML(qw422016, targetURL, targetID, dsss, metric, relabelConfigs, err) +//line debug.qtpl:14 } -//line lib/promrelabel/debug.qtpl:15 +//line debug.qtpl:15 } -//line lib/promrelabel/debug.qtpl:15 -func WriteRelabelDebugSteps(qq422016 qtio422016.Writer, targetURL, targetID, format string, dss []DebugStep, metric, relabelConfigs string, err error) { -//line lib/promrelabel/debug.qtpl:15 +//line debug.qtpl:15 +func WriteRelabelDebugSteps(qq422016 qtio422016.Writer, targetURL, targetID, format string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) { +//line debug.qtpl:15 qw422016 := qt422016.AcquireWriter(qq422016) -//line lib/promrelabel/debug.qtpl:15 - StreamRelabelDebugSteps(qw422016, targetURL, targetID, format, dss, metric, relabelConfigs, err) -//line lib/promrelabel/debug.qtpl:15 +//line debug.qtpl:15 + StreamRelabelDebugSteps(qw422016, targetURL, targetID, format, dsss, metric, relabelConfigs, err) +//line debug.qtpl:15 qt422016.ReleaseWriter(qw422016) -//line lib/promrelabel/debug.qtpl:15 +//line debug.qtpl:15 } -//line lib/promrelabel/debug.qtpl:15 -func RelabelDebugSteps(targetURL, targetID, format string, dss []DebugStep, metric, relabelConfigs string, err error) string { -//line lib/promrelabel/debug.qtpl:15 +//line debug.qtpl:15 +func RelabelDebugSteps(targetURL, targetID, format string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) string { +//line debug.qtpl:15 qb422016 := qt422016.AcquireByteBuffer() -//line lib/promrelabel/debug.qtpl:15 - WriteRelabelDebugSteps(qb422016, targetURL, targetID, format, dss, metric, relabelConfigs, err) -//line lib/promrelabel/debug.qtpl:15 +//line debug.qtpl:15 + WriteRelabelDebugSteps(qb422016, targetURL, targetID, format, dsss, metric, relabelConfigs, err) +//line debug.qtpl:15 qs422016 := string(qb422016.B) -//line lib/promrelabel/debug.qtpl:15 +//line debug.qtpl:15 qt422016.ReleaseByteBuffer(qb422016) -//line lib/promrelabel/debug.qtpl:15 +//line debug.qtpl:15 return qs422016 -//line lib/promrelabel/debug.qtpl:15 +//line debug.qtpl:15 } -//line lib/promrelabel/debug.qtpl:17 -func StreamRelabelDebugStepsHTML(qw422016 *qt422016.Writer, targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) { -//line lib/promrelabel/debug.qtpl:17 +//line debug.qtpl:17 +func StreamRelabelDebugStepsHTML(qw422016 *qt422016.Writer, targetURL, targetID string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) { +//line debug.qtpl:17 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:21 +//line debug.qtpl:21 htmlcomponents.StreamCommonHeader(qw422016) -//line lib/promrelabel/debug.qtpl:21 +//line debug.qtpl:21 qw422016.N().S(`Metric relabel debug`) -//line lib/promrelabel/debug.qtpl:35 +//line debug.qtpl:35 htmlcomponents.StreamNavbar(qw422016) -//line lib/promrelabel/debug.qtpl:35 +//line debug.qtpl:35 qw422016.N().S(`
Relabeling docs`) -//line lib/promrelabel/debug.qtpl:37 +//line debug.qtpl:37 qw422016.N().S(` `) -//line lib/promrelabel/debug.qtpl:39 +//line debug.qtpl:39 if targetURL != "" { -//line lib/promrelabel/debug.qtpl:39 +//line debug.qtpl:39 qw422016.N().S(`Metric relabel debug`) -//line lib/promrelabel/debug.qtpl:41 +//line debug.qtpl:41 } else { -//line lib/promrelabel/debug.qtpl:41 +//line debug.qtpl:41 qw422016.N().S(`Target relabel debug`) -//line lib/promrelabel/debug.qtpl:43 +//line debug.qtpl:43 } -//line lib/promrelabel/debug.qtpl:43 +//line debug.qtpl:43 qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:46 +//line debug.qtpl:46 if err != nil { -//line lib/promrelabel/debug.qtpl:47 +//line debug.qtpl:47 htmlcomponents.StreamErrorNotification(qw422016, err) -//line lib/promrelabel/debug.qtpl:48 +//line debug.qtpl:48 } -//line lib/promrelabel/debug.qtpl:48 +//line debug.qtpl:48 qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:52 +//line debug.qtpl:52 streamrelabelDebugFormInputs(qw422016, metric, relabelConfigs) -//line lib/promrelabel/debug.qtpl:53 +//line debug.qtpl:53 if targetID != "" { -//line lib/promrelabel/debug.qtpl:53 +//line debug.qtpl:53 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:55 +//line debug.qtpl:55 } -//line lib/promrelabel/debug.qtpl:55 +//line debug.qtpl:55 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:57 +//line debug.qtpl:57 if targetID != "" { -//line lib/promrelabel/debug.qtpl:57 +//line debug.qtpl:57 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:59 +//line debug.qtpl:59 } -//line lib/promrelabel/debug.qtpl:59 - qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:65 - streamrelabelDebugSteps(qw422016, dss, targetURL, targetID) -//line lib/promrelabel/debug.qtpl:65 - qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:71 +//line debug.qtpl:59 + qw422016.N().S(``) +//line debug.qtpl:63 + for _, dss := range dsss { +//line debug.qtpl:63 + qw422016.N().S(`
`) +//line debug.qtpl:66 + streamrelabelDebugSteps(qw422016, dss, targetURL, targetID) +//line debug.qtpl:66 + qw422016.N().S(`
`) +//line debug.qtpl:69 + } +//line debug.qtpl:69 + qw422016.N().S(``) +//line debug.qtpl:73 } -//line lib/promrelabel/debug.qtpl:71 -func WriteRelabelDebugStepsHTML(qq422016 qtio422016.Writer, targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) { -//line lib/promrelabel/debug.qtpl:71 +//line debug.qtpl:73 +func WriteRelabelDebugStepsHTML(qq422016 qtio422016.Writer, targetURL, targetID string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) { +//line debug.qtpl:73 qw422016 := qt422016.AcquireWriter(qq422016) -//line lib/promrelabel/debug.qtpl:71 - StreamRelabelDebugStepsHTML(qw422016, targetURL, targetID, dss, metric, relabelConfigs, err) -//line lib/promrelabel/debug.qtpl:71 +//line debug.qtpl:73 + StreamRelabelDebugStepsHTML(qw422016, targetURL, targetID, dsss, metric, relabelConfigs, err) +//line debug.qtpl:73 qt422016.ReleaseWriter(qw422016) -//line lib/promrelabel/debug.qtpl:71 +//line debug.qtpl:73 } -//line lib/promrelabel/debug.qtpl:71 -func RelabelDebugStepsHTML(targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) string { -//line lib/promrelabel/debug.qtpl:71 +//line debug.qtpl:73 +func RelabelDebugStepsHTML(targetURL, targetID string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) string { +//line debug.qtpl:73 qb422016 := qt422016.AcquireByteBuffer() -//line lib/promrelabel/debug.qtpl:71 - WriteRelabelDebugStepsHTML(qb422016, targetURL, targetID, dss, metric, relabelConfigs, err) -//line lib/promrelabel/debug.qtpl:71 +//line debug.qtpl:73 + WriteRelabelDebugStepsHTML(qb422016, targetURL, targetID, dsss, metric, relabelConfigs, err) +//line debug.qtpl:73 qs422016 := string(qb422016.B) -//line lib/promrelabel/debug.qtpl:71 +//line debug.qtpl:73 qt422016.ReleaseByteBuffer(qb422016) -//line lib/promrelabel/debug.qtpl:71 +//line debug.qtpl:73 return qs422016 -//line lib/promrelabel/debug.qtpl:71 +//line debug.qtpl:73 } -//line lib/promrelabel/debug.qtpl:73 +//line debug.qtpl:75 func streamrelabelDebugFormInputs(qw422016 *qt422016.Writer, metric, relabelConfigs string) { -//line lib/promrelabel/debug.qtpl:73 +//line debug.qtpl:75 qw422016.N().S(`
Relabel configs:
Labels:
Labels (One label set per line. Multiple lines will be treated as multiple label sets):
`) -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 } -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 func writerelabelDebugFormInputs(qq422016 qtio422016.Writer, metric, relabelConfigs string) { -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 qw422016 := qt422016.AcquireWriter(qq422016) -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 streamrelabelDebugFormInputs(qw422016, metric, relabelConfigs) -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 qt422016.ReleaseWriter(qw422016) -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 } -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 func relabelDebugFormInputs(metric, relabelConfigs string) string { -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 qb422016 := qt422016.AcquireByteBuffer() -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 writerelabelDebugFormInputs(qb422016, metric, relabelConfigs) -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 qs422016 := string(qb422016.B) -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 qt422016.ReleaseByteBuffer(qb422016) -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 return qs422016 -//line lib/promrelabel/debug.qtpl:83 +//line debug.qtpl:85 } -//line lib/promrelabel/debug.qtpl:85 +//line debug.qtpl:87 func streamrelabelDebugSteps(qw422016 *qt422016.Writer, dss []DebugStep, targetURL, targetID string) { -//line lib/promrelabel/debug.qtpl:86 +//line debug.qtpl:88 if len(dss) > 0 { -//line lib/promrelabel/debug.qtpl:86 +//line debug.qtpl:88 qw422016.N().S(`
Original labels: `) -//line lib/promrelabel/debug.qtpl:88 +//line debug.qtpl:90 streammustFormatLabels(qw422016, dss[0].In) -//line lib/promrelabel/debug.qtpl:88 +//line debug.qtpl:90 qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:90 +//line debug.qtpl:92 } -//line lib/promrelabel/debug.qtpl:90 +//line debug.qtpl:92 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:101 +//line debug.qtpl:103 for i, ds := range dss { -//line lib/promrelabel/debug.qtpl:103 +//line debug.qtpl:105 inLabels, inErr := promutil.NewLabelsFromString(ds.In) outLabels, outErr := promutil.NewLabelsFromString(ds.Out) changedLabels := getChangedLabelNames(inLabels, outLabels) -//line lib/promrelabel/debug.qtpl:106 +//line debug.qtpl:108 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:135 +//line debug.qtpl:137 } -//line lib/promrelabel/debug.qtpl:135 +//line debug.qtpl:137 qw422016.N().S(`
StepRelabeling RuleInput LabelsOutput labels
`) -//line lib/promrelabel/debug.qtpl:108 +//line debug.qtpl:110 qw422016.N().D(i) -//line lib/promrelabel/debug.qtpl:108 +//line debug.qtpl:110 qw422016.N().S(`
`)
-//line lib/promrelabel/debug.qtpl:109
+//line debug.qtpl:111
 		qw422016.E().S(ds.Rule)
-//line lib/promrelabel/debug.qtpl:109
+//line debug.qtpl:111
 		qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:111 +//line debug.qtpl:113 if inErr == nil { -//line lib/promrelabel/debug.qtpl:111 +//line debug.qtpl:113 qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:113 +//line debug.qtpl:115 streamlabelsWithHighlight(qw422016, inLabels, changedLabels, "#D15757") -//line lib/promrelabel/debug.qtpl:113 +//line debug.qtpl:115 qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:115 +//line debug.qtpl:117 } else { -//line lib/promrelabel/debug.qtpl:115 +//line debug.qtpl:117 qw422016.N().S(`
`)
-//line lib/promrelabel/debug.qtpl:117
+//line debug.qtpl:119
 			qw422016.E().S(inErr.Error())
-//line lib/promrelabel/debug.qtpl:117
+//line debug.qtpl:119
 			qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:119 +//line debug.qtpl:121 break -//line lib/promrelabel/debug.qtpl:120 +//line debug.qtpl:122 } -//line lib/promrelabel/debug.qtpl:120 +//line debug.qtpl:122 qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:123 +//line debug.qtpl:125 if outErr == nil { -//line lib/promrelabel/debug.qtpl:123 +//line debug.qtpl:125 qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:125 +//line debug.qtpl:127 streamlabelsWithHighlight(qw422016, outLabels, changedLabels, "#4495e0") -//line lib/promrelabel/debug.qtpl:125 +//line debug.qtpl:127 qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:127 +//line debug.qtpl:129 } else { -//line lib/promrelabel/debug.qtpl:127 +//line debug.qtpl:129 qw422016.N().S(`
`)
-//line lib/promrelabel/debug.qtpl:129
+//line debug.qtpl:131
 			qw422016.E().S(outErr.Error())
-//line lib/promrelabel/debug.qtpl:129
+//line debug.qtpl:131
 			qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:131 +//line debug.qtpl:133 break -//line lib/promrelabel/debug.qtpl:132 +//line debug.qtpl:134 } -//line lib/promrelabel/debug.qtpl:132 +//line debug.qtpl:134 qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:138 +//line debug.qtpl:140 if len(dss) > 0 { -//line lib/promrelabel/debug.qtpl:138 +//line debug.qtpl:140 qw422016.N().S(`
Resulting labels: `) -//line lib/promrelabel/debug.qtpl:140 +//line debug.qtpl:142 streammustFormatLabels(qw422016, dss[len(dss)-1].Out) -//line lib/promrelabel/debug.qtpl:140 +//line debug.qtpl:142 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:141 +//line debug.qtpl:143 if targetURL != "" { -//line lib/promrelabel/debug.qtpl:141 +//line debug.qtpl:143 qw422016.N().S(`
Target URL:`) -//line lib/promrelabel/debug.qtpl:143 +//line debug.qtpl:145 qw422016.N().S(` `) -//line lib/promrelabel/debug.qtpl:143 +//line debug.qtpl:145 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:143 +//line debug.qtpl:145 qw422016.E().S(targetURL) -//line lib/promrelabel/debug.qtpl:143 +//line debug.qtpl:145 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:144 +//line debug.qtpl:146 if targetID != "" { -//line lib/promrelabel/debug.qtpl:145 +//line debug.qtpl:147 qw422016.N().S(` `) -//line lib/promrelabel/debug.qtpl:145 +//line debug.qtpl:147 qw422016.N().S(`(response)`) -//line lib/promrelabel/debug.qtpl:147 +//line debug.qtpl:149 } -//line lib/promrelabel/debug.qtpl:147 +//line debug.qtpl:149 qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:149 +//line debug.qtpl:151 } -//line lib/promrelabel/debug.qtpl:149 +//line debug.qtpl:151 qw422016.N().S(`
`) -//line lib/promrelabel/debug.qtpl:151 +//line debug.qtpl:153 } -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 } -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 func writerelabelDebugSteps(qq422016 qtio422016.Writer, dss []DebugStep, targetURL, targetID string) { -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 qw422016 := qt422016.AcquireWriter(qq422016) -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 streamrelabelDebugSteps(qw422016, dss, targetURL, targetID) -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 qt422016.ReleaseWriter(qw422016) -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 } -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 func relabelDebugSteps(dss []DebugStep, targetURL, targetID string) string { -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 qb422016 := qt422016.AcquireByteBuffer() -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 writerelabelDebugSteps(qb422016, dss, targetURL, targetID) -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 qs422016 := string(qb422016.B) -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 qt422016.ReleaseByteBuffer(qb422016) -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 return qs422016 -//line lib/promrelabel/debug.qtpl:152 +//line debug.qtpl:154 } -//line lib/promrelabel/debug.qtpl:154 -func StreamRelabelDebugStepsJSON(qw422016 *qt422016.Writer, targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) { -//line lib/promrelabel/debug.qtpl:154 +//line debug.qtpl:156 +func StreamRelabelDebugStepsJSON(qw422016 *qt422016.Writer, targetURL, targetID string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) { +//line debug.qtpl:156 qw422016.N().S(`{`) -//line lib/promrelabel/debug.qtpl:156 +//line debug.qtpl:158 if err != nil { -//line lib/promrelabel/debug.qtpl:156 +//line debug.qtpl:158 qw422016.N().S(`"status": "error","error":`) -//line lib/promrelabel/debug.qtpl:158 +//line debug.qtpl:160 qw422016.N().Q(fmt.Sprintf("Error: %s", err)) -//line lib/promrelabel/debug.qtpl:159 +//line debug.qtpl:161 } else { -//line lib/promrelabel/debug.qtpl:160 - var hasError bool +//line debug.qtpl:161 + qw422016.N().S(`"status": "success","metrics": [`) +//line debug.qtpl:164 + for idx, dss := range dsss { +//line debug.qtpl:165 + 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 debug.qtpl:165 + qw422016.N().S(`{"steps": [`) +//line debug.qtpl:168 + for i, ds := range dss { +//line debug.qtpl:170 + inLabels, inErr := promutil.NewLabelsFromString(ds.In) + outLabels, outErr := promutil.NewLabelsFromString(ds.Out) + changedLabels := getChangedLabelNames(inLabels, outLabels) -//line lib/promrelabel/debug.qtpl:168 - qw422016.N().S(`{"inLabels":`) -//line lib/promrelabel/debug.qtpl:170 - 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(`` + inErr.Error() + ``) -//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 debug.qtpl:173 + qw422016.N().S(`{"inLabels":`) +//line debug.qtpl:175 + qw422016.N().Q(labelsWithHighlight(inLabels, changedLabels, "#D15757")) +//line debug.qtpl:175 + qw422016.N().S(`,"outLabels":`) +//line debug.qtpl:176 + qw422016.N().Q(labelsWithHighlight(outLabels, changedLabels, "#4495e0")) +//line debug.qtpl:176 + qw422016.N().S(`,"rule":`) +//line debug.qtpl:177 + qw422016.N().Q(ds.Rule) +//line debug.qtpl:177 + qw422016.N().S(`,"errors": {`) +//line debug.qtpl:179 + if inErr != nil { +//line debug.qtpl:179 + qw422016.N().S(`"inLabels":`) +//line debug.qtpl:180 + qw422016.N().Q(`` + inErr.Error() + ``) +//line debug.qtpl:180 + if outErr != nil { +//line debug.qtpl:180 + qw422016.N().S(`,`) +//line debug.qtpl:180 + } +//line debug.qtpl:181 + hasError = true + +//line debug.qtpl:182 + } else { +//line debug.qtpl:183 } -//line lib/promrelabel/debug.qtpl:176 - hasError = true +//line debug.qtpl:184 + if outErr != nil { +//line debug.qtpl:184 + qw422016.N().S(`"outLabels":`) +//line debug.qtpl:185 + qw422016.N().Q(`` + outErr.Error() + ``) +//line debug.qtpl:186 + hasError = true -//line lib/promrelabel/debug.qtpl:177 - } else { -//line lib/promrelabel/debug.qtpl:178 +//line debug.qtpl:187 + } +//line debug.qtpl:187 + qw422016.N().S(`}}`) +//line debug.qtpl:190 + if i != len(dss)-1 { +//line debug.qtpl:190 + qw422016.N().S(`,`) +//line debug.qtpl:190 + } +//line debug.qtpl:191 } -//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(`` + outErr.Error() + ``) -//line lib/promrelabel/debug.qtpl:181 - hasError = true - -//line lib/promrelabel/debug.qtpl:182 +//line debug.qtpl:191 + qw422016.N().S(`]`) +//line debug.qtpl:193 + if len(dss) > 0 && !hasError { +//line debug.qtpl:193 + qw422016.N().S(`,"originalLabels":`) +//line debug.qtpl:195 + qw422016.N().Q(mustFormatLabels(dss[0].In)) +//line debug.qtpl:195 + qw422016.N().S(`,"resultingLabels":`) +//line debug.qtpl:196 + qw422016.N().Q(mustFormatLabels(dss[len(dss)-1].Out)) +//line debug.qtpl:197 } -//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 +//line debug.qtpl:197 + qw422016.N().S(`}`) +//line debug.qtpl:199 + if idx != len(dsss)-1 { +//line debug.qtpl:199 qw422016.N().S(`,`) -//line lib/promrelabel/debug.qtpl:185 +//line debug.qtpl:199 } -//line lib/promrelabel/debug.qtpl:186 +//line debug.qtpl:200 } -//line lib/promrelabel/debug.qtpl:186 +//line debug.qtpl:200 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:192 - } -//line lib/promrelabel/debug.qtpl:193 +//line debug.qtpl:202 } -//line lib/promrelabel/debug.qtpl:193 +//line debug.qtpl:202 qw422016.N().S(`}`) -//line lib/promrelabel/debug.qtpl:195 +//line debug.qtpl:204 } -//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 +//line debug.qtpl:204 +func WriteRelabelDebugStepsJSON(qq422016 qtio422016.Writer, targetURL, targetID string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) { +//line debug.qtpl:204 qw422016 := qt422016.AcquireWriter(qq422016) -//line lib/promrelabel/debug.qtpl:195 - StreamRelabelDebugStepsJSON(qw422016, targetURL, targetID, dss, metric, relabelConfigs, err) -//line lib/promrelabel/debug.qtpl:195 +//line debug.qtpl:204 + StreamRelabelDebugStepsJSON(qw422016, targetURL, targetID, dsss, metric, relabelConfigs, err) +//line debug.qtpl:204 qt422016.ReleaseWriter(qw422016) -//line lib/promrelabel/debug.qtpl:195 +//line debug.qtpl:204 } -//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 +//line debug.qtpl:204 +func RelabelDebugStepsJSON(targetURL, targetID string, dsss [][]DebugStep, metric string, relabelConfigs string, err error) string { +//line debug.qtpl:204 qb422016 := qt422016.AcquireByteBuffer() -//line lib/promrelabel/debug.qtpl:195 - WriteRelabelDebugStepsJSON(qb422016, targetURL, targetID, dss, metric, relabelConfigs, err) -//line lib/promrelabel/debug.qtpl:195 +//line debug.qtpl:204 + WriteRelabelDebugStepsJSON(qb422016, targetURL, targetID, dsss, metric, relabelConfigs, err) +//line debug.qtpl:204 qs422016 := string(qb422016.B) -//line lib/promrelabel/debug.qtpl:195 +//line debug.qtpl:204 qt422016.ReleaseByteBuffer(qb422016) -//line lib/promrelabel/debug.qtpl:195 +//line debug.qtpl:204 return qs422016 -//line lib/promrelabel/debug.qtpl:195 +//line debug.qtpl:204 } -//line lib/promrelabel/debug.qtpl:197 +//line debug.qtpl:206 func streamlabelsWithHighlight(qw422016 *qt422016.Writer, labels *promutil.Labels, highlight map[string]struct{}, color string) { -//line lib/promrelabel/debug.qtpl:199 +//line debug.qtpl:208 labelsList := labels.GetLabels() metricName := "" for i, label := range labelsList { @@ -509,153 +533,153 @@ func streamlabelsWithHighlight(qw422016 *qt422016.Writer, labels *promutil.Label } } -//line lib/promrelabel/debug.qtpl:209 +//line debug.qtpl:218 if metricName != "" { -//line lib/promrelabel/debug.qtpl:210 +//line debug.qtpl:219 if _, ok := highlight["__name__"]; ok { -//line lib/promrelabel/debug.qtpl:210 +//line debug.qtpl:219 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:211 +//line debug.qtpl:220 qw422016.E().S(metricName) -//line lib/promrelabel/debug.qtpl:211 +//line debug.qtpl:220 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:212 +//line debug.qtpl:221 } else { -//line lib/promrelabel/debug.qtpl:213 +//line debug.qtpl:222 qw422016.E().S(metricName) -//line lib/promrelabel/debug.qtpl:214 +//line debug.qtpl:223 } -//line lib/promrelabel/debug.qtpl:215 +//line debug.qtpl:224 if len(labelsList) == 0 { -//line lib/promrelabel/debug.qtpl:215 +//line debug.qtpl:224 return -//line lib/promrelabel/debug.qtpl:215 +//line debug.qtpl:224 } -//line lib/promrelabel/debug.qtpl:216 +//line debug.qtpl:225 } -//line lib/promrelabel/debug.qtpl:216 +//line debug.qtpl:225 qw422016.N().S(`{`) -//line lib/promrelabel/debug.qtpl:218 +//line debug.qtpl:227 for i, label := range labelsList { -//line lib/promrelabel/debug.qtpl:219 +//line debug.qtpl:228 if _, ok := highlight[label.Name]; ok { -//line lib/promrelabel/debug.qtpl:219 +//line debug.qtpl:228 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:220 +//line debug.qtpl:229 qw422016.E().S(label.Name) -//line lib/promrelabel/debug.qtpl:220 +//line debug.qtpl:229 qw422016.N().S(`=`) -//line lib/promrelabel/debug.qtpl:220 +//line debug.qtpl:229 qw422016.E().Q(label.Value) -//line lib/promrelabel/debug.qtpl:220 +//line debug.qtpl:229 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:221 +//line debug.qtpl:230 } else { -//line lib/promrelabel/debug.qtpl:222 +//line debug.qtpl:231 qw422016.E().S(label.Name) -//line lib/promrelabel/debug.qtpl:222 +//line debug.qtpl:231 qw422016.N().S(`=`) -//line lib/promrelabel/debug.qtpl:222 +//line debug.qtpl:231 qw422016.E().Q(label.Value) -//line lib/promrelabel/debug.qtpl:223 +//line debug.qtpl:232 } -//line lib/promrelabel/debug.qtpl:224 +//line debug.qtpl:233 if i < len(labelsList)-1 { -//line lib/promrelabel/debug.qtpl:224 +//line debug.qtpl:233 qw422016.N().S(`,`) -//line lib/promrelabel/debug.qtpl:224 +//line debug.qtpl:233 qw422016.N().S(` `) -//line lib/promrelabel/debug.qtpl:224 +//line debug.qtpl:233 } -//line lib/promrelabel/debug.qtpl:225 +//line debug.qtpl:234 } -//line lib/promrelabel/debug.qtpl:225 +//line debug.qtpl:234 qw422016.N().S(`}`) -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 } -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 func writelabelsWithHighlight(qq422016 qtio422016.Writer, labels *promutil.Labels, highlight map[string]struct{}, color string) { -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 qw422016 := qt422016.AcquireWriter(qq422016) -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 streamlabelsWithHighlight(qw422016, labels, highlight, color) -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 qt422016.ReleaseWriter(qw422016) -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 } -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 func labelsWithHighlight(labels *promutil.Labels, highlight map[string]struct{}, color string) string { -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 qb422016 := qt422016.AcquireByteBuffer() -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 writelabelsWithHighlight(qb422016, labels, highlight, color) -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 qs422016 := string(qb422016.B) -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 qt422016.ReleaseByteBuffer(qb422016) -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 return qs422016 -//line lib/promrelabel/debug.qtpl:227 +//line debug.qtpl:236 } -//line lib/promrelabel/debug.qtpl:229 +//line debug.qtpl:238 func streammustFormatLabels(qw422016 *qt422016.Writer, s string) { -//line lib/promrelabel/debug.qtpl:230 +//line debug.qtpl:239 labels, err := promutil.NewLabelsFromString(s) -//line lib/promrelabel/debug.qtpl:231 +//line debug.qtpl:240 if err != nil { -//line lib/promrelabel/debug.qtpl:231 +//line debug.qtpl:240 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:232 +//line debug.qtpl:241 qw422016.E().S("error parsing labels: " + err.Error()) -//line lib/promrelabel/debug.qtpl:232 +//line debug.qtpl:241 qw422016.N().S(``) -//line lib/promrelabel/debug.qtpl:233 +//line debug.qtpl:242 } else { -//line lib/promrelabel/debug.qtpl:234 +//line debug.qtpl:243 streamlabelsWithHighlight(qw422016, labels, nil, "") -//line lib/promrelabel/debug.qtpl:235 +//line debug.qtpl:244 } -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 } -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 func writemustFormatLabels(qq422016 qtio422016.Writer, s string) { -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 qw422016 := qt422016.AcquireWriter(qq422016) -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 streammustFormatLabels(qw422016, s) -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 qt422016.ReleaseWriter(qw422016) -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 } -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 func mustFormatLabels(s string) string { -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 qb422016 := qt422016.AcquireByteBuffer() -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 writemustFormatLabels(qb422016, s) -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 qs422016 := string(qb422016.B) -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 qt422016.ReleaseByteBuffer(qb422016) -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 return qs422016 -//line lib/promrelabel/debug.qtpl:236 +//line debug.qtpl:245 }