首先为什么要学习Exporter的二次开发?这是为了根据实际业务需求,开发出自己的数据采集器
什么是 Prometheus Exporter
Exporter 是一个独立的 HTTP 服务,其核心职责是:采集业务或系统指标,按照 Prometheus 规定的文本格式,在 /metrics 路径下暴露出来。Prometheus Server 会定期访问这个端点,拉取指标数据用于存储、查询和告警。
Exporter 本身不主动推送数据,也不负责存储,它只是一个"指标翻译器",把内部状态转换成 Prometheus 能理解的标准格式。
大致流程如下:
开发一个自定义的Prometheus exporter涉及到以下几个关键步骤:
1. 理解Prometheus和Exporter
首先,你需要理解Prometheus是如何工作的,特别是它的拉取(pull)模型。Prometheus Server定期从配置好的targets的HTTP端点拉取指标。一个Exporter作为一个中间组件,它的作用是暴露出某个服务的指标,供Prometheus Server拉取。
2. 定义指标
在开发Exporter之前,确定你想要暴露哪些指标。指标应该是可观察的量度,比如计数器、仪表(gauges)、直方图和摘要。每个指标都应该有一个清晰的名称、可选的标签和帮助字符串。
3. 选择编程语言
Prometheus的客户端库可用于多种语言。最常用的是Go语言,因为Prometheus本身就是用Go编写的,不过你也可以选择Python、Java等其他语言的客户端库。
4. 设置开发环境
根据所选的语言设置开发环境。例如,如果你选择Go,你需要安装Go编译器和相关的依赖管理工具。接着,安装Prometheus的客户端库。
5. 编写Exporter代码
创建一个新的项目并引入Prometheus客户端库。编写代码来收集你想要暴露的指标。这通常涉及到实现一个或多个Collector接口,并在Collector的Collect方法中收集指标。
6. 暴露指标
使用客户端库提供的HTTP handler来暴露指标。在Go中,这通常是使用promhttp包来做的。你需要设置一个HTTP服务,Prometheus可以通过该服务从你的Exporter拉取指标。
7. 注册Collector
创建你自己的Collector实例,并将其注册到Prometheus的默认registry中。这样,当Prometheus拉取你的Exporter时,你的Collector会被调用来收集指标。
8. 测试和验证
在本地运行你的Exporter,并确保它在预期的端点上暴露指标。你可以使用curl来检查输出是否符合Prometheus指标暴露的格式。
9. 打包和部署
将你的Exporter打包成可执行文件或容器,并在提供服务的环境中部署它。确保它能持续运行,并且网络配置允许Prometheus Server访问。
10. 配置Prometheus
在你的Prometheus配置文件中添加一个新的scrape配置,指向你的Exporter。重启Prometheus Server或重新加载配置,以便它开始拉取你的新指标。
详细步骤
下面我将以Go语言为例,详细地介绍如何开发一个自定义的Prometheus Exporter。这个例子将导出一个简单服务的指标,服务只有一个计数器。
1. 准备工作
首先,确保你安装了Go语言环境。然后,创建一个新的Go项目文件夹,初始化Go模块:
mkdir test_exporter
cd test_exporter
go mod init test_exporter2. 安装Prometheus Go客户端
通过以下命令安装Prometheus Go语言客户端库:
go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp3. 定义和注册指标
创建一个main.go文件,然后定义和注册你想要暴露的指标。你可以创建多种类型的指标,包括计数器(Counter)、仪表盘(Gauge)、直方图(Histogram)和摘要(Summary)。
package main
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"net/http"
"time"
)
// 定义指标
var (
opsProcessed = prometheus.NewCounter(prometheus.CounterOpts{
Name: "my_service_processed_ops_total",
Help: "The total number of processed events",
})
)
// 初始函数,在main之前自动调用,并进行初始化
func init() {
// 在Prometheus中注册指标,也可以采取Register方法,这样返回错误能更精细化处理
// 而MustRegister则会返回panic
prometheus.MustRegister(opsProcessed)
}
func recordMetrics() {
go func() {
for {
opsProcessed.Inc() // 模拟指标的变化
time.Sleep(2 * time.Second)
}
}()
}
func main() {
// 记录指标
recordMetrics()
// 创建新的HTTP服务器
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":9090", nil) // 在9090端口上暴露/metrics端点
}注意:prometheus.MustRegister():将指标注册到 Prometheus 的默认注册器(DefaultRegisterer);
如果注册失败(如指标名重复),会直接
panic,便于早期发现问题;也可使用
prometheus.Register()返回错误进行更精细的处理。
4. 暴露指标
我们在main函数中,暴露了一个端点/metrics,然后端口是9090。在编译后,可以通过:localhost:9090/metrics访问这个页面。
5. 编译和运行Exporter
你可以通过以下命令编译并运行你的Exporter:
go build main.go
./main
当Exporter运行时,它会开始在9090端口上暴露指标。
6. 配置Prometheus
编辑你的Prometheus配置文件(通常是prometheus.yml),添加你的Exporter作为一个新的scrape target:
scrape_configs:
- job_name: 'my_custom_exporter'
static_configs:
- targets: ['localhost:9090']7. 验证Export的指标
你可以通过访问http://localhost:9090/metrics来查看你的Exporter是否正确暴露了指标。Prometheus也应该能够在其UI上显示来自你的Exporter的指标。
8. 容器化Exporter
你可能希望将你的Exporter容器化,这样可以更容易地在各种环境中部署。创建一个Dockerfile,使用它来构建你的Exporter的Docker镜像。
FROM golang:1.15 as builder
WORKDIR /app
COPY . .
RUN go build -o test_exporter .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/test_exporter .
CMD ["./test_exporter"]
评论区