From 8ec618036ab6f2e4f2f871f76a76061d9252e77b Mon Sep 17 00:00:00 2001 From: Carson Ip Date: Fri, 8 Nov 2024 14:00:27 +0000 Subject: [PATCH] [exporter/elasticsearch] Translate `k8s.*.name` resource attributes in ECS mode (#36233) #### Description In ECS mode: Translate `k8s.job.name`, `k8s.cronjob.name`, `k8s.statefulset.name`, `k8s.replicaset.name`, `k8s.daemonset.name`, `k8s.container.name` to `kubernetes.*.name`. Translate `k8s.cluster.name` to `orchestrator.cluster.name`. #### Link to tracking issue #### Testing #### Documentation --- ...earchexporter_ecs-translate-k8s-names.yaml | 27 +++++++++ exporter/elasticsearchexporter/README.md | 57 +++++++++++-------- exporter/elasticsearchexporter/model.go | 7 +++ exporter/elasticsearchexporter/model_test.go | 16 +++++- 4 files changed, 81 insertions(+), 26 deletions(-) create mode 100644 .chloggen/elasticsearchexporter_ecs-translate-k8s-names.yaml diff --git a/.chloggen/elasticsearchexporter_ecs-translate-k8s-names.yaml b/.chloggen/elasticsearchexporter_ecs-translate-k8s-names.yaml new file mode 100644 index 000000000000..155112f41da7 --- /dev/null +++ b/.chloggen/elasticsearchexporter_ecs-translate-k8s-names.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: elasticsearchexporter + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Translate `k8s.*.name` resource attributes in ECS mode + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [36233] + +# (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: Translate `k8s.job.name`, `k8s.cronjob.name`, `k8s.statefulset.name`, `k8s.replicaset.name`, `k8s.daemonset.name`, `k8s.container.name` to `kubernetes.*.name`. Translate `k8s.cluster.name` to `orchestrator.cluster.name`. + +# 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: [user] diff --git a/exporter/elasticsearchexporter/README.md b/exporter/elasticsearchexporter/README.md index 0ac2af2ba445..53a093109557 100644 --- a/exporter/elasticsearchexporter/README.md +++ b/exporter/elasticsearchexporter/README.md @@ -268,31 +268,38 @@ If the target ECS field name is specified as an empty string (""), the converter When "Preserved" is true, the attribute will be preserved in the payload and duplicated as mapped to its ECS equivalent. -| Semantic Convention Name | ECS Name | Preserve | -|--------------------------|----------|----------| -| cloud.platform | cloud.service.name | false | -| container.image.tags | container.image.tag | false | -| deployment.environment | service.environment | false | -| host.arch | host.architecture | false | -| host.name | host.hostname | true | -| k8s.deployment.name | kubernetes.deployment.name | false | -| k8s.namespace.name | kubernetes.namespace | false | -| k8s.node.name | kubernetes.node.name | false | -| k8s.pod.name | kubernetes.pod.name | false | -| k8s.pod.uid | kubernetes.pod.uid | false | -| os.description | host.os.full | false | -| os.name | host.os.name | false | -| os.type | host.os.platform | false | -| os.version | host.os.version | false | -| process.executable.path | process.executable | false | -| process.runtime.name | service.runtime.name | false | -| process.runtime.version | service.runtime.version | false | -| service.instance.id | service.node.name | false | -| telemetry.distro.name | "" | false | -| telemetry.distro.version | "" | false | -| telemetry.sdk.language | "" | false | -| telemetry.sdk.name | "" | false | -| telemetry.sdk.version | "" | false | +| Semantic Convention Name | ECS Name | Preserve | +|--------------------------|-----------------------------|----------| +| cloud.platform | cloud.service.name | false | +| container.image.tags | container.image.tag | false | +| deployment.environment | service.environment | false | +| host.arch | host.architecture | false | +| host.name | host.hostname | true | +| k8s.cluster.name | orchestrator.cluster.name | false | +| k8s.container.name | kubernetes.container.name | false | +| k8s.cronjob.name | kubernetes.cronjob.name | false | +| k8s.daemonset.name | kubernetes.daemonset.name | false | +| k8s.deployment.name | kubernetes.deployment.name | false | +| k8s.job.name | kubernetes.job.name | false | +| k8s.namespace.name | kubernetes.namespace | false | +| k8s.node.name | kubernetes.node.name | false | +| k8s.pod.name | kubernetes.pod.name | false | +| k8s.pod.uid | kubernetes.pod.uid | false | +| k8s.replicaset.name | kubernetes.replicaset.name | false | +| k8s.statefulset.name | kubernetes.statefulset.name | false | +| os.description | host.os.full | false | +| os.name | host.os.name | false | +| os.type | host.os.platform | false | +| os.version | host.os.version | false | +| process.executable.path | process.executable | false | +| process.runtime.name | service.runtime.name | false | +| process.runtime.version | service.runtime.version | false | +| service.instance.id | service.node.name | false | +| telemetry.distro.name | "" | false | +| telemetry.distro.version | "" | false | +| telemetry.sdk.language | "" | false | +| telemetry.sdk.name | "" | false | +| telemetry.sdk.version | "" | false | ### Compound Mapping diff --git a/exporter/elasticsearchexporter/model.go b/exporter/elasticsearchexporter/model.go index 8c71df950752..299cb3902347 100644 --- a/exporter/elasticsearchexporter/model.go +++ b/exporter/elasticsearchexporter/model.go @@ -57,6 +57,13 @@ var resourceAttrsConversionMap = map[string]string{ semconv.AttributeK8SNodeName: "kubernetes.node.name", semconv.AttributeK8SPodName: "kubernetes.pod.name", semconv.AttributeK8SPodUID: "kubernetes.pod.uid", + semconv.AttributeK8SJobName: "kubernetes.job.name", + semconv.AttributeK8SCronJobName: "kubernetes.cronjob.name", + semconv.AttributeK8SStatefulSetName: "kubernetes.statefulset.name", + semconv.AttributeK8SReplicaSetName: "kubernetes.replicaset.name", + semconv.AttributeK8SDaemonSetName: "kubernetes.daemonset.name", + semconv.AttributeK8SContainerName: "kubernetes.container.name", + semconv.AttributeK8SClusterName: "orchestrator.cluster.name", } // resourceAttrsToPreserve contains conventions that should be preserved in ECS mode. diff --git a/exporter/elasticsearchexporter/model_test.go b/exporter/elasticsearchexporter/model_test.go index 136039cf28ea..d6b1aec8387a 100644 --- a/exporter/elasticsearchexporter/model_test.go +++ b/exporter/elasticsearchexporter/model_test.go @@ -381,6 +381,13 @@ func TestEncodeLogECSMode(t *testing.T) { "k8s.pod.name": "opentelemetry-pod-autoconf", "k8s.pod.uid": "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff", "k8s.deployment.name": "coredns", + semconv.AttributeK8SJobName: "job.name", + semconv.AttributeK8SCronJobName: "cronjob.name", + semconv.AttributeK8SStatefulSetName: "statefulset.name", + semconv.AttributeK8SReplicaSetName: "replicaset.name", + semconv.AttributeK8SDaemonSetName: "daemonset.name", + semconv.AttributeK8SContainerName: "container.name", + semconv.AttributeK8SClusterName: "cluster.name", }) require.NoError(t, err) @@ -444,7 +451,14 @@ func TestEncodeLogECSMode(t *testing.T) { "kubernetes.node.name": "node-1", "kubernetes.pod.name": "opentelemetry-pod-autoconf", "kubernetes.pod.uid": "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff", - "kubernetes.deployment.name": "coredns" + "kubernetes.deployment.name": "coredns", + "kubernetes.job.name": "job.name", + "kubernetes.cronjob.name": "cronjob.name", + "kubernetes.statefulset.name": "statefulset.name", + "kubernetes.replicaset.name": "replicaset.name", + "kubernetes.daemonset.name": "daemonset.name", + "kubernetes.container.name": "container.name", + "orchestrator.cluster.name": "cluster.name" }`, buf.String()) }