Ошибка переменной 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, чтобы убедиться, что он не закодирован или что-то еще, а выход журнала соответствует тому, что показано в ссылке
Ответы
Ответ 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
.