Skip to content

Commit

Permalink
chore: Add git sha and url overrides (#364)
Browse files Browse the repository at this point in the history
* Add git sha and url overrides

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

* Fix test name

Fix duplicated test name from comment
  • Loading branch information
avangelillo authored Feb 19, 2025
1 parent 107bb67 commit d44d53d
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 while preserving existing tags", () => {
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 d44d53d

Please sign in to comment.