prometheus本身是预编译二进制,无需go环境即可运行;但开发exporter、修改client库或源码时,必须安装go 1.20+(推荐1.21.13),显式设置goroot,使用go mod管理依赖并禁用cgo以确保跨平台兼容性。

不需要为 Prometheus 二次开发专门装 Go 环境——它本身是预编译二进制,直接运行即可;但你要写 exporter、改 client 库、或者魔改源码,那必须配好 Go 工具链,且版本不能乱选。
go version 必须 ≥1.20,且不能用系统包管理器装
Prometheus 官方代码库自 v2.40+ 起已要求 Go 1.20+,client_golang 的最新版(v1.16+)也强制依赖 Go 1.20 的 embed 和 slices 包。CentOS/RHEL 自带的 golang 包(如 1.16 或 1.18)会编译失败,报错类似:
undefined: slices.Clone
正确做法是:
- 从 https://www.php.cn/link/81836b7cd16991abb7febfd7832927fd 下载官方
go1.21.13.linux-amd64.tar.gz(截至 2026 年 7 月最新稳定版) - 解压到
/usr/local/go,不要用dnf install golang或apt install golang-go -
GOROOT必须显式设为/usr/local/go;GOPATH可设为~/go,但非必需(Go 1.16+ 默认启用 module 模式) - 验证:运行
go version输出应为go version go1.21.13 linux/amd64,且go env GOROOT返回路径要和实际一致
prometheus/client_golang 依赖必须用 go mod 管理
手写 exporter 时,若直接 go get github.com/prometheus/client_golang,默认拉的是 master 分支,可能含未发布 API 或破坏性变更。线上稳定项目务必锁定版本:
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
- 初始化模块:
go mod init my-exporter - 指定版本获取:
go get github.com/prometheus/client_golang@v1.16.0(查最新 release 见 GitHub releases) - 检查依赖树:
go list -m all | grep client_golang,确认版本号精确匹配 - 避免混用
GO111MODULE=off:二次开发中关闭 module 会导致promhttp.Handler()找不到,或指标注册失败
交叉编译 exporter 时注意 CGO_ENABLED=0
你写的 exporter 最终要部署到各种 Linux 发行版(Alpine、CentOS、Debian),而 client_golang 默认依赖 libc。若不关 CGO,编译出的二进制在 Alpine 上会报错:
standard_init_linux.go:228: exec user process caused: no such file or directory
正确构建命令是:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-s -w' -o my_exporter .
其中:
-
CGO_ENABLED=0强制纯静态链接,去掉对 libc 的依赖 -
-ldflags '-s -w'去掉调试符号,减小体积(典型可省 30%+) - 别用
go install直接覆盖$GOBIN,二次开发阶段建议始终用go build -o显式控制输出路径
最容易被忽略的是:Prometheus 本身不依赖 Go 运行时,但你的二次开发产物(比如自定义 exporter)一旦用了 net/http/pprof 或 os/exec 等包,就隐式绑定了 Go 版本兼容性——哪怕只改一行 metrics 标签逻辑,也得确保整个构建链路的 Go 版本、module 依赖、CGO 设置全部对齐,否则上线后指标抓不到、进程静默退出,连日志都不打。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










