初始化sentry sdk时必须正确设置environment和release,否则错误无法归类;需按环境显式传入字符串值,release应绑定git哈希或语义化版本;django/flask启动时初始化最稳妥;异步框架需启用对应integration;自定义上下文优先用set_tag/set_extra;过滤异常统一用before_send回调。

初始化Sentry SDK时必须设置正确的环境和release
不填或填错 environment 和 release 会导致错误无法正确归类,排查时找不到对应部署版本。Sentry 默认把所有事件都打到 production 环境,但如果你有 staging、preprod 等环境,必须显式传入。
-
environment建议用字符串如"staging"或"production",不要用布尔值或数字 -
release应该绑定实际构建版本,比如 Git commit hash(os.getenv("GIT_COMMIT"))或语义化版本("1.2.0"),不能写死成"latest" - Django/Flask 启动时初始化最稳妥,避免在异步任务或子进程中重复 init
捕获未处理异常只需 init,但需注意异步框架的兼容性
Sentry 的 init() 默认会自动捕获主线程未处理异常(如 sys.excepthook),但在 FastAPI、Celery、asyncio 等场景下容易漏报——因为异常可能发生在独立事件循环或 worker 进程中。
- Celery 任务需额外配置:在
celery.conf.task_track_started = True基础上,用sentry_sdk.init(..., integrations=[CeleryIntegration()]) - FastAPI 的后台任务(
BackgroundTasks)或async def路由中抛出的异常,需确保 Sentry 使用的是支持 asyncio 的 SDK 版本(≥1.30.0),并启用AsyncioIntegration() - 不要手动调用
sentry_sdk.capture_exception()来“补救”未捕获异常,这会绕过上下文采集(如 request、user、tags)
自定义上下文要优先用 set_tag 和 set_extra,别滥用 scope
给错误添加业务维度信息(如用户 ID、订单号、请求路径)是快速定位的关键,但直接操作 sentry_sdk.Scope 容易出错:作用域生命周期难控、嵌套时覆盖逻辑不直观。
- 全局静态标签用
sentry_sdk.set_tag("service", "payment-api") - 请求级动态数据(如
user_id)应在中间件里用sentry_sdk.set_user({"id": user_id})或set_tag("order_id", order_id) -
set_extra()适合放结构化调试数据(如{"payload": {...}}),但别塞大对象或敏感字段(密码、token) - 避免在函数内反复调用
with sentry_sdk.configure_scope() as scope:,除非你明确需要短生命周期隔离
忽略特定异常类型或 URL 要用 before_send,不是 ignore_errors
ignore_errors 参数只匹配异常类名(如 [KeyboardInterrupt]),对带参数的异常(如 HTTPException(status_code=404))无效;且无法基于 request path、user agent 等运行时信息过滤。
- 统一用
before_send回调:返回None表示丢弃,返回 event dict 表示上报 - 例如过滤健康检查接口:
if event.get("request", {}).get("url", "").endswith("/health"): return None - 忽略已知客户端错误(4xx)可结合 status code 判断,但注意:Sentry 默认不采集 4xx,除非你主动调用
capture_exception - 别在
before_send里做耗时操作(如 DB 查询、HTTP 请求),它运行在异常捕获关键路径上
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











