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

一.项目背景:

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的知识。

猜你喜欢

转载自juejin.im/post/7068170502665142308