与 django 集成的 Sentry 抛出 KeyError 请求

问题描述 投票:0回答:1

我对这个问题感到疯狂,我相信这个问题来自 python 的sentry-sdk,可能与其他一些依赖项结合在一起。我在 Django 4.2 中有一个项目,使用sentry-sdk 2.13.0,每次在哨兵上触发某些东西时,它都会抛出一个

KeyError request
,这意味着如果报告错误,我会收到更多关于
KeyError request
的错误报告(是的,它不是每完成一份报告只需 1 个)。 令我困惑的是,原始错误在哨兵上正确显示,因此我不能说哨兵 SDK 未能报告该问题。此外,每当我手动触发从代码到哨兵的信息/警告报告时,也会发生这种情况。

需要注意的是,这种情况是在将项目依赖项升级后开始发生的,尤其是 Django 到 4.2 后。

我还认为这可能是 context_processor 问题,但请求的 context_processor 位于设置中(请参阅下面的代码)

非常感谢任何帮助或建议。

这是我对哨兵的设置:

import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration

sentry_sdk.init(
    dsn="XXXX",
    integrations=[DjangoIntegration()],
    server_name='XXXX',

    send_default_pii=True
)

这是错误的堆栈跟踪:

KeyError
'request'

django/template/context.py in __getitem__ at line 83

cms/templatetags/cms_tags.py in _get_empty_context at line 636

cms/templatetags/cms_tags.py in get_context at line 829

cms/templatetags/cms_tags.py in render_tag at line 810

classytags/core.py in render at line 142

django/template/base.py in render_annotated at line 966

django/template/base.py in render at line 1005

django/template/loader_tags.py in render at line 54

django/template/base.py in render_annotated at line 966

django/template/base.py in render at line 1005

django/template/base.py in _render at line 167

django/template/base.py in render at line 177

django/template/loader_tags.py in render at line 208

django/template/base.py in render_annotated at line 966

django/template/base.py in render at line 1005

django/template/loader_tags.py in render at line 63

django/template/base.py in render_annotated at line 966

django/template/base.py in render at line 1005

cms/templatetags/cms_tags.py in render_tag at line 426

classytags/core.py in render at line 142

django/template/base.py in render_annotated at line 966

django/template/base.py in render at line 1005

sekizai/templatetags/sekizai_tags.py in render_tag at line 86

classytags/core.py in render at line 142

django/template/base.py in render_annotated at line 966

django/template/base.py in render at line 1005

django/template/base.py in _render at line 167

django/template/loader_tags.py in render at line 157

django/template/base.py in render_annotated at line 966

django/template/base.py in render at line 1005

django/template/base.py in _render at line 167

django/template/loader_tags.py in render at line 157

django/template/base.py in render_annotated at line 966

django/template/base.py in render at line 1005

django/template/base.py in _render at line 167

django/template/base.py in render at line 175

django/template/backends/django.py in render at line 61

django/views/defaults.py in server_error at line 99

django/utils/decorators.py in _wrapper_view at line 134

django/core/handlers/exception.py in handle_uncaught_exception at line 185

django/core/handlers/exception.py in response_for_exception at line 140

django/core/handlers/exception.py in inner at line 57

django/utils/deprecation.py in __call__ at line 134

django/core/handlers/exception.py in inner at line 55

上下文处理器定义:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ...
        ],
        'OPTIONS': {
            'context_processors': [
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.debug',
                'django.template.context_processors.i18n',
                'django.template.context_processors.media',
                'django.template.context_processors.static',
                'django.template.context_processors.tz',
                'django.contrib.messages.context_processors.messages',
                'django.template.context_processors.request',
                'sekizai.context_processors.sekizai',
                'cms.context_processors.cms_settings',
                'website.context_processors.google_analytics'
            ],
            'loaders': [
                'django.template.loaders.filesystem.Loader',
                'django.template.loaders.app_directories.Loader',
                'admin_tools.template_loaders.Loader',
            ],
        },
    }
]

如果我尝试重现触发所有 KeyError 的原始错误而不用哨兵报告,我只会看到原始错误而看不到 KeyError。

我更详细地检查了堆栈跟踪,但我没有弄清楚太多。只涉及cms包。

(我不知道这是否相关,但我正在使用 django-cms 3.11.6)

python django sentry django-cms
1个回答
0
投票

查看堆栈跟踪,看起来有些东西正在覆盖模板上下文。

sentry-sdk
做了一些模板修补,但如果它触及上下文,据我所知,它只是添加跟踪信息

您可以采取哪些措施来缩小问题范围:

  • 尝试将各个依赖项降级到原始版本,以查明具体是哪个依赖项开始导致此问题。如果你有预感这是 Django 本身,你可以从它开始。一旦您知道了,您就可以查看依赖项的更改日志或与
    sentry-sdk
    开发人员共享此信息,以便他们可以查看是否有任何需要调整的内容。这让我想到:
  • 考虑在 sentry-sdk
     存储库
    提出问题
    ——开发人员在那里帮助调试会更容易一些。
© www.soinside.com 2019 - 2024. All rights reserved.