第一次开源项目代码贡献 - prometheus-nginxlog-exporter

18 篇文章 3 订阅
1 篇文章 0 订阅

2021年2月26日,我的第一次开源项目代码贡献被合并了。

这完成了我一个宿愿。几年前老罗向 OpenSSL 捐献手机发布会门票款,我在上班的地铁上看到《隐形战友》这篇文章,有点激动,许下一个心愿:此生哪怕为开源项目贡献一行代码。后来在做模型开发的时候开始参与社区,翻译了一些 Flink 的文档,Flink 的大部分维护者是国人,主力是阿里。大项目要想参与代码贡献是比较难的,尤其是真正有意义的代码,做一做 lint 不能算。所以我先从翻译文档开始,在翻译的过程中可以比较细致的学习项目的功能,同时提高英语读写能力,还有一点就是学会如何与社区协作,比如要在 jira 上开 ticket、学习翻译文档的规范、使用 github 进行交流和协作。虽然 Flink 的维护主力是国人,但是 github 上交流全用英文。我也和国外的 commiter 交流过文档中的 typo。我发现这是一种非常好的学习方式,在学习中还参与了贡献,虽然文档贡献处于开源贡献鄙视链的底端。所以后续我在读 《Java8 编程思想》 和 《Go 101》的过程中都是边读边提交 fix typo 的 PR。这样督促我读得比较仔细,也换回点不白嫖的心理安慰。

最近一年主要做监控工作,大量使用 Prometheus 生态的组件,自己感兴趣 Go 语言,一直想研究源码,既是兴趣和追求,也是在大规模应用后的必然需求,万一出了问题的话,多少了解一些源码将有助于处理。于是开始读源码,也想着有朝一日可以向 Prometheus 贡献代码。

在这个过程中有了一次机会,不过还不是 Prometheus项目。我们对应用的监控采用的方案是采集 nginx 日志提取指标进行监控,我搜到一个开源项目 prometheus-nginxlog-exporter 来提取 nginx 日志的指标。我们线上的 nginx 日志是 json 格式的,而且值不全是字符串类型,有整数和浮点数,这样方便 filebeat 采集注入 ES。但是这个 exporter 不支持 json 格式解析,只能解析普通文本格式中的 nginx 日志模板变量。我当时采取了临时的迂回方案,额外打印了一份文本格式的日志供 exporter 解析用。打印两份日志对于空间和性能都是冗余消耗。后来我看到项目正好有提支持 json 格式日志需求的 issue,于是就想把这个功能做出来,也优化我们线上的应用。

由于这个项目完全依赖一个 nginx 日志变量模板解析的包,所以要重构格式解析器,改动稍微有点大。在 issue 中作者的意思也是要做一层抽象。我抽象出 Parser 接口并提供两个实现:TextParserJsonParser,通过命令行和配置文件参数设置使用哪个 parser。尽量使改动的代码行数最少并且保持后向兼容。测试使用没问题以后我没有直接提 PR,先把重构思路回复到 issue 里,看下作者的意见,没想到他给了我完全的肯定。

Thanks for your work on this, I really like the design. You’re welcome to open a PR for this change, and we’ll get it merged.

这给了我很大的鼓舞,我又优化了一下代码补充了文档,提交了 PR。

Thanks for the PR! As already said, 👍 on the general design. Will review in detail ASAP.

接下来是漫长的等待,每天都刷新看看有没有进展。15天——整整半个月后,作者做出了回复并提出了修改意见。

Sorry for taking so long. A big 👍 in general on this change; I’ve just added a few notes and thoughts – let me know what you think. 😉

同时他还对感觉好的地方特意提出了肯定。

👍 for also thinking of the documentation.

I think I mentioned it earlier already, but I really like this refactoring. 🤩 It comes with minimal changes to the original code, but adds so much extensibility. Well done! 👍

Also, 👍 for thinking of adding benchmarks!

他对于代码的审查挺仔细的,还指出了一个优化性能的方法让我学习到了。我很快完成了修改,又过了4天,完成了代码合并。本次代码的 PR 也大大加深了我对 git 和 github 的理解。

第一次参与开源项目的代码贡献,感触和收获还是挺大的。这个项目的作者是德国人,业余维护这个项目。项目并不大,只有400多颗星,代码质量也不是非常高。但是我想这就是小开源项目的生命表现:项目作为开源软件的构成要件都有,作者有贡献要求的说明文档,可以看到有不同的用户提出不同的需求,贡献出不同的特性,作者会倾听用户的需求也会有自己的把控,共同实现它的进化和发展。在我第一次使用的时候有很实用很解决痛点的功能存在。通过阅读代码也可以学到各种不同的实现方式和技巧。这就是一个小生命,出生以后逐渐成长壮大,像人一样,没有完美的但都有自己的生命力。

我贡献的代码量不大,添加 192 行删除 11 行,也比较简单,但是却非常耗费心血,远比自己写功能代码的投入程度大很多。字斟句酌,精确到标点符号,因为你的代码要被不指导多少
人用,被不知道多少人看。它要追求功能、追求性能,还要美。

在这次提交 PR 之前,我做了很多积累和准备的工作,读 Prometheus 的代码规范、贡献说明、google 的 code review 规范、
Effective Go、Prometheus 源码、这个项目的文档、规范和源码。这些都对参与开源项目代码贡献提供了很大的帮助也是必备的基础。可谓厚积薄发。

很高兴可以回亏开源项目,虽然参与开源也有功利心的成分,JD 上经常有参与开源项目贡献的加分项,但是作为程序员,成就感和荣誉感是最大的动力,它来自于自己的代码可以被全世界的用户使用到。

这开启了我新的旅程,走在开源贡献的道路上。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值