Python GAE请求\u日志\u ID环境变量错误

Python GAE请求\u日志\u ID环境变量错误,python,google-app-engine,logging,google-cloud-platform,Python,Google App Engine,Logging,Google Cloud Platform,使用下面的代码,我发送了一封关于错误的电子邮件。我试图在电子邮件中包含指向云控制台日志的链接,但请求ID似乎有30%的时间是错误的 如果我发现请求的ID错误,它总是几乎完美匹配,除了最后三个字符是0(在Stackdriver控制台中)而不是101(从env变量返回),总是相同的替换-这是云控制台的错误还是我试图使用这些ID错误 代码(精简版): 注意:我还记录了请求日志ID,以确保它没有被编码或其他内容,并且日志输出与链接中显示的内容相匹配,而不是os.environ.get('REQUEST\

使用下面的代码,我发送了一封关于错误的电子邮件。我试图在电子邮件中包含指向云控制台日志的链接,但请求ID似乎有30%的时间是错误的

如果我发现请求的ID错误,它总是几乎完美匹配,除了最后三个字符是
0
(在Stackdriver控制台中)而不是
101
(从env变量返回),总是相同的替换-这是云控制台的错误还是我试图使用这些ID错误

代码(精简版):


注意:我还记录了请求日志ID,以确保它没有被编码或其他内容,并且日志输出与链接中显示的内容相匹配,而不是
os.environ.get('REQUEST\u LOG\u ID')
,使用
REQUEST.environ.get('REQUEST\u LOG\u ID')

在当前请求的开始和您访问它的时间之间,
os.environ['REQUEST\u LOG\u ID']
可能会发生变化,但请求初始化后,
REQUEST.environ['REQUEST\u LOG\u ID']
不应发生变化。如果一个请求ID大于另一个,则其发生时间晚于另一个。这意味着Stackdriver控制台中的requestID是在电子邮件链接中的requestID之前生成的。这让我想到,在访问之前,
os.environ['REQUEST\u LOG\u ID']
正在从
'..000'
更新到
'..101'
,而
REQUEST.environ['REQUEST\u LOG\u ID']
中的副本应该保持不变


有关
request.environ
的更多信息,请查看
google.appengine.runtime.request\u environment.py
中的源代码。我还没有找到关于这方面的文档,但这段代码让我相信,
os.environ
的访问不如
请求那样安全。environ

值得一提的是,我看到了同样的问题,所以我怀疑谷歌的基础设施中存在漏洞。我对这个问题投了赞成票,并加了一笔赏金,希望能得到答案。我还通过我的付费谷歌支持帐户抱怨,让我们看看这是否会发生:-)试试这个字段:
advancedFilter=protoPayload.requestId
(不100%确定如何准确地制定整个请求,还需要检查…).Hm,有趣的是
filter=request\u id:%s
实际上映射到
operation.id
,不像我假设的那样(通过转换为高级过滤器确认)。然而,我找不到任何两种情况不同的例子。我所做的只是
re.sub('101$,'0',os.environ.get('REQUEST\u LOG\u ID'))
,它已经完成了任务
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