Odoo | Skywalking 为上线系统保驾护航


zuokang
一名保持低调,保持进步的
后端开发
系统上线后
问题重重
Odoo 作为世界排名第一的开源 ERP 如今已被越来越多的企业所关注,我们最近也在参与与 Odoo 相关的项目研发。
众所周知,在系统完成研发顺利上线后,任何项目并不是万事大吉了,反之, 系统上线后我们依旧会面临着各种问题与困扰。
如:
-
系统出现故障没及时发现怎么办?
-
如何串联整个调用链路快速定位?
-
如何澄清各个服务之间的依赖关系?
-
如何进行各个服务接口的性能分析?
-
如何追踪各个业务流程的调用处理顺序?
Skywalking
解决上线后的问题
Skywalking 具有强大的数据链路追踪服务功能,集成它可以完美解决以上问题和困扰,团队辛辛苦苦研发完成的系统在上线后,终于在服务器上不再“裸奔”。
下面我们来看看,
什么是 Skywalking
什么是 Skywalking
Skywalking 是一个 国产开源的分布式系统应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker, K8S, Mesos)的架构而设计。
它是一款优秀的 APM(Application Perfor-
-mance Management)工具,包括分布式追踪,性能指标分析和服务依赖分析等功能。
Skywalking 的功能
Skywalking 具备以下功能:
-
多种监控手段:可以通过语言探针和 service mesh 获得监控数据。
-
多个语言自动探针:包括 Java、Python、.NET Core 和 Node.JS。
-
轻量高效:无需大数据平台,和大量的服务器资源。
-
模块化:UI、存储、集群管理都有多种机制可选。
-
支持告警等
更多详细的内容可查看下面的官方文档:
Skywalking 极简入门:
https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/#
本篇就不介绍部署的过程了,可参考入门自行部署。
下面正式开始介绍
如何在 Odoo 集成 Skywalking
#1
安装 apache-skywalking 库
pip install "apache-skywalking"
#2
在 odoo-bin 中添加代码
添加代码
from skywalking import agent, config
config.init(collector_address='ip:11800', service_name='odoo-python')
agent.start()
/ 添加代码
collector_address :Skywalking 部署服务器的 IP 地址,端口固定 11800(11800为默认端口,部署的时候没改的话就是这个)。
service_name : 自定义服务名。
查看服务
代码添加完之后就可以启动 Odoo了,可以在Skywalking 中看到我们的服务。
Odoo 启动日志中会打印 Skywalking 部分插件安装失败的信息,可忽略。
/ 查看服务
/ 查看服务
#3
如何处理 Skywalking
没有 Odoo 插件的问题
插件问题
其实到这一步,对于 flask,django 框架来说就已经成功了,但是 对于 Odoo 却不行。
查看 Skywalking 的源码我们可以知道,它并没有 Odoo 的插件,也就是说 Skywalking 并不支持监控 Odoo 的 http 请求。
我们再仔细看发现它是有 psycopy2 插件的,而 Odoo 的 postgres 用的就是 psycopy2库。也就是说 它可以监控到 Odoo 的postgres,这一点也通过查看 Skywalking 的追踪记录来证实。
/ Skywwalk的spycopy2插件
/ Skywalk的追踪记录
解决方案
对于强大的 Skywalking 自然有解决方案。
Skywalking提供了 两种解决方式:
-
一种是使用 @trace 装饰器
-
另一种是通过 span 实现
了解 trace 和 span 的基本概念可以查看下面的链接文章:
Skywalking的埋点-Trace的基本概念
https://www.jianshu.com/p/541eb76c6edc
方式一:@trace
通过 @trace 来装饰方法即可达到跟踪方法的整个链路的目的, 简单快速,但是 只能用在方法上。
方式二:span
而 span 相对麻烦,需要写实现 span 的代码,想要 Odoo 的全局监控的话对 Odoo 源码有入侵。
好处就是 可以灵活地放到很多地方对代码块进行监控,通过源码我们可以知道 @trace 其实也是通过 span 来实现的。
#4
如何通过span实现odoo的全局监控
想要实现 Odoo 的全局监控就需要对 Odoo 的 webrequest._call_function 进行改造,改造需要的源码如下:
from skywalking import Layer, Component, config
from skywalking.trace.carrier import Carrier
from skywalking.trace.context import get_context, NoopContext
from skywalking.trace.span import NoopSpan
from skywalking.trace.tags import TagHttpMethod, TagHttpURL, TagHttpParams
span = NoopSpan(NoopContext()) if config.ignore_http_method_check(self.httprequest.path) else get_context().new_entry_span(op=self.httprequest.path, carrier=Carrier())
with span:
span.layer = Layer.Http
span.component = Component.Requests
span.peer = self.httprequest.host
span.tag(TagHttpMethod(self.httprequest.path))
span.tag(TagHttpURL(self.httprequest.url))
span.tag(TagHttpParams(kwargs))
要注意的一点的就是 _call_function 的源码需要缩进到 span 里面去,这样 span 才能起到作用。
/ 改造源码
#5
实现案例展示
我们以 search_read() 为例看一下效果。
在这里为了更好的体现 Skywalking 监控的效果我们在 search_read() 里面添加了一个端口为 9002 的外部 http 接口。
/改造源码
下面展示效果:
/ 效果展示
/ Odoo本地接口被监控
/ 外部接口被监控
通过 Skywalking 我们看到 search_read() 的整个链路以及日志信息都被监控到了。
以上就是Odoo集成 Skywalking 的整个过程,
后面我会跟大家分享
Odoo集成Skywalking后 如何告警的问题。
关注我们,
带你了解更多有关 Odoo 的知识。