mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
lib/promscrape: remove labels starting with __meta_
after applying relabel_configs
as Prometheus does
This should reduce CPU load during scraping when target discovery generates big number of `__meta_*` labels (for instance, k8s discovery). See https://www.robustperception.io/life-of-a-label for details.
This commit is contained in:
parent
f58d15f27c
commit
09f796e2ab
4 changed files with 77 additions and 14 deletions
|
@ -69,6 +69,20 @@ func removeEmptyLabels(labels []prompbmarshal.Label, labelsOffset int) []prompbm
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemoveMetaLabels removes all the `__meta_` labels from src and puts the rest of labels to dst.
|
||||||
|
//
|
||||||
|
// See https://www.robustperception.io/life-of-a-label fo details.
|
||||||
|
func RemoveMetaLabels(dst, src []prompbmarshal.Label) []prompbmarshal.Label {
|
||||||
|
for i := range src {
|
||||||
|
label := &src[i]
|
||||||
|
if strings.HasPrefix(label.Name, "__meta_") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
dst = append(dst, *label)
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
// FinalizeLabels finalizes labels according to relabel_config rules.
|
// FinalizeLabels finalizes labels according to relabel_config rules.
|
||||||
//
|
//
|
||||||
// It renames `__address__` to `instance` and removes labels with "__" in the beginning.
|
// It renames `__address__` to `instance` and removes labels with "__" in the beginning.
|
||||||
|
|
|
@ -628,3 +628,50 @@ func TestFinalizeLabels(t *testing.T) {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRemoveMetaLabels(t *testing.T) {
|
||||||
|
f := func(labels, resultExpected []prompbmarshal.Label) {
|
||||||
|
t.Helper()
|
||||||
|
result := RemoveMetaLabels(nil, labels)
|
||||||
|
if !reflect.DeepEqual(result, resultExpected) {
|
||||||
|
t.Fatalf("unexpected result of RemoveMetaLabels;\ngot\n%v\nwant\n%v", result, resultExpected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(nil, nil)
|
||||||
|
f([]prompbmarshal.Label{
|
||||||
|
{
|
||||||
|
Name: "foo",
|
||||||
|
Value: "bar",
|
||||||
|
},
|
||||||
|
}, []prompbmarshal.Label{
|
||||||
|
{
|
||||||
|
Name: "foo",
|
||||||
|
Value: "bar",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
f([]prompbmarshal.Label{
|
||||||
|
{
|
||||||
|
Name: "__meta_foo",
|
||||||
|
Value: "bar",
|
||||||
|
},
|
||||||
|
}, nil)
|
||||||
|
f([]prompbmarshal.Label{
|
||||||
|
{
|
||||||
|
Name: "__meta_foo",
|
||||||
|
Value: "bdffr",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "foo",
|
||||||
|
Value: "bar",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "__meta_xxx",
|
||||||
|
Value: "basd",
|
||||||
|
},
|
||||||
|
}, []prompbmarshal.Label{
|
||||||
|
{
|
||||||
|
Name: "foo",
|
||||||
|
Value: "bar",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -190,9 +190,9 @@ func (cfg *Config) getFileSDScrapeWork(prev []ScrapeWork) []ScrapeWork {
|
||||||
swPrev := make(map[string][]ScrapeWork)
|
swPrev := make(map[string][]ScrapeWork)
|
||||||
for i := range prev {
|
for i := range prev {
|
||||||
sw := &prev[i]
|
sw := &prev[i]
|
||||||
label := promrelabel.GetLabelByName(sw.Labels, "__meta_filepath")
|
label := promrelabel.GetLabelByName(sw.Labels, "__vm_filepath")
|
||||||
if label == nil {
|
if label == nil {
|
||||||
logger.Panicf("BUG: missing `__meta_filepath` label")
|
logger.Panicf("BUG: missing `__vm_filepath` label")
|
||||||
} else {
|
} else {
|
||||||
swPrev[label.Value] = append(swPrev[label.Value], *sw)
|
swPrev[label.Value] = append(swPrev[label.Value], *sw)
|
||||||
}
|
}
|
||||||
|
@ -401,6 +401,7 @@ func (sdc *FileSDConfig) appendScrapeWork(dst []ScrapeWork, swPrev map[string][]
|
||||||
}
|
}
|
||||||
metaLabels := map[string]string{
|
metaLabels := map[string]string{
|
||||||
"__meta_filepath": pathShort,
|
"__meta_filepath": pathShort,
|
||||||
|
"__vm_filepath": pathShort, // This label is needed for internal promscrape logic
|
||||||
}
|
}
|
||||||
for i := range stcs {
|
for i := range stcs {
|
||||||
dst = stcs[i].appendScrapeWork(dst, swc, metaLabels)
|
dst = stcs[i].appendScrapeWork(dst, swc, metaLabels)
|
||||||
|
@ -431,6 +432,7 @@ func (stc *StaticConfig) appendScrapeWork(dst []ScrapeWork, swc *scrapeWorkConfi
|
||||||
func appendScrapeWork(dst []ScrapeWork, swc *scrapeWorkConfig, target string, extraLabels, metaLabels map[string]string) ([]ScrapeWork, error) {
|
func appendScrapeWork(dst []ScrapeWork, swc *scrapeWorkConfig, target string, extraLabels, metaLabels map[string]string) ([]ScrapeWork, error) {
|
||||||
labels := mergeLabels(swc.jobName, swc.scheme, target, swc.metricsPath, extraLabels, swc.externalLabels, metaLabels, swc.params)
|
labels := mergeLabels(swc.jobName, swc.scheme, target, swc.metricsPath, extraLabels, swc.externalLabels, metaLabels, swc.params)
|
||||||
labels = promrelabel.ApplyRelabelConfigs(labels, 0, swc.relabelConfigs, false)
|
labels = promrelabel.ApplyRelabelConfigs(labels, 0, swc.relabelConfigs, false)
|
||||||
|
labels = promrelabel.RemoveMetaLabels(labels[:0], labels)
|
||||||
if len(labels) == 0 {
|
if len(labels) == 0 {
|
||||||
// Drop target without labels.
|
// Drop target without labels.
|
||||||
return dst, nil
|
return dst, nil
|
||||||
|
|
|
@ -408,10 +408,6 @@ scrape_configs:
|
||||||
Name: "__address__",
|
Name: "__address__",
|
||||||
Value: "host1",
|
Value: "host1",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Name: "__meta_filepath",
|
|
||||||
Value: "testdata/file_sd.json",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
Name: "__metrics_path__",
|
Name: "__metrics_path__",
|
||||||
Value: "/abc/de",
|
Value: "/abc/de",
|
||||||
|
@ -420,6 +416,10 @@ scrape_configs:
|
||||||
Name: "__scheme__",
|
Name: "__scheme__",
|
||||||
Value: "http",
|
Value: "http",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "__vm_filepath",
|
||||||
|
Value: "testdata/file_sd.json",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "job",
|
Name: "job",
|
||||||
Value: "foo",
|
Value: "foo",
|
||||||
|
@ -442,10 +442,6 @@ scrape_configs:
|
||||||
Name: "__address__",
|
Name: "__address__",
|
||||||
Value: "host2",
|
Value: "host2",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Name: "__meta_filepath",
|
|
||||||
Value: "testdata/file_sd.json",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
Name: "__metrics_path__",
|
Name: "__metrics_path__",
|
||||||
Value: "/abc/de",
|
Value: "/abc/de",
|
||||||
|
@ -454,6 +450,10 @@ scrape_configs:
|
||||||
Name: "__scheme__",
|
Name: "__scheme__",
|
||||||
Value: "http",
|
Value: "http",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "__vm_filepath",
|
||||||
|
Value: "testdata/file_sd.json",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "job",
|
Name: "job",
|
||||||
Value: "foo",
|
Value: "foo",
|
||||||
|
@ -476,10 +476,6 @@ scrape_configs:
|
||||||
Name: "__address__",
|
Name: "__address__",
|
||||||
Value: "localhost:9090",
|
Value: "localhost:9090",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Name: "__meta_filepath",
|
|
||||||
Value: "testdata/file_sd_1.yml",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
Name: "__metrics_path__",
|
Name: "__metrics_path__",
|
||||||
Value: "/abc/de",
|
Value: "/abc/de",
|
||||||
|
@ -488,6 +484,10 @@ scrape_configs:
|
||||||
Name: "__scheme__",
|
Name: "__scheme__",
|
||||||
Value: "http",
|
Value: "http",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "__vm_filepath",
|
||||||
|
Value: "testdata/file_sd_1.yml",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "job",
|
Name: "job",
|
||||||
Value: "foo",
|
Value: "foo",
|
||||||
|
|
Loading…
Reference in a new issue