Sentry 提供付费的软件即服务模式,但它是开源的,所以你可以在你自己的基础设施 上免费托管它。提供与 Sentry 集成的库是 raven(可以在 PyPI 上找到)。如果你还没有使 用过它,想要测试但没有自己的 Sentry 服务器,那么你可以在 Sentry 的预置服务网站上轻 松注册免费试用。一旦你访问了 Sentry 服务器并创建一个新的项目,你将会得到一个叫作 DSN 的字符串,DSN 表示数据源名称(Data Source Name)。这个 DSN 字符串是将你的应 用与 sentry 集成所需要的最少配置设置。它包含协议、证书、服务器位置和你的组织/项目 标识符,其形式如下所示:

'{PROTOCOL}://{PUBLIC_KEY}:{SECRET_KEY}@{HOST}/{PATH}{PROJECT_ID}' 一旦你有了 DSN,那么集成是相当简单的,如下所示:

      from raven import Client

      client = Client('https://<key>:<secret>@app.getsentry.com/<project>')

try: 1/0

      except ZeroDivisionError:

          client.captureException()

Raven 与最流行的 Python 框架(例如 Django、Flask、Celery 和 Pyramid)都有许多集 成,使得集成更加简单。这些集成将自动提供针对给定框架的额外上下文。如果你选择的 web 框架没有专门的支持,那么 raven 包提供了通用的 WSGI 中间件,可以与任何基于 WSGI 的 Web 服务器兼容,如下所示:

      from raven import Client

      from raven.middleware import Sentry

# 注意:application 是之前定义过的某个 WSGI 应用对象 application = Sentry(

        application,

6.5 代码检测与监控 175 Client('https://<key>:<secret>@app.getsentry.com/<project>')

)

另一个值得注意的集成是能够跟踪通过 Python 内置 logging 模块记录的消息。启用

这种支持只需要添加几行代码,如下所示:

from raven.handlers.logging import SentryHandler from raven.conf import setup_logging

client = Client('https://<key>:<secret>@app.getsentry.com/<project>') handler = SentryHandler(client)

setup_logging(handler)

捕获 logging 消息可能会有一些不太明显的警告,因此如果你对这一功能感兴趣, 请务必阅读有关这一主题的官方文档。这应该可以让你避免不愉快的意外。

最后还有一点,就是运行你自己的 Sentry 可以省钱。“天下没有免费的午餐”,你最终 将支付额外的基础设施费用,而 Sentry 只是另一项需要维护的服务。维护=额外工作=成本! 随着应用的增长,异常数量也会增多,所以你不得不在扩展产品的同时扩展 Sentry。幸运 的是,这是一项鲁棒性非常好的项目,但如果负载过高的话则不具有任何价值。此外,让 Sentry 时刻为灾难性故障情况做好准备是一项真正的挑战,这种情况可能每秒发送上千份 崩溃报告。所以你必须判断哪种选项对你来说更便宜,以及你是否拥有足够的资源和才智 来自己完成所有这些事情。当然,如果你的组织中的安全策略拒绝向第三方发送任何数据, 那么就不存在这样的进退两难。如果是这样的话,只需将其托管在你自己的基础设施上。 当然会有成本,但它是完全值得付出的。