Skip to content

Commit 66ff1bf

Browse files
committed
preserve singleton behavior
1 parent 5872256 commit 66ff1bf

4 files changed

Lines changed: 48 additions & 8 deletions

File tree

src/env-tracker.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* Copyright 2021 Datadog, Inc.
77
*/
88

9+
import { Node } from "constructs";
910
import { LambdaFunction } from "./interfaces";
1011

1112
const DD_TAGS = "DD_TAGS";
@@ -26,14 +27,14 @@ interface TrackedEnvironment {
2627
//
2728
// Not exported from index.ts -- internal to the package.
2829
//
29-
// WeakMap so functions can be garbage-collected when their stack goes out of scope (for
30-
// example, between test cases).
30+
// WeakMap so construct nodes can be garbage-collected when their stack goes out of scope
31+
// (for example, between test cases).
3132
//
3233
// Env vars set via func.addEnvironment() outside this library are invisible here and will
3334
// be overwritten if the library writes the same key. Configure DD_* vars via
3435
// DatadogLambdaProps or datadogLambda.setEnvironment(), or call func.addEnvironment()
3536
// after datadogLambda.addLambdaFunctions().
36-
const ddEnvTracker: WeakMap<LambdaFunction, TrackedEnvironment> = new WeakMap();
37+
const ddEnvTracker: WeakMap<Node, TrackedEnvironment> = new WeakMap();
3738

3839
export function setTrackedEnv(lam: LambdaFunction, key: string, value: string): void {
3940
if (key === DD_TAGS) {
@@ -60,12 +61,12 @@ export function mergeTrackedGitTags(lam: LambdaFunction, value: string): void {
6061
}
6162

6263
export function hasTrackedEnv(lam: LambdaFunction, key: string): boolean {
63-
const tracked = ddEnvTracker.get(lam);
64+
const tracked = ddEnvTracker.get(lam.permissionsNode);
6465
return key === DD_TAGS ? (tracked?.tagsSet ?? false) : (tracked?.values.has(key) ?? false);
6566
}
6667

6768
function getOrCreateTrackedEnvironment(lam: LambdaFunction): TrackedEnvironment {
68-
let tracked = ddEnvTracker.get(lam);
69+
let tracked = ddEnvTracker.get(lam.permissionsNode);
6970
if (!tracked) {
7071
tracked = {
7172
values: new Map(),
@@ -74,7 +75,7 @@ function getOrCreateTrackedEnvironment(lam: LambdaFunction): TrackedEnvironment
7475
gitTags: new Map(),
7576
tagsSet: false,
7677
};
77-
ddEnvTracker.set(lam, tracked);
78+
ddEnvTracker.set(lam.permissionsNode, tracked);
7879
}
7980
return tracked;
8081
}

src/forwarder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export function addForwarder(
3434
): void {
3535
const forwarder = getForwarder(scope, forwarderArn);
3636
const forwarderDestination = new LambdaDestination(forwarder, { addPermissions: createForwarderPermissions });
37-
const subscriptionFilterName = generateSubscriptionFilterName(Names.uniqueId(lam), forwarderArn);
37+
const subscriptionFilterName = generateSubscriptionFilterName(Names.nodeUniqueId(lam.permissionsNode), forwarderArn);
3838
log.debug(`Adding log subscription ${subscriptionFilterName} for ${lam.functionName}`);
3939
lam.logGroup.addSubscriptionFilter(subscriptionFilterName, {
4040
destination: forwarderDestination,

test/datadog-lambda.spec.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,6 +1194,38 @@ describe("setEnvironment", () => {
11941194
});
11951195
});
11961196

1197+
it("shares tracked values between singleton declarations with the same UUID", () => {
1198+
const app = new App();
1199+
const stack = new Stack(app, "stack");
1200+
const first = new lambda.SingletonFunction(stack, "First", {
1201+
runtime: lambda.Runtime.NODEJS_18_X,
1202+
code: lambda.Code.fromInline("test"),
1203+
handler: "hello.handler",
1204+
uuid: "f21a2d33-8ef9-4e38-8af6-9dc39dd63f12",
1205+
});
1206+
const second = new lambda.SingletonFunction(stack, "Second", {
1207+
runtime: lambda.Runtime.NODEJS_18_X,
1208+
code: lambda.Code.fromInline("test"),
1209+
handler: "hello.handler",
1210+
uuid: "f21a2d33-8ef9-4e38-8af6-9dc39dd63f12",
1211+
});
1212+
const datadogLambda = new DatadogLambda(stack, "Datadog", {
1213+
nodeLayerVersion: NODE_LAYER_VERSION,
1214+
enableDatadogTracing: true,
1215+
sourceCodeIntegration: false,
1216+
});
1217+
datadogLambda.setEnvironment(first, "DD_TRACE_ENABLED", "false");
1218+
datadogLambda.addLambdaFunctions([second], stack);
1219+
1220+
Template.fromStack(stack).hasResourceProperties("AWS::Lambda::Function", {
1221+
Environment: {
1222+
Variables: {
1223+
DD_TRACE_ENABLED: "false",
1224+
},
1225+
},
1226+
});
1227+
});
1228+
11971229
it("lets an unconditional construct setting override a tracked value", () => {
11981230
const app = new App();
11991231
const stack = new Stack(app, "stack");

test/index.spec.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { App, Stack, NestedStack } from "aws-cdk-lib";
1+
import { App, Names, Stack, NestedStack } from "aws-cdk-lib";
22
import { Match, Template } from "aws-cdk-lib/assertions";
33
import * as lambda from "aws-cdk-lib/aws-lambda";
44
import { findDatadogSubscriptionFilters } from "./test-utils";
5+
import { generateSubscriptionFilterName } from "../src/forwarder";
56
import {
67
DatadogLambda,
78
DD_ACCOUNT_ID,
@@ -61,6 +62,12 @@ describe("addLambdaFunctions", () => {
6162
expect(pythonLambdaSubscriptionFilters).toHaveLength(1);
6263
expect(singletonLambdaSubscriptionFilters).toHaveLength(1);
6364
expect(nodeLambdaSubscriptionFilters[0].destinationArn).toEqual(pythonLambdaSubscriptionFilters[0].destinationArn);
65+
expect(singletonLambdaSubscriptionFilters[0].id).toEqual(
66+
generateSubscriptionFilterName(
67+
Names.nodeUniqueId(singletonLambda.permissionsNode),
68+
"arn:test:forwarder:sa-east-1:12345678:1",
69+
),
70+
);
6471

6572
const singletonResource = singletonLambda.permissionsNode.defaultChild as lambda.CfnFunction;
6673
const singletonLogicalId = stack.getLogicalId(singletonResource);

0 commit comments

Comments
 (0)