diff --git a/apis/telemetry/v1alpha1/metricpipeline_types.go b/apis/telemetry/v1alpha1/metricpipeline_types.go index 563eb8021..80596add3 100644 --- a/apis/telemetry/v1alpha1/metricpipeline_types.go +++ b/apis/telemetry/v1alpha1/metricpipeline_types.go @@ -102,7 +102,7 @@ type MetricPipelineRuntimeInput struct { Namespaces *NamespaceSelector `json:"namespaces,omitempty"` // Describes the Kubernetes resources for which runtime metrics are scraped. // +optional - // +kubebuilder:default={pod: {enabled: true}, container: {enabled: true}, node: {enabled: false}, volume: {enabled: false}, daemonset: {enabled: false}, deployment: {enabled: false}, statefulset: {enabled: false}, job: {enabled: false}} + // +kubebuilder:default={pod: {enabled: true}, container: {enabled: true}, node: {enabled: true}, volume: {enabled: true}, daemonset: {enabled: true}, deployment: {enabled: true}, statefulset: {enabled: true}, job: {enabled: true}} Resources *MetricPipelineRuntimeInputResources `json:"resources,omitempty"` } @@ -118,28 +118,28 @@ type MetricPipelineRuntimeInputResources struct { Container *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"container,omitempty"` // Configures Node runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - Node *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"node,omitempty"` + // +kubebuilder:default={enabled: true} + Node *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"node,omitempty"` // Configures Volume runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - Volume *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"volume,omitempty"` + // +kubebuilder:default={enabled: true} + Volume *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"volume,omitempty"` // Configures DaemonSet runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - DaemonSet *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"daemonset,omitempty"` + // +kubebuilder:default={enabled: true} + DaemonSet *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"daemonset,omitempty"` // Configures Deployment runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - Deployment *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"deployment,omitempty"` + // +kubebuilder:default={enabled: true} + Deployment *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"deployment,omitempty"` // Configures StatefulSet runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - StatefulSet *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"statefulset,omitempty"` + // +kubebuilder:default={enabled: true} + StatefulSet *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"statefulset,omitempty"` // Configures Job runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - Job *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"job,omitempty"` + // +kubebuilder:default={enabled: true} + Job *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"job,omitempty"` } // MetricPipelineRuntimeInputResourceEnabledByDefault defines if the scraping of runtime metrics is enabled for a specific resource. The scraping is enabled by default. @@ -150,14 +150,6 @@ type MetricPipelineRuntimeInputResourceEnabledByDefault struct { Enabled *bool `json:"enabled,omitempty"` } -// MetricPipelineRuntimeInputResourceDisabledByDefault defines if the scraping of runtime metrics is enabled for a specific resource. The scraping is disabled by default. -type MetricPipelineRuntimeInputResourceDisabledByDefault struct { - // If enabled, the runtime metrics for the resource are scraped. The default is `false`. - // +optional - // +kubebuilder:default=false - Enabled *bool `json:"enabled,omitempty"` -} - // MetricPipelineIstioInput defines the Istio scraping section. type MetricPipelineIstioInput struct { // If enabled, istio-proxy metrics are scraped from Pods that have the istio-proxy sidecar injected. The default is `false`. diff --git a/apis/telemetry/v1alpha1/zz_generated.deepcopy.go b/apis/telemetry/v1alpha1/zz_generated.deepcopy.go index cf78c25c4..977eb6c9f 100644 --- a/apis/telemetry/v1alpha1/zz_generated.deepcopy.go +++ b/apis/telemetry/v1alpha1/zz_generated.deepcopy.go @@ -720,26 +720,6 @@ func (in *MetricPipelineRuntimeInput) DeepCopy() *MetricPipelineRuntimeInput { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MetricPipelineRuntimeInputResourceDisabledByDefault) DeepCopyInto(out *MetricPipelineRuntimeInputResourceDisabledByDefault) { - *out = *in - if in.Enabled != nil { - in, out := &in.Enabled, &out.Enabled - *out = new(bool) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricPipelineRuntimeInputResourceDisabledByDefault. -func (in *MetricPipelineRuntimeInputResourceDisabledByDefault) DeepCopy() *MetricPipelineRuntimeInputResourceDisabledByDefault { - if in == nil { - return nil - } - out := new(MetricPipelineRuntimeInputResourceDisabledByDefault) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MetricPipelineRuntimeInputResourceEnabledByDefault) DeepCopyInto(out *MetricPipelineRuntimeInputResourceEnabledByDefault) { *out = *in @@ -775,32 +755,32 @@ func (in *MetricPipelineRuntimeInputResources) DeepCopyInto(out *MetricPipelineR } if in.Node != nil { in, out := &in.Node, &out.Node - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } if in.Volume != nil { in, out := &in.Volume, &out.Volume - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } if in.DaemonSet != nil { in, out := &in.DaemonSet, &out.DaemonSet - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } if in.Deployment != nil { in, out := &in.Deployment, &out.Deployment - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } if in.StatefulSet != nil { in, out := &in.StatefulSet, &out.StatefulSet - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } if in.Job != nil { in, out := &in.Job, &out.Job - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } } diff --git a/apis/telemetry/v1beta1/metricpipeline_types.go b/apis/telemetry/v1beta1/metricpipeline_types.go index 93249efda..fea776834 100644 --- a/apis/telemetry/v1beta1/metricpipeline_types.go +++ b/apis/telemetry/v1beta1/metricpipeline_types.go @@ -102,7 +102,7 @@ type MetricPipelineRuntimeInput struct { Namespaces *NamespaceSelector `json:"namespaces,omitempty"` // Describes the Kubernetes resources for which runtime metrics are scraped. // +optional - // +kubebuilder:default={pod: {enabled: true}, container: {enabled: true}, node: {enabled: false}, volume: {enabled: false}, daemonset: {enabled: false}, deployment: {enabled: false}, statefulset: {enabled: false}, job: {enabled: false}} + // +kubebuilder:default={pod: {enabled: true}, container: {enabled: true}, node: {enabled: true}, volume: {enabled: true}, daemonset: {enabled: true}, deployment: {enabled: true}, statefulset: {enabled: true}, job: {enabled: true}} Resources *MetricPipelineRuntimeInputResources `json:"resources,omitempty"` } @@ -118,28 +118,28 @@ type MetricPipelineRuntimeInputResources struct { Container *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"container,omitempty"` // Configures Node runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - Node *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"node,omitempty"` + // +kubebuilder:default={enabled: true} + Node *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"node,omitempty"` // Configures Volume runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - Volume *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"volume,omitempty"` + // +kubebuilder:default={enabled: true} + Volume *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"volume,omitempty"` // Configures DaemonSet runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - DaemonSet *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"daemonset,omitempty"` + // +kubebuilder:default={enabled: true} + DaemonSet *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"daemonset,omitempty"` // Configures Deployment runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - Deployment *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"deployment,omitempty"` + // +kubebuilder:default={enabled: true} + Deployment *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"deployment,omitempty"` // Configures StatefulSet runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - StatefulSet *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"statefulset,omitempty"` + // +kubebuilder:default={enabled: true} + StatefulSet *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"statefulset,omitempty"` // Configures Job runtime metrics scraping. // +optional - // +kubebuilder:default={enabled: false} - Job *MetricPipelineRuntimeInputResourceDisabledByDefault `json:"job,omitempty"` + // +kubebuilder:default={enabled: true} + Job *MetricPipelineRuntimeInputResourceEnabledByDefault `json:"job,omitempty"` } // MetricPipelineRuntimeInputResourceEnabledByDefault defines if the scraping of runtime metrics is enabled for a specific resource. The scraping is enabled by default. @@ -150,14 +150,6 @@ type MetricPipelineRuntimeInputResourceEnabledByDefault struct { Enabled *bool `json:"enabled,omitempty"` } -// MetricPipelineRuntimeInputResourceDisabledByDefault defines if the scraping of runtime metrics is enabled for a specific resource. The scraping is disabled by default. -type MetricPipelineRuntimeInputResourceDisabledByDefault struct { - // If enabled, the runtime metrics for the resource are scraped. The default is `false`. - // +optional - // +kubebuilder:default=false - Enabled *bool `json:"enabled,omitempty"` -} - // MetricPipelineIstioInput defines the Istio scraping section. type MetricPipelineIstioInput struct { // If enabled, metrics for istio-proxy containers are scraped from Pods that have had the istio-proxy sidecar injected. The default is `false`. diff --git a/apis/telemetry/v1beta1/zz_generated.deepcopy.go b/apis/telemetry/v1beta1/zz_generated.deepcopy.go index 8c4412926..7957a027c 100644 --- a/apis/telemetry/v1beta1/zz_generated.deepcopy.go +++ b/apis/telemetry/v1beta1/zz_generated.deepcopy.go @@ -594,26 +594,6 @@ func (in *MetricPipelineRuntimeInput) DeepCopy() *MetricPipelineRuntimeInput { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MetricPipelineRuntimeInputResourceDisabledByDefault) DeepCopyInto(out *MetricPipelineRuntimeInputResourceDisabledByDefault) { - *out = *in - if in.Enabled != nil { - in, out := &in.Enabled, &out.Enabled - *out = new(bool) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricPipelineRuntimeInputResourceDisabledByDefault. -func (in *MetricPipelineRuntimeInputResourceDisabledByDefault) DeepCopy() *MetricPipelineRuntimeInputResourceDisabledByDefault { - if in == nil { - return nil - } - out := new(MetricPipelineRuntimeInputResourceDisabledByDefault) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MetricPipelineRuntimeInputResourceEnabledByDefault) DeepCopyInto(out *MetricPipelineRuntimeInputResourceEnabledByDefault) { *out = *in @@ -649,32 +629,32 @@ func (in *MetricPipelineRuntimeInputResources) DeepCopyInto(out *MetricPipelineR } if in.Node != nil { in, out := &in.Node, &out.Node - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } if in.Volume != nil { in, out := &in.Volume, &out.Volume - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } if in.DaemonSet != nil { in, out := &in.DaemonSet, &out.DaemonSet - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } if in.Deployment != nil { in, out := &in.Deployment, &out.Deployment - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } if in.StatefulSet != nil { in, out := &in.StatefulSet, &out.StatefulSet - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } if in.Job != nil { in, out := &in.Job, &out.Job - *out = new(MetricPipelineRuntimeInputResourceDisabledByDefault) + *out = new(MetricPipelineRuntimeInputResourceEnabledByDefault) (*in).DeepCopyInto(*out) } } diff --git a/config/crd/bases/telemetry.kyma-project.io_metricpipelines.yaml b/config/crd/bases/telemetry.kyma-project.io_metricpipelines.yaml index e2dbf5adf..8a2214686 100644 --- a/config/crd/bases/telemetry.kyma-project.io_metricpipelines.yaml +++ b/config/crd/bases/telemetry.kyma-project.io_metricpipelines.yaml @@ -220,19 +220,19 @@ spec: container: enabled: true daemonset: - enabled: false + enabled: true deployment: - enabled: false + enabled: true job: - enabled: false + enabled: true node: - enabled: false + enabled: true pod: enabled: true statefulset: - enabled: false + enabled: true volume: - enabled: false + enabled: true description: Describes the Kubernetes resources for which runtime metrics are scraped. properties: @@ -249,46 +249,46 @@ spec: type: object daemonset: default: - enabled: false + enabled: true description: Configures DaemonSet runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object deployment: default: - enabled: false + enabled: true description: Configures Deployment runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object job: default: - enabled: false + enabled: true description: Configures Job runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object node: default: - enabled: false + enabled: true description: Configures Node runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object pod: @@ -304,24 +304,24 @@ spec: type: object statefulset: default: - enabled: false + enabled: true description: Configures StatefulSet runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object volume: default: - enabled: false + enabled: true description: Configures Volume runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object type: object diff --git a/config/development/crd/bases/telemetry.kyma-project.io_metricpipelines.yaml b/config/development/crd/bases/telemetry.kyma-project.io_metricpipelines.yaml index fc373cf74..9d4302c27 100644 --- a/config/development/crd/bases/telemetry.kyma-project.io_metricpipelines.yaml +++ b/config/development/crd/bases/telemetry.kyma-project.io_metricpipelines.yaml @@ -220,19 +220,19 @@ spec: container: enabled: true daemonset: - enabled: false + enabled: true deployment: - enabled: false + enabled: true job: - enabled: false + enabled: true node: - enabled: false + enabled: true pod: enabled: true statefulset: - enabled: false + enabled: true volume: - enabled: false + enabled: true description: Describes the Kubernetes resources for which runtime metrics are scraped. properties: @@ -249,46 +249,46 @@ spec: type: object daemonset: default: - enabled: false + enabled: true description: Configures DaemonSet runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object deployment: default: - enabled: false + enabled: true description: Configures Deployment runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object job: default: - enabled: false + enabled: true description: Configures Job runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object node: default: - enabled: false + enabled: true description: Configures Node runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object pod: @@ -304,24 +304,24 @@ spec: type: object statefulset: default: - enabled: false + enabled: true description: Configures StatefulSet runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object volume: default: - enabled: false + enabled: true description: Configures Volume runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object type: object @@ -915,19 +915,19 @@ spec: container: enabled: true daemonset: - enabled: false + enabled: true deployment: - enabled: false + enabled: true job: - enabled: false + enabled: true node: - enabled: false + enabled: true pod: enabled: true statefulset: - enabled: false + enabled: true volume: - enabled: false + enabled: true description: Describes the Kubernetes resources for which runtime metrics are scraped. properties: @@ -944,46 +944,46 @@ spec: type: object daemonset: default: - enabled: false + enabled: true description: Configures DaemonSet runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object deployment: default: - enabled: false + enabled: true description: Configures Deployment runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object job: default: - enabled: false + enabled: true description: Configures Job runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object node: default: - enabled: false + enabled: true description: Configures Node runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object pod: @@ -999,24 +999,24 @@ spec: type: object statefulset: default: - enabled: false + enabled: true description: Configures StatefulSet runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object volume: default: - enabled: false + enabled: true description: Configures Volume runtime metrics scraping. properties: enabled: - default: false + default: true description: If enabled, the runtime metrics for the - resource are scraped. The default is `false`. + resource are scraped. The default is `true`. type: boolean type: object type: object diff --git a/docs/user/04-metrics.md b/docs/user/04-metrics.md index a7af4866a..bbb09a648 100644 --- a/docs/user/04-metrics.md +++ b/docs/user/04-metrics.md @@ -395,7 +395,7 @@ spec: value: https://backend.example.com:4317 ``` -By default, container and Pod metrics are collected. +By default, metrics for all resources (Pod, container, Node, Volume, DaemonSet, Deployment, StatefulSet and Job) are collected. To enable or disable the collection of metrics for a specific resource, use the `resources` section in the `runtime` input. The following example collects only DaemonSet, Deployment, StatefulSet and Job metrics: diff --git a/docs/user/resources/05-metricpipeline.md b/docs/user/resources/05-metricpipeline.md index 6e72a1435..7f4bd3cdf 100644 --- a/docs/user/resources/05-metricpipeline.md +++ b/docs/user/resources/05-metricpipeline.md @@ -97,19 +97,19 @@ For details, see the [MetricPipeline specification file](https://github.com/kyma | **input.​runtime.​resources.​container** | object | Configures container runtime metrics scraping. | | **input.​runtime.​resources.​container.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `true`. | | **input.​runtime.​resources.​daemonset** | object | Configures DaemonSet runtime metrics scraping. | -| **input.​runtime.​resources.​daemonset.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `false`. | +| **input.​runtime.​resources.​daemonset.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `true`. | | **input.​runtime.​resources.​deployment** | object | Configures Deployment runtime metrics scraping. | -| **input.​runtime.​resources.​deployment.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `false`. | +| **input.​runtime.​resources.​deployment.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `true`. | | **input.​runtime.​resources.​job** | object | Configures Job runtime metrics scraping. | -| **input.​runtime.​resources.​job.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `false`. | +| **input.​runtime.​resources.​job.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `true`. | | **input.​runtime.​resources.​node** | object | Configures Node runtime metrics scraping. | -| **input.​runtime.​resources.​node.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `false`. | +| **input.​runtime.​resources.​node.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `true`. | | **input.​runtime.​resources.​pod** | object | Configures Pod runtime metrics scraping. | | **input.​runtime.​resources.​pod.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `true`. | | **input.​runtime.​resources.​statefulset** | object | Configures StatefulSet runtime metrics scraping. | -| **input.​runtime.​resources.​statefulset.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `false`. | +| **input.​runtime.​resources.​statefulset.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `true`. | | **input.​runtime.​resources.​volume** | object | Configures Volume runtime metrics scraping. | -| **input.​runtime.​resources.​volume.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `false`. | +| **input.​runtime.​resources.​volume.​enabled** | boolean | If enabled, the runtime metrics for the resource are scraped. The default is `true`. | | **output** | object | Configures the metric gateway. | | **output.​otlp** (required) | object | Defines an output using the OpenTelemetry protocol. | | **output.​otlp.​authentication** | object | Defines authentication options for the OTLP output | diff --git a/internal/otelcollector/config/metric/agent/config_builder_test.go b/internal/otelcollector/config/metric/agent/config_builder_test.go index bb7c7ee86..b4f9c86eb 100644 --- a/internal/otelcollector/config/metric/agent/config_builder_test.go +++ b/internal/otelcollector/config/metric/agent/config_builder_test.go @@ -77,65 +77,77 @@ func TestBuildAgentConfig(t *testing.T) { require.Len(t, collectorConfig.Service.Pipelines, 0) }) - t.Run("runtime input enabled with volume metrics enabled ", func(t *testing.T) { - collectorConfig := sut.Build([]telemetryv1alpha1.MetricPipeline{ - testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputVolumeMetrics(true).Build(), - }, BuildOptions{}) - - require.NotNil(t, collectorConfig.Processors.DeleteServiceName) - require.NotNil(t, collectorConfig.Processors.SetInstrumentationScopeRuntime) - require.NotNil(t, collectorConfig.Processors.InsertSkipEnrichmentAttribute) - require.NotNil(t, collectorConfig.Processors.DropNonPVCVolumesMetrics) - require.Nil(t, collectorConfig.Processors.SetInstrumentationScopePrometheus) - require.Nil(t, collectorConfig.Processors.SetInstrumentationScopeIstio) - - require.Len(t, collectorConfig.Service.Pipelines, 1) - require.Contains(t, collectorConfig.Service.Pipelines, "metrics/runtime") - require.Equal(t, []string{"kubeletstats", "singleton_receiver_creator/k8s_cluster"}, collectorConfig.Service.Pipelines["metrics/runtime"].Receivers) - require.Equal(t, []string{"memory_limiter", "filter/drop-non-pvc-volumes-metrics", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"}, collectorConfig.Service.Pipelines["metrics/runtime"].Processors) - require.Equal(t, []string{"otlp"}, collectorConfig.Service.Pipelines["metrics/runtime"].Exporters) - }) - t.Run("runtime enabled with different resources", func(t *testing.T) { tt := []struct { - name string - pipeline telemetryv1alpha1.MetricPipeline + name string + pipeline telemetryv1alpha1.MetricPipeline + volumeMetricsEnabled bool }{ { - name: "runtime enabled with default metrics", - pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).Build(), + name: "runtime enabled with default metrics enabled", + pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).Build(), + volumeMetricsEnabled: true, }, { - name: "runtime enabled with node metrics", - pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputNodeMetrics(true).Build(), + name: "runtime enabled with and only pod metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputPodMetrics(false).Build(), + volumeMetricsEnabled: true, }, { - name: "runtime enabled with statefulset metrics", - pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputStatefulSetMetrics(true).Build(), + name: "runtime enabled with and only container metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputContainerMetrics(false).Build(), + volumeMetricsEnabled: true, }, { - name: "runtime enabled with daemonset metrics", - pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputDaemonSetMetrics(true).Build(), + name: "runtime enabled with and only node metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputNodeMetrics(false).Build(), + volumeMetricsEnabled: true, + }, + { + name: "runtime enabled with and only volume metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputVolumeMetrics(false).Build(), + volumeMetricsEnabled: false, + }, { + name: "runtime enabled with only statefulset metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputStatefulSetMetrics(false).Build(), + volumeMetricsEnabled: true, + }, { + name: "runtime enabled with only daemonset metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputDaemonSetMetrics(false).Build(), + volumeMetricsEnabled: true, }, { - name: "runtime enabled with deployment metrics", - pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputDeploymentMetrics(true).Build(), + name: "runtime enabled with only deployment metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputDeploymentMetrics(false).Build(), + volumeMetricsEnabled: true, }, { - name: "runtime enabled with job metrics", - pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputJobMetrics(true).Build(), + name: "runtime enabled with only job metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).WithRuntimeInputJobMetrics(false).Build(), + volumeMetricsEnabled: true, }, } for _, tc := range tt { expectedReceiverIDs := []string{"kubeletstats", "singleton_receiver_creator/k8s_cluster"} - expectedProcessorIDs := []string{"memory_limiter", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"} expectedExporterIDs := []string{"otlp"} + var expectedProcessorIDs []string + if tc.volumeMetricsEnabled { + expectedProcessorIDs = []string{"memory_limiter", "filter/drop-non-pvc-volumes-metrics", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"} + } else { + expectedProcessorIDs = []string{"memory_limiter", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"} + } + t.Run(tc.name, func(t *testing.T) { collectorConfig := sut.Build([]telemetryv1alpha1.MetricPipeline{tc.pipeline}, BuildOptions{}) require.NotNil(t, collectorConfig.Processors.DeleteServiceName) require.NotNil(t, collectorConfig.Processors.SetInstrumentationScopeRuntime) require.NotNil(t, collectorConfig.Processors.InsertSkipEnrichmentAttribute) - require.Nil(t, collectorConfig.Processors.DropNonPVCVolumesMetrics) require.Nil(t, collectorConfig.Processors.SetInstrumentationScopePrometheus) require.Nil(t, collectorConfig.Processors.SetInstrumentationScopeIstio) + if tc.volumeMetricsEnabled { + require.NotNil(t, collectorConfig.Processors.DropNonPVCVolumesMetrics) + } else { + require.Nil(t, collectorConfig.Processors.DropNonPVCVolumesMetrics) + } + require.Len(t, collectorConfig.Service.Pipelines, 1) require.Contains(t, collectorConfig.Service.Pipelines, "metrics/runtime") require.Equal(t, expectedReceiverIDs, collectorConfig.Service.Pipelines["metrics/runtime"].Receivers) @@ -188,11 +200,12 @@ func TestBuildAgentConfig(t *testing.T) { require.NotNil(t, collectorConfig.Processors.SetInstrumentationScopeRuntime) require.NotNil(t, collectorConfig.Processors.SetInstrumentationScopePrometheus) require.NotNil(t, collectorConfig.Processors.SetInstrumentationScopeIstio) + require.NotNil(t, collectorConfig.Processors.DropNonPVCVolumesMetrics) require.Len(t, collectorConfig.Service.Pipelines, 3) require.Contains(t, collectorConfig.Service.Pipelines, "metrics/runtime") require.Equal(t, []string{"kubeletstats", "singleton_receiver_creator/k8s_cluster"}, collectorConfig.Service.Pipelines["metrics/runtime"].Receivers) - require.Equal(t, []string{"memory_limiter", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"}, collectorConfig.Service.Pipelines["metrics/runtime"].Processors) + require.Equal(t, []string{"memory_limiter", "filter/drop-non-pvc-volumes-metrics", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"}, collectorConfig.Service.Pipelines["metrics/runtime"].Processors) require.Equal(t, []string{"otlp"}, collectorConfig.Service.Pipelines["metrics/runtime"].Exporters) require.Contains(t, collectorConfig.Service.Pipelines, "metrics/prometheus") require.Equal(t, []string{"prometheus/app-pods", "prometheus/app-services"}, collectorConfig.Service.Pipelines["metrics/prometheus"].Receivers) @@ -230,11 +243,12 @@ func TestBuildAgentConfig(t *testing.T) { require.NotNil(t, collectorConfig.Processors.SetInstrumentationScopeRuntime) require.Nil(t, collectorConfig.Processors.SetInstrumentationScopePrometheus) require.Nil(t, collectorConfig.Processors.SetInstrumentationScopeIstio) + require.NotNil(t, collectorConfig.Processors.DropNonPVCVolumesMetrics) require.Len(t, collectorConfig.Service.Pipelines, 1) require.Contains(t, collectorConfig.Service.Pipelines, "metrics/runtime") require.Equal(t, []string{"kubeletstats", "singleton_receiver_creator/k8s_cluster"}, collectorConfig.Service.Pipelines["metrics/runtime"].Receivers) - require.Equal(t, []string{"memory_limiter", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"}, collectorConfig.Service.Pipelines["metrics/runtime"].Processors) + require.Equal(t, []string{"memory_limiter", "filter/drop-non-pvc-volumes-metrics", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"}, collectorConfig.Service.Pipelines["metrics/runtime"].Processors) require.Equal(t, []string{"otlp"}, collectorConfig.Service.Pipelines["metrics/runtime"].Exporters) }) @@ -248,11 +262,12 @@ func TestBuildAgentConfig(t *testing.T) { require.NotNil(t, collectorConfig.Processors.SetInstrumentationScopeRuntime) require.Nil(t, collectorConfig.Processors.SetInstrumentationScopePrometheus) require.Nil(t, collectorConfig.Processors.SetInstrumentationScopeIstio) + require.NotNil(t, collectorConfig.Processors.DropNonPVCVolumesMetrics) require.Len(t, collectorConfig.Service.Pipelines, 1) require.Contains(t, collectorConfig.Service.Pipelines, "metrics/runtime") require.Equal(t, []string{"kubeletstats", "singleton_receiver_creator/k8s_cluster"}, collectorConfig.Service.Pipelines["metrics/runtime"].Receivers) - require.Equal(t, []string{"memory_limiter", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"}, collectorConfig.Service.Pipelines["metrics/runtime"].Processors) + require.Equal(t, []string{"memory_limiter", "filter/drop-non-pvc-volumes-metrics", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"}, collectorConfig.Service.Pipelines["metrics/runtime"].Processors) require.Equal(t, []string{"otlp"}, collectorConfig.Service.Pipelines["metrics/runtime"].Exporters) }) @@ -300,11 +315,12 @@ func TestBuildAgentConfig(t *testing.T) { require.NotNil(t, collectorConfig.Processors.DeleteServiceName) require.NotNil(t, collectorConfig.Processors.SetInstrumentationScopeRuntime) require.NotNil(t, collectorConfig.Processors.SetInstrumentationScopeRuntime) + require.NotNil(t, collectorConfig.Processors.DropNonPVCVolumesMetrics) require.Len(t, collectorConfig.Service.Pipelines, 2) require.Contains(t, collectorConfig.Service.Pipelines, "metrics/runtime") require.Equal(t, []string{"kubeletstats", "singleton_receiver_creator/k8s_cluster"}, collectorConfig.Service.Pipelines["metrics/runtime"].Receivers) - require.Equal(t, []string{"memory_limiter", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"}, collectorConfig.Service.Pipelines["metrics/runtime"].Processors) + require.Equal(t, []string{"memory_limiter", "filter/drop-non-pvc-volumes-metrics", "resource/delete-service-name", "transform/set-instrumentation-scope-runtime", "transform/insert-skip-enrichment-attribute", "batch"}, collectorConfig.Service.Pipelines["metrics/runtime"].Processors) require.Equal(t, []string{"otlp"}, collectorConfig.Service.Pipelines["metrics/runtime"].Exporters) require.Contains(t, collectorConfig.Service.Pipelines, "metrics/prometheus") require.Equal(t, []string{"prometheus/app-pods", "prometheus/app-services"}, collectorConfig.Service.Pipelines["metrics/prometheus"].Receivers) diff --git a/internal/otelcollector/config/metric/agent/receivers_test.go b/internal/otelcollector/config/metric/agent/receivers_test.go index bb71841c1..1f6f8130f 100644 --- a/internal/otelcollector/config/metric/agent/receivers_test.go +++ b/internal/otelcollector/config/metric/agent/receivers_test.go @@ -10,6 +10,18 @@ import ( testutils "github.com/kyma-project/telemetry-manager/internal/utils/test" ) +type metricResource string + +const ( + pod metricResource = "pod" + container metricResource = "container" + statefulset metricResource = "statefulset" + job metricResource = "job" + deployment metricResource = "deployment" + daemonset metricResource = "daemonset" + none metricResource = "none" +) + func TestReceivers(t *testing.T) { gatewayServiceName := types.NamespacedName{Name: "metrics", Namespace: "telemetry-system"} sut := Builder{ @@ -42,36 +54,52 @@ func TestReceivers(t *testing.T) { WithRuntimeInput(true). Build(), - expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop("default"), + expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop(none), }, { - name: "only statefulset metrics enabled", - pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true). + name: "only pod metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder(). + WithRuntimeInput(true). WithRuntimeInputPodMetrics(false). + Build(), + expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop(pod), + }, + { + name: "only container metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder(). + WithRuntimeInput(true). WithRuntimeInputContainerMetrics(false). - WithRuntimeInputStatefulSetMetrics(true).Build(), - expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop("statefulset"), + Build(), + expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop(container), + }, + { + name: "only statefulset metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder(). + WithRuntimeInput(true). + WithRuntimeInputStatefulSetMetrics(false). + Build(), + expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop(statefulset), }, { - name: "only job metrics enabled", - pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputJobMetrics(true).Build(), - expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop("job"), + name: "only job metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder(). + WithRuntimeInput(true). + WithRuntimeInputJobMetrics(false). + Build(), + expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop(job), }, { - name: "only deployment metrics enabled", - pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputDeploymentMetrics(true).Build(), - expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop("deployment"), + name: "only deployment metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder(). + WithRuntimeInput(true). + WithRuntimeInputDeploymentMetrics(false). + Build(), + expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop(deployment), }, { - name: "only daemonset metrics enabled", - pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputDaemonSetMetrics(true).Build(), - expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop("daemonset"), + name: "only daemonset metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder(). + WithRuntimeInput(true). + WithRuntimeInputDaemonSetMetrics(false). + Build(), + expectedMetricsToDrop: getExpectedK8sClusterMetricsToDrop(daemonset), }, } for _, test := range tests { @@ -107,51 +135,39 @@ func TestReceivers(t *testing.T) { { name: "default resources enabled", pipeline: testutils.NewMetricPipelineBuilder().WithRuntimeInput(true).Build(), - expectedMetricGroups: []MetricGroupType{"container", "pod"}, + expectedMetricGroups: []MetricGroupType{MetricGroupTypeContainer, MetricGroupTypePod, MetricGroupTypeNode, MetricGroupTypeVolume}, }, { - name: "only pod metrics enabled", + name: "only pod metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). WithRuntimeInput(true). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputPodMetrics(true). - WithRuntimeInputNodeMetrics(false). - WithRuntimeInputVolumeMetrics(false). + WithRuntimeInputPodMetrics(false). Build(), - expectedMetricGroups: []MetricGroupType{"pod"}, + expectedMetricGroups: []MetricGroupType{MetricGroupTypeContainer, MetricGroupTypeNode, MetricGroupTypeVolume}, }, { - name: "only container metrics enabled", + name: "only container metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). WithRuntimeInput(true). - WithRuntimeInputContainerMetrics(true). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputNodeMetrics(false). - WithRuntimeInputVolumeMetrics(false). + WithRuntimeInputContainerMetrics(false). Build(), - expectedMetricGroups: []MetricGroupType{"container"}, + expectedMetricGroups: []MetricGroupType{MetricGroupTypePod, MetricGroupTypeNode, MetricGroupTypeVolume}, }, { - name: "only node metrics enabled", + name: "only node metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). WithRuntimeInput(true). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputNodeMetrics(true). - WithRuntimeInputVolumeMetrics(false). + WithRuntimeInputNodeMetrics(false). Build(), - expectedMetricGroups: []MetricGroupType{"node"}, + expectedMetricGroups: []MetricGroupType{MetricGroupTypeContainer, MetricGroupTypePod, MetricGroupTypeVolume}, }, { - name: "only volume metrics enabled", + name: "only volume metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). WithRuntimeInput(true). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputNodeMetrics(false). - WithRuntimeInputVolumeMetrics(true). + WithRuntimeInputVolumeMetrics(false). Build(), - expectedMetricGroups: []MetricGroupType{"volume"}, + expectedMetricGroups: []MetricGroupType{MetricGroupTypeContainer, MetricGroupTypePod, MetricGroupTypeNode}, }, } @@ -264,7 +280,7 @@ func TestReceivers(t *testing.T) { }) } -func getExpectedK8sClusterMetricsToDrop(resourceEnabled string) K8sClusterMetricsToDrop { +func getExpectedK8sClusterMetricsToDrop(disabledMetricResource metricResource) K8sClusterMetricsToDrop { metricsToDrop := K8sClusterMetricsToDrop{} //nolint:dupl // repeating the code as we want to test the metrics are disabled correctly @@ -296,7 +312,6 @@ func getExpectedK8sClusterMetricsToDrop(resourceEnabled string) K8sClusterMetric K8sContainerMemoryRequest: MetricConfig{false}, K8sContainerMemoryLimit: MetricConfig{false}, } - statefulMetricsToDrop := &K8sClusterStatefulSetMetricsToDrop{ K8sStatefulSetCurrentPods: MetricConfig{false}, K8sStatefulSetDesiredPods: MetricConfig{false}, @@ -323,44 +338,29 @@ func getExpectedK8sClusterMetricsToDrop(resourceEnabled string) K8sClusterMetric metricsToDrop.K8sClusterDefaultMetricsToDrop = defaultMetricsToDrop - if resourceEnabled == "default" { - metricsToDrop.K8sClusterStatefulSetMetricsToDrop = statefulMetricsToDrop - metricsToDrop.K8sClusterJobMetricsToDrop = jobMetricsToDrop - metricsToDrop.K8sClusterDeploymentMetricsToDrop = deploymentMetricsToDrop - metricsToDrop.K8sClusterDaemonSetMetricsToDrop = daemonSetMetricsToDrop + if disabledMetricResource == pod { + metricsToDrop.K8sClusterPodMetricsToDrop = podMetricsToDrop } - if resourceEnabled == "statefulset" { - metricsToDrop.K8sClusterPodMetricsToDrop = podMetricsToDrop + if disabledMetricResource == container { metricsToDrop.K8sClusterContainerMetricsToDrop = containerMetricsToDrop - metricsToDrop.K8sClusterJobMetricsToDrop = jobMetricsToDrop - metricsToDrop.K8sClusterDeploymentMetricsToDrop = deploymentMetricsToDrop - metricsToDrop.K8sClusterDaemonSetMetricsToDrop = daemonSetMetricsToDrop } - if resourceEnabled == "job" { - metricsToDrop.K8sClusterPodMetricsToDrop = podMetricsToDrop - metricsToDrop.K8sClusterContainerMetricsToDrop = containerMetricsToDrop + if disabledMetricResource == statefulset { metricsToDrop.K8sClusterStatefulSetMetricsToDrop = statefulMetricsToDrop - metricsToDrop.K8sClusterDeploymentMetricsToDrop = deploymentMetricsToDrop - metricsToDrop.K8sClusterDaemonSetMetricsToDrop = daemonSetMetricsToDrop } - if resourceEnabled == "deployment" { - metricsToDrop.K8sClusterPodMetricsToDrop = podMetricsToDrop - metricsToDrop.K8sClusterContainerMetricsToDrop = containerMetricsToDrop - metricsToDrop.K8sClusterStatefulSetMetricsToDrop = statefulMetricsToDrop + if disabledMetricResource == job { metricsToDrop.K8sClusterJobMetricsToDrop = jobMetricsToDrop - metricsToDrop.K8sClusterDaemonSetMetricsToDrop = daemonSetMetricsToDrop } - if resourceEnabled == "daemonset" { - metricsToDrop.K8sClusterPodMetricsToDrop = podMetricsToDrop - metricsToDrop.K8sClusterContainerMetricsToDrop = containerMetricsToDrop - metricsToDrop.K8sClusterStatefulSetMetricsToDrop = statefulMetricsToDrop - metricsToDrop.K8sClusterJobMetricsToDrop = jobMetricsToDrop + if disabledMetricResource == deployment { metricsToDrop.K8sClusterDeploymentMetricsToDrop = deploymentMetricsToDrop } + if disabledMetricResource == daemonset { + metricsToDrop.K8sClusterDaemonSetMetricsToDrop = daemonSetMetricsToDrop + } + return metricsToDrop } diff --git a/internal/otelcollector/config/metric/agent/testdata/config_istio_enabled.yaml b/internal/otelcollector/config/metric/agent/testdata/config_istio_enabled.yaml index 30b01b39c..f5795386b 100644 --- a/internal/otelcollector/config/metric/agent/testdata/config_istio_enabled.yaml +++ b/internal/otelcollector/config/metric/agent/testdata/config_istio_enabled.yaml @@ -33,6 +33,7 @@ service: - singleton_receiver_creator/k8s_cluster processors: - memory_limiter + - filter/drop-non-pvc-volumes-metrics - resource/delete-service-name - transform/set-instrumentation-scope-runtime - transform/insert-skip-enrichment-attribute @@ -62,6 +63,8 @@ receivers: metric_groups: - container - pod + - node + - volume metrics: container.cpu.usage: enabled: true @@ -134,36 +137,6 @@ receivers: enabled: false k8s.cronjob.active_jobs: enabled: false - k8s.statefulset.current_pods: - enabled: false - k8s.statefulset.desired_pods: - enabled: false - k8s.statefulset.ready_pods: - enabled: false - k8s.statefulset.updated_pods: - enabled: false - k8s.job.active_pods: - enabled: false - k8s.job.desired_successful_pods: - enabled: false - k8s.job.failed_pods: - enabled: false - k8s.job.max_parallel_pods: - enabled: false - k8s.job.successful_pods: - enabled: false - k8s.deployment.available: - enabled: false - k8s.deployment.desired: - enabled: false - k8s.daemonset.current_scheduled_nodes: - enabled: false - k8s.daemonset.desired_scheduled_nodes: - enabled: false - k8s.daemonset.misscheduled_nodes: - enabled: false - k8s.daemonset.ready_nodes: - enabled: false prometheus/app-pods: config: scrape_configs: @@ -380,6 +353,10 @@ processors: - IsMatch(name, "^k8s.daemonset.*") - IsMatch(name, "^k8s.deployment.*") - IsMatch(name, "^k8s.job.*") + filter/drop-non-pvc-volumes-metrics: + metrics: + metric: + - resource.attributes["k8s.volume.name"] != nil and resource.attributes["k8s.volume.type"] != "persistentVolumeClaim" exporters: otlp: endpoint: metrics.telemetry-system.svc.cluster.local:4317 diff --git a/internal/otelcollector/config/metric/agent/testdata/config_istio_not_enabled.yaml b/internal/otelcollector/config/metric/agent/testdata/config_istio_not_enabled.yaml index 3d6a346bb..d79f32157 100644 --- a/internal/otelcollector/config/metric/agent/testdata/config_istio_not_enabled.yaml +++ b/internal/otelcollector/config/metric/agent/testdata/config_istio_not_enabled.yaml @@ -22,6 +22,7 @@ service: - singleton_receiver_creator/k8s_cluster processors: - memory_limiter + - filter/drop-non-pvc-volumes-metrics - resource/delete-service-name - transform/set-instrumentation-scope-runtime - transform/insert-skip-enrichment-attribute @@ -51,6 +52,8 @@ receivers: metric_groups: - container - pod + - node + - volume metrics: container.cpu.usage: enabled: true @@ -123,36 +126,6 @@ receivers: enabled: false k8s.cronjob.active_jobs: enabled: false - k8s.statefulset.current_pods: - enabled: false - k8s.statefulset.desired_pods: - enabled: false - k8s.statefulset.ready_pods: - enabled: false - k8s.statefulset.updated_pods: - enabled: false - k8s.job.active_pods: - enabled: false - k8s.job.desired_successful_pods: - enabled: false - k8s.job.failed_pods: - enabled: false - k8s.job.max_parallel_pods: - enabled: false - k8s.job.successful_pods: - enabled: false - k8s.deployment.available: - enabled: false - k8s.deployment.desired: - enabled: false - k8s.daemonset.current_scheduled_nodes: - enabled: false - k8s.daemonset.desired_scheduled_nodes: - enabled: false - k8s.daemonset.misscheduled_nodes: - enabled: false - k8s.daemonset.ready_nodes: - enabled: false prometheus/app-pods: config: scrape_configs: @@ -280,6 +253,10 @@ processors: - IsMatch(name, "^k8s.daemonset.*") - IsMatch(name, "^k8s.deployment.*") - IsMatch(name, "^k8s.job.*") + filter/drop-non-pvc-volumes-metrics: + metrics: + metric: + - resource.attributes["k8s.volume.name"] != nil and resource.attributes["k8s.volume.type"] != "persistentVolumeClaim" exporters: otlp: endpoint: metrics.telemetry-system.svc.cluster.local:4317 diff --git a/internal/otelcollector/config/metric/gateway/service_test.go b/internal/otelcollector/config/metric/gateway/service_test.go index 482916d1e..65f11250c 100644 --- a/internal/otelcollector/config/metric/gateway/service_test.go +++ b/internal/otelcollector/config/metric/gateway/service_test.go @@ -331,41 +331,6 @@ func TestService(t *testing.T) { }, collectorConfig.Service.Pipelines["metrics/test-output"].Processors) require.Equal(t, []string{"otlp/test"}, collectorConfig.Service.Pipelines["metrics/test-output"].Exporters) }) - - t.Run("with otlp input explicitly enabled", func(t *testing.T) { - collectorConfig, _, err := sut.Build( - ctx, - []telemetryv1alpha1.MetricPipeline{ - testutils.NewMetricPipelineBuilder().WithName("test").WithOTLPInput(true).Build(), - }, - BuildOptions{}, - ) - require.NoError(t, err) - - require.Contains(t, collectorConfig.Service.Pipelines, "metrics/test-input") - require.Contains(t, collectorConfig.Service.Pipelines, "metrics/test-attributes-enrichment") - require.Contains(t, collectorConfig.Service.Pipelines, "metrics/test-output") - - require.Equal(t, []string{"otlp", "singleton_receiver_creator/kymastats"}, collectorConfig.Service.Pipelines["metrics/test-input"].Receivers) - require.Equal(t, []string{"memory_limiter"}, collectorConfig.Service.Pipelines["metrics/test-input"].Processors) - require.Equal(t, []string{"routing/test"}, collectorConfig.Service.Pipelines["metrics/test-input"].Exporters) - - require.Equal(t, []string{"routing/test"}, collectorConfig.Service.Pipelines["metrics/test-attributes-enrichment"].Receivers) - require.Equal(t, []string{"k8sattributes", "transform/resolve-service-name", "resource/drop-kyma-attributes"}, collectorConfig.Service.Pipelines["metrics/test-attributes-enrichment"].Processors) - require.Equal(t, []string{"forward/test"}, collectorConfig.Service.Pipelines["metrics/test-attributes-enrichment"].Exporters) - - require.Equal(t, []string{"routing/test", "forward/test"}, collectorConfig.Service.Pipelines["metrics/test-output"].Receivers) - require.Equal(t, []string{ - "filter/drop-if-input-source-runtime", - "filter/drop-if-input-source-prometheus", - "filter/drop-if-input-source-istio", - "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", - "resource/delete-skip-enrichment-attribute", - "batch", - }, collectorConfig.Service.Pipelines["metrics/test-output"].Processors) - require.Equal(t, []string{"otlp/test"}, collectorConfig.Service.Pipelines["metrics/test-output"].Exporters) - }) }) t.Run("multi pipeline topology", func(t *testing.T) { @@ -407,12 +372,6 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", "filter/test-1-filter-by-namespace-runtime-input", - "filter/drop-runtime-node-metrics", - "filter/drop-runtime-volume-metrics", - "filter/drop-runtime-deployment-metrics", - "filter/drop-runtime-daemonset-metrics", - "filter/drop-runtime-statefulset-metrics", - "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", "resource/insert-cluster-name", "resource/delete-skip-enrichment-attribute", @@ -490,17 +449,12 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { { name: "with runtime input enabled and default metrics enabled", pipeline: testutils.NewMetricPipelineBuilder(). - WithName("test").WithRuntimeInput(true). + WithName("test"). + WithRuntimeInput(true). Build(), expectedProcessors: []string{ "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", - "filter/drop-runtime-node-metrics", - "filter/drop-runtime-volume-metrics", - "filter/drop-runtime-deployment-metrics", - "filter/drop-runtime-daemonset-metrics", - "filter/drop-runtime-statefulset-metrics", - "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", "resource/insert-cluster-name", "resource/delete-skip-enrichment-attribute", @@ -508,158 +462,127 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { }, }, { - name: "with runtime input enabled and only pod metrics enabled", + name: "with runtime input enabled and only pod metrics disabled", + pipeline: testutils.NewMetricPipelineBuilder(). + WithName("test"). + WithRuntimeInput(true). + WithRuntimeInputPodMetrics(false). + Build(), + expectedProcessors: []string{ + "filter/drop-if-input-source-prometheus", + "filter/drop-if-input-source-istio", + "filter/drop-runtime-pod-metrics", + "transform/set-instrumentation-scope-kyma", + "resource/insert-cluster-name", + "resource/delete-skip-enrichment-attribute", + "batch", + }, + }, { + name: "with runtime input enabled and only container metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). - WithName("test").WithRuntimeInput(true). - WithRuntimeInputPodMetrics(true). + WithName("test"). + WithRuntimeInput(true). WithRuntimeInputContainerMetrics(false). Build(), expectedProcessors: []string{ "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", "filter/drop-runtime-container-metrics", - "filter/drop-runtime-node-metrics", - "filter/drop-runtime-volume-metrics", - "filter/drop-runtime-deployment-metrics", - "filter/drop-runtime-daemonset-metrics", - "filter/drop-runtime-statefulset-metrics", - "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", "resource/insert-cluster-name", "resource/delete-skip-enrichment-attribute", "batch", }, }, { - name: "with runtime input enabled and only container metrics enabled", + name: "with runtime input enabled and only node metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). - WithName("test").WithRuntimeInput(true). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputContainerMetrics(true). + WithName("test"). + WithRuntimeInput(true). + WithRuntimeInputNodeMetrics(false). Build(), expectedProcessors: []string{ "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", - "filter/drop-runtime-pod-metrics", "filter/drop-runtime-node-metrics", - "filter/drop-runtime-volume-metrics", - "filter/drop-runtime-deployment-metrics", - "filter/drop-runtime-daemonset-metrics", - "filter/drop-runtime-statefulset-metrics", - "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", "resource/insert-cluster-name", "resource/delete-skip-enrichment-attribute", "batch", }, }, { - name: "with runtime input enabled and only node metrics enabled", + name: "with runtime input enabled and only volume metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). - WithName("test").WithRuntimeInput(true). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputNodeMetrics(true). + WithName("test"). + WithRuntimeInput(true). + WithRuntimeInputVolumeMetrics(false). Build(), expectedProcessors: []string{ "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", - "filter/drop-runtime-pod-metrics", - "filter/drop-runtime-container-metrics", "filter/drop-runtime-volume-metrics", - "filter/drop-runtime-deployment-metrics", - "filter/drop-runtime-daemonset-metrics", - "filter/drop-runtime-statefulset-metrics", - "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", "resource/insert-cluster-name", "resource/delete-skip-enrichment-attribute", "batch", }, }, { - name: "with runtime input enabled and only volume metrics enabled", + name: "with runtime input enabled and only deployment metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). - WithName("test").WithRuntimeInput(true). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputVolumeMetrics(true). + WithName("test"). + WithRuntimeInput(true). + WithRuntimeInputDeploymentMetrics(false). Build(), expectedProcessors: []string{ "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", - "filter/drop-runtime-pod-metrics", - "filter/drop-runtime-container-metrics", - "filter/drop-runtime-node-metrics", "filter/drop-runtime-deployment-metrics", - "filter/drop-runtime-daemonset-metrics", - "filter/drop-runtime-statefulset-metrics", - "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", "resource/insert-cluster-name", "resource/delete-skip-enrichment-attribute", "batch", }, }, { - name: "with runtime input enabled and only deployment metrics enabled", + name: "with runtime input enabled and only daemonset metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). - WithName("test").WithRuntimeInput(true). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputDeploymentMetrics(true). + WithName("test"). + WithRuntimeInput(true). + WithRuntimeInputDaemonSetMetrics(false). Build(), expectedProcessors: []string{ "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", - "filter/drop-runtime-pod-metrics", - "filter/drop-runtime-container-metrics", - "filter/drop-runtime-node-metrics", - "filter/drop-runtime-volume-metrics", "filter/drop-runtime-daemonset-metrics", - "filter/drop-runtime-statefulset-metrics", - "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", "resource/insert-cluster-name", "resource/delete-skip-enrichment-attribute", "batch", }, }, { - name: "with runtime input enabled and only daemonset metrics enabled", + name: "with runtime input enabled and only statefulset metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). - WithName("test").WithRuntimeInput(true). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputDaemonSetMetrics(true). + WithName("test"). + WithRuntimeInput(true). + WithRuntimeInputStatefulSetMetrics(false). Build(), expectedProcessors: []string{ "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", - "filter/drop-runtime-pod-metrics", - "filter/drop-runtime-container-metrics", - "filter/drop-runtime-node-metrics", - "filter/drop-runtime-volume-metrics", - "filter/drop-runtime-deployment-metrics", "filter/drop-runtime-statefulset-metrics", - "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", "resource/insert-cluster-name", "resource/delete-skip-enrichment-attribute", "batch", }, }, { - name: "with runtime input enabled and only statefulset metrics enabled", + name: "with runtime input enabled and only job metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). - WithName("test").WithRuntimeInput(true). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputStatefulSetMetrics(true). + WithName("test"). + WithRuntimeInput(true). + WithRuntimeInputJobMetrics(false). Build(), expectedProcessors: []string{ "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", - "filter/drop-runtime-pod-metrics", - "filter/drop-runtime-container-metrics", - "filter/drop-runtime-node-metrics", - "filter/drop-runtime-volume-metrics", - "filter/drop-runtime-deployment-metrics", - "filter/drop-runtime-daemonset-metrics", "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", "resource/insert-cluster-name", @@ -667,12 +590,18 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "batch", }, }, { - name: "with runtime input enabled and only job metrics enabled", + name: "with runtime input enabled and all runtime metrics disabled", pipeline: testutils.NewMetricPipelineBuilder(). - WithName("test").WithRuntimeInput(true). + WithName("test"). + WithRuntimeInput(true). WithRuntimeInputContainerMetrics(false). WithRuntimeInputPodMetrics(false). - WithRuntimeInputJobMetrics(true). + WithRuntimeInputNodeMetrics(false). + WithRuntimeInputVolumeMetrics(false). + WithRuntimeInputDeploymentMetrics(false). + WithRuntimeInputDaemonSetMetrics(false). + WithRuntimeInputStatefulSetMetrics(false). + WithRuntimeInputJobMetrics(false). Build(), expectedProcessors: []string{ "filter/drop-if-input-source-prometheus", @@ -680,32 +609,11 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "filter/drop-runtime-pod-metrics", "filter/drop-runtime-container-metrics", "filter/drop-runtime-node-metrics", - "filter/drop-runtime-volume-metrics", "filter/drop-runtime-deployment-metrics", "filter/drop-runtime-daemonset-metrics", "filter/drop-runtime-statefulset-metrics", - "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", - "resource/delete-skip-enrichment-attribute", - "batch", - }, - }, { - name: "with runtime input enabled and all runtime metrics enabled", - pipeline: testutils.NewMetricPipelineBuilder(). - WithName("test").WithRuntimeInput(true). - WithRuntimeInputContainerMetrics(true). - WithRuntimeInputPodMetrics(true). - WithRuntimeInputNodeMetrics(true). - WithRuntimeInputVolumeMetrics(true). - WithRuntimeInputDeploymentMetrics(true). - WithRuntimeInputDaemonSetMetrics(true). - WithRuntimeInputStatefulSetMetrics(true). - WithRuntimeInputJobMetrics(true). - Build(), - expectedProcessors: []string{ - "filter/drop-if-input-source-prometheus", - "filter/drop-if-input-source-istio", + "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", "resource/insert-cluster-name", "resource/delete-skip-enrichment-attribute", diff --git a/internal/otelcollector/config/metric/input_enabled.go b/internal/otelcollector/config/metric/input_enabled.go index 3670467e4..546da8200 100644 --- a/internal/otelcollector/config/metric/input_enabled.go +++ b/internal/otelcollector/config/metric/input_enabled.go @@ -45,54 +45,54 @@ func IsRuntimeContainerInputEnabled(input telemetryv1alpha1.MetricPipelineInput) } func IsRuntimeNodeInputEnabled(input telemetryv1alpha1.MetricPipelineInput) bool { - // Runtime node metrics should be disabled by default if any of the fields (Resources, Node or Enabled) is nil + // Runtime node metrics should be enabled by default if any of the fields (Resources, Node or Enabled) is nil if input.Runtime.Resources == nil || input.Runtime.Resources.Node == nil || input.Runtime.Resources.Node.Enabled == nil { - return false + return true } return *input.Runtime.Resources.Node.Enabled } func IsRuntimeVolumeInputEnabled(input telemetryv1alpha1.MetricPipelineInput) bool { - // Runtime volume metrics should be disabled by default if any of the fields (Resources, Volume or Enabled) is nil + // Runtime volume metrics should be enabled by default if any of the fields (Resources, Volume or Enabled) is nil if input.Runtime.Resources == nil || input.Runtime.Resources.Volume == nil || input.Runtime.Resources.Volume.Enabled == nil { - return false + return true } return *input.Runtime.Resources.Volume.Enabled } func IsRuntimeStatefulSetInputEnabled(input telemetryv1alpha1.MetricPipelineInput) bool { - // Runtime Statefulset metrics should be disabled by default if any of the fields (Resources, Statefulset or Enabled) is nil + // Runtime Statefulset metrics should be enabled by default if any of the fields (Resources, Statefulset or Enabled) is nil if input.Runtime.Resources == nil || input.Runtime.Resources.StatefulSet == nil || input.Runtime.Resources.StatefulSet.Enabled == nil { - return false + return true } return *input.Runtime.Resources.StatefulSet.Enabled } func IsRuntimeDeploymentInputEnabled(input telemetryv1alpha1.MetricPipelineInput) bool { - // Runtime Deployment metrics should be disabled by default if any of the fields (Resources, Deployment or Enabled) is nil + // Runtime Deployment metrics should be enabled by default if any of the fields (Resources, Deployment or Enabled) is nil if input.Runtime.Resources == nil || input.Runtime.Resources.Deployment == nil || input.Runtime.Resources.Deployment.Enabled == nil { - return false + return true } return *input.Runtime.Resources.Deployment.Enabled } func IsRuntimeDaemonSetInputEnabled(input telemetryv1alpha1.MetricPipelineInput) bool { - // Runtime DaemonSet metrics should be disabled by default if any of the fields (Resources, DaemonSet or Enabled) is nil + // Runtime DaemonSet metrics should be enabled by default if any of the fields (Resources, DaemonSet or Enabled) is nil if input.Runtime.Resources == nil || input.Runtime.Resources.DaemonSet == nil || input.Runtime.Resources.DaemonSet.Enabled == nil { - return false + return true } return *input.Runtime.Resources.DaemonSet.Enabled } func IsRuntimeJobInputEnabled(input telemetryv1alpha1.MetricPipelineInput) bool { - // Runtime Job metrics should be disabled by default if any of the fields (Resources, Job or Enabled) is nil + // Runtime Job metrics should be enabled by default if any of the fields (Resources, Job or Enabled) is nil if input.Runtime.Resources == nil || input.Runtime.Resources.Job == nil || input.Runtime.Resources.Job.Enabled == nil { - return false + return true } return *input.Runtime.Resources.Job.Enabled diff --git a/internal/utils/test/metric_pipeline_builder.go b/internal/utils/test/metric_pipeline_builder.go index 49f06747a..ac17774fd 100644 --- a/internal/utils/test/metric_pipeline_builder.go +++ b/internal/utils/test/metric_pipeline_builder.go @@ -211,7 +211,7 @@ func (b *MetricPipelineBuilder) WithRuntimeInputNodeMetrics(enable bool) *Metric b.initializeRuntimeInputResources() if b.inRuntime.Resources.Node == nil { - b.inRuntime.Resources.Node = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceDisabledByDefault{} + b.inRuntime.Resources.Node = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceEnabledByDefault{} } b.inRuntime.Resources.Node.Enabled = &enable @@ -223,7 +223,7 @@ func (b *MetricPipelineBuilder) WithRuntimeInputVolumeMetrics(enable bool) *Metr b.initializeRuntimeInputResources() if b.inRuntime.Resources.Volume == nil { - b.inRuntime.Resources.Volume = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceDisabledByDefault{} + b.inRuntime.Resources.Volume = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceEnabledByDefault{} } b.inRuntime.Resources.Volume.Enabled = &enable @@ -235,7 +235,7 @@ func (b *MetricPipelineBuilder) WithRuntimeInputDeploymentMetrics(enable bool) * b.initializeRuntimeInputResources() if b.inRuntime.Resources.Deployment == nil { - b.inRuntime.Resources.Deployment = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceDisabledByDefault{} + b.inRuntime.Resources.Deployment = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceEnabledByDefault{} } b.inRuntime.Resources.Deployment.Enabled = &enable @@ -247,7 +247,7 @@ func (b *MetricPipelineBuilder) WithRuntimeInputJobMetrics(enable bool) *MetricP b.initializeRuntimeInputResources() if b.inRuntime.Resources.Job == nil { - b.inRuntime.Resources.Job = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceDisabledByDefault{} + b.inRuntime.Resources.Job = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceEnabledByDefault{} } b.inRuntime.Resources.Job.Enabled = &enable @@ -259,7 +259,7 @@ func (b *MetricPipelineBuilder) WithRuntimeInputDaemonSetMetrics(enable bool) *M b.initializeRuntimeInputResources() if b.inRuntime.Resources.DaemonSet == nil { - b.inRuntime.Resources.DaemonSet = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceDisabledByDefault{} + b.inRuntime.Resources.DaemonSet = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceEnabledByDefault{} } b.inRuntime.Resources.DaemonSet.Enabled = &enable @@ -271,7 +271,7 @@ func (b *MetricPipelineBuilder) WithRuntimeInputStatefulSetMetrics(enable bool) b.initializeRuntimeInputResources() if b.inRuntime.Resources.StatefulSet == nil { - b.inRuntime.Resources.StatefulSet = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceDisabledByDefault{} + b.inRuntime.Resources.StatefulSet = &telemetryv1alpha1.MetricPipelineRuntimeInputResourceEnabledByDefault{} } b.inRuntime.Resources.StatefulSet.Enabled = &enable diff --git a/test/e2e/metrics_multi_pipeline_test.go b/test/e2e/metrics_multi_pipeline_test.go index 55c8314b7..2a18e3977 100644 --- a/test/e2e/metrics_multi_pipeline_test.go +++ b/test/e2e/metrics_multi_pipeline_test.go @@ -44,9 +44,19 @@ var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label(suite.LabelSetA), objs = append(objs, backendRuntime.K8sObjects()...) backendRuntimeExportURL = backendRuntime.ExportURL(proxyClient) + // Enable only container metrics to simplify the test setup and avoid deploying too many workloads + // Other metric resources are tested in metrics_runtime_input_test.go, here the focus is on testing multiple pipelines withe different inputs (runtime and prometheus) metricPipelineRuntime := testutils.NewMetricPipelineBuilder(). WithName(pipelineRuntimeName). WithRuntimeInput(true). + WithRuntimeInputContainerMetrics(true). + WithRuntimeInputPodMetrics(false). + WithRuntimeInputNodeMetrics(false). + WithRuntimeInputVolumeMetrics(false). + WithRuntimeInputDeploymentMetrics(false). + WithRuntimeInputStatefulSetMetrics(false). + WithRuntimeInputDaemonSetMetrics(false). + WithRuntimeInputJobMetrics(false). WithOTLPOutput(testutils.OTLPEndpoint(backendRuntime.Endpoint())). Build() objs = append(objs, &metricPipelineRuntime) @@ -105,7 +115,7 @@ var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label(suite.LabelSetA), bodyContent, err := io.ReadAll(resp.Body) g.Expect(err).NotTo(HaveOccurred()) - g.Expect(bodyContent).To(HaveFlatMetrics(HaveUniqueNamesForRuntimeScope(ConsistOf(runtime.DefaultMetricsNames))), "Not all required runtime metrics are sent to runtime backend") + g.Expect(bodyContent).To(HaveFlatMetrics(HaveUniqueNamesForRuntimeScope(ConsistOf(runtime.ContainerMetricsNames))), "Not all required runtime metrics are sent to runtime backend") checkInstrumentationScopeAndVersion(g, bodyContent, InstrumentationScopeRuntime, InstrumentationScopeKyma) }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed()) }) diff --git a/test/e2e/metrics_runtime_input_resources_test.go b/test/e2e/metrics_runtime_input_resources_test.go deleted file mode 100644 index 511c914f8..000000000 --- a/test/e2e/metrics_runtime_input_resources_test.go +++ /dev/null @@ -1,398 +0,0 @@ -//go:build e2e - -package e2e - -import ( - "net/http" - "slices" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - - testutils "github.com/kyma-project/telemetry-manager/internal/utils/test" - "github.com/kyma-project/telemetry-manager/test/testkit/apiserverproxy" - "github.com/kyma-project/telemetry-manager/test/testkit/assert" - kitk8s "github.com/kyma-project/telemetry-manager/test/testkit/k8s" - kitkyma "github.com/kyma-project/telemetry-manager/test/testkit/kyma" - . "github.com/kyma-project/telemetry-manager/test/testkit/matchers/metric" - "github.com/kyma-project/telemetry-manager/test/testkit/metrics/runtime" - "github.com/kyma-project/telemetry-manager/test/testkit/mocks/backend" - "github.com/kyma-project/telemetry-manager/test/testkit/mocks/prommetricgen" - "github.com/kyma-project/telemetry-manager/test/testkit/mocks/telemetrygen" - "github.com/kyma-project/telemetry-manager/test/testkit/periodic" - "github.com/kyma-project/telemetry-manager/test/testkit/suite" -) - -var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label(suite.LabelSetA), Ordered, func() { - Context("When metric pipelines with runtime resources metrics enabled exist", Ordered, func() { - var ( - mockNs = suite.ID() - - backendResourceMetricsEnabledNameA = suite.IDWithSuffix("resource-metrics-a") - pipelineResourceMetricsEnabledNameA = suite.IDWithSuffix("resource-metrics-a") - backendResourceMetricsEnabledURLA string - - backendResourceMetricsEnabledNameB = suite.IDWithSuffix("resource-metrics-b") - pipelineResourceMetricsEnabledNameB = suite.IDWithSuffix("resource-metrics-b") - backendResourceMetricsEnabledURLB string - - DeploymentName = suite.IDWithSuffix("deployment") - StatefulSetName = suite.IDWithSuffix("stateful-set") - DaemonSetName = suite.IDWithSuffix("daemon-set") - JobName = suite.IDWithSuffix("job") - - pvName = suite.IDWithSuffix("pv") - pvcName = suite.IDWithSuffix("pvc") - podMountingPVCName = suite.IDWithSuffix("pod-with-pvc") - podMountingEmptyDirName = suite.IDWithSuffix("pod-with-emptydir") - ) - - makeResources := func() []client.Object { - var objs []client.Object - objs = append(objs, kitk8s.NewNamespace(mockNs).K8sObject()) - - backendResourceMetricsEnabledA := backend.New(mockNs, backend.SignalTypeMetrics, backend.WithName(backendResourceMetricsEnabledNameA)) - objs = append(objs, backendResourceMetricsEnabledA.K8sObjects()...) - backendResourceMetricsEnabledURLA = backendResourceMetricsEnabledA.ExportURL(proxyClient) - - pipelineResourceMetricsEnabledA := testutils.NewMetricPipelineBuilder(). - WithName(pipelineResourceMetricsEnabledNameA). - WithRuntimeInput(true). - WithRuntimeInputContainerMetrics(true). - WithRuntimeInputPodMetrics(true). - WithRuntimeInputNodeMetrics(true). - WithRuntimeInputVolumeMetrics(true). - WithRuntimeInputDeploymentMetrics(false). - WithRuntimeInputStatefulSetMetrics(false). - WithRuntimeInputDaemonSetMetrics(false). - WithRuntimeInputJobMetrics(false). - WithOTLPOutput(testutils.OTLPEndpoint(backendResourceMetricsEnabledA.Endpoint())). - Build() - objs = append(objs, &pipelineResourceMetricsEnabledA) - - backendResourceMetricsEnabledB := backend.New(mockNs, backend.SignalTypeMetrics, backend.WithName(backendResourceMetricsEnabledNameB)) - objs = append(objs, backendResourceMetricsEnabledB.K8sObjects()...) - backendResourceMetricsEnabledURLB = backendResourceMetricsEnabledB.ExportURL(proxyClient) - - pipelineResourceMetricsEnabledB := testutils.NewMetricPipelineBuilder(). - WithName(pipelineResourceMetricsEnabledNameB). - WithRuntimeInput(true). - WithRuntimeInputPodMetrics(false). - WithRuntimeInputContainerMetrics(false). - WithRuntimeInputNodeMetrics(false). - WithRuntimeInputVolumeMetrics(false). - WithRuntimeInputDeploymentMetrics(true). - WithRuntimeInputStatefulSetMetrics(true). - WithRuntimeInputDaemonSetMetrics(true). - WithRuntimeInputJobMetrics(true). - WithOTLPOutput(testutils.OTLPEndpoint(backendResourceMetricsEnabledB.Endpoint())). - Build() - objs = append(objs, &pipelineResourceMetricsEnabledB) - - metricProducer := prommetricgen.New(mockNs) - - objs = append(objs, []client.Object{ - metricProducer.Pod().WithPrometheusAnnotations(prommetricgen.SchemeHTTP).K8sObject(), - metricProducer.Service().WithPrometheusAnnotations(prommetricgen.SchemeHTTP).K8sObject(), - }...) - - podSpec := telemetrygen.PodSpec(telemetrygen.SignalTypeMetrics) - - objs = append(objs, []client.Object{ - kitk8s.NewDeployment(DeploymentName, mockNs).WithPodSpec(podSpec).WithLabel("name", DeploymentName).K8sObject(), - kitk8s.NewStatefulSet(StatefulSetName, mockNs).WithPodSpec(podSpec).WithLabel("name", StatefulSetName).K8sObject(), - kitk8s.NewDaemonSet(DaemonSetName, mockNs).WithPodSpec(podSpec).WithLabel("name", DaemonSetName).K8sObject(), - kitk8s.NewJob(JobName, mockNs).WithPodSpec(podSpec).WithLabel("name", JobName).K8sObject(), - }...) - - objs = append(objs, createPodsWithVolume(pvName, pvcName, podMountingPVCName, podMountingEmptyDirName, mockNs)...) - - return objs - } - - BeforeAll(func() { - k8sObjects := makeResources() - - DeferCleanup(func() { - Expect(kitk8s.DeleteObjects(ctx, k8sClient, k8sObjects...)).Should(Succeed()) - }) - Expect(kitk8s.CreateObjects(ctx, k8sClient, k8sObjects...)).Should(Succeed()) - }) - - It("Should have healthy pipelines", func() { - assert.MetricPipelineHealthy(ctx, k8sClient, pipelineResourceMetricsEnabledNameA) - assert.MetricPipelineHealthy(ctx, k8sClient, pipelineResourceMetricsEnabledNameB) - }) - - It("Ensures the metric gateway deployment is ready", func() { - assert.DeploymentReady(ctx, k8sClient, kitkyma.MetricGatewayName) - }) - - It("Ensures the metric agent daemonset is ready", func() { - assert.DaemonSetReady(ctx, k8sClient, kitkyma.MetricAgentName) - }) - - It("Should have metrics backends running", func() { - assert.DeploymentReady(ctx, k8sClient, types.NamespacedName{Name: backendResourceMetricsEnabledNameA, Namespace: mockNs}) - assert.DeploymentReady(ctx, k8sClient, types.NamespacedName{Name: backendResourceMetricsEnabledNameB, Namespace: mockNs}) - assert.ServiceReady(ctx, k8sClient, types.NamespacedName{Name: backendResourceMetricsEnabledNameA, Namespace: mockNs}) - assert.ServiceReady(ctx, k8sClient, types.NamespacedName{Name: backendResourceMetricsEnabledNameB, Namespace: mockNs}) - - }) - - It("should have workloads created properly", func() { - assert.DeploymentReady(ctx, k8sClient, types.NamespacedName{Name: DeploymentName, Namespace: mockNs}) - assert.DaemonSetReady(ctx, k8sClient, types.NamespacedName{Name: DaemonSetName, Namespace: mockNs}) - assert.StatefulSetReady(ctx, k8sClient, types.NamespacedName{Name: StatefulSetName, Namespace: mockNs}) - assert.JobReady(ctx, k8sClient, types.NamespacedName{Name: JobName, Namespace: mockNs}) - }) - - It("Should have pods mounting volumes running", func() { - assert.PodReady(ctx, k8sClient, types.NamespacedName{Name: podMountingPVCName, Namespace: mockNs}) - assert.PodReady(ctx, k8sClient, types.NamespacedName{Name: podMountingEmptyDirName, Namespace: mockNs}) - }) - - Context("Pipeline A should deliver pods, container, volume and nodes metrics", func() { - It("Should deliver pod metrics with expected resource attributes and metric attributes", func() { - backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, runtime.PodMetricsNames) - backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "k8s.pod.cpu.time", runtime.PodMetricsResourceAttributes) - - podNetworkErrorsMetric := "k8s.pod.network.errors" - backendContainsDesiredMetricAttributes(proxyClient, backendResourceMetricsEnabledURLA, podNetworkErrorsMetric, runtime.PodMetricsAttributes[podNetworkErrorsMetric]) - - podNetworkIOMetric := "k8s.pod.network.io" - backendContainsDesiredMetricAttributes(proxyClient, backendResourceMetricsEnabledURLA, podNetworkIOMetric, runtime.PodMetricsAttributes[podNetworkIOMetric]) - - }) - - It("Should deliver container metrics with expected resource attributes", func() { - backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, runtime.ContainerMetricsNames) - backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "container.cpu.time", runtime.ContainerMetricsResourceAttributes) - }) - - It("Should deliver volume metrics with expected resource attributes", func() { - backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, runtime.VolumeMetricsNames) - backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "k8s.volume.capacity", runtime.VolumeMetricsResourceAttributes) - }) - - It("Should filter volume metrics only for PVC volumes", func() { - Consistently(func(g Gomega) { - resp, err := proxyClient.Get(backendResourceMetricsEnabledURLA) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) - - g.Expect(resp).To(HaveHTTPBody( - HaveFlatMetrics(Not(ContainElement(HaveResourceAttributes(HaveKeyWithValue("k8s.volume.type", "emptyDir"))))), - )) - }, periodic.TelemetryConsistentlyTimeout, periodic.TelemetryInterval).Should(Succeed()) - }) - - It("Should deliver node metrics with expected resource attributes", func() { - backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, runtime.NodeMetricsNames) - backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "k8s.node.cpu.usage", runtime.NodeMetricsResourceAttributes) - }) - - It("Should have exactly metrics only for pods, containers, volumes and nodes delivered", func() { - exportedMetrics := slices.Concat(runtime.PodMetricsNames, runtime.ContainerMetricsNames, runtime.VolumeMetricsNames, runtime.NodeMetricsNames) - backendConsistsOfMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, exportedMetrics) - }) - }) - - Context("Pipeline B should deliver deployment, daemonset, statefulset and job metrics", Ordered, func() { - It("should deliver deployment metrics with expected resource attributes", func() { - backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLB, runtime.DeploymentMetricsNames) - backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLB, "k8s.deployment.available", runtime.DeploymentResourceAttributes) - }) - - It("should deliver daemonset metrics with expected resource attributes", func() { - backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLB, runtime.DaemonSetMetricsNames) - backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLB, "k8s.daemonset.current_scheduled_nodes", runtime.DaemonSetResourceAttributes) - }) - - It("should deliver statefulset metrics with expected resource attributes", func() { - backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLB, runtime.StatefulSetMetricsNames) - backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLB, "k8s.statefulset.current_pods", runtime.StatefulSetResourceAttributes) - }) - - It("should deliver job metrics with expected resource attributes", func() { - backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLB, runtime.JobsMetricsNames) - backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLB, "k8s.job.active_pods", runtime.JobResourceAttributes) - }) - - It("should have exactly metrics only for deployment, daemonset, statefuleset, job delivered", func() { - expectedMetrics := slices.Concat(runtime.DeploymentMetricsNames, runtime.DaemonSetMetricsNames, runtime.StatefulSetMetricsNames, runtime.JobsMetricsNames) - backendConsistsOfMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLB, expectedMetrics) - }) - }) - }) - -}) - -func createPodsWithVolume(pvName, pvcName, podMountingPVCName, podMountingEmptyDirName, namespace string) []client.Object { - var objs []client.Object - - storageClassName := "test-storage" - pv := &corev1.PersistentVolume{ - ObjectMeta: metav1.ObjectMeta{Name: pvName, Namespace: namespace}, - Spec: corev1.PersistentVolumeSpec{ - Capacity: corev1.ResourceList{corev1.ResourceStorage: resource.MustParse("500Mi")}, - AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, - StorageClassName: storageClassName, - PersistentVolumeSource: corev1.PersistentVolumeSource{ - Local: &corev1.LocalVolumeSource{ - Path: "/var", - }, - }, - NodeAffinity: &corev1.VolumeNodeAffinity{ - Required: &corev1.NodeSelector{ - NodeSelectorTerms: []corev1.NodeSelectorTerm{ - { - MatchExpressions: []corev1.NodeSelectorRequirement{ - { - Key: "kubernetes.io/os", - Operator: corev1.NodeSelectorOpIn, - Values: []string{"linux"}, - }, - }, - }, - }, - }, - }, - }, - } - - pvc := &corev1.PersistentVolumeClaim{ - ObjectMeta: metav1.ObjectMeta{Name: pvcName, Namespace: namespace}, - Spec: corev1.PersistentVolumeClaimSpec{ - StorageClassName: &storageClassName, - AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, - Resources: corev1.VolumeResourceRequirements{ - Requests: corev1.ResourceList{corev1.ResourceStorage: resource.MustParse("200Mi")}, - }, - }, - } - - podMountingPVC := &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{Name: podMountingPVCName, Namespace: namespace}, - Spec: corev1.PodSpec{ - Volumes: []corev1.Volume{ - { - Name: "pvc-volume", - VolumeSource: corev1.VolumeSource{ - PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ - ClaimName: pvcName, - }, - }, - }, - }, - Containers: []corev1.Container{ - { - Name: "test-container", - Image: "nginx:latest", - VolumeMounts: []corev1.VolumeMount{ - { - MountPath: "/mnt", - Name: "pvc-volume", - }, - }, - }, - }, - }, - } - - // create a pod mounting an emptyDir volume to ensure only metrics for PVC volumes are delivered - podMountingEmptyDir := &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{Name: podMountingEmptyDirName, Namespace: namespace}, - Spec: corev1.PodSpec{ - Volumes: []corev1.Volume{ - { - Name: "emptydir-volume", - VolumeSource: corev1.VolumeSource{ - EmptyDir: &corev1.EmptyDirVolumeSource{}, - }, - }, - }, - Containers: []corev1.Container{ - { - Name: "test-container", - Image: "nginx:latest", - VolumeMounts: []corev1.VolumeMount{ - { - MountPath: "/mnt", - Name: "emptydir-volume", - }, - }, - }, - }, - }, - } - - objs = append(objs, pv, pvc, podMountingPVC, podMountingEmptyDir) - - return objs -} - -// Check for `ContainElements` for metrics present in the backend -func backendContainsMetricsDeliveredForResource(proxyClient *apiserverproxy.Client, backendExportURL string, resourceMetrics []string) { - Eventually(func(g Gomega) { - resp, err := proxyClient.Get(backendExportURL) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) - defer resp.Body.Close() - - g.Expect(resp).To(HaveHTTPBody( - HaveFlatMetrics(HaveUniqueNamesForRuntimeScope(ContainElements(resourceMetrics))), - )) - }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), "Failed to find metrics using ContainElements %v", resourceMetrics) -} - -func backendContainsDesiredResourceAttributes(proxyClient *apiserverproxy.Client, backendExportURL string, metricName string, resourceAttributes []string) { - Eventually(func(g Gomega) { - resp, err := proxyClient.Get(backendExportURL) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) - defer resp.Body.Close() - - g.Expect(resp).To(HaveHTTPBody(HaveFlatMetrics( - ContainElement(SatisfyAll( - HaveName(Equal(metricName)), - HaveResourceAttributes(HaveKeys(ConsistOf(resourceAttributes))), - )), - ))) - }, 3*periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), "Failed to find metric %s with resource attributes %v", metricName, resourceAttributes) -} - -func backendContainsDesiredMetricAttributes(proxyClient *apiserverproxy.Client, backendExportURL string, metricName string, metricAttributes []string) { - Eventually(func(g Gomega) { - resp, err := proxyClient.Get(backendExportURL) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) - defer resp.Body.Close() - - g.Expect(resp).To(HaveHTTPBody(HaveFlatMetrics( - ContainElement(SatisfyAll( - HaveName(Equal(metricName)), - HaveMetricAttributes(HaveKeys(ConsistOf(metricAttributes))), - )), - ))) - }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), "Failed to find metric %s with metric attributes %v", metricName, metricAttributes) -} - -// Check with `ConsistsOf` for metrics present in the backend -func backendConsistsOfMetricsDeliveredForResource(proxyClient *apiserverproxy.Client, backendExportURL string, resourceMetrics []string) { - Eventually(func(g Gomega) { - resp, err := proxyClient.Get(backendExportURL) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) - defer resp.Body.Close() - - g.Expect(resp).To(HaveHTTPBody( - HaveFlatMetrics(HaveUniqueNamesForRuntimeScope(ConsistOf(resourceMetrics))), - )) - }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), "Failed to find metrics using consistsOf %v", resourceMetrics) -} diff --git a/test/e2e/metrics_runtime_input_test.go b/test/e2e/metrics_runtime_input_test.go index 9596125e7..96e5ef875 100644 --- a/test/e2e/metrics_runtime_input_test.go +++ b/test/e2e/metrics_runtime_input_test.go @@ -3,65 +3,153 @@ package e2e import ( - "io" "net/http" + "slices" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" networkingv1 "k8s.io/api/networking/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" - . "github.com/kyma-project/telemetry-manager/internal/otelcollector/config/metric" + "github.com/kyma-project/telemetry-manager/internal/otelcollector/config/metric" "github.com/kyma-project/telemetry-manager/internal/otelcollector/ports" testutils "github.com/kyma-project/telemetry-manager/internal/utils/test" + "github.com/kyma-project/telemetry-manager/test/testkit/apiserverproxy" "github.com/kyma-project/telemetry-manager/test/testkit/assert" kitk8s "github.com/kyma-project/telemetry-manager/test/testkit/k8s" kitkyma "github.com/kyma-project/telemetry-manager/test/testkit/kyma" . "github.com/kyma-project/telemetry-manager/test/testkit/matchers/metric" "github.com/kyma-project/telemetry-manager/test/testkit/metrics/runtime" "github.com/kyma-project/telemetry-manager/test/testkit/mocks/backend" + "github.com/kyma-project/telemetry-manager/test/testkit/mocks/prommetricgen" + "github.com/kyma-project/telemetry-manager/test/testkit/mocks/telemetrygen" "github.com/kyma-project/telemetry-manager/test/testkit/periodic" "github.com/kyma-project/telemetry-manager/test/testkit/suite" ) var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label(suite.LabelSetA), Ordered, func() { - var ( - mockNs = suite.ID() - pipelineName = suite.ID() - backendExportURL string - ) - - makeResources := func() []client.Object { - var objs []client.Object - objs = append(objs, kitk8s.NewNamespace(mockNs).K8sObject()) - - backend := backend.New(mockNs, backend.SignalTypeMetrics) - objs = append(objs, backend.K8sObjects()...) - backendExportURL = backend.ExportURL(proxyClient) - - metricPipeline := testutils.NewMetricPipelineBuilder(). - WithName(pipelineName). - WithRuntimeInput(true). - WithOTLPOutput(testutils.OTLPEndpoint(backend.Endpoint())). - Build() - objs = append(objs, &metricPipeline) - - return objs - } + Context("When metric pipelines with runtime resources metrics enabled exist", Ordered, func() { + var ( + mockNs = suite.ID() + + backendResourceMetricsEnabledNameA = suite.IDWithSuffix("resource-metrics-a") + pipelineResourceMetricsEnabledNameA = suite.IDWithSuffix("resource-metrics-a") + backendResourceMetricsEnabledURLA string + + backendResourceMetricsEnabledNameB = suite.IDWithSuffix("resource-metrics-b") + pipelineResourceMetricsEnabledNameB = suite.IDWithSuffix("resource-metrics-b") + backendResourceMetricsEnabledURLB string + + backendResourceMetricsEnabledNameC = suite.IDWithSuffix("resource-metrics-c") + pipelineResourceMetricsEnabledNameC = suite.IDWithSuffix("resource-metrics-c") + backendResourceMetricsEnabledURLC string + + DeploymentName = suite.IDWithSuffix("deployment") + StatefulSetName = suite.IDWithSuffix("stateful-set") + DaemonSetName = suite.IDWithSuffix("daemon-set") + JobName = suite.IDWithSuffix("job") + + pvName = suite.IDWithSuffix("pv") + pvcName = suite.IDWithSuffix("pvc") + podMountingPVCName = suite.IDWithSuffix("pod-with-pvc") + podMountingEmptyDirName = suite.IDWithSuffix("pod-with-emptydir") + ) + + makeResources := func() []client.Object { + var objs []client.Object + objs = append(objs, kitk8s.NewNamespace(mockNs).K8sObject()) + + // PipelineA should deliver only pod, container, volume and node metrics + // PipelineB should deliver only deployment, daemonset, statefulset and job metrics + // PipelineC should deliver default resource metrics (currently all resource metrics are enabled by default) + + backendResourceMetricsEnabledA := backend.New(mockNs, backend.SignalTypeMetrics, backend.WithName(backendResourceMetricsEnabledNameA)) + objs = append(objs, backendResourceMetricsEnabledA.K8sObjects()...) + backendResourceMetricsEnabledURLA = backendResourceMetricsEnabledA.ExportURL(proxyClient) + + pipelineResourceMetricsEnabledA := testutils.NewMetricPipelineBuilder(). + WithName(pipelineResourceMetricsEnabledNameA). + WithRuntimeInput(true). + WithRuntimeInputContainerMetrics(true). + WithRuntimeInputPodMetrics(true). + WithRuntimeInputNodeMetrics(true). + WithRuntimeInputVolumeMetrics(true). + WithRuntimeInputDeploymentMetrics(false). + WithRuntimeInputStatefulSetMetrics(false). + WithRuntimeInputDaemonSetMetrics(false). + WithRuntimeInputJobMetrics(false). + WithOTLPOutput(testutils.OTLPEndpoint(backendResourceMetricsEnabledA.Endpoint())). + Build() + objs = append(objs, &pipelineResourceMetricsEnabledA) + + backendResourceMetricsEnabledB := backend.New(mockNs, backend.SignalTypeMetrics, backend.WithName(backendResourceMetricsEnabledNameB)) + objs = append(objs, backendResourceMetricsEnabledB.K8sObjects()...) + backendResourceMetricsEnabledURLB = backendResourceMetricsEnabledB.ExportURL(proxyClient) + + pipelineResourceMetricsEnabledB := testutils.NewMetricPipelineBuilder(). + WithName(pipelineResourceMetricsEnabledNameB). + WithRuntimeInput(true). + WithRuntimeInputPodMetrics(false). + WithRuntimeInputContainerMetrics(false). + WithRuntimeInputNodeMetrics(false). + WithRuntimeInputVolumeMetrics(false). + WithRuntimeInputDeploymentMetrics(true). + WithRuntimeInputStatefulSetMetrics(true). + WithRuntimeInputDaemonSetMetrics(true). + WithRuntimeInputJobMetrics(true). + WithOTLPOutput(testutils.OTLPEndpoint(backendResourceMetricsEnabledB.Endpoint())). + Build() + objs = append(objs, &pipelineResourceMetricsEnabledB) + + backendResourceMetricsEnabledC := backend.New(mockNs, backend.SignalTypeMetrics, backend.WithName(backendResourceMetricsEnabledNameC)) + objs = append(objs, backendResourceMetricsEnabledC.K8sObjects()...) + backendResourceMetricsEnabledURLC = backendResourceMetricsEnabledC.ExportURL(proxyClient) + pipelineResourceMetricsEnabledC := testutils.NewMetricPipelineBuilder(). + WithName(pipelineResourceMetricsEnabledNameC). + WithRuntimeInput(true). + WithOTLPOutput(testutils.OTLPEndpoint(backendResourceMetricsEnabledC.Endpoint())). + Build() + objs = append(objs, &pipelineResourceMetricsEnabledC) + + metricProducer := prommetricgen.New(mockNs) + + objs = append(objs, []client.Object{ + metricProducer.Pod().WithPrometheusAnnotations(prommetricgen.SchemeHTTP).K8sObject(), + metricProducer.Service().WithPrometheusAnnotations(prommetricgen.SchemeHTTP).K8sObject(), + }...) + + podSpec := telemetrygen.PodSpec(telemetrygen.SignalTypeMetrics) + + objs = append(objs, []client.Object{ + kitk8s.NewDeployment(DeploymentName, mockNs).WithPodSpec(podSpec).WithLabel("name", DeploymentName).K8sObject(), + kitk8s.NewStatefulSet(StatefulSetName, mockNs).WithPodSpec(podSpec).WithLabel("name", StatefulSetName).K8sObject(), + kitk8s.NewDaemonSet(DaemonSetName, mockNs).WithPodSpec(podSpec).WithLabel("name", DaemonSetName).K8sObject(), + kitk8s.NewJob(JobName, mockNs).WithPodSpec(podSpec).WithLabel("name", JobName).K8sObject(), + }...) + + objs = append(objs, createPodsWithVolume(pvName, pvcName, podMountingPVCName, podMountingEmptyDirName, mockNs)...) + + return objs + } - Context("When a metricpipeline with Runtime input exists", Ordered, func() { BeforeAll(func() { k8sObjects := makeResources() DeferCleanup(func() { Expect(kitk8s.DeleteObjects(ctx, k8sClient, k8sObjects...)).Should(Succeed()) }) - Expect(kitk8s.CreateObjects(ctx, k8sClient, k8sObjects...)).Should(Succeed()) }) + It("Should have healthy pipelines", func() { + assert.MetricPipelineHealthy(ctx, k8sClient, pipelineResourceMetricsEnabledNameA) + assert.MetricPipelineHealthy(ctx, k8sClient, pipelineResourceMetricsEnabledNameB) + }) + It("Ensures the metric gateway deployment is ready", func() { assert.DeploymentReady(ctx, k8sClient, kitkyma.MetricGatewayName) }) @@ -70,9 +158,24 @@ var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label(suite.LabelSetA), assert.DaemonSetReady(ctx, k8sClient, kitkyma.MetricAgentName) }) - It("Ensures the metrics backend is ready", func() { - assert.DeploymentReady(ctx, k8sClient, types.NamespacedName{Name: backend.DefaultName, Namespace: mockNs}) - assert.ServiceReady(ctx, k8sClient, types.NamespacedName{Name: backend.DefaultName, Namespace: mockNs}) + It("Should have metrics backends running", func() { + assert.DeploymentReady(ctx, k8sClient, types.NamespacedName{Name: backendResourceMetricsEnabledNameA, Namespace: mockNs}) + assert.DeploymentReady(ctx, k8sClient, types.NamespacedName{Name: backendResourceMetricsEnabledNameB, Namespace: mockNs}) + assert.ServiceReady(ctx, k8sClient, types.NamespacedName{Name: backendResourceMetricsEnabledNameA, Namespace: mockNs}) + assert.ServiceReady(ctx, k8sClient, types.NamespacedName{Name: backendResourceMetricsEnabledNameB, Namespace: mockNs}) + + }) + + It("should have workloads created properly", func() { + assert.DeploymentReady(ctx, k8sClient, types.NamespacedName{Name: DeploymentName, Namespace: mockNs}) + assert.DaemonSetReady(ctx, k8sClient, types.NamespacedName{Name: DaemonSetName, Namespace: mockNs}) + assert.StatefulSetReady(ctx, k8sClient, types.NamespacedName{Name: StatefulSetName, Namespace: mockNs}) + assert.JobReady(ctx, k8sClient, types.NamespacedName{Name: JobName, Namespace: mockNs}) + }) + + It("Should have pods mounting volumes running", func() { + assert.PodReady(ctx, k8sClient, types.NamespacedName{Name: podMountingPVCName, Namespace: mockNs}) + assert.PodReady(ctx, k8sClient, types.NamespacedName{Name: podMountingEmptyDirName, Namespace: mockNs}) }) It("Ensures accessibility of metric agent metrics endpoint", func() { @@ -98,32 +201,272 @@ var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label(suite.LabelSetA), }, periodic.EventuallyTimeout, periodic.DefaultInterval).Should(Succeed()) }) - It("Ensures the metricpipeline is running", func() { - assert.MetricPipelineHealthy(ctx, k8sClient, pipelineName) + Context("Pipeline A should deliver pod, container, volume and node metrics", Ordered, func() { + It("Should deliver pod metrics with expected resource attributes and metric attributes", func() { + backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, runtime.PodMetricsNames) + backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "k8s.pod.cpu.time", runtime.PodMetricsResourceAttributes) + + podNetworkErrorsMetric := "k8s.pod.network.errors" + backendContainsDesiredMetricAttributes(proxyClient, backendResourceMetricsEnabledURLA, podNetworkErrorsMetric, runtime.PodMetricsAttributes[podNetworkErrorsMetric]) + + podNetworkIOMetric := "k8s.pod.network.io" + backendContainsDesiredMetricAttributes(proxyClient, backendResourceMetricsEnabledURLA, podNetworkIOMetric, runtime.PodMetricsAttributes[podNetworkIOMetric]) + + }) + + It("Should deliver container metrics with expected resource attributes", func() { + backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, runtime.ContainerMetricsNames) + backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "container.cpu.time", runtime.ContainerMetricsResourceAttributes) + }) + + It("Should deliver volume metrics with expected resource attributes", func() { + backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, runtime.VolumeMetricsNames) + backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "k8s.volume.capacity", runtime.VolumeMetricsResourceAttributes) + }) + + It("Should filter volume metrics only for PVC volumes", func() { + Consistently(func(g Gomega) { + resp, err := proxyClient.Get(backendResourceMetricsEnabledURLA) + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) + + g.Expect(resp).To(HaveHTTPBody( + HaveFlatMetrics(Not(ContainElement(HaveResourceAttributes(HaveKeyWithValue("k8s.volume.type", "emptyDir"))))), + )) + }, periodic.TelemetryConsistentlyTimeout, periodic.TelemetryInterval).Should(Succeed()) + }) + + It("Should deliver node metrics with expected resource attributes", func() { + backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, runtime.NodeMetricsNames) + backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "k8s.node.cpu.usage", runtime.NodeMetricsResourceAttributes) + }) + + It("Should have exactly metrics only for pods, containers, volumes and nodes delivered", func() { + exportedMetrics := slices.Concat(runtime.PodMetricsNames, runtime.ContainerMetricsNames, runtime.VolumeMetricsNames, runtime.NodeMetricsNames) + backendConsistsOfMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, exportedMetrics) + }) }) - It("Ensures default runtime metrics are sent to backend", func() { - Eventually(func(g Gomega) { - resp, err := proxyClient.Get(backendExportURL) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) - // By default, pod and container metrics are enabled for the runtime input + Context("Pipeline B should deliver deployment, daemonset, statefulset and job metrics", Ordered, func() { + It("should deliver deployment metrics with expected resource attributes", func() { + backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLB, runtime.DeploymentMetricsNames) + backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLB, "k8s.deployment.available", runtime.DeploymentResourceAttributes) + }) - bodyContent, err := io.ReadAll(resp.Body) - defer resp.Body.Close() - g.Expect(err).NotTo(HaveOccurred()) + It("should deliver daemonset metrics with expected resource attributes", func() { + backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLB, runtime.DaemonSetMetricsNames) + backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLB, "k8s.daemonset.current_scheduled_nodes", runtime.DaemonSetResourceAttributes) + }) + + It("should deliver statefulset metrics with expected resource attributes", func() { + backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLB, runtime.StatefulSetMetricsNames) + backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLB, "k8s.statefulset.current_pods", runtime.StatefulSetResourceAttributes) + }) + + It("should deliver job metrics with expected resource attributes", func() { + backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLB, runtime.JobsMetricsNames) + backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLB, "k8s.job.active_pods", runtime.JobResourceAttributes) + }) - g.Expect(bodyContent).To(HaveFlatMetrics( - ContainElement(SatisfyAll( - HaveName(BeElementOf(runtime.DefaultMetricsNames)), - HaveScopeName(ContainSubstring(InstrumentationScopeRuntime)), - )), - )) - }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed()) + It("should have exactly metrics only for deployment, daemonset, statefuleset, job delivered", func() { + expectedMetrics := slices.Concat(runtime.DeploymentMetricsNames, runtime.DaemonSetMetricsNames, runtime.StatefulSetMetricsNames, runtime.JobsMetricsNames) + backendConsistsOfMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLB, expectedMetrics) + }) }) - It("Ensures runtime metrics from system namespaces are not sent to backend", func() { - assert.MetricsWithScopeAndNamespaceNotDelivered(proxyClient, backendExportURL, InstrumentationScopeRuntime, kitkyma.SystemNamespaceName) + Context("Pipeline C should deliver default resource metrics", Ordered, func() { + It("Should deliver default resource metrics (pod, container, volume, node, deployment, daemonset, statefulset and job metrics)", func() { + backendConsistsOfMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLC, runtime.DefaultMetricsNames) + }) + + It("Ensures runtime metrics have expected scope name and scope version", func() { + Eventually(func(g Gomega) { + resp, err := proxyClient.Get(backendResourceMetricsEnabledURLC) + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) + + g.Expect(resp).To(HaveHTTPBody(HaveFlatMetrics( + ContainElement(SatisfyAll( + HaveName(BeElementOf(runtime.DefaultMetricsNames)), + HaveScopeName(Equal(metric.InstrumentationScopeRuntime)), + HaveScopeVersion(SatisfyAny( + Equal("main"), + MatchRegexp("[0-9]+.[0-9]+.[0-9]+"), + )), + )), + ))) + }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed()) + }) + + It("Ensures runtime metrics from system namespaces are not sent to backend", func() { + assert.MetricsWithScopeAndNamespaceNotDelivered(proxyClient, backendResourceMetricsEnabledURLC, metric.InstrumentationScopeRuntime, kitkyma.SystemNamespaceName) + }) + }) }) + }) + +func createPodsWithVolume(pvName, pvcName, podMountingPVCName, podMountingEmptyDirName, namespace string) []client.Object { + var objs []client.Object + + storageClassName := "test-storage" + pv := &corev1.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{Name: pvName, Namespace: namespace}, + Spec: corev1.PersistentVolumeSpec{ + Capacity: corev1.ResourceList{corev1.ResourceStorage: resource.MustParse("500Mi")}, + AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, + StorageClassName: storageClassName, + PersistentVolumeSource: corev1.PersistentVolumeSource{ + Local: &corev1.LocalVolumeSource{ + Path: "/var", + }, + }, + NodeAffinity: &corev1.VolumeNodeAffinity{ + Required: &corev1.NodeSelector{ + NodeSelectorTerms: []corev1.NodeSelectorTerm{ + { + MatchExpressions: []corev1.NodeSelectorRequirement{ + { + Key: "kubernetes.io/os", + Operator: corev1.NodeSelectorOpIn, + Values: []string{"linux"}, + }, + }, + }, + }, + }, + }, + }, + } + + pvc := &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{Name: pvcName, Namespace: namespace}, + Spec: corev1.PersistentVolumeClaimSpec{ + StorageClassName: &storageClassName, + AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, + Resources: corev1.VolumeResourceRequirements{ + Requests: corev1.ResourceList{corev1.ResourceStorage: resource.MustParse("200Mi")}, + }, + }, + } + + podMountingPVC := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: podMountingPVCName, Namespace: namespace}, + Spec: corev1.PodSpec{ + Volumes: []corev1.Volume{ + { + Name: "pvc-volume", + VolumeSource: corev1.VolumeSource{ + PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ + ClaimName: pvcName, + }, + }, + }, + }, + Containers: []corev1.Container{ + { + Name: "test-container", + Image: "nginx:latest", + VolumeMounts: []corev1.VolumeMount{ + { + MountPath: "/mnt", + Name: "pvc-volume", + }, + }, + }, + }, + }, + } + + // create a pod mounting an emptyDir volume to ensure only metrics for PVC volumes are delivered + podMountingEmptyDir := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: podMountingEmptyDirName, Namespace: namespace}, + Spec: corev1.PodSpec{ + Volumes: []corev1.Volume{ + { + Name: "emptydir-volume", + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }, + Containers: []corev1.Container{ + { + Name: "test-container", + Image: "nginx:latest", + VolumeMounts: []corev1.VolumeMount{ + { + MountPath: "/mnt", + Name: "emptydir-volume", + }, + }, + }, + }, + }, + } + + objs = append(objs, pv, pvc, podMountingPVC, podMountingEmptyDir) + + return objs +} + +// Check for `ContainElements` for metrics present in the backend +func backendContainsMetricsDeliveredForResource(proxyClient *apiserverproxy.Client, backendExportURL string, resourceMetrics []string) { + Eventually(func(g Gomega) { + resp, err := proxyClient.Get(backendExportURL) + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) + defer resp.Body.Close() + + g.Expect(resp).To(HaveHTTPBody( + HaveFlatMetrics(HaveUniqueNamesForRuntimeScope(ContainElements(resourceMetrics))), + )) + }, 2*periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), "Failed to find metrics using ContainElements %v", resourceMetrics) +} + +// Check with `ConsistsOf` for metrics present in the backend +func backendConsistsOfMetricsDeliveredForResource(proxyClient *apiserverproxy.Client, backendExportURL string, resourceMetrics []string) { + Eventually(func(g Gomega) { + resp, err := proxyClient.Get(backendExportURL) + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) + defer resp.Body.Close() + + g.Expect(resp).To(HaveHTTPBody( + HaveFlatMetrics(HaveUniqueNamesForRuntimeScope(ConsistOf(resourceMetrics))), + )) + }, 2*periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), "Failed to find metrics using consistsOf %v", resourceMetrics) +} + +func backendContainsDesiredResourceAttributes(proxyClient *apiserverproxy.Client, backendExportURL string, metricName string, resourceAttributes []string) { + Eventually(func(g Gomega) { + resp, err := proxyClient.Get(backendExportURL) + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) + defer resp.Body.Close() + + g.Expect(resp).To(HaveHTTPBody(HaveFlatMetrics( + ContainElement(SatisfyAll( + HaveName(Equal(metricName)), + HaveResourceAttributes(HaveKeys(ConsistOf(resourceAttributes))), + )), + ))) + }, 3*periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), "Failed to find metric %s with resource attributes %v", metricName, resourceAttributes) +} + +func backendContainsDesiredMetricAttributes(proxyClient *apiserverproxy.Client, backendExportURL string, metricName string, metricAttributes []string) { + Eventually(func(g Gomega) { + resp, err := proxyClient.Get(backendExportURL) + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) + defer resp.Body.Close() + + g.Expect(resp).To(HaveHTTPBody(HaveFlatMetrics( + ContainElement(SatisfyAll( + HaveName(Equal(metricName)), + HaveMetricAttributes(HaveKeys(ConsistOf(metricAttributes))), + )), + ))) + }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), "Failed to find metric %s with metric attributes %v", metricName, metricAttributes) +} diff --git a/test/testkit/metrics/runtime/default.go b/test/testkit/metrics/runtime/default.go index b0feaa299..3a4a9bb19 100644 --- a/test/testkit/metrics/runtime/default.go +++ b/test/testkit/metrics/runtime/default.go @@ -2,4 +2,13 @@ package runtime import "slices" -var DefaultMetricsNames = slices.Concat(ContainerMetricsNames, PodMetricsNames) +var DefaultMetricsNames = slices.Concat( + ContainerMetricsNames, + PodMetricsNames, + VolumeMetricsNames, + NodeMetricsNames, + DeploymentMetricsNames, + DaemonSetMetricsNames, + StatefulSetMetricsNames, + JobsMetricsNames, +)