You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

核心问题

  1. 如何验证Lambda函数是否正确发送了追踪数据和指标?
  2. 如何在AWS X-Ray中查看追踪数据、在CloudWatch中查看指标?需遵循哪些步骤确保它们可见?
  3. 当前配置中是否存在可能阻碍追踪/指标发送或显示的问题?

解答与调试指导

一、验证追踪与指标是否发送

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查看追踪

  1. 登录AWS控制台,进入X-Ray服务页面。
  2. 左侧导航栏选择追踪,设置时间范围(如最近1小时)。
  3. 搜索框输入service:your-lambda-function-name,筛选目标Lambda的追踪数据。
  4. 点击具体追踪条目,可查看完整Span链路(包括自定义的lambda_execution和process_event Span)。

2. CloudWatch查看指标

  1. 进入CloudWatch服务页面,左侧导航栏选择指标。
  2. 在自定义命名空间下找到aws-otel-metrics(EMF导出的默认命名空间)。
  3. 选择对应维度(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:29:57