From edba6ff5b851b3fee3d45a51a43b0d96a353383e Mon Sep 17 00:00:00 2001 From: Xu Dongyan Date: Tue, 15 Aug 2023 23:49:36 +0800 Subject: [PATCH] merge const labels of all probers --- conf/conf.go | 4 +++- conf/constlables.go | 37 +++++++++++++++++++++++++++++++++++++ conf/constlables_test.go | 35 +++++++++++++++++++++++++++++++++++ probe/base/base.go | 8 ++++++++ probe/probe.go | 3 +++ 5 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 conf/constlables.go create mode 100644 conf/constlables_test.go diff --git a/conf/conf.go b/conf/conf.go index 6d810d4f..ce9d57b8 100644 --- a/conf/conf.go +++ b/conf/conf.go @@ -436,7 +436,9 @@ func isProbe(t reflect.Type) bool { // AllProbers return all probers func (conf *Conf) AllProbers() []probe.Prober { log.Debugf("--------- Process the probers settings ---------") - return allProbersHelper(*conf) + all := allProbersHelper(*conf) + MergeConstLabels(all) + return all } func allProbersHelper(i interface{}) []probe.Prober { diff --git a/conf/constlables.go b/conf/constlables.go new file mode 100644 index 00000000..3365d97f --- /dev/null +++ b/conf/constlables.go @@ -0,0 +1,37 @@ +package conf + +import ( + "github.com/megaease/easeprobe/metric" + "github.com/megaease/easeprobe/probe" +) + +var constLabels = make(map[string]bool) + +// MergeConstLabels merge const labels from all probers. +// Prometheus requires all metric of the same name have the same set of labels in a collector +func MergeConstLabels(ps []probe.Prober) { + for _, p := range ps { + for _, k := range p.Label() { + constLabels[k.Name] = true + } + } + + for _, p := range ps { + buildConstLabels(p) + } +} +func buildConstLabels(p probe.Prober) { + ls := p.Label() +LA: + for k, _ := range constLabels { + for _, l := range ls { + if k == l.Name { + continue LA + } + } + + ls = append(ls, metric.Label{Name: k, Value: ""}) + } + + p.SetLabel(ls) +} diff --git a/conf/constlables_test.go b/conf/constlables_test.go new file mode 100644 index 00000000..e517ca61 --- /dev/null +++ b/conf/constlables_test.go @@ -0,0 +1,35 @@ +package conf + +import ( + "github.com/megaease/easeprobe/metric" + "github.com/megaease/easeprobe/probe" + "github.com/megaease/easeprobe/probe/base" + "github.com/megaease/easeprobe/probe/http" + "github.com/megaease/easeprobe/probe/tcp" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestMergeConstLabels(t *testing.T) { + + ps := []probe.Prober{ + &http.HTTP{ + DefaultProbe: base.DefaultProbe{ + Labels: []metric.Label{{"service", "service_a"}}, + }, + }, + &tcp.TCP{ + DefaultProbe: base.DefaultProbe{ + Labels: []metric.Label{{"host", "host_b"}}, + }, + }, + } + + MergeConstLabels(ps) + + assert.Equal(t, "service_a", ps[0].Label()[0].Value) + assert.Equal(t, "host_b", ps[0].Label()[1].Value) + + assert.Equal(t, "host_a", ps[1].Label()[0].Value) + assert.Equal(t, "service_b", ps[1].Label()[1].Value) +} diff --git a/probe/base/base.go b/probe/base/base.go index 307df8a3..1a14ad1a 100644 --- a/probe/base/base.go +++ b/probe/base/base.go @@ -60,6 +60,14 @@ type DefaultProbe struct { metrics *metrics `yaml:"-" json:"-"` } +func (d *DefaultProbe) Label() []metric.Label { + return d.Labels +} + +func (d *DefaultProbe) SetLabel(allLabels []metric.Label) { + d.Labels = allLabels +} + // Kind return the probe kind func (d *DefaultProbe) Kind() string { return d.ProbeKind diff --git a/probe/probe.go b/probe/probe.go index 5db1f4c8..86344ffb 100644 --- a/probe/probe.go +++ b/probe/probe.go @@ -22,10 +22,13 @@ import ( "time" "github.com/megaease/easeprobe/global" + "github.com/megaease/easeprobe/metric" ) // Prober Interface type Prober interface { + Label() []metric.Label + SetLabel([]metric.Label) Kind() string Name() string Channels() []string