Skip to content

Commit

Permalink
fix(collectors): make sure config map rendering is stable
Browse files Browse the repository at this point in the history
In particular with respect to the inherently non-deterministic ordering
of the list of monitoring resources.

fixes ENG-3946
  • Loading branch information
basti1302 committed Feb 11, 2025
1 parent 2be1fd4 commit 37aab4b
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 1 deletion.
6 changes: 6 additions & 0 deletions internal/backendconnection/otelcolresources/desired_state.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package otelcolresources
import (
"fmt"
"path/filepath"
"slices"
"strings"

appsv1 "k8s.io/api/apps/v1"
Expand Down Expand Up @@ -197,6 +198,11 @@ func assembleDesiredState(
resourceSpecs *OTelColResourceSpecs,
forDeletion bool,
) ([]clientObject, error) {
// Make sure the resulting objects (in particular the config maps) are do not depend on the (potentially non-stable)
// sort order of the input slices.
slices.Sort(monitoredNamespaces)
slices.Sort(namespacesWithPrometheusScraping)

var desiredState []clientObject
desiredState = append(desiredState, addCommonMetadata(assembleServiceAccountForDaemonSet(config)))
daemonSetCollectorConfigMap, err := assembleDaemonSetCollectorConfigMap(
Expand Down
77 changes: 77 additions & 0 deletions internal/backendconnection/otelcolresources/desired_state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (

appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/utils/ptr"
"sigs.k8s.io/controller-runtime/pkg/client"

dash0v1alpha1 "github.com/dash0hq/dash0-operator/api/dash0monitoring/v1alpha1"
Expand Down Expand Up @@ -321,6 +323,81 @@ var _ = Describe("The desired state of the OpenTelemetry Collector resources", f
Expect(selfMonitoringConfiguration.Export.Grpc).To(BeNil())
Expect(selfMonitoringConfiguration.Export.Http).To(BeNil())
})

It("rendered objects must be stable", func() {
mr1 := dash0v1alpha1.Dash0Monitoring{
ObjectMeta: metav1.ObjectMeta{
Name: MonitoringResourceName,
Namespace: "namespace-1",
},
Spec: dash0v1alpha1.Dash0MonitoringSpec{
PrometheusScrapingEnabled: ptr.To(true),
},
}
mr2 := dash0v1alpha1.Dash0Monitoring{
ObjectMeta: metav1.ObjectMeta{
Name: MonitoringResourceName,
Namespace: "namespace-2",
},
Spec: dash0v1alpha1.Dash0MonitoringSpec{
PrometheusScrapingEnabled: ptr.To(true),
},
}
mr3 := dash0v1alpha1.Dash0Monitoring{
ObjectMeta: metav1.ObjectMeta{
Name: MonitoringResourceName,
Namespace: "namespace-3",
},
Spec: dash0v1alpha1.Dash0MonitoringSpec{
PrometheusScrapingEnabled: ptr.To(false),
},
}
mr4 := dash0v1alpha1.Dash0Monitoring{
ObjectMeta: metav1.ObjectMeta{
Name: MonitoringResourceName,
Namespace: "namespace-4",
},
Spec: dash0v1alpha1.Dash0MonitoringSpec{
PrometheusScrapingEnabled: ptr.To(false),
},
}

desiredState1, err := assembleDesiredStateForUpsert(&oTelColConfig{
Namespace: namespace,
NamePrefix: namePrefix,
Export: Dash0ExportWithEndpointAndToken(),
Images: TestImages,
}, []dash0v1alpha1.Dash0Monitoring{mr1, mr2, mr3, mr4}, &DefaultOTelColResourceSpecs)
Expect(err).NotTo(HaveOccurred())
desiredState2, err := assembleDesiredStateForUpsert(&oTelColConfig{
Namespace: namespace,
NamePrefix: namePrefix,
Export: Dash0ExportWithEndpointAndToken(),
Images: TestImages,
}, []dash0v1alpha1.Dash0Monitoring{mr3, mr4, mr1, mr2}, &DefaultOTelColResourceSpecs)
Expect(err).NotTo(HaveOccurred())
desiredState3, err := assembleDesiredStateForUpsert(&oTelColConfig{
Namespace: namespace,
NamePrefix: namePrefix,
Export: Dash0ExportWithEndpointAndToken(),
Images: TestImages,
}, []dash0v1alpha1.Dash0Monitoring{mr4, mr3, mr2, mr1}, &DefaultOTelColResourceSpecs)
Expect(err).NotTo(HaveOccurred())
desiredState4, err := assembleDesiredStateForUpsert(&oTelColConfig{
Namespace: namespace,
NamePrefix: namePrefix,
Export: Dash0ExportWithEndpointAndToken(),
Images: TestImages,
}, []dash0v1alpha1.Dash0Monitoring{mr3, mr1, mr4, mr2}, &DefaultOTelColResourceSpecs)
Expect(err).NotTo(HaveOccurred())

Expect(reflect.DeepEqual(desiredState1, desiredState2)).To(BeTrue())
Expect(reflect.DeepEqual(desiredState1, desiredState3)).To(BeTrue())
Expect(reflect.DeepEqual(desiredState1, desiredState4)).To(BeTrue())
Expect(reflect.DeepEqual(desiredState2, desiredState3)).To(BeTrue())
Expect(reflect.DeepEqual(desiredState2, desiredState4)).To(BeTrue())
Expect(reflect.DeepEqual(desiredState3, desiredState4)).To(BeTrue())
})
})

func getConfigMap(desiredState []clientObject, name string) *corev1.ConfigMap {
Expand Down
1 change: 0 additions & 1 deletion test/util/monitoring_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ var (
Namespace: TestNamespaceName,
Name: MonitoringResourceName,
}

MonitoringResourceDefaultObjectMeta = metav1.ObjectMeta{
Name: MonitoringResourceName,
Namespace: TestNamespaceName,
Expand Down

0 comments on commit 37aab4b

Please sign in to comment.