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: 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, 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..762bbe0dd7 --- /dev/null +++ b/pkg/collector/upgrade/v0_130_0_test.go @@ -0,0 +1,230 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package upgrade + +import ( + "testing" + + "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) { + 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.