From cccb91b4175869bdb39b8e1eb8e3673012eefee4 Mon Sep 17 00:00:00 2001 From: Tyler Helmuth <12352919+TylerHelmuth@users.noreply.github.com> Date: Thu, 17 Jul 2025 07:55:37 -0600 Subject: [PATCH 1/4] Add update script --- pkg/collector/upgrade/v0_130_0.go | 32 ++++ pkg/collector/upgrade/v0_130_0_test.go | 229 +++++++++++++++++++++++++ pkg/collector/upgrade/versions.go | 4 + 3 files changed, 265 insertions(+) create mode 100644 pkg/collector/upgrade/v0_130_0.go create mode 100644 pkg/collector/upgrade/v0_130_0_test.go diff --git a/pkg/collector/upgrade/v0_130_0.go b/pkg/collector/upgrade/v0_130_0.go new file mode 100644 index 0000000000..e07b0ad0fb --- /dev/null +++ b/pkg/collector/upgrade/v0_130_0.go @@ -0,0 +1,32 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package upgrade + +import ( + "github.com/open-telemetry/opentelemetry-operator/apis/v1beta1" +) + +func upgrade0_130_0(u VersionUpgrade, otelcol *v1beta1.OpenTelemetryCollector) (*v1beta1.OpenTelemetryCollector, error) { //nolint:unparam + + tel := otelcol.Spec.Config.Service.GetTelemetry() + + if tel == nil || len(tel.Metrics.Readers) == 0 { + return otelcol, nil + } + + for i, reader := range tel.Metrics.Readers { + if reader.Pull != nil && reader.Pull.Exporter.Prometheus.WithoutUnits == nil { + t := true + tel.Metrics.Readers[i].Pull.Exporter.Prometheus.WithoutUnits = &t + } + } + + var err error + otelcol.Spec.Config.Service.Telemetry, err = tel.ToAnyConfig() + if err != nil { + return otelcol, err + } + + return otelcol, nil +} diff --git a/pkg/collector/upgrade/v0_130_0_test.go b/pkg/collector/upgrade/v0_130_0_test.go new file mode 100644 index 0000000000..6180e6baa6 --- /dev/null +++ b/pkg/collector/upgrade/v0_130_0_test.go @@ -0,0 +1,229 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package upgrade + +import ( + "testing" + + "github.com/open-telemetry/opentelemetry-operator/apis/v1beta1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func TestUpgrade0_130_0(t *testing.T) { + tests := []struct { + name string + initialConfig *v1beta1.OpenTelemetryCollector + expectedConfig *v1beta1.OpenTelemetryCollector + }{ + { + name: "should set without_units if not set", + initialConfig: &v1beta1.OpenTelemetryCollector{ + TypeMeta: metav1.TypeMeta{ + Kind: "OpenTelemetryCollector", + APIVersion: "v1beta1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-collector", + Namespace: "default", + }, + Spec: v1beta1.OpenTelemetryCollectorSpec{ + Config: v1beta1.Config{ + Service: v1beta1.Service{ + Telemetry: &v1beta1.AnyConfig{ + Object: map[string]interface{}{ + "metrics": map[string]interface{}{ + "readers": []interface{}{ + map[string]interface{}{ + "pull": map[string]interface{}{ + "exporter": map[string]interface{}{ + "prometheus": map[string]interface{}{ + "host": "0.0.0.0", + "port": int32(8888), + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + expectedConfig: &v1beta1.OpenTelemetryCollector{ + TypeMeta: metav1.TypeMeta{ + Kind: "OpenTelemetryCollector", + APIVersion: "v1beta1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-collector", + Namespace: "default", + }, + Spec: v1beta1.OpenTelemetryCollectorSpec{ + Config: v1beta1.Config{ + Service: v1beta1.Service{ + Telemetry: &v1beta1.AnyConfig{ + Object: map[string]interface{}{ + "metrics": map[string]interface{}{ + "readers": []interface{}{ + map[string]interface{}{ + "pull": map[string]interface{}{ + "exporter": map[string]interface{}{ + "prometheus": map[string]interface{}{ + "host": "0.0.0.0", + "port": int32(8888), + "without_units": true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "should not set without_units if false", + initialConfig: &v1beta1.OpenTelemetryCollector{ + TypeMeta: metav1.TypeMeta{ + Kind: "OpenTelemetryCollector", + APIVersion: "v1beta1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-collector", + Namespace: "default", + }, + Spec: v1beta1.OpenTelemetryCollectorSpec{ + Config: v1beta1.Config{ + Service: v1beta1.Service{ + Telemetry: &v1beta1.AnyConfig{ + Object: map[string]interface{}{ + "metrics": map[string]interface{}{ + "readers": []interface{}{ + map[string]interface{}{ + "pull": map[string]interface{}{ + "exporter": map[string]interface{}{ + "prometheus": map[string]interface{}{ + "host": "0.0.0.0", + "port": int32(8888), + "without_units": false, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + expectedConfig: &v1beta1.OpenTelemetryCollector{ + TypeMeta: metav1.TypeMeta{ + Kind: "OpenTelemetryCollector", + APIVersion: "v1beta1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-collector", + Namespace: "default", + }, + Spec: v1beta1.OpenTelemetryCollectorSpec{ + Config: v1beta1.Config{ + Service: v1beta1.Service{ + Telemetry: &v1beta1.AnyConfig{ + Object: map[string]interface{}{ + "metrics": map[string]interface{}{ + "readers": []interface{}{ + map[string]interface{}{ + "pull": map[string]interface{}{ + "exporter": map[string]interface{}{ + "prometheus": map[string]interface{}{ + "host": "0.0.0.0", + "port": int32(8888), + "without_units": false, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "should not set without_units if no prometheus exporter", + initialConfig: &v1beta1.OpenTelemetryCollector{ + TypeMeta: metav1.TypeMeta{ + Kind: "OpenTelemetryCollector", + APIVersion: "v1beta1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-collector", + Namespace: "default", + }, + Spec: v1beta1.OpenTelemetryCollectorSpec{ + Config: v1beta1.Config{ + Service: v1beta1.Service{ + Telemetry: &v1beta1.AnyConfig{ + Object: map[string]interface{}{ + "metrics": map[string]interface{}{ + "readers": []interface{}{}, + }, + }, + }, + }, + }, + }, + }, + expectedConfig: &v1beta1.OpenTelemetryCollector{ + TypeMeta: metav1.TypeMeta{ + Kind: "OpenTelemetryCollector", + APIVersion: "v1beta1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-collector", + Namespace: "default", + }, + Spec: v1beta1.OpenTelemetryCollectorSpec{ + Config: v1beta1.Config{ + Service: v1beta1.Service{ + Telemetry: &v1beta1.AnyConfig{ + Object: map[string]interface{}{ + "metrics": map[string]interface{}{ + "readers": []interface{}{}, + }, + }, + }, + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + up := VersionUpgrade{ + Log: logger, + } + + result, err := upgrade0_130_0(up, tt.initialConfig) + require.NoError(t, err) + require.NotNil(t, result) + assert.Equal(t, tt.expectedConfig.Spec.Config.Service.Telemetry, result.Spec.Config.Service.Telemetry) + }) + } +} diff --git a/pkg/collector/upgrade/versions.go b/pkg/collector/upgrade/versions.go index 71069fa909..8634fd7e5c 100644 --- a/pkg/collector/upgrade/versions.go +++ b/pkg/collector/upgrade/versions.go @@ -103,6 +103,10 @@ var ( Version: *semver.MustParse("0.122.0"), upgradeV1beta1: upgrade0_122_0, }, + { + Version: *semver.MustParse("0.130.0"), + upgradeV1beta1: upgrade0_130_0, + }, } // Latest represents the latest version that we need to upgrade. This is not necessarily the latest known version. From 7bbbc1ade86faff2e4bc16f37de3e0528f691ce7 Mon Sep 17 00:00:00 2001 From: Tyler Helmuth <12352919+TylerHelmuth@users.noreply.github.com> Date: Thu, 17 Jul 2025 08:36:26 -0600 Subject: [PATCH 2/4] changelog --- .chloggen/130-upgrade.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .chloggen/130-upgrade.yaml diff --git a/.chloggen/130-upgrade.yaml b/.chloggen/130-upgrade.yaml new file mode 100644 index 0000000000..e627c4c8ca --- /dev/null +++ b/.chloggen/130-upgrade.yaml @@ -0,0 +1,16 @@ +# One of 'breaking', 'deprecation', 'new_component', '4198', 'bug_fix' +change_type: bug_fix + +# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action) +component: collector upgrade + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Adds an upgrade script for version v0.130.0 of the collector to handle a bug with internal telemetry metric names. + +# One or more tracking issues related to the change +issues: [4198] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: From 397d510f92dfbf0cce06de4e0fbc863c7717aeb3 Mon Sep 17 00:00:00 2001 From: Tyler Helmuth <12352919+TylerHelmuth@users.noreply.github.com> Date: Thu, 17 Jul 2025 08:48:27 -0600 Subject: [PATCH 3/4] fix test --- pkg/collector/upgrade/upgrade_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/collector/upgrade/upgrade_test.go b/pkg/collector/upgrade/upgrade_test.go index 622fb6530f..4a2cc50653 100644 --- a/pkg/collector/upgrade/upgrade_test.go +++ b/pkg/collector/upgrade/upgrade_test.go @@ -196,7 +196,7 @@ func TestEnvVarUpdates(t *testing.T) { require.Equal(t, collectorInstance.Status.Version, persisted.Status.Version) currentV := version.Get() - currentV.OpenTelemetryCollector = "0.122.0" + currentV.OpenTelemetryCollector = "0.130.0" up := &upgrade.VersionUpgrade{ Log: logger, Version: currentV, From b4f227621efd7ce926b6403c1db163aa576ed291 Mon Sep 17 00:00:00 2001 From: Tyler Helmuth <12352919+TylerHelmuth@users.noreply.github.com> Date: Thu, 17 Jul 2025 09:04:06 -0600 Subject: [PATCH 4/4] fix lint --- pkg/collector/upgrade/v0_130_0_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/collector/upgrade/v0_130_0_test.go b/pkg/collector/upgrade/v0_130_0_test.go index 6180e6baa6..762bbe0dd7 100644 --- a/pkg/collector/upgrade/v0_130_0_test.go +++ b/pkg/collector/upgrade/v0_130_0_test.go @@ -6,10 +6,11 @@ package upgrade import ( "testing" - "github.com/open-telemetry/opentelemetry-operator/apis/v1beta1" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/open-telemetry/opentelemetry-operator/apis/v1beta1" ) func TestUpgrade0_130_0(t *testing.T) {