如何将消息转发到具有干净范围的 Sentry(无运行时信息)

Posted

技术标签:

【中文标题】如何将消息转发到具有干净范围的 Sentry(无运行时信息)【英文标题】:How to forward messages to Sentry with a clean scope (no runtime information) 【发布时间】:2021-10-30 06:02:06 【问题描述】:

我正在使用 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 和类似功能的范围的信息并隐藏其他所有内容吗?

非常感谢

【问题讨论】:

【参考方案1】:

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

解决方案是在初始化步骤中使用哨兵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 保存对象,而一些(如“标签”)是一个包含 [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

【讨论】:

以上是关于如何将消息转发到具有干净范围的 Sentry(无运行时信息)的主要内容,如果未能解决你的问题,请参考以下文章

如何将消息从另一个用户的频道正确转发到群组?

Django 发生错误时如何将用户信息添加到 Sentry 的报告中?

如何将 GCP Pubsub 订阅的消息转发到另一个主题?

Sentry--错误日志收集

Celery 任务未捕获的异常未发送到 Sentry

如何防止哨兵捕获某些未捕获的异常和记录消息的事件?