diff --git a/.chloggen/make-job-label-customizable.yaml b/.chloggen/make-job-label-customizable.yaml new file mode 100755 index 0000000000..8df5e77ce8 --- /dev/null +++ b/.chloggen/make-job-label-customizable.yaml @@ -0,0 +1,16 @@ +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# 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: Adds the joblabel field to the observability spec to customize the ServiceMonitor's job label + +# One or more tracking issues related to the change +issues: [2775] + +# (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/apis/v1alpha1/convert.go b/apis/v1alpha1/convert.go index a831659666..26f35db305 100644 --- a/apis/v1alpha1/convert.go +++ b/apis/v1alpha1/convert.go @@ -131,6 +131,7 @@ func tov1beta1(in OpenTelemetryCollector) (v1beta1.OpenTelemetryCollector, error Observability: v1beta1.ObservabilitySpec{ Metrics: v1beta1.MetricsConfigSpec{ EnableMetrics: copy.Spec.Observability.Metrics.EnableMetrics, + JobLabel: copy.Spec.Observability.Metrics.JobLabel, DisablePrometheusAnnotations: copy.Spec.Observability.Metrics.DisablePrometheusAnnotations, }, }, @@ -174,6 +175,7 @@ func tov1beta1TA(in OpenTelemetryTargetAllocator) v1beta1.TargetAllocatorEmbedde Observability: v1beta1.ObservabilitySpec{ Metrics: v1beta1.MetricsConfigSpec{ EnableMetrics: in.Observability.Metrics.EnableMetrics, + JobLabel: in.Observability.Metrics.JobLabel, DisablePrometheusAnnotations: in.Observability.Metrics.DisablePrometheusAnnotations, }, }, @@ -316,6 +318,7 @@ func tov1alpha1(in v1beta1.OpenTelemetryCollector) (*OpenTelemetryCollector, err Observability: ObservabilitySpec{ Metrics: MetricsConfigSpec{ EnableMetrics: copy.Spec.Observability.Metrics.EnableMetrics, + JobLabel: copy.Spec.Observability.Metrics.JobLabel, DisablePrometheusAnnotations: copy.Spec.Observability.Metrics.DisablePrometheusAnnotations, }, }, @@ -419,6 +422,7 @@ func tov1alpha1TA(in v1beta1.TargetAllocatorEmbedded) OpenTelemetryTargetAllocat Observability: ObservabilitySpec{ Metrics: MetricsConfigSpec{ EnableMetrics: in.Observability.Metrics.EnableMetrics, + JobLabel: in.Observability.Metrics.JobLabel, DisablePrometheusAnnotations: in.Observability.Metrics.DisablePrometheusAnnotations, }, }, diff --git a/apis/v1alpha1/opentelemetrycollector_types.go b/apis/v1alpha1/opentelemetrycollector_types.go index 2bd341e7a7..c751dbc5e6 100644 --- a/apis/v1alpha1/opentelemetrycollector_types.go +++ b/apis/v1alpha1/opentelemetrycollector_types.go @@ -522,6 +522,14 @@ type MetricsConfigSpec struct { // +kubebuilder:validation:Optional // +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Create ServiceMonitors for OpenTelemetry Collector" EnableMetrics bool `json:"enableMetrics,omitempty"` + // JobLabel specifies the label to use for the job in the ServiceMonitor or PodMonitor(for sidecar mode). + // The operator.observability.prometheus feature gate must be enabled to use this feature. + // EnableMetrics must be true to set this. + // + // +optional + // +kubebuilder:validation:Optional + // +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Job Label for generated ServiceMonitors" + JobLabel string `json:"jobLabel,omitempty"` // DisablePrometheusAnnotations controls the automatic addition of default Prometheus annotations // ('prometheus.io/scrape', 'prometheus.io/port', and 'prometheus.io/path') // diff --git a/apis/v1beta1/opentelemetrycollector_types.go b/apis/v1beta1/opentelemetrycollector_types.go index 9b77567f7b..3cf64f5be0 100644 --- a/apis/v1beta1/opentelemetrycollector_types.go +++ b/apis/v1beta1/opentelemetrycollector_types.go @@ -261,6 +261,14 @@ type MetricsConfigSpec struct { // +kubebuilder:validation:Optional // +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Create ServiceMonitors for OpenTelemetry Collector" EnableMetrics bool `json:"enableMetrics,omitempty"` + // JobLabel specifies the label to use for the job in the ServiceMonitor or PodMonitor(for sidecar mode). + // The operator.observability.prometheus feature gate must be enabled to use this feature. + // EnableMetrics must be true to set this. + // + // +optional + // +kubebuilder:validation:Optional + // +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Job Label for generated ServiceMonitors" + JobLabel string `json:"jobLabel,omitempty"` // DisablePrometheusAnnotations controls the automatic addition of default Prometheus annotations // ('prometheus.io/scrape', 'prometheus.io/port', and 'prometheus.io/path') // diff --git a/bundle/manifests/opentelemetry-operator.clusterserviceversion.yaml b/bundle/manifests/opentelemetry-operator.clusterserviceversion.yaml index eaa0bc7aa2..9b76f77dd0 100644 --- a/bundle/manifests/opentelemetry-operator.clusterserviceversion.yaml +++ b/bundle/manifests/opentelemetry-operator.clusterserviceversion.yaml @@ -99,7 +99,7 @@ metadata: categories: Logging & Tracing,Monitoring certified: "false" containerImage: ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator - createdAt: "2024-03-11T13:32:19Z" + createdAt: "2024-03-21T17:09:59Z" description: Provides the OpenTelemetry components, including the Collector operators.operatorframework.io/builder: operator-sdk-v1.29.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v3 @@ -175,6 +175,12 @@ spec: this feature. displayName: Create ServiceMonitors for OpenTelemetry Collector path: observability.metrics.enableMetrics + - description: JobLabel specifies the label to use for the job in the ServiceMonitor + or PodMonitor(for sidecar mode). The operator.observability.prometheus feature + gate must be enabled to use this feature. EnableMetrics must be true to + set this. + displayName: Job Label for generated ServiceMonitors + path: observability.metrics.jobLabel - description: ObservabilitySpec defines how telemetry data gets handled. displayName: Observability path: targetAllocator.observability @@ -187,6 +193,12 @@ spec: this feature. displayName: Create ServiceMonitors for OpenTelemetry Collector path: targetAllocator.observability.metrics.enableMetrics + - description: JobLabel specifies the label to use for the job in the ServiceMonitor + or PodMonitor(for sidecar mode). The operator.observability.prometheus feature + gate must be enabled to use this feature. EnableMetrics must be true to + set this. + displayName: Job Label for generated ServiceMonitors + path: targetAllocator.observability.metrics.jobLabel version: v1alpha1 - description: OpenTelemetryCollector is the Schema for the opentelemetrycollectors API. diff --git a/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml b/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml index e15c1d80bf..8a0cc89bf5 100644 --- a/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml +++ b/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml @@ -2226,6 +2226,8 @@ spec: type: boolean enableMetrics: type: boolean + jobLabel: + type: string type: object type: object podAnnotations: @@ -2933,6 +2935,8 @@ spec: type: boolean enableMetrics: type: boolean + jobLabel: + type: string type: object type: object podDisruptionBudget: @@ -6518,6 +6522,8 @@ spec: type: boolean enableMetrics: type: boolean + jobLabel: + type: string type: object type: object podAnnotations: @@ -7227,6 +7233,8 @@ spec: type: boolean enableMetrics: type: boolean + jobLabel: + type: string type: object type: object podDisruptionBudget: diff --git a/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml b/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml index a61454cd86..f2c9395f7f 100644 --- a/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml +++ b/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml @@ -2212,6 +2212,8 @@ spec: type: boolean enableMetrics: type: boolean + jobLabel: + type: string type: object type: object podAnnotations: @@ -2919,6 +2921,8 @@ spec: type: boolean enableMetrics: type: boolean + jobLabel: + type: string type: object type: object podDisruptionBudget: @@ -6504,6 +6508,8 @@ spec: type: boolean enableMetrics: type: boolean + jobLabel: + type: string type: object type: object podAnnotations: @@ -7213,6 +7219,8 @@ spec: type: boolean enableMetrics: type: boolean + jobLabel: + type: string type: object type: object podDisruptionBudget: diff --git a/config/crd/bases/opentelemetry.io_targetallocators.yaml b/config/crd/bases/opentelemetry.io_targetallocators.yaml index 0091a808fb..3c522fe7f3 100644 --- a/config/crd/bases/opentelemetry.io_targetallocators.yaml +++ b/config/crd/bases/opentelemetry.io_targetallocators.yaml @@ -2111,6 +2111,8 @@ spec: type: boolean enableMetrics: type: boolean + jobLabel: + type: string type: object type: object podAnnotations: diff --git a/config/manifests/bases/opentelemetry-operator.clusterserviceversion.yaml b/config/manifests/bases/opentelemetry-operator.clusterserviceversion.yaml index ed0690c3e8..4eef05692d 100644 --- a/config/manifests/bases/opentelemetry-operator.clusterserviceversion.yaml +++ b/config/manifests/bases/opentelemetry-operator.clusterserviceversion.yaml @@ -137,6 +137,12 @@ spec: this feature. displayName: Create ServiceMonitors for OpenTelemetry Collector path: observability.metrics.enableMetrics + - description: JobLabel specifies the label to use for the job in the ServiceMonitor + or PodMonitor(for sidecar mode). The operator.observability.prometheus feature + gate must be enabled to use this feature. EnableMetrics must be true to + set this. + displayName: Job Label for generated ServiceMonitors + path: observability.metrics.jobLabel - description: ObservabilitySpec defines how telemetry data gets handled. displayName: Observability path: targetAllocator.observability @@ -149,6 +155,12 @@ spec: this feature. displayName: Create ServiceMonitors for OpenTelemetry Collector path: targetAllocator.observability.metrics.enableMetrics + - description: JobLabel specifies the label to use for the job in the ServiceMonitor + or PodMonitor(for sidecar mode). The operator.observability.prometheus feature + gate must be enabled to use this feature. EnableMetrics must be true to + set this. + displayName: Job Label for generated ServiceMonitors + path: targetAllocator.observability.metrics.jobLabel version: v1alpha1 description: |- OpenTelemetry is a collection of tools, APIs, and SDKs. You use it to instrument, generate, collect, and export telemetry data (metrics, logs, and traces) for analysis in order to understand your software's performance and behavior. diff --git a/docs/api.md b/docs/api.md index 0fdbb73b92..948eff48ef 100644 --- a/docs/api.md +++ b/docs/api.md @@ -17809,6 +17809,13 @@ Resource Types:
false + + jobLabel + string + +
+ + false @@ -20315,6 +20322,13 @@ Resource Types:
false + + jobLabel + string + +
+ + false @@ -33688,6 +33702,13 @@ Resource Types:
false + + jobLabel + string + +
+ + false @@ -36195,6 +36216,13 @@ Resource Types:
false + + jobLabel + string + +
+ + false diff --git a/internal/manifests/collector/podmonitor.go b/internal/manifests/collector/podmonitor.go index 9454a6037a..fd8d7db243 100644 --- a/internal/manifests/collector/podmonitor.go +++ b/internal/manifests/collector/podmonitor.go @@ -45,6 +45,10 @@ func PodMonitor(params manifests.Params) (*monitoringv1.PodMonitor, error) { name := naming.PodMonitor(params.OtelCol.Name) labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, nil) selectorLabels := manifestutils.SelectorLabels(params.OtelCol.ObjectMeta, ComponentOpenTelemetryCollector) + jobLabel := params.OtelCol.Spec.Observability.Metrics.JobLabel + if len(jobLabel) == 0 { + jobLabel = "app.kubernetes.io/instance" + } pm = monitoringv1.PodMonitor{ ObjectMeta: metav1.ObjectMeta{ Namespace: params.OtelCol.Namespace, @@ -52,7 +56,7 @@ func PodMonitor(params manifests.Params) (*monitoringv1.PodMonitor, error) { Labels: labels, }, Spec: monitoringv1.PodMonitorSpec{ - JobLabel: "app.kubernetes.io/instance", + JobLabel: jobLabel, PodTargetLabels: []string{"app.kubernetes.io/name", "app.kubernetes.io/instance", "app.kubernetes.io/managed-by"}, NamespaceSelector: monitoringv1.NamespaceSelector{ MatchNames: []string{params.OtelCol.Namespace}, diff --git a/internal/manifests/collector/podmonitor_test.go b/internal/manifests/collector/podmonitor_test.go index c9def26881..5f899ee71b 100644 --- a/internal/manifests/collector/podmonitor_test.go +++ b/internal/manifests/collector/podmonitor_test.go @@ -36,6 +36,7 @@ func TestDesiredPodMonitors(t *testing.T) { assert.Nil(t, actual) params.OtelCol.Spec.Observability.Metrics.EnableMetrics = true + params.OtelCol.Spec.Observability.Metrics.JobLabel = "app.kubernetes.io/name" actual, err = PodMonitor(params) assert.NoError(t, err) assert.NotNil(t, actual) @@ -49,6 +50,7 @@ func TestDesiredPodMonitors(t *testing.T) { "app.kubernetes.io/part-of": "opentelemetry", } assert.Equal(t, expectedSelectorLabels, actual.Spec.Selector.MatchLabels) + assert.Equal(t, "app.kubernetes.io/name", actual.Spec.JobLabel) } func TestDesiredPodMonitorsWithPrometheus(t *testing.T) { @@ -71,4 +73,5 @@ func TestDesiredPodMonitorsWithPrometheus(t *testing.T) { "app.kubernetes.io/component": "opentelemetry-collector", } assert.Equal(t, expectedSelectorLabels, actual.Spec.Selector.MatchLabels) + assert.Equal(t, "app.kubernetes.io/instance", actual.Spec.JobLabel) } diff --git a/internal/manifests/collector/servicemonitor.go b/internal/manifests/collector/servicemonitor.go index 21ff254e09..96adb5bee6 100644 --- a/internal/manifests/collector/servicemonitor.go +++ b/internal/manifests/collector/servicemonitor.go @@ -54,6 +54,7 @@ func ServiceMonitor(params manifests.Params) (*monitoringv1.ServiceMonitor, erro Labels: labels, }, Spec: monitoringv1.ServiceMonitorSpec{ + JobLabel: params.OtelCol.Spec.Observability.Metrics.JobLabel, Endpoints: append([]monitoringv1.Endpoint{ { Port: "monitoring", diff --git a/internal/manifests/collector/servicemonitor_test.go b/internal/manifests/collector/servicemonitor_test.go index 9cd133e080..425c29f4a9 100644 --- a/internal/manifests/collector/servicemonitor_test.go +++ b/internal/manifests/collector/servicemonitor_test.go @@ -29,6 +29,7 @@ func TestDesiredServiceMonitors(t *testing.T) { assert.Nil(t, actual) params.OtelCol.Spec.Observability.Metrics.EnableMetrics = true + params.OtelCol.Spec.Observability.Metrics.JobLabel = "app.kubernetes.io/name" actual, err = ServiceMonitor(params) assert.NoError(t, err) assert.NotNil(t, actual) @@ -43,6 +44,7 @@ func TestDesiredServiceMonitors(t *testing.T) { "operator.opentelemetry.io/collector-monitoring-service": "Exists", } assert.Equal(t, expectedSelectorLabels, actual.Spec.Selector.MatchLabels) + assert.Equal(t, "app.kubernetes.io/name", actual.Spec.JobLabel) } func TestDesiredServiceMonitorsWithPrometheus(t *testing.T) { diff --git a/tests/e2e-prometheuscr/create-pm-prometheus-exporters/02-assert.yaml b/tests/e2e-prometheuscr/create-pm-prometheus-exporters/02-assert.yaml new file mode 100644 index 0000000000..f13a24fd80 --- /dev/null +++ b/tests/e2e-prometheuscr/create-pm-prometheus-exporters/02-assert.yaml @@ -0,0 +1,45 @@ +apiVersion: v1 +kind: Pod +metadata: + annotations: + sidecar.opentelemetry.io/inject: "true" + labels: + app: pod-with-sidecar + namespace: create-pm-prometheus +spec: + containers: + - name: myapp + - name: otc-container + env: + - name: POD_NAME + - name: OTEL_CONFIG + - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME + - name: OTEL_RESOURCE_ATTRIBUTES_POD_UID + - name: OTEL_RESOURCE_ATTRIBUTES_NODE_NAME + - name: OTEL_RESOURCE_ATTRIBUTES +status: + phase: Running +--- +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + labels: + app.kubernetes.io/instance: create-pm-prometheus.simplest + app.kubernetes.io/managed-by: opentelemetry-operator + app.kubernetes.io/name: simplest-collector + name: simplest-collector + namespace: create-pm-prometheus +spec: + jobLabel: "app.kubernetes.io/name" + podMetricsEndpoints: + - port: monitoring + - port: prometheus-dev + - port: prometheus-prod + namespaceSelector: + matchNames: + - create-pm-prometheus + selector: + matchLabels: + app.kubernetes.io/managed-by: opentelemetry-operator + app.kubernetes.io/instance: create-pm-prometheus.simplest + diff --git a/tests/e2e-prometheuscr/create-pm-prometheus-exporters/02-install.yaml b/tests/e2e-prometheuscr/create-pm-prometheus-exporters/02-install.yaml new file mode 100644 index 0000000000..8e58cbdc62 --- /dev/null +++ b/tests/e2e-prometheuscr/create-pm-prometheus-exporters/02-install.yaml @@ -0,0 +1,36 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: create-pm-prometheus +--- +apiVersion: opentelemetry.io/v1alpha1 +kind: OpenTelemetryCollector +metadata: + name: simplest + namespace: create-pm-prometheus +spec: + mode: sidecar + observability: + metrics: + enableMetrics: true + jobLabel: "app.kubernetes.io/name" + config: | + receivers: + otlp: + protocols: + grpc: + http: + + exporters: + prometheus/prod: + endpoint: 0.0.0.0:8884 + + prometheus/dev: + endpoint: 0.0.0.0:8885 + + service: + pipelines: + metrics: + receivers: [otlp] + processors: [] + exporters: [prometheus/dev, prometheus/prod] diff --git a/tests/e2e-prometheuscr/create-pm-prometheus-exporters/chainsaw-test.yaml b/tests/e2e-prometheuscr/create-pm-prometheus-exporters/chainsaw-test.yaml index 314e498921..204f79d9bc 100755 --- a/tests/e2e-prometheuscr/create-pm-prometheus-exporters/chainsaw-test.yaml +++ b/tests/e2e-prometheuscr/create-pm-prometheus-exporters/chainsaw-test.yaml @@ -16,3 +16,9 @@ spec: file: 01-install-app.yaml - assert: file: 01-assert.yaml + - name: step-01 + try: + - apply: + file: 02-install.yaml + - assert: + file: 02-assert.yaml diff --git a/tests/e2e-prometheuscr/create-sm-prometheus-exporters/02-assert.yaml b/tests/e2e-prometheuscr/create-sm-prometheus-exporters/02-assert.yaml index 4c5b8bd5b8..2ce9fbb03b 100644 --- a/tests/e2e-prometheuscr/create-sm-prometheus-exporters/02-assert.yaml +++ b/tests/e2e-prometheuscr/create-sm-prometheus-exporters/02-assert.yaml @@ -8,6 +8,7 @@ metadata: name: simplest-collector namespace: create-sm-prometheus spec: + jobLabel: app.kubernetes.io/name endpoints: - port: monitoring - port: prometheus-prod diff --git a/tests/e2e-prometheuscr/create-sm-prometheus-exporters/02-install.yaml b/tests/e2e-prometheuscr/create-sm-prometheus-exporters/02-install.yaml index e275da42eb..7ed334acb4 100644 --- a/tests/e2e-prometheuscr/create-sm-prometheus-exporters/02-install.yaml +++ b/tests/e2e-prometheuscr/create-sm-prometheus-exporters/02-install.yaml @@ -7,6 +7,7 @@ spec: observability: metrics: enableMetrics: true + jobLabel: app.kubernetes.io/name config: | receivers: otlp: