如何清除/维护 django-sentry 数据库?

Posted

技术标签:

【中文标题】如何清除/维护 django-sentry 数据库?【英文标题】:How to clear / maintain a django-sentry database? 【发布时间】:2012-06-04 13:25:03 【问题描述】:

我正在使用 django-sentry 来跟踪网站中的错误。我的问题是数据库变得太大了。 'message' 表和 'groupedmessage' 是相关的

有没有办法清除旧条目和特定消息或将哨兵表添加到 django 的管理员?

【问题讨论】:

AFAIK,不建议在生产中将 db 用作 Sentryy 的存储。无论如何,您可以编写一个管理命令来删除旧的已解决消息。 谢谢伊尔瓦。是的,我需要检查我的 Sentry 实施。我终于按照您的建议使用控制台删除了旧消息。 另外,去 irc.freenode.org 询问#sentry 吗?听起来像是一个很标准的问题 【参考方案1】:

使用清理命令。有两个参数可用:

天(默认值:30)- 表示对象必须经过多长时间才能被清理 项目 - 指示要删除的项目,因为您可以在单个哨兵服务器中配置多个项目(默认:全部)

就这样使用它(--config 现在已删除):

# sentry --config=sentry.conf.py cleanup --days 360
sentry cleanup --days 360

OR 带有一个可选的项目参数,它必须是一个整数:

# sentry --config=sentry.conf.py cleanup --days 360 --project 1
sentry cleanup --days 360 --project 1

在发现清理命令之前,我还可以使用 django ORM 手动执行此操作:

#$source bin/activate
#$sentry --config=sentry.conf.py shell
from sentry.models import Event, Alert
Event.objects.all().count()
Alert.objects.all().count()

查看哨兵模型以查询其他对象。从这里您可以在对象上使用 .save()、.remove() 等 django ORM 命令。查看可用的哨兵模型here。如果您需要粒度,即修改对象,这种方法会更灵活一些。清理命令缺少的一件事是告诉您它删除了多少对象,而是将删除的对象转储到屏幕上。

我的清理脚本如下所示,我使用 cron @monthly 运行它:

#!/bin/bash
date
cd /var/web/sentry
source bin/activate
# exec sentry --config=sentry.conf.py cleanup --days 360 #--project 1
# UPDATE: You can now drop the --config param
exec sentry cleanup --days 360

【讨论】:

另外,记得经常运行命令。因为它广泛使用 Django ORM,所以如果数据库很大,第一次运行可能需要非常长时间。 从“前一段时间”开始,应该使用配置路径,而不是特定文件。例如:哨兵 --config=/etc/sentry cleanup --days 360【参考方案2】:

这是您使用 dockerized Sentry 实例执行清理的方式,该实例具有来自 official guide 的默认 docker-compose.yml

$ # Go to a directory containing the docker-compose.yml:
$ cd sentry-config  
$ docker-compose run --rm worker cleanup --days 90

考虑阅读帮助:

$ docker-compose run --rm worker help
$ docker-compose run --rm worker cleanup --help

使用 cron 定期执行清理。运行crontab -e 并在其中添加以下行:

0 3 * * *  cd sentry-config && docker-compose run --rm worker cleanup --days 30

不要忘记通过在 Postgres 容器中运行 VACUUM FULL relation_name; 来回收磁盘空间

$ docker exec -it postgres_container_id /bin/bash
$ psql -U postgres
postgres=# VACUUM FULL public.nodestore_node;    
postgres=# VACUUM FULL  any large relation ;
postgres=# VACUUM FULL public.sentry_eventtag;

您可以在不指定关系的情况下运行VACUUM FULL;,但这会锁定整个数据库。所以我建议一对一地清理关系。 This is how you can find the size of your biggest relations.

【讨论】:

【参考方案3】:

有一个cleanup 命令。不幸的是,它的行为似乎没有记录,但 code comments 信息量很大。

【讨论】:

【参考方案4】:

继续 radtek 的有用答案,如果您只想删除特定错误,我发现的最简单方法是在 Group 对象上调用 delete:

from sentry.models import Group
Group.objects.filter(culprit__contains='[SEARCH TERM]').delete()

其中[SEARCH TERM] 是出现在您要删除的错误消息中的一些文本。

【讨论】:

其实,如果你使用cleanup,它会根据你的配置执行所有的trim操作。

以上是关于如何清除/维护 django-sentry 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

SQL2005自动备份,定期删除的维护计划及自动定期清除日志

路由更改时如何清除useState的数据

如何使用Python请求清除缓存?

如何给tempdb数据库设置SQL代理服务,由SQL自动清除临时表?

清除远程桌面连接记录 服务器批量管理

SQL server 维护计划中 “清除维护任务” 执行报错