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