如何通过X-Ray和CloudWatch查看AWS Lambda的OpenTelemetry追踪与指标
AWS Lambda OpenTelemetry 配置疑问与调试需求
已完成的配置
Lambda层
添加了ARN为:
arn:aws:lambda:<region>:901920570463:layer:aws-otel-nodejs-<architecture>-ver-1-30-1:1
的OpenTelemetry Lambda层。
环境变量
配置了以下环境变量:
AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-handler OTEL_EXPORTER_XRAY_ENABLED=true OTEL_EXPORTER_XRAY_ENDPOINT=xray.us-east-2.amazonaws.com OTEL_LAMBDA_METRICS_ENABLED=true OTEL_METRICS_EXPORTER=awsemf OTEL_TRACES_SAMPLER=always_on
Lambda权限
授予了以下权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "xray:PutTraceSegments", "xray:PutTelemetryRecords" ], "Resource": "*" } ] }
Lambda函数代码
简化版代码:
import { APIGatewayProxyEvent, APIGatewayProxyHandler, APIGatewayProxyResult } from "aws-lambda"; import { trace, context, SpanStatusCode, metrics } from "@opentelemetry/api"; await initializeFunction(); const tracer = trace.getTracer("eventSearchViolation-tracer"); export const handler: APIGatewayProxyHandler = async (event, lambdaContext): Promise<APIGatewayProxyResult> => { const meter = metrics.getMeter("eventSearchViolation-metrics"); const lambdaInvocationCounter = meter.createCounter("lambda_invocation", { description:"Counts the number of times the lambda function is invoked" }); lambdaInvocationCounter.add(1); const parentSpan = tracer.startSpan("lambda_execution"); try { parentSpan.setAttribute("aws.lambda.invocation_id", lambdaContext.awsRequestId); return await context.with(trace.setSpan(context.active(), parentSpan), async () => { const childSpan = tracer.startSpan("process_event"); try { // Event handling logic goes here... return { statusCode: 200, body: JSON.stringify({ message: "Success" }), }; } catch (error) { childSpan.setStatus({ code: SpanStatusCode.ERROR, message: (error as Error).message }); throw error; } finally { childSpan.end(); } }); } finally { parentSpan.end(); } };
日志信息
看到以下日志:
2025-03-05T23:21:04.536Z { "level": "info", "ts": 1741216864.5367267, "caller": "service@v0.115.0/service.go:261", "msg": "Everything is ready. Begin running and processing data." } 2025-03-05T23:21:05.421Z Registering OpenTelemetry 2025-03-05T23:21:05.440Z @opentelemetry/instrumentation-aws-lambda No handler file was able to resolved with one of the known extensions for the file /var/task/src/index
核心问题
- 如何验证Lambda函数是否正确发送了追踪数据和指标?
- 如何在AWS X-Ray中查看追踪数据、在CloudWatch中查看指标?需遵循哪些步骤确保它们可见?
- 当前配置中是否存在可能阻碍追踪/指标发送或显示的问题?
解答与调试指导
一、验证追踪与指标是否发送
1. 检查Lambda执行日志
- 查看是否有
Successfully sent X number of spans to X-Ray或Successfully sent metrics to CloudWatch EMF类的日志,确认数据已导出。 - 如果出现
AccessDenied类错误,说明权限配置不足。
2. 利用AWS CLI验证
- X-Ray追踪:执行
aws xray get-trace-summaries --start-time $(date -d '-1 hour' +%s) --end-time $(date +%s),查看是否有来自目标Lambda的追踪记录。 - CloudWatch指标:执行
aws cloudwatch list-metrics --namespace "aws-otel-metrics" --metric-name "lambda_invocation",确认自定义指标是否存在。
二、查看追踪与指标的步骤
1. AWS X-Ray查看追踪
- 登录AWS控制台,进入X-Ray服务页面。
- 左侧导航栏选择追踪,设置时间范围(如最近1小时)。
- 搜索框输入
service:your-lambda-function-name,筛选目标Lambda的追踪数据。 - 点击具体追踪条目,可查看完整Span链路(包括自定义的
lambda_execution和process_eventSpan)。
2. CloudWatch查看指标
- 进入CloudWatch服务页面,左侧导航栏选择指标。
- 在自定义命名空间下找到
aws-otel-metrics(EMF导出的默认命名空间)。 - 选择对应维度(如
function_name),即可查看lambda_invocation计数器的数值变化。
三、当前配置中的潜在问题
1. Handler路径解析错误
日志中No handler file was able to resolved是关键问题:
- 检查Lambda运行时设置的handler配置是否为
src/index.handler(对应代码中的export const handler)。 - 确保部署包中
src/index.js(或TS编译后的JS文件)存在于/var/task/目录下。
2. 冗余环境变量
OTEL_EXPORTER_XRAY_ENDPOINT无需手动指定,OpenTelemetry会自动根据Lambda所在区域匹配正确端点,手动指定可能导致跨区域问题,建议移除该变量。
3. 指标创建性能问题
每次handler调用都创建lambdaInvocationCounter会导致重复创建,需将初始化移到handler外部:
import { trace, context, SpanStatusCode, metrics } from "@opentelemetry/api"; await initializeFunction(); const tracer = trace.getTracer("eventSearchViolation-tracer"); // 移到外部初始化 const meter = metrics.getMeter("eventSearchViolation-metrics"); const lambdaInvocationCounter = meter.createCounter("lambda_invocation", { description:"Counts the number of times the lambda function is invoked" }); export const handler: APIGatewayProxyHandler = async (event, lambdaContext): Promise<APIGatewayProxyResult> => { lambdaInvocationCounter.add(1); // 后续逻辑不变... };
4. 权限缺失
当前权限仅覆盖X-Ray操作,发送CloudWatch EMF指标需补充日志权限:
{ "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:<region>:<account-id>:log-group:/aws/lambda/<your-function-name>:*" }
内容的提问来源于stack exchange,提问作者Max Bojorquez
相关产品推荐
相关产品推荐

