Skip to content

Commit 99d87a4

Browse files
duncanistaastuyve
andauthored
feat: add peer.service in inferred spans (#391)
* add `peer.service` in span inferrer also updated unit tests to make sure its being added given the context * update snapshots * update `peer.service` to be `process.env.DD_SERVICE` * update snapshots --------- Co-authored-by: AJ Stuyvenberg <astuyve@gmail.com>
1 parent 32e3803 commit 99d87a4

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed

src/trace/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,5 @@ export const ddtraceVersion = "X.X.X";
2424
export const apiGatewayEventV2 = "2.0";
2525
export const parentSpanFinishTimeHeader = "x-datadog-parent-span-finish-time";
2626
export const authorizingRequestIdHeader = "x-datadog-authorizing-requestid";
27+
28+
export const DD_SERVICE_ENV_VAR = "DD_SERVICE";

src/trace/span-inferrer.spec.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import { Context } from "aws-lambda";
12
import { SpanInferrer } from "./span-inferrer";
23
import { SpanContext, TracerWrapper } from "./tracer-wrapper";
4+
import { DD_SERVICE_ENV_VAR } from "./constants";
35
const snssqsEvent = require("../../event_samples/snssqs.json");
46
const snsEvent = require("../../event_samples/sns.json");
57
const sqsEvent = require("../../event_samples/sqs.json");
@@ -24,8 +26,18 @@ const mockWrapper = {
2426
};
2527

2628
describe("SpanInferrer", () => {
29+
let oldEnv: any;
2730
beforeEach(() => {
2831
mockWrapper.startSpan.mockClear();
32+
33+
oldEnv = process.env;
34+
process.env = {
35+
[DD_SERVICE_ENV_VAR]: "mock-lambda-service",
36+
};
37+
});
38+
39+
afterEach(() => {
40+
process.env = oldEnv;
2941
});
3042

3143
afterEach(() => {
@@ -388,6 +400,7 @@ describe("SpanInferrer", () => {
388400
event_subscription_arn: "arn:aws:sns:us-east-1:123456789012:ExampleTopic",
389401
message_id: "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
390402
operation_name: "aws.sns",
403+
"peer.service": "mock-lambda-service",
391404
request_id: undefined,
392405
"resource.name": "ExampleTopic",
393406
resource_names: "ExampleTopic",
@@ -412,6 +425,7 @@ describe("SpanInferrer", () => {
412425
_inferred_span: { synchronicity: "async", tag_source: "self" },
413426
event_source_arn: "arn:aws:sqs:us-east-1:123456789012:MyQueue",
414427
operation_name: "aws.sqs",
428+
"peer.service": "mock-lambda-service",
415429
queuename: "MyQueue",
416430
receipt_handle: "MessageReceiptHandle",
417431
request_id: undefined,
@@ -442,6 +456,7 @@ describe("SpanInferrer", () => {
442456
"arn:aws:dynamodb:us-east-1:123456789012:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899",
443457
event_version: "1.1",
444458
operation_name: "aws.dynamodb",
459+
"peer.service": "mock-lambda-service",
445460
request_id: undefined,
446461
"resource.name": "INSERT ExampleTableWithStream",
447462
resource_names: "INSERT ExampleTableWithStream",
@@ -467,6 +482,7 @@ describe("SpanInferrer", () => {
467482
event_source_arn: "arn:aws:kinesis:EXAMPLE",
468483
event_version: "1.0",
469484
operation_name: "aws.kinesis",
485+
"peer.service": "mock-lambda-service",
470486
partition_key: "cdbfd750-cec0-4f0f-a4b0-82ae6152c7fb",
471487
request_id: undefined,
472488
"resource.name": "EXAMPLE",
@@ -493,6 +509,7 @@ describe("SpanInferrer", () => {
493509
_inferred_span: { synchronicity: "async", tag_source: "self" },
494510
message_id: "0a0ab23e-4861-5447-82b7-e8094ff3e332",
495511
operation_name: "aws.sns",
512+
"peer.service": "mock-lambda-service",
496513
"resource.name": "js-library-test-dev-demoTopic-15WGUVRCBMPAA",
497514
resource_names: "js-library-test-dev-demoTopic-15WGUVRCBMPAA",
498515
service: "sns",
@@ -513,6 +530,7 @@ describe("SpanInferrer", () => {
513530
_inferred_span: { synchronicity: "async", tag_source: "self" },
514531
event_source_arn: "arn:aws:sqs:eu-west-1:601427279990:aj-js-library-test-dev-demo-queue",
515532
operation_name: "aws.sqs",
533+
"peer.service": "mock-lambda-service",
516534
queuename: "aj-js-library-test-dev-demo-queue",
517535
receipt_handle:
518536
"AQEBER6aRkfG8092GvkL7FRwCwbQ7LLDW9Tlk/CembqHe+suS2kfFxXiukomvaIN61QoyQMoRgWuV52SDkiQno2u+5hP64BDbmw+e/KR9ayvIfHJ3M6RfyQLaWNWm3hDFBCKTnBMVIxtdx0N9epZZewyokjKcrNYtmCghFgTCvZzsQkowi5rnoHAVHJ3je1c3bDnQ1KLrZFgajDnootYXDwEPuMq5FIxrf4EzTe0S7S+rnRm+GaQfeBLBVAY6dASL9usV3/AFRqDtaI7GKI+0F2NCgLlqj49VlPRz4ldhkGknYlKTZTluAqALWLJS62/J1GQo53Cs3nneJcmu5ajB2zzmhhRXoXINEkLhCD5ujZfcsw9H4xqW69Or4ECvlqx14bUU2rtMIW0QM2p7pEeXnyocymQv6m1te113eYWTVmaJ4I=",
@@ -540,6 +558,7 @@ describe("SpanInferrer", () => {
540558
tags: {
541559
_inferred_span: { synchronicity: "async", tag_source: "self" },
542560
operation_name: "aws.eventbridge",
561+
"peer.service": "mock-lambda-service",
543562
request_id: undefined,
544563
"resource.name": "my.event",
545564
resource_names: "my.event",
@@ -565,6 +584,7 @@ describe("SpanInferrer", () => {
565584
"http.url": "08se3mvh28.execute-api.eu-west-1.amazonaws.com$connect",
566585
message_direction: "IN",
567586
operation_name: "aws.apigateway",
587+
"peer.service": "mock-lambda-service",
568588
request_id: undefined,
569589
"resource.name": "08se3mvh28.execute-api.eu-west-1.amazonaws.com $connect",
570590
resource_names: "08se3mvh28.execute-api.eu-west-1.amazonaws.com $connect",
@@ -589,6 +609,7 @@ describe("SpanInferrer", () => {
589609
"http.url": "id.execute-api.us-east-1.amazonaws.com/my/path",
590610
domain_name: "id.execute-api.us-east-1.amazonaws.com",
591611
operation_name: "aws.apigateway",
612+
"peer.service": "mock-lambda-service",
592613
request_id: undefined,
593614
"http.method": "GET",
594615
"resource.name": "GET /path",
@@ -615,6 +636,7 @@ describe("SpanInferrer", () => {
615636
"http.url": "r3pmxmplak.execute-api.us-east-2.amazonaws.com/default/nodejs-apig-function-1G3XMPLZXVXYI",
616637
domain_name: "r3pmxmplak.execute-api.us-east-2.amazonaws.com",
617638
operation_name: "aws.apigateway",
639+
"peer.service": "mock-lambda-service",
618640
request_id: undefined,
619641
"http.method": "GET",
620642
"resource.name": "GET /default/nodejs-apig-function-1G3XMPLZXVXYI",
@@ -643,6 +665,7 @@ describe("SpanInferrer", () => {
643665
"http.method": "GET",
644666
"http.url": "a8hyhsshac.lambda-url.eu-south-1.amazonaws.com/",
645667
operation_name: "aws.lambda.url",
668+
"peer.service": "mock-lambda-service",
646669
request_id: undefined,
647670
"resource.name": "GET /",
648671
resource_names: "GET /",
@@ -669,6 +692,7 @@ describe("SpanInferrer", () => {
669692
object_key: "test/key",
670693
object_size: 1024,
671694
operation_name: "aws.s3",
695+
"peer.service": "mock-lambda-service",
672696
request_id: undefined,
673697
"resource.name": "example-bucket",
674698
resource_names: "example-bucket",
@@ -689,17 +713,24 @@ describe("Authorizer Spans", () => {
689713
};
690714
}),
691715
};
716+
let oldEnv: any;
692717

693718
beforeEach(() => {
694719
mockWrapperWithFinish.startSpan = jest.fn(() => {
695720
return {
696721
finish: mockFinish,
697722
};
698723
});
724+
725+
oldEnv = process.env;
726+
process.env = {
727+
[DD_SERVICE_ENV_VAR]: "mock-lambda-service",
728+
};
699729
});
700730

701731
afterEach(() => {
702732
mockWrapperWithFinish.startSpan.mockReset();
733+
process.env = oldEnv;
703734
});
704735

705736
it("creates an inferred span for API Gateway V1 event with traced authorizers [Request Type]", () => {
@@ -718,6 +749,7 @@ describe("Authorizer Spans", () => {
718749
"http.method": "POST",
719750
"http.url": "3gsxz7lha4.execute-api.eu-west-1.amazonaws.com/dev/hello",
720751
operation_name: "aws.apigateway",
752+
"peer.service": "mock-lambda-service",
721753
request_id: undefined,
722754
"resource.name": "POST /hello",
723755
resource_names: "POST /hello",
@@ -741,6 +773,7 @@ describe("Authorizer Spans", () => {
741773
"http.method": "POST",
742774
"http.url": "3gsxz7lha4.execute-api.eu-west-1.amazonaws.com/dev/hello",
743775
operation_name: "aws.apigateway",
776+
"peer.service": "mock-lambda-service",
744777
request_id: undefined,
745778
"resource.name": "POST /hello",
746779
resource_names: "POST /hello",
@@ -769,6 +802,7 @@ describe("Authorizer Spans", () => {
769802
"http.method": "POST",
770803
"http.url": "3gsxz7lha4.execute-api.eu-west-1.amazonaws.com/dev/hello",
771804
operation_name: "aws.apigateway",
805+
"peer.service": "mock-lambda-service",
772806
request_id: undefined,
773807
"resource.name": "POST /hello",
774808
resource_names: "POST /hello",
@@ -797,6 +831,7 @@ describe("Authorizer Spans", () => {
797831
"http.method": "GET",
798832
"http.url": "4dyr9xqip7.execute-api.eu-west-1.amazonaws.com/dev/hi",
799833
operation_name: "aws.apigateway",
834+
"peer.service": "mock-lambda-service",
800835
request_id: undefined,
801836
"resource.name": "GET /hi",
802837
resource_names: "GET /hi",
@@ -820,6 +855,7 @@ describe("Authorizer Spans", () => {
820855
"http.method": "GET",
821856
"http.url": "4dyr9xqip7.execute-api.eu-west-1.amazonaws.com/dev/hi",
822857
operation_name: "aws.apigateway",
858+
"peer.service": "mock-lambda-service",
823859
request_id: undefined,
824860
"resource.name": "GET /hi",
825861
resource_names: "GET /hi",
@@ -848,6 +884,7 @@ describe("Authorizer Spans", () => {
848884
"http.method": "GET",
849885
"http.url": "4dyr9xqip7.execute-api.eu-west-1.amazonaws.com/dev/hi",
850886
operation_name: "aws.apigateway",
887+
"peer.service": "mock-lambda-service",
851888
request_id: undefined,
852889
"resource.name": "GET /hi",
853890
resource_names: "GET /hi",
@@ -876,6 +913,7 @@ describe("Authorizer Spans", () => {
876913
"http.method": "GET",
877914
"http.url": "l9flvsey83.execute-api.eu-west-1.amazonaws.com/hello",
878915
operation_name: "aws.httpapi",
916+
"peer.service": "mock-lambda-service",
879917
request_id: undefined,
880918
"resource.name": "GET /hello",
881919
resource_names: "GET /hello",
@@ -904,6 +942,7 @@ describe("Authorizer Spans", () => {
904942
"http.method": "GET",
905943
"http.url": "l9flvsey83.execute-api.eu-west-1.amazonaws.com/hello",
906944
operation_name: "aws.apigateway",
945+
"peer.service": "mock-lambda-service",
907946
request_id: undefined,
908947
"resource.name": "GET /hello",
909948
resource_names: "GET /hello",
@@ -933,6 +972,7 @@ describe("Authorizer Spans", () => {
933972
"http.url": "85fj5nw29d.execute-api.eu-west-1.amazonaws.com$connect",
934973
message_direction: "IN",
935974
operation_name: "aws.apigateway",
975+
"peer.service": "mock-lambda-service",
936976
request_id: undefined,
937977
"resource.name": "85fj5nw29d.execute-api.eu-west-1.amazonaws.com $connect",
938978
resource_names: "85fj5nw29d.execute-api.eu-west-1.amazonaws.com $connect",
@@ -956,6 +996,7 @@ describe("Authorizer Spans", () => {
956996
"http.url": "85fj5nw29d.execute-api.eu-west-1.amazonaws.com$connect",
957997
message_direction: "IN",
958998
operation_name: "aws.apigateway",
999+
"peer.service": "mock-lambda-service",
9591000
request_id: undefined,
9601001
"resource.name": "85fj5nw29d.execute-api.eu-west-1.amazonaws.com $connect",
9611002
resource_names: "85fj5nw29d.execute-api.eu-west-1.amazonaws.com $connect",
@@ -984,6 +1025,7 @@ describe("Authorizer Spans", () => {
9841025
"http.url": "85fj5nw29d.execute-api.eu-west-1.amazonaws.comhello",
9851026
message_direction: "IN",
9861027
operation_name: "aws.apigateway",
1028+
"peer.service": "mock-lambda-service",
9871029
request_id: undefined,
9881030
"resource.name": "85fj5nw29d.execute-api.eu-west-1.amazonaws.com hello",
9891031
resource_names: "85fj5nw29d.execute-api.eu-west-1.amazonaws.com hello",

src/trace/span-inferrer.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,18 @@ import {
1111
import { SpanContext, SpanOptions, TracerWrapper } from "./tracer-wrapper";
1212
import { eventSubTypes, eventTypes, parseEventSource, parseEventSourceSubType } from "./trigger";
1313
import { SpanWrapper } from "./span-wrapper";
14-
import { parentSpanFinishTimeHeader } from "./constants";
14+
import { DD_SERVICE_ENV_VAR, parentSpanFinishTimeHeader } from "./constants";
1515
import { logDebug } from "../utils";
1616
import { getInjectedAuthorizerData } from "./context";
1717
import { decodeAuthorizerContextEnvVar } from "../index";
1818

1919
export class SpanInferrer {
2020
private static serviceMapping: Record<string, string> = {};
2121
traceWrapper: TracerWrapper;
22+
service?: string;
2223
constructor(traceWrapper: TracerWrapper) {
2324
this.traceWrapper = traceWrapper;
25+
this.service = process.env[DD_SERVICE_ENV_VAR];
2426
SpanInferrer.initServiceMapping();
2527
}
2628

@@ -113,6 +115,7 @@ export class SpanInferrer {
113115
"span.type": "http",
114116
"resource.name": resourceName,
115117
"service.name": domain,
118+
"peer.service": this.service,
116119
apiid: apiId,
117120
service: serviceName,
118121
_inferred_span: {
@@ -210,6 +213,7 @@ export class SpanInferrer {
210213
"span.type": "http",
211214
"resource.name": resourceName,
212215
"service.name": domain,
216+
"peer.service": this.service,
213217
service: serviceName,
214218
_inferred_span: {
215219
tag_source: "self",
@@ -245,6 +249,7 @@ export class SpanInferrer {
245249
request_id: context?.awsRequestId,
246250
"span.type": "web",
247251
"resource.name": resourceName,
252+
"peer.service": this.service,
248253
service: serviceName,
249254
_inferred_span: {
250255
tag_source: "self",
@@ -290,6 +295,7 @@ export class SpanInferrer {
290295
request_id: context?.awsRequestId,
291296
"span.type": "sns",
292297
"resource.name": resourceName,
298+
"peer.service": this.service,
293299
service: serviceName,
294300
_inferred_span: {
295301
tag_source: "self",
@@ -327,6 +333,7 @@ export class SpanInferrer {
327333
resource_names: resourceName,
328334
"span.type": "sns",
329335
"resource.name": resourceName,
336+
"peer.service": this.service,
330337
service: serviceName,
331338
_inferred_span: {
332339
tag_source: "self",
@@ -372,6 +379,7 @@ export class SpanInferrer {
372379
"span.type": "web",
373380
"resource.name": resourceName,
374381
"service.name": resourceName,
382+
"peer.service": this.service,
375383
service: serviceName,
376384
_inferred_span: {
377385
tag_source: "self",
@@ -433,6 +441,7 @@ export class SpanInferrer {
433441
request_id: context?.awsRequestId,
434442
"span.type": "web",
435443
"resource.name": streamName,
444+
"peer.service": this.service,
436445
service: serviceName,
437446
_inferred_span: {
438447
tag_source: "self",
@@ -479,6 +488,7 @@ export class SpanInferrer {
479488
request_id: context?.awsRequestId,
480489
"span.type": "web",
481490
"resource.name": bucketName,
491+
"peer.service": this.service,
482492
service: serviceName,
483493
_inferred_span: {
484494
tag_source: "self",
@@ -515,6 +525,7 @@ export class SpanInferrer {
515525
request_id: context?.awsRequestId,
516526
"span.type": "web",
517527
"resource.name": source,
528+
"peer.service": this.service,
518529
service: serviceName,
519530
_inferred_span: {
520531
tag_source: "self",

0 commit comments

Comments
 (0)