在新的sendry-python SDK中将Extra的字典传递给captureException相当于什么?

时间:2018-12-05 14:44:49

标签: python flask sentry

将附加内容传递给用于catch_exception和capture_message的新的sendry-python SDK方法的最佳方法是什么?

以前,我会: sentry_id = sentry.captureException(extra=extra)

基于docs和此github问题(https://github.com/getsentry/sentry-python/issues/113),它看起来像以下选项之一是可比的,但我想不出办法。

即将关闭 capture_exception ...

except Exception as e:
    sentry_id = capture_exception(e, extra=extra) # Error

...但是不允许再加上第二个参数:(

使用 python日志记录集成非常接近...

except Exception as e:
    sentry_id = logging.error(e, exc_info=True, extra=extra)

...但不返回哨兵ID:(

使用 python日志记录集成和capture_exception 都已关闭...

except Exception as e:
    logging.error(e, exc_info=True, extra=extra)
    sentry_id = capture_exception(e)

...但是在哨兵中导致两个单独的错误条目:(

capture_exception与push_scope 配合使用已结束...

except Exception as e:
    with push_scope() as scope:
        scope.set_extra(extra) # Error
        sentry_id = capture_exception(e)

...但是不接受字典:(

解决方案是否使用最后一种方法,并带有一个辅助函数,该函数将多余的字典分解为许多scope.set_extra(key, val)调用?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

except Exception as e:
    with push_scope() as scope:
        for k, v in extra.items():
            scope.set_extra(k, v)
        sentry_id = capture_exception(e)

但是,我认为您在错误的时间点设置了extra。理想情况下,您应该立即设置额外的上下文数据,并将其与当前正在执行的代码相关联。将作用域仅推为调用capture_exception表示对set_extra的调用的结构方式存在问题。

代替此:

logger.error("Event via logging", extra={"foo": 42})

try:
    1/0
except Exception:
    with push_scope() as scope:
        scope.set_extra("foo", 42)
        capture_exception()

执行以下操作:

with push_scope() as scope:
    scope.set_extra("foo", 42)
    logger.error("Event via logging")

    try:
        1/0
    except Exception:
        capture_exception()