Skip to content

Commit 3225b3a

Browse files
committed
Refactor CR metrics
Signed-off-by: Ruben Vargas <[email protected]>
1 parent 9948a1d commit 3225b3a

File tree

7 files changed

+104
-97
lines changed

7 files changed

+104
-97
lines changed

apis/v1beta1/collector_webhook.go

+13-17
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ type CollectorWebhook struct {
7676
cfg config.Config
7777
scheme *runtime.Scheme
7878
reviewer *rbac.Reviewer
79+
metrics *Metrics
7980
}
8081

8182
func (c CollectorWebhook) Default(_ context.Context, obj runtime.Object) error {
@@ -171,10 +172,8 @@ func (c CollectorWebhook) ValidateCreate(ctx context.Context, obj runtime.Object
171172
if err != nil {
172173
return warnings, err
173174
}
174-
175-
err = IncCounters(ctx, otelcol)
176-
if err != nil {
177-
return warnings, err
175+
if c.metrics != nil {
176+
c.metrics.incCounters(ctx, otelcol)
178177
}
179178

180179
return warnings, nil
@@ -196,17 +195,13 @@ func (c CollectorWebhook) ValidateUpdate(ctx context.Context, oldObj, newObj run
196195
return warnings, err
197196
}
198197

199-
// Decrease all metrics related to old CR
200-
err = DecCounters(ctx, otelcolOld)
201-
if err != nil {
202-
return warnings, err
198+
if c.metrics != nil {
199+
// Decrease all metrics related to old CR
200+
c.metrics.decCounters(ctx, otelcolOld)
201+
// Increase all metrics related to new CR
202+
c.metrics.incCounters(ctx, otelcol)
203203
}
204204

205-
// Increase all metrics related to new CR
206-
err = IncCounters(ctx, otelcolOld)
207-
if err != nil {
208-
return warnings, err
209-
}
210205
return warnings, nil
211206
}
212207

@@ -220,9 +215,9 @@ func (c CollectorWebhook) ValidateDelete(ctx context.Context, obj runtime.Object
220215
if err != nil {
221216
return warnings, err
222217
}
223-
err = DecCounters(ctx, otelcol)
224-
if err != nil {
225-
return warnings, err
218+
219+
if c.metrics != nil {
220+
c.metrics.decCounters(ctx, otelcol)
226221
}
227222

228223
return warnings, nil
@@ -462,12 +457,13 @@ func checkAutoscalerSpec(autoscaler *AutoscalerSpec) error {
462457
return nil
463458
}
464459

465-
func SetupCollectorWebhook(mgr ctrl.Manager, cfg config.Config, reviewer *rbac.Reviewer) error {
460+
func SetupCollectorWebhook(mgr ctrl.Manager, cfg config.Config, reviewer *rbac.Reviewer, metrics *Metrics) error {
466461
cvw := &CollectorWebhook{
467462
reviewer: reviewer,
468463
logger: mgr.GetLogger().WithValues("handler", "CollectorWebhook", "version", "v1beta1"),
469464
scheme: mgr.GetScheme(),
470465
cfg: cfg,
466+
metrics: metrics,
471467
}
472468
return ctrl.NewWebhookManagedBy(mgr).
473469
For(&OpenTelemetryCollector{}).

apis/v1beta1/metrics.go

+74-63
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,16 @@ type components struct {
4848
extensions []string
4949
}
5050

51+
type Metrics struct {
52+
modeCounter metric.Int64UpDownCounter
53+
receiversCounter metric.Int64UpDownCounter
54+
exporterCounter metric.Int64UpDownCounter
55+
processorCounter metric.Int64UpDownCounter
56+
extensionsCounter metric.Int64UpDownCounter
57+
}
58+
5159
// BootstrapMetrics configures the OpenTelemetry meter provider with the Prometheus exporter.
5260
func BootstrapMetrics() error {
53-
5461
exporter, err := prometheus.New(prometheus.WithRegisterer(metrics.Registry))
5562
if err != nil {
5663
return err
@@ -60,6 +67,72 @@ func BootstrapMetrics() error {
6067
return err
6168
}
6269

70+
func NewMetrics() (*Metrics, error) {
71+
meter := otel.Meter(meterName)
72+
modeCounter, err := meter.Int64UpDownCounter(mode)
73+
if err != nil {
74+
return nil, err
75+
}
76+
receiversCounter, err := meter.Int64UpDownCounter(receivers)
77+
if err != nil {
78+
return nil, err
79+
}
80+
81+
exporterCounter, err := meter.Int64UpDownCounter(exporters)
82+
if err != nil {
83+
return nil, err
84+
}
85+
86+
processorCounter, err := meter.Int64UpDownCounter(processors)
87+
if err != nil {
88+
return nil, err
89+
}
90+
91+
extensionsCounter, err := meter.Int64UpDownCounter(extensions)
92+
if err != nil {
93+
return nil, err
94+
}
95+
96+
return &Metrics{
97+
modeCounter: modeCounter,
98+
receiversCounter: receiversCounter,
99+
exporterCounter: exporterCounter,
100+
processorCounter: processorCounter,
101+
extensionsCounter: extensionsCounter,
102+
}, nil
103+
104+
}
105+
106+
func (m *Metrics) incCounters(ctx context.Context, collector *OpenTelemetryCollector) {
107+
m.updateComponentCounters(ctx, collector, true)
108+
m.updateGeneralCRMetricsComponents(ctx, collector, true)
109+
}
110+
111+
func (m *Metrics) decCounters(ctx context.Context, collector *OpenTelemetryCollector) {
112+
m.updateComponentCounters(ctx, collector, false)
113+
m.updateGeneralCRMetricsComponents(ctx, collector, false)
114+
}
115+
116+
func (m *Metrics) updateGeneralCRMetricsComponents(ctx context.Context, collector *OpenTelemetryCollector, up bool) {
117+
118+
inc := 1
119+
if !up {
120+
inc = -1
121+
}
122+
m.modeCounter.Add(ctx, int64(inc), metric.WithAttributes(
123+
attribute.Key("collector_name").String(collector.Name),
124+
attribute.Key("namespace").String(collector.Namespace),
125+
attribute.Key("type").String(string(collector.Spec.Mode)),
126+
))
127+
}
128+
func (m *Metrics) updateComponentCounters(ctx context.Context, collector *OpenTelemetryCollector, up bool) {
129+
components := getComponentsFromConfigV1Beta1(collector.Spec.Config)
130+
moveCounter(ctx, collector, components.receivers, m.receiversCounter, up)
131+
moveCounter(ctx, collector, components.exporters, m.exporterCounter, up)
132+
moveCounter(ctx, collector, components.processors, m.processorCounter, up)
133+
moveCounter(ctx, collector, components.extensions, m.extensionsCounter, up)
134+
}
135+
63136
func extractElements(elements map[string]interface{}) []string {
64137
if elements == nil {
65138
return []string{}
@@ -94,68 +167,6 @@ func getComponentsFromConfigV1Beta1(yamlContent Config) *components {
94167
return info
95168
}
96169

97-
func IncCounters(ctx context.Context, collector *OpenTelemetryCollector) error {
98-
if err := updateComponentCounters(ctx, collector, true); err != nil {
99-
return err
100-
}
101-
return updateGeneralCRMetricsComponents(ctx, collector, true)
102-
}
103-
104-
func DecCounters(ctx context.Context, collector *OpenTelemetryCollector) error {
105-
if err := updateComponentCounters(ctx, collector, false); err != nil {
106-
return err
107-
}
108-
return updateGeneralCRMetricsComponents(ctx, collector, false)
109-
}
110-
111-
func updateGeneralCRMetricsComponents(ctx context.Context, collector *OpenTelemetryCollector, up bool) error {
112-
meter := otel.Meter(meterName)
113-
modeCounter, err := meter.Int64UpDownCounter(mode)
114-
if err != nil {
115-
return err
116-
}
117-
inc := 1
118-
if !up {
119-
inc = -1
120-
}
121-
modeCounter.Add(ctx, int64(inc), metric.WithAttributes(
122-
attribute.Key("collector_name").String(collector.Name),
123-
attribute.Key("namespace").String(collector.Namespace),
124-
attribute.Key("type").String(string(collector.Spec.Mode)),
125-
))
126-
return nil
127-
}
128-
func updateComponentCounters(ctx context.Context, collector *OpenTelemetryCollector, up bool) error {
129-
meter := otel.Meter(meterName)
130-
receiversCounter, err := meter.Int64UpDownCounter(receivers)
131-
if err != nil {
132-
return err
133-
}
134-
135-
exporterCounter, err := meter.Int64UpDownCounter(exporters)
136-
if err != nil {
137-
return err
138-
}
139-
140-
processorCounter, err := meter.Int64UpDownCounter(processors)
141-
if err != nil {
142-
return err
143-
}
144-
145-
extensionsCounter, err := meter.Int64UpDownCounter(extensions)
146-
if err != nil {
147-
return err
148-
}
149-
150-
components := getComponentsFromConfigV1Beta1(collector.Spec.Config)
151-
moveCounter(ctx, collector, components.receivers, receiversCounter, up)
152-
moveCounter(ctx, collector, components.exporters, exporterCounter, up)
153-
moveCounter(ctx, collector, components.processors, processorCounter, up)
154-
moveCounter(ctx, collector, components.extensions, extensionsCounter, up)
155-
156-
return nil
157-
}
158-
159170
func moveCounter(
160171
ctx context.Context, collector *OpenTelemetryCollector, types []string, upDown metric.Int64UpDownCounter, up bool) {
161172
for _, exporter := range types {

config/manager/kustomization.yaml

-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,2 @@
11
resources:
22
- manager.yaml
3-
apiVersion: kustomize.config.k8s.io/v1beta1
4-
kind: Kustomization
5-
images:
6-
- name: controller
7-
newName: quay.io/rvargasp/opentelemetry-operator
8-
newTag: 1714976402.0.0

controllers/suite_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ func TestMain(m *testing.M) {
175175
}
176176
reviewer := rbac.NewReviewer(clientset)
177177

178-
if err = v1beta1.SetupCollectorWebhook(mgr, config.New(), reviewer); err != nil {
178+
if err = v1beta1.SetupCollectorWebhook(mgr, config.New(), reviewer, nil); err != nil {
179179
fmt.Printf("failed to SetupWebhookWithManager: %v", err)
180180
os.Exit(1)
181181
}

internal/webhook/podmutation/webhookhandler_suite_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func TestMain(m *testing.M) {
105105
}
106106
reviewer := rbac.NewReviewer(clientset)
107107

108-
if err = v1beta1.SetupCollectorWebhook(mgr, config.New(), reviewer); err != nil {
108+
if err = v1beta1.SetupCollectorWebhook(mgr, config.New(), reviewer, nil); err != nil {
109109
fmt.Printf("failed to SetupWebhookWithManager: %v", err)
110110
os.Exit(1)
111111
}

main.go

+14-8
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ func main() {
155155
pflag.BoolVar(&enableNginxInstrumentation, constants.FlagNginx, false, "Controls whether the operator supports nginx auto-instrumentation")
156156
pflag.BoolVar(&enableNodeJSInstrumentation, constants.FlagNodeJS, true, "Controls whether the operator supports nodejs auto-instrumentation")
157157
pflag.BoolVar(&enableJavaInstrumentation, constants.FlagJava, true, "Controls whether the operator supports java auto-instrumentation")
158-
pflag.BoolVar(&enableCRMetrics, constants.FlagCRMetrics, false, "Controls whether the CR metrics is enabled")
158+
pflag.BoolVar(&enableCRMetrics, constants.FlagCRMetrics, true, "Controls whether the CR metrics is enabled")
159159

160160
stringFlagOrEnv(&collectorImage, "collector-image", "RELATED_IMAGE_COLLECTOR", fmt.Sprintf("ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector:%s", v.OpenTelemetryCollector), "The default OpenTelemetry collector image. This image is used when no image is specified in the CustomResource.")
161161
stringFlagOrEnv(&targetAllocatorImage, "target-allocator-image", "RELATED_IMAGE_TARGET_ALLOCATOR", fmt.Sprintf("ghcr.io/open-telemetry/opentelemetry-operator/target-allocator:%s", v.TargetAllocator), "The default OpenTelemetry target allocator image. This image is used when no image is specified in the CustomResource.")
@@ -337,12 +337,6 @@ func main() {
337337
}
338338
}
339339

340-
if enableCRMetrics {
341-
if metricsErr := otelv1beta1.BootstrapMetrics(); metricsErr != nil {
342-
setupLog.Error(metricsErr, "Error bootstrapping CRD metrics")
343-
}
344-
}
345-
346340
if cfg.LabelsFilter() != nil {
347341
for _, basePattern := range cfg.LabelsFilter() {
348342
_, compileErr := regexp.Compile(basePattern)
@@ -381,7 +375,19 @@ func main() {
381375
}
382376

383377
if os.Getenv("ENABLE_WEBHOOKS") != "false" {
384-
if err = otelv1beta1.SetupCollectorWebhook(mgr, cfg, reviewer); err != nil {
378+
var crdMetrics *otelv1beta1.Metrics
379+
380+
if enableCRMetrics {
381+
if metricsErr := otelv1beta1.BootstrapMetrics(); metricsErr != nil {
382+
setupLog.Error(metricsErr, "Error bootstrapping CRD metrics")
383+
}
384+
crdMetrics, err = otelv1beta1.NewMetrics()
385+
if crdMetrics != nil {
386+
setupLog.Error(err, "Error bootstrapping CRD metrics")
387+
}
388+
}
389+
390+
if err = otelv1beta1.SetupCollectorWebhook(mgr, cfg, reviewer, crdMetrics); err != nil {
385391
setupLog.Error(err, "unable to create webhook", "webhook", "OpenTelemetryCollector")
386392
os.Exit(1)
387393
}

pkg/collector/upgrade/suite_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func TestMain(m *testing.M) {
105105
}
106106
reviewer := rbac.NewReviewer(clientset)
107107

108-
if err = v1beta1.SetupCollectorWebhook(mgr, config.New(), reviewer); err != nil {
108+
if err = v1beta1.SetupCollectorWebhook(mgr, config.New(), reviewer, nil); err != nil {
109109
fmt.Printf("failed to SetupWebhookWithManager: %v", err)
110110
os.Exit(1)
111111
}

0 commit comments

Comments
 (0)