Подтвердить что ты не робот

Ошибка переменной GAE REQUEST_LOG_ID env

Используя приведенный ниже код, я отправляю электронное письмо с сообщением об ошибке. Я пытаюсь включить ссылку в журналы Cloud Console в письме, но идентификатор запроса кажется неправильным примерно в 30% случаев.

Если я нахожу запрос с неправильным идентификатором, он всегда почти идеально подходит, за исключением трех последних символов: 0 (в консоли Stackdriver) вместо 101 (возвращается из переменной env), всегда одна и та же замена - Это ошибка с облачной консолью или я пытаюсь использовать эти идентификаторы неправильно?

Код (урезанная версия):

class ErrorAlertMiddleware(object):
    def process_response(self, request, response):
        if response.status_code == 500:
            logger.info(os.environ.get('REQUEST_LOG_ID'))

            msg = 'Link to logs: https://console.cloud.google.com/logs/viewer?' + '&'.join((
                'project=%s' % MY_APP_ID,
                'expandAll=true',
                'filters=request_id:%s' % os.environ.get('REQUEST_LOG_ID'),
                'resource=gae_app',
            ))

            # this is a utility func that simply sends email
            sendemail(ERROR_RECIPIENT, msg)
        return response

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

4b9b3361

Ответ 1

Вместо os.environ.get('REQUEST_LOG_ID') используйте request.environ.get('REQUEST_LOG_ID').

Возможно, что os.environ['REQUEST_LOG_ID'] изменяется между началом текущего запроса и временем его доступа, но request.environ['REQUEST_LOG_ID'] не следует изменять после инициализации запроса. Состояние docs, если один идентификатор запроса больше другого, чем тот, который произошел позже другого. Это означает, что requestID в консоли Stackdriver был создан до того, который был указан в вашей электронной почте. Это заставляет меня думать, что где-то вдоль линии, os.environ['REQUEST_LOG_ID'] обновляется с '....000' до '....101', прежде чем вы получите к нему доступ, а копия в request.environ['REQUEST_LOG_ID'] останется без изменений.

Для получения дополнительной информации о request.environ, посмотрите исходный код в google.appengine.runtime.request_environment.py. Я на самом деле не нашел документацию, но этот код привел меня к мысли, что os.environ не так безопасен для доступа, как request.environ.