Odoo with Sentry

Sentry是什么?

Sentry在自动化运维中十分常用。它是一个实时事件日志记录和汇集的平台。它能够对程序运行中产生的错误信息进行抓取。通过email来告知用户。

在Odoo的运行过程中,可能会有一些程序错误发生。技术人员往往是在用户报告错误后去查阅日志文件,在数以万计的记录中查询具体错误原因既费时又费力,而且无法在错误发生时及时获得错误报告。 Sentry则能将服务器运行过程中的错误在第一时间按要求分类提取并通知运维工程师,大大提高了运维效率。

在github上有一个把Sentry引入Odoo的小模块. Sentry模块链接

现在,让我们来试试Sentry这个自动化的错误抓取框架与odoo的结合吧。


准备工作-Sentry的使用

我们首先来讲讲直接使用Sentry官方提供的DSN来自动化抓取错误。

首先,需要在Sentry官网注册一个使用账户. 注册账号 登录之后,选择右上角的创建新项目 image.png

选择python(可以看到Sentry支持市面上大多数的编程语言及框架) image.png 等待创建后,Sentry会提供一个案例使用方法。 image.png Project 主界面,正在等待捕捉错误事件 image.png 在ipython中敲入页面提供的测试代码。 image.png 回到Project主界面,看到刚才的异常已经被捕捉到了. image.png 点击查看详细信息 image.png 更棒的是,直接会有推送邮件发送到我们的注册邮箱中。直接点击即可查看。 image.png


与Odoo结合(我们使用odoo11作为演示)

刚才我们展示了Sentry的简单使用,下面来看看如何整合Sentry与Odoo以达到监控Odoo日志的操作。

首先,把server-tools从git拉取到本地.因为它是一个odoo模块,我直接把它放在odoo目录的addons下.

然后编写配置文件,sentry模块需要对于的sentry参数才能正常工作,这些配置文件全部写在odoo的默认配置文件odoorc中。下面是官方的示例

[options]
# 这里是刚才sentry中的dsn.添加你自己的即可
sentry_dsn = https://<public_key>:<secret_key>@sentry.example.com/<project id>
# Sentry记录是否确认开启
sentry_enabled = true
# 日志等级设置为warn,即捕捉warning等级以上的日志记录
sentry_logging_level = warn
# 排除在Sentry记录外的单独的日志名称
sentry_exclude_loggers = werkzeug
# 忽略Odoo常见的权限等异常
sentry_ignore_exceptions = odoo.exceptions.AccessDenied,odoo.exceptions.AccessError,odoo.exceptions.MissingError,odoo.exceptions.RedirectWarning,odoo.exceptions.UserError,odoo.exceptions.ValidationError,odoo.exceptions.Warning,odoo.exceptions.except_orm
# 在发送事件到Sentry前的独立处理类
sentry_processors = raven.processors.SanitizePasswordsProcessor,odoo.addons.sentry.logutils.SanitizeOdooCookiesProcessor
# 使用异步传输信息到Sentry上。
sentry_transport = threaded
# 如果设置为true,会吧当前HTTP 请求中的上下文信息一起传递到Sentry中
sentry_include_context = true
sentry_environment = production
sentry_auto_log_stacks = false
# 标注odoo的路径,主要是用来作为运行环境信息传递到Sentry中。
sentry_odoo_dir = /home/odoo/odoo/
[options]
addons_path = enterprise,addons,addons/server-tools
server_wide_modules = web,sentry
db_name = False
admin_passwd = xxx
db_password = False
db_port = False
db_template = template1
db_user = False
email_from = False
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_request = 8192
limit_time_cpu = 60
limit_time_real = 120
limit_time_real_cron = -1
osv_memory_age_limit = 1.0
osv_memory_count_limit = False
proxy_mode = False
reportgz = False
smtp_password = False
smtp_port = 25
smtp_server = localhost
smtp_ssl = False
smtp_user = False
syslog = False
test_commit = False
test_enable = False
test_file = False
test_report_directory = False
translate_modules = ['all']
unaccent = False
without_demo = False
workers = 0
xmlrpc = True
xmlrpc_port = 8069

sentry_dsn = 你的DSN字符串
sentry_enabled = true
sentry_logging_level = warn
sentry_exclude_loggers = werkzeug
sentry_ignore_exceptions = odoo.exceptions.AccessDenied,odoo.exceptions.AccessError,odoo.exceptions.MissingError,odoo.exceptions.RedirectWarning,odoo.exceptions.UserError,odoo.exceptions.ValidationError,odoo.exceptions.Warning,odoo.exceptions.except_orm
sentry_processors = raven.processors.SanitizePasswordsProcessor,odoo.addons.sentry.logutils.SanitizeOdooCookiesProcessor
sentry_transport = threaded
sentry_include_context = true
sentry_environment = production
sentry_auto_log_stacks = false

配置完上面的参数。我们直接使用配置文件启动odoo。因为我使用了odoo11企业版,没有安装phonenumbers这个python包,会有一个warning日志记录,正好用来当做实验。 image.png 查看我们的Sentry。可以看到这个Warning日志已经被捕捉了。 image.png 详细的错误信息 image.png 邮件也有了推送 image.png


  • 但是这个版本的sentry模块有个小bug.只要有一个Odoo安装sentry模块,所有的Odoo数据库日志文件会被Sentry进行跟踪.这对部署多个Odoo服务的服务器来说会导致混乱. 同时只能使用一个固定的DSN也意味着把异常数据限制在了一个Sentry项目中,无法进行有效的分类管理.
  • 另外,由于国内的原因,使用官方Sentry提供的在线服务网速体验十分难受.较好的解决方法是使用Docker自己搭建Sentry本地服务.让我们在下一次的文章中再进行讲解吧.