- Sentry:is a realtime event logging and aggregation platform. At its core it specializes in monitoring errors and extracting all the information needed to do a proper post-mortem without any of the hassle of the standard user feedback loop.
Sentry在自动化运维中十分常用。它是一个实时事件日志记录和汇集的平台。它能够对程序运行中产生的错误信息进行抓取。通过email来告知用户。 - 在Odoo的实施生产中。往往会有一系列的错误发生。每当这个时候。技术人员通常都需要查阅日志文件。小型公司很少有专门的运维人员对每天的日志记录进行分析统计。面对没有进行过分类的原始日志文件,在数以万计记录中查询具体错误原因,既费时又费力。此时,多么想有一个能够在运行出错时自动通知的功能。
在github上有一个把Sentry引入Odoo的小模块
Sentry模块链接
现在,让我们来试试Sentry这个自动化的错误抓取框架与odoo的结合吧。
准备工作-Sentry的使用
我们首先来讲讲直接使用Sentry官方提供的DSN来自动化抓取错误。
-
首先,需要在Sentry官网注册一个使用账户.
-
登录之后,选择右上角的创建新项目
-
选择python(可以看到Sentry支持市面上大多数的编程语言及框架)
-
等待创建后,Sentry会提供一个案例使用方法。
-
Project 主界面,正在等待捕捉错误事件
-
在ipython中敲入页面提供的测试代码。
-
回到Project主界面,看到刚才的异常已经被捕捉到了。
-
点击查看详细信息
-
更棒的是,直接会有推送邮件发送到我们的注册邮箱中。直接点击即可查看。
与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/
-
查看DSN方法:
把server-tools路径加入odoo启动路径中,启动odoo进行sentry模块的安装。
安装完毕,需要把sentry模块作为server-side模块,在odoo启动时预加载。(使用server_wide_modules参数指定).
这里提供我的配置文件作为参考.
[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日志记录,正好用来当做实验。
- 查看我们的Sentry。可以看到这个Warning日志已经被捕捉了。
-
详细的错误信息
-
邮件也有了推送
总结
Sentry的使用让我们的Odoo自动运维有了全新的体验。等待异常事件推送比翻阅日志提高了维护效率.
- 但是这个版本的sentry模块有个小bug.只要有一个Odoo安装sentry模块,所有的Odoo数据库日志文件会被Sentry进行跟踪.这对部署多个Odoo服务的服务器来说会导致混乱.
同时只能使用一个固定的DSN也意味着把异常数据限制在了一个Sentry项目中,无法进行有效的分类管理. - 另外,由于国内的原因,使用官方Sentry提供的在线服务网速体验十分难受.较好的解决方法是使用Docker自己搭建Sentry本地服务.让我们在下一次的文章中再进行讲解吧.