Skip to content

Commit 8820e14

Browse files
author
Israel Blancas
committed
Merge branch 'main' of github.com:open-telemetry/opentelemetry-operator into bug/3281
2 parents 2e6916f + 098afda commit 8820e14

File tree

57 files changed

+650
-125
lines changed

Some content is hidden

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

57 files changed

+650
-125
lines changed
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: enhancement
3+
4+
# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
5+
component: collector
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: set default address for all parsed receivers
9+
10+
# One or more tracking issues related to the change
11+
issues: [3126]
12+
13+
# (Optional) One or more lines of additional information to render under the primary note.
14+
# These lines will be padded with 2 spaces and then inserted directly into the document.
15+
# Use pipe (|) for multiline entries.
16+
subtext:

.chloggen/add_receiver_defaults.yaml

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: enhancement
3+
4+
# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
5+
component: operator
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: Use 0.0.0.0 as otlp receiver default address
9+
10+
# One or more tracking issues related to the change
11+
issues: [3126]
12+
13+
# (Optional) One or more lines of additional information to render under the primary note.
14+
# These lines will be padded with 2 spaces and then inserted directly into the document.
15+
# Use pipe (|) for multiline entries.
16+
subtext:

.chloggen/remove_localhost_fg.yaml

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: breaking
3+
4+
# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
5+
component: collector
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: Remove ComponentUseLocalHostAsDefaultHost collector feature gate.
9+
10+
# One or more tracking issues related to the change
11+
issues: [3306]
12+
13+
# (Optional) One or more lines of additional information to render under the primary note.
14+
# These lines will be padded with 2 spaces and then inserted directly into the document.
15+
# Use pipe (|) for multiline entries.
16+
subtext: |
17+
This change may break setups where receiver endpoints are not explicitly configured to listen on e.g. 0.0.0.0.
18+
Change \#3333 attempts to address this issue for a known set of components.
19+
The operator performs the adjustment for the following receivers:
20+
- otlp
21+
- skywalking
22+
- jaeger
23+
- loki
24+
- opencensus
25+
- zipkin
26+
- tcplog
27+
- udplog
28+
- fluentforward
29+
- statsd
30+
- awsxray/UDP
31+
- carbon
32+
- collectd
33+
- sapm
34+
- signalfx
35+
- splunk_hec
36+
- wavefront

apis/v1beta1/collector_webhook.go

+1-23
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,6 @@ func (c CollectorWebhook) Default(_ context.Context, obj runtime.Object) error {
7878
otelcol.Spec.TargetAllocator.Replicas = &one
7979
}
8080

81-
ComponentUseLocalHostAsDefaultHost(otelcol)
82-
8381
if otelcol.Spec.Autoscaler != nil && otelcol.Spec.Autoscaler.MaxReplicas != nil {
8482
if otelcol.Spec.Autoscaler.MinReplicas == nil {
8583
otelcol.Spec.Autoscaler.MinReplicas = otelcol.Spec.Replicas
@@ -102,7 +100,7 @@ func (c CollectorWebhook) Default(_ context.Context, obj runtime.Object) error {
102100
if len(otelcol.Spec.ManagementState) == 0 {
103101
otelcol.Spec.ManagementState = ManagementStateManaged
104102
}
105-
return nil
103+
return otelcol.Spec.Config.ApplyDefaults(c.logger)
106104
}
107105

108106
func (c CollectorWebhook) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
@@ -453,23 +451,3 @@ func SetupCollectorWebhook(mgr ctrl.Manager, cfg config.Config, reviewer *rbac.R
453451
WithDefaulter(cvw).
454452
Complete()
455453
}
456-
457-
// ComponentUseLocalHostAsDefaultHost enables component.UseLocalHostAsDefaultHost
458-
// featuregate on the given collector instance.
459-
// NOTE: For more details, visit:
460-
// https://github.com/open-telemetry/opentelemetry-collector/issues/8510
461-
func ComponentUseLocalHostAsDefaultHost(otelcol *OpenTelemetryCollector) {
462-
const (
463-
baseFlag = "feature-gates"
464-
fgFlag = "component.UseLocalHostAsDefaultHost"
465-
)
466-
if otelcol.Spec.Args == nil {
467-
otelcol.Spec.Args = make(map[string]string)
468-
}
469-
args, ok := otelcol.Spec.Args[baseFlag]
470-
if !ok || len(args) == 0 {
471-
otelcol.Spec.Args[baseFlag] = "-" + fgFlag
472-
} else if !strings.Contains(otelcol.Spec.Args[baseFlag], fgFlag) {
473-
otelcol.Spec.Args[baseFlag] += ",-" + fgFlag
474-
}
475-
}

apis/v1beta1/collector_webhook_test.go

+64-10
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,70 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
144144
expected v1beta1.OpenTelemetryCollector
145145
shouldFailSar bool
146146
}{
147+
{
148+
name: "update config defaults",
149+
otelcol: v1beta1.OpenTelemetryCollector{
150+
Spec: v1beta1.OpenTelemetryCollectorSpec{
151+
Config: func() v1beta1.Config {
152+
const input = `{"receivers":{"otlp":{"protocols":{"grpc":null,"http":null}}},"exporters":{"debug":null},"service":{"pipelines":{"traces":{"receivers":["otlp"],"exporters":["debug"]}}}}`
153+
var cfg v1beta1.Config
154+
require.NoError(t, yaml.Unmarshal([]byte(input), &cfg))
155+
return cfg
156+
}(),
157+
},
158+
},
159+
expected: v1beta1.OpenTelemetryCollector{
160+
ObjectMeta: metav1.ObjectMeta{
161+
Labels: map[string]string{},
162+
},
163+
Spec: v1beta1.OpenTelemetryCollectorSpec{
164+
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
165+
ManagementState: v1beta1.ManagementStateManaged,
166+
Replicas: &one,
167+
},
168+
Mode: v1beta1.ModeDeployment,
169+
UpgradeStrategy: v1beta1.UpgradeStrategyAutomatic,
170+
Config: func() v1beta1.Config {
171+
const input = `{"receivers":{"otlp":{"protocols":{"grpc":{"endpoint":"0.0.0.0:4317"},"http":{"endpoint":"0.0.0.0:4318"}}}},"exporters":{"debug":null},"service":{"pipelines":{"traces":{"receivers":["otlp"],"exporters":["debug"]}}}}`
172+
var cfg v1beta1.Config
173+
require.NoError(t, yaml.Unmarshal([]byte(input), &cfg))
174+
return cfg
175+
}(),
176+
},
177+
},
178+
},
179+
{
180+
name: "update config defaults, leave other fields alone",
181+
otelcol: v1beta1.OpenTelemetryCollector{
182+
Spec: v1beta1.OpenTelemetryCollectorSpec{
183+
Config: func() v1beta1.Config {
184+
const input = `{"receivers":{"otlp":{"protocols":{"grpc":{"headers":{"example":"another"}},"http":{"endpoint":"0.0.0.0:4000"}}}},"exporters":{"debug":null},"service":{"pipelines":{"traces":{"receivers":["otlp"],"exporters":["debug"]}}}}`
185+
var cfg v1beta1.Config
186+
require.NoError(t, yaml.Unmarshal([]byte(input), &cfg))
187+
return cfg
188+
}(),
189+
},
190+
},
191+
expected: v1beta1.OpenTelemetryCollector{
192+
ObjectMeta: metav1.ObjectMeta{
193+
Labels: map[string]string{},
194+
},
195+
Spec: v1beta1.OpenTelemetryCollectorSpec{
196+
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
197+
ManagementState: v1beta1.ManagementStateManaged,
198+
Replicas: &one,
199+
},
200+
Mode: v1beta1.ModeDeployment,
201+
UpgradeStrategy: v1beta1.UpgradeStrategyAutomatic,
202+
Config: func() v1beta1.Config {
203+
const input = `{"receivers":{"otlp":{"protocols":{"grpc":{"endpoint":"0.0.0.0:4317","headers":{"example":"another"}},"http":{"endpoint":"0.0.0.0:4000"}}}},"exporters":{"debug":null},"service":{"pipelines":{"traces":{"receivers":["otlp"],"exporters":["debug"]}}}}`
204+
var cfg v1beta1.Config
205+
require.NoError(t, yaml.Unmarshal([]byte(input), &cfg))
206+
return cfg
207+
}(),
208+
},
209+
},
210+
},
147211
{
148212
name: "all fields default",
149213
otelcol: v1beta1.OpenTelemetryCollector{},
@@ -153,7 +217,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
153217
},
154218
Spec: v1beta1.OpenTelemetryCollectorSpec{
155219
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
156-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
157220
ManagementState: v1beta1.ManagementStateManaged,
158221
Replicas: &one,
159222
},
@@ -181,7 +244,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
181244
Mode: v1beta1.ModeSidecar,
182245
UpgradeStrategy: "adhoc",
183246
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
184-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
185247
Replicas: &five,
186248
ManagementState: v1beta1.ManagementStateManaged,
187249
},
@@ -208,7 +270,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
208270
Mode: v1beta1.ModeSidecar,
209271
UpgradeStrategy: "adhoc",
210272
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
211-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
212273
Replicas: &five,
213274
ManagementState: v1beta1.ManagementStateUnmanaged,
214275
},
@@ -233,7 +294,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
233294
Mode: v1beta1.ModeDeployment,
234295
UpgradeStrategy: v1beta1.UpgradeStrategyAutomatic,
235296
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
236-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
237297
Replicas: &one,
238298
ManagementState: v1beta1.ManagementStateManaged,
239299
},
@@ -262,7 +322,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
262322
Spec: v1beta1.OpenTelemetryCollectorSpec{
263323
Mode: v1beta1.ModeDeployment,
264324
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
265-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
266325
ManagementState: v1beta1.ManagementStateManaged,
267326
Replicas: &one,
268327
},
@@ -298,7 +357,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
298357
Spec: v1beta1.OpenTelemetryCollectorSpec{
299358
Mode: v1beta1.ModeDeployment,
300359
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
301-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
302360
Replicas: &one,
303361
ManagementState: v1beta1.ManagementStateManaged,
304362
PodDisruptionBudget: &v1beta1.PodDisruptionBudgetSpec{
@@ -336,7 +394,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
336394
Spec: v1beta1.OpenTelemetryCollectorSpec{
337395
Mode: v1beta1.ModeDeployment,
338396
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
339-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
340397
Replicas: &one,
341398
ManagementState: v1beta1.ManagementStateManaged,
342399
},
@@ -379,7 +436,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
379436
Spec: v1beta1.OpenTelemetryCollectorSpec{
380437
Mode: v1beta1.ModeDeployment,
381438
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
382-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
383439
Replicas: &one,
384440
ManagementState: v1beta1.ManagementStateManaged,
385441
},
@@ -417,7 +473,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
417473
Spec: v1beta1.OpenTelemetryCollectorSpec{
418474
Mode: v1beta1.ModeDeployment,
419475
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
420-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
421476
Replicas: &one,
422477
ManagementState: v1beta1.ManagementStateManaged,
423478
},
@@ -448,7 +503,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
448503
Spec: v1beta1.OpenTelemetryCollectorSpec{
449504
Mode: v1beta1.ModeDeployment,
450505
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
451-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
452506
Replicas: &one,
453507
ManagementState: v1beta1.ManagementStateManaged,
454508
},

apis/v1beta1/config.go

+50
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"strconv"
2525
"strings"
2626

27+
"dario.cat/mergo"
2728
"github.com/go-logr/logr"
2829
"gopkg.in/yaml.v3"
2930
corev1 "k8s.io/api/core/v1"
@@ -226,6 +227,51 @@ func (c *Config) getPortsForComponentKinds(logger logr.Logger, componentKinds ..
226227
return ports, nil
227228
}
228229

230+
// applyDefaultForComponentKinds applies defaults to the endpoints for the given ComponentKind(s).
231+
func (c *Config) applyDefaultForComponentKinds(logger logr.Logger, componentKinds ...ComponentKind) error {
232+
enabledComponents := c.GetEnabledComponents()
233+
for _, componentKind := range componentKinds {
234+
var retriever components.ParserRetriever
235+
var cfg AnyConfig
236+
switch componentKind {
237+
case KindReceiver:
238+
retriever = receivers.ReceiverFor
239+
cfg = c.Receivers
240+
case KindExporter:
241+
continue
242+
case KindProcessor:
243+
continue
244+
case KindExtension:
245+
continue
246+
}
247+
for componentName := range enabledComponents[componentKind] {
248+
parser := retriever(componentName)
249+
componentConf := cfg.Object[componentName]
250+
newCfg, err := parser.GetDefaultConfig(logger, componentConf)
251+
if err != nil {
252+
return err
253+
}
254+
255+
// We need to ensure we don't remove any fields in defaulting.
256+
mappedCfg, ok := newCfg.(map[string]interface{})
257+
if !ok || mappedCfg == nil {
258+
logger.V(1).Info("returned default configuration invalid",
259+
"warn", "could not apply component defaults",
260+
"component", componentName,
261+
)
262+
continue
263+
}
264+
265+
if err := mergo.Merge(&mappedCfg, componentConf); err != nil {
266+
return err
267+
}
268+
cfg.Object[componentName] = mappedCfg
269+
}
270+
}
271+
272+
return nil
273+
}
274+
229275
func (c *Config) GetReceiverPorts(logger logr.Logger) ([]corev1.ServicePort, error) {
230276
return c.getPortsForComponentKinds(logger, KindReceiver)
231277
}
@@ -242,6 +288,10 @@ func (c *Config) GetAllRbacRules(logger logr.Logger) ([]rbacv1.PolicyRule, error
242288
return c.getRbacRulesForComponentKinds(logger, KindReceiver, KindExporter, KindProcessor)
243289
}
244290

291+
func (c *Config) ApplyDefaults(logger logr.Logger) error {
292+
return c.applyDefaultForComponentKinds(logger, KindReceiver)
293+
}
294+
245295
// GetLivenessProbe gets the first enabled liveness probe. There should only ever be one extension enabled
246296
// that provides the hinting for the liveness probe.
247297
func (c *Config) GetLivenessProbe(logger logr.Logger) (*corev1.Probe, error) {

0 commit comments

Comments
 (0)