AWS lambda nodejs 在使用 X-RAY 时显示错误
AWS lambda nodejs showing error while using X-RAY
我有以下代码:
var AWSXRay = require('aws-xray-sdk');
var AWS = AWSXRay.captureAWS(require('aws-sdk'));
const client = AWSXRay.captureAWSClient(new AWS.DynamoDB.DocumentClient({region : 'eu-west-1'}));
exports.handler = function(event, context, callback) {
AWSXRay.captureFunc('annotations', function(subsegment){
subsegment.addAnnotation('User', **);
subsegment.addAnnotation('Name', **);
});
var params = {
TableName: "****",
** all params **
};
client.query(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else{
callback(null,data);
}
});
}
执行上述代码时,抛出以下错误:
Response:
{
"errorMessage": "service.customizeRequests is not a function",
"errorType": "TypeError",
"stackTrace": [
"Object.<anonymous> (/var/task/index.js:5:24)",
"Module._compile (module.js:570:32)",
"Object.Module._extensions..js (module.js:579:10)",
"Module.load (module.js:487:32)",
"tryModuleLoad (module.js:446:12)",
"Function.Module._load (module.js:438:3)",
"Module.require (module.js:497:17)",
"require (internal/module.js:20:19)"
]
}
以下是函数的日志:
Function Logs:
START RequestId: Version: $LATEST
module initialization error: TypeError
at Object.captureAWSClient (/var/task/node_modules/aws-xray-sdk-core/lib/patchers/aws_p.js:55:11)
at Object.<anonymous> (/var/task/index.js:5:24)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
END
我该如何解决?
在此处发布短期解决方法以获得更好的可见性。
const ddbClient = AWSXray.captureAWSClient(new AWS.DynamoDB({...}));
const client = new AWS.DynamoDB.DocumentClient({
service: ddbClient
});
client.service = ddbClient;
在这里查看一些推理和讨论https://forums.aws.amazon.com/thread.jspa?messageID=821510󈤆
客户端没有 .service public 变量。也就是说,这个对我有用:
import * as AWS from 'aws-sdk'
import * as AWSXRay from 'aws-xray-sdk'
import { DocumentClient } from 'aws-sdk/clients/dynamodb'
export class DynDBAccess {
private readonly docClient: DocumentClient // = new AWS.DynamoDB.DocumentClient(),
constructor(
private enableAWSX:boolean,
){
if(this.enableAWSX)
{
logger.info('AWSX: enable')
const ddbClient = AWSXRay.captureAWSClient(new AWS.DynamoDB({
////Uncomment below to use serverless-dynamodb-local
//region: 'localhost',
//endpoint: 'http://localhost:8001',
//accessKeyId: 'DEFAULT_ACCESS_KEY', // needed if you don't have aws credentials at all in env
//secretAccessKey: 'DEFAULT_SECRET',
}));
this.docClient = new AWS.DynamoDB.DocumentClient({
service: ddbClient
});
}
...
此处的解决方案对我不起作用。虽然他们消除了错误,但我也没有看到任何 DynamoDB 调用记录在 AWS X-Ray 中。
我没有尝试更新 DocumentClient 来设置检测服务,而是尝试捕获所有内容,这对我有用。
import * as uninstrumentedAWS from 'aws-sdk'
import * as AWSXRay from 'aws-xray-sdk'
const AWS = AWSXRay.captureAWS(uninstrumentedAWS);
const client = new AWS.DynamoDB.DocumentClient();
await client.put({ TableName: "helloTable", Item: { "_id": (new Date()).toISOString() }}).promise();
我有以下代码:
var AWSXRay = require('aws-xray-sdk');
var AWS = AWSXRay.captureAWS(require('aws-sdk'));
const client = AWSXRay.captureAWSClient(new AWS.DynamoDB.DocumentClient({region : 'eu-west-1'}));
exports.handler = function(event, context, callback) {
AWSXRay.captureFunc('annotations', function(subsegment){
subsegment.addAnnotation('User', **);
subsegment.addAnnotation('Name', **);
});
var params = {
TableName: "****",
** all params **
};
client.query(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else{
callback(null,data);
}
});
}
执行上述代码时,抛出以下错误:
Response:
{
"errorMessage": "service.customizeRequests is not a function",
"errorType": "TypeError",
"stackTrace": [
"Object.<anonymous> (/var/task/index.js:5:24)",
"Module._compile (module.js:570:32)",
"Object.Module._extensions..js (module.js:579:10)",
"Module.load (module.js:487:32)",
"tryModuleLoad (module.js:446:12)",
"Function.Module._load (module.js:438:3)",
"Module.require (module.js:497:17)",
"require (internal/module.js:20:19)"
]
}
以下是函数的日志:
Function Logs:
START RequestId: Version: $LATEST
module initialization error: TypeError
at Object.captureAWSClient (/var/task/node_modules/aws-xray-sdk-core/lib/patchers/aws_p.js:55:11)
at Object.<anonymous> (/var/task/index.js:5:24)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
END
我该如何解决?
在此处发布短期解决方法以获得更好的可见性。
const ddbClient = AWSXray.captureAWSClient(new AWS.DynamoDB({...}));
const client = new AWS.DynamoDB.DocumentClient({
service: ddbClient
});
client.service = ddbClient;
在这里查看一些推理和讨论https://forums.aws.amazon.com/thread.jspa?messageID=821510󈤆
客户端没有 .service public 变量。也就是说,这个对我有用:
import * as AWS from 'aws-sdk'
import * as AWSXRay from 'aws-xray-sdk'
import { DocumentClient } from 'aws-sdk/clients/dynamodb'
export class DynDBAccess {
private readonly docClient: DocumentClient // = new AWS.DynamoDB.DocumentClient(),
constructor(
private enableAWSX:boolean,
){
if(this.enableAWSX)
{
logger.info('AWSX: enable')
const ddbClient = AWSXRay.captureAWSClient(new AWS.DynamoDB({
////Uncomment below to use serverless-dynamodb-local
//region: 'localhost',
//endpoint: 'http://localhost:8001',
//accessKeyId: 'DEFAULT_ACCESS_KEY', // needed if you don't have aws credentials at all in env
//secretAccessKey: 'DEFAULT_SECRET',
}));
this.docClient = new AWS.DynamoDB.DocumentClient({
service: ddbClient
});
}
...
此处的解决方案对我不起作用。虽然他们消除了错误,但我也没有看到任何 DynamoDB 调用记录在 AWS X-Ray 中。
我没有尝试更新 DocumentClient 来设置检测服务,而是尝试捕获所有内容,这对我有用。
import * as uninstrumentedAWS from 'aws-sdk'
import * as AWSXRay from 'aws-xray-sdk'
const AWS = AWSXRay.captureAWS(uninstrumentedAWS);
const client = new AWS.DynamoDB.DocumentClient();
await client.put({ TableName: "helloTable", Item: { "_id": (new Date()).toISOString() }}).promise();