如何将消息转发到具有干净范围的 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(无运行时信息)的主要内容,如果未能解决你的问题,请参考以下文章