Skip to content

Commit a4d5291

Browse files
authored
Add service.instance.id with Pod name (open-telemetry#2678)
* Add service.instance.id with Pod name * Add e2e assert Signed-off-by: Janario Oliveira <[email protected]> * Fix tests Signed-off-by: Janario Oliveira <[email protected]> * Remove unnecessary `service.name` Signed-off-by: Janario Oliveira <[email protected]> * Rename var `someNamespace` - > `testNamespace` Signed-off-by: Janario Oliveira <[email protected]> * Fix tests Signed-off-by: Janario Oliveira <[email protected]> * Add changelog Signed-off-by: Janario Oliveira <[email protected]> --------- Signed-off-by: Janario Oliveira <[email protected]>
1 parent 6377ed0 commit a4d5291

File tree

7 files changed

+90
-55
lines changed

7 files changed

+90
-55
lines changed
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: bug_fix
3+
4+
# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
5+
component: auto-instrumentation
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: Add attribute `service.instance.id` while pod is mutated.
9+
10+
# One or more tracking issues related to the change
11+
issues: [2679]
12+
13+
# (Optional) One or more lines of additional information to render under the primary note.
14+
# These lines will be padded with 2 spaces and then inserted directly into the document.
15+
# Use pipe (|) for multiline entries.
16+
subtext: |
17+
`service.instance.id` is expected to be `<namespace>.<podName>.<containerName>`
18+
19+
But while pod is created it may not have the `podName` yet at the podMutator webhooks.
20+
21+
This changed to use the env var `OTEL_RESOURCE_ATTRIBUTES_POD_NAME` which will be present at runtime.
22+
`<namespace>.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).<containerName>`
23+
24+
Making a valid and complete value for `service.instance.id` to be added.
25+
26+

pkg/instrumentation/podmutator_test.go

+33-33
Large diffs are not rendered by default.

pkg/instrumentation/sdk.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ func (i *sdkInjector) createResourceMap(ctx context.Context, otelinst v1alpha1.I
472472
k8sResources[semconv.K8SPodNameKey] = pod.Name
473473
k8sResources[semconv.K8SPodUIDKey] = string(pod.UID)
474474
k8sResources[semconv.K8SNodeNameKey] = pod.Spec.NodeName
475-
k8sResources[semconv.ServiceInstanceIDKey] = createServiceInstanceId(ns.Name, pod.Name, pod.Spec.Containers[index].Name)
475+
k8sResources[semconv.ServiceInstanceIDKey] = createServiceInstanceId(ns.Name, fmt.Sprintf("$(%s)", constants.EnvPodName), pod.Spec.Containers[index].Name)
476476
i.addParentResourceLabels(ctx, otelinst.Spec.Resource.AddK8sUIDAttributes, ns, pod.ObjectMeta, k8sResources)
477477
for k, v := range k8sResources {
478478
if !existingRes[string(k)] && v != "" {

pkg/instrumentation/sdk_test.go

+27-21
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ import (
3636
"github.com/open-telemetry/opentelemetry-operator/internal/config"
3737
)
3838

39+
var testNamespace = corev1.Namespace{
40+
ObjectMeta: metav1.ObjectMeta{
41+
Name: "ns",
42+
},
43+
}
44+
3945
var defaultVolumeLimitSize = resource.MustParse("200Mi")
4046

4147
var testResourceRequirements = corev1.ResourceRequirements{
@@ -206,7 +212,7 @@ func TestSDKInjection(t *testing.T) {
206212
},
207213
{
208214
Name: "OTEL_RESOURCE_ATTRIBUTES",
209-
Value: "k8s.container.name=application-name,k8s.deployment.name=my-deployment,k8s.deployment.uid=depuid,k8s.namespace.name=project1,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=app,k8s.pod.uid=pod-uid,k8s.replicaset.name=my-replicaset,k8s.replicaset.uid=rsuid,service.instance.id=project1.app.application-name,service.version=latest",
215+
Value: "k8s.container.name=application-name,k8s.deployment.name=my-deployment,k8s.deployment.uid=depuid,k8s.namespace.name=project1,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=app,k8s.pod.uid=pod-uid,k8s.replicaset.name=my-replicaset,k8s.replicaset.uid=rsuid,service.instance.id=project1.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).application-name,service.version=latest",
210216
},
211217
},
212218
},
@@ -374,7 +380,7 @@ func TestSDKInjection(t *testing.T) {
374380
},
375381
{
376382
Name: "OTEL_RESOURCE_ATTRIBUTES",
377-
Value: "k8s.container.name=application-name,k8s.deployment.name=my-deployment,k8s.namespace.name=project1,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=app,k8s.pod.uid=pod-uid,k8s.replicaset.name=my-replicaset,service.instance.id=project1.app.application-name,service.version=latest",
383+
Value: "k8s.container.name=application-name,k8s.deployment.name=my-deployment,k8s.namespace.name=project1,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=app,k8s.pod.uid=pod-uid,k8s.replicaset.name=my-replicaset,service.instance.id=project1.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).application-name,service.version=latest",
378384
},
379385
},
380386
},
@@ -513,7 +519,7 @@ func TestInjectJava(t *testing.T) {
513519
}
514520
config := config.New()
515521
pod := inj.inject(context.Background(), insts,
516-
corev1.Namespace{},
522+
testNamespace,
517523
corev1.Pod{
518524
Spec: corev1.PodSpec{
519525
Containers: []corev1.Container{
@@ -605,7 +611,7 @@ func TestInjectJava(t *testing.T) {
605611
},
606612
{
607613
Name: "OTEL_RESOURCE_ATTRIBUTES",
608-
Value: "k8s.container.name=app,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.version=latest",
614+
Value: "k8s.container.name=app,k8s.namespace.name=ns,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.instance.id=ns.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).app,service.version=latest",
609615
},
610616
},
611617
},
@@ -634,7 +640,7 @@ func TestInjectNodeJS(t *testing.T) {
634640
}
635641
config := config.New()
636642
pod := inj.inject(context.Background(), insts,
637-
corev1.Namespace{},
643+
testNamespace,
638644
corev1.Pod{
639645
Spec: corev1.PodSpec{
640646
Containers: []corev1.Container{
@@ -726,7 +732,7 @@ func TestInjectNodeJS(t *testing.T) {
726732
},
727733
{
728734
Name: "OTEL_RESOURCE_ATTRIBUTES",
729-
Value: "k8s.container.name=app,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.version=latest",
735+
Value: "k8s.container.name=app,k8s.namespace.name=ns,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.instance.id=ns.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).app,service.version=latest",
730736
},
731737
},
732738
},
@@ -755,7 +761,7 @@ func TestInjectPython(t *testing.T) {
755761
}
756762
config := config.New()
757763
pod := inj.inject(context.Background(), insts,
758-
corev1.Namespace{},
764+
testNamespace,
759765
corev1.Pod{
760766
Spec: corev1.PodSpec{
761767
Containers: []corev1.Container{
@@ -862,7 +868,7 @@ func TestInjectPython(t *testing.T) {
862868
},
863869
{
864870
Name: "OTEL_RESOURCE_ATTRIBUTES",
865-
Value: "k8s.container.name=app,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.version=latest",
871+
Value: "k8s.container.name=app,k8s.namespace.name=ns,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.instance.id=ns.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).app,service.version=latest",
866872
},
867873
},
868874
},
@@ -890,7 +896,7 @@ func TestInjectDotNet(t *testing.T) {
890896
}
891897
config := config.New()
892898
pod := inj.inject(context.Background(), insts,
893-
corev1.Namespace{},
899+
testNamespace,
894900
corev1.Pod{
895901
Spec: corev1.PodSpec{
896902
Containers: []corev1.Container{
@@ -1005,7 +1011,7 @@ func TestInjectDotNet(t *testing.T) {
10051011
},
10061012
{
10071013
Name: "OTEL_RESOURCE_ATTRIBUTES",
1008-
Value: "k8s.container.name=app,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.version=latest",
1014+
Value: "k8s.container.name=app,k8s.namespace.name=ns,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.instance.id=ns.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).app,service.version=latest",
10091015
},
10101016
},
10111017
},
@@ -1183,7 +1189,7 @@ func TestInjectGo(t *testing.T) {
11831189
},
11841190
{
11851191
Name: "OTEL_RESOURCE_ATTRIBUTES",
1186-
Value: "k8s.container.name=app,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.version=latest",
1192+
Value: "k8s.container.name=app,k8s.namespace.name=ns,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.instance.id=ns.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).app,service.version=latest",
11871193
},
11881194
},
11891195
},
@@ -1300,7 +1306,7 @@ func TestInjectGo(t *testing.T) {
13001306
},
13011307
{
13021308
Name: "OTEL_RESOURCE_ATTRIBUTES",
1303-
Value: "k8s.container.name=app,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.version=latest",
1309+
Value: "k8s.container.name=app,k8s.namespace.name=ns,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.instance.id=ns.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).app,service.version=latest",
13041310
},
13051311
},
13061312
},
@@ -1325,7 +1331,7 @@ func TestInjectGo(t *testing.T) {
13251331
inj := sdkInjector{
13261332
logger: logr.Discard(),
13271333
}
1328-
pod := inj.inject(context.Background(), test.insts, corev1.Namespace{}, test.pod, test.config)
1334+
pod := inj.inject(context.Background(), test.insts, testNamespace, test.pod, test.config)
13291335
assert.Equal(t, test.expected, pod)
13301336
})
13311337
}
@@ -1406,7 +1412,7 @@ func TestInjectApacheHttpd(t *testing.T) {
14061412
Env: []corev1.EnvVar{
14071413
{
14081414
Name: apacheAttributesEnvVar,
1409-
Value: "\n#Load the Otel Webserver SDK\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_common.so\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_resources.so\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_trace.so\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_otlp_recordable.so\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_exporter_ostream_span.so\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_exporter_otlp_grpc.so\n#Load the Otel ApacheModule SDK\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_webserver_sdk.so\n#Load the Apache Module. In this example for Apache 2.4\n#LoadModule otel_apache_module /opt/opentelemetry-webserver/agent/WebServerModule/Apache/libmod_apache_otel.so\n#Load the Apache Module. In this example for Apache 2.2\n#LoadModule otel_apache_module /opt/opentelemetry-webserver/agent/WebServerModule/Apache/libmod_apache_otel22.so\nLoadModule otel_apache_module /opt/opentelemetry-webserver/agent/WebServerModule/Apache/libmod_apache_otel.so\n#Attributes\nApacheModuleEnabled ON\nApacheModuleOtelExporterEndpoint https://collector:4318\nApacheModuleOtelSpanExporter otlp\nApacheModuleResolveBackends ON\nApacheModuleServiceInstanceId <<SID-PLACEHOLDER>>\nApacheModuleServiceName app\nApacheModuleServiceNamespace apache-httpd\nApacheModuleTraceAsError ON\n",
1415+
Value: "\n#Load the Otel Webserver SDK\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_common.so\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_resources.so\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_trace.so\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_otlp_recordable.so\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_exporter_ostream_span.so\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_exporter_otlp_grpc.so\n#Load the Otel ApacheModule SDK\nLoadFile /opt/opentelemetry-webserver/agent/sdk_lib/lib/libopentelemetry_webserver_sdk.so\n#Load the Apache Module. In this example for Apache 2.4\n#LoadModule otel_apache_module /opt/opentelemetry-webserver/agent/WebServerModule/Apache/libmod_apache_otel.so\n#Load the Apache Module. In this example for Apache 2.2\n#LoadModule otel_apache_module /opt/opentelemetry-webserver/agent/WebServerModule/Apache/libmod_apache_otel22.so\nLoadModule otel_apache_module /opt/opentelemetry-webserver/agent/WebServerModule/Apache/libmod_apache_otel.so\n#Attributes\nApacheModuleEnabled ON\nApacheModuleOtelExporterEndpoint https://collector:4318\nApacheModuleOtelSpanExporter otlp\nApacheModuleResolveBackends ON\nApacheModuleServiceInstanceId <<SID-PLACEHOLDER>>\nApacheModuleServiceName app\nApacheModuleServiceNamespace ns\nApacheModuleTraceAsError ON\n",
14101416
},
14111417
{Name: apacheServiceInstanceIdEnvVar,
14121418
ValueFrom: &corev1.EnvVarSource{
@@ -1484,7 +1490,7 @@ func TestInjectApacheHttpd(t *testing.T) {
14841490
},
14851491
{
14861492
Name: "OTEL_RESOURCE_ATTRIBUTES",
1487-
Value: "k8s.container.name=app,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME)",
1493+
Value: "k8s.container.name=app,k8s.namespace.name=ns,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.instance.id=ns.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).app",
14881494
},
14891495
},
14901496
},
@@ -1499,7 +1505,7 @@ func TestInjectApacheHttpd(t *testing.T) {
14991505
logger: logr.Discard(),
15001506
}
15011507

1502-
pod := inj.inject(context.Background(), test.insts, corev1.Namespace{}, test.pod, test.config)
1508+
pod := inj.inject(context.Background(), test.insts, testNamespace, test.pod, test.config)
15031509
assert.Equal(t, test.expected, pod)
15041510
})
15051511
}
@@ -1585,7 +1591,7 @@ func TestInjectNginx(t *testing.T) {
15851591
Env: []corev1.EnvVar{
15861592
{
15871593
Name: nginxAttributesEnvVar,
1588-
Value: "NginxModuleEnabled ON;\nNginxModuleOtelExporterEndpoint http://otlp-endpoint:4317;\nNginxModuleOtelMaxQueueSize 4096;\nNginxModuleOtelSpanExporter otlp;\nNginxModuleResolveBackends ON;\nNginxModuleServiceInstanceId <<SID-PLACEHOLDER>>;\nNginxModuleServiceName my-nginx-6c44bcbdd;\nNginxModuleServiceNamespace nginx;\nNginxModuleTraceAsError ON;\n",
1594+
Value: "NginxModuleEnabled ON;\nNginxModuleOtelExporterEndpoint http://otlp-endpoint:4317;\nNginxModuleOtelMaxQueueSize 4096;\nNginxModuleOtelSpanExporter otlp;\nNginxModuleResolveBackends ON;\nNginxModuleServiceInstanceId <<SID-PLACEHOLDER>>;\nNginxModuleServiceName my-nginx-6c44bcbdd;\nNginxModuleServiceNamespace ns;\nNginxModuleTraceAsError ON;\n",
15891595
},
15901596
{
15911597
Name: "OTEL_NGINX_I13N_SCRIPT",
@@ -1664,7 +1670,7 @@ func TestInjectNginx(t *testing.T) {
16641670
},
16651671
{
16661672
Name: "OTEL_RESOURCE_ATTRIBUTES",
1667-
Value: "k8s.container.name=app,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=my-nginx-6c44bcbdd",
1673+
Value: "k8s.container.name=app,k8s.namespace.name=ns,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=my-nginx-6c44bcbdd,service.instance.id=ns.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).app",
16681674
},
16691675
},
16701676
},
@@ -1678,7 +1684,7 @@ func TestInjectNginx(t *testing.T) {
16781684
inj := sdkInjector{
16791685
logger: logr.Discard(),
16801686
}
1681-
pod := inj.inject(context.Background(), test.insts, corev1.Namespace{}, test.pod, test.config)
1687+
pod := inj.inject(context.Background(), test.insts, testNamespace, test.pod, test.config)
16821688
assert.Equal(t, test.expected, pod)
16831689
})
16841690
}
@@ -1701,7 +1707,7 @@ func TestInjectSdkOnly(t *testing.T) {
17011707
}
17021708
config := config.New()
17031709
pod := inj.inject(context.Background(), insts,
1704-
corev1.Namespace{},
1710+
testNamespace,
17051711
corev1.Pod{
17061712
Spec: corev1.PodSpec{
17071713
Containers: []corev1.Container{
@@ -1761,7 +1767,7 @@ func TestInjectSdkOnly(t *testing.T) {
17611767
},
17621768
{
17631769
Name: "OTEL_RESOURCE_ATTRIBUTES",
1764-
Value: "k8s.container.name=app,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.version=latest",
1770+
Value: "k8s.container.name=app,k8s.namespace.name=ns,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),service.instance.id=ns.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).app,service.version=latest",
17651771
},
17661772
},
17671773
},

tests/e2e/env-vars/01-assert.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,5 @@ spec:
4242
( contains(@, 'k8s.deployment.name=my-deploy') ): true
4343
( contains(@, concat('k8s.namespace.name=', $namespace)) ): true
4444
( contains(@, 'k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME)') ): true
45+
( contains(@, join('', ['service.instance.id=', $namespace, '.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).myapp']) ) ): true
4546
( contains(@, 'service.version=main') ): true

tests/e2e/env-vars/02-assert.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,5 @@ spec:
4545
( contains(@, 'k8s.cronjob.name=my-cron-job') ): true
4646
( contains(@, concat('k8s.namespace.name=', $namespace)) ): true
4747
( contains(@, 'k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME)') ): true
48+
( contains(@, join('', ['service.instance.id=', $namespace, '.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).myapp']) ) ): true
4849
( contains(@, 'service.version=main') ): true

tests/e2e/env-vars/03-assert.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,5 @@ spec:
4444
( contains(@, 'k8s.job.name=my-job') ): true
4545
( contains(@, concat('k8s.namespace.name=', $namespace)) ): true
4646
( contains(@, 'k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME)') ): true
47+
( contains(@, join('', ['service.instance.id=', $namespace, '.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).myapp']) ) ): true
4748
( contains(@, 'service.version=main') ): true

0 commit comments

Comments
 (0)