Skip to content

Commit

Permalink
Add git sha and url overrides
Browse files Browse the repository at this point in the history
Add the ability to override the git sha and repo url to make snapshot testing
easier.

JIRA: https://datadoghq.atlassian.net/browse/SVLS-6260

Github Issue: #359
  • Loading branch information
avangelillo committed Feb 14, 2025
1 parent 107bb67 commit 1452d9c
Show file tree
Hide file tree
Showing 3 changed files with 241 additions and 4 deletions.
38 changes: 37 additions & 1 deletion src/datadog-lambda.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {
DatadogLambdaProps,
Transport,
applyExtensionLayer,
DD_TAGS,
} from "./index";
import { LambdaFunction } from "./interfaces";
import { setTags } from "./tag";
Expand All @@ -36,6 +37,9 @@ export class DatadogLambda extends Construct {
scope: Construct;
props: DatadogLambdaProps;
transport: Transport;
gitCommitShaOverride: string | undefined;
gitRepoUrlOverride: string | undefined;
lambdas: LambdaFunction[];

constructor(scope: Construct, id: string, props: DatadogLambdaProps) {
if (process.env.DD_CONSTRUCT_DEBUG_LOGS?.toLowerCase() === "true") {
Expand All @@ -44,6 +48,7 @@ export class DatadogLambda extends Construct {
super(scope, id);
this.scope = scope;
this.props = props;
this.lambdas = [];
let apiKeySecretArn = this.props.apiKeySecretArn;
if (this.props.apiKeySecret !== undefined) {
apiKeySecretArn = this.props.apiKeySecret.secretArn;
Expand Down Expand Up @@ -150,6 +155,37 @@ export class DatadogLambda extends Construct {
if (baseProps.sourceCodeIntegration) {
this.addGitCommitMetadata([lambdaFunction]);
}
this.lambdas.push(lambdaFunction);
}
}

public overrideGitMetadata(gitCommitSha: string, gitRepoUrl?: string): void {
if (gitCommitSha) {
this.gitCommitShaOverride = gitCommitSha;
}
if (gitRepoUrl) {
this.gitRepoUrlOverride = gitRepoUrl;
}

// If any lambdas have already been added, override the commit sha and url
if (this.lambdas) {
this.lambdas.forEach((lambdaFunction: any) => {
if (lambdaFunction.environment[DD_TAGS] === undefined) {
return;
}
const tags = lambdaFunction.environment[DD_TAGS].value.split(",");
if (gitCommitSha) {
const index = tags.findIndex((val: string) => val.split(":")[0] === "git.commit.sha");
tags[index] = `git.commit.sha:${gitCommitSha}`;
}

if (gitRepoUrl) {
const index = tags.findIndex((val: string) => val.split(":")[0] === "git.repository_url");
tags[index] = `git.repository_url:${gitRepoUrl}`;
}

lambdaFunction.environment[DD_TAGS].value = tags.join(",");
});
}
}

Expand All @@ -164,7 +200,7 @@ export class DatadogLambda extends Construct {
gitRepoUrl?: string,
): void {
const extractedLambdaFunctions = extractSingletonFunctions(lambdaFunctions);
setGitEnvironmentVariables(extractedLambdaFunctions);
setGitEnvironmentVariables(extractedLambdaFunctions, this.gitCommitShaOverride, this.gitRepoUrlOverride);
}

public addForwarderToNonLambdaLogGroups(logGroups: logs.ILogGroup[]) {
Expand Down
16 changes: 14 additions & 2 deletions src/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,21 @@ const execSync = require("child_process").execSync;

const URL = require("url").URL;

export function setGitEnvironmentVariables(lambdas: any[]): void {
export function setGitEnvironmentVariables(
lambdas: any[],
gitCommitShaOverride?: string | undefined,
gitRepoUrlOverride?: string | undefined,
): void {
log.debug("Adding source code integration...");
const { hash, gitRepoUrl } = getGitData();
let { hash, gitRepoUrl } = getGitData();
if (gitCommitShaOverride) {
log.debug(`Using git SHA override. Will be ${gitCommitShaOverride} instead of ${hash}`);
hash = gitCommitShaOverride;
}
if (gitRepoUrlOverride) {
log.debug(`Using git repo URL override. Will be ${gitRepoUrlOverride} instead of ${hash}`);
gitRepoUrl = gitRepoUrlOverride;
}

if (hash == "" || gitRepoUrl == "") return;

Expand Down
191 changes: 190 additions & 1 deletion test/datadog-lambda.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@ import { App, Stack, Token } from "aws-cdk-lib";
import { Template } from "aws-cdk-lib/assertions";
import * as lambda from "aws-cdk-lib/aws-lambda";
import { LogGroup } from "aws-cdk-lib/aws-logs";
import { addCdkConstructVersionTag, checkForMultipleApiKeys, DatadogLambda, DD_HANDLER_ENV_VAR } from "../src/index";
import {
addCdkConstructVersionTag,
checkForMultipleApiKeys,
DatadogLambda,
DD_HANDLER_ENV_VAR,
DD_TAGS,
} from "../src/index";
const { ISecret } = require("aws-cdk-lib/aws-secretsmanager");
const versionJson = require("../version.json");
const EXTENSION_LAYER_VERSION = 5;
Expand Down Expand Up @@ -562,3 +568,186 @@ describe("redirectHandler", () => {
});
});
});

describe("overrideGitMetadata", () => {
it("overrides new lambda functions", () => {
const app = new App();
const stack = new Stack(app, "stack");
const hello = new lambda.Function(stack, "HelloHandler", {
runtime: lambda.Runtime.NODEJS_18_X,
code: lambda.Code.fromInline("test"),
handler: "hello.handler",
});
const datadogLambda = new DatadogLambda(stack, "Datadog", {
nodeLayerVersion: NODE_LAYER_VERSION,
extensionLayerVersion: EXTENSION_LAYER_VERSION,
apiKey: "ABC",
enableDatadogTracing: false,
flushMetricsToLogs: false,
logLevel: "debug",
});
datadogLambda.overrideGitMetadata("fake-sha", "fake-url");
datadogLambda.addLambdaFunctions([hello], stack);
expect((<any>hello).environment[DD_TAGS].value.split(",")).toEqual(
expect.arrayContaining(["git.commit.sha:fake-sha"]),
);
expect((<any>hello).environment[DD_TAGS].value.split(",")).toEqual(
expect.arrayContaining(["git.repository_url:fake-url"]),
);
});

it("overrides existing lambda functions", () => {
const app = new App();
const stack = new Stack(app, "stack");
const hello = new lambda.Function(stack, "HelloHandler", {
runtime: lambda.Runtime.NODEJS_18_X,
code: lambda.Code.fromInline("test"),
handler: "hello.handler",
});
const datadogLambda = new DatadogLambda(stack, "Datadog", {
nodeLayerVersion: NODE_LAYER_VERSION,
extensionLayerVersion: EXTENSION_LAYER_VERSION,
apiKey: "ABC",
enableDatadogTracing: false,
flushMetricsToLogs: false,
logLevel: "debug",
});
datadogLambda.addLambdaFunctions([hello], stack);
datadogLambda.overrideGitMetadata("fake-sha", "fake-url");
expect((<any>hello).environment[DD_TAGS].value.split(",")).toEqual(
expect.arrayContaining(["git.commit.sha:fake-sha"]),
);
expect((<any>hello).environment[DD_TAGS].value.split(",")).toEqual(
expect.arrayContaining(["git.repository_url:fake-url"]),
);
});
it("overrides both existing and new lambda functions", () => {
const app = new App();
const stack = new Stack(app, "stack");
const hello = new lambda.Function(stack, "HelloHandler", {
runtime: lambda.Runtime.NODEJS_18_X,
code: lambda.Code.fromInline("test"),
handler: "hello.handler",
});
const goodbye = new lambda.Function(stack, "GoodbyeHandler", {
runtime: lambda.Runtime.NODEJS_18_X,
code: lambda.Code.fromInline("test"),
handler: "hello.handler",
});
const datadogLambda = new DatadogLambda(stack, "Datadog", {
nodeLayerVersion: NODE_LAYER_VERSION,
extensionLayerVersion: EXTENSION_LAYER_VERSION,
apiKey: "ABC",
enableDatadogTracing: false,
flushMetricsToLogs: false,
logLevel: "debug",
});
datadogLambda.addLambdaFunctions([hello], stack);
datadogLambda.overrideGitMetadata("fake-sha", "fake-url");
datadogLambda.addLambdaFunctions([goodbye], stack);

[hello, goodbye].forEach((f) => {
expect((<any>f).environment[DD_TAGS].value.split(",")).toEqual(
expect.arrayContaining(["git.commit.sha:fake-sha"]),
);
expect((<any>f).environment[DD_TAGS].value.split(",")).toEqual(
expect.arrayContaining(["git.repository_url:fake-url"]),
);
});
});

it("overrides only the sha for both existing and new lambda functions", () => {
const app = new App();
const stack = new Stack(app, "stack");
const hello = new lambda.Function(stack, "HelloHandler", {
runtime: lambda.Runtime.NODEJS_18_X,
code: lambda.Code.fromInline("test"),
handler: "hello.handler",
});
const goodbye = new lambda.Function(stack, "GoodbyeHandler", {
runtime: lambda.Runtime.NODEJS_18_X,
code: lambda.Code.fromInline("test"),
handler: "hello.handler",
});
const datadogLambda = new DatadogLambda(stack, "Datadog", {
nodeLayerVersion: NODE_LAYER_VERSION,
extensionLayerVersion: EXTENSION_LAYER_VERSION,
apiKey: "ABC",
enableDatadogTracing: false,
flushMetricsToLogs: false,
logLevel: "debug",
tags: "testVar:xyz",
});
datadogLambda.addLambdaFunctions([hello], stack);
datadogLambda.overrideGitMetadata("fake-sha");
datadogLambda.addLambdaFunctions([goodbye], stack);

[hello, goodbye].forEach((f) => {
expect((<any>f).environment[DD_TAGS].value.split(",")).toEqual(
expect.arrayContaining(["git.commit.sha:fake-sha"]),
);
expect((<any>f).environment[DD_TAGS].value.split(",")).toEqual(expect.arrayContaining(["testVar:xyz"]));
});
});

it("overrides only the sha for both existing and new lambda functions", () => {
const app = new App();
const stack = new Stack(app, "stack");
const hello = new lambda.Function(stack, "HelloHandler", {
runtime: lambda.Runtime.NODEJS_18_X,
code: lambda.Code.fromInline("test"),
handler: "hello.handler",
});
const goodbye = new lambda.Function(stack, "GoodbyeHandler", {
runtime: lambda.Runtime.NODEJS_18_X,
code: lambda.Code.fromInline("test"),
handler: "hello.handler",
});
const datadogLambda = new DatadogLambda(stack, "Datadog", {
nodeLayerVersion: NODE_LAYER_VERSION,
extensionLayerVersion: EXTENSION_LAYER_VERSION,
apiKey: "ABC",
enableDatadogTracing: false,
flushMetricsToLogs: false,
logLevel: "debug",
});
datadogLambda.addLambdaFunctions([hello], stack);
datadogLambda.overrideGitMetadata("fake-sha");
datadogLambda.addLambdaFunctions([goodbye], stack);

[hello, goodbye].forEach((f) => {
expect((<any>f).environment[DD_TAGS].value.split(",")).toEqual(
expect.arrayContaining([
"git.commit.sha:fake-sha",
"git.repository_url:github.com/DataDog/datadog-cdk-constructs",
]),
);
});
});

it("does not override when not called", () => {
const app = new App();
const stack = new Stack(app, "stack");
const hello = new lambda.Function(stack, "HelloHandler", {
runtime: lambda.Runtime.NODEJS_18_X,
code: lambda.Code.fromInline("test"),
handler: "hello.handler",
});
const datadogLambda = new DatadogLambda(stack, "Datadog", {
nodeLayerVersion: NODE_LAYER_VERSION,
extensionLayerVersion: EXTENSION_LAYER_VERSION,
apiKey: "ABC",
enableDatadogTracing: false,
flushMetricsToLogs: false,
logLevel: "debug",
});
datadogLambda.addLambdaFunctions([hello], stack);

expect(
(<any>hello).environment[DD_TAGS].value.split(",").some((item: string) => item.includes("git.commit.sha")),
).toEqual(true);
expect((<any>hello).environment[DD_TAGS].value.split(",")).toEqual(
expect.arrayContaining(["git.repository_url:github.com/DataDog/datadog-cdk-constructs"]),
);
});
});

0 comments on commit 1452d9c

Please sign in to comment.