autotel-aws 0.13.1 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-O2HC5VUM.js → chunk-JL33WEVE.js} +7 -7
- package/dist/chunk-JL33WEVE.js.map +1 -0
- package/dist/{chunk-Q65NDS7W.cjs → chunk-SPC4VYOI.cjs} +6 -6
- package/dist/chunk-SPC4VYOI.cjs.map +1 -0
- package/dist/index.cjs +9 -9
- package/dist/index.js +1 -1
- package/dist/lambda.cjs +9 -9
- package/dist/lambda.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-O2HC5VUM.js.map +0 -1
- package/dist/chunk-Q65NDS7W.cjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { buildLambdaAttributes } from './chunk-I4CKQ4RD.js';
|
|
2
2
|
import { propagation, context, trace, SpanStatusCode } from '@opentelemetry/api';
|
|
3
|
-
import { trace as trace$1 } from 'autotel';
|
|
3
|
+
import { trace as trace$1, markAsImmediate } from 'autotel';
|
|
4
4
|
import { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray';
|
|
5
5
|
|
|
6
6
|
function extractTraceContext(event) {
|
|
@@ -121,7 +121,7 @@ function wrapHandler(handler, config) {
|
|
|
121
121
|
const executeWithTracing = async () => {
|
|
122
122
|
return trace$1(
|
|
123
123
|
`lambda.${functionName}`,
|
|
124
|
-
async (ctx) => {
|
|
124
|
+
markAsImmediate(async (ctx) => {
|
|
125
125
|
ctx.setAttributes(
|
|
126
126
|
buildLambdaAttributes({
|
|
127
127
|
awsRequestId: lambdaContext.awsRequestId,
|
|
@@ -168,7 +168,7 @@ function wrapHandler(handler, config) {
|
|
|
168
168
|
}
|
|
169
169
|
throw error;
|
|
170
170
|
}
|
|
171
|
-
}
|
|
171
|
+
})
|
|
172
172
|
);
|
|
173
173
|
};
|
|
174
174
|
if (parentSpanContext) {
|
|
@@ -191,7 +191,7 @@ function traceLambda(factory, config) {
|
|
|
191
191
|
const executeWithTracing = async () => {
|
|
192
192
|
return trace$1(
|
|
193
193
|
`lambda.${functionName}`,
|
|
194
|
-
async (ctx) => {
|
|
194
|
+
markAsImmediate(async (ctx) => {
|
|
195
195
|
ctx.setAttributes(
|
|
196
196
|
buildLambdaAttributes({
|
|
197
197
|
awsRequestId: lambdaContext.awsRequestId,
|
|
@@ -211,7 +211,7 @@ function traceLambda(factory, config) {
|
|
|
211
211
|
}
|
|
212
212
|
const handler = factory(ctx);
|
|
213
213
|
return handler(event, lambdaContext);
|
|
214
|
-
}
|
|
214
|
+
})
|
|
215
215
|
);
|
|
216
216
|
};
|
|
217
217
|
if (parentSpanContext) {
|
|
@@ -337,5 +337,5 @@ function getContextFromRequest(request) {
|
|
|
337
337
|
}
|
|
338
338
|
|
|
339
339
|
export { LambdaMiddleware, detectTriggerType, extractTraceContext, getContextFromRequest, getSpanFromRequest, traceLambda, tracingMiddleware, wrapHandler };
|
|
340
|
-
//# sourceMappingURL=chunk-
|
|
341
|
-
//# sourceMappingURL=chunk-
|
|
340
|
+
//# sourceMappingURL=chunk-JL33WEVE.js.map
|
|
341
|
+
//# sourceMappingURL=chunk-JL33WEVE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lambda/context-extractor.ts","../src/lambda/handler.ts","../src/lambda/middleware.ts"],"names":["carrier","otelTrace","context","autotelTrace","coldStartMap","MAX_ERROR_MESSAGE_LENGTH","createContextWithParent","truncateErrorMessage","extractAccountIdFromArn","SpanStatusCode"],"mappings":"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","file":"chunk-JL33WEVE.js","sourcesContent":["/**\n * Extract trace context from Lambda events\n */\n\nimport { context, propagation, trace } from '@opentelemetry/api';\nimport type { SpanContext } from '@opentelemetry/api';\nimport type { LambdaEvent } from '../types';\nimport { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray';\n\n/**\n * Extract trace context from Lambda event\n *\n * Supports:\n * - API Gateway (W3C Trace Context headers)\n * - SQS (message attributes)\n * - SNS (message attributes)\n * - X-Ray header (Lambda integration)\n * - Step Functions (payload context)\n */\nexport function extractTraceContext(event: LambdaEvent): SpanContext | undefined {\n // API Gateway - W3C Trace Context\n if (event.headers?.traceparent) {\n const carrier: Record<string, string> = {};\n if (event.headers.traceparent) carrier.traceparent = event.headers.traceparent;\n if (event.headers.tracestate) carrier.tracestate = event.headers.tracestate;\n if (event.headers.baggage) carrier.baggage = event.headers.baggage;\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // SQS - message attributes\n if (event.Records?.[0]?.messageAttributes?.traceparent) {\n const record = event.Records[0];\n if (!record.messageAttributes) return undefined;\n \n const carrier: Record<string, string> = {};\n if (record.messageAttributes.traceparent?.StringValue) {\n carrier.traceparent = record.messageAttributes.traceparent.StringValue;\n }\n if (record.messageAttributes.tracestate?.StringValue) {\n carrier.tracestate = record.messageAttributes.tracestate.StringValue;\n }\n if (record.messageAttributes.baggage?.StringValue) {\n carrier.baggage = record.messageAttributes.baggage.StringValue;\n }\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // SNS - message attributes\n if (event.Records?.[0]?.Sns?.MessageAttributes?.traceparent) {\n const sns = event.Records[0].Sns;\n if (!sns.MessageAttributes) return undefined;\n \n const carrier: Record<string, string> = {};\n if (sns.MessageAttributes.traceparent?.Value) {\n carrier.traceparent = sns.MessageAttributes.traceparent.Value;\n }\n if (sns.MessageAttributes.tracestate?.Value) {\n carrier.tracestate = sns.MessageAttributes.tracestate.Value;\n }\n if (sns.MessageAttributes.baggage?.Value) {\n carrier.baggage = sns.MessageAttributes.baggage.Value;\n }\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // X-Ray header (Lambda integration)\n if (event.headers?.['x-amzn-trace-id']) {\n const xrayPropagator = new AWSXRayPropagator();\n const carrier: Record<string, string> = {\n 'x-amzn-trace-id': event.headers['x-amzn-trace-id'],\n };\n\n // AWSXRayPropagator.extract() requires a getter function\n // Use a simple getter for Record<string, string>\n const getter = {\n get(carrier: Record<string, string>, key: string): string | string[] | undefined {\n return carrier[key];\n },\n keys(carrier: Record<string, string>): string[] {\n return Object.keys(carrier);\n },\n };\n\n const extractedContext = xrayPropagator.extract(context.active(), carrier, getter);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // Step Functions - payload context\n if (event._autotel_trace_context) {\n return event._autotel_trace_context as SpanContext;\n }\n\n return undefined;\n}\n\n/**\n * Detect Lambda trigger type from event\n */\nexport function detectTriggerType(event: LambdaEvent): 'http' | 'pubsub' | 'datasource' | 'timer' | 'other' {\n // API Gateway / ALB\n if (event.headers || event.requestContext || event.httpMethod) {\n return 'http';\n }\n\n // SQS\n if (event.Records?.some((r) => r.messageAttributes || 'messageId' in r)) {\n return 'pubsub';\n }\n\n // SNS\n if (event.Records?.some((r) => r.Sns)) {\n return 'pubsub';\n }\n\n // Kinesis\n if (event.Records?.some((r) => r.kinesis)) {\n return 'datasource';\n }\n\n // EventBridge / Scheduled\n if (event.source === 'aws.events' || event['detail-type']) {\n return 'timer';\n }\n\n return 'other';\n}\n","/**\n * Lambda handler wrappers\n *\n * Provides instrumentation wrappers for AWS Lambda handlers with automatic\n * trace context extraction from various event sources (API Gateway, SQS, SNS, etc.).\n *\n * @example Simple wrapper\n * ```typescript\n * import { wrapHandler } from 'autotel-aws/lambda';\n *\n * export const handler = wrapHandler(async (event, context) => {\n * return { statusCode: 200 };\n * });\n * ```\n *\n * @example With context access\n * ```typescript\n * import { traceLambda } from 'autotel-aws/lambda';\n *\n * export const handler = traceLambda(ctx => async (event, context) => {\n * ctx.setAttribute('user.id', event.userId);\n * return { statusCode: 200 };\n * });\n * ```\n */\n\nimport { context, trace as otelTrace, SpanStatusCode } from '@opentelemetry/api';\nimport type { SpanContext, Context } from '@opentelemetry/api';\nimport {\n markAsImmediate,\n trace as autotelTrace,\n type TraceContext,\n} from 'autotel';\nimport type { LambdaHandler } from './types';\nimport type { LambdaEvent, LambdaContext } from '../types';\nimport { extractTraceContext, detectTriggerType } from './context-extractor';\nimport { buildLambdaAttributes } from '../attributes';\nimport type { LambdaInstrumentationConfig } from '../config';\n\n// Track cold starts per function instance\n// Using WeakMap-like pattern to avoid memory leaks in long-running containers\nconst coldStartMap = new Map<string, boolean>();\n\n/**\n * Maximum error message length to prevent span attribute bloat\n */\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\n/**\n * Create an OpenTelemetry context with the given span context as parent\n *\n * This properly sets up the parent-child relationship for distributed tracing\n * by creating a context that contains the extracted span context.\n */\nfunction createContextWithParent(parentSpanContext: SpanContext): Context {\n // Create a non-recording span that carries the parent context\n // This is the standard OTel pattern for context propagation\n const parentSpan = otelTrace.wrapSpanContext(parentSpanContext);\n return otelTrace.setSpan(context.active(), parentSpan);\n}\n\n/**\n * Truncate error message to prevent span bloat\n */\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/**\n * Extract AWS account ID from Lambda ARN\n */\nfunction extractAccountIdFromArn(arn: string): string | undefined {\n // ARN format: arn:aws:lambda:region:account-id:function:name\n const arnParts = arn.split(':');\n if (arnParts.length >= 5) {\n return arnParts[4];\n }\n return undefined;\n}\n\n/**\n * Wrap Lambda handler with OpenTelemetry instrumentation\n *\n * Automatically extracts trace context from incoming events and creates\n * a root span for the Lambda invocation with proper semantic attributes.\n *\n * @param handler - The Lambda handler function to wrap\n * @param config - Optional instrumentation configuration\n * @returns Wrapped handler with automatic tracing\n *\n * @example Basic usage\n * ```typescript\n * export const handler = wrapHandler(async (event, context) => {\n * // Your handler code - automatically traced\n * return { statusCode: 200 };\n * });\n * ```\n *\n * @example With configuration\n * ```typescript\n * export const handler = wrapHandler(\n * async (event, context) => {\n * return { statusCode: 200, body: JSON.stringify({ result: 'ok' }) };\n * },\n * { captureResponse: true, extractTraceContext: true }\n * );\n * ```\n *\n * @remarks\n * Semantic attributes set automatically:\n * - `faas.name` - Function name\n * - `faas.version` - Function version\n * - `faas.invocation_id` - AWS request ID\n * - `faas.coldstart` - Whether this is a cold start\n * - `faas.trigger` - Trigger type (http, pubsub, datasource, timer, other)\n * - `cloud.provider` - 'aws'\n * - `cloud.region` - AWS region\n * - `cloud.account.id` - AWS account ID (extracted from ARN)\n */\nexport function wrapHandler<TEvent = LambdaEvent, TResult = unknown>(\n handler: LambdaHandler<TEvent, TResult>,\n config?: LambdaInstrumentationConfig,\n): LambdaHandler<TEvent, TResult> {\n // Return the wrapped handler\n return async (event: TEvent, lambdaContext: LambdaContext): Promise<TResult> => {\n const functionName = lambdaContext.functionName;\n\n // Detect cold start (first invocation for this function instance)\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context from event (if enabled, default: true)\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext\n ? extractTraceContext(event as LambdaEvent)\n : undefined;\n\n // Detect trigger type for semantic attributes\n const trigger = detectTriggerType(event as LambdaEvent);\n\n // Core tracing logic. `markAsImmediate` pins the inner function to\n // immediate-execution dispatch so downstream bundlers (esbuild in\n // `aws-lambda-nodejs`, etc.) that minify the `ctx` parameter name\n // don't make autotel mis-dispatch into factory mode — which would\n // return a function instead of awaiting the inner result and break\n // the Lambda response with \"Wrong arguments\".\n const executeWithTracing = async (): Promise<TResult> => {\n return autotelTrace(\n `lambda.${functionName}`,\n markAsImmediate(async (ctx: TraceContext): Promise<TResult> => {\n // Set Lambda semantic attributes\n ctx.setAttributes(\n buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n ctx.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n ctx.setAttribute('cloud.region', region);\n }\n\n try {\n const result = await handler(event, lambdaContext);\n\n // Capture response if configured (be careful with large payloads)\n if (config?.captureResponse && result != null) {\n try {\n const responseJson = JSON.stringify(result);\n // Only capture if not too large\n if (responseJson.length <= 4096) {\n ctx.setAttribute('lambda.response', responseJson);\n } else {\n ctx.setAttribute('lambda.response.truncated', true);\n ctx.setAttribute('lambda.response.size', responseJson.length);\n }\n } catch {\n // Ignore serialization errors (circular references, etc.)\n ctx.setAttribute('lambda.response.serialization_failed', true);\n }\n }\n\n return result;\n } catch (error) {\n // Record error details\n const errorMessage = error instanceof Error ? error.message : String(error);\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncateErrorMessage(errorMessage),\n });\n\n // Add exception attributes\n ctx.setAttribute('exception.type', error instanceof Error ? error.constructor.name : 'Error');\n ctx.setAttribute('exception.message', truncateErrorMessage(errorMessage));\n\n if (error instanceof Error && error.stack) {\n ctx.setAttribute('exception.stacktrace', error.stack.slice(0, MAX_ERROR_MESSAGE_LENGTH));\n }\n\n throw error;\n }\n }),\n );\n };\n\n // Execute with proper parent context if available\n if (parentSpanContext) {\n const parentContext = createContextWithParent(parentSpanContext);\n return context.with(parentContext, executeWithTracing);\n }\n\n return executeWithTracing();\n };\n}\n\n/**\n * Functional API for Lambda with trace context access\n *\n * Similar to `wrapHandler`, but provides access to the trace context\n * for setting custom attributes during handler execution.\n *\n * @param factory - Factory function that receives trace context and returns a handler\n * @param config - Optional instrumentation configuration\n * @returns Wrapped handler with automatic tracing\n *\n * @example\n * ```typescript\n * export const handler = traceLambda(ctx => async (event, context) => {\n * // Access trace context for custom attributes\n * ctx.setAttribute('user.id', event.userId);\n * ctx.setAttribute('order.id', event.orderId);\n *\n * // Use X-Ray annotations for indexed attributes\n * setXRayAnnotation('user.tier', event.userTier);\n *\n * const result = await processOrder(event);\n * ctx.setAttribute('order.status', result.status);\n *\n * return { statusCode: 200, body: JSON.stringify(result) };\n * });\n * ```\n *\n * @remarks\n * The trace context (`ctx`) provides:\n * - `setAttribute(key, value)` - Set a single attribute\n * - `setAttributes(attrs)` - Set multiple attributes\n * - `setStatus(status)` - Set span status\n * - `recordException(error)` - Record an exception\n * - `traceId`, `spanId` - Trace identifiers\n */\nexport function traceLambda<TEvent = LambdaEvent, TResult = unknown>(\n factory: (ctx: TraceContext) => LambdaHandler<TEvent, TResult>,\n config?: LambdaInstrumentationConfig,\n): LambdaHandler<TEvent, TResult> {\n return async (event: TEvent, lambdaContext: LambdaContext): Promise<TResult> => {\n const functionName = lambdaContext.functionName;\n\n // Detect cold start\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext\n ? extractTraceContext(event as LambdaEvent)\n : undefined;\n\n // Detect trigger type\n const trigger = detectTriggerType(event as LambdaEvent);\n\n // Core tracing logic — see wrapHandler above for why we mark the inner\n // function as immediate-execution.\n const executeWithTracing = async (): Promise<TResult> => {\n return autotelTrace(\n `lambda.${functionName}`,\n markAsImmediate(async (ctx: TraceContext): Promise<TResult> => {\n // Set Lambda semantic attributes\n ctx.setAttributes(\n buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n ctx.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n ctx.setAttribute('cloud.region', region);\n }\n\n // Create handler with context access and execute\n const handler = factory(ctx);\n return handler(event, lambdaContext);\n }),\n );\n };\n\n // Execute with proper parent context if available\n if (parentSpanContext) {\n const parentContext = createContextWithParent(parentSpanContext);\n return context.with(parentContext, executeWithTracing);\n }\n\n return executeWithTracing();\n };\n}\n","/**\n * Middy-compatible Lambda middleware for OpenTelemetry instrumentation\n *\n * Provides full span lifecycle management for Lambda handlers using Middy.\n *\n * @example Basic usage\n * ```typescript\n * import middy from '@middy/core';\n * import { tracingMiddleware } from 'autotel-aws/lambda';\n *\n * const baseHandler = async (event, context) => {\n * return { statusCode: 200 };\n * };\n *\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware());\n * ```\n *\n * @example With configuration\n * ```typescript\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware({\n * captureResponse: true,\n * extractTraceContext: true\n * }));\n * ```\n *\n * @example Combined with other middleware\n * ```typescript\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware())\n * .use(jsonBodyParser())\n * .use(httpErrorHandler());\n * ```\n */\n\nimport type { MiddlewareObj, Request } from '@middy/core';\nimport type { Context as AWSLambdaContext } from 'aws-lambda';\nimport { context, trace as otelTrace, SpanStatusCode } from '@opentelemetry/api';\nimport type { Span, SpanContext, Context as OtelContext } from '@opentelemetry/api';\nimport type { LambdaEvent } from '../types';\nimport type { LambdaInstrumentationConfig } from '../config';\nimport { extractTraceContext, detectTriggerType } from './context-extractor';\nimport { buildLambdaAttributes } from '../attributes';\n\n// Symbol to store span on request object\nconst SPAN_SYMBOL = Symbol.for('autotel-aws.span');\nconst CONTEXT_SYMBOL = Symbol.for('autotel-aws.context');\n\n// Track cold starts per function instance\nconst coldStartMap = new Map<string, boolean>();\n\n/**\n * Maximum error message length to prevent span attribute bloat\n */\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\n/**\n * Create an OpenTelemetry context with the given span context as parent\n */\nfunction createContextWithParent(parentSpanContext: SpanContext): OtelContext {\n const parentSpan = otelTrace.wrapSpanContext(parentSpanContext);\n return otelTrace.setSpan(context.active(), parentSpan);\n}\n\n/**\n * Truncate error message to prevent span bloat\n */\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/**\n * Extract AWS account ID from Lambda ARN\n */\nfunction extractAccountIdFromArn(arn: string): string | undefined {\n const arnParts = arn.split(':');\n if (arnParts.length >= 5) {\n return arnParts[4];\n }\n return undefined;\n}\n\n// Extended request type with our symbols\ninterface TracingRequest<TEvent = LambdaEvent, TResult = unknown>\n extends Request<TEvent, TResult, Error, AWSLambdaContext> {\n [SPAN_SYMBOL]?: Span;\n [CONTEXT_SYMBOL]?: OtelContext;\n}\n\n/**\n * Middy middleware for Lambda instrumentation with full span lifecycle\n *\n * Creates a span that wraps the entire handler execution, including:\n * - Trace context extraction from incoming events\n * - Cold start detection\n * - Semantic attributes for Lambda (faas.*, cloud.*)\n * - Error recording and status\n * - Response capture (optional)\n *\n * @param config - Optional instrumentation configuration\n * @returns Middy middleware object\n *\n * @remarks\n * This middleware uses Middy's before/after/onError hooks to manage\n * the span lifecycle. The span is created in `before`, ended in `after`\n * or `onError`.\n *\n * Semantic attributes set automatically:\n * - `faas.name` - Function name\n * - `faas.version` - Function version\n * - `faas.invocation_id` - AWS request ID\n * - `faas.coldstart` - Whether this is a cold start\n * - `faas.trigger` - Trigger type (http, pubsub, datasource, timer, other)\n * - `cloud.provider` - 'aws'\n * - `cloud.region` - AWS region\n * - `cloud.account.id` - AWS account ID (extracted from ARN)\n */\nexport function tracingMiddleware(\n config?: LambdaInstrumentationConfig,\n): MiddlewareObj<LambdaEvent, unknown, Error, AWSLambdaContext> {\n const tracer = otelTrace.getTracer('autotel-aws');\n\n return {\n before: async (request: TracingRequest) => {\n const { event, context: lambdaContext } = request;\n const functionName = lambdaContext.functionName;\n\n // Detect cold start\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context from event\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext ? extractTraceContext(event) : undefined;\n\n // Detect trigger type\n const trigger = detectTriggerType(event);\n\n // Create parent context if available\n let parentContext = context.active();\n if (parentSpanContext) {\n parentContext = createContextWithParent(parentSpanContext);\n }\n\n // Start span with parent context\n const span = tracer.startSpan(\n `lambda.${functionName}`,\n {\n attributes: buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n },\n parentContext,\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n span.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n span.setAttribute('cloud.region', region);\n }\n\n // Store span and context on request for later use\n request[SPAN_SYMBOL] = span;\n request[CONTEXT_SYMBOL] = otelTrace.setSpan(parentContext, span);\n\n // Set the context as active for the handler execution\n // This ensures child spans created during handler execution are linked\n return new Promise<void>((resolve) => {\n context.with(request[CONTEXT_SYMBOL]!, () => {\n resolve();\n });\n });\n },\n\n after: async (request: TracingRequest) => {\n const span = request[SPAN_SYMBOL];\n if (!span) return;\n\n // Capture response if configured\n if (config?.captureResponse && request.response != null) {\n try {\n const responseJson = JSON.stringify(request.response);\n if (responseJson.length <= 4096) {\n span.setAttribute('lambda.response', responseJson);\n } else {\n span.setAttribute('lambda.response.truncated', true);\n span.setAttribute('lambda.response.size', responseJson.length);\n }\n } catch {\n span.setAttribute('lambda.response.serialization_failed', true);\n }\n }\n\n // Set success status\n span.setStatus({ code: SpanStatusCode.OK });\n\n // End the span\n span.end();\n },\n\n onError: async (request: TracingRequest) => {\n const span = request[SPAN_SYMBOL];\n if (!span) return;\n\n const error = request.error;\n if (error) {\n // Record error details\n const errorMessage = error.message || String(error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncateErrorMessage(errorMessage),\n });\n\n // Add exception attributes\n span.setAttribute('exception.type', error.name || 'Error');\n span.setAttribute('exception.message', truncateErrorMessage(errorMessage));\n\n if (error.stack) {\n span.setAttribute('exception.stacktrace', error.stack.slice(0, MAX_ERROR_MESSAGE_LENGTH));\n }\n\n // Record exception event\n span.recordException(error);\n }\n\n // End the span\n span.end();\n },\n };\n}\n\n/**\n * @deprecated Use tracingMiddleware instead. LambdaMiddleware is an alias for backwards compatibility.\n */\nexport const LambdaMiddleware = tracingMiddleware;\n\n/**\n * Get the current span from a Middy request object\n *\n * Useful for setting custom attributes within your handler when using\n * the tracing middleware.\n *\n * @param request - Middy request object\n * @returns The active span, or undefined if not available\n *\n * @example\n * ```typescript\n * const baseHandler = async (event, context) => {\n * const span = getSpanFromRequest(request);\n * if (span) {\n * span.setAttribute('user.id', event.userId);\n * }\n * return { statusCode: 200 };\n * };\n * ```\n */\nexport function getSpanFromRequest(request: Request<any, any, any, any>): Span | undefined {\n return (request as TracingRequest)[SPAN_SYMBOL];\n}\n\n/**\n * Get the OpenTelemetry context from a Middy request object\n *\n * @param request - Middy request object\n * @returns The active context, or undefined if not available\n */\nexport function getContextFromRequest(request: Request<any, any, any, any>): OtelContext | undefined {\n return (request as TracingRequest)[CONTEXT_SYMBOL];\n}\n"]}
|
|
@@ -123,7 +123,7 @@ function wrapHandler(handler, config) {
|
|
|
123
123
|
const executeWithTracing = async () => {
|
|
124
124
|
return autotel.trace(
|
|
125
125
|
`lambda.${functionName}`,
|
|
126
|
-
async (ctx) => {
|
|
126
|
+
autotel.markAsImmediate(async (ctx) => {
|
|
127
127
|
ctx.setAttributes(
|
|
128
128
|
chunkQ3DMMQ7K_cjs.buildLambdaAttributes({
|
|
129
129
|
awsRequestId: lambdaContext.awsRequestId,
|
|
@@ -170,7 +170,7 @@ function wrapHandler(handler, config) {
|
|
|
170
170
|
}
|
|
171
171
|
throw error;
|
|
172
172
|
}
|
|
173
|
-
}
|
|
173
|
+
})
|
|
174
174
|
);
|
|
175
175
|
};
|
|
176
176
|
if (parentSpanContext) {
|
|
@@ -193,7 +193,7 @@ function traceLambda(factory, config) {
|
|
|
193
193
|
const executeWithTracing = async () => {
|
|
194
194
|
return autotel.trace(
|
|
195
195
|
`lambda.${functionName}`,
|
|
196
|
-
async (ctx) => {
|
|
196
|
+
autotel.markAsImmediate(async (ctx) => {
|
|
197
197
|
ctx.setAttributes(
|
|
198
198
|
chunkQ3DMMQ7K_cjs.buildLambdaAttributes({
|
|
199
199
|
awsRequestId: lambdaContext.awsRequestId,
|
|
@@ -213,7 +213,7 @@ function traceLambda(factory, config) {
|
|
|
213
213
|
}
|
|
214
214
|
const handler = factory(ctx);
|
|
215
215
|
return handler(event, lambdaContext);
|
|
216
|
-
}
|
|
216
|
+
})
|
|
217
217
|
);
|
|
218
218
|
};
|
|
219
219
|
if (parentSpanContext) {
|
|
@@ -346,5 +346,5 @@ exports.getSpanFromRequest = getSpanFromRequest;
|
|
|
346
346
|
exports.traceLambda = traceLambda;
|
|
347
347
|
exports.tracingMiddleware = tracingMiddleware;
|
|
348
348
|
exports.wrapHandler = wrapHandler;
|
|
349
|
-
//# sourceMappingURL=chunk-
|
|
350
|
-
//# sourceMappingURL=chunk-
|
|
349
|
+
//# sourceMappingURL=chunk-SPC4VYOI.cjs.map
|
|
350
|
+
//# sourceMappingURL=chunk-SPC4VYOI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lambda/context-extractor.ts","../src/lambda/handler.ts","../src/lambda/middleware.ts"],"names":["propagation","context","trace","AWSXRayPropagator","carrier","otelTrace","autotelTrace","markAsImmediate","buildLambdaAttributes","SpanStatusCode","coldStartMap","MAX_ERROR_MESSAGE_LENGTH","createContextWithParent","truncateErrorMessage","extractAccountIdFromArn"],"mappings":"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","file":"chunk-SPC4VYOI.cjs","sourcesContent":["/**\n * Extract trace context from Lambda events\n */\n\nimport { context, propagation, trace } from '@opentelemetry/api';\nimport type { SpanContext } from '@opentelemetry/api';\nimport type { LambdaEvent } from '../types';\nimport { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray';\n\n/**\n * Extract trace context from Lambda event\n *\n * Supports:\n * - API Gateway (W3C Trace Context headers)\n * - SQS (message attributes)\n * - SNS (message attributes)\n * - X-Ray header (Lambda integration)\n * - Step Functions (payload context)\n */\nexport function extractTraceContext(event: LambdaEvent): SpanContext | undefined {\n // API Gateway - W3C Trace Context\n if (event.headers?.traceparent) {\n const carrier: Record<string, string> = {};\n if (event.headers.traceparent) carrier.traceparent = event.headers.traceparent;\n if (event.headers.tracestate) carrier.tracestate = event.headers.tracestate;\n if (event.headers.baggage) carrier.baggage = event.headers.baggage;\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // SQS - message attributes\n if (event.Records?.[0]?.messageAttributes?.traceparent) {\n const record = event.Records[0];\n if (!record.messageAttributes) return undefined;\n \n const carrier: Record<string, string> = {};\n if (record.messageAttributes.traceparent?.StringValue) {\n carrier.traceparent = record.messageAttributes.traceparent.StringValue;\n }\n if (record.messageAttributes.tracestate?.StringValue) {\n carrier.tracestate = record.messageAttributes.tracestate.StringValue;\n }\n if (record.messageAttributes.baggage?.StringValue) {\n carrier.baggage = record.messageAttributes.baggage.StringValue;\n }\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // SNS - message attributes\n if (event.Records?.[0]?.Sns?.MessageAttributes?.traceparent) {\n const sns = event.Records[0].Sns;\n if (!sns.MessageAttributes) return undefined;\n \n const carrier: Record<string, string> = {};\n if (sns.MessageAttributes.traceparent?.Value) {\n carrier.traceparent = sns.MessageAttributes.traceparent.Value;\n }\n if (sns.MessageAttributes.tracestate?.Value) {\n carrier.tracestate = sns.MessageAttributes.tracestate.Value;\n }\n if (sns.MessageAttributes.baggage?.Value) {\n carrier.baggage = sns.MessageAttributes.baggage.Value;\n }\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // X-Ray header (Lambda integration)\n if (event.headers?.['x-amzn-trace-id']) {\n const xrayPropagator = new AWSXRayPropagator();\n const carrier: Record<string, string> = {\n 'x-amzn-trace-id': event.headers['x-amzn-trace-id'],\n };\n\n // AWSXRayPropagator.extract() requires a getter function\n // Use a simple getter for Record<string, string>\n const getter = {\n get(carrier: Record<string, string>, key: string): string | string[] | undefined {\n return carrier[key];\n },\n keys(carrier: Record<string, string>): string[] {\n return Object.keys(carrier);\n },\n };\n\n const extractedContext = xrayPropagator.extract(context.active(), carrier, getter);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // Step Functions - payload context\n if (event._autotel_trace_context) {\n return event._autotel_trace_context as SpanContext;\n }\n\n return undefined;\n}\n\n/**\n * Detect Lambda trigger type from event\n */\nexport function detectTriggerType(event: LambdaEvent): 'http' | 'pubsub' | 'datasource' | 'timer' | 'other' {\n // API Gateway / ALB\n if (event.headers || event.requestContext || event.httpMethod) {\n return 'http';\n }\n\n // SQS\n if (event.Records?.some((r) => r.messageAttributes || 'messageId' in r)) {\n return 'pubsub';\n }\n\n // SNS\n if (event.Records?.some((r) => r.Sns)) {\n return 'pubsub';\n }\n\n // Kinesis\n if (event.Records?.some((r) => r.kinesis)) {\n return 'datasource';\n }\n\n // EventBridge / Scheduled\n if (event.source === 'aws.events' || event['detail-type']) {\n return 'timer';\n }\n\n return 'other';\n}\n","/**\n * Lambda handler wrappers\n *\n * Provides instrumentation wrappers for AWS Lambda handlers with automatic\n * trace context extraction from various event sources (API Gateway, SQS, SNS, etc.).\n *\n * @example Simple wrapper\n * ```typescript\n * import { wrapHandler } from 'autotel-aws/lambda';\n *\n * export const handler = wrapHandler(async (event, context) => {\n * return { statusCode: 200 };\n * });\n * ```\n *\n * @example With context access\n * ```typescript\n * import { traceLambda } from 'autotel-aws/lambda';\n *\n * export const handler = traceLambda(ctx => async (event, context) => {\n * ctx.setAttribute('user.id', event.userId);\n * return { statusCode: 200 };\n * });\n * ```\n */\n\nimport { context, trace as otelTrace, SpanStatusCode } from '@opentelemetry/api';\nimport type { SpanContext, Context } from '@opentelemetry/api';\nimport {\n markAsImmediate,\n trace as autotelTrace,\n type TraceContext,\n} from 'autotel';\nimport type { LambdaHandler } from './types';\nimport type { LambdaEvent, LambdaContext } from '../types';\nimport { extractTraceContext, detectTriggerType } from './context-extractor';\nimport { buildLambdaAttributes } from '../attributes';\nimport type { LambdaInstrumentationConfig } from '../config';\n\n// Track cold starts per function instance\n// Using WeakMap-like pattern to avoid memory leaks in long-running containers\nconst coldStartMap = new Map<string, boolean>();\n\n/**\n * Maximum error message length to prevent span attribute bloat\n */\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\n/**\n * Create an OpenTelemetry context with the given span context as parent\n *\n * This properly sets up the parent-child relationship for distributed tracing\n * by creating a context that contains the extracted span context.\n */\nfunction createContextWithParent(parentSpanContext: SpanContext): Context {\n // Create a non-recording span that carries the parent context\n // This is the standard OTel pattern for context propagation\n const parentSpan = otelTrace.wrapSpanContext(parentSpanContext);\n return otelTrace.setSpan(context.active(), parentSpan);\n}\n\n/**\n * Truncate error message to prevent span bloat\n */\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/**\n * Extract AWS account ID from Lambda ARN\n */\nfunction extractAccountIdFromArn(arn: string): string | undefined {\n // ARN format: arn:aws:lambda:region:account-id:function:name\n const arnParts = arn.split(':');\n if (arnParts.length >= 5) {\n return arnParts[4];\n }\n return undefined;\n}\n\n/**\n * Wrap Lambda handler with OpenTelemetry instrumentation\n *\n * Automatically extracts trace context from incoming events and creates\n * a root span for the Lambda invocation with proper semantic attributes.\n *\n * @param handler - The Lambda handler function to wrap\n * @param config - Optional instrumentation configuration\n * @returns Wrapped handler with automatic tracing\n *\n * @example Basic usage\n * ```typescript\n * export const handler = wrapHandler(async (event, context) => {\n * // Your handler code - automatically traced\n * return { statusCode: 200 };\n * });\n * ```\n *\n * @example With configuration\n * ```typescript\n * export const handler = wrapHandler(\n * async (event, context) => {\n * return { statusCode: 200, body: JSON.stringify({ result: 'ok' }) };\n * },\n * { captureResponse: true, extractTraceContext: true }\n * );\n * ```\n *\n * @remarks\n * Semantic attributes set automatically:\n * - `faas.name` - Function name\n * - `faas.version` - Function version\n * - `faas.invocation_id` - AWS request ID\n * - `faas.coldstart` - Whether this is a cold start\n * - `faas.trigger` - Trigger type (http, pubsub, datasource, timer, other)\n * - `cloud.provider` - 'aws'\n * - `cloud.region` - AWS region\n * - `cloud.account.id` - AWS account ID (extracted from ARN)\n */\nexport function wrapHandler<TEvent = LambdaEvent, TResult = unknown>(\n handler: LambdaHandler<TEvent, TResult>,\n config?: LambdaInstrumentationConfig,\n): LambdaHandler<TEvent, TResult> {\n // Return the wrapped handler\n return async (event: TEvent, lambdaContext: LambdaContext): Promise<TResult> => {\n const functionName = lambdaContext.functionName;\n\n // Detect cold start (first invocation for this function instance)\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context from event (if enabled, default: true)\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext\n ? extractTraceContext(event as LambdaEvent)\n : undefined;\n\n // Detect trigger type for semantic attributes\n const trigger = detectTriggerType(event as LambdaEvent);\n\n // Core tracing logic. `markAsImmediate` pins the inner function to\n // immediate-execution dispatch so downstream bundlers (esbuild in\n // `aws-lambda-nodejs`, etc.) that minify the `ctx` parameter name\n // don't make autotel mis-dispatch into factory mode — which would\n // return a function instead of awaiting the inner result and break\n // the Lambda response with \"Wrong arguments\".\n const executeWithTracing = async (): Promise<TResult> => {\n return autotelTrace(\n `lambda.${functionName}`,\n markAsImmediate(async (ctx: TraceContext): Promise<TResult> => {\n // Set Lambda semantic attributes\n ctx.setAttributes(\n buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n ctx.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n ctx.setAttribute('cloud.region', region);\n }\n\n try {\n const result = await handler(event, lambdaContext);\n\n // Capture response if configured (be careful with large payloads)\n if (config?.captureResponse && result != null) {\n try {\n const responseJson = JSON.stringify(result);\n // Only capture if not too large\n if (responseJson.length <= 4096) {\n ctx.setAttribute('lambda.response', responseJson);\n } else {\n ctx.setAttribute('lambda.response.truncated', true);\n ctx.setAttribute('lambda.response.size', responseJson.length);\n }\n } catch {\n // Ignore serialization errors (circular references, etc.)\n ctx.setAttribute('lambda.response.serialization_failed', true);\n }\n }\n\n return result;\n } catch (error) {\n // Record error details\n const errorMessage = error instanceof Error ? error.message : String(error);\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncateErrorMessage(errorMessage),\n });\n\n // Add exception attributes\n ctx.setAttribute('exception.type', error instanceof Error ? error.constructor.name : 'Error');\n ctx.setAttribute('exception.message', truncateErrorMessage(errorMessage));\n\n if (error instanceof Error && error.stack) {\n ctx.setAttribute('exception.stacktrace', error.stack.slice(0, MAX_ERROR_MESSAGE_LENGTH));\n }\n\n throw error;\n }\n }),\n );\n };\n\n // Execute with proper parent context if available\n if (parentSpanContext) {\n const parentContext = createContextWithParent(parentSpanContext);\n return context.with(parentContext, executeWithTracing);\n }\n\n return executeWithTracing();\n };\n}\n\n/**\n * Functional API for Lambda with trace context access\n *\n * Similar to `wrapHandler`, but provides access to the trace context\n * for setting custom attributes during handler execution.\n *\n * @param factory - Factory function that receives trace context and returns a handler\n * @param config - Optional instrumentation configuration\n * @returns Wrapped handler with automatic tracing\n *\n * @example\n * ```typescript\n * export const handler = traceLambda(ctx => async (event, context) => {\n * // Access trace context for custom attributes\n * ctx.setAttribute('user.id', event.userId);\n * ctx.setAttribute('order.id', event.orderId);\n *\n * // Use X-Ray annotations for indexed attributes\n * setXRayAnnotation('user.tier', event.userTier);\n *\n * const result = await processOrder(event);\n * ctx.setAttribute('order.status', result.status);\n *\n * return { statusCode: 200, body: JSON.stringify(result) };\n * });\n * ```\n *\n * @remarks\n * The trace context (`ctx`) provides:\n * - `setAttribute(key, value)` - Set a single attribute\n * - `setAttributes(attrs)` - Set multiple attributes\n * - `setStatus(status)` - Set span status\n * - `recordException(error)` - Record an exception\n * - `traceId`, `spanId` - Trace identifiers\n */\nexport function traceLambda<TEvent = LambdaEvent, TResult = unknown>(\n factory: (ctx: TraceContext) => LambdaHandler<TEvent, TResult>,\n config?: LambdaInstrumentationConfig,\n): LambdaHandler<TEvent, TResult> {\n return async (event: TEvent, lambdaContext: LambdaContext): Promise<TResult> => {\n const functionName = lambdaContext.functionName;\n\n // Detect cold start\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext\n ? extractTraceContext(event as LambdaEvent)\n : undefined;\n\n // Detect trigger type\n const trigger = detectTriggerType(event as LambdaEvent);\n\n // Core tracing logic — see wrapHandler above for why we mark the inner\n // function as immediate-execution.\n const executeWithTracing = async (): Promise<TResult> => {\n return autotelTrace(\n `lambda.${functionName}`,\n markAsImmediate(async (ctx: TraceContext): Promise<TResult> => {\n // Set Lambda semantic attributes\n ctx.setAttributes(\n buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n ctx.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n ctx.setAttribute('cloud.region', region);\n }\n\n // Create handler with context access and execute\n const handler = factory(ctx);\n return handler(event, lambdaContext);\n }),\n );\n };\n\n // Execute with proper parent context if available\n if (parentSpanContext) {\n const parentContext = createContextWithParent(parentSpanContext);\n return context.with(parentContext, executeWithTracing);\n }\n\n return executeWithTracing();\n };\n}\n","/**\n * Middy-compatible Lambda middleware for OpenTelemetry instrumentation\n *\n * Provides full span lifecycle management for Lambda handlers using Middy.\n *\n * @example Basic usage\n * ```typescript\n * import middy from '@middy/core';\n * import { tracingMiddleware } from 'autotel-aws/lambda';\n *\n * const baseHandler = async (event, context) => {\n * return { statusCode: 200 };\n * };\n *\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware());\n * ```\n *\n * @example With configuration\n * ```typescript\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware({\n * captureResponse: true,\n * extractTraceContext: true\n * }));\n * ```\n *\n * @example Combined with other middleware\n * ```typescript\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware())\n * .use(jsonBodyParser())\n * .use(httpErrorHandler());\n * ```\n */\n\nimport type { MiddlewareObj, Request } from '@middy/core';\nimport type { Context as AWSLambdaContext } from 'aws-lambda';\nimport { context, trace as otelTrace, SpanStatusCode } from '@opentelemetry/api';\nimport type { Span, SpanContext, Context as OtelContext } from '@opentelemetry/api';\nimport type { LambdaEvent } from '../types';\nimport type { LambdaInstrumentationConfig } from '../config';\nimport { extractTraceContext, detectTriggerType } from './context-extractor';\nimport { buildLambdaAttributes } from '../attributes';\n\n// Symbol to store span on request object\nconst SPAN_SYMBOL = Symbol.for('autotel-aws.span');\nconst CONTEXT_SYMBOL = Symbol.for('autotel-aws.context');\n\n// Track cold starts per function instance\nconst coldStartMap = new Map<string, boolean>();\n\n/**\n * Maximum error message length to prevent span attribute bloat\n */\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\n/**\n * Create an OpenTelemetry context with the given span context as parent\n */\nfunction createContextWithParent(parentSpanContext: SpanContext): OtelContext {\n const parentSpan = otelTrace.wrapSpanContext(parentSpanContext);\n return otelTrace.setSpan(context.active(), parentSpan);\n}\n\n/**\n * Truncate error message to prevent span bloat\n */\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/**\n * Extract AWS account ID from Lambda ARN\n */\nfunction extractAccountIdFromArn(arn: string): string | undefined {\n const arnParts = arn.split(':');\n if (arnParts.length >= 5) {\n return arnParts[4];\n }\n return undefined;\n}\n\n// Extended request type with our symbols\ninterface TracingRequest<TEvent = LambdaEvent, TResult = unknown>\n extends Request<TEvent, TResult, Error, AWSLambdaContext> {\n [SPAN_SYMBOL]?: Span;\n [CONTEXT_SYMBOL]?: OtelContext;\n}\n\n/**\n * Middy middleware for Lambda instrumentation with full span lifecycle\n *\n * Creates a span that wraps the entire handler execution, including:\n * - Trace context extraction from incoming events\n * - Cold start detection\n * - Semantic attributes for Lambda (faas.*, cloud.*)\n * - Error recording and status\n * - Response capture (optional)\n *\n * @param config - Optional instrumentation configuration\n * @returns Middy middleware object\n *\n * @remarks\n * This middleware uses Middy's before/after/onError hooks to manage\n * the span lifecycle. The span is created in `before`, ended in `after`\n * or `onError`.\n *\n * Semantic attributes set automatically:\n * - `faas.name` - Function name\n * - `faas.version` - Function version\n * - `faas.invocation_id` - AWS request ID\n * - `faas.coldstart` - Whether this is a cold start\n * - `faas.trigger` - Trigger type (http, pubsub, datasource, timer, other)\n * - `cloud.provider` - 'aws'\n * - `cloud.region` - AWS region\n * - `cloud.account.id` - AWS account ID (extracted from ARN)\n */\nexport function tracingMiddleware(\n config?: LambdaInstrumentationConfig,\n): MiddlewareObj<LambdaEvent, unknown, Error, AWSLambdaContext> {\n const tracer = otelTrace.getTracer('autotel-aws');\n\n return {\n before: async (request: TracingRequest) => {\n const { event, context: lambdaContext } = request;\n const functionName = lambdaContext.functionName;\n\n // Detect cold start\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context from event\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext ? extractTraceContext(event) : undefined;\n\n // Detect trigger type\n const trigger = detectTriggerType(event);\n\n // Create parent context if available\n let parentContext = context.active();\n if (parentSpanContext) {\n parentContext = createContextWithParent(parentSpanContext);\n }\n\n // Start span with parent context\n const span = tracer.startSpan(\n `lambda.${functionName}`,\n {\n attributes: buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n },\n parentContext,\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n span.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n span.setAttribute('cloud.region', region);\n }\n\n // Store span and context on request for later use\n request[SPAN_SYMBOL] = span;\n request[CONTEXT_SYMBOL] = otelTrace.setSpan(parentContext, span);\n\n // Set the context as active for the handler execution\n // This ensures child spans created during handler execution are linked\n return new Promise<void>((resolve) => {\n context.with(request[CONTEXT_SYMBOL]!, () => {\n resolve();\n });\n });\n },\n\n after: async (request: TracingRequest) => {\n const span = request[SPAN_SYMBOL];\n if (!span) return;\n\n // Capture response if configured\n if (config?.captureResponse && request.response != null) {\n try {\n const responseJson = JSON.stringify(request.response);\n if (responseJson.length <= 4096) {\n span.setAttribute('lambda.response', responseJson);\n } else {\n span.setAttribute('lambda.response.truncated', true);\n span.setAttribute('lambda.response.size', responseJson.length);\n }\n } catch {\n span.setAttribute('lambda.response.serialization_failed', true);\n }\n }\n\n // Set success status\n span.setStatus({ code: SpanStatusCode.OK });\n\n // End the span\n span.end();\n },\n\n onError: async (request: TracingRequest) => {\n const span = request[SPAN_SYMBOL];\n if (!span) return;\n\n const error = request.error;\n if (error) {\n // Record error details\n const errorMessage = error.message || String(error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncateErrorMessage(errorMessage),\n });\n\n // Add exception attributes\n span.setAttribute('exception.type', error.name || 'Error');\n span.setAttribute('exception.message', truncateErrorMessage(errorMessage));\n\n if (error.stack) {\n span.setAttribute('exception.stacktrace', error.stack.slice(0, MAX_ERROR_MESSAGE_LENGTH));\n }\n\n // Record exception event\n span.recordException(error);\n }\n\n // End the span\n span.end();\n },\n };\n}\n\n/**\n * @deprecated Use tracingMiddleware instead. LambdaMiddleware is an alias for backwards compatibility.\n */\nexport const LambdaMiddleware = tracingMiddleware;\n\n/**\n * Get the current span from a Middy request object\n *\n * Useful for setting custom attributes within your handler when using\n * the tracing middleware.\n *\n * @param request - Middy request object\n * @returns The active span, or undefined if not available\n *\n * @example\n * ```typescript\n * const baseHandler = async (event, context) => {\n * const span = getSpanFromRequest(request);\n * if (span) {\n * span.setAttribute('user.id', event.userId);\n * }\n * return { statusCode: 200 };\n * };\n * ```\n */\nexport function getSpanFromRequest(request: Request<any, any, any, any>): Span | undefined {\n return (request as TracingRequest)[SPAN_SYMBOL];\n}\n\n/**\n * Get the OpenTelemetry context from a Middy request object\n *\n * @param request - Middy request object\n * @returns The active context, or undefined if not available\n */\nexport function getContextFromRequest(request: Request<any, any, any, any>): OtelContext | undefined {\n return (request as TracingRequest)[CONTEXT_SYMBOL];\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var chunkHMTKKKKP_cjs = require('./chunk-HMTKKKKP.cjs');
|
|
4
4
|
var chunkKNRQYDAS_cjs = require('./chunk-KNRQYDAS.cjs');
|
|
5
5
|
var chunk35F3UBOO_cjs = require('./chunk-35F3UBOO.cjs');
|
|
6
|
-
var
|
|
6
|
+
var chunkSPC4VYOI_cjs = require('./chunk-SPC4VYOI.cjs');
|
|
7
7
|
var chunkXOF2H2PI_cjs = require('./chunk-XOF2H2PI.cjs');
|
|
8
8
|
var chunkDHHLKZHI_cjs = require('./chunk-DHHLKZHI.cjs');
|
|
9
9
|
var chunkVZHQH75L_cjs = require('./chunk-VZHQH75L.cjs');
|
|
@@ -99,35 +99,35 @@ Object.defineProperty(exports, "setXRayMetadata", {
|
|
|
99
99
|
});
|
|
100
100
|
Object.defineProperty(exports, "LambdaMiddleware", {
|
|
101
101
|
enumerable: true,
|
|
102
|
-
get: function () { return
|
|
102
|
+
get: function () { return chunkSPC4VYOI_cjs.LambdaMiddleware; }
|
|
103
103
|
});
|
|
104
104
|
Object.defineProperty(exports, "detectTriggerType", {
|
|
105
105
|
enumerable: true,
|
|
106
|
-
get: function () { return
|
|
106
|
+
get: function () { return chunkSPC4VYOI_cjs.detectTriggerType; }
|
|
107
107
|
});
|
|
108
108
|
Object.defineProperty(exports, "extractTraceContext", {
|
|
109
109
|
enumerable: true,
|
|
110
|
-
get: function () { return
|
|
110
|
+
get: function () { return chunkSPC4VYOI_cjs.extractTraceContext; }
|
|
111
111
|
});
|
|
112
112
|
Object.defineProperty(exports, "getContextFromRequest", {
|
|
113
113
|
enumerable: true,
|
|
114
|
-
get: function () { return
|
|
114
|
+
get: function () { return chunkSPC4VYOI_cjs.getContextFromRequest; }
|
|
115
115
|
});
|
|
116
116
|
Object.defineProperty(exports, "getSpanFromRequest", {
|
|
117
117
|
enumerable: true,
|
|
118
|
-
get: function () { return
|
|
118
|
+
get: function () { return chunkSPC4VYOI_cjs.getSpanFromRequest; }
|
|
119
119
|
});
|
|
120
120
|
Object.defineProperty(exports, "traceLambda", {
|
|
121
121
|
enumerable: true,
|
|
122
|
-
get: function () { return
|
|
122
|
+
get: function () { return chunkSPC4VYOI_cjs.traceLambda; }
|
|
123
123
|
});
|
|
124
124
|
Object.defineProperty(exports, "tracingMiddleware", {
|
|
125
125
|
enumerable: true,
|
|
126
|
-
get: function () { return
|
|
126
|
+
get: function () { return chunkSPC4VYOI_cjs.tracingMiddleware; }
|
|
127
127
|
});
|
|
128
128
|
Object.defineProperty(exports, "wrapHandler", {
|
|
129
129
|
enumerable: true,
|
|
130
|
-
get: function () { return
|
|
130
|
+
get: function () { return chunkSPC4VYOI_cjs.wrapHandler; }
|
|
131
131
|
});
|
|
132
132
|
Object.defineProperty(exports, "autoInstrumentAWS", {
|
|
133
133
|
enumerable: true,
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { KinesisConsumer, KinesisProducer, traceKinesis } from './chunk-X6BY6PCK.js';
|
|
2
2
|
export { StepFunctionsActivityWorker, StepFunctionsExecutor, extractStepFunctionsContext, injectTraceContext, stripTraceContext, traceStepFunction } from './chunk-4THGOYZL.js';
|
|
3
3
|
export { AWSXRayPropagator as XRayPropagator, configureXRay, setXRayAnnotation, setXRayMetadata } from './chunk-PZGYL7XZ.js';
|
|
4
|
-
export { LambdaMiddleware, detectTriggerType, extractTraceContext, getContextFromRequest, getSpanFromRequest, traceLambda, tracingMiddleware, wrapHandler } from './chunk-
|
|
4
|
+
export { LambdaMiddleware, detectTriggerType, extractTraceContext, getContextFromRequest, getSpanFromRequest, traceLambda, tracingMiddleware, wrapHandler } from './chunk-JL33WEVE.js';
|
|
5
5
|
export { autoInstrumentAWS, createTracedClient, disableAutoInstrumentAWS, instrumentSDK, isAutoInstrumentEnabled } from './chunk-JPDJPOIB.js';
|
|
6
6
|
export { traceS3 } from './chunk-ZPDRKCAR.js';
|
|
7
7
|
export { traceDynamoDB } from './chunk-JMSFE6FJ.js';
|
package/dist/lambda.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkSPC4VYOI_cjs = require('./chunk-SPC4VYOI.cjs');
|
|
4
4
|
require('./chunk-Q3DMMQ7K.cjs');
|
|
5
5
|
require('./chunk-JEQ2X3Z6.cjs');
|
|
6
6
|
|
|
@@ -8,35 +8,35 @@ require('./chunk-JEQ2X3Z6.cjs');
|
|
|
8
8
|
|
|
9
9
|
Object.defineProperty(exports, "LambdaMiddleware", {
|
|
10
10
|
enumerable: true,
|
|
11
|
-
get: function () { return
|
|
11
|
+
get: function () { return chunkSPC4VYOI_cjs.LambdaMiddleware; }
|
|
12
12
|
});
|
|
13
13
|
Object.defineProperty(exports, "detectTriggerType", {
|
|
14
14
|
enumerable: true,
|
|
15
|
-
get: function () { return
|
|
15
|
+
get: function () { return chunkSPC4VYOI_cjs.detectTriggerType; }
|
|
16
16
|
});
|
|
17
17
|
Object.defineProperty(exports, "extractTraceContext", {
|
|
18
18
|
enumerable: true,
|
|
19
|
-
get: function () { return
|
|
19
|
+
get: function () { return chunkSPC4VYOI_cjs.extractTraceContext; }
|
|
20
20
|
});
|
|
21
21
|
Object.defineProperty(exports, "getContextFromRequest", {
|
|
22
22
|
enumerable: true,
|
|
23
|
-
get: function () { return
|
|
23
|
+
get: function () { return chunkSPC4VYOI_cjs.getContextFromRequest; }
|
|
24
24
|
});
|
|
25
25
|
Object.defineProperty(exports, "getSpanFromRequest", {
|
|
26
26
|
enumerable: true,
|
|
27
|
-
get: function () { return
|
|
27
|
+
get: function () { return chunkSPC4VYOI_cjs.getSpanFromRequest; }
|
|
28
28
|
});
|
|
29
29
|
Object.defineProperty(exports, "traceLambda", {
|
|
30
30
|
enumerable: true,
|
|
31
|
-
get: function () { return
|
|
31
|
+
get: function () { return chunkSPC4VYOI_cjs.traceLambda; }
|
|
32
32
|
});
|
|
33
33
|
Object.defineProperty(exports, "tracingMiddleware", {
|
|
34
34
|
enumerable: true,
|
|
35
|
-
get: function () { return
|
|
35
|
+
get: function () { return chunkSPC4VYOI_cjs.tracingMiddleware; }
|
|
36
36
|
});
|
|
37
37
|
Object.defineProperty(exports, "wrapHandler", {
|
|
38
38
|
enumerable: true,
|
|
39
|
-
get: function () { return
|
|
39
|
+
get: function () { return chunkSPC4VYOI_cjs.wrapHandler; }
|
|
40
40
|
});
|
|
41
41
|
//# sourceMappingURL=lambda.cjs.map
|
|
42
42
|
//# sourceMappingURL=lambda.cjs.map
|
package/dist/lambda.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { LambdaMiddleware, detectTriggerType, extractTraceContext, getContextFromRequest, getSpanFromRequest, traceLambda, tracingMiddleware, wrapHandler } from './chunk-
|
|
1
|
+
export { LambdaMiddleware, detectTriggerType, extractTraceContext, getContextFromRequest, getSpanFromRequest, traceLambda, tracingMiddleware, wrapHandler } from './chunk-JL33WEVE.js';
|
|
2
2
|
import './chunk-I4CKQ4RD.js';
|
|
3
3
|
import './chunk-DGUM43GV.js';
|
|
4
4
|
//# sourceMappingURL=lambda.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autotel-aws",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.2",
|
|
4
4
|
"description": "OpenTelemetry instrumentation for AWS",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": [
|
|
@@ -184,7 +184,7 @@
|
|
|
184
184
|
"@opentelemetry/semantic-conventions": "^1.41.1",
|
|
185
185
|
"@opentelemetry/propagator-aws-xray": "^2.2.0",
|
|
186
186
|
"@types/aws-lambda": "^8.10.161",
|
|
187
|
-
"autotel": "3.0
|
|
187
|
+
"autotel": "3.1.0"
|
|
188
188
|
},
|
|
189
189
|
"devDependencies": {
|
|
190
190
|
"@aws-sdk/client-s3": "^3.1045.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lambda/context-extractor.ts","../src/lambda/handler.ts","../src/lambda/middleware.ts"],"names":["carrier","otelTrace","context","autotelTrace","coldStartMap","MAX_ERROR_MESSAGE_LENGTH","createContextWithParent","truncateErrorMessage","extractAccountIdFromArn","SpanStatusCode"],"mappings":"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","file":"chunk-O2HC5VUM.js","sourcesContent":["/**\n * Extract trace context from Lambda events\n */\n\nimport { context, propagation, trace } from '@opentelemetry/api';\nimport type { SpanContext } from '@opentelemetry/api';\nimport type { LambdaEvent } from '../types';\nimport { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray';\n\n/**\n * Extract trace context from Lambda event\n *\n * Supports:\n * - API Gateway (W3C Trace Context headers)\n * - SQS (message attributes)\n * - SNS (message attributes)\n * - X-Ray header (Lambda integration)\n * - Step Functions (payload context)\n */\nexport function extractTraceContext(event: LambdaEvent): SpanContext | undefined {\n // API Gateway - W3C Trace Context\n if (event.headers?.traceparent) {\n const carrier: Record<string, string> = {};\n if (event.headers.traceparent) carrier.traceparent = event.headers.traceparent;\n if (event.headers.tracestate) carrier.tracestate = event.headers.tracestate;\n if (event.headers.baggage) carrier.baggage = event.headers.baggage;\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // SQS - message attributes\n if (event.Records?.[0]?.messageAttributes?.traceparent) {\n const record = event.Records[0];\n if (!record.messageAttributes) return undefined;\n \n const carrier: Record<string, string> = {};\n if (record.messageAttributes.traceparent?.StringValue) {\n carrier.traceparent = record.messageAttributes.traceparent.StringValue;\n }\n if (record.messageAttributes.tracestate?.StringValue) {\n carrier.tracestate = record.messageAttributes.tracestate.StringValue;\n }\n if (record.messageAttributes.baggage?.StringValue) {\n carrier.baggage = record.messageAttributes.baggage.StringValue;\n }\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // SNS - message attributes\n if (event.Records?.[0]?.Sns?.MessageAttributes?.traceparent) {\n const sns = event.Records[0].Sns;\n if (!sns.MessageAttributes) return undefined;\n \n const carrier: Record<string, string> = {};\n if (sns.MessageAttributes.traceparent?.Value) {\n carrier.traceparent = sns.MessageAttributes.traceparent.Value;\n }\n if (sns.MessageAttributes.tracestate?.Value) {\n carrier.tracestate = sns.MessageAttributes.tracestate.Value;\n }\n if (sns.MessageAttributes.baggage?.Value) {\n carrier.baggage = sns.MessageAttributes.baggage.Value;\n }\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // X-Ray header (Lambda integration)\n if (event.headers?.['x-amzn-trace-id']) {\n const xrayPropagator = new AWSXRayPropagator();\n const carrier: Record<string, string> = {\n 'x-amzn-trace-id': event.headers['x-amzn-trace-id'],\n };\n\n // AWSXRayPropagator.extract() requires a getter function\n // Use a simple getter for Record<string, string>\n const getter = {\n get(carrier: Record<string, string>, key: string): string | string[] | undefined {\n return carrier[key];\n },\n keys(carrier: Record<string, string>): string[] {\n return Object.keys(carrier);\n },\n };\n\n const extractedContext = xrayPropagator.extract(context.active(), carrier, getter);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // Step Functions - payload context\n if (event._autotel_trace_context) {\n return event._autotel_trace_context as SpanContext;\n }\n\n return undefined;\n}\n\n/**\n * Detect Lambda trigger type from event\n */\nexport function detectTriggerType(event: LambdaEvent): 'http' | 'pubsub' | 'datasource' | 'timer' | 'other' {\n // API Gateway / ALB\n if (event.headers || event.requestContext || event.httpMethod) {\n return 'http';\n }\n\n // SQS\n if (event.Records?.some((r) => r.messageAttributes || 'messageId' in r)) {\n return 'pubsub';\n }\n\n // SNS\n if (event.Records?.some((r) => r.Sns)) {\n return 'pubsub';\n }\n\n // Kinesis\n if (event.Records?.some((r) => r.kinesis)) {\n return 'datasource';\n }\n\n // EventBridge / Scheduled\n if (event.source === 'aws.events' || event['detail-type']) {\n return 'timer';\n }\n\n return 'other';\n}\n","/**\n * Lambda handler wrappers\n *\n * Provides instrumentation wrappers for AWS Lambda handlers with automatic\n * trace context extraction from various event sources (API Gateway, SQS, SNS, etc.).\n *\n * @example Simple wrapper\n * ```typescript\n * import { wrapHandler } from 'autotel-aws/lambda';\n *\n * export const handler = wrapHandler(async (event, context) => {\n * return { statusCode: 200 };\n * });\n * ```\n *\n * @example With context access\n * ```typescript\n * import { traceLambda } from 'autotel-aws/lambda';\n *\n * export const handler = traceLambda(ctx => async (event, context) => {\n * ctx.setAttribute('user.id', event.userId);\n * return { statusCode: 200 };\n * });\n * ```\n */\n\nimport { context, trace as otelTrace, SpanStatusCode } from '@opentelemetry/api';\nimport type { SpanContext, Context } from '@opentelemetry/api';\nimport { trace as autotelTrace, type TraceContext } from 'autotel';\nimport type { LambdaHandler } from './types';\nimport type { LambdaEvent, LambdaContext } from '../types';\nimport { extractTraceContext, detectTriggerType } from './context-extractor';\nimport { buildLambdaAttributes } from '../attributes';\nimport type { LambdaInstrumentationConfig } from '../config';\n\n// Track cold starts per function instance\n// Using WeakMap-like pattern to avoid memory leaks in long-running containers\nconst coldStartMap = new Map<string, boolean>();\n\n/**\n * Maximum error message length to prevent span attribute bloat\n */\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\n/**\n * Create an OpenTelemetry context with the given span context as parent\n *\n * This properly sets up the parent-child relationship for distributed tracing\n * by creating a context that contains the extracted span context.\n */\nfunction createContextWithParent(parentSpanContext: SpanContext): Context {\n // Create a non-recording span that carries the parent context\n // This is the standard OTel pattern for context propagation\n const parentSpan = otelTrace.wrapSpanContext(parentSpanContext);\n return otelTrace.setSpan(context.active(), parentSpan);\n}\n\n/**\n * Truncate error message to prevent span bloat\n */\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/**\n * Extract AWS account ID from Lambda ARN\n */\nfunction extractAccountIdFromArn(arn: string): string | undefined {\n // ARN format: arn:aws:lambda:region:account-id:function:name\n const arnParts = arn.split(':');\n if (arnParts.length >= 5) {\n return arnParts[4];\n }\n return undefined;\n}\n\n/**\n * Wrap Lambda handler with OpenTelemetry instrumentation\n *\n * Automatically extracts trace context from incoming events and creates\n * a root span for the Lambda invocation with proper semantic attributes.\n *\n * @param handler - The Lambda handler function to wrap\n * @param config - Optional instrumentation configuration\n * @returns Wrapped handler with automatic tracing\n *\n * @example Basic usage\n * ```typescript\n * export const handler = wrapHandler(async (event, context) => {\n * // Your handler code - automatically traced\n * return { statusCode: 200 };\n * });\n * ```\n *\n * @example With configuration\n * ```typescript\n * export const handler = wrapHandler(\n * async (event, context) => {\n * return { statusCode: 200, body: JSON.stringify({ result: 'ok' }) };\n * },\n * { captureResponse: true, extractTraceContext: true }\n * );\n * ```\n *\n * @remarks\n * Semantic attributes set automatically:\n * - `faas.name` - Function name\n * - `faas.version` - Function version\n * - `faas.invocation_id` - AWS request ID\n * - `faas.coldstart` - Whether this is a cold start\n * - `faas.trigger` - Trigger type (http, pubsub, datasource, timer, other)\n * - `cloud.provider` - 'aws'\n * - `cloud.region` - AWS region\n * - `cloud.account.id` - AWS account ID (extracted from ARN)\n */\nexport function wrapHandler<TEvent = LambdaEvent, TResult = unknown>(\n handler: LambdaHandler<TEvent, TResult>,\n config?: LambdaInstrumentationConfig,\n): LambdaHandler<TEvent, TResult> {\n // Return the wrapped handler\n return async (event: TEvent, lambdaContext: LambdaContext): Promise<TResult> => {\n const functionName = lambdaContext.functionName;\n\n // Detect cold start (first invocation for this function instance)\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context from event (if enabled, default: true)\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext\n ? extractTraceContext(event as LambdaEvent)\n : undefined;\n\n // Detect trigger type for semantic attributes\n const trigger = detectTriggerType(event as LambdaEvent);\n\n // Core tracing logic\n const executeWithTracing = async (): Promise<TResult> => {\n return autotelTrace(\n `lambda.${functionName}`,\n async (ctx: TraceContext): Promise<TResult> => {\n // Set Lambda semantic attributes\n ctx.setAttributes(\n buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n ctx.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n ctx.setAttribute('cloud.region', region);\n }\n\n try {\n const result = await handler(event, lambdaContext);\n\n // Capture response if configured (be careful with large payloads)\n if (config?.captureResponse && result != null) {\n try {\n const responseJson = JSON.stringify(result);\n // Only capture if not too large\n if (responseJson.length <= 4096) {\n ctx.setAttribute('lambda.response', responseJson);\n } else {\n ctx.setAttribute('lambda.response.truncated', true);\n ctx.setAttribute('lambda.response.size', responseJson.length);\n }\n } catch {\n // Ignore serialization errors (circular references, etc.)\n ctx.setAttribute('lambda.response.serialization_failed', true);\n }\n }\n\n return result;\n } catch (error) {\n // Record error details\n const errorMessage = error instanceof Error ? error.message : String(error);\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncateErrorMessage(errorMessage),\n });\n\n // Add exception attributes\n ctx.setAttribute('exception.type', error instanceof Error ? error.constructor.name : 'Error');\n ctx.setAttribute('exception.message', truncateErrorMessage(errorMessage));\n\n if (error instanceof Error && error.stack) {\n ctx.setAttribute('exception.stacktrace', error.stack.slice(0, MAX_ERROR_MESSAGE_LENGTH));\n }\n\n throw error;\n }\n },\n );\n };\n\n // Execute with proper parent context if available\n if (parentSpanContext) {\n const parentContext = createContextWithParent(parentSpanContext);\n return context.with(parentContext, executeWithTracing);\n }\n\n return executeWithTracing();\n };\n}\n\n/**\n * Functional API for Lambda with trace context access\n *\n * Similar to `wrapHandler`, but provides access to the trace context\n * for setting custom attributes during handler execution.\n *\n * @param factory - Factory function that receives trace context and returns a handler\n * @param config - Optional instrumentation configuration\n * @returns Wrapped handler with automatic tracing\n *\n * @example\n * ```typescript\n * export const handler = traceLambda(ctx => async (event, context) => {\n * // Access trace context for custom attributes\n * ctx.setAttribute('user.id', event.userId);\n * ctx.setAttribute('order.id', event.orderId);\n *\n * // Use X-Ray annotations for indexed attributes\n * setXRayAnnotation('user.tier', event.userTier);\n *\n * const result = await processOrder(event);\n * ctx.setAttribute('order.status', result.status);\n *\n * return { statusCode: 200, body: JSON.stringify(result) };\n * });\n * ```\n *\n * @remarks\n * The trace context (`ctx`) provides:\n * - `setAttribute(key, value)` - Set a single attribute\n * - `setAttributes(attrs)` - Set multiple attributes\n * - `setStatus(status)` - Set span status\n * - `recordException(error)` - Record an exception\n * - `traceId`, `spanId` - Trace identifiers\n */\nexport function traceLambda<TEvent = LambdaEvent, TResult = unknown>(\n factory: (ctx: TraceContext) => LambdaHandler<TEvent, TResult>,\n config?: LambdaInstrumentationConfig,\n): LambdaHandler<TEvent, TResult> {\n return async (event: TEvent, lambdaContext: LambdaContext): Promise<TResult> => {\n const functionName = lambdaContext.functionName;\n\n // Detect cold start\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext\n ? extractTraceContext(event as LambdaEvent)\n : undefined;\n\n // Detect trigger type\n const trigger = detectTriggerType(event as LambdaEvent);\n\n // Core tracing logic\n const executeWithTracing = async (): Promise<TResult> => {\n return autotelTrace(\n `lambda.${functionName}`,\n async (ctx: TraceContext): Promise<TResult> => {\n // Set Lambda semantic attributes\n ctx.setAttributes(\n buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n ctx.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n ctx.setAttribute('cloud.region', region);\n }\n\n // Create handler with context access and execute\n const handler = factory(ctx);\n return handler(event, lambdaContext);\n },\n );\n };\n\n // Execute with proper parent context if available\n if (parentSpanContext) {\n const parentContext = createContextWithParent(parentSpanContext);\n return context.with(parentContext, executeWithTracing);\n }\n\n return executeWithTracing();\n };\n}\n","/**\n * Middy-compatible Lambda middleware for OpenTelemetry instrumentation\n *\n * Provides full span lifecycle management for Lambda handlers using Middy.\n *\n * @example Basic usage\n * ```typescript\n * import middy from '@middy/core';\n * import { tracingMiddleware } from 'autotel-aws/lambda';\n *\n * const baseHandler = async (event, context) => {\n * return { statusCode: 200 };\n * };\n *\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware());\n * ```\n *\n * @example With configuration\n * ```typescript\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware({\n * captureResponse: true,\n * extractTraceContext: true\n * }));\n * ```\n *\n * @example Combined with other middleware\n * ```typescript\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware())\n * .use(jsonBodyParser())\n * .use(httpErrorHandler());\n * ```\n */\n\nimport type { MiddlewareObj, Request } from '@middy/core';\nimport type { Context as AWSLambdaContext } from 'aws-lambda';\nimport { context, trace as otelTrace, SpanStatusCode } from '@opentelemetry/api';\nimport type { Span, SpanContext, Context as OtelContext } from '@opentelemetry/api';\nimport type { LambdaEvent } from '../types';\nimport type { LambdaInstrumentationConfig } from '../config';\nimport { extractTraceContext, detectTriggerType } from './context-extractor';\nimport { buildLambdaAttributes } from '../attributes';\n\n// Symbol to store span on request object\nconst SPAN_SYMBOL = Symbol.for('autotel-aws.span');\nconst CONTEXT_SYMBOL = Symbol.for('autotel-aws.context');\n\n// Track cold starts per function instance\nconst coldStartMap = new Map<string, boolean>();\n\n/**\n * Maximum error message length to prevent span attribute bloat\n */\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\n/**\n * Create an OpenTelemetry context with the given span context as parent\n */\nfunction createContextWithParent(parentSpanContext: SpanContext): OtelContext {\n const parentSpan = otelTrace.wrapSpanContext(parentSpanContext);\n return otelTrace.setSpan(context.active(), parentSpan);\n}\n\n/**\n * Truncate error message to prevent span bloat\n */\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/**\n * Extract AWS account ID from Lambda ARN\n */\nfunction extractAccountIdFromArn(arn: string): string | undefined {\n const arnParts = arn.split(':');\n if (arnParts.length >= 5) {\n return arnParts[4];\n }\n return undefined;\n}\n\n// Extended request type with our symbols\ninterface TracingRequest<TEvent = LambdaEvent, TResult = unknown>\n extends Request<TEvent, TResult, Error, AWSLambdaContext> {\n [SPAN_SYMBOL]?: Span;\n [CONTEXT_SYMBOL]?: OtelContext;\n}\n\n/**\n * Middy middleware for Lambda instrumentation with full span lifecycle\n *\n * Creates a span that wraps the entire handler execution, including:\n * - Trace context extraction from incoming events\n * - Cold start detection\n * - Semantic attributes for Lambda (faas.*, cloud.*)\n * - Error recording and status\n * - Response capture (optional)\n *\n * @param config - Optional instrumentation configuration\n * @returns Middy middleware object\n *\n * @remarks\n * This middleware uses Middy's before/after/onError hooks to manage\n * the span lifecycle. The span is created in `before`, ended in `after`\n * or `onError`.\n *\n * Semantic attributes set automatically:\n * - `faas.name` - Function name\n * - `faas.version` - Function version\n * - `faas.invocation_id` - AWS request ID\n * - `faas.coldstart` - Whether this is a cold start\n * - `faas.trigger` - Trigger type (http, pubsub, datasource, timer, other)\n * - `cloud.provider` - 'aws'\n * - `cloud.region` - AWS region\n * - `cloud.account.id` - AWS account ID (extracted from ARN)\n */\nexport function tracingMiddleware(\n config?: LambdaInstrumentationConfig,\n): MiddlewareObj<LambdaEvent, unknown, Error, AWSLambdaContext> {\n const tracer = otelTrace.getTracer('autotel-aws');\n\n return {\n before: async (request: TracingRequest) => {\n const { event, context: lambdaContext } = request;\n const functionName = lambdaContext.functionName;\n\n // Detect cold start\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context from event\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext ? extractTraceContext(event) : undefined;\n\n // Detect trigger type\n const trigger = detectTriggerType(event);\n\n // Create parent context if available\n let parentContext = context.active();\n if (parentSpanContext) {\n parentContext = createContextWithParent(parentSpanContext);\n }\n\n // Start span with parent context\n const span = tracer.startSpan(\n `lambda.${functionName}`,\n {\n attributes: buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n },\n parentContext,\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n span.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n span.setAttribute('cloud.region', region);\n }\n\n // Store span and context on request for later use\n request[SPAN_SYMBOL] = span;\n request[CONTEXT_SYMBOL] = otelTrace.setSpan(parentContext, span);\n\n // Set the context as active for the handler execution\n // This ensures child spans created during handler execution are linked\n return new Promise<void>((resolve) => {\n context.with(request[CONTEXT_SYMBOL]!, () => {\n resolve();\n });\n });\n },\n\n after: async (request: TracingRequest) => {\n const span = request[SPAN_SYMBOL];\n if (!span) return;\n\n // Capture response if configured\n if (config?.captureResponse && request.response != null) {\n try {\n const responseJson = JSON.stringify(request.response);\n if (responseJson.length <= 4096) {\n span.setAttribute('lambda.response', responseJson);\n } else {\n span.setAttribute('lambda.response.truncated', true);\n span.setAttribute('lambda.response.size', responseJson.length);\n }\n } catch {\n span.setAttribute('lambda.response.serialization_failed', true);\n }\n }\n\n // Set success status\n span.setStatus({ code: SpanStatusCode.OK });\n\n // End the span\n span.end();\n },\n\n onError: async (request: TracingRequest) => {\n const span = request[SPAN_SYMBOL];\n if (!span) return;\n\n const error = request.error;\n if (error) {\n // Record error details\n const errorMessage = error.message || String(error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncateErrorMessage(errorMessage),\n });\n\n // Add exception attributes\n span.setAttribute('exception.type', error.name || 'Error');\n span.setAttribute('exception.message', truncateErrorMessage(errorMessage));\n\n if (error.stack) {\n span.setAttribute('exception.stacktrace', error.stack.slice(0, MAX_ERROR_MESSAGE_LENGTH));\n }\n\n // Record exception event\n span.recordException(error);\n }\n\n // End the span\n span.end();\n },\n };\n}\n\n/**\n * @deprecated Use tracingMiddleware instead. LambdaMiddleware is an alias for backwards compatibility.\n */\nexport const LambdaMiddleware = tracingMiddleware;\n\n/**\n * Get the current span from a Middy request object\n *\n * Useful for setting custom attributes within your handler when using\n * the tracing middleware.\n *\n * @param request - Middy request object\n * @returns The active span, or undefined if not available\n *\n * @example\n * ```typescript\n * const baseHandler = async (event, context) => {\n * const span = getSpanFromRequest(request);\n * if (span) {\n * span.setAttribute('user.id', event.userId);\n * }\n * return { statusCode: 200 };\n * };\n * ```\n */\nexport function getSpanFromRequest(request: Request<any, any, any, any>): Span | undefined {\n return (request as TracingRequest)[SPAN_SYMBOL];\n}\n\n/**\n * Get the OpenTelemetry context from a Middy request object\n *\n * @param request - Middy request object\n * @returns The active context, or undefined if not available\n */\nexport function getContextFromRequest(request: Request<any, any, any, any>): OtelContext | undefined {\n return (request as TracingRequest)[CONTEXT_SYMBOL];\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lambda/context-extractor.ts","../src/lambda/handler.ts","../src/lambda/middleware.ts"],"names":["propagation","context","trace","AWSXRayPropagator","carrier","otelTrace","autotelTrace","buildLambdaAttributes","SpanStatusCode","coldStartMap","MAX_ERROR_MESSAGE_LENGTH","createContextWithParent","truncateErrorMessage","extractAccountIdFromArn"],"mappings":"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","file":"chunk-Q65NDS7W.cjs","sourcesContent":["/**\n * Extract trace context from Lambda events\n */\n\nimport { context, propagation, trace } from '@opentelemetry/api';\nimport type { SpanContext } from '@opentelemetry/api';\nimport type { LambdaEvent } from '../types';\nimport { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray';\n\n/**\n * Extract trace context from Lambda event\n *\n * Supports:\n * - API Gateway (W3C Trace Context headers)\n * - SQS (message attributes)\n * - SNS (message attributes)\n * - X-Ray header (Lambda integration)\n * - Step Functions (payload context)\n */\nexport function extractTraceContext(event: LambdaEvent): SpanContext | undefined {\n // API Gateway - W3C Trace Context\n if (event.headers?.traceparent) {\n const carrier: Record<string, string> = {};\n if (event.headers.traceparent) carrier.traceparent = event.headers.traceparent;\n if (event.headers.tracestate) carrier.tracestate = event.headers.tracestate;\n if (event.headers.baggage) carrier.baggage = event.headers.baggage;\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // SQS - message attributes\n if (event.Records?.[0]?.messageAttributes?.traceparent) {\n const record = event.Records[0];\n if (!record.messageAttributes) return undefined;\n \n const carrier: Record<string, string> = {};\n if (record.messageAttributes.traceparent?.StringValue) {\n carrier.traceparent = record.messageAttributes.traceparent.StringValue;\n }\n if (record.messageAttributes.tracestate?.StringValue) {\n carrier.tracestate = record.messageAttributes.tracestate.StringValue;\n }\n if (record.messageAttributes.baggage?.StringValue) {\n carrier.baggage = record.messageAttributes.baggage.StringValue;\n }\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // SNS - message attributes\n if (event.Records?.[0]?.Sns?.MessageAttributes?.traceparent) {\n const sns = event.Records[0].Sns;\n if (!sns.MessageAttributes) return undefined;\n \n const carrier: Record<string, string> = {};\n if (sns.MessageAttributes.traceparent?.Value) {\n carrier.traceparent = sns.MessageAttributes.traceparent.Value;\n }\n if (sns.MessageAttributes.tracestate?.Value) {\n carrier.tracestate = sns.MessageAttributes.tracestate.Value;\n }\n if (sns.MessageAttributes.baggage?.Value) {\n carrier.baggage = sns.MessageAttributes.baggage.Value;\n }\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // X-Ray header (Lambda integration)\n if (event.headers?.['x-amzn-trace-id']) {\n const xrayPropagator = new AWSXRayPropagator();\n const carrier: Record<string, string> = {\n 'x-amzn-trace-id': event.headers['x-amzn-trace-id'],\n };\n\n // AWSXRayPropagator.extract() requires a getter function\n // Use a simple getter for Record<string, string>\n const getter = {\n get(carrier: Record<string, string>, key: string): string | string[] | undefined {\n return carrier[key];\n },\n keys(carrier: Record<string, string>): string[] {\n return Object.keys(carrier);\n },\n };\n\n const extractedContext = xrayPropagator.extract(context.active(), carrier, getter);\n const spanContext = trace.getSpanContext(extractedContext);\n return spanContext;\n }\n\n // Step Functions - payload context\n if (event._autotel_trace_context) {\n return event._autotel_trace_context as SpanContext;\n }\n\n return undefined;\n}\n\n/**\n * Detect Lambda trigger type from event\n */\nexport function detectTriggerType(event: LambdaEvent): 'http' | 'pubsub' | 'datasource' | 'timer' | 'other' {\n // API Gateway / ALB\n if (event.headers || event.requestContext || event.httpMethod) {\n return 'http';\n }\n\n // SQS\n if (event.Records?.some((r) => r.messageAttributes || 'messageId' in r)) {\n return 'pubsub';\n }\n\n // SNS\n if (event.Records?.some((r) => r.Sns)) {\n return 'pubsub';\n }\n\n // Kinesis\n if (event.Records?.some((r) => r.kinesis)) {\n return 'datasource';\n }\n\n // EventBridge / Scheduled\n if (event.source === 'aws.events' || event['detail-type']) {\n return 'timer';\n }\n\n return 'other';\n}\n","/**\n * Lambda handler wrappers\n *\n * Provides instrumentation wrappers for AWS Lambda handlers with automatic\n * trace context extraction from various event sources (API Gateway, SQS, SNS, etc.).\n *\n * @example Simple wrapper\n * ```typescript\n * import { wrapHandler } from 'autotel-aws/lambda';\n *\n * export const handler = wrapHandler(async (event, context) => {\n * return { statusCode: 200 };\n * });\n * ```\n *\n * @example With context access\n * ```typescript\n * import { traceLambda } from 'autotel-aws/lambda';\n *\n * export const handler = traceLambda(ctx => async (event, context) => {\n * ctx.setAttribute('user.id', event.userId);\n * return { statusCode: 200 };\n * });\n * ```\n */\n\nimport { context, trace as otelTrace, SpanStatusCode } from '@opentelemetry/api';\nimport type { SpanContext, Context } from '@opentelemetry/api';\nimport { trace as autotelTrace, type TraceContext } from 'autotel';\nimport type { LambdaHandler } from './types';\nimport type { LambdaEvent, LambdaContext } from '../types';\nimport { extractTraceContext, detectTriggerType } from './context-extractor';\nimport { buildLambdaAttributes } from '../attributes';\nimport type { LambdaInstrumentationConfig } from '../config';\n\n// Track cold starts per function instance\n// Using WeakMap-like pattern to avoid memory leaks in long-running containers\nconst coldStartMap = new Map<string, boolean>();\n\n/**\n * Maximum error message length to prevent span attribute bloat\n */\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\n/**\n * Create an OpenTelemetry context with the given span context as parent\n *\n * This properly sets up the parent-child relationship for distributed tracing\n * by creating a context that contains the extracted span context.\n */\nfunction createContextWithParent(parentSpanContext: SpanContext): Context {\n // Create a non-recording span that carries the parent context\n // This is the standard OTel pattern for context propagation\n const parentSpan = otelTrace.wrapSpanContext(parentSpanContext);\n return otelTrace.setSpan(context.active(), parentSpan);\n}\n\n/**\n * Truncate error message to prevent span bloat\n */\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/**\n * Extract AWS account ID from Lambda ARN\n */\nfunction extractAccountIdFromArn(arn: string): string | undefined {\n // ARN format: arn:aws:lambda:region:account-id:function:name\n const arnParts = arn.split(':');\n if (arnParts.length >= 5) {\n return arnParts[4];\n }\n return undefined;\n}\n\n/**\n * Wrap Lambda handler with OpenTelemetry instrumentation\n *\n * Automatically extracts trace context from incoming events and creates\n * a root span for the Lambda invocation with proper semantic attributes.\n *\n * @param handler - The Lambda handler function to wrap\n * @param config - Optional instrumentation configuration\n * @returns Wrapped handler with automatic tracing\n *\n * @example Basic usage\n * ```typescript\n * export const handler = wrapHandler(async (event, context) => {\n * // Your handler code - automatically traced\n * return { statusCode: 200 };\n * });\n * ```\n *\n * @example With configuration\n * ```typescript\n * export const handler = wrapHandler(\n * async (event, context) => {\n * return { statusCode: 200, body: JSON.stringify({ result: 'ok' }) };\n * },\n * { captureResponse: true, extractTraceContext: true }\n * );\n * ```\n *\n * @remarks\n * Semantic attributes set automatically:\n * - `faas.name` - Function name\n * - `faas.version` - Function version\n * - `faas.invocation_id` - AWS request ID\n * - `faas.coldstart` - Whether this is a cold start\n * - `faas.trigger` - Trigger type (http, pubsub, datasource, timer, other)\n * - `cloud.provider` - 'aws'\n * - `cloud.region` - AWS region\n * - `cloud.account.id` - AWS account ID (extracted from ARN)\n */\nexport function wrapHandler<TEvent = LambdaEvent, TResult = unknown>(\n handler: LambdaHandler<TEvent, TResult>,\n config?: LambdaInstrumentationConfig,\n): LambdaHandler<TEvent, TResult> {\n // Return the wrapped handler\n return async (event: TEvent, lambdaContext: LambdaContext): Promise<TResult> => {\n const functionName = lambdaContext.functionName;\n\n // Detect cold start (first invocation for this function instance)\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context from event (if enabled, default: true)\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext\n ? extractTraceContext(event as LambdaEvent)\n : undefined;\n\n // Detect trigger type for semantic attributes\n const trigger = detectTriggerType(event as LambdaEvent);\n\n // Core tracing logic\n const executeWithTracing = async (): Promise<TResult> => {\n return autotelTrace(\n `lambda.${functionName}`,\n async (ctx: TraceContext): Promise<TResult> => {\n // Set Lambda semantic attributes\n ctx.setAttributes(\n buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n ctx.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n ctx.setAttribute('cloud.region', region);\n }\n\n try {\n const result = await handler(event, lambdaContext);\n\n // Capture response if configured (be careful with large payloads)\n if (config?.captureResponse && result != null) {\n try {\n const responseJson = JSON.stringify(result);\n // Only capture if not too large\n if (responseJson.length <= 4096) {\n ctx.setAttribute('lambda.response', responseJson);\n } else {\n ctx.setAttribute('lambda.response.truncated', true);\n ctx.setAttribute('lambda.response.size', responseJson.length);\n }\n } catch {\n // Ignore serialization errors (circular references, etc.)\n ctx.setAttribute('lambda.response.serialization_failed', true);\n }\n }\n\n return result;\n } catch (error) {\n // Record error details\n const errorMessage = error instanceof Error ? error.message : String(error);\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncateErrorMessage(errorMessage),\n });\n\n // Add exception attributes\n ctx.setAttribute('exception.type', error instanceof Error ? error.constructor.name : 'Error');\n ctx.setAttribute('exception.message', truncateErrorMessage(errorMessage));\n\n if (error instanceof Error && error.stack) {\n ctx.setAttribute('exception.stacktrace', error.stack.slice(0, MAX_ERROR_MESSAGE_LENGTH));\n }\n\n throw error;\n }\n },\n );\n };\n\n // Execute with proper parent context if available\n if (parentSpanContext) {\n const parentContext = createContextWithParent(parentSpanContext);\n return context.with(parentContext, executeWithTracing);\n }\n\n return executeWithTracing();\n };\n}\n\n/**\n * Functional API for Lambda with trace context access\n *\n * Similar to `wrapHandler`, but provides access to the trace context\n * for setting custom attributes during handler execution.\n *\n * @param factory - Factory function that receives trace context and returns a handler\n * @param config - Optional instrumentation configuration\n * @returns Wrapped handler with automatic tracing\n *\n * @example\n * ```typescript\n * export const handler = traceLambda(ctx => async (event, context) => {\n * // Access trace context for custom attributes\n * ctx.setAttribute('user.id', event.userId);\n * ctx.setAttribute('order.id', event.orderId);\n *\n * // Use X-Ray annotations for indexed attributes\n * setXRayAnnotation('user.tier', event.userTier);\n *\n * const result = await processOrder(event);\n * ctx.setAttribute('order.status', result.status);\n *\n * return { statusCode: 200, body: JSON.stringify(result) };\n * });\n * ```\n *\n * @remarks\n * The trace context (`ctx`) provides:\n * - `setAttribute(key, value)` - Set a single attribute\n * - `setAttributes(attrs)` - Set multiple attributes\n * - `setStatus(status)` - Set span status\n * - `recordException(error)` - Record an exception\n * - `traceId`, `spanId` - Trace identifiers\n */\nexport function traceLambda<TEvent = LambdaEvent, TResult = unknown>(\n factory: (ctx: TraceContext) => LambdaHandler<TEvent, TResult>,\n config?: LambdaInstrumentationConfig,\n): LambdaHandler<TEvent, TResult> {\n return async (event: TEvent, lambdaContext: LambdaContext): Promise<TResult> => {\n const functionName = lambdaContext.functionName;\n\n // Detect cold start\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext\n ? extractTraceContext(event as LambdaEvent)\n : undefined;\n\n // Detect trigger type\n const trigger = detectTriggerType(event as LambdaEvent);\n\n // Core tracing logic\n const executeWithTracing = async (): Promise<TResult> => {\n return autotelTrace(\n `lambda.${functionName}`,\n async (ctx: TraceContext): Promise<TResult> => {\n // Set Lambda semantic attributes\n ctx.setAttributes(\n buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n ctx.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n ctx.setAttribute('cloud.region', region);\n }\n\n // Create handler with context access and execute\n const handler = factory(ctx);\n return handler(event, lambdaContext);\n },\n );\n };\n\n // Execute with proper parent context if available\n if (parentSpanContext) {\n const parentContext = createContextWithParent(parentSpanContext);\n return context.with(parentContext, executeWithTracing);\n }\n\n return executeWithTracing();\n };\n}\n","/**\n * Middy-compatible Lambda middleware for OpenTelemetry instrumentation\n *\n * Provides full span lifecycle management for Lambda handlers using Middy.\n *\n * @example Basic usage\n * ```typescript\n * import middy from '@middy/core';\n * import { tracingMiddleware } from 'autotel-aws/lambda';\n *\n * const baseHandler = async (event, context) => {\n * return { statusCode: 200 };\n * };\n *\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware());\n * ```\n *\n * @example With configuration\n * ```typescript\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware({\n * captureResponse: true,\n * extractTraceContext: true\n * }));\n * ```\n *\n * @example Combined with other middleware\n * ```typescript\n * export const handler = middy(baseHandler)\n * .use(tracingMiddleware())\n * .use(jsonBodyParser())\n * .use(httpErrorHandler());\n * ```\n */\n\nimport type { MiddlewareObj, Request } from '@middy/core';\nimport type { Context as AWSLambdaContext } from 'aws-lambda';\nimport { context, trace as otelTrace, SpanStatusCode } from '@opentelemetry/api';\nimport type { Span, SpanContext, Context as OtelContext } from '@opentelemetry/api';\nimport type { LambdaEvent } from '../types';\nimport type { LambdaInstrumentationConfig } from '../config';\nimport { extractTraceContext, detectTriggerType } from './context-extractor';\nimport { buildLambdaAttributes } from '../attributes';\n\n// Symbol to store span on request object\nconst SPAN_SYMBOL = Symbol.for('autotel-aws.span');\nconst CONTEXT_SYMBOL = Symbol.for('autotel-aws.context');\n\n// Track cold starts per function instance\nconst coldStartMap = new Map<string, boolean>();\n\n/**\n * Maximum error message length to prevent span attribute bloat\n */\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\n/**\n * Create an OpenTelemetry context with the given span context as parent\n */\nfunction createContextWithParent(parentSpanContext: SpanContext): OtelContext {\n const parentSpan = otelTrace.wrapSpanContext(parentSpanContext);\n return otelTrace.setSpan(context.active(), parentSpan);\n}\n\n/**\n * Truncate error message to prevent span bloat\n */\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/**\n * Extract AWS account ID from Lambda ARN\n */\nfunction extractAccountIdFromArn(arn: string): string | undefined {\n const arnParts = arn.split(':');\n if (arnParts.length >= 5) {\n return arnParts[4];\n }\n return undefined;\n}\n\n// Extended request type with our symbols\ninterface TracingRequest<TEvent = LambdaEvent, TResult = unknown>\n extends Request<TEvent, TResult, Error, AWSLambdaContext> {\n [SPAN_SYMBOL]?: Span;\n [CONTEXT_SYMBOL]?: OtelContext;\n}\n\n/**\n * Middy middleware for Lambda instrumentation with full span lifecycle\n *\n * Creates a span that wraps the entire handler execution, including:\n * - Trace context extraction from incoming events\n * - Cold start detection\n * - Semantic attributes for Lambda (faas.*, cloud.*)\n * - Error recording and status\n * - Response capture (optional)\n *\n * @param config - Optional instrumentation configuration\n * @returns Middy middleware object\n *\n * @remarks\n * This middleware uses Middy's before/after/onError hooks to manage\n * the span lifecycle. The span is created in `before`, ended in `after`\n * or `onError`.\n *\n * Semantic attributes set automatically:\n * - `faas.name` - Function name\n * - `faas.version` - Function version\n * - `faas.invocation_id` - AWS request ID\n * - `faas.coldstart` - Whether this is a cold start\n * - `faas.trigger` - Trigger type (http, pubsub, datasource, timer, other)\n * - `cloud.provider` - 'aws'\n * - `cloud.region` - AWS region\n * - `cloud.account.id` - AWS account ID (extracted from ARN)\n */\nexport function tracingMiddleware(\n config?: LambdaInstrumentationConfig,\n): MiddlewareObj<LambdaEvent, unknown, Error, AWSLambdaContext> {\n const tracer = otelTrace.getTracer('autotel-aws');\n\n return {\n before: async (request: TracingRequest) => {\n const { event, context: lambdaContext } = request;\n const functionName = lambdaContext.functionName;\n\n // Detect cold start\n const isColdStart = !coldStartMap.has(functionName);\n if (isColdStart) {\n coldStartMap.set(functionName, true);\n }\n\n // Extract parent trace context from event\n const shouldExtractContext = config?.extractTraceContext !== false;\n const parentSpanContext = shouldExtractContext ? extractTraceContext(event) : undefined;\n\n // Detect trigger type\n const trigger = detectTriggerType(event);\n\n // Create parent context if available\n let parentContext = context.active();\n if (parentSpanContext) {\n parentContext = createContextWithParent(parentSpanContext);\n }\n\n // Start span with parent context\n const span = tracer.startSpan(\n `lambda.${functionName}`,\n {\n attributes: buildLambdaAttributes({\n awsRequestId: lambdaContext.awsRequestId,\n functionName,\n functionVersion: lambdaContext.functionVersion,\n coldStart: isColdStart,\n trigger,\n }),\n },\n parentContext,\n );\n\n // Extract and set account ID from ARN\n const accountId = extractAccountIdFromArn(lambdaContext.invokedFunctionArn);\n if (accountId) {\n span.setAttribute('cloud.account.id', accountId);\n }\n\n // Set region from environment\n const region = process.env.AWS_REGION;\n if (region) {\n span.setAttribute('cloud.region', region);\n }\n\n // Store span and context on request for later use\n request[SPAN_SYMBOL] = span;\n request[CONTEXT_SYMBOL] = otelTrace.setSpan(parentContext, span);\n\n // Set the context as active for the handler execution\n // This ensures child spans created during handler execution are linked\n return new Promise<void>((resolve) => {\n context.with(request[CONTEXT_SYMBOL]!, () => {\n resolve();\n });\n });\n },\n\n after: async (request: TracingRequest) => {\n const span = request[SPAN_SYMBOL];\n if (!span) return;\n\n // Capture response if configured\n if (config?.captureResponse && request.response != null) {\n try {\n const responseJson = JSON.stringify(request.response);\n if (responseJson.length <= 4096) {\n span.setAttribute('lambda.response', responseJson);\n } else {\n span.setAttribute('lambda.response.truncated', true);\n span.setAttribute('lambda.response.size', responseJson.length);\n }\n } catch {\n span.setAttribute('lambda.response.serialization_failed', true);\n }\n }\n\n // Set success status\n span.setStatus({ code: SpanStatusCode.OK });\n\n // End the span\n span.end();\n },\n\n onError: async (request: TracingRequest) => {\n const span = request[SPAN_SYMBOL];\n if (!span) return;\n\n const error = request.error;\n if (error) {\n // Record error details\n const errorMessage = error.message || String(error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncateErrorMessage(errorMessage),\n });\n\n // Add exception attributes\n span.setAttribute('exception.type', error.name || 'Error');\n span.setAttribute('exception.message', truncateErrorMessage(errorMessage));\n\n if (error.stack) {\n span.setAttribute('exception.stacktrace', error.stack.slice(0, MAX_ERROR_MESSAGE_LENGTH));\n }\n\n // Record exception event\n span.recordException(error);\n }\n\n // End the span\n span.end();\n },\n };\n}\n\n/**\n * @deprecated Use tracingMiddleware instead. LambdaMiddleware is an alias for backwards compatibility.\n */\nexport const LambdaMiddleware = tracingMiddleware;\n\n/**\n * Get the current span from a Middy request object\n *\n * Useful for setting custom attributes within your handler when using\n * the tracing middleware.\n *\n * @param request - Middy request object\n * @returns The active span, or undefined if not available\n *\n * @example\n * ```typescript\n * const baseHandler = async (event, context) => {\n * const span = getSpanFromRequest(request);\n * if (span) {\n * span.setAttribute('user.id', event.userId);\n * }\n * return { statusCode: 200 };\n * };\n * ```\n */\nexport function getSpanFromRequest(request: Request<any, any, any, any>): Span | undefined {\n return (request as TracingRequest)[SPAN_SYMBOL];\n}\n\n/**\n * Get the OpenTelemetry context from a Middy request object\n *\n * @param request - Middy request object\n * @returns The active context, or undefined if not available\n */\nexport function getContextFromRequest(request: Request<any, any, any, any>): OtelContext | undefined {\n return (request as TracingRequest)[CONTEXT_SYMBOL];\n}\n"]}
|