0. 概述

在过去的几年中,我长期在工作中使用 prometheus,因此,最终还是逃不过看一些 prometheus 的细节和代码以及迁移官方的 patch 或者修复一些 prometheus 的 bug,但是,我们有着一个原则是不会主动在自己的代码中添加新的 feature,如果有类似需求,我们会走官方 pr 的形式(虽然,至今未走过)。

只要有代码的变更,那么肯定离不开重新编译,所以,这里我就介绍一下如何修改和编译 pormetheus 的代码。

1. 代码修改

要修改代码,第一步你肯定是先得有代码,prometheus 的代码你可以很容易地从 github 上克隆而来:

[[email protected]]# git clone https://github.com/prometheus/prometheus.git
[[email protected]]# cd prometheus

就我现在而言,因为 go module 已经普及了,所以你直接使用 go module 就可以了,如果你维护的是旧版本的话,例如我们维护的是 2.2.0 的旧版本,那么那时候的版本管理工具是 govendor,所以,你还需要在你本地安装 govendor,如果有需要,可以看我写的另外一片文章:govendor:一款比较旧的 Go 包依赖管理工具

然后,打开你熟悉的代码编辑工具,就可以开始开发了,如果你对 prometheus 的代码模块不太熟悉的话,我也写过一些 prometheus 的内部技术以及源码系列,你可以在我的博客中搜索一下。

2. 编译 prometheus

当你修改完代码之后,下一步就是要编译代码了,虽然官方上的介绍很简单,直接一个 make build 即可,但是,实际上过程并不轻松,因为 prometheus 自己开发了一个编译工具,所以,在 build 的过程中,会安装一些中间的构建工具,对于开发比较麻烦,所以我对这个过程进行了一个个人加速,所以我的构建过程是这样的:

[[email protected]]# docker run --name promu --rm -d -it -v $(pwd):/go/src/github.com/prometheus/prometheus lukelau/promu:0.2.0 /bin/sh
[[email protected]]# cd /go/src/github.com/prometheus/prometheus
[[email protected]]# promu build --prefix /go/src/github.com/prometheus/prometheus

稍等片刻,你就有一个新鲜的 prometheus 可以使用了。

3. Ref