企业维护 / 框架

Odoo 企业版维护信息为什么不是“发个版本号给官方”:publisher_warranty、cloc 统计与 payload 边界讲透

mail_enterprise 对 publisher_warranty.contract 的补丁不是简单塞一个版本号,而是按配置决定是否启用维护统计、收集模块代码量与错误摘要,并把结果序列化存回参数。

企业 框架
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 3 阅读

很多人看到企业版维护上报,会本能地把它理解成“给官方发一个版本号,证明系统还活着”。但 mail_enterprise/models/update.py 实际补进去的是一套更克制的维护 payload 逻辑:何时上报、上报哪些统计、出错时怎么降级,都被框在方法边界里。

一、扩展点选在 publisher warranty,而不是随处发请求

Publisher_WarrantyContract._get_message() 先拿到父类消息,再决定是否附加 maintenance 字段。这说明企业版没有重新发明一个维护请求通道,而是选择在已有 publisher warranty 合同消息上做增量扩展。

这种做法的好处是:

  • 维护信息和原有更新/订阅语义保持一致;
  • 不需要散落多个网络入口;
  • 出问题时也更容易定位在单一扩展点。

二、是否开启维护统计,本身就是一个配置边界

源码里通过 publisher_warranty.maintenance_disable 参数控制是否提前返回父类消息。如果配置明确关闭,就不继续收集维护数据。

这说明维护遥测并不是默认无限上报,而是保留了一个非常直接的开关。框架层面更重要的,不是“能采集多少”,而是何时应该停止采集

三、真正新增的是一个受控的 maintenance payload

启用时,源码会把 cloc.VERSION 放进 msg['maintenance'],然后尝试用 cloc.Cloc().count_env(self.env) 统计环境中的模块代码量;如果有错误,再把错误键写进 errors

这个 payload 很克制:

  • 有版本号,说明采样器本身是什么版本;
  • 有模块代码量,便于粗粒度理解部署规模;
  • 有错误摘要,方便支持团队知道统计哪里失败。

它不是为了把实例细节全部发走,而是为了提供一个“维护可见度”快照。

四、失败路径同样被设计过

如果 cloc 统计过程抛异常,源码不会让整个 _get_message() 崩掉,而是写入 cloc/error。同时还会把 maintenance 内容序列化到参数 publisher_warranty.cloc

这说明设计目标不是“必须精确采样成功”,而是:

  • 即使采样失败,也保留失败信号;
  • 支持排障时,能从本地参数看到最后一次统计结果。

五、还有一个专门给支持/调试用的 verbose 入口

_get_verbose_maintenance() 直接返回模块数量与排除模块,用于调试 cloc 问题。这个方法的存在很有代表性:框架不是只考虑正常上报,还考虑“当上报数字不对时,支持怎么查”。

六、新手误区

1. 以为维护上报就是一次 HTTP 调用

真正重要的是 payload 结构、开关和失败路径。

2. 以为异常就该直接吞掉

源码不是吞掉,而是留下 cloc/error 这类可诊断信号。

3. 以为 publisher warranty 和维护统计是两套无关机制

企业版就是在前者上扩后者。

七、实战注意事项

  • 如果你不希望维护统计参与消息生成,优先用参数开关,不要粗暴删代码;
  • 调试“为什么上报值怪怪的”时,先看 publisher_warranty.cloc 参数;
  • 自定义维护 payload 时,尽量保持“少量、可解释、失败可诊断”的原则;
  • 不要把 _get_message() 改成重型统计入口,否则会拖慢原有 publisher warranty 链路。

结语

企业版维护信息补丁真正体现的,不是“多传几个字段”,而是把采样开关、最小可用统计、失败信号和支持调试入口压进一个受控扩展点里。这种克制,恰恰是成熟框架代码最有价值的地方。

DISCUSSION

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。