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&#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();