扫码阅读
手机扫码阅读

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

235 2023-09-07

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

原文链接: http://mp.weixin.qq.com/s?__biz=Mzg5MzUyOTgwMQ==&mid=2247495623&idx=1&sn=2790b208026295b15c9483f885564606&chksm=c02fd461f7585d77a60068a3b7d59e3a735d7b145983a2ea6bf7e0072c89b734453dc0d1d48f#rd