如何使用干净的范围将消息转发到哨兵(无运行时信息)
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
我正在使用 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