Skip to content

Commit c23457c

Browse files
authored
added fix in entity logic to fallback to workload name when unknown service is set by OTEL SDK (#1557)
1 parent 5e1b3aa commit c23457c

File tree

2 files changed

+82
-4
lines changed

2 files changed

+82
-4
lines changed

plugins/processors/awsentity/processor.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const (
2727
attributeService = "Service"
2828
attributeEC2TagAwsAutoscalingGroupName = "ec2.tag.aws:autoscaling:groupName"
2929
EMPTY = ""
30+
unknownService = "unknown_service"
3031
)
3132

3233
type scraper interface {
@@ -187,13 +188,14 @@ func (p *awsEntityProcessor) processMetrics(_ context.Context, md pmetric.Metric
187188
}
188189

189190
podInfo, ok := p.k8sscraper.(*k8sattributescraper.K8sAttributeScraper)
190-
// Perform fallback mechanism for service and environment name if they
191-
// are empty
192-
if entityServiceName == EMPTY && ok && podInfo != nil && podInfo.Workload != EMPTY {
191+
// Perform fallback mechanism for service name if it is empty
192+
// or has prefix unknown_service ( unknown_service will be set by OTEL SDK if the service name is empty on application pod)
193+
// https://opentelemetry.io/docs/specs/semconv/attributes-registry/service/
194+
if (entityServiceName == EMPTY || strings.HasPrefix(entityServiceName, unknownService)) && ok && podInfo != nil && podInfo.Workload != EMPTY {
193195
entityServiceName = podInfo.Workload
194196
entityServiceNameSource = entitystore.ServiceNameSourceK8sWorkload
195197
}
196-
198+
// Perform fallback mechanism for environment if it is empty
197199
if entityEnvironmentName == EMPTY && ok && podInfo.Cluster != EMPTY && podInfo.Namespace != EMPTY {
198200
if p.config.KubernetesMode == config.ModeEKS {
199201
entityEnvironmentName = "eks:" + p.config.ClusterName + "/" + podInfo.Namespace

plugins/processors/awsentity/processor_test.go

+76
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,82 @@ func TestProcessMetricsResourceAttributeScraping(t *testing.T) {
375375
semconv.AttributeK8SNodeName: "test-node",
376376
},
377377
},
378+
{
379+
name: "ResourceAttributeWorkloadFallbackForUnknownService",
380+
kubernetesMode: config.ModeEKS,
381+
clusterName: "test-cluster",
382+
metrics: generateMetrics(semconv.AttributeK8SNamespaceName, "test-namespace", semconv.AttributeK8SDeploymentName, "test-workload", semconv.AttributeK8SNodeName, "test-node", semconv.AttributeServiceName, "unknown_service"),
383+
want: map[string]any{
384+
entityattributes.AttributeEntityType: "Service",
385+
entityattributes.AttributeEntityServiceName: "test-workload",
386+
entityattributes.AttributeEntityDeploymentEnvironment: "eks:test-cluster/test-namespace",
387+
entityattributes.AttributeEntityCluster: "test-cluster",
388+
entityattributes.AttributeEntityNamespace: "test-namespace",
389+
entityattributes.AttributeEntityNode: "test-node",
390+
entityattributes.AttributeEntityWorkload: "test-workload",
391+
entityattributes.AttributeEntityServiceNameSource: "K8sWorkload",
392+
entityattributes.AttributeEntityPlatformType: "AWS::EKS",
393+
semconv.AttributeK8SNamespaceName: "test-namespace",
394+
semconv.AttributeK8SDeploymentName: "test-workload",
395+
semconv.AttributeK8SNodeName: "test-node",
396+
attributeServiceName: "unknown_service",
397+
},
398+
},
399+
{
400+
name: "ResourceAttributeWorkloadFallbackForUnknownServiceJava",
401+
kubernetesMode: config.ModeEKS,
402+
clusterName: "test-cluster",
403+
metrics: generateMetrics(semconv.AttributeK8SNamespaceName, "test-namespace", semconv.AttributeK8SDeploymentName, "test-workload", semconv.AttributeK8SNodeName, "test-node", semconv.AttributeServiceName, "unknown_service:java"),
404+
want: map[string]any{
405+
entityattributes.AttributeEntityType: "Service",
406+
entityattributes.AttributeEntityServiceName: "test-workload",
407+
entityattributes.AttributeEntityDeploymentEnvironment: "eks:test-cluster/test-namespace",
408+
entityattributes.AttributeEntityCluster: "test-cluster",
409+
entityattributes.AttributeEntityNamespace: "test-namespace",
410+
entityattributes.AttributeEntityNode: "test-node",
411+
entityattributes.AttributeEntityWorkload: "test-workload",
412+
entityattributes.AttributeEntityServiceNameSource: "K8sWorkload",
413+
entityattributes.AttributeEntityPlatformType: "AWS::EKS",
414+
semconv.AttributeK8SNamespaceName: "test-namespace",
415+
semconv.AttributeK8SDeploymentName: "test-workload",
416+
semconv.AttributeK8SNodeName: "test-node",
417+
attributeServiceName: "unknown_service:java",
418+
},
419+
},
420+
{
421+
name: "ResourceAttributeWithUnknownServiceNegativeCase",
422+
kubernetesMode: config.ModeEKS,
423+
clusterName: "test-cluster",
424+
metrics: generateMetrics(semconv.AttributeK8SNamespaceName, "test-namespace", semconv.AttributeK8SDeploymentName, "test-workload", semconv.AttributeK8SNodeName, "test-node", semconv.AttributeServiceName, "unknown_servic"),
425+
want: map[string]any{
426+
entityattributes.AttributeEntityType: "Service",
427+
entityattributes.AttributeEntityServiceName: "unknown_servic",
428+
entityattributes.AttributeEntityDeploymentEnvironment: "eks:test-cluster/test-namespace",
429+
entityattributes.AttributeEntityCluster: "test-cluster",
430+
entityattributes.AttributeEntityNamespace: "test-namespace",
431+
entityattributes.AttributeEntityNode: "test-node",
432+
entityattributes.AttributeEntityWorkload: "test-workload",
433+
entityattributes.AttributeEntityPlatformType: "AWS::EKS",
434+
semconv.AttributeK8SNamespaceName: "test-namespace",
435+
semconv.AttributeK8SDeploymentName: "test-workload",
436+
semconv.AttributeK8SNodeName: "test-node",
437+
attributeServiceName: "unknown_servic",
438+
},
439+
},
440+
{
441+
name: "ResourceAttributeWorkloadFallbackForUnknownServiceJava",
442+
kubernetesMode: config.ModeEKS,
443+
clusterName: "test-cluster",
444+
metrics: generateMetrics(semconv.AttributeK8SNamespaceName, "test-namespace", semconv.AttributeK8SNodeName, "test-node", semconv.AttributeServiceName, "unknown_service:java"),
445+
want: map[string]any{
446+
entityattributes.AttributeEntityType: "Service",
447+
entityattributes.AttributeEntityServiceName: "unknown_service:java",
448+
entityattributes.AttributeEntityDeploymentEnvironment: "eks:test-cluster/test-namespace",
449+
semconv.AttributeK8SNamespaceName: "test-namespace",
450+
semconv.AttributeK8SNodeName: "test-node",
451+
attributeServiceName: "unknown_service:java",
452+
},
453+
},
378454
{
379455
name: "ResourceAttributeEnvironmentFallbackToASG",
380456
platform: config.ModeEC2,

0 commit comments

Comments
 (0)