From 6f9abd6259dfcf84f641f1946997a79d896ae22c Mon Sep 17 00:00:00 2001 From: odubajDT Date: Wed, 26 Feb 2025 10:58:32 +0100 Subject: [PATCH 1/4] [processor/resourcedetection] Add k8s.cluster.uid to kubeadm detector Signed-off-by: odubajDT --- .chloggen/kubeadm-uid.yaml | 27 ++++++++ .../metadataproviders/kubeadm/metadata.go | 37 ++++++++--- .../kubeadm/metadata_test.go | 62 ++++++++++++++++++- .../resourcedetectionprocessor/README.md | 4 ++ .../internal/kubeadm/documentation.md | 1 + .../internal/metadata/generated_config.go | 4 ++ .../metadata/generated_config_test.go | 16 +++++ .../internal/metadata/generated_resource.go | 7 +++ .../metadata/generated_resource_test.go | 13 +++- .../internal/metadata/testdata/config.yaml | 16 +++++ .../internal/kubeadm/kubeadm.go | 16 +++-- .../internal/kubeadm/kubeadm_test.go | 8 +++ .../internal/kubeadm/metadata.yaml | 4 ++ 13 files changed, 197 insertions(+), 18 deletions(-) create mode 100644 .chloggen/kubeadm-uid.yaml diff --git a/.chloggen/kubeadm-uid.yaml b/.chloggen/kubeadm-uid.yaml new file mode 100644 index 0000000000000..3769d675d1fea --- /dev/null +++ b/.chloggen/kubeadm-uid.yaml @@ -0,0 +1,27 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) +component: processor/resourcedetection + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: "Add k8s.cluster.uid to kubeadm detector" + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [38207] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: + +# If your change doesn't affect end users or the exported elements of any package, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [] diff --git a/internal/metadataproviders/kubeadm/metadata.go b/internal/metadataproviders/kubeadm/metadata.go index 2b594e54614c7..7633d423e2d4e 100644 --- a/internal/metadataproviders/kubeadm/metadata.go +++ b/internal/metadataproviders/kubeadm/metadata.go @@ -16,28 +16,31 @@ import ( type Provider interface { // ClusterName returns the current K8S cluster name ClusterName(ctx context.Context) (string, error) + // ClusterUid returns the current K8S cluster UID + ClusterUid(ctx context.Context) (string, error) } type LocalCache struct { ClusterName string + ClusterUid string } type kubeadmProvider struct { - kubeadmClient kubernetes.Interface - configMapName string - configMapNamespace string - cache LocalCache + kubeadmClient kubernetes.Interface + configMapName string + kubeSystemNamespace string + cache LocalCache } -func NewProvider(configMapName string, configMapNamespace string, apiConf k8sconfig.APIConfig) (Provider, error) { +func NewProvider(configMapName string, kubeSystemNamespace string, apiConf k8sconfig.APIConfig) (Provider, error) { k8sAPIClient, err := k8sconfig.MakeClient(apiConf) if err != nil { return nil, fmt.Errorf("failed to create K8s API client: %w", err) } return &kubeadmProvider{ - kubeadmClient: k8sAPIClient, - configMapName: configMapName, - configMapNamespace: configMapNamespace, + kubeadmClient: k8sAPIClient, + configMapName: configMapName, + kubeSystemNamespace: kubeSystemNamespace, }, nil } @@ -45,12 +48,26 @@ func (k *kubeadmProvider) ClusterName(ctx context.Context) (string, error) { if k.cache.ClusterName != "" { return k.cache.ClusterName, nil } - configmap, err := k.kubeadmClient.CoreV1().ConfigMaps(k.configMapNamespace).Get(ctx, k.configMapName, metav1.GetOptions{}) + configmap, err := k.kubeadmClient.CoreV1().ConfigMaps(k.kubeSystemNamespace).Get(ctx, k.configMapName, metav1.GetOptions{}) if err != nil { - return "", fmt.Errorf("failed to fetch ConfigMap with name %s and namespace %s from K8s API: %w", k.configMapName, k.configMapNamespace, err) + return "", fmt.Errorf("failed to fetch ConfigMap with name %s and namespace %s from K8s API: %w", k.configMapName, k.kubeSystemNamespace, err) } k.cache.ClusterName = configmap.Data["clusterName"] return k.cache.ClusterName, nil } + +func (k *kubeadmProvider) ClusterUid(ctx context.Context) (string, error) { + if k.cache.ClusterUid != "" { + return k.cache.ClusterUid, nil + } + ns, err := k.kubeadmClient.CoreV1().Namespaces().Get(ctx, k.kubeSystemNamespace, metav1.GetOptions{}) + if err != nil { + return "", fmt.Errorf("failed to fetch Namespace %s from K8s API: %w", k.kubeSystemNamespace, err) + } + + k.cache.ClusterUid = string(ns.GetUID()) + + return k.cache.ClusterUid, nil +} diff --git a/internal/metadataproviders/kubeadm/metadata_test.go b/internal/metadataproviders/kubeadm/metadata_test.go index 7f383b203a7e3..25d54f265ee10 100644 --- a/internal/metadataproviders/kubeadm/metadata_test.go +++ b/internal/metadataproviders/kubeadm/metadata_test.go @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes/fake" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig" @@ -54,9 +55,9 @@ func TestClusterName(t *testing.T) { for _, tt := range tests { t.Run(tt.testName, func(t *testing.T) { kubeadmP := &kubeadmProvider{ - kubeadmClient: client, - configMapName: tt.CMname, - configMapNamespace: tt.CMnamespace, + kubeadmClient: client, + configMapName: tt.CMname, + kubeSystemNamespace: tt.CMnamespace, } clusterName, err := kubeadmP.ClusterName(context.Background()) if tt.errMsg != "" { @@ -69,6 +70,47 @@ func TestClusterName(t *testing.T) { } } +func TestClusterUid(t *testing.T) { + client := fake.NewSimpleClientset() + err := setupNamespace(client) + assert.NoError(t, err) + + tests := []struct { + testName string + CMnamespace string + clusterUid string + errMsg string + }{ + { + testName: "valid", + CMnamespace: "ns", + clusterUid: "uid", + errMsg: "", + }, + { + testName: "ns not found", + CMnamespace: "ns2", + errMsg: "failed to fetch Namespace ns2 from K8s API: namespaces \"ns2\" not found", + }, + } + + for _, tt := range tests { + t.Run(tt.testName, func(t *testing.T) { + kubeadmP := &kubeadmProvider{ + kubeadmClient: client, + kubeSystemNamespace: tt.CMnamespace, + } + clusterName, err := kubeadmP.ClusterUid(context.Background()) + if tt.errMsg != "" { + assert.EqualError(t, err, tt.errMsg) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.clusterUid, clusterName) + } + }) + } +} + func setupConfigMap(client *fake.Clientset) error { cm := &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ @@ -85,3 +127,17 @@ func setupConfigMap(client *fake.Clientset) error { } return nil } + +func setupNamespace(client *fake.Clientset) error { + ns := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + UID: types.UID("uid"), + Name: "ns", + }, + } + _, err := client.CoreV1().Namespaces().Create(context.Background(), ns, metav1.CreateOptions{}) + if err != nil { + return err + } + return nil +} diff --git a/processor/resourcedetectionprocessor/README.md b/processor/resourcedetectionprocessor/README.md index 60fc5f5aae383..6b1e7a565ee53 100644 --- a/processor/resourcedetectionprocessor/README.md +++ b/processor/resourcedetectionprocessor/README.md @@ -479,6 +479,10 @@ rules: resources: ["configmaps"] resourceNames: ["kubeadm-config"] verbs: ["get"] + - apiGroups: [""] + resources: ["namespaces"] + resourceNames: ["kube-system"] + verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/documentation.md b/processor/resourcedetectionprocessor/internal/kubeadm/documentation.md index 5e2c0561a2ad5..041ef91b7b133 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/documentation.md +++ b/processor/resourcedetectionprocessor/internal/kubeadm/documentation.md @@ -9,3 +9,4 @@ | Name | Description | Values | Enabled | | ---- | ----------- | ------ | ------- | | k8s.cluster.name | The Kubernetes cluster name | Any Str | true | +| k8s.cluster.uid | The Kubernetes cluster uid | Any Str | true | diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config.go index cb9d4839877dc..fac4fe938d5b7 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config.go @@ -28,6 +28,7 @@ func (rac *ResourceAttributeConfig) Unmarshal(parser *confmap.Conf) error { // ResourceAttributesConfig provides config for resourcedetectionprocessor/kubeadm resource attributes. type ResourceAttributesConfig struct { K8sClusterName ResourceAttributeConfig `mapstructure:"k8s.cluster.name"` + K8sClusterUid ResourceAttributeConfig `mapstructure:"k8s.cluster.uid"` } func DefaultResourceAttributesConfig() ResourceAttributesConfig { @@ -35,5 +36,8 @@ func DefaultResourceAttributesConfig() ResourceAttributesConfig { K8sClusterName: ResourceAttributeConfig{ Enabled: true, }, + K8sClusterUid: ResourceAttributeConfig{ + Enabled: true, + }, } } diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go index c2ed830cc2add..78f6730a99a9f 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go @@ -25,12 +25,28 @@ func TestResourceAttributesConfig(t *testing.T) { name: "all_set", want: ResourceAttributesConfig{ K8sClusterName: ResourceAttributeConfig{Enabled: true}, + K8sClusterUid: ResourceAttributeConfig{Enabled: true}, }, }, { name: "none_set", want: ResourceAttributesConfig{ K8sClusterName: ResourceAttributeConfig{Enabled: false}, + K8sClusterUid: ResourceAttributeConfig{Enabled: false}, + }, + }, + { + name: "name_set", + want: ResourceAttributesConfig{ + K8sClusterName: ResourceAttributeConfig{Enabled: true}, + K8sClusterUid: ResourceAttributeConfig{Enabled: false}, + }, + }, + { + name: "uid_set", + want: ResourceAttributesConfig{ + K8sClusterName: ResourceAttributeConfig{Enabled: false}, + K8sClusterUid: ResourceAttributeConfig{Enabled: true}, }, }, } diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go index 83834dfd62c82..c7d62100673f0 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go @@ -28,6 +28,13 @@ func (rb *ResourceBuilder) SetK8sClusterName(val string) { } } +// SetK8sClusterName sets provided value as "k8s.cluster.uid" attribute. +func (rb *ResourceBuilder) SetK8sClusterUid(val string) { + if rb.config.K8sClusterUid.Enabled { + rb.res.Attributes().PutStr("k8s.cluster.uid", val) + } +} + // Emit returns the built resource and resets the internal builder state. func (rb *ResourceBuilder) Emit() pcommon.Resource { r := rb.res diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go index c433372789478..58f2c3a7eb96d 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go @@ -14,15 +14,20 @@ func TestResourceBuilder(t *testing.T) { cfg := loadResourceAttributesConfig(t, tt) rb := NewResourceBuilder(cfg) rb.SetK8sClusterName("k8s.cluster.name-val") + rb.SetK8sClusterUid("k8s.cluster.uid-val") res := rb.Emit() assert.Equal(t, 0, rb.Emit().Attributes().Len()) // Second call should return empty Resource switch tt { case "default": - assert.Equal(t, 1, res.Attributes().Len()) + assert.Equal(t, 2, res.Attributes().Len()) case "all_set": + assert.Equal(t, 2, res.Attributes().Len()) + case "name_set": assert.Equal(t, 1, res.Attributes().Len()) + case "uid_set": + assert.Equal(t, 2, res.Attributes().Len()) case "none_set": assert.Equal(t, 0, res.Attributes().Len()) return @@ -35,6 +40,12 @@ func TestResourceBuilder(t *testing.T) { if ok { assert.EqualValues(t, "k8s.cluster.name-val", val.Str()) } + + val, ok = res.Attributes().Get("k8s.cluster.uid") + assert.True(t, ok) + if ok { + assert.EqualValues(t, "k8s.cluster.uid-val", val.Str()) + } }) } } diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/testdata/config.yaml b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/testdata/config.yaml index 4017b2f2932c4..b07e34fe5dbcb 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/testdata/config.yaml +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/testdata/config.yaml @@ -3,7 +3,23 @@ all_set: resource_attributes: k8s.cluster.name: enabled: true + k8s.cluster.uid: + enabled: true none_set: resource_attributes: k8s.cluster.name: enabled: false + k8s.cluster.uid: + enabled: false +name_set: + resource_attributes: + k8s.cluster.name: + enabled: true + k8s.cluster.uid: + enabled: false +uid_set: + resource_attributes: + k8s.cluster.name: + enabled: false + k8s.cluster.uid: + enabled: true diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm.go b/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm.go index ca39c6dde2620..e63110962455c 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm.go @@ -18,9 +18,9 @@ import ( ) const ( - TypeStr = "kubeadm" - defaultConfigMapName = "kubeadm-config" - defaultConfigMapNamespace = "kube-system" + TypeStr = "kubeadm" + defaultConfigMapName = "kubeadm-config" + defaultKubeSystemNamespace = "kube-system" ) var _ internal.Detector = (*detector)(nil) @@ -35,7 +35,7 @@ type detector struct { func NewDetector(set processor.Settings, dcfg internal.DetectorConfig) (internal.Detector, error) { cfg := dcfg.(Config) - kubeadmProvider, err := kubeadm.NewProvider(defaultConfigMapName, defaultConfigMapNamespace, cfg.APIConfig) + kubeadmProvider, err := kubeadm.NewProvider(defaultConfigMapName, defaultKubeSystemNamespace, cfg.APIConfig) if err != nil { return nil, fmt.Errorf("failed creating kubeadm provider: %w", err) } @@ -57,5 +57,13 @@ func (d *detector) Detect(ctx context.Context) (resource pcommon.Resource, schem d.rb.SetK8sClusterName(clusterName) } + if d.ra.K8sClusterUid.Enabled { + clusterUid, err := d.provider.ClusterUid(ctx) + if err != nil { + return pcommon.NewResource(), "", fmt.Errorf("failed getting k8s cluster uid: %w", err) + } + d.rb.SetK8sClusterUid(clusterUid) + } + return d.rb.Emit(), conventions.SchemaURL, nil } diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm_test.go b/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm_test.go index 25435cf5e27d8..0f8d6e04351c4 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm_test.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm_test.go @@ -28,9 +28,15 @@ func (m *mockMetadata) ClusterName(_ context.Context) (string, error) { return args.String(0), args.Error(1) } +func (m *mockMetadata) ClusterUid(_ context.Context) (string, error) { + args := m.MethodCalled("ClusterUid") + return args.String(0), args.Error(1) +} + func TestDetect(t *testing.T) { md := &mockMetadata{} md.On("ClusterName").Return("cluster-1", nil) + md.On("ClusterUid").Return("uid-1", nil) cfg := CreateDefaultConfig() // set k8s cluster env variables and auth type to create a dummy API client cfg.APIConfig.AuthType = k8sconfig.AuthTypeNone @@ -47,6 +53,7 @@ func TestDetect(t *testing.T) { expected := map[string]any{ conventions.AttributeK8SClusterName: "cluster-1", + "k8s.cluster.uid": "uid-1", } assert.Equal(t, expected, res.Attributes().AsRaw()) @@ -56,6 +63,7 @@ func TestDetectDisabledResourceAttributes(t *testing.T) { md := &mockMetadata{} cfg := CreateDefaultConfig() cfg.ResourceAttributes.K8sClusterName.Enabled = false + cfg.ResourceAttributes.K8sClusterUid.Enabled = false // set k8s cluster env variables and auth type to create a dummy API client cfg.APIConfig.AuthType = k8sconfig.AuthTypeNone t.Setenv("KUBERNETES_SERVICE_HOST", "127.0.0.1") diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/metadata.yaml b/processor/resourcedetectionprocessor/internal/kubeadm/metadata.yaml index ed2518a06686b..6d3c07b3eb45b 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/metadata.yaml +++ b/processor/resourcedetectionprocessor/internal/kubeadm/metadata.yaml @@ -7,3 +7,7 @@ resource_attributes: description: The Kubernetes cluster name type: string enabled: true + k8s.cluster.uid: + description: The Kubernetes cluster UID + type: string + enabled: true From 5bf034be9c5171ced3893efc5f691d8084e93d7c Mon Sep 17 00:00:00 2001 From: odubajDT Date: Wed, 26 Feb 2025 11:04:09 +0100 Subject: [PATCH 2/4] polish Signed-off-by: odubajDT --- .../kubeadm/internal/metadata/generated_config_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go index 78f6730a99a9f..892b603f10b21 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go @@ -25,28 +25,28 @@ func TestResourceAttributesConfig(t *testing.T) { name: "all_set", want: ResourceAttributesConfig{ K8sClusterName: ResourceAttributeConfig{Enabled: true}, - K8sClusterUid: ResourceAttributeConfig{Enabled: true}, + K8sClusterUid: ResourceAttributeConfig{Enabled: true}, }, }, { name: "none_set", want: ResourceAttributesConfig{ K8sClusterName: ResourceAttributeConfig{Enabled: false}, - K8sClusterUid: ResourceAttributeConfig{Enabled: false}, + K8sClusterUid: ResourceAttributeConfig{Enabled: false}, }, }, { name: "name_set", want: ResourceAttributesConfig{ K8sClusterName: ResourceAttributeConfig{Enabled: true}, - K8sClusterUid: ResourceAttributeConfig{Enabled: false}, + K8sClusterUid: ResourceAttributeConfig{Enabled: false}, }, }, { name: "uid_set", want: ResourceAttributesConfig{ K8sClusterName: ResourceAttributeConfig{Enabled: false}, - K8sClusterUid: ResourceAttributeConfig{Enabled: true}, + K8sClusterUid: ResourceAttributeConfig{Enabled: true}, }, }, } From 84e5fec63ca6be0190058a428aa29705de17fe91 Mon Sep 17 00:00:00 2001 From: odubajDT Date: Wed, 26 Feb 2025 11:13:24 +0100 Subject: [PATCH 3/4] fix lint Signed-off-by: odubajDT --- internal/metadataproviders/kubeadm/metadata.go | 16 ++++++++-------- .../metadataproviders/kubeadm/metadata_test.go | 10 +++++----- .../internal/metadata/generated_config.go | 4 ++-- .../internal/metadata/generated_config_test.go | 8 ++++---- .../internal/metadata/generated_resource.go | 4 ++-- .../internal/metadata/generated_resource_test.go | 2 +- .../internal/kubeadm/kubeadm.go | 6 +++--- .../internal/kubeadm/kubeadm_test.go | 8 ++++---- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/internal/metadataproviders/kubeadm/metadata.go b/internal/metadataproviders/kubeadm/metadata.go index 7633d423e2d4e..73b757d343a61 100644 --- a/internal/metadataproviders/kubeadm/metadata.go +++ b/internal/metadataproviders/kubeadm/metadata.go @@ -16,13 +16,13 @@ import ( type Provider interface { // ClusterName returns the current K8S cluster name ClusterName(ctx context.Context) (string, error) - // ClusterUid returns the current K8S cluster UID - ClusterUid(ctx context.Context) (string, error) + // ClusterUID returns the current K8S cluster UID + ClusterUID(ctx context.Context) (string, error) } type LocalCache struct { ClusterName string - ClusterUid string + ClusterUID string } type kubeadmProvider struct { @@ -58,16 +58,16 @@ func (k *kubeadmProvider) ClusterName(ctx context.Context) (string, error) { return k.cache.ClusterName, nil } -func (k *kubeadmProvider) ClusterUid(ctx context.Context) (string, error) { - if k.cache.ClusterUid != "" { - return k.cache.ClusterUid, nil +func (k *kubeadmProvider) ClusterUID(ctx context.Context) (string, error) { + if k.cache.ClusterUID != "" { + return k.cache.ClusterUID, nil } ns, err := k.kubeadmClient.CoreV1().Namespaces().Get(ctx, k.kubeSystemNamespace, metav1.GetOptions{}) if err != nil { return "", fmt.Errorf("failed to fetch Namespace %s from K8s API: %w", k.kubeSystemNamespace, err) } - k.cache.ClusterUid = string(ns.GetUID()) + k.cache.ClusterUID = string(ns.GetUID()) - return k.cache.ClusterUid, nil + return k.cache.ClusterUID, nil } diff --git a/internal/metadataproviders/kubeadm/metadata_test.go b/internal/metadataproviders/kubeadm/metadata_test.go index 25d54f265ee10..e31463a6e622e 100644 --- a/internal/metadataproviders/kubeadm/metadata_test.go +++ b/internal/metadataproviders/kubeadm/metadata_test.go @@ -70,7 +70,7 @@ func TestClusterName(t *testing.T) { } } -func TestClusterUid(t *testing.T) { +func TestClusterUID(t *testing.T) { client := fake.NewSimpleClientset() err := setupNamespace(client) assert.NoError(t, err) @@ -78,13 +78,13 @@ func TestClusterUid(t *testing.T) { tests := []struct { testName string CMnamespace string - clusterUid string + clusterUID string errMsg string }{ { testName: "valid", CMnamespace: "ns", - clusterUid: "uid", + clusterUID: "uid", errMsg: "", }, { @@ -100,12 +100,12 @@ func TestClusterUid(t *testing.T) { kubeadmClient: client, kubeSystemNamespace: tt.CMnamespace, } - clusterName, err := kubeadmP.ClusterUid(context.Background()) + clusterName, err := kubeadmP.ClusterUID(context.Background()) if tt.errMsg != "" { assert.EqualError(t, err, tt.errMsg) } else { assert.NoError(t, err) - assert.Equal(t, tt.clusterUid, clusterName) + assert.Equal(t, tt.clusterUID, clusterName) } }) } diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config.go index fac4fe938d5b7..ada67d3f1b6ba 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config.go @@ -28,7 +28,7 @@ func (rac *ResourceAttributeConfig) Unmarshal(parser *confmap.Conf) error { // ResourceAttributesConfig provides config for resourcedetectionprocessor/kubeadm resource attributes. type ResourceAttributesConfig struct { K8sClusterName ResourceAttributeConfig `mapstructure:"k8s.cluster.name"` - K8sClusterUid ResourceAttributeConfig `mapstructure:"k8s.cluster.uid"` + K8sClusterUID ResourceAttributeConfig `mapstructure:"k8s.cluster.uid"` } func DefaultResourceAttributesConfig() ResourceAttributesConfig { @@ -36,7 +36,7 @@ func DefaultResourceAttributesConfig() ResourceAttributesConfig { K8sClusterName: ResourceAttributeConfig{ Enabled: true, }, - K8sClusterUid: ResourceAttributeConfig{ + K8sClusterUID: ResourceAttributeConfig{ Enabled: true, }, } diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go index 892b603f10b21..a8f21f64a67ea 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go @@ -25,28 +25,28 @@ func TestResourceAttributesConfig(t *testing.T) { name: "all_set", want: ResourceAttributesConfig{ K8sClusterName: ResourceAttributeConfig{Enabled: true}, - K8sClusterUid: ResourceAttributeConfig{Enabled: true}, + K8sClusterUID: ResourceAttributeConfig{Enabled: true}, }, }, { name: "none_set", want: ResourceAttributesConfig{ K8sClusterName: ResourceAttributeConfig{Enabled: false}, - K8sClusterUid: ResourceAttributeConfig{Enabled: false}, + K8sClusterUID: ResourceAttributeConfig{Enabled: false}, }, }, { name: "name_set", want: ResourceAttributesConfig{ K8sClusterName: ResourceAttributeConfig{Enabled: true}, - K8sClusterUid: ResourceAttributeConfig{Enabled: false}, + K8sClusterUID: ResourceAttributeConfig{Enabled: false}, }, }, { name: "uid_set", want: ResourceAttributesConfig{ K8sClusterName: ResourceAttributeConfig{Enabled: false}, - K8sClusterUid: ResourceAttributeConfig{Enabled: true}, + K8sClusterUID: ResourceAttributeConfig{Enabled: true}, }, }, } diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go index c7d62100673f0..d79dd3cc1c1ab 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go @@ -29,8 +29,8 @@ func (rb *ResourceBuilder) SetK8sClusterName(val string) { } // SetK8sClusterName sets provided value as "k8s.cluster.uid" attribute. -func (rb *ResourceBuilder) SetK8sClusterUid(val string) { - if rb.config.K8sClusterUid.Enabled { +func (rb *ResourceBuilder) SetK8sClusterUID(val string) { + if rb.config.K8sClusterUID.Enabled { rb.res.Attributes().PutStr("k8s.cluster.uid", val) } } diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go index 58f2c3a7eb96d..0242c52d43ffb 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go @@ -14,7 +14,7 @@ func TestResourceBuilder(t *testing.T) { cfg := loadResourceAttributesConfig(t, tt) rb := NewResourceBuilder(cfg) rb.SetK8sClusterName("k8s.cluster.name-val") - rb.SetK8sClusterUid("k8s.cluster.uid-val") + rb.SetK8sClusterUID("k8s.cluster.uid-val") res := rb.Emit() assert.Equal(t, 0, rb.Emit().Attributes().Len()) // Second call should return empty Resource diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm.go b/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm.go index e63110962455c..a06afd0beb052 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm.go @@ -57,12 +57,12 @@ func (d *detector) Detect(ctx context.Context) (resource pcommon.Resource, schem d.rb.SetK8sClusterName(clusterName) } - if d.ra.K8sClusterUid.Enabled { - clusterUid, err := d.provider.ClusterUid(ctx) + if d.ra.K8sClusterUID.Enabled { + clusterUID, err := d.provider.ClusterUID(ctx) if err != nil { return pcommon.NewResource(), "", fmt.Errorf("failed getting k8s cluster uid: %w", err) } - d.rb.SetK8sClusterUid(clusterUid) + d.rb.SetK8sClusterUID(clusterUID) } return d.rb.Emit(), conventions.SchemaURL, nil diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm_test.go b/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm_test.go index 0f8d6e04351c4..54762d049736b 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm_test.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/kubeadm_test.go @@ -28,15 +28,15 @@ func (m *mockMetadata) ClusterName(_ context.Context) (string, error) { return args.String(0), args.Error(1) } -func (m *mockMetadata) ClusterUid(_ context.Context) (string, error) { - args := m.MethodCalled("ClusterUid") +func (m *mockMetadata) ClusterUID(_ context.Context) (string, error) { + args := m.MethodCalled("ClusterUID") return args.String(0), args.Error(1) } func TestDetect(t *testing.T) { md := &mockMetadata{} md.On("ClusterName").Return("cluster-1", nil) - md.On("ClusterUid").Return("uid-1", nil) + md.On("ClusterUID").Return("uid-1", nil) cfg := CreateDefaultConfig() // set k8s cluster env variables and auth type to create a dummy API client cfg.APIConfig.AuthType = k8sconfig.AuthTypeNone @@ -63,7 +63,7 @@ func TestDetectDisabledResourceAttributes(t *testing.T) { md := &mockMetadata{} cfg := CreateDefaultConfig() cfg.ResourceAttributes.K8sClusterName.Enabled = false - cfg.ResourceAttributes.K8sClusterUid.Enabled = false + cfg.ResourceAttributes.K8sClusterUID.Enabled = false // set k8s cluster env variables and auth type to create a dummy API client cfg.APIConfig.AuthType = k8sconfig.AuthTypeNone t.Setenv("KUBERNETES_SERVICE_HOST", "127.0.0.1") From d294678a73c4005f6c79035ec315f88a7ccf38ad Mon Sep 17 00:00:00 2001 From: odubajDT Date: Wed, 26 Feb 2025 11:30:10 +0100 Subject: [PATCH 4/4] make generate Signed-off-by: odubajDT --- .../internal/kubeadm/documentation.md | 2 +- .../internal/metadata/generated_config_test.go | 14 -------------- .../internal/metadata/generated_resource.go | 2 +- .../internal/metadata/generated_resource_test.go | 5 ----- .../kubeadm/internal/metadata/testdata/config.yaml | 12 ------------ 5 files changed, 2 insertions(+), 33 deletions(-) diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/documentation.md b/processor/resourcedetectionprocessor/internal/kubeadm/documentation.md index 041ef91b7b133..0acfd780b66ad 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/documentation.md +++ b/processor/resourcedetectionprocessor/internal/kubeadm/documentation.md @@ -9,4 +9,4 @@ | Name | Description | Values | Enabled | | ---- | ----------- | ------ | ------- | | k8s.cluster.name | The Kubernetes cluster name | Any Str | true | -| k8s.cluster.uid | The Kubernetes cluster uid | Any Str | true | +| k8s.cluster.uid | The Kubernetes cluster UID | Any Str | true | diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go index a8f21f64a67ea..ed715c775c1b9 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_config_test.go @@ -35,20 +35,6 @@ func TestResourceAttributesConfig(t *testing.T) { K8sClusterUID: ResourceAttributeConfig{Enabled: false}, }, }, - { - name: "name_set", - want: ResourceAttributesConfig{ - K8sClusterName: ResourceAttributeConfig{Enabled: true}, - K8sClusterUID: ResourceAttributeConfig{Enabled: false}, - }, - }, - { - name: "uid_set", - want: ResourceAttributesConfig{ - K8sClusterName: ResourceAttributeConfig{Enabled: false}, - K8sClusterUID: ResourceAttributeConfig{Enabled: true}, - }, - }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go index d79dd3cc1c1ab..3656d69edfcab 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource.go @@ -28,7 +28,7 @@ func (rb *ResourceBuilder) SetK8sClusterName(val string) { } } -// SetK8sClusterName sets provided value as "k8s.cluster.uid" attribute. +// SetK8sClusterUID sets provided value as "k8s.cluster.uid" attribute. func (rb *ResourceBuilder) SetK8sClusterUID(val string) { if rb.config.K8sClusterUID.Enabled { rb.res.Attributes().PutStr("k8s.cluster.uid", val) diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go index 0242c52d43ffb..adb712fbc34eb 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/generated_resource_test.go @@ -24,10 +24,6 @@ func TestResourceBuilder(t *testing.T) { assert.Equal(t, 2, res.Attributes().Len()) case "all_set": assert.Equal(t, 2, res.Attributes().Len()) - case "name_set": - assert.Equal(t, 1, res.Attributes().Len()) - case "uid_set": - assert.Equal(t, 2, res.Attributes().Len()) case "none_set": assert.Equal(t, 0, res.Attributes().Len()) return @@ -40,7 +36,6 @@ func TestResourceBuilder(t *testing.T) { if ok { assert.EqualValues(t, "k8s.cluster.name-val", val.Str()) } - val, ok = res.Attributes().Get("k8s.cluster.uid") assert.True(t, ok) if ok { diff --git a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/testdata/config.yaml b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/testdata/config.yaml index b07e34fe5dbcb..82c18c28f69bc 100644 --- a/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/testdata/config.yaml +++ b/processor/resourcedetectionprocessor/internal/kubeadm/internal/metadata/testdata/config.yaml @@ -11,15 +11,3 @@ none_set: enabled: false k8s.cluster.uid: enabled: false -name_set: - resource_attributes: - k8s.cluster.name: - enabled: true - k8s.cluster.uid: - enabled: false -uid_set: - resource_attributes: - k8s.cluster.name: - enabled: false - k8s.cluster.uid: - enabled: true