【问题标题】:How do I test Sentry tags that are sent from a Django app exception?如何测试从 Django 应用程序异常发送的 Sentry 标签?
【发布时间】:2020-09-01 15:09:54
【问题描述】:

我们的 Django 应用程序配置为将所有 logger.errors 和 logger.exceptions 发送到 Sentry。我正在尝试实现一些东西,在 some 情况下,我可以在异常发生之前为有问题的事件分配一个自定义标记,并适当地标记该事件。由于我在不止一个地方使用它,所以我想做一个这样的函数:

from sentry_sdk import push_scope

def set_sentry_custom_tag(key: str, value: str) -> None:
    with push_scope() as scope:
        scope.set_tag(key, value)
        logger.info(f'Set sentry custom tag -> {key}:{value}')

...并像这样使用它:

try:
    check_widget_factory()
except Exception as e:
    set_sentry_custom_tag('my-tag-key', 'my-tag-value')
    logger.exception(f'Widget check failed: {e}')

认为这会起作用,但不确定push_scope 是否需要直接在发生异常的方法中——我对Scope 的工作原理有点模糊Sentry,如果它在传递给将事件发送到 Sentry 的记录器处理之前的即时帧中的某个上下文中。

我正在尝试编写一些测试以确保正确设置此标记并在引发异常时附加到事件,但就如何获取本地范围并验证标记是否为空而言放。我可以修改函数以返回范围,然后像那样检查它,但理想情况下,这不是它在生产中的行为方式。我需要一些类似的东西:

def test_set_sentry_custom_tag(self):
    set_sentry_custom_tag(key='test-key', value='test-value')
    scope = find_the_current_scope_somehow()
    self.assertIn('test-key', scope._tags.keys())
    self.assertEqual(scope._tags['test-key'], 'test-value')

有人在 Sentry 中针对此类案例进行了一些自定义标记,并且可以分享测试是如何完成的吗?

【问题讨论】:

    标签: python django testing sentry


    【解决方案1】:

    坦率地说,我相信您的最后一个示例并不是一个特别有用的单元测试。我宁愿模拟check_widget_factory() 来抛出异常并断言事件已发送通过。为此,请考虑以下事项:

    events = []
    init(transport=events.append)
    # <mock check_widget_factory() here>
    
    # call your try-except code here
    
    assert events[0]['tags']['my-tag-key'] == 'my-tag-value'
    

    这并不比检查设置标签是否真的设置标签慢很多,并且不依赖于 SDK 中的私有 API。

    【讨论】:

      猜你喜欢
      • 2016-03-18
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多