From 9c2fdbd6b58ce37e606e05779e793e13ccd2b7b2 Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Wed, 21 May 2025 14:07:40 +0200 Subject: [PATCH 1/7] add extracted service name and span.kind --- src/trace/listener.ts | 7 ++++++- src/trace/span-inferrer.ts | 40 +++++++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/trace/listener.ts b/src/trace/listener.ts index a1531fde..dd3edd88 100644 --- a/src/trace/listener.ts +++ b/src/trace/listener.ts @@ -319,10 +319,15 @@ export class TraceListener { options.childOf = this.lambdaSpanParentContext; } options.type = "serverless"; - options.service = "aws.lambda"; + if (this.context) { options.resource = this.context.functionName; + + options.service = this.context.functionName || "aws.lambda"; + return this.tracerWrapper.wrap(this.context.functionName, options, func); //REMOVE } + + options.service = "aws.lambda"; return this.tracerWrapper.wrap("aws.lambda", options, func); } } diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index 5e2af7ea..8c365797 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -81,7 +81,7 @@ export class SpanInferrer { return "sync"; } - static determineServiceName(specificKey: string, genericKey: string, fallback: string): string { + static determineServiceName(specificKey: string, genericKey: string, extractedKey: string, fallback: string): string { return this.serviceMapping[specificKey] || this.serviceMapping[genericKey] || fallback; } @@ -104,7 +104,7 @@ export class SpanInferrer { } const resourceName = [method || domain, resourcePath].join(" "); const apiId = event.requestContext.apiId || ""; - const serviceName = SpanInferrer.determineServiceName(apiId, "lambda_api_gateway", domain); + const serviceName = SpanInferrer.determineServiceName(apiId, "lambda_api_gateway", domain, "api_gateway"); options.tags = { operation_name: "aws.apigateway", @@ -201,7 +201,7 @@ export class SpanInferrer { } const resourceName = [method || domain, path].join(" "); const apiId: string = event.requestContext.apiId || ""; - const serviceName: string = SpanInferrer.determineServiceName(apiId, "lambda_url", domain); + const serviceName: string = SpanInferrer.determineServiceName(apiId, "lambda_url", domain, "lambda_url"); options.tags = { operation_name: "aws.lambda.url", @@ -241,7 +241,10 @@ export class SpanInferrer { const { eventSourceARN, eventName, eventVersion, eventID, dynamodb } = referenceRecord; const [tableArn, tableName] = eventSourceARN?.split("/") || ["", ""]; const resourceName = `${eventName} ${tableName}`; - const serviceName = SpanInferrer.determineServiceName(tableName, "lambda_dynamodb", "aws.dynamodb"); + + //REMOVE + //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME + const serviceName = SpanInferrer.determineServiceName(tableName, "lambda_dynamodb", tableName, "dynamodb"); options.tags = { operation_name: "aws.dynamodb", tablename: tableName, @@ -296,7 +299,10 @@ export class SpanInferrer { const topicName = TopicArn?.split(":").pop() || ""; const resourceName = topicName; - const serviceName = SpanInferrer.determineServiceName(topicName, "lambda_sns", "sns"); + + //REMOVE + //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME + const serviceName = SpanInferrer.determineServiceName(topicName, "lambda_sns", topicName, "sns"); options.tags = { operation_name: "aws.sns", resource_names: resourceName, @@ -306,6 +312,7 @@ export class SpanInferrer { "span.type": "sns", "resource.name": resourceName, "peer.service": this.service, + "span.kind": "server", _inferred_span: { tag_source: "self", synchronicity: "async", @@ -347,7 +354,10 @@ export class SpanInferrer { } = referenceRecord; const queueName = eventSourceARN?.split(":").pop() || ""; const resourceName = queueName; - const serviceName = SpanInferrer.determineServiceName(queueName, "lambda_sqs", "sqs"); + + //REMOVE + //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME + const serviceName = SpanInferrer.determineServiceName(queueName, "lambda_sqs", queueName, "sqs"); options.tags = { operation_name: "aws.sqs", resource_names: resourceName, @@ -357,6 +367,7 @@ export class SpanInferrer { "span.type": "web", "resource.name": resourceName, "peer.service": this.service, + "span.kind": "server", _inferred_span: { tag_source: "self", synchronicity: "async", @@ -413,7 +424,10 @@ export class SpanInferrer { } = referenceRecord; const streamName = eventSourceARN?.split(":").pop() || ""; const shardId = eventID.split(":").pop(); - const serviceName = SpanInferrer.determineServiceName(streamName, "lambda_kinesis", "kinesis"); + + //REMOVE + //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME + const serviceName = SpanInferrer.determineServiceName(streamName, "lambda_kinesis", streamName, "kinesis"); options.tags = { operation_name: "aws.kinesis", resource_names: streamName, @@ -423,6 +437,7 @@ export class SpanInferrer { "span.type": "web", "resource.name": streamName, "peer.service": this.service, + "span.kind": "server", _inferred_span: { tag_source: "self", synchronicity: "async", @@ -461,7 +476,10 @@ export class SpanInferrer { eventTime, eventName, } = referenceRecord; - const serviceName = SpanInferrer.determineServiceName(bucketName, "lambda_s3", "s3"); + + //REMOVE + //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME + const serviceName = SpanInferrer.determineServiceName(bucketName, "lambda_s3", bucketName, "s3"); options.tags = { operation_name: "aws.s3", resource_names: bucketName, @@ -499,7 +517,10 @@ export class SpanInferrer { ): SpanWrapper { const options: SpanOptions = {}; const { time, source } = event as EventBridgeEvent; - const serviceName = SpanInferrer.determineServiceName(source, "lambda_eventbridge", "eventbridge"); + + //REMOVE + //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME + const serviceName = SpanInferrer.determineServiceName(source, "lambda_eventbridge", source, "eventbridge"); options.tags = { operation_name: "aws.eventbridge", resource_names: source, @@ -509,6 +530,7 @@ export class SpanInferrer { "span.type": "web", "resource.name": source, "peer.service": this.service, + "span.kind": "server", _inferred_span: { tag_source: "self", synchronicity: "async", From f88d0c34f3ac7c4a1d40176ae4c4c3d2dccee6b8 Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Wed, 21 May 2025 14:33:52 +0200 Subject: [PATCH 2/7] fix base case for naming --- src/trace/span-inferrer.ts | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index 8c365797..c6e0b49e 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -82,7 +82,9 @@ export class SpanInferrer { } static determineServiceName(specificKey: string, genericKey: string, extractedKey: string, fallback: string): string { - return this.serviceMapping[specificKey] || this.serviceMapping[genericKey] || fallback; + return this.serviceMapping[specificKey] || + this.serviceMapping[genericKey] || + (extractedKey?.trim() ? extractedKey : fallback); } createInferredSpanForApiGateway( @@ -241,9 +243,6 @@ export class SpanInferrer { const { eventSourceARN, eventName, eventVersion, eventID, dynamodb } = referenceRecord; const [tableArn, tableName] = eventSourceARN?.split("/") || ["", ""]; const resourceName = `${eventName} ${tableName}`; - - //REMOVE - //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME const serviceName = SpanInferrer.determineServiceName(tableName, "lambda_dynamodb", tableName, "dynamodb"); options.tags = { operation_name: "aws.dynamodb", @@ -299,9 +298,6 @@ export class SpanInferrer { const topicName = TopicArn?.split(":").pop() || ""; const resourceName = topicName; - - //REMOVE - //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME const serviceName = SpanInferrer.determineServiceName(topicName, "lambda_sns", topicName, "sns"); options.tags = { operation_name: "aws.sns", @@ -354,9 +350,6 @@ export class SpanInferrer { } = referenceRecord; const queueName = eventSourceARN?.split(":").pop() || ""; const resourceName = queueName; - - //REMOVE - //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME const serviceName = SpanInferrer.determineServiceName(queueName, "lambda_sqs", queueName, "sqs"); options.tags = { operation_name: "aws.sqs", @@ -424,9 +417,6 @@ export class SpanInferrer { } = referenceRecord; const streamName = eventSourceARN?.split(":").pop() || ""; const shardId = eventID.split(":").pop(); - - //REMOVE - //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME const serviceName = SpanInferrer.determineServiceName(streamName, "lambda_kinesis", streamName, "kinesis"); options.tags = { operation_name: "aws.kinesis", @@ -476,9 +466,6 @@ export class SpanInferrer { eventTime, eventName, } = referenceRecord; - - //REMOVE - //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME const serviceName = SpanInferrer.determineServiceName(bucketName, "lambda_s3", bucketName, "s3"); options.tags = { operation_name: "aws.s3", @@ -517,9 +504,6 @@ export class SpanInferrer { ): SpanWrapper { const options: SpanOptions = {}; const { time, source } = event as EventBridgeEvent; - - //REMOVE - //ADD HARDCODED DEFAULT AND EXTRACTED SERVICE NAME const serviceName = SpanInferrer.determineServiceName(source, "lambda_eventbridge", source, "eventbridge"); options.tags = { operation_name: "aws.eventbridge", From ed4d1a6893e71c22d063bc9c9549cacfd7c8b287 Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Wed, 21 May 2025 15:14:22 +0200 Subject: [PATCH 3/7] adds span.kind --- src/trace/listener.ts | 2 +- src/trace/span-inferrer.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/trace/listener.ts b/src/trace/listener.ts index dd3edd88..ac49c35d 100644 --- a/src/trace/listener.ts +++ b/src/trace/listener.ts @@ -324,7 +324,7 @@ export class TraceListener { options.resource = this.context.functionName; options.service = this.context.functionName || "aws.lambda"; - return this.tracerWrapper.wrap(this.context.functionName, options, func); //REMOVE + return this.tracerWrapper.wrap(this.context.functionName, options, func); } options.service = "aws.lambda"; diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index c6e0b49e..272fe5b0 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -119,6 +119,7 @@ export class SpanInferrer { "span.type": "http", "resource.name": resourceName, "peer.service": this.service, + "span.kind": "server", apiid: apiId, _inferred_span: { tag_source: "self", @@ -217,6 +218,7 @@ export class SpanInferrer { "span.type": "http", "resource.name": resourceName, "peer.service": this.service, + "span.kind": "server", _inferred_span: { tag_source: "self", synchronicity: "sync", @@ -254,6 +256,7 @@ export class SpanInferrer { "span.type": "web", "resource.name": resourceName, "peer.service": this.service, + "span.kind": "server", _inferred_span: { tag_source: "self", synchronicity: "async", @@ -476,6 +479,7 @@ export class SpanInferrer { "span.type": "web", "resource.name": bucketName, "peer.service": this.service, + "span.kind": "server", _inferred_span: { tag_source: "self", synchronicity: "async", From bebb14600acca170472f69ebe691e76a7b9189cf Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Thu, 22 May 2025 11:36:38 +0200 Subject: [PATCH 4/7] remove streamname prefix --- src/trace/span-inferrer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index 272fe5b0..2802ccd5 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -418,7 +418,7 @@ export class SpanInferrer { eventVersion, eventID, } = referenceRecord; - const streamName = eventSourceARN?.split(":").pop() || ""; + const streamName = (eventSourceARN?.split(":").pop() || "").replace(/^stream\//, ''); const shardId = eventID.split(":").pop(); const serviceName = SpanInferrer.determineServiceName(streamName, "lambda_kinesis", streamName, "kinesis"); options.tags = { From 05dcf4679c22998ba980b87215a26665118b6b29 Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Tue, 3 Jun 2025 11:37:04 -0400 Subject: [PATCH 5/7] update span.type and service names --- src/trace/listener.ts | 8 ++------ src/trace/span-inferrer.ts | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/trace/listener.ts b/src/trace/listener.ts index ac49c35d..873a45db 100644 --- a/src/trace/listener.ts +++ b/src/trace/listener.ts @@ -319,15 +319,11 @@ export class TraceListener { options.childOf = this.lambdaSpanParentContext; } options.type = "serverless"; - + options.service = "aws.lambda"; if (this.context) { options.resource = this.context.functionName; - - options.service = this.context.functionName || "aws.lambda"; - return this.tracerWrapper.wrap(this.context.functionName, options, func); + options.service = this.context.functionName; } - - options.service = "aws.lambda"; return this.tracerWrapper.wrap("aws.lambda", options, func); } } diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index 2802ccd5..bd4098c3 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -308,7 +308,7 @@ export class SpanInferrer { request_id: context?.awsRequestId, service: serviceName, "service.name": serviceName, - "span.type": "sns", + "span.type": "web", "resource.name": resourceName, "peer.service": this.service, "span.kind": "server", From 061e2dad1438b3cb55ac12466f811a6245287d22 Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Tue, 3 Jun 2025 12:16:05 -0400 Subject: [PATCH 6/7] fix span.types --- src/trace/span-inferrer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index bd4098c3..1e5e530f 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -253,7 +253,7 @@ export class SpanInferrer { request_id: context?.awsRequestId, service: serviceName, "service.name": serviceName, - "span.type": "web", + "span.type": "db", "resource.name": resourceName, "peer.service": this.service, "span.kind": "server", @@ -360,7 +360,7 @@ export class SpanInferrer { request_id: context?.awsRequestId, service: serviceName, "service.name": serviceName, - "span.type": "web", + "span.type": "queue", "resource.name": resourceName, "peer.service": this.service, "span.kind": "server", From ab3aa72677a8fab2ebafa161160fd0f2f11eaabd Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Tue, 3 Jun 2025 12:17:55 -0400 Subject: [PATCH 7/7] fixed span.type fr --- src/trace/span-inferrer.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index 1e5e530f..e217633b 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -116,7 +116,7 @@ export class SpanInferrer { request_id: context?.awsRequestId, service: serviceName, "service.name": serviceName, - "span.type": "http", + "span.type": "web", "resource.name": resourceName, "peer.service": this.service, "span.kind": "server", @@ -215,7 +215,7 @@ export class SpanInferrer { request_id: context?.awsRequestId, service: serviceName, "service.name": serviceName, - "span.type": "http", + "span.type": "web", "resource.name": resourceName, "peer.service": this.service, "span.kind": "server", @@ -253,7 +253,7 @@ export class SpanInferrer { request_id: context?.awsRequestId, service: serviceName, "service.name": serviceName, - "span.type": "db", + "span.type": "web", "resource.name": resourceName, "peer.service": this.service, "span.kind": "server",