给 Milvus 项目贡献代码的一次经历
2023-5-4|2024-9-13
wuxiaobai24
type
status
date
slug
summary
tags
category
icon
password
这篇文章记录了我给 Milvus 贡献代码的过程。
🚀 起因
最近 ChatGPT 火出了圈,让越来越非从业者也接触到了 AI,大家对于技术的关注又开始聚集到 AI 上了(上一次个人认为是 CNN 大火的时候,算法工程师的地位被空前的拔高,但是在19年左右,可能又回到了冷淡期,没想到那么快又有火出圈的东西出现了),作为一个刚开始工作的后端小白,也在思考着怎么让自己的职业规划更加贴近 AI。
由于在工作中没有特别适合的机会,除非直接跳槽。除了在主职工作中接触 AI 相关的技术外,还有一条路径就是开源。
Milvus 是在毕业前就关注到的一个开源项目,他们是国内做向量数据库的领头羊,而且从issue上来看也对开发者非常友好,时常有 issue 被标记为 good first issue。因此我在4月25号的时候,我在翻了一会他们的issue后,觉得下面这个 issue 下面回复认领该issue,并很快得到了回复:
[Feature]: Log Module support print NodeID
Updated Apr 25, 2023

🧑🏻💻 开发环境准备
开发环境的配置可以参考这个文档,使用 devcontainer 就可以获得不错的开发体验了。
但是在尝试搭建时还是会遇到一些问题的:

后面发现是
docker-compose-devcontainer.yml
有些问题,翻了一下 issue 和 PR,可以找到一个PR是修复devcontainer的:improvement for devcontainer
Updated May 24, 2023
按照这个PR修复后,就可以正常把 devcontainer 跑起来了:


❓ Issue 分析
Currently all log format is
time level line details.
For a cluster we need to know NodeID to distinguish diffenerent nodes.
问题描述还是挺简短的,就是在 Milvus 集群中希望通过 NodeID 来区分不同节点的日志。
在想着如何完成这个issue之前,我们可以通过官方文档我们可以简单了解到 Milvus 的基本架构:

从上图可以看出来,Milvus 又多个 Worker Node,Worker Node 又可以分为 Query Node、Data Node和Index Node,而且我们可以知道这些节点应该是通过 etcd 来管理的
这个问题可以简单先划分为两个子问题:
- 如何获取 NodeID?
- 怎么在日志中加入 NodeID?
如何获取 NodeID?
光靠看代码和思考,肯定不能很好的解决方法,我们可以先看看现有的日志是怎样的。
从之前的启动脚本
./scripts/start_cluster.sh
,我们看到这些服务的日志都被写到了 /tmp/
中了
随便找一个日志看看,
query.log

可以看到这个日志中已经包含了 NodeID 了,并且在其他日志中也可以看到类似的日志。
这时我们可以翻一下对应的代码:
看起来所谓的 nodeID,其实也是 session 的 ServerID,同时查看
session_util.go
的代码,我们可以可以知道在 ServerID 是 session.Init 时完成初始化的。并且初始化后保存到了 paramtable 里面。通过追踪日志和阅读代码,我们基本可以解决”如何获取 NodeID ?”的问题了。
怎么在日志中加入 NodeID?
简单翻阅代码,我们可以知道,Milvus 是使用
zap
日志库,并在 zap
上面封装了一层,其代码在pkg/log
中。利用 phind.com 我们可以很容易知道 zap 可以使用`With`来让一个 logger 增加一列:

(后面它胡说八道了一大堆,这里选择忽视)
通过追踪代码,我们可以发现每个服务都在
roles.go
里面调用了 logutil.SetupLogger
,同时这个地方又能使用 paramtable 获取到 NodeID,因此,这里可以在这里把 NodeID 穿到 LoggerConfig里面,并在初始化 logger 的时候调用`With`方法将 node_id 注入日志中。相关更改:
提交MR
进行简单的测试,确认功能没问题后,可以运行下面这些命令进行格式检查:
然后再将修改push到github:
最后,到 Github 上提交PR即可:

后续
Waiting…