基于Prometheus的client_golang开发自己的exporter

在 go get github.com/prometheus/client_golang   时可能会遇到有些库拉不下来,此时可以直接去GitHub网站拉取源码包,可能需要用到的库如下:

https://github.com/prometheus/common.git

https://github.com/prometheus/client_model.git

https://github.com/prometheus/client_golang.git
https://github.com/matttproud/golang_protobuf_extensions.git

https://github.com/protocolbuffers/protobuf-go.git

https://github.com/golang/sys.git

将拉取到的包解压到GOPATH/src 目录的相应位置(目录名称需要修改)

准备工作完成后开始编码

https://prometheus.io/docs/instrumenting/clientlibs/    这个是Prometheus官网给出的支持的编码语言

https://prometheus.io/docs/guides/go-application/   官网也是相应给出了一个使用client_golang的demo。英语好的可以直接看官网。

如下是用到的所有库

import (
   "github.com/prometheus/client_golang/prometheus"
   "github.com/prometheus/client_golang/prometheus/promhttp"
   "log"
   "net/http"
)

自定义的exporter其实就是两步

1、封装一个Prometheus规定的数据格式。

2、将封装好的数据通过HTTP API提供出去。

Prometheus根据配置的API地址、以及拉取时间拉取数据,最终做展示。

 

如下,定义了两种数据类型的采集数据,一种是gauge(cpuTemp、cpuTemp2),一种是counter(hdFailures)

Guage 类型代表一种样本数据可以任意变化的指标,即可增可减。

Counter 类型代表一种样本数据单调递增的指标,即只增不减,除非监控系统发生了重置。

var (
   cpuTemp = prometheus.NewGaugeVec(prometheus.GaugeOpts{
      Name: "cpu_temperature_celsius",
      Help: "Current temperature of the CPU.",
   },
   []string{
      // Which user has requested the operation?
      "endpoint",
      "metric_group",
      // Of what type is the operation?
      "component",
   },
   )
   cpuTemp2 = prometheus.NewGaugeVec(prometheus.GaugeOpts{
      Name: "cpu_temperature_celsius_ppp",
      Help: "Current temperature of the CPU.",
   },
      []string{
         // Which user has requested the operation?
         "endpoint",
         "metric_group",
         // Of what type is the operation?
         "component",
      },
   )
   hdFailures = prometheus.NewCounterVec(
      prometheus.CounterOpts{
         Name: "hd_errors_total",
         Help: "Number of hard-disk errors.",
      },
      []string{"device"},
   )
)

Prometheus定义的数据格式如下

即要包括三大块   

1、HELP 描述指标具体含义 

2、TYPE标识数据类型   

3、指标名称、大括号中的label额外信息以及具体数值(数值均为float64类型)

代码构成

基于Prometheus的client_golang开发自己的exporter_第1张图片

提供一个初始化方法,在初始化的时候就将数据注册进去

func init() {
   // Metrics have to be registered to be exposed:
   mv := []prometheus.GaugeVec{}
   mv = append(mv, *cpuTemp,*cpuTemp2)
   prometheus.MustRegister(mv[0],mv[1])
   log.Println(len(mv))
   prometheus.MustRegister(hdFailures)
}

最终main方法如下

func main() {
   //cpuTemp.Set(65.3)
   // Increase a value using compact (but order-sensitive!) WithLabelValues().
   cpuTemp.WithLabelValues("aiops1","CpuMonitor", "CPU").Add(4)
   cpuTemp2.WithLabelValues("hhhh","bbbbb","ttttt").Add(8)
   hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc()
   
   http.Handle("/metrics", promhttp.Handler())
   log.Fatal(http.ListenAndServe(":2112", nil))
}

第一部分即把具体值写入到指标中

第二部分即通过client_golang提供的处理HTTP方法将数据通过API方式提供出去 ,如上

最终通过 http://localhost:2112/metrics     可以获取到指标。

你可能感兴趣的:(go,容器)