Prometheus 学习之——基于 go 编写一个 exporter

Prometheus 学习之——基于 go 编写一个 exporter


前言

Prometheus 是 CNCF 收录的第二个项目,已经成为了云原生时代监控行业的标准。


一、exporter 简介

    在很多流行的监控系统中都已经实现了 Prometheus 的监控接口,例如 etcd、Kubernetes、CoreDNS 等,它们可以直接被 Prometheus 监控。但是大多数监控对象都没办法直接提供监控接口,主要原因有:

  • 很多系统在 Prometheus 诞生前的很多年就已经发布,例如 MySQL、Redis 等;
  • 本身不支持 HTTP 接口,例如对于硬件性能指标,操作系统并没有原生的 HTTP 接口可以获取;
  • 考虑到安全性、稳定性及代码耦合等因素的影响,软件作者并不愿意将监控代码加入现有代码中。

    这些都导致没法通过一个规范解决所有监控问题。在此背景下,exporter 应运而生。exporter 是一个采集监控数据并通过 Prometheus 监控规范对外提够数据的组件。 除了官方实现的 exporter 如 Node exporter、HAProxy exporter、MySQL server exporter,还有很多第三方实现如 Redis exporter 和 RabbitMQ exporter 等。Prometheus 会周期性地调用这些 exporter 提供的 metrics 数据接口来获取数据。

    这些 exporter 将不同规范和格式的监控指标进行转化,输出 Prometheus 能够识别的监控数据格式,从而极大地扩展 Prometheus 采集数据的能力。如果将 Prometheus 比作『天眼』,那么每个 exporter 就是散落在全球的一个个摄像头。Prometheus 正是依靠这些 exporter 监控不同种类的对象的。


二、基于 Go 客户端编写一个 exporter

完整代码地址:https://github.com/LeoNumber1/goExporterDemo

1. Guage 仪表盘类型

package main

import (
	"flag"
	"fmt"
	"log"
	"net/http"
	"time"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
)

//自定义端口
var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests")

var (
	//Gauge 仪表盘类型
	opsQueued = prometheus.NewGauge(prometheus.GaugeOpts{
   
		Namespace: "our_company",
		Subsystem: "blob_storage",
		Name:      "ops_queued",
		Help:      "Number of blob storage operations waiting to be processed",
	})

	jobsInQueue = prometheus.NewGaugeVec(prometheus.GaugeOpts{
   
		Name
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要实现一个 Prometheus Exporter,首先需要了解 Prometheus 的数据模型和数据采集方式。 Prometheus 使用 pull 的方式采集数据,即 Prometheus Server 定时从被监控对象(如应用程序、数据库等)拉取指标数据。被监控对象需要提供一个 HTTP 接口,通过该接口暴露指标数据,格式为 Prometheus 定义的文本格式。 Prometheus Exporter一个类似于被监控对象的中间件,它负责获取被监控对象的指标数据,并将其暴露给 Prometheus Server。因此,实现一个 Prometheus Exporter 需要从被监控对象获取指标数据,并将其转换为 Prometheus 定义的文本格式,最后通过 HTTP 接口暴露出来。 下面是一个使用 Java 实现的简单的 Prometheus Exporter 的示例代码: ```java import io.prometheus.client.CollectorRegistry; import io.prometheus.client.Counter; import io.prometheus.client.exporter.HTTPServer; import io.prometheus.client.hotspot.DefaultExports; import java.io.IOException; public class MyExporter { private static final CollectorRegistry registry = new CollectorRegistry(); private static final Counter requestsTotal = Counter.build() .name("requests_total") .help("Total requests.") .register(registry); public static void main(String[] args) throws IOException { // 注册 JVM 相关指标 DefaultExports.initialize(); // 启动 HTTP 服务器 HTTPServer server = new HTTPServer(8080); // 定时更新指标数据 while (true) { int requests = getRequests(); requestsTotal.inc(requests); try { Thread.sleep(1000); } catch (InterruptedException e) {} } } private static int getRequests() { // 从被监控对象获取指标数据 return 10; } } ``` 上述代码使用了 Prometheus Java 客户端库,通过 Counter 类来定义一个计数器指标,并在 HTTPServer 上启动一个 HTTP 服务器,将指标数据暴露出去。其中,getRequests() 方法模拟从被监控对象获取指标数据的逻辑。 需要注意的是,Prometheus Exporter 可能会对被监控对象产生一定的性能影响,因此需要进行充分的测试和评估,以确保其对被监控对象的影响尽可能小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值