Skip to content

Commit 1175ca6

Browse files
refactor promconverter
1 parent 82309f5 commit 1175ca6

65 files changed

Lines changed: 1191 additions & 1200 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/operator/v1beta1/vmextra_types.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,21 @@ const (
4545
ClusterComponentStorage ClusterComponent = "storage"
4646
)
4747

48+
type MetadataStrategy string
49+
50+
const (
51+
// MetadataStrategyPreferVM - prefers VM object meta values, ignores prometheus
52+
MetadataStrategyPreferVM MetadataStrategy = "prefer-victoriametrics"
53+
// MetadataStrategyPreferProm - prefers prometheus
54+
MetadataStrategyPreferProm MetadataStrategy = "prefer-prometheus"
55+
// MetadataStrategyMergeVMPriority merges both label sets
56+
// its not possible to remove values
57+
MetadataStrategyMergeVMPriority MetadataStrategy = "merge-victoriametrics-priority"
58+
// MetadataStrategyMergePromPriority merges both label sets
59+
// its not possible to remove values
60+
MetadataStrategyMergePromPriority MetadataStrategy = "merge-prometheus-priority"
61+
)
62+
4863
const (
4964
httpPathPrefixFlag = "http.pathPrefix"
5065
reloadAuthKeyFlag = "reloadAuthKey"
@@ -70,6 +85,19 @@ const (
7085
VMAuthLBServiceProxyTargetLabel = "operator.victoriametrics.com/vmauthlb-proxy-name"
7186
VMAuthLBServiceProxyJobNameLabel = "operator.victoriametrics.com/vmauthlb-proxy-job-name"
7287
KubeNodeEnvName = "KUBE_NODE_NAME"
88+
// IgnoreConversionLabel this annotation disables updating of corresponding VMObject
89+
// must be added to annotation of VMObject
90+
// annotations:
91+
// operator.victoriametrics.com/ignore-prometheus-updates: enabled
92+
IgnoreConversionLabel = "operator.victoriametrics.com/ignore-prometheus-updates"
93+
// IgnoreConversion - disables updates from prometheus api
94+
IgnoreConversion = "enabled"
95+
// MetadataStrategyLabel merge strategy by default prefer prometheus meta labels
96+
// but with annotation value added to VMObject:
97+
// annotations:
98+
// operator.victoriametrics.com/merge-api-strategy: prefer-victoriametrics
99+
// metadata from VMObject will be preferred during merge
100+
MetadataStrategyLabel = "operator.victoriametrics.com/merge-meta-strategy"
73101
)
74102

75103
const (

docs/api.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2551,6 +2551,8 @@ Appears in: [VLAgentSpec](#vlagentspec), [VLClusterSpec](#vlclusterspec), [VLSin
25512551
| labels<a href="#managedobjectsmetadata-labels" id="managedobjectsmetadata-labels">#</a><br/>_object (keys:string, values:string)_ | _(Required)_<br/>Labels Map of string keys and values that can be used to organize and categorize<br />(scope and select) objects.<br />More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels |
25522552

25532553

2554+
2555+
25542556
#### NamespaceDiscovery
25552557

25562558

internal/config/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,7 @@ type BaseOperatorConf struct {
524524

525525
EnabledPrometheusConverter struct {
526526
PodMonitor bool `default:"true" env:"PODMONITOR"`
527-
ServiceScrape bool `default:"true" env:"SERVICESCRAPE"`
527+
ServiceMonitor bool `default:"true" env:"SERVICESCRAPE"`
528528
PrometheusRule bool `default:"true" env:"PROMETHEUSRULE"`
529529
Probe bool `default:"true" env:"PROBE"`
530530
AlertmanagerConfig bool `default:"true" env:"ALERTMANAGERCONFIG"`

internal/controller/operator/controllers.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,16 @@ var (
6363
Name: "operator_controller_reconcile_errors_total",
6464
Help: "Counts number context.Canceled errors",
6565
})
66+
activeConverterWatchers = prometheus.NewGaugeVec(prometheus.GaugeOpts{
67+
Name: "operator_prometheus_converter_active_watchers",
68+
}, []string{"object_type_name"})
6669
)
6770

6871
// InitMetrics adds metrics to the Registry
6972
func init() {
70-
metrics.Registry.MustRegister(parseObjectErrorsTotal, getObjectsErrorsTotal, conflictErrorsTotal, contextCancelErrorsTotal)
73+
metrics.Registry.MustRegister(
74+
parseObjectErrorsTotal, getObjectsErrorsTotal, conflictErrorsTotal,
75+
contextCancelErrorsTotal, activeConverterWatchers)
7176
}
7277

7378
func getDefaultOptions() controller.Options {

internal/controller/operator/converter/apis.go renamed to internal/controller/operator/factory/converter/apis.go

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,27 @@
11
package converter
22

33
import (
4+
"context"
45
"math"
56
"strings"
67

78
promv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
89
corev1 "k8s.io/api/core/v1"
910
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1011
"k8s.io/utils/ptr"
11-
logf "sigs.k8s.io/controller-runtime/pkg/log"
1212

1313
vmv1beta1 "github.com/VictoriaMetrics/operator/api/operator/v1beta1"
1414
"github.com/VictoriaMetrics/operator/internal/config"
15+
"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/logger"
1516
)
1617

1718
const (
1819
prometheusSecretDir = "/etc/prometheus/secrets"
1920
prometheusConfigmapDir = "/etc/prometheus/configmaps"
2021
)
2122

22-
var log = logf.Log.WithName("controller.PrometheusConverter")
23-
24-
// ConvertPromRule creates VMRule from PrometheusRule
25-
func ConvertPromRule(prom *promv1.PrometheusRule, conf *config.BaseOperatorConf) *vmv1beta1.VMRule {
23+
// PrometheusRule creates VMRule from PrometheusRule
24+
func PrometheusRule(ctx context.Context, prom *promv1.PrometheusRule, conf *config.BaseOperatorConf) *vmv1beta1.VMRule {
2625
ruleGroups := make([]vmv1beta1.RuleGroup, 0, len(prom.Spec.Groups))
2726
for _, promGroup := range prom.Spec.Groups {
2827
ruleItems := make([]vmv1beta1.Rule, 0, len(promGroup.Rules))
@@ -100,8 +99,8 @@ func MaybeAddArgoCDIgnoreAnnotations(mustAdd bool, dst map[string]string) map[st
10099
return dst
101100
}
102101

103-
// ConvertServiceMonitor create VMServiceScrape from ServiceMonitor
104-
func ConvertServiceMonitor(serviceMon *promv1.ServiceMonitor, conf *config.BaseOperatorConf) *vmv1beta1.VMServiceScrape {
102+
// ServiceMonitor create VMServiceScrape from ServiceMonitor
103+
func ServiceMonitor(ctx context.Context, serviceMon *promv1.ServiceMonitor, conf *config.BaseOperatorConf) *vmv1beta1.VMServiceScrape {
105104
cs := &vmv1beta1.VMServiceScrape{
106105
ObjectMeta: metav1.ObjectMeta{
107106
Name: serviceMon.Name,
@@ -114,7 +113,7 @@ func ConvertServiceMonitor(serviceMon *promv1.ServiceMonitor, conf *config.BaseO
114113
TargetLabels: serviceMon.Spec.TargetLabels,
115114
PodTargetLabels: serviceMon.Spec.PodTargetLabels,
116115
Selector: serviceMon.Spec.Selector,
117-
Endpoints: convertEndpoint(serviceMon.Spec.Endpoints),
116+
Endpoints: convertEndpoint(ctx, serviceMon.Spec.Endpoints),
118117
NamespaceSelector: vmv1beta1.NamespaceSelector{
119118
Any: serviceMon.Spec.NamespaceSelector.Any,
120119
MatchNames: serviceMon.Spec.NamespaceSelector.MatchNames,
@@ -201,7 +200,7 @@ func convertBearerToken(src *corev1.SecretKeySelector) *corev1.SecretKeySelector
201200
return src
202201
}
203202

204-
func convertEndpoint(promEndpoint []promv1.Endpoint) []vmv1beta1.Endpoint {
203+
func convertEndpoint(ctx context.Context, promEndpoint []promv1.Endpoint) []vmv1beta1.Endpoint {
205204
endpoints := make([]vmv1beta1.Endpoint, 0, len(promEndpoint))
206205
for _, endpoint := range promEndpoint {
207206
ep := vmv1beta1.Endpoint{
@@ -231,8 +230,8 @@ func convertEndpoint(promEndpoint []promv1.Endpoint) []vmv1beta1.Endpoint {
231230
BearerTokenSecret: convertBearerToken(endpoint.BearerTokenSecret),
232231
},
233232
EndpointRelabelings: vmv1beta1.EndpointRelabelings{
234-
MetricRelabelConfigs: ConvertRelabelConfig(endpoint.MetricRelabelConfigs),
235-
RelabelConfigs: ConvertRelabelConfig(endpoint.RelabelConfigs),
233+
MetricRelabelConfigs: ConvertRelabelConfig(ctx, endpoint.MetricRelabelConfigs),
234+
RelabelConfigs: ConvertRelabelConfig(ctx, endpoint.RelabelConfigs),
236235
},
237236
}
238237

@@ -303,7 +302,7 @@ func convertSecretOrConfigmap(promSCM promv1.SecretOrConfigMap) vmv1beta1.Secret
303302
}
304303

305304
// ConvertRelabelConfig converts Prometheus relabel config to VM one
306-
func ConvertRelabelConfig(promRelabelConfig []promv1.RelabelConfig) []*vmv1beta1.RelabelConfig {
305+
func ConvertRelabelConfig(ctx context.Context, promRelabelConfig []promv1.RelabelConfig) []*vmv1beta1.RelabelConfig {
307306
if promRelabelConfig == nil {
308307
return nil
309308
}
@@ -331,10 +330,10 @@ func ConvertRelabelConfig(promRelabelConfig []promv1.RelabelConfig) []*vmv1beta1
331330
relabelCfg[idx].Regex = vmv1beta1.StringOrArray{relabel.Regex}
332331
}
333332
}
334-
return filterUnsupportedRelabelCfg(relabelCfg)
333+
return filterUnsupportedRelabelCfg(ctx, relabelCfg)
335334
}
336335

337-
func convertPodEndpoints(promPodEnpoints []promv1.PodMetricsEndpoint) []vmv1beta1.PodMetricsEndpoint {
336+
func convertPodEndpoints(ctx context.Context, promPodEnpoints []promv1.PodMetricsEndpoint) []vmv1beta1.PodMetricsEndpoint {
338337
if promPodEnpoints == nil {
339338
return nil
340339
}
@@ -364,8 +363,8 @@ func convertPodEndpoints(promPodEnpoints []promv1.PodMetricsEndpoint) []vmv1beta
364363
FollowRedirects: promEndPoint.FollowRedirects,
365364
},
366365
EndpointRelabelings: vmv1beta1.EndpointRelabelings{
367-
RelabelConfigs: ConvertRelabelConfig(promEndPoint.RelabelConfigs),
368-
MetricRelabelConfigs: ConvertRelabelConfig(promEndPoint.MetricRelabelConfigs),
366+
RelabelConfigs: ConvertRelabelConfig(ctx, promEndPoint.RelabelConfigs),
367+
MetricRelabelConfigs: ConvertRelabelConfig(ctx, promEndPoint.MetricRelabelConfigs),
369368
},
370369

371370
EndpointAuth: vmv1beta1.EndpointAuth{
@@ -383,8 +382,8 @@ func convertPodEndpoints(promPodEnpoints []promv1.PodMetricsEndpoint) []vmv1beta
383382
return endPoints
384383
}
385384

386-
// ConvertPodMonitor create VMPodScrape from PodMonitor
387-
func ConvertPodMonitor(podMon *promv1.PodMonitor, conf *config.BaseOperatorConf) *vmv1beta1.VMPodScrape {
385+
// PodMonitor create VMPodScrape from PodMonitor
386+
func PodMonitor(ctx context.Context, podMon *promv1.PodMonitor, conf *config.BaseOperatorConf) *vmv1beta1.VMPodScrape {
388387
cs := &vmv1beta1.VMPodScrape{
389388
ObjectMeta: metav1.ObjectMeta{
390389
Name: podMon.Name,
@@ -400,7 +399,7 @@ func ConvertPodMonitor(podMon *promv1.PodMonitor, conf *config.BaseOperatorConf)
400399
Any: podMon.Spec.NamespaceSelector.Any,
401400
MatchNames: podMon.Spec.NamespaceSelector.MatchNames,
402401
},
403-
PodMetricsEndpoints: convertPodEndpoints(podMon.Spec.PodMetricsEndpoints),
402+
PodMetricsEndpoints: convertPodEndpoints(ctx, podMon.Spec.PodMetricsEndpoints),
404403
ScrapeClassName: podMon.Spec.ScrapeClassName,
405404
},
406405
}
@@ -428,8 +427,8 @@ func ConvertPodMonitor(podMon *promv1.PodMonitor, conf *config.BaseOperatorConf)
428427
return cs
429428
}
430429

431-
// ConvertProbe creates VMProbe from prometheus probe
432-
func ConvertProbe(probe *promv1.Probe, conf *config.BaseOperatorConf) *vmv1beta1.VMProbe {
430+
// Probe creates VMProbe from prometheus probe
431+
func Probe(ctx context.Context, probe *promv1.Probe, conf *config.BaseOperatorConf) *vmv1beta1.VMProbe {
433432
var (
434433
k8sTargets []*vmv1beta1.VMProbeTargetKubernetes
435434
staticTargets *vmv1beta1.VMProbeTargetStatic
@@ -442,14 +441,14 @@ func ConvertProbe(probe *promv1.Probe, conf *config.BaseOperatorConf) *vmv1beta1
442441
Any: probe.Spec.Targets.Ingress.NamespaceSelector.Any,
443442
MatchNames: probe.Spec.Targets.Ingress.NamespaceSelector.MatchNames,
444443
},
445-
RelabelConfigs: ConvertRelabelConfig(probe.Spec.Targets.Ingress.RelabelConfigs),
444+
RelabelConfigs: ConvertRelabelConfig(ctx, probe.Spec.Targets.Ingress.RelabelConfigs),
446445
})
447446
}
448447
if probe.Spec.Targets.StaticConfig != nil {
449448
staticTargets = &vmv1beta1.VMProbeTargetStatic{
450449
Targets: probe.Spec.Targets.StaticConfig.Targets,
451450
Labels: probe.Spec.Targets.StaticConfig.Labels,
452-
RelabelConfigs: ConvertRelabelConfig(probe.Spec.Targets.StaticConfig.RelabelConfigs),
451+
RelabelConfigs: ConvertRelabelConfig(ctx, probe.Spec.Targets.StaticConfig.RelabelConfigs),
453452
}
454453
}
455454
var safeTLS *promv1.SafeTLSConfig
@@ -479,7 +478,7 @@ func ConvertProbe(probe *promv1.Probe, conf *config.BaseOperatorConf) *vmv1beta1
479478
Interval: string(probe.Spec.Interval),
480479
ScrapeTimeout: string(probe.Spec.ScrapeTimeout),
481480
},
482-
MetricRelabelConfigs: ConvertRelabelConfig(probe.Spec.MetricRelabelConfigs),
481+
MetricRelabelConfigs: ConvertRelabelConfig(ctx, probe.Spec.MetricRelabelConfigs),
483482
EndpointAuth: vmv1beta1.EndpointAuth{
484483
BasicAuth: ConvertBasicAuth(probe.Spec.BasicAuth),
485484
BearerTokenSecret: convertBearerToken(probe.Spec.BearerTokenSecret), //nolint:staticcheck
@@ -512,13 +511,13 @@ func ConvertProbe(probe *promv1.Probe, conf *config.BaseOperatorConf) *vmv1beta1
512511
return cp
513512
}
514513

515-
func filterUnsupportedRelabelCfg(relabelCfgs []*vmv1beta1.RelabelConfig) []*vmv1beta1.RelabelConfig {
514+
func filterUnsupportedRelabelCfg(ctx context.Context, relabelCfgs []*vmv1beta1.RelabelConfig) []*vmv1beta1.RelabelConfig {
516515
newRelabelCfg := make([]*vmv1beta1.RelabelConfig, 0, len(relabelCfgs))
517516
for _, r := range relabelCfgs {
518517
switch r.Action {
519518
case "keep", "hashmod", "drop":
520519
if len(r.SourceLabels) == 0 {
521-
log.Info("filtering unsupported format of relabelConfig", "action", r.Action, "reason", "source labels are empty")
520+
logger.WithContext(ctx).Info("filtering unsupported format of relabelConfig", "action", r.Action, "reason", "source labels are empty")
522521
continue
523522
}
524523
}

0 commit comments

Comments
 (0)