一.项目背景:
Odoo作为世界排名第一的开源ERP如今已被越来越多的企业所关注,我们最近也在负责odoo相关的项目的研发。众所周知,所有的项目并不是在系统完成研发顺利上线后就万事大吉了,反之,系统上线后我们也会面临着各种问题与困扰。如:系统出了故障没人及时知道怎么办?如何串联整个调用链路快速定位?如何澄清各个服务之间的依赖关系?如何进行各个服务接口的性能分析?如何追踪各个业务流程的调用处理顺序?skywalking具有强大的数据链路追踪服务,集成它可以完美解决以上问题和困扰,避免团队辛辛苦苦研发完成的系统在上线后在服务器上“裸奔”的情况。
下面将由我就跟大家分享一下odoo(本例用的odoo14,15也可以,其他版本适用与否不太清楚)集成skywalking的过程,开始之前先简单介绍一下skywalking。
二.skywalking简介:
Skywalking是一个国产的开源的分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。
具备以下功能:
- 多种监控手段:可以通过语言探针和 service mesh 获得监控是数据。
- 多个语言自动探针:包括 Java,Python,.NET Core 和 Node.JS。
- 轻量高效:无需大数据平台,和大量的服务器资源。
- 模块化:UI、存储、集群管理都有多种机制可选。
- 支持告警等
更多详细的内容可查看官方文档(skywalking极简入门:skywalking.apache.org/zh/2020-04-…),本篇就不介绍部署的过程了,可参考入门自行部署,下面正式开始odoo集成skywalking。
三.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的追踪记录也证实了这一点。
对于强大的skywalking自然有解决方案,skywalking提供了两种解决方式,一种是使用@trace装饰器,另一种是通过span实现,想了解 trace 和span的基本概念的请看这里(9、Skywalking的埋点-Trace的基本概念 - 简书 (jianshu.com)),通过@trace来装饰方法即可达到跟踪方法的整个链路的目的,简单快速但是只能用在方法上,而span相较麻烦点需要写实现span的代码,想要odoo的全局监控的话对odoo源码有入侵,好处就是灵活可以放到很多地 方对代码块进行监控,通过源码我们可以知道@trace其实也是通过span来实现的。
4.如何通过span实现odoo的全局监控
想要实现odoo的全局监控就需要对odoo的webrequest._call_function进行改造,改造需要的源码如下,要注意的一点的就是_call_function的源码需要缩进到span里面去,这样span才能起到作用:
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))
复制代码
5.实现案列展示
我们以search_read()为例看一下效果,在这里为了更好的体现skywalking监控的效果我们在search_read()里面添加了一个端口为9002的外部http接口。
下面展示效果:
通过skywalking 我们看到search_read()的整个链路以及日志信息都被监控到了。
四.结语:
感谢大家耐心看到这里,以上就是odoo集成skywalking的整个过程,后面我会跟大家分享odoo集成skywalking后如何告警的问题,关注我们带你了解更多关于odoo的知识。