Lambda函数无法通过dd-trace npm库向Datadog发送自定义指标
问题描述
已按照Datadog官方文档完成Lambda函数的自定义指标配置,安装了Datadog Lambda库与扩展,本地使用AWS SAM CLI测试时,调用tracer.dogstatsd.increment/decrement出现TypeError,提示tracer.dogstatsd为undefined。相关代码、错误信息及template.yml配置如下:
Lambda函数代码
require("dotenv").config(); const tracer = require("dd-trace").init(); let response; exports.lambdaHandler = tracer.wrap( "twilio.DDTraceFunction", async (event, context) => { try { tracer.dogstatsd.increment("example_metric.increment", 1, [ "environment:dev", ]); tracer.dogstatsd.decrement("example_metric.decrement", 1, [ "environment:dev", ]); response = { statusCode: 200, body: JSON.stringify({ message: "hello world", }), }; } catch (err) { console.log("err===============>", err); return { statusCode: 500, body: JSON.stringify("An error occurred"), }; } return response; } );
测试错误信息
➜ sam-app sam local invoke DDTraceFunction Invoking /opt/nodejs/node_modules/datadog-lambda-js/handler.handler (nodejs14.x) arn:aws:lambda:ap-south-1:464622532012:layer:Datadog-Extension:10 is already cached. Skipping download arn:aws:lambda:ap-south-1:464622532012:layer:Datadog-Node14-x:62 is already cached. Skipping download Local image is up-to-date Using local image: samcli/lambda-nodejs:14-x86_64-12d24702a7805bbe910f9c1a2. Mounting /Users/global/Desktop/test/datadog/sam-app/lib-dd-trace as /var/task:ro,delegated, inside runtime container START RequestId: a3b8482b-2d9d-4094-b7d7-dc82c747d66e Version: $LATEST 2023-08-18T04:03:24.243Z a3b8482b-2d9d-4094-b7d7-dc82c747d66e INFO err===============> TypeError: Cannot read property 'incre at step (/opt/nodejs/node_modules/datadog-lambda-js/index.js:44:23)ndex.js:168:62)acer.js:42:29).js:57:14) END RequestId: a3b8482b-2d9d-4094-b7d7-dc82c747d66e REPORT RequestId: a3b8482b-2d9d-4094-b7d7-dc82c747d66e Init Duration: 0.55 ms Duration: 3807.39 ms Billed Duration: 3808 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode": 500, "body": "\"An error occurred\""}%
template.yml配置片段
DDTraceFunction: Type: AWS::Serverless::Function Properties: CodeUri: lib-dd-trace/ Handler: /opt/nodejs/node_modules/datadog-lambda-js/handler.handler Runtime: nodejs14.x Architectures: - x86_64 Environment: Variables: DD_SERVERLESS_LOGS_ENABLED: true DD_TRACE_ENABLED: true DD_LAMBDA_HANDLER: app.lambdaHandler Layers: - arn:aws:lambda:ap-south-1:464622532012:layer:Datadog-Extension:10 - arn:aws:lambda:ap-south-1:464622532012:layer:Datadog-Node14-x:62
注:DD_API_KEY、DD_SITE等环境变量已在template.yml全局配置中设置。
解决方案
当tracer.dogstatsd不可用时,可通过以下两种方式发送计数、速率类自定义指标:
方法1:使用datadog-lambda-js的sendMetric方法
直接引入datadog-lambda-js模块调用sendMetric,该方法会自动通过Datadog扩展发送指标:
const { sendMetric } = require("datadog-lambda-js"); // 在Lambda handler中调用 sendMetric("example_metric.increment", 1, { environment: "dev" }); sendMetric("example_metric.decrement", -1, { environment: "dev" });
- 计数递增传数值1,递减传-1;
- 标签以对象形式传入,会自动转换为Datadog兼容格式。
方法2:使用tracer.metrics对象
如果坚持使用dd-trace的tracer实例,可改用tracer.metrics发送指标:
// 递增计数 tracer.metrics.increment("example_metric.increment", 1, ["environment:dev"]); // 递减计数(通过传入负数实现) tracer.metrics.increment("example_metric.decrement", -1, ["environment:dev"]);
tracer.metrics是dd-trace内置的指标发送器,无需额外配置dogstatsd客户端,在Serverless环境下会自动适配Datadog扩展。
额外注意事项
- 本地SAM测试时,确保Datadog扩展正常运行,部分场景下需手动启动扩展或配置
DD_AGENT_HOST指向本地代理; - 移除代码中手动初始化的
require("dd-trace").init(),datadog-lambda-js已自动完成tracer初始化,重复初始化可能导致冲突。
内容的提问来源于stack exchange,提问作者Babita Bisht
相关产品推荐
相关产品推荐

