Lambda AWS X-Ray. Python SDK - деактивировать локально

У меня есть приложение Flask, работающее как функция AWS Lambda, развернутая с Zappa, и я хотел бы активировать X-Ray, чтобы получить дополнительную информацию о различных функциях.

Активировать X-Ray с помощью Zappa было достаточно просто - для этого достаточно добавить эту строку в zappa-settings.json:

"xray_tracing": true

Кроме того, я установил AWS X-Ray Python SDK и добавил несколько декораторов в некоторые функции, например:

@xray_recorder.capture()

Когда я развертываю это как функцию Lambda, все работает хорошо. Проблема заключается в использовании системы локально, как при запуске тестов, так и при запуске Flask на локальном сервере, а не в качестве лямбда-функции.

Когда я использую любую из функций, оформленных либо в тесте, либо через локальный сервер, возникает следующее исключение:

aws_xray_sdk.core.exceptions.exceptions.SegmentNotFoundException: cannot find the current segment/subsegment, please make sure you have a segment open

Что, конечно, имеет смысл, потому что AWS Lambda занимается созданием сегментов.

Есть ли хорошие способы отключить локальный захват? Это было бы полезно, например, для локального запуска модульных тестов функций, которые я хотел бы наблюдать в X-Ray.


person Thomas D. Frøysa    schedule 13.11.2018    source источник


Ответы (1)


Одним из требований к функциям этого SDK является наличие глобального флага «disabled», чтобы все перестало работать https://github.com/aws/aws-xray-sdk-python/issues/26.

Однако это все еще зависит от того, против чего вы тестируете. Хорошая практика - проверить, что на самом деле будет запускаться на Lambda. Вы можете установить некоторые переменные среды, чтобы SDK думал, что он работает на Lambda.

Вы можете видеть, что SDK ищет две переменные env https://github.com/aws/aws-xray-sdk-python/blob/master/aws_xray_sdk/core/lambda_launcher.py. Один LAMBDA_TASK_ROOT установлен в true, поэтому он знает, что нужно переключиться в лямбда-режим. Другой - _X_AMZN_TRACE_ID, который содержит контекст трассировки, обычно передаваемый лямбда-контейнером.

Если вы просто хотите протестировать код, отличный от XRay, вы можете установить AWS_XRAY_CONTEXT_MISSING в LOG_ERROR, чтобы SDK не жаловался на отсутствие контекста и просто отказывался от захвата обернутых функций. Это будет запускать гораздо меньше кода, чем имитировать поведение лямбда. В идеале было бы лучше, если бы инструмент локального лямбда-тестирования был дружелюбным к рентгеновским лучам. Вы используете https://github.com/awslabs/aws-sam-cli? ? Для этой функции уже существует открытая проблема https://github.com/awslabs/aws-sam-cli/issues/217

person haotian465    schedule 19.11.2018