Ошибка: не удалось получить текущий подсегмент / сегмент из контекста при использовании AWS X-ray в Lambda с node.js

Я пытаюсь внедрить AWS X-ray в свой текущий проект (используя Node.js и Serverless framework). Я пытаюсь подключить рентгеновский снимок к одной из своих лямбда-функций, у меня проблема

Error: Failed to get the current sub/segment from the context.
    at Object.contextMissingRuntimeError [as contextMissing] (/.../node_modules/aws-xray-sdk-core/lib/context_utils.js:21:15)
    at Object.getSegment (/.../node_modules/aws-xray-sdk-core/lib/context_utils.js:92:45)
    at Object.resolveSegment (/.../node_modules/aws-xray-sdk-core/lib/context_utils.js:73:19).....

код ниже:

import { DynamoDB } from "aws-sdk";
import AWSXRay from 'aws-xray-sdk';

export const handler = async (event, context, callback) => {

    const dynamo = new DynamoDB.DocumentClient({
        service: new DynamoDB({ region })
    });

    AWSXRay.captureAWSClient(dynamo.service);

    try {
        // call dynamoDB function 
    } catch(err) {
        //...
    }
}

для этой проблемы я использую решение из https://forums.aws.amazon.com/thread.jspa?messageID=821510󈤆

другое решение, которое я пробовал, взято из https://forums.aws.amazon.com/thread.jspa?messageID=829923󊧣

код похож на

import AWSXRay from 'aws-xray-sdk';
const AWS = AWSXRay.captureAWS(require('aws-sdk'));

export const handler = async (event, context, callback) => {

    const dynamo = new AWS.DynamoDB.DocumentClient({region});

    //....
}

Все еще не работает...

Благодарим за любую помощь.


person pyy    schedule 29.11.2018    source источник
comment
Когда вы получаете эту ошибку? При локальном тестировании? Как говорится в сообщении об ошибке, в вашем объекте контекста (ваш второй параметр), похоже, отсутствуют нужные сегменты. X-Ray хочет использовать их, чтобы вы могли отслеживать, куда идет вызов, сколько времени занимает каждое действие и т. Д. Поэтому для этого ему нужен действительный контекст. (Я столкнулся с той же проблемой при запуске локального теста с поддельным объектом контекста.)   -  person Hieron    schedule 21.03.2019
comment
@Hieron Спасибо за ваш ответ. На самом деле я использую бессерверную структуру, и я использовал плагин serverless-offline, чтобы помочь мне работать локально. контекст фальшивый или нет. Я использую решение, чтобы включить конфигурацию в функции Lambda.   -  person pyy    schedule 21.03.2019
comment
Итак, вы работаете локально, поэтому, вероятно, проблема в том, что контекст не совсем такой, как при фактической работе на AWS. Это также означает, что проблема, вероятно, не в AWS / Lambda, а в плагине serverless-offline. Может быть, спросите их, на их странице github?   -  person Hieron    schedule 21.03.2019
comment
@pyy, какое было решение?   -  person Victor P    schedule 01.10.2019
comment
@VictorP На данный момент я использую одну функцию Lambda, включив трассировку рентгеновских лучей либо в консоли управления, либо в шаблоне облачной информации. Так что на данный момент рентгеновский снимок может отследить лямбду. Позже я иногда потрачу время, чтобы попробовать X-ray с другими сервисами AWS.   -  person pyy    schedule 01.10.2019


Ответы (2)


Как вы упомянули, это произошло из-за того, что вы работаете локально (с использованием плагина serverless-offline), а плагин serverless-offline не предоставляет допустимого контекста XRAY.

Один из возможных способов передать эту ошибку и по-прежнему иметь возможность вызывать свою функцию локально - это установить AWS_XRAY_CONTEXT_MISSING переменной среды на LOG_ERROR вместо RUNTIME_ERROR (по умолчанию).

Что-то вроде < / а>:

serverless invoke local -f functionName -e AWS_XRAY_CONTEXT_MISSING=LOG_ERROR

Я не тестировал это на бессерверной платформе, но это сработало, когда возникла та же ошибка при вызове локально усилить функцию:

amplify function invoke <function-name>
person r.pedrosa    schedule 22.10.2019

Я тоже столкнулся с этой ошибкой. Чтобы исправить это, я отключил XRay при локальном запуске. XRay не нужен при локальном запуске, потому что в это время я могу просто настроить операторы журнала отладки.

Вот как будет выглядеть код

let AWS = require('aws-sdk');
if (!process.env.IS_OFFLINE) {
    const AWSXRay = require('aws-xray-sdk');
    AWS = AWSXRay.captureAWS(require('aws-sdk'));
}

Если вам не нравится этот подход, вы можете настроить contextStrategy, чтобы не выводить ошибку при отсутствии контекста.

Ссылка здесь

AWSXRay.setContextMissingStrategy("LOG_ERROR");
person Tim Nguyen    schedule 01.04.2021