From 92bb30e8fb708fb9e7cb9094234ed0e192eb8874 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Tue, 21 Jan 2025 13:28:51 +0100 Subject: [PATCH 01/29] add cloud provider attributes to the gateways, initial commit --- config/rbac/role.yaml | 1 + .../config/gatewayprocs/k8s_attribute_proc.go | 10 ++++++++++ .../config/gatewayprocs/k8s_attribute_proc_test.go | 10 ++++++++++ .../config/gatewayprocs/resource_procs.go | 9 +++++++-- .../config/gatewayprocs/resource_procs_test.go | 9 +++++++-- internal/otelcollector/config/log/gateway/config.go | 6 +++--- .../otelcollector/config/log/gateway/processors.go | 4 ++-- .../config/log/gateway/processors_test.go | 13 ++++++++----- .../config/log/gateway/testdata/config.yaml | 13 +++++++++++-- .../otelcollector/config/metric/gateway/config.go | 2 +- .../config/metric/gateway/processors.go | 2 +- .../config/metric/gateway/processors_test.go | 13 ++++++++----- .../config/metric/gateway/testdata/config.yaml | 13 +++++++++++-- .../gateway/testdata/config_otlp_disabled.yaml | 13 +++++++++++-- .../otelcollector/config/trace/gateway/config.go | 10 +++++----- .../config/trace/gateway/processors.go | 10 +++++----- .../config/trace/gateway/processors_test.go | 13 ++++++++----- .../config/trace/gateway/testdata/config.yaml | 13 +++++++++++-- 18 files changed, 120 insertions(+), 44 deletions(-) diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index bcd7d2dcb..af13aa4db 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -219,6 +219,7 @@ rules: resources: - namespaces - pods + - nodes verbs: - get - list diff --git a/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc.go b/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc.go index 79ab0591f..842e29d53 100644 --- a/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc.go +++ b/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc.go @@ -51,5 +51,15 @@ func extractLabels() []config.ExtractLabel { Key: "app", TagName: "kyma.app_name", }, + { + From: "node", + Key: "topology.kubernetes.io/region", + TagName: "cloud.region", + }, + { + From: "node", + Key: "topology.kubernetes.io/zone", + TagName: "cloud.availability_zone", + }, } } diff --git a/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc_test.go b/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc_test.go index a4a5e2e91..f4d3fe321 100644 --- a/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc_test.go +++ b/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc_test.go @@ -43,6 +43,16 @@ func TestK8sAttributesProcessorConfig(t *testing.T) { Key: "app", TagName: "kyma.app_name", }, + { + From: "node", + Key: "topology.kubernetes.io/region", + TagName: "cloud.region", + }, + { + From: "node", + Key: "topology.kubernetes.io/zone", + TagName: "cloud.availability_zone", + }, } config := K8sAttributesProcessorConfig() diff --git a/internal/otelcollector/config/gatewayprocs/resource_procs.go b/internal/otelcollector/config/gatewayprocs/resource_procs.go index 15424ab52..aac1e6278 100644 --- a/internal/otelcollector/config/gatewayprocs/resource_procs.go +++ b/internal/otelcollector/config/gatewayprocs/resource_procs.go @@ -4,13 +4,18 @@ import ( "github.com/kyma-project/telemetry-manager/internal/otelcollector/config" ) -func InsertClusterNameProcessorConfig() *config.ResourceProcessor { +func InsertClusterAttributesProcessorConfig() *config.ResourceProcessor { return &config.ResourceProcessor{ Attributes: []config.AttributeAction{ { Action: "insert", Key: "k8s.cluster.name", - Value: "${KUBERNETES_SERVICE_HOST}", + Value: "${CLUSTER_NAME}", + }, + { + Action: "insert", + Key: "cloud.provider", + Value: "${CLOUD_PROVIDER}", }, }, } diff --git a/internal/otelcollector/config/gatewayprocs/resource_procs_test.go b/internal/otelcollector/config/gatewayprocs/resource_procs_test.go index 61db91218..f33de5cc3 100644 --- a/internal/otelcollector/config/gatewayprocs/resource_procs_test.go +++ b/internal/otelcollector/config/gatewayprocs/resource_procs_test.go @@ -15,11 +15,16 @@ func TestInsertClusterNameProcessorConfig(t *testing.T) { { Action: "insert", Key: "k8s.cluster.name", - Value: "${KUBERNETES_SERVICE_HOST}", + Value: "${CLUSTER_NAME}", + }, + { + Action: "insert", + Key: "cloud.provider", + Value: "${CLOUD_PROVIDER}", }, } - config := InsertClusterNameProcessorConfig() + config := InsertClusterAttributesProcessorConfig() require.ElementsMatch(expectedAttributeActions, config.Attributes, "Attributes should match") } diff --git a/internal/otelcollector/config/log/gateway/config.go b/internal/otelcollector/config/log/gateway/config.go index 654097e99..91159be7b 100644 --- a/internal/otelcollector/config/log/gateway/config.go +++ b/internal/otelcollector/config/log/gateway/config.go @@ -19,9 +19,9 @@ type Receivers struct { type Processors struct { config.BaseProcessors `yaml:",inline"` - K8sAttributes *config.K8sAttributesProcessor `yaml:"k8sattributes,omitempty"` - InsertClusterName *config.ResourceProcessor `yaml:"resource/insert-cluster-name,omitempty"` - DropKymaAttributes *config.ResourceProcessor `yaml:"resource/drop-kyma-attributes,omitempty"` + K8sAttributes *config.K8sAttributesProcessor `yaml:"k8sattributes,omitempty"` + InsertClusterAttributes *config.ResourceProcessor `yaml:"resource/insert-cluster-attributes,omitempty"` + DropKymaAttributes *config.ResourceProcessor `yaml:"resource/drop-kyma-attributes,omitempty"` } type Exporters map[string]Exporter diff --git a/internal/otelcollector/config/log/gateway/processors.go b/internal/otelcollector/config/log/gateway/processors.go index 661926441..bb350487a 100644 --- a/internal/otelcollector/config/log/gateway/processors.go +++ b/internal/otelcollector/config/log/gateway/processors.go @@ -11,8 +11,8 @@ func makeProcessorsConfig() Processors { Batch: makeBatchProcessorConfig(), MemoryLimiter: makeMemoryLimiterConfig(), }, - K8sAttributes: gatewayprocs.K8sAttributesProcessorConfig(), - InsertClusterName: gatewayprocs.InsertClusterNameProcessorConfig(), + K8sAttributes: gatewayprocs.K8sAttributesProcessorConfig(), + InsertClusterAttributes: gatewayprocs.InsertClusterAttributesProcessorConfig(), } } diff --git a/internal/otelcollector/config/log/gateway/processors_test.go b/internal/otelcollector/config/log/gateway/processors_test.go index fbcf0ab05..d845cce1e 100644 --- a/internal/otelcollector/config/log/gateway/processors_test.go +++ b/internal/otelcollector/config/log/gateway/processors_test.go @@ -16,14 +16,17 @@ func TestProcessors(t *testing.T) { fakeClient := fake.NewClientBuilder().Build() sut := Builder{Reader: fakeClient} - t.Run("insert cluster name processor", func(t *testing.T) { + t.Run("insert cluster attributes processor", func(t *testing.T) { collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}) require.NoError(t, err) - require.Equal(t, 1, len(collectorConfig.Processors.InsertClusterName.Attributes)) - require.Equal(t, "insert", collectorConfig.Processors.InsertClusterName.Attributes[0].Action) - require.Equal(t, "k8s.cluster.name", collectorConfig.Processors.InsertClusterName.Attributes[0].Key) - require.Equal(t, "${KUBERNETES_SERVICE_HOST}", collectorConfig.Processors.InsertClusterName.Attributes[0].Value) + require.Equal(t, 2, len(collectorConfig.Processors.InsertClusterAttributes.Attributes)) + require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Action) + require.Equal(t, "k8s.cluster.name", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Key) + require.Equal(t, "${CLUSTER_NAME}", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Value) + require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Action) + require.Equal(t, "cloud.provider", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Key) + require.Equal(t, "${CLOUD_PROVIDER}", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Value) }) t.Run("memory limit processors", func(t *testing.T) { diff --git a/internal/otelcollector/config/log/gateway/testdata/config.yaml b/internal/otelcollector/config/log/gateway/testdata/config.yaml index db675e4f3..f069a41e5 100644 --- a/internal/otelcollector/config/log/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/log/gateway/testdata/config.yaml @@ -65,6 +65,12 @@ processors: - from: pod key: app tag_name: kyma.app_name + - from: node + key: topology.kubernetes.io/region + tag_name: cloud.region + - from: node + key: topology.kubernetes.io/zone + tag_name: cloud.availability_zone pod_association: - sources: - from: resource_attribute @@ -74,11 +80,14 @@ processors: name: k8s.pod.uid - sources: - from: connection - resource/insert-cluster-name: + resource/insert-cluster-attributes: attributes: - action: insert key: k8s.cluster.name - value: ${KUBERNETES_SERVICE_HOST} + value: ${CLUSTER_NAME} + - action: insert + key: cloud.provider + value: ${CLOUD_PROVIDER} exporters: otlp/test: endpoint: ${OTLP_ENDPOINT_TEST} diff --git a/internal/otelcollector/config/metric/gateway/config.go b/internal/otelcollector/config/metric/gateway/config.go index d6d25c56e..91a1f71a6 100644 --- a/internal/otelcollector/config/metric/gateway/config.go +++ b/internal/otelcollector/config/metric/gateway/config.go @@ -49,7 +49,7 @@ type Processors struct { config.BaseProcessors `yaml:",inline"` K8sAttributes *config.K8sAttributesProcessor `yaml:"k8sattributes,omitempty"` - InsertClusterName *config.ResourceProcessor `yaml:"resource/insert-cluster-name,omitempty"` + InsertClusterAttributes *config.ResourceProcessor `yaml:"resource/insert-cluster-attributes,omitempty"` DropDiagnosticMetricsIfInputSourcePrometheus *FilterProcessor `yaml:"filter/drop-diagnostic-metrics-if-input-source-prometheus,omitempty"` DropDiagnosticMetricsIfInputSourceIstio *FilterProcessor `yaml:"filter/drop-diagnostic-metrics-if-input-source-istio,omitempty"` DropIfInputSourceRuntime *FilterProcessor `yaml:"filter/drop-if-input-source-runtime,omitempty"` diff --git a/internal/otelcollector/config/metric/gateway/processors.go b/internal/otelcollector/config/metric/gateway/processors.go index 39d5178cd..c69f23f35 100644 --- a/internal/otelcollector/config/metric/gateway/processors.go +++ b/internal/otelcollector/config/metric/gateway/processors.go @@ -17,7 +17,7 @@ func makeProcessorsConfig() Processors { MemoryLimiter: makeMemoryLimiterConfig(), }, K8sAttributes: gatewayprocs.K8sAttributesProcessorConfig(), - InsertClusterName: gatewayprocs.InsertClusterNameProcessorConfig(), + InsertClusterAttributes: gatewayprocs.InsertClusterAttributesProcessorConfig(), ResolveServiceName: makeResolveServiceNameConfig(), DropKymaAttributes: gatewayprocs.DropKymaAttributesProcessorConfig(), DeleteSkipEnrichmentAttribute: makeDeleteSkipEnrichmentAttributeConfig(), diff --git a/internal/otelcollector/config/metric/gateway/processors_test.go b/internal/otelcollector/config/metric/gateway/processors_test.go index 5635e4bc8..6c297eb4d 100644 --- a/internal/otelcollector/config/metric/gateway/processors_test.go +++ b/internal/otelcollector/config/metric/gateway/processors_test.go @@ -16,7 +16,7 @@ func TestProcessors(t *testing.T) { fakeClient := fake.NewClientBuilder().Build() sut := Builder{Reader: fakeClient} - t.Run("insert cluster name processor", func(t *testing.T) { + t.Run("insert cluster attributes processor", func(t *testing.T) { collectorConfig, _, err := sut.Build( ctx, []telemetryv1alpha1.MetricPipeline{ @@ -26,10 +26,13 @@ func TestProcessors(t *testing.T) { ) require.NoError(t, err) - require.Equal(t, 1, len(collectorConfig.Processors.InsertClusterName.Attributes)) - require.Equal(t, "insert", collectorConfig.Processors.InsertClusterName.Attributes[0].Action) - require.Equal(t, "k8s.cluster.name", collectorConfig.Processors.InsertClusterName.Attributes[0].Key) - require.Equal(t, "${KUBERNETES_SERVICE_HOST}", collectorConfig.Processors.InsertClusterName.Attributes[0].Value) + require.Equal(t, 2, len(collectorConfig.Processors.InsertClusterAttributes.Attributes)) + require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Action) + require.Equal(t, "k8s.cluster.name", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Key) + require.Equal(t, "${CLUSTER_NAME}", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Value) + require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Action) + require.Equal(t, "cloud.provider", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Key) + require.Equal(t, "${CLOUD_PROVIDER}", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Value) }) t.Run("memory limit processors", func(t *testing.T) { diff --git a/internal/otelcollector/config/metric/gateway/testdata/config.yaml b/internal/otelcollector/config/metric/gateway/testdata/config.yaml index 3033c643c..6758082ea 100644 --- a/internal/otelcollector/config/metric/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/metric/gateway/testdata/config.yaml @@ -108,6 +108,12 @@ processors: - from: pod key: app tag_name: kyma.app_name + - from: node + key: topology.kubernetes.io/region + tag_name: cloud.region + - from: node + key: topology.kubernetes.io/zone + tag_name: cloud.availability_zone pod_association: - sources: - from: resource_attribute @@ -117,11 +123,14 @@ processors: name: k8s.pod.uid - sources: - from: connection - resource/insert-cluster-name: + resource/insert-cluster-attributes: attributes: - action: insert key: k8s.cluster.name - value: ${KUBERNETES_SERVICE_HOST} + value: ${CLUSTER_NAME} + - action: insert + key: cloud.provider + value: ${CLOUD_PROVIDER} filter/drop-if-input-source-runtime: metrics: metric: diff --git a/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml b/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml index de3d7dce5..fca81495a 100644 --- a/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml +++ b/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml @@ -109,6 +109,12 @@ processors: - from: pod key: app tag_name: kyma.app_name + - from: node + key: topology.kubernetes.io/region + tag_name: cloud.region + - from: node + key: topology.kubernetes.io/zone + tag_name: cloud.availability_zone pod_association: - sources: - from: resource_attribute @@ -118,11 +124,14 @@ processors: name: k8s.pod.uid - sources: - from: connection - resource/insert-cluster-name: + resource/insert-cluster-attributes: attributes: - action: insert key: k8s.cluster.name - value: ${KUBERNETES_SERVICE_HOST} + value: ${CLUSTER_NAME} + - action: insert + key: cloud.provider + value: ${CLOUD_PROVIDER} filter/drop-if-input-source-runtime: metrics: metric: diff --git a/internal/otelcollector/config/trace/gateway/config.go b/internal/otelcollector/config/trace/gateway/config.go index 02ae8c3f3..28b877b32 100644 --- a/internal/otelcollector/config/trace/gateway/config.go +++ b/internal/otelcollector/config/trace/gateway/config.go @@ -19,11 +19,11 @@ type Receivers struct { type Processors struct { config.BaseProcessors `yaml:",inline"` - K8sAttributes *config.K8sAttributesProcessor `yaml:"k8sattributes,omitempty"` - InsertClusterName *config.ResourceProcessor `yaml:"resource/insert-cluster-name,omitempty"` - DropNoisySpans FilterProcessor `yaml:"filter/drop-noisy-spans"` - ResolveServiceName *TransformProcessor `yaml:"transform/resolve-service-name,omitempty"` - DropKymaAttributes *config.ResourceProcessor `yaml:"resource/drop-kyma-attributes,omitempty"` + K8sAttributes *config.K8sAttributesProcessor `yaml:"k8sattributes,omitempty"` + InsertClusterAttributes *config.ResourceProcessor `yaml:"resource/insert-cluster-attributes,omitempty"` + DropNoisySpans FilterProcessor `yaml:"filter/drop-noisy-spans"` + ResolveServiceName *TransformProcessor `yaml:"transform/resolve-service-name,omitempty"` + DropKymaAttributes *config.ResourceProcessor `yaml:"resource/drop-kyma-attributes,omitempty"` } type FilterProcessor struct { diff --git a/internal/otelcollector/config/trace/gateway/processors.go b/internal/otelcollector/config/trace/gateway/processors.go index f43275b62..4fc1225c4 100644 --- a/internal/otelcollector/config/trace/gateway/processors.go +++ b/internal/otelcollector/config/trace/gateway/processors.go @@ -11,11 +11,11 @@ func makeProcessorsConfig() Processors { Batch: makeBatchProcessorConfig(), MemoryLimiter: makeMemoryLimiterConfig(), }, - K8sAttributes: gatewayprocs.K8sAttributesProcessorConfig(), - InsertClusterName: gatewayprocs.InsertClusterNameProcessorConfig(), - DropNoisySpans: makeDropNoisySpansConfig(), - ResolveServiceName: makeResolveServiceNameConfig(), - DropKymaAttributes: gatewayprocs.DropKymaAttributesProcessorConfig(), + K8sAttributes: gatewayprocs.K8sAttributesProcessorConfig(), + InsertClusterAttributes: gatewayprocs.InsertClusterAttributesProcessorConfig(), + DropNoisySpans: makeDropNoisySpansConfig(), + ResolveServiceName: makeResolveServiceNameConfig(), + DropKymaAttributes: gatewayprocs.DropKymaAttributesProcessorConfig(), } } diff --git a/internal/otelcollector/config/trace/gateway/processors_test.go b/internal/otelcollector/config/trace/gateway/processors_test.go index a16de357b..d4ca29bfd 100644 --- a/internal/otelcollector/config/trace/gateway/processors_test.go +++ b/internal/otelcollector/config/trace/gateway/processors_test.go @@ -16,14 +16,17 @@ func TestProcessors(t *testing.T) { fakeClient := fake.NewClientBuilder().Build() sut := Builder{Reader: fakeClient} - t.Run("insert cluster name processor", func(t *testing.T) { + t.Run("insert cluster attributes processor", func(t *testing.T) { collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}) require.NoError(t, err) - require.Equal(t, 1, len(collectorConfig.Processors.InsertClusterName.Attributes)) - require.Equal(t, "insert", collectorConfig.Processors.InsertClusterName.Attributes[0].Action) - require.Equal(t, "k8s.cluster.name", collectorConfig.Processors.InsertClusterName.Attributes[0].Key) - require.Equal(t, "${KUBERNETES_SERVICE_HOST}", collectorConfig.Processors.InsertClusterName.Attributes[0].Value) + require.Equal(t, 2, len(collectorConfig.Processors.InsertClusterAttributes.Attributes)) + require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Action) + require.Equal(t, "k8s.cluster.name", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Key) + require.Equal(t, "${CLUSTER_NAME}", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Value) + require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Action) + require.Equal(t, "cloud.provider", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Key) + require.Equal(t, "${CLOUD_PROVIDER}", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Value) }) t.Run("memory limit processors", func(t *testing.T) { diff --git a/internal/otelcollector/config/trace/gateway/testdata/config.yaml b/internal/otelcollector/config/trace/gateway/testdata/config.yaml index c9d0ce5e9..0aaf3415d 100644 --- a/internal/otelcollector/config/trace/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/trace/gateway/testdata/config.yaml @@ -68,6 +68,12 @@ processors: - from: pod key: app tag_name: kyma.app_name + - from: node + key: topology.kubernetes.io/region + tag_name: cloud.region + - from: node + key: topology.kubernetes.io/zone + tag_name: cloud.availability_zone pod_association: - sources: - from: resource_attribute @@ -77,11 +83,14 @@ processors: name: k8s.pod.uid - sources: - from: connection - resource/insert-cluster-name: + resource/insert-cluster-attributes: attributes: - action: insert key: k8s.cluster.name - value: ${KUBERNETES_SERVICE_HOST} + value: ${CLUSTER_NAME} + - action: insert + key: cloud.provider + value: ${CLOUD_PROVIDER} filter/drop-noisy-spans: traces: span: From 32651c0d640a308a10538af56ba0581c7972ce5f Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 09:24:18 +0100 Subject: [PATCH 02/29] add get gardener shoot-info getter --- .../config/gatewayprocs/resource_procs.go | 6 +- .../config/metric/gateway/config_builder.go | 4 +- .../metric/gateway/config_builder_test.go | 60 +++++++++++++++---- .../config/metric/gateway/processors.go | 4 +- .../config/metric/gateway/processors_test.go | 9 ++- .../metric/gateway/testdata/config.yaml | 4 +- .../testdata/config_otlp_disabled.yaml | 4 +- .../reconciler/metricpipeline/reconciler.go | 5 +- internal/utils/k8s/cluster_info_getter.go | 32 ++++++++++ 9 files changed, 102 insertions(+), 26 deletions(-) create mode 100644 internal/utils/k8s/cluster_info_getter.go diff --git a/internal/otelcollector/config/gatewayprocs/resource_procs.go b/internal/otelcollector/config/gatewayprocs/resource_procs.go index aac1e6278..7a7632088 100644 --- a/internal/otelcollector/config/gatewayprocs/resource_procs.go +++ b/internal/otelcollector/config/gatewayprocs/resource_procs.go @@ -4,18 +4,18 @@ import ( "github.com/kyma-project/telemetry-manager/internal/otelcollector/config" ) -func InsertClusterAttributesProcessorConfig() *config.ResourceProcessor { +func InsertClusterAttributesProcessorConfig(clusterName, cloudProvider string) *config.ResourceProcessor { return &config.ResourceProcessor{ Attributes: []config.AttributeAction{ { Action: "insert", Key: "k8s.cluster.name", - Value: "${CLUSTER_NAME}", + Value: clusterName, }, { Action: "insert", Key: "cloud.provider", - Value: "${CLOUD_PROVIDER}", + Value: cloudProvider, }, }, } diff --git a/internal/otelcollector/config/metric/gateway/config_builder.go b/internal/otelcollector/config/metric/gateway/config_builder.go index ac6841f69..954ff83a8 100644 --- a/internal/otelcollector/config/metric/gateway/config_builder.go +++ b/internal/otelcollector/config/metric/gateway/config_builder.go @@ -25,6 +25,8 @@ type Builder struct { type BuildOptions struct { GatewayNamespace string InstrumentationScopeVersion string + ClusterName string + CloudProvider string } func (b *Builder) Build(ctx context.Context, pipelines []telemetryv1alpha1.MetricPipeline, opts BuildOptions) (*Config, otlpexporter.EnvVars, error) { @@ -34,7 +36,7 @@ func (b *Builder) Build(ctx context.Context, pipelines []telemetryv1alpha1.Metri Extensions: config.DefaultExtensions(), }, Receivers: makeReceiversConfig(), - Processors: makeProcessorsConfig(), + Processors: makeProcessorsConfig(opts), Exporters: make(Exporters), Connectors: make(Connectors), } diff --git a/internal/otelcollector/config/metric/gateway/config_builder_test.go b/internal/otelcollector/config/metric/gateway/config_builder_test.go index 00abf67e3..067cb8570 100644 --- a/internal/otelcollector/config/metric/gateway/config_builder_test.go +++ b/internal/otelcollector/config/metric/gateway/config_builder_test.go @@ -29,7 +29,10 @@ func TestMakeConfig(t *testing.T) { []telemetryv1alpha1.MetricPipeline{ testutils.NewMetricPipelineBuilder().WithName("test").WithOTLPOutput(testutils.OTLPEndpoint("http://localhost")).Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) @@ -50,7 +53,10 @@ func TestMakeConfig(t *testing.T) { []telemetryv1alpha1.MetricPipeline{ testutils.NewMetricPipelineBuilder().WithName("test").WithOTLPOutput(testutils.OTLPEndpoint("https://localhost")).Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test") @@ -65,7 +71,10 @@ func TestMakeConfig(t *testing.T) { []telemetryv1alpha1.MetricPipeline{ testutils.NewMetricPipelineBuilder().WithName("test-insecure").WithOTLPOutput(testutils.OTLPEndpoint("http://localhost")).Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-insecure") @@ -80,7 +89,10 @@ func TestMakeConfig(t *testing.T) { []telemetryv1alpha1.MetricPipeline{ testutils.NewMetricPipelineBuilder().WithName("test-basic-auth").WithOTLPOutput(testutils.OTLPBasicAuth("user", "password")).Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-basic-auth") @@ -103,7 +115,10 @@ func TestMakeConfig(t *testing.T) { []telemetryv1alpha1.MetricPipeline{ testutils.NewMetricPipelineBuilder().WithName("test-custom-header").WithOTLPOutput(testutils.OTLPCustomHeader("Authorization", "TOKEN_VALUE", "Api-Token")).Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-custom-header") @@ -124,7 +139,10 @@ func TestMakeConfig(t *testing.T) { []telemetryv1alpha1.MetricPipeline{ testutils.NewMetricPipelineBuilder().WithName("test-mtls").WithOTLPOutput(testutils.OTLPClientTLSFromString("ca", "cert", "key")).Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-mtls") @@ -146,7 +164,10 @@ func TestMakeConfig(t *testing.T) { []telemetryv1alpha1.MetricPipeline{ testutils.NewMetricPipelineBuilder().Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) @@ -162,7 +183,10 @@ func TestMakeConfig(t *testing.T) { []telemetryv1alpha1.MetricPipeline{ testutils.NewMetricPipelineBuilder().Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) @@ -190,7 +214,10 @@ func TestMakeConfig(t *testing.T) { []telemetryv1alpha1.MetricPipeline{ testutils.NewMetricPipelineBuilder().WithName("test").Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) require.Equal(t, maxQueueSize, collectorConfig.Exporters["otlp/test"].OTLP.SendingQueue.QueueSize, "Pipeline should have the full queue size") @@ -204,7 +231,10 @@ func TestMakeConfig(t *testing.T) { testutils.NewMetricPipelineBuilder().WithName("test-2").Build(), testutils.NewMetricPipelineBuilder().WithName("test-3").Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) @@ -223,7 +253,10 @@ func TestMakeConfig(t *testing.T) { testutils.NewMetricPipelineBuilder().WithName("test-2").Build(), testutils.NewMetricPipelineBuilder().WithName("test-3").Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) @@ -259,7 +292,10 @@ func TestMakeConfig(t *testing.T) { WithOTLPInput(tt.withOTLPInput). WithOTLPOutput(testutils.OTLPEndpoint("https://localhost")).Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, ) require.NoError(t, err) diff --git a/internal/otelcollector/config/metric/gateway/processors.go b/internal/otelcollector/config/metric/gateway/processors.go index c69f23f35..42b73ce49 100644 --- a/internal/otelcollector/config/metric/gateway/processors.go +++ b/internal/otelcollector/config/metric/gateway/processors.go @@ -10,14 +10,14 @@ import ( "github.com/kyma-project/telemetry-manager/internal/otelcollector/config/ottlexpr" ) -func makeProcessorsConfig() Processors { +func makeProcessorsConfig(opts BuildOptions) Processors { return Processors{ BaseProcessors: config.BaseProcessors{ Batch: makeBatchProcessorConfig(), MemoryLimiter: makeMemoryLimiterConfig(), }, K8sAttributes: gatewayprocs.K8sAttributesProcessorConfig(), - InsertClusterAttributes: gatewayprocs.InsertClusterAttributesProcessorConfig(), + InsertClusterAttributes: gatewayprocs.InsertClusterAttributesProcessorConfig(opts.ClusterName, opts.CloudProvider), ResolveServiceName: makeResolveServiceNameConfig(), DropKymaAttributes: gatewayprocs.DropKymaAttributesProcessorConfig(), DeleteSkipEnrichmentAttribute: makeDeleteSkipEnrichmentAttributeConfig(), diff --git a/internal/otelcollector/config/metric/gateway/processors_test.go b/internal/otelcollector/config/metric/gateway/processors_test.go index 6c297eb4d..8fdf8fa7b 100644 --- a/internal/otelcollector/config/metric/gateway/processors_test.go +++ b/internal/otelcollector/config/metric/gateway/processors_test.go @@ -22,17 +22,20 @@ func TestProcessors(t *testing.T) { []telemetryv1alpha1.MetricPipeline{ testutils.NewMetricPipelineBuilder().Build(), }, - BuildOptions{}, + BuildOptions{ + ClusterName: "CLUSTER_NAME", + CloudProvider: "CLOUD_PROVIDER", + }, ) require.NoError(t, err) require.Equal(t, 2, len(collectorConfig.Processors.InsertClusterAttributes.Attributes)) require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Action) require.Equal(t, "k8s.cluster.name", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Key) - require.Equal(t, "${CLUSTER_NAME}", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Value) + require.Equal(t, "CLUSTER_NAME", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Value) require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Action) require.Equal(t, "cloud.provider", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Key) - require.Equal(t, "${CLOUD_PROVIDER}", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Value) + require.Equal(t, "CLOUD_PROVIDER", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Value) }) t.Run("memory limit processors", func(t *testing.T) { diff --git a/internal/otelcollector/config/metric/gateway/testdata/config.yaml b/internal/otelcollector/config/metric/gateway/testdata/config.yaml index 6758082ea..15e4fe982 100644 --- a/internal/otelcollector/config/metric/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/metric/gateway/testdata/config.yaml @@ -127,10 +127,10 @@ processors: attributes: - action: insert key: k8s.cluster.name - value: ${CLUSTER_NAME} + value: test-cluster - action: insert key: cloud.provider - value: ${CLOUD_PROVIDER} + value: test-cloud-provider filter/drop-if-input-source-runtime: metrics: metric: diff --git a/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml b/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml index fca81495a..a36a75379 100644 --- a/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml +++ b/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml @@ -128,10 +128,10 @@ processors: attributes: - action: insert key: k8s.cluster.name - value: ${CLUSTER_NAME} + value: test-cluster - action: insert key: cloud.provider - value: ${CLOUD_PROVIDER} + value: test-cloud-provider filter/drop-if-input-source-runtime: metrics: metric: diff --git a/internal/reconciler/metricpipeline/reconciler.go b/internal/reconciler/metricpipeline/reconciler.go index 27cf06550..c78dd66d1 100644 --- a/internal/reconciler/metricpipeline/reconciler.go +++ b/internal/reconciler/metricpipeline/reconciler.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "gopkg.in/yaml.v3" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ctrl "sigs.k8s.io/controller-runtime" @@ -240,9 +239,13 @@ func isMetricAgentRequired(pipeline *telemetryv1alpha1.MetricPipeline) bool { } func (r *Reconciler) reconcileMetricGateway(ctx context.Context, pipeline *telemetryv1alpha1.MetricPipeline, allPipelines []telemetryv1alpha1.MetricPipeline) error { + shootInfo := k8sutils.GetGardenerShootInfo(ctx, r.Client) + collectorConfig, collectorEnvVars, err := r.gatewayConfigBuilder.Build(ctx, allPipelines, gateway.BuildOptions{ GatewayNamespace: r.telemetryNamespace, InstrumentationScopeVersion: r.moduleVersion, + ClusterName: shootInfo.ClusterName, + CloudProvider: shootInfo.CloudProvider, }) if err != nil { diff --git a/internal/utils/k8s/cluster_info_getter.go b/internal/utils/k8s/cluster_info_getter.go new file mode 100644 index 000000000..65ceeb90f --- /dev/null +++ b/internal/utils/k8s/cluster_info_getter.go @@ -0,0 +1,32 @@ +package k8s + +import ( + "context" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + logf "sigs.k8s.io/controller-runtime/pkg/log" +) + +type ClusterInfo struct { + ClusterName string + CloudProvider string +} + +func GetGardenerShootInfo(ctx context.Context, client client.Client) ClusterInfo { + shootInfo := v1.ConfigMap{} + err := client.Get(ctx, types.NamespacedName{ + Namespace: "kube-system", + Name: "shoot-info", + }, &shootInfo) + + if err != nil { + logf.FromContext(ctx).V(1).Info("Failed get shoot-info config map") + return ClusterInfo{} + } + + return ClusterInfo{ + ClusterName: shootInfo.Data["shootName"], + CloudProvider: shootInfo.Data["provider"], + } +} From 50d6ae328bfe7b6c30ba8a4d731dc6aaec5c3585 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 13:26:08 +0100 Subject: [PATCH 03/29] update unit tests with cluster info attributes --- .../config/gatewayprocs/resource_procs.go | 22 +++++-- .../gatewayprocs/resource_procs_test.go | 6 +- .../config/log/gateway/config_builder.go | 9 ++- .../config/log/gateway/config_builder_test.go | 62 ++++++++++++++++--- .../config/log/gateway/processors.go | 4 +- .../config/log/gateway/processors_test.go | 24 +++++-- .../config/log/gateway/testdata/config.yaml | 4 +- .../config/trace/gateway/config_builder.go | 9 ++- .../trace/gateway/config_builder_test.go | 55 +++++++++++++--- .../config/trace/gateway/processors.go | 4 +- .../config/trace/gateway/processors_test.go | 29 ++++++--- .../config/trace/gateway/testdata/config.yaml | 4 +- .../otel/mocks/gateway_config_builder.go | 22 +++---- .../reconciler/logpipeline/otel/reconciler.go | 9 ++- .../logpipeline/otel/reconciler_test.go | 6 +- .../reconciler/metricpipeline/reconciler.go | 1 + .../mocks/gateway_config_builder.go | 22 +++---- .../reconciler/tracepipeline/reconciler.go | 9 ++- .../tracepipeline/reconciler_test.go | 16 ++--- internal/utils/k8s/cluster_info_getter.go | 7 ++- 20 files changed, 234 insertions(+), 90 deletions(-) diff --git a/internal/otelcollector/config/gatewayprocs/resource_procs.go b/internal/otelcollector/config/gatewayprocs/resource_procs.go index 7a7632088..31af7e402 100644 --- a/internal/otelcollector/config/gatewayprocs/resource_procs.go +++ b/internal/otelcollector/config/gatewayprocs/resource_procs.go @@ -5,6 +5,23 @@ import ( ) func InsertClusterAttributesProcessorConfig(clusterName, cloudProvider string) *config.ResourceProcessor { + if cloudProvider != "" { + return &config.ResourceProcessor{ + Attributes: []config.AttributeAction{ + { + Action: "insert", + Key: "k8s.cluster.name", + Value: clusterName, + }, + { + Action: "insert", + Key: "cloud.provider", + Value: cloudProvider, + }, + }, + } + } + return &config.ResourceProcessor{ Attributes: []config.AttributeAction{ { @@ -12,11 +29,6 @@ func InsertClusterAttributesProcessorConfig(clusterName, cloudProvider string) * Key: "k8s.cluster.name", Value: clusterName, }, - { - Action: "insert", - Key: "cloud.provider", - Value: cloudProvider, - }, }, } } diff --git a/internal/otelcollector/config/gatewayprocs/resource_procs_test.go b/internal/otelcollector/config/gatewayprocs/resource_procs_test.go index f33de5cc3..b6892c5ed 100644 --- a/internal/otelcollector/config/gatewayprocs/resource_procs_test.go +++ b/internal/otelcollector/config/gatewayprocs/resource_procs_test.go @@ -15,16 +15,16 @@ func TestInsertClusterNameProcessorConfig(t *testing.T) { { Action: "insert", Key: "k8s.cluster.name", - Value: "${CLUSTER_NAME}", + Value: "test-cluster", }, { Action: "insert", Key: "cloud.provider", - Value: "${CLOUD_PROVIDER}", + Value: "test-cloud-provider", }, } - config := InsertClusterAttributesProcessorConfig() + config := InsertClusterAttributesProcessorConfig("test-cluster", "test-cloud-provider") require.ElementsMatch(expectedAttributeActions, config.Attributes, "Attributes should match") } diff --git a/internal/otelcollector/config/log/gateway/config_builder.go b/internal/otelcollector/config/log/gateway/config_builder.go index df3008dcf..b604e2f0b 100644 --- a/internal/otelcollector/config/log/gateway/config_builder.go +++ b/internal/otelcollector/config/log/gateway/config_builder.go @@ -22,14 +22,19 @@ type Builder struct { Reader client.Reader } -func (b *Builder) Build(ctx context.Context, pipelines []telemetryv1alpha1.LogPipeline) (*Config, otlpexporter.EnvVars, error) { +type BuildOptions struct { + ClusterName string + CloudProvider string +} + +func (b *Builder) Build(ctx context.Context, pipelines []telemetryv1alpha1.LogPipeline, opts BuildOptions) (*Config, otlpexporter.EnvVars, error) { cfg := &Config{ Base: config.Base{ Service: config.DefaultService(make(config.Pipelines)), Extensions: config.DefaultExtensions(), }, Receivers: makeReceiversConfig(), - Processors: makeProcessorsConfig(), + Processors: makeProcessorsConfig(opts), Exporters: make(Exporters), } diff --git a/internal/otelcollector/config/log/gateway/config_builder_test.go b/internal/otelcollector/config/log/gateway/config_builder_test.go index e64a44a8b..ae67c66dc 100644 --- a/internal/otelcollector/config/log/gateway/config_builder_test.go +++ b/internal/otelcollector/config/log/gateway/config_builder_test.go @@ -26,7 +26,12 @@ func TestBuildConfig(t *testing.T) { t.Run("otlp exporter endpoint", func(t *testing.T) { collectorConfig, envVars, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{ testutils.NewLogPipelineBuilder().WithName("test").WithOTLPOutput(testutils.OTLPEndpoint("http://localhost")).Build(), - }) + }, + BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }, + ) require.NoError(t, err) const endpointEnvVar = "OTLP_ENDPOINT_TEST" @@ -42,7 +47,10 @@ func TestBuildConfig(t *testing.T) { }) t.Run("secure", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithName("test").WithOTLPOutput().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithName("test").WithOTLPOutput().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test") @@ -52,7 +60,10 @@ func TestBuildConfig(t *testing.T) { t.Run("insecure", func(t *testing.T) { collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{ - testutils.NewLogPipelineBuilder().WithName("test-insecure").WithOTLPOutput(testutils.OTLPEndpoint("http://localhost")).Build()}) + testutils.NewLogPipelineBuilder().WithName("test-insecure").WithOTLPOutput(testutils.OTLPEndpoint("http://localhost")).Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-insecure") @@ -63,6 +74,9 @@ func TestBuildConfig(t *testing.T) { t.Run("basic auth", func(t *testing.T) { collectorConfig, envVars, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{ testutils.NewLogPipelineBuilder().WithName("test-basic-auth").WithOTLPOutput(testutils.OTLPBasicAuth("user", "password")).Build(), + }, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-basic-auth") @@ -82,6 +96,9 @@ func TestBuildConfig(t *testing.T) { t.Run("custom header", func(t *testing.T) { collectorConfig, envVars, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{ testutils.NewLogPipelineBuilder().WithName("test-custom-header").WithOTLPOutput(testutils.OTLPCustomHeader("Authorization", "TOKEN_VALUE", "Api-Token")).Build(), + }, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-custom-header") @@ -99,6 +116,9 @@ func TestBuildConfig(t *testing.T) { t.Run("mtls", func(t *testing.T) { collectorConfig, envVars, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{ testutils.NewLogPipelineBuilder().WithName("test-mtls").WithOTLPOutput(testutils.OTLPClientTLSFromString("ca", "cert", "key")).Build(), + }, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-mtls") @@ -115,7 +135,10 @@ func TestBuildConfig(t *testing.T) { }) t.Run("extensions", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.NotEmpty(t, collectorConfig.Extensions.HealthCheck.Endpoint) @@ -125,7 +148,10 @@ func TestBuildConfig(t *testing.T) { }) t.Run("telemetry", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) metricreaders := []config.MetricReader{ @@ -147,7 +173,10 @@ func TestBuildConfig(t *testing.T) { }) t.Run("single pipeline queue size", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithName("test").WithOTLPOutput().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithName("test").WithOTLPOutput().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Equal(t, maxQueueSize, collectorConfig.Exporters["otlp/test"].OTLP.SendingQueue.QueueSize, "Pipeline should have the full queue size") }) @@ -156,7 +185,10 @@ func TestBuildConfig(t *testing.T) { collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{ testutils.NewLogPipelineBuilder().WithName("test-1").WithOTLPOutput().Build(), testutils.NewLogPipelineBuilder().WithName("test-2").WithOTLPOutput().Build(), - testutils.NewLogPipelineBuilder().WithName("test-3").WithOTLPOutput().Build()}) + testutils.NewLogPipelineBuilder().WithName("test-3").WithOTLPOutput().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) @@ -167,7 +199,10 @@ func TestBuildConfig(t *testing.T) { }) t.Run("single pipeline topology", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithName("test").WithOTLPOutput().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithName("test").WithOTLPOutput().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Contains(t, collectorConfig.Service.Pipelines, "logs/test") @@ -184,7 +219,10 @@ func TestBuildConfig(t *testing.T) { t.Run("multi pipeline topology", func(t *testing.T) { collectorConfig, envVars, err := sut.Build(context.Background(), []telemetryv1alpha1.LogPipeline{ testutils.NewLogPipelineBuilder().WithName("test-1").WithOTLPOutput().Build(), - testutils.NewLogPipelineBuilder().WithName("test-2").WithOTLPOutput().Build()}) + testutils.NewLogPipelineBuilder().WithName("test-2").WithOTLPOutput().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-1") @@ -213,6 +251,9 @@ func TestBuildConfig(t *testing.T) { t.Run("marshaling", func(t *testing.T) { config, _, err := sut.Build(context.Background(), []telemetryv1alpha1.LogPipeline{ testutils.NewLogPipelineBuilder().WithName("test").WithOTLPOutput().Build(), + }, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", }) require.NoError(t, err) @@ -230,6 +271,9 @@ func TestBuildConfig(t *testing.T) { t.Run("failed to make otlp exporter config", func(t *testing.T) { _, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{ testutils.NewLogPipelineBuilder().WithName("test-fail").WithOTLPOutput(testutils.OTLPBasicAuthFromSecret("nonexistent-secret", "default", "user", "password")).Build(), + }, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", }) require.Error(t, err) require.ErrorContains(t, err, "failed to make otlp exporter config") diff --git a/internal/otelcollector/config/log/gateway/processors.go b/internal/otelcollector/config/log/gateway/processors.go index bb350487a..aaddddef3 100644 --- a/internal/otelcollector/config/log/gateway/processors.go +++ b/internal/otelcollector/config/log/gateway/processors.go @@ -5,14 +5,14 @@ import ( "github.com/kyma-project/telemetry-manager/internal/otelcollector/config/gatewayprocs" ) -func makeProcessorsConfig() Processors { +func makeProcessorsConfig(opts BuildOptions) Processors { return Processors{ BaseProcessors: config.BaseProcessors{ Batch: makeBatchProcessorConfig(), MemoryLimiter: makeMemoryLimiterConfig(), }, K8sAttributes: gatewayprocs.K8sAttributesProcessorConfig(), - InsertClusterAttributes: gatewayprocs.InsertClusterAttributesProcessorConfig(), + InsertClusterAttributes: gatewayprocs.InsertClusterAttributesProcessorConfig(opts.ClusterName, opts.CloudProvider), } } diff --git a/internal/otelcollector/config/log/gateway/processors_test.go b/internal/otelcollector/config/log/gateway/processors_test.go index d845cce1e..7517fb930 100644 --- a/internal/otelcollector/config/log/gateway/processors_test.go +++ b/internal/otelcollector/config/log/gateway/processors_test.go @@ -17,20 +17,26 @@ func TestProcessors(t *testing.T) { sut := Builder{Reader: fakeClient} t.Run("insert cluster attributes processor", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Equal(t, 2, len(collectorConfig.Processors.InsertClusterAttributes.Attributes)) require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Action) require.Equal(t, "k8s.cluster.name", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Key) - require.Equal(t, "${CLUSTER_NAME}", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Value) + require.Equal(t, "test-cluster", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Value) require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Action) require.Equal(t, "cloud.provider", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Key) - require.Equal(t, "${CLOUD_PROVIDER}", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Value) + require.Equal(t, "test-cloud-provider", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Value) }) t.Run("memory limit processors", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Equal(t, "1s", collectorConfig.Processors.MemoryLimiter.CheckInterval) @@ -39,7 +45,10 @@ func TestProcessors(t *testing.T) { }) t.Run("batch processors", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Equal(t, 512, collectorConfig.Processors.Batch.SendBatchSize) @@ -48,7 +57,10 @@ func TestProcessors(t *testing.T) { }) t.Run("k8s attributes processors", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.LogPipeline{testutils.NewLogPipelineBuilder().WithOTLPOutput().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Equal(t, "serviceAccount", collectorConfig.Processors.K8sAttributes.AuthType) diff --git a/internal/otelcollector/config/log/gateway/testdata/config.yaml b/internal/otelcollector/config/log/gateway/testdata/config.yaml index f069a41e5..4aa1d51f9 100644 --- a/internal/otelcollector/config/log/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/log/gateway/testdata/config.yaml @@ -84,10 +84,10 @@ processors: attributes: - action: insert key: k8s.cluster.name - value: ${CLUSTER_NAME} + value: test-cluster - action: insert key: cloud.provider - value: ${CLOUD_PROVIDER} + value: test-cloud-provider exporters: otlp/test: endpoint: ${OTLP_ENDPOINT_TEST} diff --git a/internal/otelcollector/config/trace/gateway/config_builder.go b/internal/otelcollector/config/trace/gateway/config_builder.go index b6ff6b86c..c77a1be20 100644 --- a/internal/otelcollector/config/trace/gateway/config_builder.go +++ b/internal/otelcollector/config/trace/gateway/config_builder.go @@ -22,14 +22,19 @@ type Builder struct { Reader client.Reader } -func (b *Builder) Build(ctx context.Context, pipelines []telemetryv1alpha1.TracePipeline) (*Config, otlpexporter.EnvVars, error) { +type BuildOptions struct { + ClusterName string + CloudProvider string +} + +func (b *Builder) Build(ctx context.Context, pipelines []telemetryv1alpha1.TracePipeline, opts BuildOptions) (*Config, otlpexporter.EnvVars, error) { cfg := &Config{ Base: config.Base{ Service: config.DefaultService(make(config.Pipelines)), Extensions: config.DefaultExtensions(), }, Receivers: makeReceiversConfig(), - Processors: makeProcessorsConfig(), + Processors: makeProcessorsConfig(opts), Exporters: make(Exporters), } diff --git a/internal/otelcollector/config/trace/gateway/config_builder_test.go b/internal/otelcollector/config/trace/gateway/config_builder_test.go index 451cd028f..55b3ed0a5 100644 --- a/internal/otelcollector/config/trace/gateway/config_builder_test.go +++ b/internal/otelcollector/config/trace/gateway/config_builder_test.go @@ -26,6 +26,9 @@ func TestBuildConfig(t *testing.T) { t.Run("otlp exporter endpoint", func(t *testing.T) { collectorConfig, envVars, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{ testutils.NewTracePipelineBuilder().WithName("test").WithOTLPOutput(testutils.OTLPEndpoint("http://localhost")).Build(), + }, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", }) require.NoError(t, err) @@ -41,7 +44,10 @@ func TestBuildConfig(t *testing.T) { }) t.Run("secure", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().WithName("test").Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().WithName("test").Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test") @@ -51,7 +57,10 @@ func TestBuildConfig(t *testing.T) { t.Run("insecure", func(t *testing.T) { collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{ - testutils.NewTracePipelineBuilder().WithName("test-insecure").WithOTLPOutput(testutils.OTLPEndpoint("http://localhost")).Build()}) + testutils.NewTracePipelineBuilder().WithName("test-insecure").WithOTLPOutput(testutils.OTLPEndpoint("http://localhost")).Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-insecure") @@ -62,6 +71,9 @@ func TestBuildConfig(t *testing.T) { t.Run("basic auth", func(t *testing.T) { collectorConfig, envVars, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{ testutils.NewTracePipelineBuilder().WithName("test-basic-auth").WithOTLPOutput(testutils.OTLPBasicAuth("user", "password")).Build(), + }, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-basic-auth") @@ -81,6 +93,9 @@ func TestBuildConfig(t *testing.T) { t.Run("custom header", func(t *testing.T) { collectorConfig, envVars, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{ testutils.NewTracePipelineBuilder().WithName("test-custom-header").WithOTLPOutput(testutils.OTLPCustomHeader("Authorization", "TOKEN_VALUE", "Api-Token")).Build(), + }, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-custom-header") @@ -98,6 +113,9 @@ func TestBuildConfig(t *testing.T) { t.Run("mtls", func(t *testing.T) { collectorConfig, envVars, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{ testutils.NewTracePipelineBuilder().WithName("test-mtls").WithOTLPOutput(testutils.OTLPClientTLSFromString("ca", "cert", "key")).Build(), + }, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-mtls") @@ -114,7 +132,10 @@ func TestBuildConfig(t *testing.T) { }) t.Run("extensions", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.NotEmpty(t, collectorConfig.Extensions.HealthCheck.Endpoint) @@ -124,7 +145,10 @@ func TestBuildConfig(t *testing.T) { }) t.Run("telemetry", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) metricreaders := []config.MetricReader{ @@ -146,7 +170,10 @@ func TestBuildConfig(t *testing.T) { }) t.Run("single pipeline queue size", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().WithName("test").Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().WithName("test").Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Equal(t, maxQueueSize, collectorConfig.Exporters["otlp/test"].OTLP.SendingQueue.QueueSize, "Pipeline should have the full queue size") }) @@ -155,7 +182,10 @@ func TestBuildConfig(t *testing.T) { collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{ testutils.NewTracePipelineBuilder().WithName("test-1").Build(), testutils.NewTracePipelineBuilder().WithName("test-2").Build(), - testutils.NewTracePipelineBuilder().WithName("test-3").Build()}) + testutils.NewTracePipelineBuilder().WithName("test-3").Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) @@ -166,7 +196,10 @@ func TestBuildConfig(t *testing.T) { }) t.Run("single pipeline topology", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().WithName("test").Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().WithName("test").Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Contains(t, collectorConfig.Service.Pipelines, "traces/test") @@ -186,7 +219,10 @@ func TestBuildConfig(t *testing.T) { t.Run("multi pipeline topology", func(t *testing.T) { collectorConfig, envVars, err := sut.Build(context.Background(), []telemetryv1alpha1.TracePipeline{ testutils.NewTracePipelineBuilder().WithName("test-1").Build(), - testutils.NewTracePipelineBuilder().WithName("test-2").Build()}) + testutils.NewTracePipelineBuilder().WithName("test-2").Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Contains(t, collectorConfig.Exporters, "otlp/test-1") @@ -221,6 +257,9 @@ func TestBuildConfig(t *testing.T) { t.Run("marshaling", func(t *testing.T) { config, _, err := sut.Build(context.Background(), []telemetryv1alpha1.TracePipeline{ testutils.NewTracePipelineBuilder().WithName("test").Build(), + }, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", }) require.NoError(t, err) diff --git a/internal/otelcollector/config/trace/gateway/processors.go b/internal/otelcollector/config/trace/gateway/processors.go index 4fc1225c4..c2677aa46 100644 --- a/internal/otelcollector/config/trace/gateway/processors.go +++ b/internal/otelcollector/config/trace/gateway/processors.go @@ -5,14 +5,14 @@ import ( "github.com/kyma-project/telemetry-manager/internal/otelcollector/config/gatewayprocs" ) -func makeProcessorsConfig() Processors { +func makeProcessorsConfig(opts BuildOptions) Processors { return Processors{ BaseProcessors: config.BaseProcessors{ Batch: makeBatchProcessorConfig(), MemoryLimiter: makeMemoryLimiterConfig(), }, K8sAttributes: gatewayprocs.K8sAttributesProcessorConfig(), - InsertClusterAttributes: gatewayprocs.InsertClusterAttributesProcessorConfig(), + InsertClusterAttributes: gatewayprocs.InsertClusterAttributesProcessorConfig(opts.ClusterName, opts.CloudProvider), DropNoisySpans: makeDropNoisySpansConfig(), ResolveServiceName: makeResolveServiceNameConfig(), DropKymaAttributes: gatewayprocs.DropKymaAttributesProcessorConfig(), diff --git a/internal/otelcollector/config/trace/gateway/processors_test.go b/internal/otelcollector/config/trace/gateway/processors_test.go index d4ca29bfd..01e968469 100644 --- a/internal/otelcollector/config/trace/gateway/processors_test.go +++ b/internal/otelcollector/config/trace/gateway/processors_test.go @@ -17,20 +17,26 @@ func TestProcessors(t *testing.T) { sut := Builder{Reader: fakeClient} t.Run("insert cluster attributes processor", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Equal(t, 2, len(collectorConfig.Processors.InsertClusterAttributes.Attributes)) require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Action) require.Equal(t, "k8s.cluster.name", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Key) - require.Equal(t, "${CLUSTER_NAME}", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Value) + require.Equal(t, "test-cluster", collectorConfig.Processors.InsertClusterAttributes.Attributes[0].Value) require.Equal(t, "insert", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Action) require.Equal(t, "cloud.provider", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Key) - require.Equal(t, "${CLOUD_PROVIDER}", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Value) + require.Equal(t, "test-cloud-provider", collectorConfig.Processors.InsertClusterAttributes.Attributes[1].Value) }) t.Run("memory limit processors", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Equal(t, "1s", collectorConfig.Processors.MemoryLimiter.CheckInterval) @@ -39,7 +45,10 @@ func TestProcessors(t *testing.T) { }) t.Run("batch processors", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Equal(t, 512, collectorConfig.Processors.Batch.SendBatchSize) @@ -48,7 +57,10 @@ func TestProcessors(t *testing.T) { }) t.Run("k8s attributes processors", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Equal(t, "serviceAccount", collectorConfig.Processors.K8sAttributes.AuthType) @@ -76,7 +88,10 @@ func TestProcessors(t *testing.T) { }) t.Run("filter processor", func(t *testing.T) { - collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}) + collectorConfig, _, err := sut.Build(ctx, []telemetryv1alpha1.TracePipeline{testutils.NewTracePipelineBuilder().Build()}, BuildOptions{ + ClusterName: "test-cluster", + CloudProvider: "test-cloud-provider", + }) require.NoError(t, err) require.Equal(t, 9, len(collectorConfig.Processors.DropNoisySpans.Traces.Span), "Span filter list size is wrong") diff --git a/internal/otelcollector/config/trace/gateway/testdata/config.yaml b/internal/otelcollector/config/trace/gateway/testdata/config.yaml index 0aaf3415d..7b5cb7e27 100644 --- a/internal/otelcollector/config/trace/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/trace/gateway/testdata/config.yaml @@ -87,10 +87,10 @@ processors: attributes: - action: insert key: k8s.cluster.name - value: ${CLUSTER_NAME} + value: test-cluster - action: insert key: cloud.provider - value: ${CLOUD_PROVIDER} + value: test-cloud-provider filter/drop-noisy-spans: traces: span: diff --git a/internal/reconciler/logpipeline/otel/mocks/gateway_config_builder.go b/internal/reconciler/logpipeline/otel/mocks/gateway_config_builder.go index 92e2d6362..f9eb01d7a 100644 --- a/internal/reconciler/logpipeline/otel/mocks/gateway_config_builder.go +++ b/internal/reconciler/logpipeline/otel/mocks/gateway_config_builder.go @@ -18,9 +18,9 @@ type GatewayConfigBuilder struct { mock.Mock } -// Build provides a mock function with given fields: ctx, pipelines -func (_m *GatewayConfigBuilder) Build(ctx context.Context, pipelines []v1alpha1.LogPipeline) (*gateway.Config, otlpexporter.EnvVars, error) { - ret := _m.Called(ctx, pipelines) +// Build provides a mock function with given fields: ctx, pipelines, opts +func (_m *GatewayConfigBuilder) Build(ctx context.Context, pipelines []v1alpha1.LogPipeline, opts gateway.BuildOptions) (*gateway.Config, otlpexporter.EnvVars, error) { + ret := _m.Called(ctx, pipelines, opts) if len(ret) == 0 { panic("no return value specified for Build") @@ -29,27 +29,27 @@ func (_m *GatewayConfigBuilder) Build(ctx context.Context, pipelines []v1alpha1. var r0 *gateway.Config var r1 otlpexporter.EnvVars var r2 error - if rf, ok := ret.Get(0).(func(context.Context, []v1alpha1.LogPipeline) (*gateway.Config, otlpexporter.EnvVars, error)); ok { - return rf(ctx, pipelines) + if rf, ok := ret.Get(0).(func(context.Context, []v1alpha1.LogPipeline, gateway.BuildOptions) (*gateway.Config, otlpexporter.EnvVars, error)); ok { + return rf(ctx, pipelines, opts) } - if rf, ok := ret.Get(0).(func(context.Context, []v1alpha1.LogPipeline) *gateway.Config); ok { - r0 = rf(ctx, pipelines) + if rf, ok := ret.Get(0).(func(context.Context, []v1alpha1.LogPipeline, gateway.BuildOptions) *gateway.Config); ok { + r0 = rf(ctx, pipelines, opts) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*gateway.Config) } } - if rf, ok := ret.Get(1).(func(context.Context, []v1alpha1.LogPipeline) otlpexporter.EnvVars); ok { - r1 = rf(ctx, pipelines) + if rf, ok := ret.Get(1).(func(context.Context, []v1alpha1.LogPipeline, gateway.BuildOptions) otlpexporter.EnvVars); ok { + r1 = rf(ctx, pipelines, opts) } else { if ret.Get(1) != nil { r1 = ret.Get(1).(otlpexporter.EnvVars) } } - if rf, ok := ret.Get(2).(func(context.Context, []v1alpha1.LogPipeline) error); ok { - r2 = rf(ctx, pipelines) + if rf, ok := ret.Get(2).(func(context.Context, []v1alpha1.LogPipeline, gateway.BuildOptions) error); ok { + r2 = rf(ctx, pipelines, opts) } else { r2 = ret.Error(2) } diff --git a/internal/reconciler/logpipeline/otel/reconciler.go b/internal/reconciler/logpipeline/otel/reconciler.go index 025336aed..9a077ad8f 100644 --- a/internal/reconciler/logpipeline/otel/reconciler.go +++ b/internal/reconciler/logpipeline/otel/reconciler.go @@ -27,7 +27,7 @@ import ( const defaultReplicaCount int32 = 2 type GatewayConfigBuilder interface { - Build(ctx context.Context, pipelines []telemetryv1alpha1.LogPipeline) (*gateway.Config, otlpexporter.EnvVars, error) + Build(ctx context.Context, pipelines []telemetryv1alpha1.LogPipeline, opts gateway.BuildOptions) (*gateway.Config, otlpexporter.EnvVars, error) } type GatewayApplierDeleter interface { @@ -171,7 +171,12 @@ func (r *Reconciler) isReconcilable(ctx context.Context, pipeline *telemetryv1al } func (r *Reconciler) reconcileLogGateway(ctx context.Context, pipeline *telemetryv1alpha1.LogPipeline, allPipelines []telemetryv1alpha1.LogPipeline) error { - collectorConfig, collectorEnvVars, err := r.gatewayConfigBuilder.Build(ctx, allPipelines) + clusterInfo := k8sutils.GetGardenerShootInfo(ctx, r.Client) + collectorConfig, collectorEnvVars, err := r.gatewayConfigBuilder.Build(ctx, allPipelines, gateway.BuildOptions{ + ClusterName: clusterInfo.ClusterName, + CloudProvider: clusterInfo.CloudProvider, + }) + if err != nil { return fmt.Errorf("failed to create collector config: %w", err) } diff --git a/internal/reconciler/logpipeline/otel/reconciler_test.go b/internal/reconciler/logpipeline/otel/reconciler_test.go index a40744256..f712b4612 100644 --- a/internal/reconciler/logpipeline/otel/reconciler_test.go +++ b/internal/reconciler/logpipeline/otel/reconciler_test.go @@ -45,7 +45,7 @@ func TestReconcile(t *testing.T) { gatewayApplierDeleterMock.On("ApplyResources", mock.Anything, mock.Anything, mock.Anything).Return(nil) gatewayConfigBuilderMock := &mocks.GatewayConfigBuilder{} - gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline)).Return(&gateway.Config{}, nil, nil).Times(1) + gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline), mock.Anything).Return(&gateway.Config{}, nil, nil).Times(1) gatewayProberStub := commonStatusStubs.NewDeploymentSetProber(workloadstatus.ErrDeploymentFetching) @@ -91,7 +91,7 @@ func TestReconcile(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&pipeline).WithStatusSubresource(&pipeline).Build() gatewayConfigBuilderMock := &mocks.GatewayConfigBuilder{} - gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline)).Return(&gateway.Config{}, nil, nil).Times(1) + gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline), mock.Anything).Return(&gateway.Config{}, nil, nil).Times(1) gatewayApplierDeleterMock := &mocks.GatewayApplierDeleter{} gatewayApplierDeleterMock.On("ApplyResources", mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -140,7 +140,7 @@ func TestReconcile(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&pipeline).WithStatusSubresource(&pipeline).Build() gatewayConfigBuilderMock := &mocks.GatewayConfigBuilder{} - gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline)).Return(&gateway.Config{}, nil, nil).Times(1) + gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline), mock.Anything).Return(&gateway.Config{}, nil, nil).Times(1) gatewayApplierDeleterMock := &mocks.GatewayApplierDeleter{} gatewayApplierDeleterMock.On("ApplyResources", mock.Anything, mock.Anything, mock.Anything).Return(nil) diff --git a/internal/reconciler/metricpipeline/reconciler.go b/internal/reconciler/metricpipeline/reconciler.go index c78dd66d1..48380347c 100644 --- a/internal/reconciler/metricpipeline/reconciler.go +++ b/internal/reconciler/metricpipeline/reconciler.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "gopkg.in/yaml.v3" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ctrl "sigs.k8s.io/controller-runtime" diff --git a/internal/reconciler/tracepipeline/mocks/gateway_config_builder.go b/internal/reconciler/tracepipeline/mocks/gateway_config_builder.go index 90063d6de..cf6b802a0 100644 --- a/internal/reconciler/tracepipeline/mocks/gateway_config_builder.go +++ b/internal/reconciler/tracepipeline/mocks/gateway_config_builder.go @@ -18,9 +18,9 @@ type GatewayConfigBuilder struct { mock.Mock } -// Build provides a mock function with given fields: ctx, pipelines -func (_m *GatewayConfigBuilder) Build(ctx context.Context, pipelines []v1alpha1.TracePipeline) (*gateway.Config, otlpexporter.EnvVars, error) { - ret := _m.Called(ctx, pipelines) +// Build provides a mock function with given fields: ctx, pipelines, opts +func (_m *GatewayConfigBuilder) Build(ctx context.Context, pipelines []v1alpha1.TracePipeline, opts gateway.BuildOptions) (*gateway.Config, otlpexporter.EnvVars, error) { + ret := _m.Called(ctx, pipelines, opts) if len(ret) == 0 { panic("no return value specified for Build") @@ -29,27 +29,27 @@ func (_m *GatewayConfigBuilder) Build(ctx context.Context, pipelines []v1alpha1. var r0 *gateway.Config var r1 otlpexporter.EnvVars var r2 error - if rf, ok := ret.Get(0).(func(context.Context, []v1alpha1.TracePipeline) (*gateway.Config, otlpexporter.EnvVars, error)); ok { - return rf(ctx, pipelines) + if rf, ok := ret.Get(0).(func(context.Context, []v1alpha1.TracePipeline, gateway.BuildOptions) (*gateway.Config, otlpexporter.EnvVars, error)); ok { + return rf(ctx, pipelines, opts) } - if rf, ok := ret.Get(0).(func(context.Context, []v1alpha1.TracePipeline) *gateway.Config); ok { - r0 = rf(ctx, pipelines) + if rf, ok := ret.Get(0).(func(context.Context, []v1alpha1.TracePipeline, gateway.BuildOptions) *gateway.Config); ok { + r0 = rf(ctx, pipelines, opts) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*gateway.Config) } } - if rf, ok := ret.Get(1).(func(context.Context, []v1alpha1.TracePipeline) otlpexporter.EnvVars); ok { - r1 = rf(ctx, pipelines) + if rf, ok := ret.Get(1).(func(context.Context, []v1alpha1.TracePipeline, gateway.BuildOptions) otlpexporter.EnvVars); ok { + r1 = rf(ctx, pipelines, opts) } else { if ret.Get(1) != nil { r1 = ret.Get(1).(otlpexporter.EnvVars) } } - if rf, ok := ret.Get(2).(func(context.Context, []v1alpha1.TracePipeline) error); ok { - r2 = rf(ctx, pipelines) + if rf, ok := ret.Get(2).(func(context.Context, []v1alpha1.TracePipeline, gateway.BuildOptions) error); ok { + r2 = rf(ctx, pipelines, opts) } else { r2 = ret.Error(2) } diff --git a/internal/reconciler/tracepipeline/reconciler.go b/internal/reconciler/tracepipeline/reconciler.go index 60686541e..5fcd98ef2 100644 --- a/internal/reconciler/tracepipeline/reconciler.go +++ b/internal/reconciler/tracepipeline/reconciler.go @@ -44,7 +44,7 @@ import ( const defaultReplicaCount int32 = 2 type GatewayConfigBuilder interface { - Build(ctx context.Context, pipelines []telemetryv1alpha1.TracePipeline) (*gateway.Config, otlpexporter.EnvVars, error) + Build(ctx context.Context, pipelines []telemetryv1alpha1.TracePipeline, opts gateway.BuildOptions) (*gateway.Config, otlpexporter.EnvVars, error) } type GatewayApplierDeleter interface { @@ -217,7 +217,12 @@ func (r *Reconciler) isReconcilable(ctx context.Context, pipeline *telemetryv1al } func (r *Reconciler) reconcileTraceGateway(ctx context.Context, pipeline *telemetryv1alpha1.TracePipeline, allPipelines []telemetryv1alpha1.TracePipeline) error { - collectorConfig, collectorEnvVars, err := r.gatewayConfigBuilder.Build(ctx, allPipelines) + clusterInfo := k8sutils.GetGardenerShootInfo(ctx, r.Client) + + collectorConfig, collectorEnvVars, err := r.gatewayConfigBuilder.Build(ctx, allPipelines, gateway.BuildOptions{ + ClusterName: clusterInfo.ClusterName, + CloudProvider: clusterInfo.CloudProvider, + }) if err != nil { return fmt.Errorf("failed to create collector config: %w", err) } diff --git a/internal/reconciler/tracepipeline/reconciler_test.go b/internal/reconciler/tracepipeline/reconciler_test.go index 4cd1a7ee6..2bab74805 100644 --- a/internal/reconciler/tracepipeline/reconciler_test.go +++ b/internal/reconciler/tracepipeline/reconciler_test.go @@ -52,7 +52,7 @@ func TestReconcile(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&pipeline).WithStatusSubresource(&pipeline).Build() gatewayConfigBuilderMock := &mocks.GatewayConfigBuilder{} - gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline)).Return(&gateway.Config{}, nil, nil).Times(1) + gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline), mock.Anything).Return(&gateway.Config{}, nil, nil).Times(1) gatewayApplierDeleterMock := &mocks.GatewayApplierDeleter{} gatewayApplierDeleterMock.On("ApplyResources", mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -109,7 +109,7 @@ func TestReconcile(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&pipeline).WithStatusSubresource(&pipeline).Build() gatewayConfigBuilderMock := &mocks.GatewayConfigBuilder{} - gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline)).Return(&gateway.Config{}, nil, nil).Times(1) + gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline), mock.Anything).Return(&gateway.Config{}, nil, nil).Times(1) gatewayApplierDeleterMock := &mocks.GatewayApplierDeleter{} gatewayApplierDeleterMock.On("ApplyResources", mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -166,7 +166,7 @@ func TestReconcile(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&pipeline).WithStatusSubresource(&pipeline).Build() gatewayConfigBuilderMock := &mocks.GatewayConfigBuilder{} - gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline)).Return(&gateway.Config{}, nil, nil).Times(1) + gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline), mock.Anything).Return(&gateway.Config{}, nil, nil).Times(1) gatewayApplierDeleterMock := &mocks.GatewayApplierDeleter{} gatewayApplierDeleterMock.On("ApplyResources", mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -296,7 +296,7 @@ func TestReconcile(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&pipeline, secret).WithStatusSubresource(&pipeline).Build() gatewayConfigBuilderMock := &mocks.GatewayConfigBuilder{} - gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline)).Return(&gateway.Config{}, nil, nil).Times(1) + gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline), mock.Anything).Return(&gateway.Config{}, nil, nil).Times(1) gatewayApplierDeleterMock := &mocks.GatewayApplierDeleter{} gatewayApplierDeleterMock.On("ApplyResources", mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -506,7 +506,7 @@ func TestReconcile(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&pipeline).WithStatusSubresource(&pipeline).Build() gatewayConfigBuilderMock := &mocks.GatewayConfigBuilder{} - gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline)).Return(&gateway.Config{}, nil, nil).Times(1) + gatewayConfigBuilderMock.On("Build", mock.Anything, containsPipeline(pipeline), mock.Anything).Return(&gateway.Config{}, nil, nil).Times(1) gatewayApplierDeleterMock := &mocks.GatewayApplierDeleter{} gatewayApplierDeleterMock.On("ApplyResources", mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -640,7 +640,7 @@ func TestReconcile(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&pipeline).WithStatusSubresource(&pipeline).Build() gatewayConfigBuilderMock := &mocks.GatewayConfigBuilder{} - gatewayConfigBuilderMock.On("Build", mock.Anything, mock.Anything).Return(&gateway.Config{}, nil, nil) + gatewayConfigBuilderMock.On("Build", mock.Anything, mock.Anything, mock.Anything).Return(&gateway.Config{}, nil, nil) gatewayApplierDeleterMock := &mocks.GatewayApplierDeleter{} gatewayApplierDeleterMock.On("ApplyResources", mock.Anything, mock.Anything, mock.Anything).Return(nil) @@ -699,9 +699,9 @@ func TestReconcile(t *testing.T) { } if !tt.expectGatewayConfigured { - gatewayConfigBuilderMock.AssertNotCalled(t, "Build", mock.Anything, mock.Anything) + gatewayConfigBuilderMock.AssertNotCalled(t, "Build", mock.Anything, mock.Anything, mock.Anything) } else { - gatewayConfigBuilderMock.AssertCalled(t, "Build", mock.Anything, containsPipeline(pipeline)) + gatewayConfigBuilderMock.AssertCalled(t, "Build", mock.Anything, containsPipeline(pipeline), mock.Anything) } }) } diff --git a/internal/utils/k8s/cluster_info_getter.go b/internal/utils/k8s/cluster_info_getter.go index 65ceeb90f..8146e185c 100644 --- a/internal/utils/k8s/cluster_info_getter.go +++ b/internal/utils/k8s/cluster_info_getter.go @@ -2,7 +2,8 @@ package k8s import ( "context" - v1 "k8s.io/api/core/v1" + + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -14,7 +15,7 @@ type ClusterInfo struct { } func GetGardenerShootInfo(ctx context.Context, client client.Client) ClusterInfo { - shootInfo := v1.ConfigMap{} + shootInfo := corev1.ConfigMap{} err := client.Get(ctx, types.NamespacedName{ Namespace: "kube-system", Name: "shoot-info", @@ -22,7 +23,7 @@ func GetGardenerShootInfo(ctx context.Context, client client.Client) ClusterInfo if err != nil { logf.FromContext(ctx).V(1).Info("Failed get shoot-info config map") - return ClusterInfo{} + return ClusterInfo{ClusterName: "${KUBERNETES_SERVICE_HOST}"} } return ClusterInfo{ From 25f8e83e9768bbdbb4839119af2999a362572936 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 14:20:13 +0100 Subject: [PATCH 04/29] update RBAC rules --- config/rbac/role.yaml | 1 + sec-scanners-config.yaml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index af13aa4db..1f61a0455 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -273,6 +273,7 @@ rules: resources: - namespaces - pods + - nodes verbs: - get - list diff --git a/sec-scanners-config.yaml b/sec-scanners-config.yaml index 3e7956ebc..26a63d755 100644 --- a/sec-scanners-config.yaml +++ b/sec-scanners-config.yaml @@ -1,5 +1,5 @@ module-name: telemetry -protecode: +protocode: - europe-docker.pkg.dev/kyma-project/prod/telemetry-manager:main - europe-docker.pkg.dev/kyma-project/prod/directory-size-exporter:v20241212-e4adf27f - europe-docker.pkg.dev/kyma-project/prod/external/fluent/fluent-bit:3.2.2 From 9c274dd5d51642fd120556b1ad5bf0fd0e9c85ba Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 15:24:48 +0100 Subject: [PATCH 05/29] fix wrong pipeline service configuation --- internal/otelcollector/config/log/gateway/config_builder.go | 2 +- internal/otelcollector/config/log/gateway/testdata/config.yaml | 2 +- internal/otelcollector/config/metric/gateway/service.go | 2 +- .../otelcollector/config/metric/gateway/testdata/config.yaml | 2 +- .../config/metric/gateway/testdata/config_otlp_disabled.yaml | 2 +- internal/otelcollector/config/trace/gateway/config_builder.go | 2 +- .../otelcollector/config/trace/gateway/testdata/config.yaml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/otelcollector/config/log/gateway/config_builder.go b/internal/otelcollector/config/log/gateway/config_builder.go index b604e2f0b..7f8b1463b 100644 --- a/internal/otelcollector/config/log/gateway/config_builder.go +++ b/internal/otelcollector/config/log/gateway/config_builder.go @@ -104,7 +104,7 @@ func makePipelineConfig(exporterIDs ...string) config.Pipeline { Processors: []string{ "memory_limiter", "k8sattributes", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "batch", }, Exporters: exporterIDs, diff --git a/internal/otelcollector/config/log/gateway/testdata/config.yaml b/internal/otelcollector/config/log/gateway/testdata/config.yaml index 4aa1d51f9..92cd1a046 100644 --- a/internal/otelcollector/config/log/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/log/gateway/testdata/config.yaml @@ -11,7 +11,7 @@ service: processors: - memory_limiter - k8sattributes - - resource/insert-cluster-name + - resource/insert-cluster-attributes - batch exporters: - otlp/test diff --git a/internal/otelcollector/config/metric/gateway/service.go b/internal/otelcollector/config/metric/gateway/service.go index a6a00fd84..d0322b496 100644 --- a/internal/otelcollector/config/metric/gateway/service.go +++ b/internal/otelcollector/config/metric/gateway/service.go @@ -36,7 +36,7 @@ func makeOutputPipelineServiceConfig(pipeline *telemetryv1alpha1.MetricPipeline) processors = append(processors, "transform/set-instrumentation-scope-kyma") - processors = append(processors, "resource/insert-cluster-name", "resource/delete-skip-enrichment-attribute", "batch") + processors = append(processors, "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch") return config.Pipeline{ Receivers: []string{formatRoutingConnectorID(pipeline.Name), formatForwardConnectorID(pipeline.Name)}, diff --git a/internal/otelcollector/config/metric/gateway/testdata/config.yaml b/internal/otelcollector/config/metric/gateway/testdata/config.yaml index 15e4fe982..af2e37c5c 100644 --- a/internal/otelcollector/config/metric/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/metric/gateway/testdata/config.yaml @@ -31,7 +31,7 @@ service: - filter/drop-if-input-source-prometheus - filter/drop-if-input-source-istio - transform/set-instrumentation-scope-kyma - - resource/insert-cluster-name + - resource/insert-cluster-attributes - resource/delete-skip-enrichment-attribute - batch exporters: diff --git a/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml b/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml index a36a75379..86e03b8e2 100644 --- a/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml +++ b/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml @@ -32,7 +32,7 @@ service: - filter/drop-if-input-source-istio - filter/drop-if-input-source-otlp - transform/set-instrumentation-scope-kyma - - resource/insert-cluster-name + - resource/insert-cluster-attributes - resource/delete-skip-enrichment-attribute - batch exporters: diff --git a/internal/otelcollector/config/trace/gateway/config_builder.go b/internal/otelcollector/config/trace/gateway/config_builder.go index c77a1be20..70faca2d3 100644 --- a/internal/otelcollector/config/trace/gateway/config_builder.go +++ b/internal/otelcollector/config/trace/gateway/config_builder.go @@ -105,7 +105,7 @@ func makePipelineConfig(exporterIDs ...string) config.Pipeline { "memory_limiter", "k8sattributes", "filter/drop-noisy-spans", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "transform/resolve-service-name", "resource/drop-kyma-attributes", "batch", diff --git a/internal/otelcollector/config/trace/gateway/testdata/config.yaml b/internal/otelcollector/config/trace/gateway/testdata/config.yaml index 7b5cb7e27..f8cf0c7fc 100644 --- a/internal/otelcollector/config/trace/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/trace/gateway/testdata/config.yaml @@ -12,7 +12,7 @@ service: - memory_limiter - k8sattributes - filter/drop-noisy-spans - - resource/insert-cluster-name + - resource/insert-cluster-attributes - transform/resolve-service-name - resource/drop-kyma-attributes - batch From 7983e62890c91cf5847e37f8ebc7f87b625e3bc9 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 15:27:50 +0100 Subject: [PATCH 06/29] fix wrong pipeline service configuation tests --- ...-filter-support-for-telemetry-pipelines.md | 2 +- ...ulti_pipeline_gateway_with_connectors.yaml | 8 ++-- ...ngle_pipeline_gateway_with_connectors.yaml | 4 +- .../config/log/gateway/config_builder_test.go | 6 +-- .../config/metric/gateway/service_test.go | 44 +++++++++---------- .../trace/gateway/config_builder_test.go | 6 +-- 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/docs/contributor/arch/016-transform-filter-support-for-telemetry-pipelines.md b/docs/contributor/arch/016-transform-filter-support-for-telemetry-pipelines.md index 0e82d9f61..3dc7fc7da 100644 --- a/docs/contributor/arch/016-transform-filter-support-for-telemetry-pipelines.md +++ b/docs/contributor/arch/016-transform-filter-support-for-telemetry-pipelines.md @@ -124,7 +124,7 @@ service: - filter/drop-if-input-source-prometheus - filter/drop-if-input-source-istio - transform/set-instrumentation-scope-kyma - - resource/insert-cluster-name + - resource/insert-cluster-attributes - resource/delete-skip-enrichment-attribute - transform/custom - filter/custom diff --git a/docs/contributor/assets/multi_pipeline_gateway_with_connectors.yaml b/docs/contributor/assets/multi_pipeline_gateway_with_connectors.yaml index 7a0994b64..45367f687 100644 --- a/docs/contributor/assets/multi_pipeline_gateway_with_connectors.yaml +++ b/docs/contributor/assets/multi_pipeline_gateway_with_connectors.yaml @@ -31,7 +31,7 @@ data: - filter/drop-if-input-source-runtime - filter/drop-if-input-source-prometheus - filter/drop-if-input-source-istio - - resource/insert-cluster-name + - resource/insert-cluster-attributes - batch exporters: - otlp/load-test-1 @@ -58,7 +58,7 @@ data: - filter/drop-if-input-source-runtime - filter/drop-if-input-source-prometheus - filter/drop-if-input-source-istio - - resource/insert-cluster-name + - resource/insert-cluster-attributes - batch exporters: - otlp/load-test-2 @@ -85,7 +85,7 @@ data: - filter/drop-if-input-source-runtime - filter/drop-if-input-source-prometheus - filter/drop-if-input-source-istio - - resource/insert-cluster-name + - resource/insert-cluster-attributes - batch exporters: - otlp/load-test-3 @@ -165,7 +165,7 @@ data: name: k8s.pod.uid - sources: - from: connection - resource/insert-cluster-name: + resource/insert-cluster-attributes: attributes: - action: insert key: k8s.cluster.name diff --git a/docs/contributor/assets/single_pipeline_gateway_with_connectors.yaml b/docs/contributor/assets/single_pipeline_gateway_with_connectors.yaml index 21811fd86..658279688 100644 --- a/docs/contributor/assets/single_pipeline_gateway_with_connectors.yaml +++ b/docs/contributor/assets/single_pipeline_gateway_with_connectors.yaml @@ -31,7 +31,7 @@ data: - filter/drop-if-input-source-runtime - filter/drop-if-input-source-prometheus - filter/drop-if-input-source-istio - - resource/insert-cluster-name + - resource/insert-cluster-attributes - batch exporters: - otlp/load-test-1 @@ -97,7 +97,7 @@ data: name: k8s.pod.uid - sources: - from: connection - resource/insert-cluster-name: + resource/insert-cluster-attributes: attributes: - action: insert key: k8s.cluster.name diff --git a/internal/otelcollector/config/log/gateway/config_builder_test.go b/internal/otelcollector/config/log/gateway/config_builder_test.go index ae67c66dc..702ba9784 100644 --- a/internal/otelcollector/config/log/gateway/config_builder_test.go +++ b/internal/otelcollector/config/log/gateway/config_builder_test.go @@ -210,7 +210,7 @@ func TestBuildConfig(t *testing.T) { require.Equal(t, collectorConfig.Service.Pipelines["logs/test"].Processors[0], "memory_limiter") require.Equal(t, collectorConfig.Service.Pipelines["logs/test"].Processors[1], "k8sattributes") - require.Equal(t, collectorConfig.Service.Pipelines["logs/test"].Processors[2], "resource/insert-cluster-name") + require.Equal(t, collectorConfig.Service.Pipelines["logs/test"].Processors[2], "resource/insert-cluster-attributes") require.Equal(t, collectorConfig.Service.Pipelines["logs/test"].Processors[3], "batch") require.Contains(t, collectorConfig.Service.Pipelines["logs/test"].Exporters, "otlp/test") @@ -233,7 +233,7 @@ func TestBuildConfig(t *testing.T) { require.Contains(t, collectorConfig.Service.Pipelines["logs/test-1"].Receivers, "otlp") require.Equal(t, collectorConfig.Service.Pipelines["logs/test-1"].Processors[0], "memory_limiter") require.Equal(t, collectorConfig.Service.Pipelines["logs/test-1"].Processors[1], "k8sattributes") - require.Equal(t, collectorConfig.Service.Pipelines["logs/test-1"].Processors[2], "resource/insert-cluster-name") + require.Equal(t, collectorConfig.Service.Pipelines["logs/test-1"].Processors[2], "resource/insert-cluster-attributes") require.Equal(t, collectorConfig.Service.Pipelines["logs/test-1"].Processors[3], "batch") require.Contains(t, collectorConfig.Service.Pipelines, "logs/test-2") @@ -241,7 +241,7 @@ func TestBuildConfig(t *testing.T) { require.Contains(t, collectorConfig.Service.Pipelines["logs/test-2"].Receivers, "otlp") require.Equal(t, collectorConfig.Service.Pipelines["logs/test-2"].Processors[0], "memory_limiter") require.Equal(t, collectorConfig.Service.Pipelines["logs/test-2"].Processors[1], "k8sattributes") - require.Equal(t, collectorConfig.Service.Pipelines["logs/test-2"].Processors[2], "resource/insert-cluster-name") + require.Equal(t, collectorConfig.Service.Pipelines["logs/test-2"].Processors[2], "resource/insert-cluster-attributes") require.Equal(t, collectorConfig.Service.Pipelines["logs/test-2"].Processors[3], "batch") require.Contains(t, envVars, "OTLP_ENDPOINT_TEST_1") diff --git a/internal/otelcollector/config/metric/gateway/service_test.go b/internal/otelcollector/config/metric/gateway/service_test.go index 65f11250c..3f35163c1 100644 --- a/internal/otelcollector/config/metric/gateway/service_test.go +++ b/internal/otelcollector/config/metric/gateway/service_test.go @@ -47,7 +47,7 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-istio", "filter/drop-if-input-source-otlp", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-output"].Processors) @@ -81,7 +81,7 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-runtime", "filter/drop-if-input-source-istio", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-output"].Processors) @@ -116,7 +116,7 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-istio", "filter/drop-diagnostic-metrics-if-input-source-prometheus", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-output"].Processors) @@ -151,7 +151,7 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-istio", "filter/drop-diagnostic-metrics-if-input-source-prometheus", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-output"].Processors) @@ -185,7 +185,7 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-runtime", "filter/drop-if-input-source-prometheus", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-output"].Processors) @@ -220,7 +220,7 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-prometheus", "filter/drop-diagnostic-metrics-if-input-source-istio", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-output"].Processors) @@ -255,7 +255,7 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-prometheus", "filter/drop-diagnostic-metrics-if-input-source-istio", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-output"].Processors) @@ -290,7 +290,7 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-output"].Processors) @@ -325,7 +325,7 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-output"].Processors) @@ -373,7 +373,7 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-istio", "filter/test-1-filter-by-namespace-runtime-input", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-1-output"].Processors) @@ -399,7 +399,7 @@ func TestService(t *testing.T) { "filter/test-2-filter-by-namespace-prometheus-input", "filter/drop-diagnostic-metrics-if-input-source-prometheus", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-2-output"].Processors) @@ -424,7 +424,7 @@ func TestService(t *testing.T) { "filter/drop-if-input-source-prometheus", "filter/drop-diagnostic-metrics-if-input-source-istio", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, collectorConfig.Service.Pipelines["metrics/test-3-output"].Processors) @@ -456,7 +456,7 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "filter/drop-if-input-source-prometheus", "filter/drop-if-input-source-istio", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, @@ -473,7 +473,7 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "filter/drop-if-input-source-istio", "filter/drop-runtime-pod-metrics", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, @@ -489,7 +489,7 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "filter/drop-if-input-source-istio", "filter/drop-runtime-container-metrics", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, @@ -505,7 +505,7 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "filter/drop-if-input-source-istio", "filter/drop-runtime-node-metrics", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, @@ -521,7 +521,7 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "filter/drop-if-input-source-istio", "filter/drop-runtime-volume-metrics", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, @@ -537,7 +537,7 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "filter/drop-if-input-source-istio", "filter/drop-runtime-deployment-metrics", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, @@ -553,7 +553,7 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "filter/drop-if-input-source-istio", "filter/drop-runtime-daemonset-metrics", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, @@ -569,7 +569,7 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "filter/drop-if-input-source-istio", "filter/drop-runtime-statefulset-metrics", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, @@ -585,7 +585,7 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "filter/drop-if-input-source-istio", "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, @@ -615,7 +615,7 @@ func TestService_RuntimeResources_Enabled(t *testing.T) { "filter/drop-runtime-statefulset-metrics", "filter/drop-runtime-job-metrics", "transform/set-instrumentation-scope-kyma", - "resource/insert-cluster-name", + "resource/insert-cluster-attributes", "resource/delete-skip-enrichment-attribute", "batch", }, diff --git a/internal/otelcollector/config/trace/gateway/config_builder_test.go b/internal/otelcollector/config/trace/gateway/config_builder_test.go index 55b3ed0a5..dac8a08b8 100644 --- a/internal/otelcollector/config/trace/gateway/config_builder_test.go +++ b/internal/otelcollector/config/trace/gateway/config_builder_test.go @@ -208,7 +208,7 @@ func TestBuildConfig(t *testing.T) { require.Equal(t, collectorConfig.Service.Pipelines["traces/test"].Processors[0], "memory_limiter") require.Equal(t, collectorConfig.Service.Pipelines["traces/test"].Processors[1], "k8sattributes") require.Equal(t, collectorConfig.Service.Pipelines["traces/test"].Processors[2], "filter/drop-noisy-spans") - require.Equal(t, collectorConfig.Service.Pipelines["traces/test"].Processors[3], "resource/insert-cluster-name") + require.Equal(t, collectorConfig.Service.Pipelines["traces/test"].Processors[3], "resource/insert-cluster-attributes") require.Equal(t, collectorConfig.Service.Pipelines["traces/test"].Processors[4], "transform/resolve-service-name") require.Equal(t, collectorConfig.Service.Pipelines["traces/test"].Processors[5], "resource/drop-kyma-attributes") require.Equal(t, collectorConfig.Service.Pipelines["traces/test"].Processors[6], "batch") @@ -234,7 +234,7 @@ func TestBuildConfig(t *testing.T) { require.Equal(t, collectorConfig.Service.Pipelines["traces/test-1"].Processors[0], "memory_limiter") require.Equal(t, collectorConfig.Service.Pipelines["traces/test-1"].Processors[1], "k8sattributes") require.Equal(t, collectorConfig.Service.Pipelines["traces/test-1"].Processors[2], "filter/drop-noisy-spans") - require.Equal(t, collectorConfig.Service.Pipelines["traces/test-1"].Processors[3], "resource/insert-cluster-name") + require.Equal(t, collectorConfig.Service.Pipelines["traces/test-1"].Processors[3], "resource/insert-cluster-attributes") require.Equal(t, collectorConfig.Service.Pipelines["traces/test-1"].Processors[4], "transform/resolve-service-name") require.Equal(t, collectorConfig.Service.Pipelines["traces/test-1"].Processors[5], "resource/drop-kyma-attributes") require.Equal(t, collectorConfig.Service.Pipelines["traces/test-1"].Processors[6], "batch") @@ -245,7 +245,7 @@ func TestBuildConfig(t *testing.T) { require.Equal(t, collectorConfig.Service.Pipelines["traces/test-2"].Processors[0], "memory_limiter") require.Equal(t, collectorConfig.Service.Pipelines["traces/test-2"].Processors[1], "k8sattributes") require.Equal(t, collectorConfig.Service.Pipelines["traces/test-2"].Processors[2], "filter/drop-noisy-spans") - require.Equal(t, collectorConfig.Service.Pipelines["traces/test-2"].Processors[3], "resource/insert-cluster-name") + require.Equal(t, collectorConfig.Service.Pipelines["traces/test-2"].Processors[3], "resource/insert-cluster-attributes") require.Equal(t, collectorConfig.Service.Pipelines["traces/test-2"].Processors[4], "transform/resolve-service-name") require.Equal(t, collectorConfig.Service.Pipelines["traces/test-2"].Processors[5], "resource/drop-kyma-attributes") require.Equal(t, collectorConfig.Service.Pipelines["traces/test-2"].Processors[6], "batch") From 849d134f5d23a50a8334ff8ce6b8ebbdc5ea0f80 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 16:25:21 +0100 Subject: [PATCH 07/29] add configmap shhot-info from namespace kube-system to the cache --- main.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index bf9d69f8f..ceec7b865 100644 --- a/main.go +++ b/main.go @@ -183,12 +183,19 @@ func run() error { &appsv1.Deployment{}: {Field: setNamespaceFieldSelector()}, &appsv1.ReplicaSet{}: {Field: setNamespaceFieldSelector()}, &appsv1.DaemonSet{}: {Field: setNamespaceFieldSelector()}, - &corev1.ConfigMap{}: {Field: setNamespaceFieldSelector()}, &corev1.ServiceAccount{}: {Field: setNamespaceFieldSelector()}, &corev1.Service{}: {Field: setNamespaceFieldSelector()}, &networkingv1.NetworkPolicy{}: {Field: setNamespaceFieldSelector()}, &corev1.Secret{}: {Field: setNamespaceFieldSelector()}, &operatorv1alpha1.Telemetry{}: {Field: setNamespaceFieldSelector()}, + &corev1.ConfigMap{}: { + Namespaces: map[string]cache.Config{ + telemetryNamespace: {}, + "kube-system": { + FieldSelector: fields.SelectorFromSet(fields.Set{"metadata.name": "shoot-info"}), + }, + }, + }, }, }, Client: client.Options{ From 62da594bd005542ac060e7b639b9bb5a14387a94 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 16:41:05 +0100 Subject: [PATCH 08/29] re-generate sec-scan-config.yaml --- sec-scanners-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sec-scanners-config.yaml b/sec-scanners-config.yaml index 26a63d755..3e7956ebc 100644 --- a/sec-scanners-config.yaml +++ b/sec-scanners-config.yaml @@ -1,5 +1,5 @@ module-name: telemetry -protocode: +protecode: - europe-docker.pkg.dev/kyma-project/prod/telemetry-manager:main - europe-docker.pkg.dev/kyma-project/prod/directory-size-exporter:v20241212-e4adf27f - europe-docker.pkg.dev/kyma-project/prod/external/fluent/fluent-bit:3.2.2 From 66f9394e7f62ed00f69afceebfe21ac5c9de4952 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 17:06:33 +0100 Subject: [PATCH 09/29] adjust cluster roles for OTel based gateways --- config/rbac/role.yaml | 2 -- internal/resources/otelcollector/rbac.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 1f61a0455..bcd7d2dcb 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -219,7 +219,6 @@ rules: resources: - namespaces - pods - - nodes verbs: - get - list @@ -273,7 +272,6 @@ rules: resources: - namespaces - pods - - nodes verbs: - get - list diff --git a/internal/resources/otelcollector/rbac.go b/internal/resources/otelcollector/rbac.go index 890456916..98bcf87f6 100644 --- a/internal/resources/otelcollector/rbac.go +++ b/internal/resources/otelcollector/rbac.go @@ -220,7 +220,7 @@ func withK8sAttributeRules() ClusterRoleOption { // policy rules needed for the k8sattributeprocessor component k8sAttributeRules := []rbacv1.PolicyRule{{ APIGroups: []string{""}, - Resources: []string{"namespaces", "pods"}, + Resources: []string{"namespaces", "pods", "nodes"}, Verbs: []string{"get", "list", "watch"}, }, { APIGroups: []string{"apps"}, From 2863e472550e91d5725cd82fa8db4d1b55e56550 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 17:16:02 +0100 Subject: [PATCH 10/29] fix otel gateway unit tests --- internal/resources/otelcollector/testdata/log-gateway.yaml | 1 + .../resources/otelcollector/testdata/metric-gateway-istio.yaml | 1 + internal/resources/otelcollector/testdata/metric-gateway.yaml | 1 + internal/resources/otelcollector/testdata/trace-gateway.yaml | 1 + 4 files changed, 4 insertions(+) diff --git a/internal/resources/otelcollector/testdata/log-gateway.yaml b/internal/resources/otelcollector/testdata/log-gateway.yaml index 39eeab07f..3100cbe76 100644 --- a/internal/resources/otelcollector/testdata/log-gateway.yaml +++ b/internal/resources/otelcollector/testdata/log-gateway.yaml @@ -231,6 +231,7 @@ rules: resources: - namespaces - pods + - nodes verbs: - get - list diff --git a/internal/resources/otelcollector/testdata/metric-gateway-istio.yaml b/internal/resources/otelcollector/testdata/metric-gateway-istio.yaml index 74d9cc436..4db08459f 100644 --- a/internal/resources/otelcollector/testdata/metric-gateway-istio.yaml +++ b/internal/resources/otelcollector/testdata/metric-gateway-istio.yaml @@ -233,6 +233,7 @@ rules: resources: - namespaces - pods + - nodes verbs: - get - list diff --git a/internal/resources/otelcollector/testdata/metric-gateway.yaml b/internal/resources/otelcollector/testdata/metric-gateway.yaml index 9148cc42a..69c51d82a 100644 --- a/internal/resources/otelcollector/testdata/metric-gateway.yaml +++ b/internal/resources/otelcollector/testdata/metric-gateway.yaml @@ -231,6 +231,7 @@ rules: resources: - namespaces - pods + - nodes verbs: - get - list diff --git a/internal/resources/otelcollector/testdata/trace-gateway.yaml b/internal/resources/otelcollector/testdata/trace-gateway.yaml index b8ab59b71..0d2e56a26 100644 --- a/internal/resources/otelcollector/testdata/trace-gateway.yaml +++ b/internal/resources/otelcollector/testdata/trace-gateway.yaml @@ -231,6 +231,7 @@ rules: resources: - namespaces - pods + - nodes verbs: - get - list From 469115ebddaf98a50e377b18cb3448b1438475f1 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 19:49:38 +0100 Subject: [PATCH 11/29] revert doc changes --- .../016-transform-filter-support-for-telemetry-pipelines.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contributor/arch/016-transform-filter-support-for-telemetry-pipelines.md b/docs/contributor/arch/016-transform-filter-support-for-telemetry-pipelines.md index 3dc7fc7da..0e82d9f61 100644 --- a/docs/contributor/arch/016-transform-filter-support-for-telemetry-pipelines.md +++ b/docs/contributor/arch/016-transform-filter-support-for-telemetry-pipelines.md @@ -124,7 +124,7 @@ service: - filter/drop-if-input-source-prometheus - filter/drop-if-input-source-istio - transform/set-instrumentation-scope-kyma - - resource/insert-cluster-attributes + - resource/insert-cluster-name - resource/delete-skip-enrichment-attribute - transform/custom - filter/custom From 84d7847fb263b2b7ec8f806a117cd2034a3c36e8 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 20:22:37 +0100 Subject: [PATCH 12/29] update cache config --- main.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/main.go b/main.go index ceec7b865..542a32478 100644 --- a/main.go +++ b/main.go @@ -176,26 +176,24 @@ func run() error { }), Cache: cache.Options{ SyncPeriod: ptr.To(cacheSyncPeriod), - + DefaultNamespaces: map[string]cache.Config{ + telemetryNamespace: {}, + "kube-system": { + FieldSelector: fields.SelectorFromSet(fields.Set{"metadata.name": "shoot-info"}), + }, + }, // The operator handles various resource that are namespace-scoped, and additionally some resources that are cluster-scoped (clusterroles, clusterrolebindings, etc.). // For namespace-scoped resources we want to restrict the operator permissions to only fetch resources from a given namespace. ByObject: map[client.Object]cache.ByObject{ &appsv1.Deployment{}: {Field: setNamespaceFieldSelector()}, &appsv1.ReplicaSet{}: {Field: setNamespaceFieldSelector()}, &appsv1.DaemonSet{}: {Field: setNamespaceFieldSelector()}, + &corev1.ConfigMap{}: {}, &corev1.ServiceAccount{}: {Field: setNamespaceFieldSelector()}, &corev1.Service{}: {Field: setNamespaceFieldSelector()}, &networkingv1.NetworkPolicy{}: {Field: setNamespaceFieldSelector()}, &corev1.Secret{}: {Field: setNamespaceFieldSelector()}, &operatorv1alpha1.Telemetry{}: {Field: setNamespaceFieldSelector()}, - &corev1.ConfigMap{}: { - Namespaces: map[string]cache.Config{ - telemetryNamespace: {}, - "kube-system": { - FieldSelector: fields.SelectorFromSet(fields.Set{"metadata.name": "shoot-info"}), - }, - }, - }, }, }, Client: client.Options{ From 4148ecbb3da02d16f9d7c9ac727c196f34a13013 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 20:38:18 +0100 Subject: [PATCH 13/29] update cache settings --- main.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/main.go b/main.go index 542a32478..0253a3dc4 100644 --- a/main.go +++ b/main.go @@ -176,19 +176,21 @@ func run() error { }), Cache: cache.Options{ SyncPeriod: ptr.To(cacheSyncPeriod), - DefaultNamespaces: map[string]cache.Config{ - telemetryNamespace: {}, - "kube-system": { - FieldSelector: fields.SelectorFromSet(fields.Set{"metadata.name": "shoot-info"}), - }, - }, + // The operator handles various resource that are namespace-scoped, and additionally some resources that are cluster-scoped (clusterroles, clusterrolebindings, etc.). // For namespace-scoped resources we want to restrict the operator permissions to only fetch resources from a given namespace. ByObject: map[client.Object]cache.ByObject{ - &appsv1.Deployment{}: {Field: setNamespaceFieldSelector()}, - &appsv1.ReplicaSet{}: {Field: setNamespaceFieldSelector()}, - &appsv1.DaemonSet{}: {Field: setNamespaceFieldSelector()}, - &corev1.ConfigMap{}: {}, + &appsv1.Deployment{}: {Field: setNamespaceFieldSelector()}, + &appsv1.ReplicaSet{}: {Field: setNamespaceFieldSelector()}, + &appsv1.DaemonSet{}: {Field: setNamespaceFieldSelector()}, + &corev1.ConfigMap{}: { + Namespaces: map[string]cache.Config{ + "kube-system": { + FieldSelector: fields.SelectorFromSet(fields.Set{"metadata.name": "shoot-info"}), + }, + telemetryNamespace: {}, + }, + }, &corev1.ServiceAccount{}: {Field: setNamespaceFieldSelector()}, &corev1.Service{}: {Field: setNamespaceFieldSelector()}, &networkingv1.NetworkPolicy{}: {Field: setNamespaceFieldSelector()}, From f7f1ed73052a1be39d7ae4ef97b7c25744944e36 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Wed, 22 Jan 2025 20:55:21 +0100 Subject: [PATCH 14/29] update rbac rules --- config/rbac/role.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index bcd7d2dcb..ef2ed5d71 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -11,6 +11,7 @@ rules: - "" resources: - secrets + - configmaps verbs: - get - list From 6bb096800591d0feb8e39e62045034fca70f881d Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Thu, 23 Jan 2025 07:43:35 +0100 Subject: [PATCH 15/29] add unit test for cluster info getter --- .../utils/k8s/cluster_info_getter_test.go | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 internal/utils/k8s/cluster_info_getter_test.go diff --git a/internal/utils/k8s/cluster_info_getter_test.go b/internal/utils/k8s/cluster_info_getter_test.go new file mode 100644 index 000000000..78b12cc4d --- /dev/null +++ b/internal/utils/k8s/cluster_info_getter_test.go @@ -0,0 +1,39 @@ +package k8s + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client/fake" +) + +func TestClusterInfoGetter(t *testing.T) { + t.Run("Gardener cluster", func(t *testing.T) { + shootInfo := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Name: "shoot-info", Namespace: "kube-system"}, + Data: map[string]string{ + "shootName": "test-cluster", + "provider": "test-provider", + }, + } + + fakeClient := fake.NewClientBuilder().WithObjects(shootInfo).Build() + + clusterInfo := GetGardenerShootInfo(context.Background(), fakeClient) + + require.Equal(t, clusterInfo.ClusterName, "test-cluster") + require.Equal(t, clusterInfo.CloudProvider, "test-provider") + }) + + t.Run("Non Gardener cluster", func(t *testing.T) { + fakeClient := fake.NewClientBuilder().WithObjects().Build() + + clusterInfo := GetGardenerShootInfo(context.Background(), fakeClient) + + require.Equal(t, clusterInfo.ClusterName, "${KUBERNETES_SERVICE_HOST}") + require.Equal(t, clusterInfo.CloudProvider, "") + }) +} From edeb602d68ddd85244f8ecffa1b80ac70813f750 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Thu, 23 Jan 2025 07:52:16 +0100 Subject: [PATCH 16/29] refactor the cluster info getter --- internal/utils/k8s/cluster_info_getter.go | 28 ++++++++++++++++------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/internal/utils/k8s/cluster_info_getter.go b/internal/utils/k8s/cluster_info_getter.go index 8146e185c..4c3710dbe 100644 --- a/internal/utils/k8s/cluster_info_getter.go +++ b/internal/utils/k8s/cluster_info_getter.go @@ -2,13 +2,24 @@ package k8s import ( "context" + "k8s.io/apimachinery/pkg/types" corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" ) +const ( + defaultClusterName = "${KUBERNETES_SERVICE_HOST}" + gardenerShootNameAttributeName = "shootName" + gardenerCloudProviderAttributeName = "provider" +) + +var defaultGardenerShootInfoCM = types.NamespacedName{ + Namespace: "kube-system", + Name: "shoot-info", +} + type ClusterInfo struct { ClusterName string CloudProvider string @@ -16,18 +27,19 @@ type ClusterInfo struct { func GetGardenerShootInfo(ctx context.Context, client client.Client) ClusterInfo { shootInfo := corev1.ConfigMap{} - err := client.Get(ctx, types.NamespacedName{ - Namespace: "kube-system", - Name: "shoot-info", - }, &shootInfo) + err := client.Get(ctx, defaultGardenerShootInfoCM, &shootInfo) + + // The shoot-info config map is used to store information about the Gardener cluster, such as the cluster name and the cloud provider. + // If cluster in a non Gardener cluster, the shoot-info config map will not exist, so we return the default values. if err != nil { logf.FromContext(ctx).V(1).Info("Failed get shoot-info config map") - return ClusterInfo{ClusterName: "${KUBERNETES_SERVICE_HOST}"} + + return ClusterInfo{ClusterName: defaultClusterName} } return ClusterInfo{ - ClusterName: shootInfo.Data["shootName"], - CloudProvider: shootInfo.Data["provider"], + ClusterName: shootInfo.Data[gardenerShootNameAttributeName], + CloudProvider: shootInfo.Data[gardenerCloudProviderAttributeName], } } From 3792f3078af462c13aad74387b2a3b3f748e6991 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Thu, 23 Jan 2025 08:06:14 +0100 Subject: [PATCH 17/29] fix linter issues --- internal/utils/k8s/cluster_info_getter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/utils/k8s/cluster_info_getter.go b/internal/utils/k8s/cluster_info_getter.go index 4c3710dbe..ab90e67ce 100644 --- a/internal/utils/k8s/cluster_info_getter.go +++ b/internal/utils/k8s/cluster_info_getter.go @@ -2,9 +2,9 @@ package k8s import ( "context" - "k8s.io/apimachinery/pkg/types" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" ) From 8e7ae43a5ed80e6ac02657f8a0ff6479d689a8f2 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Fri, 24 Jan 2025 13:37:34 +0100 Subject: [PATCH 18/29] add host.arch and host.type attrbiutes to the k8sattribute processor --- .../config/gatewayprocs/k8s_attribute_proc.go | 10 ++++++++++ .../config/gatewayprocs/k8s_attribute_proc_test.go | 10 ++++++++++ .../config/log/gateway/testdata/config.yaml | 6 ++++++ .../config/metric/gateway/testdata/config.yaml | 6 ++++++ .../metric/gateway/testdata/config_otlp_disabled.yaml | 6 ++++++ .../config/trace/gateway/testdata/config.yaml | 6 ++++++ 6 files changed, 44 insertions(+) diff --git a/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc.go b/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc.go index 842e29d53..a74e4fc7a 100644 --- a/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc.go +++ b/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc.go @@ -61,5 +61,15 @@ func extractLabels() []config.ExtractLabel { Key: "topology.kubernetes.io/zone", TagName: "cloud.availability_zone", }, + { + From: "node", + Key: "node.kubernetes.io/instance-type", + TagName: "host.type", + }, + { + From: "node", + Key: "kubernetes.io/arch", + TagName: "host.arch", + }, } } diff --git a/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc_test.go b/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc_test.go index f4d3fe321..72fc9f6cf 100644 --- a/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc_test.go +++ b/internal/otelcollector/config/gatewayprocs/k8s_attribute_proc_test.go @@ -53,6 +53,16 @@ func TestK8sAttributesProcessorConfig(t *testing.T) { Key: "topology.kubernetes.io/zone", TagName: "cloud.availability_zone", }, + { + From: "node", + Key: "node.kubernetes.io/instance-type", + TagName: "host.type", + }, + { + From: "node", + Key: "kubernetes.io/arch", + TagName: "host.arch", + }, } config := K8sAttributesProcessorConfig() diff --git a/internal/otelcollector/config/log/gateway/testdata/config.yaml b/internal/otelcollector/config/log/gateway/testdata/config.yaml index 92cd1a046..a3577c1f4 100644 --- a/internal/otelcollector/config/log/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/log/gateway/testdata/config.yaml @@ -71,6 +71,12 @@ processors: - from: node key: topology.kubernetes.io/zone tag_name: cloud.availability_zone + - from: node + key: node.kubernetes.io/instance-type + tag_name: host.type + - from: node + key: kubernetes.io/arch + tag_name: host.arch pod_association: - sources: - from: resource_attribute diff --git a/internal/otelcollector/config/metric/gateway/testdata/config.yaml b/internal/otelcollector/config/metric/gateway/testdata/config.yaml index af2e37c5c..d60bf17dd 100644 --- a/internal/otelcollector/config/metric/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/metric/gateway/testdata/config.yaml @@ -114,6 +114,12 @@ processors: - from: node key: topology.kubernetes.io/zone tag_name: cloud.availability_zone + - from: node + key: node.kubernetes.io/instance-type + tag_name: host.type + - from: node + key: kubernetes.io/arch + tag_name: host.arch pod_association: - sources: - from: resource_attribute diff --git a/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml b/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml index 86e03b8e2..341432711 100644 --- a/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml +++ b/internal/otelcollector/config/metric/gateway/testdata/config_otlp_disabled.yaml @@ -115,6 +115,12 @@ processors: - from: node key: topology.kubernetes.io/zone tag_name: cloud.availability_zone + - from: node + key: node.kubernetes.io/instance-type + tag_name: host.type + - from: node + key: kubernetes.io/arch + tag_name: host.arch pod_association: - sources: - from: resource_attribute diff --git a/internal/otelcollector/config/trace/gateway/testdata/config.yaml b/internal/otelcollector/config/trace/gateway/testdata/config.yaml index f8cf0c7fc..bb04ebb0e 100644 --- a/internal/otelcollector/config/trace/gateway/testdata/config.yaml +++ b/internal/otelcollector/config/trace/gateway/testdata/config.yaml @@ -74,6 +74,12 @@ processors: - from: node key: topology.kubernetes.io/zone tag_name: cloud.availability_zone + - from: node + key: node.kubernetes.io/instance-type + tag_name: host.type + - from: node + key: kubernetes.io/arch + tag_name: host.arch pod_association: - sources: - from: resource_attribute From 388ba5eb833fe68eec5f6b02bf8ab011077a037d Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Mon, 27 Jan 2025 08:19:45 +0100 Subject: [PATCH 19/29] fix failing e2e tests --- test/e2e/metrics_runtime_input_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/metrics_runtime_input_test.go b/test/e2e/metrics_runtime_input_test.go index 96e5ef875..a40dde19a 100644 --- a/test/e2e/metrics_runtime_input_test.go +++ b/test/e2e/metrics_runtime_input_test.go @@ -449,7 +449,7 @@ func backendContainsDesiredResourceAttributes(proxyClient *apiserverproxy.Client g.Expect(resp).To(HaveHTTPBody(HaveFlatMetrics( ContainElement(SatisfyAll( HaveName(Equal(metricName)), - HaveResourceAttributes(HaveKeys(ConsistOf(resourceAttributes))), + HaveResourceAttributes(HaveKeys(ContainElements(resourceAttributes))), )), ))) }, 3*periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), "Failed to find metric %s with resource attributes %v", metricName, resourceAttributes) From 455ee73f7bca7e664348e7e2ab1241d9609575a3 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Mon, 27 Jan 2025 09:31:13 +0100 Subject: [PATCH 20/29] add cloud provider attribute tests --- hack/make/provision.mk | 2 +- test/e2e/metrics_runtime_input_test.go | 2 +- test/testkit/metrics/runtime/pod.go | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hack/make/provision.mk b/hack/make/provision.mk index f4ae87424..16057cff2 100644 --- a/hack/make/provision.mk +++ b/hack/make/provision.mk @@ -1,7 +1,7 @@ ##@ k3d .PHONY: provision-k3d provision-k3d: $(K3D) - $(K3D) cluster create --image rancher/k3s:v$(strip $(K3S_K8S_VERSION))-k3s1 --config .k3d-kyma.yaml + $(K3D) cluster create --image rancher/k3s:v$(strip $(K3S_K8S_VERSION))-k3s1 --config .k3d-kyma.yaml --k3s-node-label "topology.kubernetes.io/region=testregion@server:0" --k3s-node-label "topology.kubernetes.io/zone=testzone@server:0" --k3s-node-label "node.kubernetes.io/instance-type=testmach@server:0" --k3s-node-label "kubernetes.io/arch=testarch@server:0" kubectl create ns kyma-system .PHONY: provision-k3d-istio diff --git a/test/e2e/metrics_runtime_input_test.go b/test/e2e/metrics_runtime_input_test.go index a40dde19a..7119e6d0c 100644 --- a/test/e2e/metrics_runtime_input_test.go +++ b/test/e2e/metrics_runtime_input_test.go @@ -31,7 +31,7 @@ import ( "github.com/kyma-project/telemetry-manager/test/testkit/suite" ) -var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label(suite.LabelSetA), Ordered, func() { +var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label("ttt"), Ordered, func() { Context("When metric pipelines with runtime resources metrics enabled exist", Ordered, func() { var ( mockNs = suite.ID() diff --git a/test/testkit/metrics/runtime/pod.go b/test/testkit/metrics/runtime/pod.go index 71a0a559b..aaab0c379 100644 --- a/test/testkit/metrics/runtime/pod.go +++ b/test/testkit/metrics/runtime/pod.go @@ -33,6 +33,10 @@ var ( "k8s.pod.name", "k8s.pod.uid", "service.name", + "cloud.region", + "cloud.availability_zone", + "host.type", + "host.arch", } PodMetricsAttributes = map[string][]string{ From d743a309c9e319027fb5ef6ae7a76f081ee92107 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Mon, 27 Jan 2025 09:47:10 +0100 Subject: [PATCH 21/29] move node lables config tot he k2d config file --- .k3d-kyma.yaml | 16 ++++++++++++++++ hack/make/provision.mk | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.k3d-kyma.yaml b/.k3d-kyma.yaml index af1a4f8fb..bb7197e23 100644 --- a/.k3d-kyma.yaml +++ b/.k3d-kyma.yaml @@ -12,3 +12,19 @@ registries: name: kyma hostPort: '5001' +options: + k3s: + nodeLabels: + - label: topology.kubernetes.io/region=test_region + nodeFilters: + - server:* + - label: topology.kubernetes.io/zone=test_zone + nodeFilters: + - server:* + - label: node.kubernetes.io/instance-type=test_instance + nodeFilters: + - server:* + - label: kubernetes.io/arch=test_arch + nodeFilters: + - server:* + diff --git a/hack/make/provision.mk b/hack/make/provision.mk index 16057cff2..f4ae87424 100644 --- a/hack/make/provision.mk +++ b/hack/make/provision.mk @@ -1,7 +1,7 @@ ##@ k3d .PHONY: provision-k3d provision-k3d: $(K3D) - $(K3D) cluster create --image rancher/k3s:v$(strip $(K3S_K8S_VERSION))-k3s1 --config .k3d-kyma.yaml --k3s-node-label "topology.kubernetes.io/region=testregion@server:0" --k3s-node-label "topology.kubernetes.io/zone=testzone@server:0" --k3s-node-label "node.kubernetes.io/instance-type=testmach@server:0" --k3s-node-label "kubernetes.io/arch=testarch@server:0" + $(K3D) cluster create --image rancher/k3s:v$(strip $(K3S_K8S_VERSION))-k3s1 --config .k3d-kyma.yaml kubectl create ns kyma-system .PHONY: provision-k3d-istio From 86b8aaa0653637d1454f065afd0536a5f782f4b9 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Mon, 27 Jan 2025 10:18:47 +0100 Subject: [PATCH 22/29] add gardener shoot-info e2e test --- test/e2e/metrics_runtime_input_test.go | 2 ++ test/testkit/k8s/configmap.go | 37 ++++++++++++++++++++++++++ test/testkit/metrics/runtime/pod.go | 1 + 3 files changed, 40 insertions(+) create mode 100644 test/testkit/k8s/configmap.go diff --git a/test/e2e/metrics_runtime_input_test.go b/test/e2e/metrics_runtime_input_test.go index 7119e6d0c..e9bce0ca9 100644 --- a/test/e2e/metrics_runtime_input_test.go +++ b/test/e2e/metrics_runtime_input_test.go @@ -63,6 +63,8 @@ var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label("ttt"), Ordered, f var objs []client.Object objs = append(objs, kitk8s.NewNamespace(mockNs).K8sObject()) + objs = append(objs, kitk8s.NewConfigMap("shoot-info", "kube-system").WithData("shootName", "kyma-telemetry").WithData("provider", "k3d").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) diff --git a/test/testkit/k8s/configmap.go b/test/testkit/k8s/configmap.go new file mode 100644 index 000000000..31ba82f0e --- /dev/null +++ b/test/testkit/k8s/configmap.go @@ -0,0 +1,37 @@ +package k8s + +import ( + "maps" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type ConfigMap struct { + name string + namespace string + data map[string]string +} + +func NewConfigMap(cfName, ns string) *ConfigMap { + return &ConfigMap{ + name: cfName, + namespace: ns, + data: make(map[string]string), + } +} + +func (c *ConfigMap) WithData(key, value string) *ConfigMap { + maps.Copy(c.data, map[string]string{key: value}) + return c +} + +func (c *ConfigMap) K8sObject() *corev1.ConfigMap { + return &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: c.name, + Namespace: c.namespace, + }, + Data: c.data, + } +} diff --git a/test/testkit/metrics/runtime/pod.go b/test/testkit/metrics/runtime/pod.go index aaab0c379..b8cd7197b 100644 --- a/test/testkit/metrics/runtime/pod.go +++ b/test/testkit/metrics/runtime/pod.go @@ -37,6 +37,7 @@ var ( "cloud.availability_zone", "host.type", "host.arch", + "cloud.provider", } PodMetricsAttributes = map[string][]string{ From c90e93239593a54d4c73e26353a714a05580ee33 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Mon, 27 Jan 2025 10:36:37 +0100 Subject: [PATCH 23/29] update k3d config --- .k3d-kyma.yaml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.k3d-kyma.yaml b/.k3d-kyma.yaml index bb7197e23..1cd12e009 100644 --- a/.k3d-kyma.yaml +++ b/.k3d-kyma.yaml @@ -15,16 +15,12 @@ registries: options: k3s: nodeLabels: - - label: topology.kubernetes.io/region=test_region + - label: topology.kubernetes.io/region=kyma-local nodeFilters: - server:* - - label: topology.kubernetes.io/zone=test_zone + - label: topology.kubernetes.io/zone=kyma-local nodeFilters: - server:* - - label: node.kubernetes.io/instance-type=test_instance + - label: node.kubernetes.io/instance-type=local nodeFilters: - server:* - - label: kubernetes.io/arch=test_arch - nodeFilters: - - server:* - From cdeb3e259ae1cfd1d918d5b5d4cc60ade2380ee9 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Mon, 27 Jan 2025 15:37:21 +0100 Subject: [PATCH 24/29] add more e2e test --- test/e2e/metrics_runtime_input_test.go | 28 +++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/test/e2e/metrics_runtime_input_test.go b/test/e2e/metrics_runtime_input_test.go index e9bce0ca9..3da579690 100644 --- a/test/e2e/metrics_runtime_input_test.go +++ b/test/e2e/metrics_runtime_input_test.go @@ -3,6 +3,8 @@ package e2e import ( + "fmt" + "io" "net/http" "slices" @@ -31,7 +33,7 @@ import ( "github.com/kyma-project/telemetry-manager/test/testkit/suite" ) -var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label("ttt"), Ordered, func() { +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() @@ -208,6 +210,13 @@ var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label("ttt"), Ordered, f backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, runtime.PodMetricsNames) backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "k8s.pod.cpu.time", runtime.PodMetricsResourceAttributes) + backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "cloud.region", "kyma-local") + backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "cloud.availability_zone", "kyma-local") + backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "host.type", "local") + backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "host.arch", "amd64") + backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "k8s.cluster.name", "kyma-telemetry") + backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "cloud.provider", "k3d") + podNetworkErrorsMetric := "k8s.pod.network.errors" backendContainsDesiredMetricAttributes(proxyClient, backendResourceMetricsEnabledURLA, podNetworkErrorsMetric, runtime.PodMetricsAttributes[podNetworkErrorsMetric]) @@ -472,3 +481,20 @@ func backendContainsDesiredMetricAttributes(proxyClient *apiserverproxy.Client, ))) }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), "Failed to find metric %s with metric attributes %v", metricName, metricAttributes) } + +func backendContainsDesiredCloudResourceAttributes(proxyClient *apiserverproxy.Client, backendExportURL string, attribute string, attributeValue string) { + Eventually(func(g Gomega) { + resp, err := proxyClient.Get(backendExportURL) + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) + + bodyContent, err := io.ReadAll(resp.Body) + defer resp.Body.Close() + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(bodyContent).To(HaveFlatMetrics( + ContainElement(SatisfyAll( + HaveResourceAttributes(HaveKeyWithValue(attribute, attributeValue)), + )), + )) + }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), fmt.Sprintf("could not find metrics matching resource attribute %s, value %s", attribute, attributeValue)) +} From 8d356cd281b62af0ad60f493b16b2cc5c701e74a Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Tue, 28 Jan 2025 16:12:25 +0100 Subject: [PATCH 25/29] add gardener and k3d integration test --- test/e2e/metrics_runtime_input_test.go | 28 --- .../istio/metric_cloud_provider_test.go | 167 ++++++++++++++++++ test/testkit/k8s/configmap.go | 8 + test/testkit/metrics/runtime/pod.go | 5 - 4 files changed, 175 insertions(+), 33 deletions(-) create mode 100644 test/integration/istio/metric_cloud_provider_test.go diff --git a/test/e2e/metrics_runtime_input_test.go b/test/e2e/metrics_runtime_input_test.go index 3da579690..a40dde19a 100644 --- a/test/e2e/metrics_runtime_input_test.go +++ b/test/e2e/metrics_runtime_input_test.go @@ -3,8 +3,6 @@ package e2e import ( - "fmt" - "io" "net/http" "slices" @@ -65,8 +63,6 @@ var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label(suite.LabelSetA), var objs []client.Object objs = append(objs, kitk8s.NewNamespace(mockNs).K8sObject()) - objs = append(objs, kitk8s.NewConfigMap("shoot-info", "kube-system").WithData("shootName", "kyma-telemetry").WithData("provider", "k3d").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) @@ -210,13 +206,6 @@ var _ = Describe(suite.ID(), Label(suite.LabelMetrics), Label(suite.LabelSetA), backendContainsMetricsDeliveredForResource(proxyClient, backendResourceMetricsEnabledURLA, runtime.PodMetricsNames) backendContainsDesiredResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "k8s.pod.cpu.time", runtime.PodMetricsResourceAttributes) - backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "cloud.region", "kyma-local") - backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "cloud.availability_zone", "kyma-local") - backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "host.type", "local") - backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "host.arch", "amd64") - backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "k8s.cluster.name", "kyma-telemetry") - backendContainsDesiredCloudResourceAttributes(proxyClient, backendResourceMetricsEnabledURLA, "cloud.provider", "k3d") - podNetworkErrorsMetric := "k8s.pod.network.errors" backendContainsDesiredMetricAttributes(proxyClient, backendResourceMetricsEnabledURLA, podNetworkErrorsMetric, runtime.PodMetricsAttributes[podNetworkErrorsMetric]) @@ -481,20 +470,3 @@ func backendContainsDesiredMetricAttributes(proxyClient *apiserverproxy.Client, ))) }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), "Failed to find metric %s with metric attributes %v", metricName, metricAttributes) } - -func backendContainsDesiredCloudResourceAttributes(proxyClient *apiserverproxy.Client, backendExportURL string, attribute string, attributeValue string) { - Eventually(func(g Gomega) { - resp, err := proxyClient.Get(backendExportURL) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) - - bodyContent, err := io.ReadAll(resp.Body) - defer resp.Body.Close() - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(bodyContent).To(HaveFlatMetrics( - ContainElement(SatisfyAll( - HaveResourceAttributes(HaveKeyWithValue(attribute, attributeValue)), - )), - )) - }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), fmt.Sprintf("could not find metrics matching resource attribute %s, value %s", attribute, attributeValue)) -} diff --git a/test/integration/istio/metric_cloud_provider_test.go b/test/integration/istio/metric_cloud_provider_test.go new file mode 100644 index 000000000..4f0c9b653 --- /dev/null +++ b/test/integration/istio/metric_cloud_provider_test.go @@ -0,0 +1,167 @@ +//go:build istio + +package istio + +import ( + "fmt" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "io" + "k8s.io/apimachinery/pkg/types" + "net/http" + "sigs.k8s.io/controller-runtime/pkg/client" + + "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/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.LabelIntegration), Label(suite.LabelMetrics), Label(suite.LabelSetA), Ordered, func() { + Context("When metric pipelines with cloud provider resources metrics exist", Ordered, func() { + var ( + mockNs = suite.ID() + + backendName = suite.IDWithSuffix("resource-metrics") + pipelineName = suite.IDWithSuffix("resource-metrics") + backendURL string + + DeploymentName = suite.IDWithSuffix("deployment") + ) + + makeResources := func() []client.Object { + var objs []client.Object + objs = append(objs, kitk8s.NewNamespace(mockNs).K8sObject()) + objs = append(objs, kitk8s.NewConfigMap("shoot-info", "kube-system").WithData("shootName", "kyma-telemetry").WithData("provider", "k3d").WithLabel(kitk8s.PersistentLabelName, "true").K8sObject()) + + backend := backend.New(mockNs, backend.SignalTypeMetrics, backend.WithName(backendName)) + objs = append(objs, backend.K8sObjects()...) + backendURL = backend.ExportURL(proxyClient) + + pipeline := testutils.NewMetricPipelineBuilder(). + WithName(pipelineName). + WithRuntimeInput(true). + WithRuntimeInputContainerMetrics(true). + WithRuntimeInputPodMetrics(true). + WithRuntimeInputNodeMetrics(true). + WithRuntimeInputVolumeMetrics(true). + WithRuntimeInputDeploymentMetrics(false). + WithRuntimeInputStatefulSetMetrics(false). + WithRuntimeInputDaemonSetMetrics(false). + WithRuntimeInputJobMetrics(false). + WithOTLPOutput(testutils.OTLPEndpoint(backend.Endpoint())). + Build() + objs = append(objs, &pipeline) + + 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(), + }...) + + 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, pipelineName) + }) + + It("Ensures the metric gateway deployment is ready", func() { + assert.DeploymentReady(ctx, k8sClient, kitkyma.MetricGatewayName) + }) + + It("Should have metrics backends running", func() { + assert.DeploymentReady(ctx, k8sClient, types.NamespacedName{Name: backendName, Namespace: mockNs}) + assert.ServiceReady(ctx, k8sClient, types.NamespacedName{Name: backendName, Namespace: mockNs}) + }) + + It("should have workloads created properly", func() { + assert.DeploymentReady(ctx, k8sClient, types.NamespacedName{Name: DeploymentName, Namespace: mockNs}) + }) + + It("Ensures accessibility of metric agent metrics endpoint", func() { + agentMetricsURL := proxyClient.ProxyURLForService(kitkyma.MetricAgentMetricsService.Namespace, kitkyma.MetricAgentMetricsService.Name, "metrics", ports.Metrics) + assert.EmitsOTelCollectorMetrics(proxyClient, agentMetricsURL) + }) + + Context("Pipeline A should deliver pod metrics", Ordered, func() { + It("Should deliver pod metrics with expected cloud resource attributes", func() { + backendContainsDesiredCloudResourceAttributes(proxyClient, backendURL, "cloud.region") + backendContainsDesiredCloudResourceAttributes(proxyClient, backendURL, "cloud.availability_zone") + backendContainsDesiredCloudResourceAttributes(proxyClient, backendURL, "host.type") + backendContainsDesiredCloudResourceAttributes(proxyClient, backendURL, "host.arch") + backendContainsDesiredCloudResourceAttributes(proxyClient, backendURL, "k8s.cluster.name") + backendContainsDesiredCloudResourceAttributes(proxyClient, backendURL, "cloud.provider") + }) + }) + }) +}) + +// 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 backendContainsDesiredCloudResourceAttributes(proxyClient *apiserverproxy.Client, backendExportURL, attribute string) { + Eventually(func(g Gomega) { + resp, err := proxyClient.Get(backendExportURL) + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(resp).To(HaveHTTPStatus(http.StatusOK)) + + bodyContent, err := io.ReadAll(resp.Body) + defer resp.Body.Close() + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(bodyContent).To(HaveFlatMetrics( + ContainElement(SatisfyAll( + HaveResourceAttributes(HaveKey(attribute)), + )), + )) + }, periodic.TelemetryEventuallyTimeout, periodic.TelemetryInterval).Should(Succeed(), fmt.Sprintf("could not find metrics matching resource attribute %s", attribute)) +} diff --git a/test/testkit/k8s/configmap.go b/test/testkit/k8s/configmap.go index 31ba82f0e..a04b7d442 100644 --- a/test/testkit/k8s/configmap.go +++ b/test/testkit/k8s/configmap.go @@ -11,6 +11,7 @@ type ConfigMap struct { name string namespace string data map[string]string + labels map[string]string } func NewConfigMap(cfName, ns string) *ConfigMap { @@ -18,6 +19,7 @@ func NewConfigMap(cfName, ns string) *ConfigMap { name: cfName, namespace: ns, data: make(map[string]string), + labels: make(map[string]string), } } @@ -26,11 +28,17 @@ func (c *ConfigMap) WithData(key, value string) *ConfigMap { return c } +func (c *ConfigMap) WithLabel(key, value string) *ConfigMap { + c.labels[key] = value + return c +} + func (c *ConfigMap) K8sObject() *corev1.ConfigMap { return &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: c.name, Namespace: c.namespace, + Labels: c.labels, }, Data: c.data, } diff --git a/test/testkit/metrics/runtime/pod.go b/test/testkit/metrics/runtime/pod.go index b8cd7197b..71a0a559b 100644 --- a/test/testkit/metrics/runtime/pod.go +++ b/test/testkit/metrics/runtime/pod.go @@ -33,11 +33,6 @@ var ( "k8s.pod.name", "k8s.pod.uid", "service.name", - "cloud.region", - "cloud.availability_zone", - "host.type", - "host.arch", - "cloud.provider", } PodMetricsAttributes = map[string][]string{ From 28478dc728ed22f860de926f7f0b7e990270e636 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Tue, 28 Jan 2025 16:18:29 +0100 Subject: [PATCH 26/29] remove unused code --- .../istio/metric_cloud_provider_test.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/test/integration/istio/metric_cloud_provider_test.go b/test/integration/istio/metric_cloud_provider_test.go index 4f0c9b653..b43506c8a 100644 --- a/test/integration/istio/metric_cloud_provider_test.go +++ b/test/integration/istio/metric_cloud_provider_test.go @@ -135,20 +135,6 @@ func backendContainsMetricsDeliveredForResource(proxyClient *apiserverproxy.Clie }, 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 backendContainsDesiredCloudResourceAttributes(proxyClient *apiserverproxy.Client, backendExportURL, attribute string) { Eventually(func(g Gomega) { resp, err := proxyClient.Get(backendExportURL) From 5f47dd83ed7c14884e6689dc0d1fa4f98407f133 Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Tue, 28 Jan 2025 19:32:16 +0100 Subject: [PATCH 27/29] rename coud provider attribute test file --- ...provider_test.go => metrics_cloud_provider_attributes_test.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/integration/istio/{metric_cloud_provider_test.go => metrics_cloud_provider_attributes_test.go} (100%) diff --git a/test/integration/istio/metric_cloud_provider_test.go b/test/integration/istio/metrics_cloud_provider_attributes_test.go similarity index 100% rename from test/integration/istio/metric_cloud_provider_test.go rename to test/integration/istio/metrics_cloud_provider_attributes_test.go From 51b085782280412b52b90f5a1523fbf1db85e4ae Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Thu, 30 Jan 2025 10:57:38 +0100 Subject: [PATCH 28/29] add SAP Converged Cloud as cloud provider --- internal/utils/k8s/cluster_info_getter.go | 11 ++++++++++- internal/utils/k8s/cluster_info_getter_test.go | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/internal/utils/k8s/cluster_info_getter.go b/internal/utils/k8s/cluster_info_getter.go index ab90e67ce..da6dd79cf 100644 --- a/internal/utils/k8s/cluster_info_getter.go +++ b/internal/utils/k8s/cluster_info_getter.go @@ -13,6 +13,8 @@ const ( defaultClusterName = "${KUBERNETES_SERVICE_HOST}" gardenerShootNameAttributeName = "shootName" gardenerCloudProviderAttributeName = "provider" + CloudProviderOpenStack = "openstack" + CloudProviderSAPConvergedCloud = "sap-converged-cloud" ) var defaultGardenerShootInfoCM = types.NamespacedName{ @@ -38,8 +40,15 @@ func GetGardenerShootInfo(ctx context.Context, client client.Client) ClusterInfo return ClusterInfo{ClusterName: defaultClusterName} } + // The provider `openstack` is used to represent the SAP Converged Cloud provider. + cloudProvider := shootInfo.Data[gardenerCloudProviderAttributeName] + + if cloudProvider == CloudProviderOpenStack { + cloudProvider = CloudProviderSAPConvergedCloud + } + return ClusterInfo{ ClusterName: shootInfo.Data[gardenerShootNameAttributeName], - CloudProvider: shootInfo.Data[gardenerCloudProviderAttributeName], + CloudProvider: cloudProvider, } } diff --git a/internal/utils/k8s/cluster_info_getter_test.go b/internal/utils/k8s/cluster_info_getter_test.go index 78b12cc4d..bcdf4122c 100644 --- a/internal/utils/k8s/cluster_info_getter_test.go +++ b/internal/utils/k8s/cluster_info_getter_test.go @@ -28,6 +28,23 @@ func TestClusterInfoGetter(t *testing.T) { require.Equal(t, clusterInfo.CloudProvider, "test-provider") }) + t.Run("Gardener converged cloud", func(t *testing.T) { + shootInfo := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Name: "shoot-info", Namespace: "kube-system"}, + Data: map[string]string{ + "shootName": "test-cluster", + "provider": "openstack", + }, + } + + fakeClient := fake.NewClientBuilder().WithObjects(shootInfo).Build() + + clusterInfo := GetGardenerShootInfo(context.Background(), fakeClient) + + require.Equal(t, clusterInfo.ClusterName, "test-cluster") + require.Equal(t, clusterInfo.CloudProvider, "sap-converged-cloud") + }) + t.Run("Non Gardener cluster", func(t *testing.T) { fakeClient := fake.NewClientBuilder().WithObjects().Build() From 1fc835305a235e30cd2ac3ae266da519e782036f Mon Sep 17 00:00:00 2001 From: Hisar Balik Date: Fri, 31 Jan 2025 14:43:52 +0100 Subject: [PATCH 29/29] move cache config for configmaps to a dedicated function --- main.go | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/main.go b/main.go index 0253a3dc4..3ace3cfa7 100644 --- a/main.go +++ b/main.go @@ -180,17 +180,10 @@ func run() error { // The operator handles various resource that are namespace-scoped, and additionally some resources that are cluster-scoped (clusterroles, clusterrolebindings, etc.). // For namespace-scoped resources we want to restrict the operator permissions to only fetch resources from a given namespace. ByObject: map[client.Object]cache.ByObject{ - &appsv1.Deployment{}: {Field: setNamespaceFieldSelector()}, - &appsv1.ReplicaSet{}: {Field: setNamespaceFieldSelector()}, - &appsv1.DaemonSet{}: {Field: setNamespaceFieldSelector()}, - &corev1.ConfigMap{}: { - Namespaces: map[string]cache.Config{ - "kube-system": { - FieldSelector: fields.SelectorFromSet(fields.Set{"metadata.name": "shoot-info"}), - }, - telemetryNamespace: {}, - }, - }, + &appsv1.Deployment{}: {Field: setNamespaceFieldSelector()}, + &appsv1.ReplicaSet{}: {Field: setNamespaceFieldSelector()}, + &appsv1.DaemonSet{}: {Field: setNamespaceFieldSelector()}, + &corev1.ConfigMap{}: {Namespaces: setConfigMapNamespaceFieldSelector()}, &corev1.ServiceAccount{}: {Field: setNamespaceFieldSelector()}, &corev1.Service{}: {Field: setNamespaceFieldSelector()}, &networkingv1.NetworkPolicy{}: {Field: setNamespaceFieldSelector()}, @@ -463,6 +456,15 @@ func setNamespaceFieldSelector() fields.Selector { return fields.SelectorFromSet(fields.Set{"metadata.namespace": telemetryNamespace}) } +func setConfigMapNamespaceFieldSelector() map[string]cache.Config { + return map[string]cache.Config{ + "kube-system": { + FieldSelector: fields.SelectorFromSet(fields.Set{"metadata.name": "shoot-info"}), + }, + telemetryNamespace: {}, + } +} + func createSelfMonitoringConfig() telemetry.SelfMonitorConfig { return telemetry.SelfMonitorConfig{ Config: selfmonitor.Config{