Обработка исключений AWS xray + lambda, как я могу вернуть сообщение об ошибке, и моя трассировка рентгеновских лучей помечена как ошибка - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть AWS Lambda, написанная на Python 3.6 с использованием последней стабильной версии aws_xray_sdk и развернутая как лямбда-функция, а не как конечная точка шлюза API.

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

Есть ли способ пометить мой текущий подсегмент aws xray как ошибку? Я обнаружил, что у объекта subsegment есть метод apply_status_code, однако, похоже, это не делает то, на что я надеялся.

def unhandled_exception(e, event: LambdaDict, context: LambdaContext):
    logging.exception(e)
    logging.error(f"""Event: {str(event)}
Context: {str(dict(context))}""")
    sub_segment = xray_recorder.current_subsegment()
    sub_segment.apply_status_code(500)
    return {
            'sms_sent': False,
            'error': f"{type(e).__name__}:{e}",
        }

изменить 1: Я смог получить по крайней мере свои собственные подсегменты, сообщающие с 400 и статусом ошибки в следах xray со следующим кодом.

...
# when an error state exists
if sub_segment:
    sub_segment.add_error_flag()
    sub_segment.apply_status_code(400)
...
...
# directly before the return
try:
    xray_recorder.end_subsegment()
    xray_recorder.end_segment()
except Exception as xray_e:
    logging.warning(xray_e)

return response

aws console xray trace

Однако это не то, что используется для генерации карты сервиса xray. aws console xray service map

Я начинаю думать, что должен был только что сделать свои API-интерфейсы для отдыха лямбд, поскольку по крайней мере они возвращали бы коды состояния HTTP, которые я мог отследить.

1 Ответ

1 голос
/ 17 апреля 2019

Узлы на карте сервиса соответствуют сегментам, поэтому для того, чтобы вы могли видеть отраженные ошибки или ошибки, вам нужно добавить флаг ошибки к сегменту.К сожалению, сегмент Lambda :: Function создается Lambda и не может быть изменен, поэтому, если вы обрабатываете исключение самостоятельно, нет способа установить флаг ошибки сегмента Lambda :: Function.

Однако вы можете заставить узел im-xmpp-prod отображать ошибки или сбои в карте сервиса, сопоставляя код состояния, возвращаемый в полезной нагрузке Lambda, с ошибкой сегмента или ошибкой в ​​коде вашего приложения.Вы можете сделать это (предполагая, что это также Python), вызвав segment = xray_recorder.current_segment(), чтобы получить текущий сегмент, а затем вызвав segment.add_error_flag() или segment.add_fault_flag(), чтобы установить для ошибки сегмента или атрибута сбоя значение true.

...