想必大家对于黑盒监控都不陌生,我们经常使用blackbox_exporter来进行黑盒监控,在K8s中进行黑盒监控可以参考这里。

既然已经有成熟的工具,为何自己还要再来尝试开发一个?

我说是为了学习,你信吗?

既然是为了学习,整体逻辑就不用太复杂,主要需要实现以下功能:

  • 可以通过配置文件的方式增加监控项
  • 吐出Prometheus可收集指标
  • 支持tcp和http探测
  • 支持配置检测频率

写在前面

在正式开始之前,先简单介绍一下Prometheus以及Prometheus Exporter。

Prometheus是CNCF的一个开源监控工具,是近几年非常受欢迎的开源项目之一。在云原生场景下,经常使用它来进行指标监控。

Prometheus支持4种指标类型:

  • Counter(计数器):只增不减的指标,比如请求数,每来一个请求,该指标就会加1。
  • Gauge(仪表盘):动态变化的指标,比如CPU,可以看到它的上下波动。
  • Histogram(直方图):数据样本分布情况的指标,它将数据按Bucket进行划分,并计算每个Bucket内的样本的一些统计信息,比如样本总量、平均值等。
  • Summary(摘要):类似于Histogram,也用于表示数据样本的分布情况,但同时展示更多的统计信息,如样本数量、总和、平均值、上分位数、下分位数等。

在实际使用中,常常会将这些指标组合起来使用,以便能更好的观测系统的运行状态和性能指标。

这些指标从何而来?

Prometheus Exporter就是用来收集和暴露指标的工具,通常情况下是Prometheus Exporter收集并暴露指标,然后Prometheus收集并存储指标,使用Grafana或者Promethues UI可以查询并展示指标。

Prometheus Exporter主要包含两个重要的组件:

  • Collector:收集应用或者其他系统的指标,然后将其转化为Prometheus可识别收集的指标。
  • Exporter:它会从Collector获取指标数据,并将其转成为Prometheus可读格式。

那Prometheus Exporter是如何生成Prometheus所支持的4种类型指标(Counter、Gauge、Histogram、Summary)的呢?

Prometheus提供了客户端包github.com/prometheus/client_golang,通过它可以声明不通类型的指标,比如:

(1)针对Counter类型

import (
 "net/http"

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

func main() {
 // 创建一个Counter指标
 counterMetric := prometheus.NewCounter(prometheus.CounterOpts{
  Name: "example_counter", // 指标名称
  Help: "An example counter metric.", // 指标帮助信息
 })

 // 注册指标
 prometheus.MustRegister(counterMetric)

 // 增加指标值
 counterMetric.Inc()

 // 创建一个HTTP处理器来暴露指标
 http.Handle("/metrics", promhttp.Handler())

 // 启动Web服务器
 http.ListenAndServe(":8080", nil)
}