mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2025-01-20 07:19:17 +01:00
lib/promrelabel: remove unconditional sorting of the labels in ParsedConfigs.Apply(), since the sorting isnt needed in many places
Sort labels explicitly after calling the ParsedConfigs.Apply() when needed. This reduces CPU usage when performing metric-level relabeling, where labels' sorting isn't needed.
This commit is contained in:
parent
d8057fca0b
commit
087393bcef
@ -123,7 +123,8 @@ func (rctx *relabelCtx) applyRelabeling(tss []prompbmarshal.TimeSeries, extraLab
|
||||
}
|
||||
}
|
||||
}
|
||||
labels = pcs.Apply(labels, labelsLen, true)
|
||||
labels = pcs.Apply(labels, labelsLen)
|
||||
labels = promrelabel.FinalizeLabels(labels[:0], labels)
|
||||
if len(labels) == labelsLen {
|
||||
// Drop the current time series, since relabeling removed all the labels.
|
||||
continue
|
||||
|
@ -183,9 +183,9 @@ func (a Alert) toPromLabels(relabelCfg *promrelabel.ParsedConfigs) []prompbmarsh
|
||||
Value: v,
|
||||
})
|
||||
}
|
||||
promrelabel.SortLabels(labels)
|
||||
if relabelCfg != nil {
|
||||
return relabelCfg.Apply(labels, 0, false)
|
||||
labels = relabelCfg.Apply(labels, 0)
|
||||
}
|
||||
promrelabel.SortLabels(labels)
|
||||
return labels
|
||||
}
|
||||
|
@ -132,8 +132,9 @@ func parseConfig(path string) (*Config, error) {
|
||||
|
||||
func parseLabels(target string, metaLabels map[string]string, cfg *Config) (string, []prompbmarshal.Label, error) {
|
||||
labels := mergeLabels(target, metaLabels, cfg)
|
||||
labels = cfg.parsedRelabelConfigs.Apply(labels, 0, false)
|
||||
labels = cfg.parsedRelabelConfigs.Apply(labels, 0)
|
||||
labels = promrelabel.RemoveMetaLabels(labels[:0], labels)
|
||||
promrelabel.SortLabels(labels)
|
||||
// Remove references to already deleted labels, so GC could clean strings for label name and label value past len(labels).
|
||||
// This should reduce memory usage when relabeling creates big number of temporary labels with long names and/or values.
|
||||
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/825 for details.
|
||||
|
@ -123,7 +123,8 @@ func (ctx *Ctx) ApplyRelabeling(labels []prompb.Label) []prompb.Label {
|
||||
|
||||
if pcs.Len() > 0 {
|
||||
// Apply relabeling
|
||||
tmpLabels = pcs.Apply(tmpLabels, 0, true)
|
||||
tmpLabels = pcs.Apply(tmpLabels, 0)
|
||||
tmpLabels = promrelabel.FinalizeLabels(tmpLabels[:0], tmpLabels)
|
||||
if len(tmpLabels) == 0 {
|
||||
metricsDropped.Inc()
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ The following tip changes can be tested by building VictoriaMetrics components f
|
||||
|
||||
* FEATURE: allow limiting memory usage on a per-query basis with `-search.maxMemoryPerQuery` command-line flag. See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3203).
|
||||
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): drop all the labels with `__` prefix from discovered targets in the same way as Prometheus does according to [this article](https://www.robustperception.io/life-of-a-label/). Previously the following labels were available during [metric-level relabeling](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs): `__address__`, `__scheme__`, `__metrics_path__`, `__scrape_interval__`, `__scrape_timeout__`, `__param_*`. Now these labels are available only during [target-level relabeling](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config). This should reduce CPU usage and memory usage for `vmagent` setups, which scrape big number of targets.
|
||||
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): improve the performance for metric-level [relabeling](https://docs.victoriametrics.com/vmagent.html#relabeling), which can be applied via `metric_relabel_configs` section at [scrape_configs](https://docs.victoriametrics.com/sd_configs.html#scrape_configs), via `-remoteWrite.relabelConfig` or via `-remoteWrite.urlRelabelConfig` command-line options.
|
||||
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): allow specifying full url in scrape target addresses (aka `__address__` label). This makes valid the following `-promscrape.config`:
|
||||
|
||||
```yml
|
||||
|
@ -50,9 +50,7 @@ func (prc *parsedRelabelConfig) String() string {
|
||||
// Apply applies pcs to labels starting from the labelsOffset.
|
||||
//
|
||||
// If isFinalize is set, then FinalizeLabels is called on the labels[labelsOffset:].
|
||||
//
|
||||
// The returned labels at labels[labelsOffset:] are sorted by name.
|
||||
func (pcs *ParsedConfigs) Apply(labels []prompbmarshal.Label, labelsOffset int, isFinalize bool) []prompbmarshal.Label {
|
||||
func (pcs *ParsedConfigs) Apply(labels []prompbmarshal.Label, labelsOffset int) []prompbmarshal.Label {
|
||||
var inStr string
|
||||
relabelDebug := false
|
||||
if pcs != nil {
|
||||
@ -73,10 +71,6 @@ func (pcs *ParsedConfigs) Apply(labels []prompbmarshal.Label, labelsOffset int,
|
||||
}
|
||||
}
|
||||
labels = removeEmptyLabels(labels, labelsOffset)
|
||||
if isFinalize {
|
||||
labels = FinalizeLabels(labels[:labelsOffset], labels[labelsOffset:])
|
||||
}
|
||||
SortLabels(labels[labelsOffset:])
|
||||
if relabelDebug {
|
||||
if len(labels) == labelsOffset {
|
||||
logger.Infof("\nRelabel In: %s\nRelabel Out: DROPPED - all labels removed", inStr)
|
||||
|
@ -78,7 +78,11 @@ func TestApplyRelabelConfigs(t *testing.T) {
|
||||
t.Fatalf("cannot parse %q: %s", config, err)
|
||||
}
|
||||
labels := MustParseMetricWithLabels(metric)
|
||||
resultLabels := pcs.Apply(labels, 0, isFinalize)
|
||||
resultLabels := pcs.Apply(labels, 0)
|
||||
if isFinalize {
|
||||
resultLabels = FinalizeLabels(resultLabels[:0], resultLabels)
|
||||
}
|
||||
SortLabels(resultLabels)
|
||||
result := labelsToString(resultLabels)
|
||||
if result != resultExpected {
|
||||
t.Fatalf("unexpected result; got\n%s\nwant\n%s", result, resultExpected)
|
||||
|
@ -396,7 +396,7 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, false)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
if len(labels) != 0 {
|
||||
panic(fmt.Errorf("BUG: expecting empty labels"))
|
||||
}
|
||||
@ -419,7 +419,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != len(labelsOrig) {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), len(labelsOrig), labelsOrig))
|
||||
}
|
||||
@ -454,7 +456,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != len(labelsOrig) {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), len(labelsOrig), labels))
|
||||
}
|
||||
@ -488,7 +492,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 2 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 2, labels))
|
||||
}
|
||||
@ -524,7 +530,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != len(labelsOrig) {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), len(labelsOrig), labels))
|
||||
}
|
||||
@ -560,7 +568,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != len(labelsOrig) {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), len(labelsOrig), labels))
|
||||
}
|
||||
@ -595,7 +605,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != len(labelsOrig) {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), len(labelsOrig), labels))
|
||||
}
|
||||
@ -630,7 +642,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 0 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 0, labels))
|
||||
}
|
||||
@ -653,7 +667,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 0 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 0, labels))
|
||||
}
|
||||
@ -676,7 +692,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 0 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 0, labels))
|
||||
}
|
||||
@ -699,7 +717,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != len(labelsOrig) {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), len(labelsOrig), labels))
|
||||
}
|
||||
@ -734,7 +754,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != len(labelsOrig) {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), len(labelsOrig), labels))
|
||||
}
|
||||
@ -768,7 +790,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != len(labelsOrig) {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), len(labelsOrig), labels))
|
||||
}
|
||||
@ -802,7 +826,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 1 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 1, labels))
|
||||
}
|
||||
@ -830,7 +856,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 1 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 1, labels))
|
||||
}
|
||||
@ -858,7 +886,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 1 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 1, labels))
|
||||
}
|
||||
@ -886,7 +916,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 0 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 0, labels))
|
||||
}
|
||||
@ -908,7 +940,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 1 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 1, labels))
|
||||
}
|
||||
@ -936,7 +970,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 1 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 1, labels))
|
||||
}
|
||||
@ -964,7 +1000,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 1 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 1, labels))
|
||||
}
|
||||
@ -991,7 +1029,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 1 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 3, labels))
|
||||
}
|
||||
@ -1018,7 +1058,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 2 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 3, labels))
|
||||
}
|
||||
@ -1051,7 +1093,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != 2 {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), 3, labels))
|
||||
}
|
||||
@ -1087,7 +1131,9 @@ func BenchmarkApplyRelabelConfigs(b *testing.B) {
|
||||
var labels []prompbmarshal.Label
|
||||
for pb.Next() {
|
||||
labels = append(labels[:0], labelsOrig...)
|
||||
labels = pcs.Apply(labels, 0, true)
|
||||
labels = pcs.Apply(labels, 0)
|
||||
labels = FinalizeLabels(labels[:0], labels)
|
||||
SortLabels(labels)
|
||||
if len(labels) != len(labelsOrig) {
|
||||
panic(fmt.Errorf("unexpected number of labels; got %d; want %d; labels:\n%#v", len(labels), len(labelsOrig), labels))
|
||||
}
|
||||
|
@ -9,6 +9,9 @@ import (
|
||||
|
||||
// SortLabels sorts labels.
|
||||
func SortLabels(labels []prompbmarshal.Label) {
|
||||
if len(labels) < 2 {
|
||||
return
|
||||
}
|
||||
ls := labelsSorterPool.Get().(*labelsSorter)
|
||||
*ls = labels
|
||||
if !sort.IsSorted(ls) {
|
||||
@ -20,6 +23,9 @@ func SortLabels(labels []prompbmarshal.Label) {
|
||||
|
||||
// SortLabelsStable sorts labels using stable sort.
|
||||
func SortLabelsStable(labels []prompbmarshal.Label) {
|
||||
if len(labels) < 2 {
|
||||
return
|
||||
}
|
||||
ls := labelsSorterPool.Get().(*labelsSorter)
|
||||
*ls = labels
|
||||
if !sort.IsSorted(ls) {
|
||||
|
@ -1195,19 +1195,17 @@ var scrapeWorkKeyBufPool bytesutil.ByteBufferPool
|
||||
|
||||
func (swc *scrapeWorkConfig) getScrapeWork(target string, extraLabels, metaLabels map[string]string) (*ScrapeWork, error) {
|
||||
lctx := getLabelsContext()
|
||||
lctx.labels = mergeLabels(lctx.labels[:0], swc, target, extraLabels, metaLabels)
|
||||
defer putLabelsContext(lctx)
|
||||
|
||||
labels := mergeLabels(lctx.labels[:0], swc, target, extraLabels, metaLabels)
|
||||
var originalLabels []prompbmarshal.Label
|
||||
if !*dropOriginalLabels {
|
||||
originalLabels = append([]prompbmarshal.Label{}, lctx.labels...)
|
||||
originalLabels = append([]prompbmarshal.Label{}, labels...)
|
||||
}
|
||||
lctx.labels = swc.relabelConfigs.Apply(lctx.labels, 0, false)
|
||||
labels = swc.relabelConfigs.Apply(labels, 0)
|
||||
// Remove labels starting from "__meta_" prefix according to https://www.robustperception.io/life-of-a-label/
|
||||
lctx.labels = promrelabel.RemoveMetaLabels(lctx.labels[:0], lctx.labels)
|
||||
// Remove references to already deleted labels, so GC could clean strings for label name and label value past len(labels).
|
||||
// This should reduce memory usage when relabeling creates big number of temporary labels with long names and/or values.
|
||||
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/825 for details.
|
||||
labels := append([]prompbmarshal.Label{}, lctx.labels...)
|
||||
putLabelsContext(lctx)
|
||||
labels = promrelabel.RemoveMetaLabels(labels[:0], labels)
|
||||
lctx.labels = labels
|
||||
|
||||
// Verify whether the scrape work must be skipped because of `-promscrape.cluster.*` configs.
|
||||
// Perform the verification on labels after the relabeling in order to guarantee that targets with the same set of labels
|
||||
@ -1290,14 +1288,6 @@ func (swc *scrapeWorkConfig) getScrapeWork(target string, extraLabels, metaLabel
|
||||
return nil, fmt.Errorf("invalid url %q for scheme=%q, target=%q, address=%q, metrics_path=%q for job=%q: %w",
|
||||
scrapeURL, scheme, target, address, metricsPath, swc.jobName, err)
|
||||
}
|
||||
// Set missing "instance" label according to https://www.robustperception.io/life-of-a-label
|
||||
if promrelabel.GetLabelByName(labels, "instance") == nil {
|
||||
labels = append(labels, prompbmarshal.Label{
|
||||
Name: "instance",
|
||||
Value: address,
|
||||
})
|
||||
promrelabel.SortLabels(labels)
|
||||
}
|
||||
// Read __scrape_interval__ and __scrape_timeout__ from labels.
|
||||
scrapeInterval := swc.scrapeInterval
|
||||
if s := promrelabel.GetLabelValueByName(labels, "__scrape_interval__"); len(s) > 0 {
|
||||
@ -1340,7 +1330,16 @@ func (swc *scrapeWorkConfig) getScrapeWork(target string, extraLabels, metaLabel
|
||||
// Remove references to deleted labels, so GC could clean strings for label name and label value past len(labels).
|
||||
// This should reduce memory usage when relabeling creates big number of temporary labels with long names and/or values.
|
||||
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/825 for details.
|
||||
labels = append([]prompbmarshal.Label{}, labels...)
|
||||
labelsCopy := make([]prompbmarshal.Label, len(labels)+1)
|
||||
labels = append(labelsCopy[:0], labels...)
|
||||
// Add missing "instance" label according to https://www.robustperception.io/life-of-a-label
|
||||
if promrelabel.GetLabelByName(labels, "instance") == nil {
|
||||
labels = append(labels, prompbmarshal.Label{
|
||||
Name: "instance",
|
||||
Value: address,
|
||||
})
|
||||
}
|
||||
promrelabel.SortLabels(labels)
|
||||
// Reduce memory usage by interning all the strings in labels.
|
||||
internLabelStrings(labels)
|
||||
|
||||
|
@ -67,6 +67,8 @@ type ScrapeWork struct {
|
||||
// OriginalLabels contains original labels before relabeling.
|
||||
//
|
||||
// These labels are needed for relabeling troubleshooting at /targets page.
|
||||
//
|
||||
// OriginalLabels are sorted by name.
|
||||
OriginalLabels []prompbmarshal.Label
|
||||
|
||||
// Labels to add to the scraped metrics.
|
||||
@ -79,13 +81,15 @@ type ScrapeWork struct {
|
||||
//
|
||||
// See also https://prometheus.io/docs/concepts/jobs_instances/
|
||||
//
|
||||
// Labels are already sorted by name.
|
||||
// Labels are sorted by name.
|
||||
Labels []prompbmarshal.Label
|
||||
|
||||
// ExternalLabels contains labels from global->external_labels section of -promscrape.config
|
||||
//
|
||||
// These labels are added to scraped metrics after the relabeling.
|
||||
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3137
|
||||
//
|
||||
// ExternalLabels are sorted by name.
|
||||
ExternalLabels []prompbmarshal.Label
|
||||
|
||||
// ProxyURL HTTP proxy url
|
||||
@ -832,11 +836,9 @@ func (sw *scrapeWork) addRowToTimeseries(wc *writeRequestCtx, r *parser.Row, tim
|
||||
labelsLen := len(wc.labels)
|
||||
wc.labels = appendLabels(wc.labels, r.Metric, r.Tags, sw.Config.Labels, sw.Config.HonorLabels)
|
||||
if needRelabel {
|
||||
wc.labels = sw.Config.MetricRelabelConfigs.Apply(wc.labels, labelsLen, true)
|
||||
} else {
|
||||
wc.labels = promrelabel.FinalizeLabels(wc.labels[:labelsLen], wc.labels[labelsLen:])
|
||||
promrelabel.SortLabels(wc.labels[labelsLen:])
|
||||
wc.labels = sw.Config.MetricRelabelConfigs.Apply(wc.labels, labelsLen)
|
||||
}
|
||||
wc.labels = promrelabel.FinalizeLabels(wc.labels[:labelsLen], wc.labels[labelsLen:])
|
||||
if len(wc.labels) == labelsLen {
|
||||
// Skip row without labels.
|
||||
return
|
||||
|
Loading…
Reference in New Issue
Block a user