如何使用干净的范围将消息转发到哨兵(无运行时信息)

How to forward messages to Sentry with a clean scope (no runtime information)

我正在使用 Python 中的 sentry_sdk 将警报消息从 AWS Lambda 函数转发到 Sentry。 问题是,即使我在 capture_message() 之前使用 scope.clear(),我在哨兵中收到的事件也会丰富有关捕获消息的运行时环境的信息(AWS lambda python 环境) - 在这种情况下,这与我转发的实际警报完全无关。

我的代码:

sentry_sdk.init(dsn, environment="name-of-stage")
with sentry_sdk.push_scope() as scope:
  # Unfortunately this does not get rid of lambda specific context information.  
  scope.clear()  
  # here I set relevant information which works just fine.
  scope.set_tag("priority", "high") 
  result = sentry_sdk.capture_message("mymessage")

如果我将 scope 作为参数传递给 capture_message(),行为不会改变。

我手动设置的标签可以正常传输。但我也收到有关 Python 运行时的信息 - 因此 scope.clear() 要么不像我期望的那样运行,要么 capture_message 自己收集额外信息。

谁能解释一下如何只捕获我主动分配给具有 set_tag 和类似功能的范围的信息并抑制其他所有信息?

非常感谢

虽然我没有找到行为的解释,但我能够解决我的问题(尽管它有点老套)。

解决方案是在初始化步骤中使用哨兵 before_send 挂钩,如下所示:

sentry_sdk.init(dsn, environment="test", before_send=cleanup_event)
with sentry_sdk.push_scope() as scope:
  sentry_sdk.capture_message(message, state, scope)
# when using sentry from lambda don't forget to flush otherwise messages can get lost.
sentry_sdk.flush()

然后在 cleanup_event 函数中它变得有点难看。我基本上遍历事件的键并删除我不想显示的键。由于有些键包含对象,而有些键(如“标签”)是一个包含 [key, value] 条目的列表,所以这很麻烦。

KEYS_TO_REMOVE = {
   "platform": [],
   "modules": [],
   "extra": ["sys.argv"],
   "contexts": ["runtime"],
}
TAGS_TO_REMOVE = ["runtime", "runtime.name"]

def cleanup_event(event, hint):
  for (k, v) in KEYS_TO_REMOVE.items():
    with suppress(KeyError):
        if v:
            for i in v:
                del event[k][i]
        else:
            del event[k]
  for t in event["tags"]:
    if t[0] in TAGS_TO_REMOVE:
        event["tags"].remove(t)
  return event