跳转到主要内容

Django中间件,用于记录慢请求的堆栈跟踪到Sentry。

项目描述

PyPI version badge Tests status

概述

Dogslow是一个Django watchdog中间件,用于记录慢请求的堆栈跟踪。Dogslow-sentry需要Python 3.7+,Django 2.2+。

它最初是Bitbucket内部的一个内部项目,旨在帮助追踪操作问题。

2021年,创建了dogslow-sentry分支,以便在报告中添加Sentry特定信息,如完整堆栈跟踪、请求信息、问题分组指纹、面包屑等。

安装

安装dogslow-sentry

$ pip install dogslow-sentry

然后将dogslow_sentry.WatchdogMiddleware添加到您的Django设置文件中

MIDDLEWARE = [
    'dogslow_sentry.WatchdogMiddleware',
    ...
]

为了获得最佳效果,请将其设置为运行的第一批中间件之一。

配置

自然地,dogslow-sentry期望有一个适用于Django的Sentry配置

您可以在您的 settings.py 文件中使用以下配置来调整 watchdog。

# Watchdog is enabled by default, to temporarily disable, set to False:
DOGSLOW = True

# Log requests taking longer than 25 seconds:
DOGSLOW_TIMER = 25

# Enable logging to Sentry
DOGSLOW_SENTRY = True

# Also log slow request tracebacks to Python logger
DOGSLOW_LOGGER = 'dogslow_sentry'
DOGSLOW_LOG_LEVEL = 'WARNING'

# Tuple of url pattern names that should not be monitored:
# (defaults to none -- everything monitored)
DOGSLOW_IGNORE_URLS = ('some_view', 'other_view')

使用方法

每个进入的 HTTP 请求在 watchdog 中都会有一个 25 秒的超时时间。如果请求没有在规定时间内返回,watchdog 就会激活,并查看请求线程的堆栈,并将回溯信息(包括所有局部堆栈变量 - Django 风格)写入日志文件。

注意,dogslow 只会查看线程的堆栈。它不会中断请求或以任何方式影响请求。因此,在生产环境中使用 dogslow 是安全的。

变更日志

2.0.1 (2023-12-08)

  • 使用类似于 ISO 8601 的 YYYY-MM-DD 日期格式进行电子邮件/文件日志。

  • 在 Python 3.12 上修复了弃用警告(utcnow 函数)。

  • 启用了 Python 3.11、3.12 和 Django 5.0、4.2、4.1 的 CI 测试。

2.0.0 (2021-12-13)

  • 为 CI 配置了 GitHub Actions。

  • 启用了 Python 3.10 和 Django 4.0 的测试。

  • 修复了使用 Python 3.10 时的弃用警告。

2.0.0b1 (2021-07-19)

  • dogslow-sentry 分支的初始预发布版。

  • 改进了 Sentry 集成。

  • 放弃了 Python 2.7 支持,现在需要 Python 3.7+、Django 2.2+。

  • 许多小的调整。使用 Black 重构了代码。

1.2 (2018-01-04)

  • 上游 dogslow 包的最后发布版。

注意事项

Dogslow 使用多线程。它有一个单独的后台线程来处理 watchdog 超时和捕获回溯,这样原始的请求线程就不会被打断。这带来了一些后果。

多线程和 GIL

在 CPython 中,GIL(全局解释器锁)阻止多个线程同时执行 Python 代码。只有当线程显式释放对 GIL 的锁时,第二个线程才能运行。

释放 GIL 是在 Python 程序在解释器外进行阻塞调用时自动完成的,例如进行 IO。

对于 dogslow 来说,这意味着它只能可靠地拦截那些因为执行 IO、调用 sleep 或忙等待获取锁而变慢的请求。

在大多数情况下,这是没有问题的。Django 请求变慢的一个重要原因是昂贵的数据库查询。由于这是 IO,dogslow 可以很好地拦截这些请求。CPython 的 GIL 成为问题的情况是,请求的线程在 Python 代码中遇到无限循环(或合法但非常昂贵且执行时间很长的 Python 代码),永远不会释放 GIL。即使 dogslow 的 watchdog 计时器线程变成可运行的,也无法记录堆栈。

协程和 Greenlets

Dogslow 旨在用于同步工作进程配置。一个使用专用线程(或单线程、专用工作进程)来处理请求的 Web 服务器。Django 内置的 wsgi 服务器以及默认同步工作进程模式的 Gunicorn 都是这样做的。

在运行“协程框架”时,其中多个请求由一个线程并发处理,回溯可能会变得没有意义。

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于 安装包 的信息。

源分布

dogslow-sentry-2.0.1.tar.gz (20.8 kB 查看哈希值)

上传时间:

构建分布

dogslow_sentry-2.0.1-py3-none-any.whl (18.8 kB 查看哈希值)

上传时间 Python 3

支持