如何清空/维护Django-Sentry数据库?

32

我正在使用django-sentry来跟踪网站上的错误。我的问题是数据库已经变得过于庞大。'message'表和'groupedmessage'表是相关的。

有没有办法清除旧条目和特定的消息,或将sentry表添加到django的管理界面中呢?


1
据我所知,在生产环境中不建议使用db作为Sentryy的存储。无论如何,您可以编写一个管理命令来删除旧的已解决消息。 - ilvar
谢谢你,ilvar。是的,我需要检查一下我的Sentry实现。最终我按照你的建议使用控制台删除了旧消息。 - equalium
1
另外,在irc.freenode.org上问#sentry吧?听起来像是一个非常标准的问题。 - Lacrymology
4个回答

51

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

  • days (默认值:30) - 表示要清除的对象必须多久以前创建的
  • project - 表示要从中删除的项目,因为您可以在单个Sentry服务器中配置多个项目(默认值:全部)

使用方法如下(--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手动完成这项任务,直到发现了cleanup命令:

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

查看 Sentry 模型以查询其他对象。从这里,您可以对这些对象使用 Django ORM 命令,如 .save()、.remove() 等。在此处查看可用的 Sentry 模型。如果您需要更精细的对象修改,则此方法比较灵活。清理命令缺少一个告诉您删除了多少个对象的功能,它只是将已删除的对象转储到屏幕上。

我的清理脚本类似于以下内容,并使用 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

3
还要记得经常运行该命令。由于它广泛使用了 Django ORM,如果数据库很大,第一次运行可能需要非常长的时间。 - C2H5OH
从“一段时间以前”开始,应该使用配置路径,而不是特定的文件。例如:sentry --config=/etc/sentry cleanup --days 360 - markdwhite

15

以下是使用默认的docker-compose.yml官方指南清理使用Docker化的Sentry实例的步骤:

$ # 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,并在其中添加以下行:

->

使用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;,但这将锁定整个数据库。因此,我建议逐个清理关系。以下是如何查找最大关系的大小。


7

有一个清理命令。不幸的是,它的行为似乎没有文档记录,但代码注释非常详细。


2

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

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

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


实际上,如果您使用清理功能,它会根据您的配置执行所有修剪操作。 - radtek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接