From ee3159fb2fadd98f01273327f84fe90a011297d6 Mon Sep 17 00:00:00 2001 From: Jacob Aronoff Date: Fri, 5 Apr 2024 13:34:43 -0400 Subject: [PATCH] Only add to scheme when prometheus is available (#2811) * Only add to scheme when prometheus is available * fix the bad stuff * logs and better changelog --- ...onitor-servicemonitor-when-not-needed.yaml | 16 +++++++ controllers/opampbridge_controller_test.go | 4 ++ .../opentelemetrycollector_controller.go | 5 ++- controllers/reconcile_test.go | 2 + controllers/suite_test.go | 9 ++++ internal/autodetect/main.go | 19 ++++++++ internal/autodetect/main_test.go | 44 +++++++++++++++++++ internal/autodetect/prometheus/operator.go | 30 +++++++++++++ internal/config/main.go | 15 +++++++ internal/config/main_test.go | 16 +++++++ internal/config/options.go | 8 ++++ internal/manifests/collector/podmonitor.go | 7 +++ .../manifests/collector/podmonitor_test.go | 12 +++++ .../manifests/collector/servicemonitor.go | 7 +++ .../collector/servicemonitor_test.go | 12 +++++ internal/manifests/collector/suite_test.go | 16 ++++--- main.go | 17 ++++++- 17 files changed, 230 insertions(+), 9 deletions(-) create mode 100755 .chloggen/disable-looking-for-podmonitor-servicemonitor-when-not-needed.yaml create mode 100644 internal/autodetect/prometheus/operator.go diff --git a/.chloggen/disable-looking-for-podmonitor-servicemonitor-when-not-needed.yaml b/.chloggen/disable-looking-for-podmonitor-servicemonitor-when-not-needed.yaml new file mode 100755 index 0000000000..3665ddc6f4 --- /dev/null +++ b/.chloggen/disable-looking-for-podmonitor-servicemonitor-when-not-needed.yaml @@ -0,0 +1,16 @@ +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', '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 + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Introduces ability to detect presence of Prometheus CRDs to dynamically add to scheme to prevent startup issues. + +# One or more tracking issues related to the change +issues: [2180] + +# (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/controllers/opampbridge_controller_test.go b/controllers/opampbridge_controller_test.go index 127fddc149..269a43c745 100644 --- a/controllers/opampbridge_controller_test.go +++ b/controllers/opampbridge_controller_test.go @@ -36,6 +36,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/controllers" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" "github.com/open-telemetry/opentelemetry-operator/internal/config" ) @@ -44,6 +45,9 @@ var opampBridgeMockAutoDetector = &mockAutoDetect{ OpenShiftRoutesAvailabilityFunc: func() (openshift.RoutesAvailability, error) { return openshift.RoutesAvailable, nil }, + PrometheusCRsAvailabilityFunc: func() (prometheus.Availability, error) { + return prometheus.Available, nil + }, } func TestNewObjectsOnReconciliation_OpAMPBridge(t *testing.T) { diff --git a/controllers/opentelemetrycollector_controller.go b/controllers/opentelemetrycollector_controller.go index 77ef164ae6..fac87a6f86 100644 --- a/controllers/opentelemetrycollector_controller.go +++ b/controllers/opentelemetrycollector_controller.go @@ -39,6 +39,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/apis/v1beta1" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" "github.com/open-telemetry/opentelemetry-operator/internal/config" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" "github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector" @@ -80,7 +81,7 @@ func (r *OpenTelemetryCollectorReconciler) findOtelOwnedObjects(ctx context.Cont for i := range hpaList.Items { ownedObjects[hpaList.Items[i].GetUID()] = &hpaList.Items[i] } - if featuregate.PrometheusOperatorIsAvailable.IsEnabled() { + if featuregate.PrometheusOperatorIsAvailable.IsEnabled() && r.config.PrometheusCRAvailability() == prometheus.Available { servicemonitorList := &monitoringv1.ServiceMonitorList{} err = r.List(ctx, servicemonitorList, listOps) if err != nil { @@ -249,7 +250,7 @@ func (r *OpenTelemetryCollectorReconciler) SetupWithManager(mgr ctrl.Manager) er builder.Owns(&rbacv1.ClusterRole{}) } - if featuregate.PrometheusOperatorIsAvailable.IsEnabled() { + if featuregate.PrometheusOperatorIsAvailable.IsEnabled() && r.config.PrometheusCRAvailability() == prometheus.Available { builder.Owns(&monitoringv1.ServiceMonitor{}) builder.Owns(&monitoringv1.PodMonitor{}) } diff --git a/controllers/reconcile_test.go b/controllers/reconcile_test.go index c642418077..939df90140 100644 --- a/controllers/reconcile_test.go +++ b/controllers/reconcile_test.go @@ -42,6 +42,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/controllers" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" "github.com/open-telemetry/opentelemetry-operator/internal/config" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" ta "github.com/open-telemetry/opentelemetry-operator/internal/manifests/targetallocator/adapters" @@ -556,6 +557,7 @@ func TestOpenTelemetryCollectorReconciler_Reconcile(t *testing.T) { config.WithCollectorImage("default-collector"), config.WithTargetAllocatorImage("default-ta-allocator"), config.WithOpenShiftRoutesAvailability(openshift.RoutesAvailable), + config.WithPrometheusCRAvailability(prometheus.Available), ), }) diff --git a/controllers/suite_test.go b/controllers/suite_test.go index e814c4519c..e66ceb1df5 100644 --- a/controllers/suite_test.go +++ b/controllers/suite_test.go @@ -54,6 +54,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" "github.com/open-telemetry/opentelemetry-operator/internal/config" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" "github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector/testdata" @@ -92,6 +93,14 @@ var _ autodetect.AutoDetect = (*mockAutoDetect)(nil) type mockAutoDetect struct { OpenShiftRoutesAvailabilityFunc func() (openshift.RoutesAvailability, error) + PrometheusCRsAvailabilityFunc func() (prometheus.Availability, error) +} + +func (m *mockAutoDetect) PrometheusCRsAvailability() (prometheus.Availability, error) { + if m.PrometheusCRsAvailabilityFunc != nil { + return m.PrometheusCRsAvailabilityFunc() + } + return prometheus.NotAvailable, nil } func (m *mockAutoDetect) OpenShiftRoutesAvailability() (openshift.RoutesAvailability, error) { diff --git a/internal/autodetect/main.go b/internal/autodetect/main.go index fb71adaa39..e0dec72245 100644 --- a/internal/autodetect/main.go +++ b/internal/autodetect/main.go @@ -20,6 +20,7 @@ import ( "k8s.io/client-go/rest" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" ) var _ AutoDetect = (*autoDetect)(nil) @@ -27,6 +28,7 @@ var _ AutoDetect = (*autoDetect)(nil) // AutoDetect provides an assortment of routines that auto-detect traits based on the runtime. type AutoDetect interface { OpenShiftRoutesAvailability() (openshift.RoutesAvailability, error) + PrometheusCRsAvailability() (prometheus.Availability, error) } type autoDetect struct { @@ -48,6 +50,23 @@ func New(restConfig *rest.Config) (AutoDetect, error) { }, nil } +// PrometheusCRsAvailability checks if Prometheus CRDs are available. +func (a *autoDetect) PrometheusCRsAvailability() (prometheus.Availability, error) { + apiList, err := a.dcl.ServerGroups() + if err != nil { + return prometheus.NotAvailable, err + } + + apiGroups := apiList.Groups + for i := 0; i < len(apiGroups); i++ { + if apiGroups[i].Name == "monitoring.coreos.com" { + return prometheus.Available, nil + } + } + + return prometheus.NotAvailable, nil +} + // OpenShiftRoutesAvailability checks if OpenShift Route are available. func (a *autoDetect) OpenShiftRoutesAvailability() (openshift.RoutesAvailability, error) { apiList, err := a.dcl.ServerGroups() diff --git a/internal/autodetect/main_test.go b/internal/autodetect/main_test.go index 6c18eee59a..6b1e22369a 100644 --- a/internal/autodetect/main_test.go +++ b/internal/autodetect/main_test.go @@ -27,6 +27,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/internal/autodetect" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" ) func TestDetectPlatformBasedOnAvailableAPIGroups(t *testing.T) { @@ -71,3 +72,46 @@ func TestDetectPlatformBasedOnAvailableAPIGroups(t *testing.T) { assert.Equal(t, tt.expected, ora) } } + +func TestDetectPlatformBasedOnAvailableAPIGroupsPrometheus(t *testing.T) { + for _, tt := range []struct { + apiGroupList *metav1.APIGroupList + expected prometheus.Availability + }{ + { + &metav1.APIGroupList{}, + prometheus.NotAvailable, + }, + { + &metav1.APIGroupList{ + Groups: []metav1.APIGroup{ + { + Name: "monitoring.coreos.com", + }, + }, + }, + prometheus.Available, + }, + } { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + output, err := json.Marshal(tt.apiGroupList) + require.NoError(t, err) + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + _, err = w.Write(output) + require.NoError(t, err) + })) + defer server.Close() + + autoDetect, err := autodetect.New(&rest.Config{Host: server.URL}) + require.NoError(t, err) + + // test + ora, err := autoDetect.PrometheusCRsAvailability() + + // verify + assert.NoError(t, err) + assert.Equal(t, tt.expected, ora) + } +} diff --git a/internal/autodetect/prometheus/operator.go b/internal/autodetect/prometheus/operator.go new file mode 100644 index 0000000000..e33ba5a9f5 --- /dev/null +++ b/internal/autodetect/prometheus/operator.go @@ -0,0 +1,30 @@ +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Availability represents what CRDs are available from the prometheus operator. +type Availability int + +const ( + // NotAvailable represents the monitoring.coreos.com is not available. + NotAvailable Availability = iota + + // Available represents the monitoring.coreos.com is available. + Available +) + +func (p Availability) String() string { + return [...]string{"NotAvailable", "Available"}[p] +} diff --git a/internal/config/main.go b/internal/config/main.go index 61e1512695..aa64953463 100644 --- a/internal/config/main.go +++ b/internal/config/main.go @@ -23,6 +23,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/internal/autodetect" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" "github.com/open-telemetry/opentelemetry-operator/internal/version" ) @@ -57,6 +58,7 @@ type Config struct { autoInstrumentationNodeJSImage string autoInstrumentationJavaImage string openshiftRoutesAvailability openshift.RoutesAvailability + prometheusCRAvailability prometheus.Availability labelsFilter []string annotationsFilter []string } @@ -65,6 +67,7 @@ type Config struct { func New(opts ...Option) Config { // initialize with the default values o := options{ + prometheusCRAvailability: prometheus.NotAvailable, openshiftRoutesAvailability: openshift.RoutesNotAvailable, collectorConfigMapEntry: defaultCollectorConfigMapEntry, targetAllocatorConfigMapEntry: defaultTargetAllocatorConfigMapEntry, @@ -92,6 +95,7 @@ func New(opts ...Option) Config { operatorOpAMPBridgeConfigMapEntry: o.operatorOpAMPBridgeConfigMapEntry, logger: o.logger, openshiftRoutesAvailability: o.openshiftRoutesAvailability, + prometheusCRAvailability: o.prometheusCRAvailability, autoInstrumentationJavaImage: o.autoInstrumentationJavaImage, autoInstrumentationNodeJSImage: o.autoInstrumentationNodeJSImage, autoInstrumentationPythonImage: o.autoInstrumentationPythonImage, @@ -113,6 +117,12 @@ func (c *Config) AutoDetect() error { return err } c.openshiftRoutesAvailability = ora + + pcrd, err := c.autoDetect.PrometheusCRsAvailability() + if err != nil { + return err + } + c.prometheusCRAvailability = pcrd return nil } @@ -181,6 +191,11 @@ func (c *Config) OpenShiftRoutesAvailability() openshift.RoutesAvailability { return c.openshiftRoutesAvailability } +// PrometheusCRAvailability represents the availability of the Prometheus Operator CRDs. +func (c *Config) PrometheusCRAvailability() prometheus.Availability { + return c.prometheusCRAvailability +} + // AutoInstrumentationJavaImage returns OpenTelemetry Java auto-instrumentation container image. func (c *Config) AutoInstrumentationJavaImage() string { return c.autoInstrumentationJavaImage diff --git a/internal/config/main_test.go b/internal/config/main_test.go index 44345bdf56..7c22e65687 100644 --- a/internal/config/main_test.go +++ b/internal/config/main_test.go @@ -22,6 +22,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/internal/autodetect" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" "github.com/open-telemetry/opentelemetry-operator/internal/config" ) @@ -31,12 +32,14 @@ func TestNewConfig(t *testing.T) { config.WithCollectorImage("some-image"), config.WithCollectorConfigMapEntry("some-config.yaml"), config.WithOpenShiftRoutesAvailability(openshift.RoutesAvailable), + config.WithPrometheusCRAvailability(prometheus.Available), ) // test assert.Equal(t, "some-image", cfg.CollectorImage()) assert.Equal(t, "some-config.yaml", cfg.CollectorConfigMapEntry()) assert.Equal(t, openshift.RoutesAvailable, cfg.OpenShiftRoutesAvailability()) + assert.Equal(t, prometheus.Available, cfg.PrometheusCRAvailability()) } func TestConfigChangesOnAutoDetect(t *testing.T) { @@ -45,6 +48,9 @@ func TestConfigChangesOnAutoDetect(t *testing.T) { OpenShiftRoutesAvailabilityFunc: func() (openshift.RoutesAvailability, error) { return openshift.RoutesAvailable, nil }, + PrometheusCRsAvailabilityFunc: func() (prometheus.Availability, error) { + return prometheus.Available, nil + }, } cfg := config.New( config.WithAutoDetect(mock), @@ -52,6 +58,7 @@ func TestConfigChangesOnAutoDetect(t *testing.T) { // sanity check require.Equal(t, openshift.RoutesNotAvailable, cfg.OpenShiftRoutesAvailability()) + require.Equal(t, prometheus.NotAvailable, cfg.PrometheusCRAvailability()) // test err := cfg.AutoDetect() @@ -59,12 +66,14 @@ func TestConfigChangesOnAutoDetect(t *testing.T) { // verify assert.Equal(t, openshift.RoutesAvailable, cfg.OpenShiftRoutesAvailability()) + require.Equal(t, prometheus.Available, cfg.PrometheusCRAvailability()) } var _ autodetect.AutoDetect = (*mockAutoDetect)(nil) type mockAutoDetect struct { OpenShiftRoutesAvailabilityFunc func() (openshift.RoutesAvailability, error) + PrometheusCRsAvailabilityFunc func() (prometheus.Availability, error) } func (m *mockAutoDetect) OpenShiftRoutesAvailability() (openshift.RoutesAvailability, error) { @@ -73,3 +82,10 @@ func (m *mockAutoDetect) OpenShiftRoutesAvailability() (openshift.RoutesAvailabi } return openshift.RoutesNotAvailable, nil } + +func (m *mockAutoDetect) PrometheusCRsAvailability() (prometheus.Availability, error) { + if m.PrometheusCRsAvailabilityFunc != nil { + return m.PrometheusCRsAvailabilityFunc() + } + return prometheus.NotAvailable, nil +} diff --git a/internal/config/options.go b/internal/config/options.go index 9d150dd247..6969081699 100644 --- a/internal/config/options.go +++ b/internal/config/options.go @@ -22,6 +22,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/internal/autodetect" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" "github.com/open-telemetry/opentelemetry-operator/internal/version" ) @@ -52,6 +53,7 @@ type options struct { targetAllocatorImage string operatorOpAMPBridgeImage string openshiftRoutesAvailability openshift.RoutesAvailability + prometheusCRAvailability prometheus.Availability labelsFilter []string annotationsFilter []string } @@ -180,6 +182,12 @@ func WithOpenShiftRoutesAvailability(os openshift.RoutesAvailability) Option { } } +func WithPrometheusCRAvailability(pcrd prometheus.Availability) Option { + return func(o *options) { + o.prometheusCRAvailability = pcrd + } +} + func WithLabelFilters(labelFilters []string) Option { return func(o *options) { diff --git a/internal/manifests/collector/podmonitor.go b/internal/manifests/collector/podmonitor.go index 9454a6037a..86157c4138 100644 --- a/internal/manifests/collector/podmonitor.go +++ b/internal/manifests/collector/podmonitor.go @@ -22,6 +22,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/open-telemetry/opentelemetry-operator/apis/v1beta1" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" "github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector/adapters" "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" @@ -36,6 +37,12 @@ func PodMonitor(params manifests.Params) (*monitoringv1.PodMonitor, error) { "params.OtelCol.namespace", params.OtelCol.Namespace, ) return nil, nil + } else if params.Config.PrometheusCRAvailability() == prometheus.NotAvailable { + params.Log.V(1).Info("Cannot enable PodMonitor when prometheus CRDs are unavailable", + "params.OtelCol.name", params.OtelCol.Name, + "params.OtelCol.namespace", params.OtelCol.Namespace, + ) + return nil, nil } var pm monitoringv1.PodMonitor diff --git a/internal/manifests/collector/podmonitor_test.go b/internal/manifests/collector/podmonitor_test.go index c9def26881..6ef4021d87 100644 --- a/internal/manifests/collector/podmonitor_test.go +++ b/internal/manifests/collector/podmonitor_test.go @@ -19,6 +19,8 @@ import ( "testing" "github.com/open-telemetry/opentelemetry-operator/apis/v1beta1" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" + "github.com/open-telemetry/opentelemetry-operator/internal/config" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" "github.com/stretchr/testify/assert" @@ -72,3 +74,13 @@ func TestDesiredPodMonitorsWithPrometheus(t *testing.T) { } assert.Equal(t, expectedSelectorLabels, actual.Spec.Selector.MatchLabels) } + +func TestDesiredPodMonitorsPrometheusNotAvailable(t *testing.T) { + params, err := newParams("", "testdata/prometheus-exporter.yaml", config.WithPrometheusCRAvailability(prometheus.NotAvailable)) + assert.NoError(t, err) + params.OtelCol.Spec.Mode = v1beta1.ModeSidecar + params.OtelCol.Spec.Observability.Metrics.EnableMetrics = true + actual, err := PodMonitor(params) + assert.NoError(t, err) + assert.Nil(t, actual) +} diff --git a/internal/manifests/collector/servicemonitor.go b/internal/manifests/collector/servicemonitor.go index 21ff254e09..1713ccfe50 100644 --- a/internal/manifests/collector/servicemonitor.go +++ b/internal/manifests/collector/servicemonitor.go @@ -22,6 +22,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/open-telemetry/opentelemetry-operator/apis/v1beta1" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" "github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector/adapters" "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" @@ -36,6 +37,12 @@ func ServiceMonitor(params manifests.Params) (*monitoringv1.ServiceMonitor, erro "params.OtelCol.namespace", params.OtelCol.Namespace, ) return nil, nil + } else if params.Config.PrometheusCRAvailability() == prometheus.NotAvailable { + params.Log.V(1).Info("Cannot enable ServiceMonitor when prometheus CRDs are unavailable", + "params.OtelCol.name", params.OtelCol.Name, + "params.OtelCol.namespace", params.OtelCol.Namespace, + ) + return nil, nil } var sm monitoringv1.ServiceMonitor diff --git a/internal/manifests/collector/servicemonitor_test.go b/internal/manifests/collector/servicemonitor_test.go index 9cd133e080..8b0cc7f117 100644 --- a/internal/manifests/collector/servicemonitor_test.go +++ b/internal/manifests/collector/servicemonitor_test.go @@ -19,6 +19,9 @@ import ( "testing" "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" + "github.com/open-telemetry/opentelemetry-operator/internal/config" ) func TestDesiredServiceMonitors(t *testing.T) { @@ -66,3 +69,12 @@ func TestDesiredServiceMonitorsWithPrometheus(t *testing.T) { } assert.Equal(t, expectedSelectorLabels, actual.Spec.Selector.MatchLabels) } + +func TestDesiredServiceMonitorsPrometheusNotAvailable(t *testing.T) { + params, err := newParams("", "testdata/prometheus-exporter.yaml", config.WithPrometheusCRAvailability(prometheus.NotAvailable)) + assert.NoError(t, err) + params.OtelCol.Spec.Observability.Metrics.EnableMetrics = true + actual, err := ServiceMonitor(params) + assert.NoError(t, err) + assert.Nil(t, actual) +} diff --git a/internal/manifests/collector/suite_test.go b/internal/manifests/collector/suite_test.go index 64593c7e5b..e16b5699e3 100644 --- a/internal/manifests/collector/suite_test.go +++ b/internal/manifests/collector/suite_test.go @@ -28,6 +28,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/apis/v1beta1" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" "github.com/open-telemetry/opentelemetry-operator/internal/config" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" ) @@ -58,7 +59,11 @@ func paramsWithMode(mode v1beta1.Mode) manifests.Params { fmt.Printf("Error unmarshalling YAML: %v", err) } return manifests.Params{ - Config: config.New(config.WithCollectorImage(defaultCollectorImage), config.WithTargetAllocatorImage(defaultTaAllocationImage)), + Config: config.New( + config.WithCollectorImage(defaultCollectorImage), + config.WithTargetAllocatorImage(defaultTaAllocationImage), + config.WithPrometheusCRAvailability(prometheus.Available), + ), OtelCol: v1beta1.OpenTelemetryCollector{ TypeMeta: metav1.TypeMeta{ Kind: "opentelemetry.io", @@ -93,7 +98,7 @@ func paramsWithMode(mode v1beta1.Mode) manifests.Params { } } -func newParams(taContainerImage string, file string) (manifests.Params, error) { +func newParams(taContainerImage string, file string, options ...config.Option) (manifests.Params, error) { replicas := int32(1) var configYAML []byte var err error @@ -112,12 +117,13 @@ func newParams(taContainerImage string, file string) (manifests.Params, error) { if err != nil { return manifests.Params{}, fmt.Errorf("failed to unmarshal config: %w", err) } - - cfg := config.New( + defaultOptions := []config.Option{ config.WithCollectorImage(defaultCollectorImage), config.WithTargetAllocatorImage(defaultTaAllocationImage), config.WithOpenShiftRoutesAvailability(openshift.RoutesAvailable), - ) + config.WithPrometheusCRAvailability(prometheus.Available), + } + cfg := config.New(append(defaultOptions, options...)...) return manifests.Params{ Config: cfg, diff --git a/main.go b/main.go index 6c566efa43..fca734ce3b 100644 --- a/main.go +++ b/main.go @@ -48,6 +48,8 @@ import ( otelv1alpha1 "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/controllers" "github.com/open-telemetry/opentelemetry-operator/internal/autodetect" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift" + "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus" "github.com/open-telemetry/opentelemetry-operator/internal/config" "github.com/open-telemetry/opentelemetry-operator/internal/rbac" "github.com/open-telemetry/opentelemetry-operator/internal/version" @@ -74,8 +76,6 @@ type tlsConfig struct { func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(otelv1alpha1.AddToScheme(scheme)) - utilruntime.Must(routev1.AddToScheme(scheme)) - utilruntime.Must(monitoringv1.AddToScheme(scheme)) utilruntime.Must(networkingv1.AddToScheme(scheme)) // +kubebuilder:scaffold:scheme } @@ -222,6 +222,19 @@ func main() { if err != nil { setupLog.Error(err, "failed to autodetect config variables") } + // Only add these to the scheme if they are available + if cfg.PrometheusCRAvailability() == prometheus.Available { + setupLog.Info("Prometheus CRDs are installed, adding to scheme.") + utilruntime.Must(monitoringv1.AddToScheme(scheme)) + } else { + setupLog.Info("Prometheus CRDs are not installed, skipping adding to scheme.") + } + if cfg.OpenShiftRoutesAvailability() == openshift.RoutesAvailable { + setupLog.Info("Openshift CRDs are installed, adding to scheme.") + utilruntime.Must(routev1.Install(scheme)) + } else { + setupLog.Info("Openshift CRDs are not installed, skipping adding to scheme.") + } var namespaces map[string]cache.Config watchNamespace, found := os.LookupEnv("WATCH_NAMESPACE")