侧边栏壁纸
博主头像
小周的知识站 博主等级

行动起来,活在当下

  • 累计撰写 91 篇文章
  • 累计创建 13 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

Exporter二次开发——简单示例

Administrator
2026-03-09 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

首先为什么要学习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编写的,不过你也可以选择PythonJava等其他语言的客户端库。

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_exporter

2. 安装Prometheus Go客户端

通过以下命令安装Prometheus Go语言客户端库:

go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp

3. 定义和注册指标

创建一个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"]

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区