Skip to content

Commit ba9c7c6

Browse files
committed
internal/manifests/collector: migrate configmap
Signed-off-by: Benedikt Bongartz <[email protected]>
1 parent ebe2ccb commit ba9c7c6

File tree

3 files changed

+50
-27
lines changed

3 files changed

+50
-27
lines changed

internal/manifests/collector/config_replace.go

+19-10
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,14 @@ import (
1919

2020
promconfig "github.com/prometheus/prometheus/config"
2121
_ "github.com/prometheus/prometheus/discovery/install" // Package install has the side-effect of registering all builtin.
22-
"gopkg.in/yaml.v2"
23-
24-
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
22+
// HACK: It seems that the "marshal" behavior of both yaml libraries used
23+
// here is different. For the conversion of the otel configuration in v1alpha2,
24+
// sig.k8s.io/yaml is used. In order not to influence the behavior
25+
// too much, we will continue to use go-yaml for now.
26+
go_yaml "gopkg.in/yaml.v2"
27+
"sigs.k8s.io/yaml"
28+
29+
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha2"
2530
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector/adapters"
2631
ta "github.com/open-telemetry/opentelemetry-operator/internal/manifests/targetallocator/adapters"
2732
"github.com/open-telemetry/opentelemetry-operator/internal/naming"
@@ -42,18 +47,22 @@ type Config struct {
4247
TargetAllocConfig *targetAllocator `yaml:"target_allocator,omitempty"`
4348
}
4449

45-
func ReplaceConfig(instance v1alpha1.OpenTelemetryCollector) (string, error) {
50+
func ReplaceConfig(instance v1alpha2.OpenTelemetryCollector) (string, error) {
51+
cfgStr, err := yaml.Marshal(&instance.Spec.Config)
52+
if err != nil {
53+
return "", err
54+
}
4655
// Check if TargetAllocator is enabled, if not, return the original config
4756
if !instance.Spec.TargetAllocator.Enabled {
48-
return instance.Spec.Config, nil
57+
return string(cfgStr), nil
4958
}
5059

51-
config, err := adapters.ConfigFromString(instance.Spec.Config)
60+
config, err := adapters.ConfigFromString(string(cfgStr))
5261
if err != nil {
5362
return "", err
5463
}
5564

56-
promCfgMap, getCfgPromErr := ta.ConfigToPromConfig(instance.Spec.Config)
65+
promCfgMap, getCfgPromErr := ta.ConfigToPromConfig(string(cfgStr))
5766
if getCfgPromErr != nil {
5867
return "", getCfgPromErr
5968
}
@@ -74,11 +83,10 @@ func ReplaceConfig(instance v1alpha1.OpenTelemetryCollector) (string, error) {
7483
// type coercion checks are handled in the AddTAConfigToPromConfig method above
7584
config["receivers"].(map[interface{}]interface{})["prometheus"] = updPromCfgMap
7685

77-
out, updCfgMarshalErr := yaml.Marshal(config)
86+
out, updCfgMarshalErr := go_yaml.Marshal(config)
7887
if updCfgMarshalErr != nil {
7988
return "", updCfgMarshalErr
8089
}
81-
8290
return string(out), nil
8391
}
8492

@@ -89,10 +97,11 @@ func ReplaceConfig(instance v1alpha1.OpenTelemetryCollector) (string, error) {
8997
return "", err
9098
}
9199

100+
// To avoid issues caused by Prometheus validation logic, which fails regex validation when it encounters
92101
// type coercion checks are handled in the ConfigToPromConfig method above
93102
config["receivers"].(map[interface{}]interface{})["prometheus"] = updPromCfgMap
94103

95-
out, err := yaml.Marshal(config)
104+
out, err := go_yaml.Marshal(config)
96105
if err != nil {
97106
return "", err
98107
}

internal/manifests/collector/config_replace_test.go

+21-12
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,24 @@ import (
2424
colfeaturegate "go.opentelemetry.io/collector/featuregate"
2525
"gopkg.in/yaml.v2"
2626

27+
"github.com/open-telemetry/opentelemetry-operator/internal/api/convert"
2728
ta "github.com/open-telemetry/opentelemetry-operator/internal/manifests/targetallocator/adapters"
2829
"github.com/open-telemetry/opentelemetry-operator/pkg/featuregate"
2930
)
3031

3132
func TestPrometheusParser(t *testing.T) {
3233
param, err := newParams("test/test-img", "testdata/http_sd_config_test.yaml")
3334
assert.NoError(t, err)
35+
otelCol, err := convert.V1Alpha1to2(param.OtelCol)
36+
assert.NoError(t, err)
3437

3538
t.Run("should update config with http_sd_config", func(t *testing.T) {
3639
err := colfeaturegate.GlobalRegistry().Set(featuregate.EnableTargetAllocatorRewrite.ID(), false)
3740
require.NoError(t, err)
3841
t.Cleanup(func() {
3942
_ = colfeaturegate.GlobalRegistry().Set(featuregate.EnableTargetAllocatorRewrite.ID(), true)
4043
})
41-
actualConfig, err := ReplaceConfig(param.OtelCol)
44+
actualConfig, err := ReplaceConfig(otelCol)
4245
assert.NoError(t, err)
4346

4447
// prepare
@@ -71,8 +74,8 @@ func TestPrometheusParser(t *testing.T) {
7174

7275
t.Run("should update config with targetAllocator block if block not present", func(t *testing.T) {
7376
// Set up the test scenario
74-
param.OtelCol.Spec.TargetAllocator.Enabled = true
75-
actualConfig, err := ReplaceConfig(param.OtelCol)
77+
otelCol.Spec.TargetAllocator.Enabled = true
78+
actualConfig, err := ReplaceConfig(otelCol)
7679
assert.NoError(t, err)
7780

7881
// Verify the expected changes in the config
@@ -96,9 +99,12 @@ func TestPrometheusParser(t *testing.T) {
9699
// Set up the test scenario
97100
paramTa, err := newParams("test/test-img", "testdata/http_sd_config_ta_test.yaml")
98101
require.NoError(t, err)
102+
otelColTa, err := convert.V1Alpha1to2(paramTa.OtelCol)
103+
assert.NoError(t, err)
104+
99105
paramTa.OtelCol.Spec.TargetAllocator.Enabled = true
100106

101-
actualConfig, err := ReplaceConfig(paramTa.OtelCol)
107+
actualConfig, err := ReplaceConfig(otelColTa)
102108
assert.NoError(t, err)
103109

104110
// Verify the expected changes in the config
@@ -119,8 +125,9 @@ func TestPrometheusParser(t *testing.T) {
119125
})
120126

121127
t.Run("should not update config with http_sd_config", func(t *testing.T) {
122-
param.OtelCol.Spec.TargetAllocator.Enabled = false
123-
actualConfig, err := ReplaceConfig(param.OtelCol)
128+
otelCol.Spec.TargetAllocator.Enabled = false
129+
130+
actualConfig, err := ReplaceConfig(otelCol)
124131
assert.NoError(t, err)
125132

126133
// prepare
@@ -156,14 +163,16 @@ func TestPrometheusParser(t *testing.T) {
156163
func TestReplaceConfig(t *testing.T) {
157164
param, err := newParams("test/test-img", "testdata/relabel_config_original.yaml")
158165
assert.NoError(t, err)
166+
otelCol, err := convert.V1Alpha1to2(param.OtelCol)
167+
assert.NoError(t, err)
159168

160169
t.Run("should not modify config when TargetAllocator is disabled", func(t *testing.T) {
161-
param.OtelCol.Spec.TargetAllocator.Enabled = false
170+
otelCol.Spec.TargetAllocator.Enabled = false
162171
expectedConfigBytes, err := os.ReadFile("testdata/relabel_config_original.yaml")
163172
assert.NoError(t, err)
164173
expectedConfig := string(expectedConfigBytes)
165174

166-
actualConfig, err := ReplaceConfig(param.OtelCol)
175+
actualConfig, err := ReplaceConfig(otelCol)
167176
assert.NoError(t, err)
168177

169178
assert.Equal(t, expectedConfig, actualConfig)
@@ -176,26 +185,26 @@ func TestReplaceConfig(t *testing.T) {
176185
_ = colfeaturegate.GlobalRegistry().Set(featuregate.EnableTargetAllocatorRewrite.ID(), true)
177186
})
178187

179-
param.OtelCol.Spec.TargetAllocator.Enabled = true
188+
otelCol.Spec.TargetAllocator.Enabled = true
180189

181190
expectedConfigBytes, err := os.ReadFile("testdata/relabel_config_expected_with_sd_config.yaml")
182191
assert.NoError(t, err)
183192
expectedConfig := string(expectedConfigBytes)
184193

185-
actualConfig, err := ReplaceConfig(param.OtelCol)
194+
actualConfig, err := ReplaceConfig(otelCol)
186195
assert.NoError(t, err)
187196

188197
assert.Equal(t, expectedConfig, actualConfig)
189198
})
190199

191200
t.Run("should remove scrape configs if TargetAllocator is enabled and feature flag is set", func(t *testing.T) {
192-
param.OtelCol.Spec.TargetAllocator.Enabled = true
201+
otelCol.Spec.TargetAllocator.Enabled = true
193202

194203
expectedConfigBytes, err := os.ReadFile("testdata/config_expected_targetallocator.yaml")
195204
assert.NoError(t, err)
196205
expectedConfig := string(expectedConfigBytes)
197206

198-
actualConfig, err := ReplaceConfig(param.OtelCol)
207+
actualConfig, err := ReplaceConfig(otelCol)
199208
assert.NoError(t, err)
200209

201210
assert.Equal(t, expectedConfig, actualConfig)

internal/manifests/collector/configmap.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,21 @@ import (
1818
corev1 "k8s.io/api/core/v1"
1919
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2020

21+
"github.com/open-telemetry/opentelemetry-operator/internal/api/convert"
2122
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
2223
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils"
2324
"github.com/open-telemetry/opentelemetry-operator/internal/naming"
2425
)
2526

2627
func ConfigMap(params manifests.Params) (*corev1.ConfigMap, error) {
27-
name := naming.ConfigMap(params.OtelCol.Name)
28-
labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, []string{})
28+
otelCol, err := convert.V1Alpha1to2(params.OtelCol)
29+
if err != nil {
30+
return nil, err
31+
}
32+
name := naming.ConfigMap(otelCol.Name)
33+
labels := manifestutils.Labels(otelCol.ObjectMeta, name, otelCol.Spec.Image, ComponentOpenTelemetryCollector, []string{})
2934

30-
replacedConf, err := ReplaceConfig(params.OtelCol)
35+
replacedConf, err := ReplaceConfig(otelCol)
3136
if err != nil {
3237
params.Log.V(2).Info("failed to update prometheus config to use sharded targets: ", "err", err)
3338
return nil, err
@@ -36,9 +41,9 @@ func ConfigMap(params manifests.Params) (*corev1.ConfigMap, error) {
3641
return &corev1.ConfigMap{
3742
ObjectMeta: metav1.ObjectMeta{
3843
Name: name,
39-
Namespace: params.OtelCol.Namespace,
44+
Namespace: otelCol.Namespace,
4045
Labels: labels,
41-
Annotations: params.OtelCol.Annotations,
46+
Annotations: otelCol.Annotations,
4247
},
4348
Data: map[string]string{
4449
"collector.yaml": replacedConf,

0 commit comments

Comments
 (0)