@@ -6,6 +6,7 @@ package collectors
66import (
77 "context"
88 "fmt"
9+ "reflect"
910 "slices"
1011 "strings"
1112 "sync/atomic"
@@ -27,8 +28,10 @@ import (
2728
2829type CollectorManager struct {
2930 client.Client
30- Clientset * kubernetes.Clientset
31- * otelcolresources.OTelColResourceManager
31+ clientset * kubernetes.Clientset
32+ oTelColResourceManager * otelcolresources.OTelColResourceManager
33+ extraConfig atomic.Pointer [util.ExtraConfig ]
34+ developmentMode bool
3235 updateInProgress atomic.Bool
3336 resourcesHaveBeenDeletedByOperator atomic.Bool
3437}
@@ -40,11 +43,44 @@ const (
4043 TriggeredByDash0ResourceReconcile CollectorReconcileTrigger = "resource"
4144)
4245
46+ func NewCollectorManager (
47+ k8sClient client.Client ,
48+ clientset * kubernetes.Clientset ,
49+ extraConfig util.ExtraConfig ,
50+ developmentMode bool ,
51+ oTelColResourceManager * otelcolresources.OTelColResourceManager ,
52+ ) * CollectorManager {
53+ m := & CollectorManager {
54+ Client : k8sClient ,
55+ clientset : clientset ,
56+ developmentMode : developmentMode ,
57+ oTelColResourceManager : oTelColResourceManager ,
58+ }
59+ m .extraConfig .Store (& extraConfig )
60+ return m
61+ }
62+
63+ func (m * CollectorManager ) UpdateExtraConfig (ctx context.Context , newConfig util.ExtraConfig , logger * logr.Logger ) {
64+ previousConfig := m .extraConfig .Swap (& newConfig )
65+ if previousConfig == nil || ! reflect .DeepEqual (* previousConfig , newConfig ) {
66+ hasBeenReconciled , err := m .ReconcileOpenTelemetryCollector (ctx , nil , TriggeredByWatchEvent )
67+ if err != nil {
68+ logger .Error (err , "Failed to create/update collector resources after extra config map update." )
69+ }
70+ if hasBeenReconciled {
71+ logger .Info ("successfully reconciled collector resources after extra config map update" )
72+ }
73+ } else {
74+ logger .Info ("ignoring extra config map update, both the new and the old extra config map have the same content" )
75+ }
76+ }
77+
4378// ReconcileOpenTelemetryCollector can be triggered by a
4479// 1. a reconcile request from the Dash0OperatorConfiguration resource.
4580// 2. a reconcile request from a Dash0Monitoring resource in the cluster.
4681// 3. a change event on one of the OpenTelemetry collector related resources that the operator manages (a change to one
4782// of "our" config maps or similar).
83+ // 4. a file change event picked up by the extra config map watcher
4884//
4985// The parameter triggeringMonitoringResource is only != nil for case (2).
5086//
@@ -54,31 +90,29 @@ const (
5490// deleted; it only indicates that the reconciliation has been performed.
5591func (m * CollectorManager ) ReconcileOpenTelemetryCollector (
5692 ctx context.Context ,
57- images util.Images ,
58- operatorNamespace string ,
5993 triggeringMonitoringResource * dash0v1beta1.Dash0Monitoring ,
6094 trigger CollectorReconcileTrigger ,
61- ) (error , bool ) {
95+ ) (bool , error ) {
6296 logger := log .FromContext (ctx )
6397 if m .resourcesHaveBeenDeletedByOperator .Load () {
6498 if trigger == TriggeredByWatchEvent {
65- if m .DevelopmentMode {
99+ if m .developmentMode {
66100 logger .Info ("OpenTelemetry collector resources have already been deleted, ignoring reconciliation request." )
67101 }
68- return nil , false
102+ return false , nil
69103 } else if trigger == TriggeredByDash0ResourceReconcile {
70- if m .DevelopmentMode {
104+ if m .developmentMode {
71105 logger .Info ("resetting resourcesHaveBeenDeletedByOperator" )
72106 }
73107 m .resourcesHaveBeenDeletedByOperator .Store (false )
74108 }
75109 }
76110 if m .updateInProgress .Load () {
77- if m .DevelopmentMode {
111+ if m .developmentMode {
78112 logger .Info ("creation/update of the OpenTelemetry collector resources is already in progress, skipping " +
79113 "additional reconciliation request." )
80114 }
81- return nil , false
115+ return false , nil
82116 }
83117
84118 m .updateInProgress .Store (true )
@@ -88,11 +122,11 @@ func (m *CollectorManager) ReconcileOpenTelemetryCollector(
88122
89123 operatorConfigurationResource , err := m .findOperatorConfigurationResource (ctx , & logger )
90124 if err != nil {
91- return err , false
125+ return false , err
92126 }
93127 allMonitoringResources , err := m .findAllMonitoringResources (ctx , & logger )
94128 if err != nil {
95- return err , false
129+ return false , err
96130 }
97131 var export * dash0common.Export
98132 if operatorConfigurationResource != nil && operatorConfigurationResource .Spec .Export != nil {
@@ -125,26 +159,29 @@ func (m *CollectorManager) ReconcileOpenTelemetryCollector(
125159 }
126160 }
127161
162+ extraConfig := m .extraConfig .Load ()
163+ if extraConfig == nil {
164+ return false , fmt .Errorf ("extra config is nil in CollectorManager#ReconcileOpenTelemetryCollector" )
165+ }
128166 if operatorConfigurationResource != nil && ! util .ReadBoolPointerWithDefault (operatorConfigurationResource .Spec .TelemetryCollection .Enabled , true ) {
129167 logger .Info (
130168 fmt .Sprintf ("Telemetry collection has been disabled explicitly via the operator configuration " +
131169 "resource (\" %s\" ), property telemetryCollection.enabled=false, no Dash0 OpenTelemetry collector " +
132170 "will be created, existing Dash0 OpenTelemetry collectors (if any) will be removed." ,
133171 operatorConfigurationResource .Name ),
134172 )
135- err = m .removeOpenTelemetryCollector (ctx , operatorNamespace , & logger )
136- return err , err == nil
173+ err = m .removeOpenTelemetryCollector (ctx , * extraConfig , & logger )
174+ return err == nil , err
137175 } else if export != nil {
138176 err = m .createOrUpdateOpenTelemetryCollector (
139177 ctx ,
140- operatorNamespace ,
141- images ,
142178 operatorConfigurationResource ,
143179 allMonitoringResources ,
180+ * extraConfig ,
144181 export ,
145182 & logger ,
146183 )
147- return err , err == nil
184+ return err == nil , err
148185 } else {
149186 // This should actually never happen, as the operator configuration has a kubebuilder validation comment that
150187 // makes the export a required field.
@@ -155,25 +192,23 @@ func (m *CollectorManager) ReconcileOpenTelemetryCollector(
155192 "collectors (if any) will be removed." , operatorConfigurationResource .Name ),
156193 )
157194 }
158- err = m .removeOpenTelemetryCollector (ctx , operatorNamespace , & logger )
159- return err , err == nil
195+ err = m .removeOpenTelemetryCollector (ctx , * extraConfig , & logger )
196+ return err == nil , err
160197 }
161198}
162199
163200func (m * CollectorManager ) createOrUpdateOpenTelemetryCollector (
164201 ctx context.Context ,
165- operatorNamespace string ,
166- images util.Images ,
167202 operatorConfigurationResource * dash0v1alpha1.Dash0OperatorConfiguration ,
168203 allMonitoringResources []dash0v1beta1.Dash0Monitoring ,
204+ extraConfig util.ExtraConfig ,
169205 export * dash0common.Export ,
170206 logger * logr.Logger ,
171207) error {
172208 resourcesHaveBeenCreated , resourcesHaveBeenUpdated , err :=
173- m .OTelColResourceManager .CreateOrUpdateOpenTelemetryCollectorResources (
209+ m .oTelColResourceManager .CreateOrUpdateOpenTelemetryCollectorResources (
174210 ctx ,
175- operatorNamespace ,
176- images ,
211+ extraConfig ,
177212 operatorConfigurationResource ,
178213 allMonitoringResources ,
179214 export ,
@@ -199,12 +234,12 @@ func (m *CollectorManager) createOrUpdateOpenTelemetryCollector(
199234
200235func (m * CollectorManager ) removeOpenTelemetryCollector (
201236 ctx context.Context ,
202- operatorNamespace string ,
237+ extraConfig util. ExtraConfig ,
203238 logger * logr.Logger ,
204239) error {
205- resourcesHaveBeenDeleted , err := m .OTelColResourceManager .DeleteResources (
240+ resourcesHaveBeenDeleted , err := m .oTelColResourceManager .DeleteResources (
206241 ctx ,
207- operatorNamespace ,
242+ extraConfig ,
208243 logger ,
209244 )
210245 if err != nil {
0 commit comments