Skip to content

Commit 72f2c52

Browse files
authored
adds filtering for prometheus converter relabelConfig (#93)
* adds filtering for prometheus converter now unsupported by vmagent relabel configuration will be skipped #92 * fixes tests * reformat imports, fixes typo
1 parent abc2ee5 commit 72f2c52

4 files changed

Lines changed: 108 additions & 11 deletions

File tree

controllers/converter/apis.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
package converter
22

33
import (
4+
"strings"
5+
46
v1beta1vm "github.com/VictoriaMetrics/operator/api/v1beta1"
57
"github.com/VictoriaMetrics/operator/controllers/factory"
68
v1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
79
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8-
"strings"
10+
ctrl "sigs.k8s.io/controller-runtime"
911
)
1012

1113
const (
1214
prometheusSecretDir = "/etc/prometheus/secrets"
1315
prometheusConfigmapDir = "/etc/prometheus/configmaps"
1416
)
1517

18+
var log = ctrl.Log.WithValues("controller", "prometheus.converter")
19+
1620
func ConvertPromRule(prom *v1.PrometheusRule) *v1beta1vm.VMRule {
1721

1822
ruleGroups := []v1beta1vm.RuleGroup{}
@@ -143,9 +147,9 @@ func ConvertRelabelConfig(promRelabelConfig []*v1.RelabelConfig) []*v1beta1vm.Re
143147
if promRelabelConfig == nil {
144148
return nil
145149
}
146-
relalbelConf := []*v1beta1vm.RelabelConfig{}
150+
relabelCfg := []*v1beta1vm.RelabelConfig{}
147151
for _, relabel := range promRelabelConfig {
148-
relalbelConf = append(relalbelConf, &v1beta1vm.RelabelConfig{
152+
relabelCfg = append(relabelCfg, &v1beta1vm.RelabelConfig{
149153
SourceLabels: relabel.SourceLabels,
150154
Separator: relabel.Separator,
151155
TargetLabel: relabel.TargetLabel,
@@ -155,7 +159,7 @@ func ConvertRelabelConfig(promRelabelConfig []*v1.RelabelConfig) []*v1beta1vm.Re
155159
Action: relabel.Action,
156160
})
157161
}
158-
return relalbelConf
162+
return filterUnsupportedRelabelCfg(relabelCfg)
159163

160164
}
161165

@@ -248,3 +252,18 @@ func ConvertProbe(probe *v1.Probe) *v1beta1vm.VMProbe {
248252
},
249253
}
250254
}
255+
256+
func filterUnsupportedRelabelCfg(relabelCfgs []*v1beta1vm.RelabelConfig) []*v1beta1vm.RelabelConfig {
257+
newRelabelCfg := make([]*v1beta1vm.RelabelConfig, 0, len(relabelCfgs))
258+
for _, r := range relabelCfgs {
259+
switch r.Action {
260+
case "keep", "hashmod", "drop":
261+
if len(r.SourceLabels) == 0 {
262+
log.Info("filtering unsupported relabelConfig", "action", r.Action, "reason", "source labels are empty")
263+
continue
264+
}
265+
}
266+
newRelabelCfg = append(newRelabelCfg, r)
267+
}
268+
return newRelabelCfg
269+
}

controllers/converter/apis_test.go

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,26 @@ func TestConvertRelabelConfig(t *testing.T) {
7474
},
7575
},
7676
},
77+
{
78+
name: "unsupported config",
79+
args: args{
80+
promRelabelConfig: []*v1.RelabelConfig{
81+
{
82+
Action: "drop",
83+
},
84+
{
85+
Action: "keep",
86+
SourceLabels: []string{"__address__"},
87+
},
88+
},
89+
},
90+
want: []*v1beta1vm.RelabelConfig{
91+
{
92+
Action: "keep",
93+
SourceLabels: []string{"__address__"},
94+
},
95+
},
96+
},
7797
}
7898
for _, tt := range tests {
7999
t.Run(tt.name, func(t *testing.T) {
@@ -108,7 +128,11 @@ func TestConvertEndpoint(t *testing.T) {
108128
Path: "/metrics",
109129
RelabelConfigs: []*v1.RelabelConfig{
110130
{
111-
Action: "drop",
131+
Action: "drop",
132+
SourceLabels: []string{"__meta__instance"},
133+
},
134+
{
135+
Action: "keep",
112136
},
113137
},
114138
},
@@ -120,7 +144,8 @@ func TestConvertEndpoint(t *testing.T) {
120144
Port: "9100",
121145
RelabelConfigs: []*v1beta1vm.RelabelConfig{
122146
{
123-
Action: "drop",
147+
Action: "drop",
148+
SourceLabels: []string{"__meta__instance"},
124149
},
125150
},
126151
},
@@ -154,7 +179,8 @@ func TestConvertServiceMonitor(t *testing.T) {
154179
{
155180
MetricRelabelConfigs: []*v1.RelabelConfig{
156181
{
157-
Action: "drop",
182+
Action: "drop",
183+
SourceLabels: []string{"__meta__instance"},
158184
},
159185
},
160186
},
@@ -168,7 +194,8 @@ func TestConvertServiceMonitor(t *testing.T) {
168194
{
169195
MetricRelabelConfigs: []*v1beta1vm.RelabelConfig{
170196
{
171-
Action: "drop",
197+
Action: "drop",
198+
SourceLabels: []string{"__meta__instance"},
172199
},
173200
},
174201
},

controllers/vmprometheusconverter_controller.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ func (c *ConverterController) CreatePrometheusRule(rule interface{}) {
219219
if err != nil {
220220
if errors.IsAlreadyExists(err) {
221221
l.Info("AlertRule already exists")
222+
c.UpdatePrometheusRule(nil, promRule)
222223
return
223224
}
224225
l.Error(err, "cannot create AlertRule from Prometheusrule")
@@ -268,6 +269,7 @@ func (c *ConverterController) CreateServiceMonitor(service interface{}) {
268269
if err != nil {
269270
if errors.IsAlreadyExists(err) {
270271
l.Info("vmServiceScrape exists")
272+
c.UpdateServiceMonitor(nil, serviceMon)
271273
return
272274
}
273275
l.Error(err, "cannot create vmServiceScrape")
@@ -277,7 +279,7 @@ func (c *ConverterController) CreateServiceMonitor(service interface{}) {
277279
}
278280

279281
// UpdateServiceMonitor updates VMServiceMonitor
280-
func (c *ConverterController) UpdateServiceMonitor(old, new interface{}) {
282+
func (c *ConverterController) UpdateServiceMonitor(_, new interface{}) {
281283
serviceMonNew := new.(*v1.ServiceMonitor)
282284
l := log.WithValues("kind", "vmServiceScrape", "name", serviceMonNew.Name, "ns", serviceMonNew.Namespace)
283285
l.Info("updating vmServiceScrape")
@@ -317,6 +319,7 @@ func (c *ConverterController) CreatePodMonitor(pod interface{}) {
317319
if err != nil {
318320
if errors.IsAlreadyExists(err) {
319321
l.Info("podScrape already exists")
322+
c.UpdatePodMonitor(nil, podMonitor)
320323
return
321324
}
322325
l.Error(err, "cannot create podScrape")
@@ -327,7 +330,7 @@ func (c *ConverterController) CreatePodMonitor(pod interface{}) {
327330
}
328331

329332
// UpdatePodMonitor updates VMPodScrape
330-
func (c *ConverterController) UpdatePodMonitor(old, new interface{}) {
333+
func (c *ConverterController) UpdatePodMonitor(_, new interface{}) {
331334
podMonitorNew := new.(*v1.PodMonitor)
332335
l := log.WithValues("kind", "podScrape", "name", podMonitorNew.Name, "ns", podMonitorNew.Namespace)
333336
podScrape := converter.ConvertPodMonitor(podMonitorNew)
@@ -407,6 +410,7 @@ func (c *ConverterController) CreateProbe(obj interface{}) {
407410
if err != nil {
408411
if errors.IsAlreadyExists(err) {
409412
l.Info("vmProbe already exists")
413+
c.UpdateProbe(nil, probe)
410414
return
411415
}
412416
l.Error(err, "cannot create vmProbe")
@@ -417,7 +421,7 @@ func (c *ConverterController) CreateProbe(obj interface{}) {
417421
}
418422

419423
// UpdateProbe updates VMProbe
420-
func (c *ConverterController) UpdateProbe(old, new interface{}) {
424+
func (c *ConverterController) UpdateProbe(_, new interface{}) {
421425
probeNew := new.(*v1.Probe)
422426
l := log.WithValues("kind", "vmProbe", "name", probeNew.Name, "ns", probeNew.Namespace)
423427
vmProbe := converter.ConvertProbe(probeNew)

e2e/prometheus_converter_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package e2e
22

33
import (
44
"context"
5+
"fmt"
6+
57
victoriametricsv1beta1 "github.com/VictoriaMetrics/operator/api/v1beta1"
68
monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
79

@@ -56,6 +58,51 @@ var _ = Describe("test prometheusConverter Controller", func() {
5658
})
5759
}, 60, 1).Should(Succeed())
5860
})
61+
It("should create prometheus ServiceMonitor with relabel filter", func() {
62+
Expect(k8sClient.Create(context.TODO(), &monitoringv1.ServiceMonitor{
63+
ObjectMeta: metav1.ObjectMeta{
64+
Namespace: namespace,
65+
Name: name,
66+
},
67+
Spec: monitoringv1.ServiceMonitorSpec{
68+
Endpoints: []monitoringv1.Endpoint{
69+
{
70+
Port: "8081",
71+
RelabelConfigs: []*monitoringv1.RelabelConfig{
72+
{
73+
Action: "keep",
74+
},
75+
{
76+
Action: "drop",
77+
SourceLabels: []string{"__address__"},
78+
},
79+
},
80+
},
81+
},
82+
Selector: metav1.LabelSelector{MatchLabels: map[string]string{"managed-by": "vm-operator"}},
83+
},
84+
})).To(Succeed())
85+
Eventually(func() error {
86+
expectedVMServiceScrape := &victoriametricsv1beta1.VMServiceScrape{
87+
ObjectMeta: metav1.ObjectMeta{
88+
Name: name,
89+
Namespace: namespace,
90+
}}
91+
err := k8sClient.Get(context.TODO(), types.NamespacedName{Namespace: namespace, Name: name}, expectedVMServiceScrape)
92+
if err != nil {
93+
return err
94+
}
95+
if len(expectedVMServiceScrape.Spec.Endpoints) != 1 {
96+
return fmt.Errorf("unexpected number of endpoints, want 1, got: %d", len(expectedVMServiceScrape.Spec.Endpoints))
97+
}
98+
endpoint := expectedVMServiceScrape.Spec.Endpoints[0]
99+
if len(endpoint.RelabelConfigs) != 1 {
100+
return fmt.Errorf("unexpected relabelConfig for vmservice scrape, want len 1, got endpoint: %v", endpoint)
101+
}
102+
return nil
103+
}, 60, 1).Should(Succeed())
104+
})
105+
59106
})
60107

61108
},

0 commit comments

Comments
 (0)