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.
@@ -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-O2HC5VUM.js.map
341
- //# sourceMappingURL=chunk-O2HC5VUM.js.map
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-Q65NDS7W.cjs.map
350
- //# sourceMappingURL=chunk-Q65NDS7W.cjs.map
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 chunkQ65NDS7W_cjs = require('./chunk-Q65NDS7W.cjs');
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 chunkQ65NDS7W_cjs.LambdaMiddleware; }
102
+ get: function () { return chunkSPC4VYOI_cjs.LambdaMiddleware; }
103
103
  });
104
104
  Object.defineProperty(exports, "detectTriggerType", {
105
105
  enumerable: true,
106
- get: function () { return chunkQ65NDS7W_cjs.detectTriggerType; }
106
+ get: function () { return chunkSPC4VYOI_cjs.detectTriggerType; }
107
107
  });
108
108
  Object.defineProperty(exports, "extractTraceContext", {
109
109
  enumerable: true,
110
- get: function () { return chunkQ65NDS7W_cjs.extractTraceContext; }
110
+ get: function () { return chunkSPC4VYOI_cjs.extractTraceContext; }
111
111
  });
112
112
  Object.defineProperty(exports, "getContextFromRequest", {
113
113
  enumerable: true,
114
- get: function () { return chunkQ65NDS7W_cjs.getContextFromRequest; }
114
+ get: function () { return chunkSPC4VYOI_cjs.getContextFromRequest; }
115
115
  });
116
116
  Object.defineProperty(exports, "getSpanFromRequest", {
117
117
  enumerable: true,
118
- get: function () { return chunkQ65NDS7W_cjs.getSpanFromRequest; }
118
+ get: function () { return chunkSPC4VYOI_cjs.getSpanFromRequest; }
119
119
  });
120
120
  Object.defineProperty(exports, "traceLambda", {
121
121
  enumerable: true,
122
- get: function () { return chunkQ65NDS7W_cjs.traceLambda; }
122
+ get: function () { return chunkSPC4VYOI_cjs.traceLambda; }
123
123
  });
124
124
  Object.defineProperty(exports, "tracingMiddleware", {
125
125
  enumerable: true,
126
- get: function () { return chunkQ65NDS7W_cjs.tracingMiddleware; }
126
+ get: function () { return chunkSPC4VYOI_cjs.tracingMiddleware; }
127
127
  });
128
128
  Object.defineProperty(exports, "wrapHandler", {
129
129
  enumerable: true,
130
- get: function () { return chunkQ65NDS7W_cjs.wrapHandler; }
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-O2HC5VUM.js';
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 chunkQ65NDS7W_cjs = require('./chunk-Q65NDS7W.cjs');
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 chunkQ65NDS7W_cjs.LambdaMiddleware; }
11
+ get: function () { return chunkSPC4VYOI_cjs.LambdaMiddleware; }
12
12
  });
13
13
  Object.defineProperty(exports, "detectTriggerType", {
14
14
  enumerable: true,
15
- get: function () { return chunkQ65NDS7W_cjs.detectTriggerType; }
15
+ get: function () { return chunkSPC4VYOI_cjs.detectTriggerType; }
16
16
  });
17
17
  Object.defineProperty(exports, "extractTraceContext", {
18
18
  enumerable: true,
19
- get: function () { return chunkQ65NDS7W_cjs.extractTraceContext; }
19
+ get: function () { return chunkSPC4VYOI_cjs.extractTraceContext; }
20
20
  });
21
21
  Object.defineProperty(exports, "getContextFromRequest", {
22
22
  enumerable: true,
23
- get: function () { return chunkQ65NDS7W_cjs.getContextFromRequest; }
23
+ get: function () { return chunkSPC4VYOI_cjs.getContextFromRequest; }
24
24
  });
25
25
  Object.defineProperty(exports, "getSpanFromRequest", {
26
26
  enumerable: true,
27
- get: function () { return chunkQ65NDS7W_cjs.getSpanFromRequest; }
27
+ get: function () { return chunkSPC4VYOI_cjs.getSpanFromRequest; }
28
28
  });
29
29
  Object.defineProperty(exports, "traceLambda", {
30
30
  enumerable: true,
31
- get: function () { return chunkQ65NDS7W_cjs.traceLambda; }
31
+ get: function () { return chunkSPC4VYOI_cjs.traceLambda; }
32
32
  });
33
33
  Object.defineProperty(exports, "tracingMiddleware", {
34
34
  enumerable: true,
35
- get: function () { return chunkQ65NDS7W_cjs.tracingMiddleware; }
35
+ get: function () { return chunkSPC4VYOI_cjs.tracingMiddleware; }
36
36
  });
37
37
  Object.defineProperty(exports, "wrapHandler", {
38
38
  enumerable: true,
39
- get: function () { return chunkQ65NDS7W_cjs.wrapHandler; }
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-O2HC5VUM.js';
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.1",
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.7"
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"]}