Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions src/trace/listener.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@ import { patchHttp, unpatchHttp } from "./patch-http";
import { extractTriggerTags, extractHTTPStatusCodeTag, parseEventSource } from "./trigger";
import { ColdStartTracerConfig, ColdStartTracer } from "./cold-start-tracer";
import { logDebug, tagObject } from "../utils";
import { didFunctionColdStart, isProactiveInitialization, isManagedInstancesMode } from "../utils/cold-start";
import {
didFunctionColdStart,
isProactiveInitialization,
isManagedInstancesMode,
isProvisionedConcurrency,
} from "../utils/cold-start";
import { datadogLambdaVersion } from "../constants";
import { ddtraceVersion, parentSpanFinishTimeHeader, DD_SERVICE_ENV_VAR } from "./constants";
import { patchConsole } from "./patch-console";
Expand Down Expand Up @@ -182,11 +187,10 @@ export class TraceListener {
}
const coldStartNodes = getTraceTree();
if (coldStartNodes.length > 0) {
// Skip creating cold start spans in managed instances mode
// since the gap between the sandbox init and the function
// invocation might be too large to provide a useful trace and
// experience
if (!isManagedInstancesMode()) {
// Skip creating cold start spans in managed instances mode or provisioned concurrency
// since the gap between the sandbox init and the function invocation might be very
// large (minutes or hours), making the spans misleading and not useful
if (!isManagedInstancesMode() && !isProvisionedConcurrency()) {
const coldStartConfig: ColdStartTracerConfig = {
tracerWrapper: this.tracerWrapper,
parentSpan:
Expand Down
28 changes: 28 additions & 0 deletions src/utils/cold-start.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
setSandboxInit,
isProactiveInitialization,
isManagedInstancesMode,
isProvisionedConcurrency,
} from "./cold-start";

beforeEach(_resetColdStart);
Expand Down Expand Up @@ -78,4 +79,31 @@ describe("cold-start", () => {

process.env.AWS_LAMBDA_INITIALIZATION_TYPE = originalValue;
});

it("identifies provisioned concurrency when AWS_LAMBDA_INITIALIZATION_TYPE is set", () => {
const originalValue = process.env.AWS_LAMBDA_INITIALIZATION_TYPE;

process.env.AWS_LAMBDA_INITIALIZATION_TYPE = "provisioned-concurrency";
expect(isProvisionedConcurrency()).toEqual(true);

process.env.AWS_LAMBDA_INITIALIZATION_TYPE = originalValue;
});

it("identifies non-provisioned concurrency when AWS_LAMBDA_INITIALIZATION_TYPE is not set", () => {
const originalValue = process.env.AWS_LAMBDA_INITIALIZATION_TYPE;

delete process.env.AWS_LAMBDA_INITIALIZATION_TYPE;
expect(isProvisionedConcurrency()).toEqual(false);

process.env.AWS_LAMBDA_INITIALIZATION_TYPE = originalValue;
});

it("identifies non-provisioned concurrency when AWS_LAMBDA_INITIALIZATION_TYPE has different value", () => {
const originalValue = process.env.AWS_LAMBDA_INITIALIZATION_TYPE;

process.env.AWS_LAMBDA_INITIALIZATION_TYPE = "on-demand";
expect(isProvisionedConcurrency()).toEqual(false);

process.env.AWS_LAMBDA_INITIALIZATION_TYPE = originalValue;
});
});
12 changes: 12 additions & 0 deletions src/utils/cold-start.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,18 @@ export function isManagedInstancesMode(): boolean {
return process.env.AWS_LAMBDA_INITIALIZATION_TYPE === "lambda-managed-instances";
}

/**
* Checks if the Lambda function is running with provisioned concurrency.
* With provisioned concurrency, containers are pre-warmed before invocations,
* so the gap between initialization and invocation can be very large (minutes or hours).
* Cold start spans created from pre-warm module load times would have inflated durations
* and are not useful in the context of the actual invocation.
* @returns true if running with provisioned concurrency, false otherwise
*/
export function isProvisionedConcurrency(): boolean {
return process.env.AWS_LAMBDA_INITIALIZATION_TYPE === "provisioned-concurrency";
}

// For testing, reset the globals to their original values
export function _resetColdStart() {
functionDidColdStart = true;
Expand Down
1 change: 1 addition & 0 deletions src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export {
setSandboxInit,
isProactiveInitialization,
isManagedInstancesMode,
isProvisionedConcurrency,
} from "./cold-start";
export { promisifiedHandler } from "./handler";
export { Timer } from "./timer";
Expand Down
Loading