Exporter/Client Libraries 开发介绍

发布时间: 更新时间: 总字数:562 阅读时间:2m 作者: IP属地: 分享 复制网址

Prometheus提供各种语言的Client Libraries来开发instrumentation metrics的采集器。这些lib库,默认提供如CPU使用率、垃圾回收统计信息。

介绍

各种client库源代码

实现方式:

  • counter: Inc/Dec
  • gauge: Set
  • histogram(直方图)/summary(百分位): observe
  • Collector,实现两个接口
    • Describe
    • Collect

指标采集方式:

  • 周期/定时任务触发
  • 业务请求时触发,http 请求、异步任务等
  • metrics 请求时触发,适用于实时获取指标

认证需自行实现:

示例

基础使用

package main

import (
	"fmt"
	"log"
	"math/rand"
	"net/http"
	"time"

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

var diskinfo = []string{"mount"}

var (
	// gauge
	cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{
		Name: "cpu_temperature_celsius",
		Help: "Current temperature of the CPU.",
	})
	cpuCount = prometheus.NewGauge(prometheus.GaugeOpts{
		Name: "cpu_count",
		Help: "cout count.",
		ConstLabels: prometheus.Labels{
			"key1": "val1",
		},
	})
	disk = prometheus.NewGaugeVec(prometheus.GaugeOpts{
		Name: "disk",
		Help: "disk size info.",
	}, diskinfo)

	// counter
	requestTotal = prometheus.NewCounter(prometheus.CounterOpts{
		Name: "request_total",
		Help: "http request total",
	})
	hdFailures = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "hd_errors_total",
			Help: "Number of hard-disk errors.",
		},
		[]string{"device"},
	)

	// histogram
	urlRequestTime = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Name:    "url_request_time",
			Help:    "url request time.",
			Buckets: prometheus.LinearBuckets(0, 3, 5),
		}, []string{"url"})

	// summary
	requestSummary = prometheus.NewSummaryVec(
		prometheus.SummaryOpts{
			Name:       "request_time_summary",
			Help:       "request time summary",
			Objectives: map[float64]float64{0.2: 0.1, 0.5: 0.001, 0.99: 0.0001},
		}, []string{"url"})
)

func init() {
	// Metrics have to be registered to be exposed:
	prometheus.MustRegister(cpuCount)
	prometheus.MustRegister(disk)
	prometheus.MustRegister(cpuTemp)

	prometheus.MustRegister(requestTotal)
	prometheus.MustRegister(hdFailures)

	prometheus.MustRegister(urlRequestTime)

	prometheus.MustRegister(requestSummary)
}

func main() {
	cpuCount.Set(4)
	disk.WithLabelValues("/dev/sda").Set(10)
	disk.WithLabelValues("/dev/sdb").Set(10)
	cpuTemp.Set(65.3)

	//requestTotal.Inc()
	hdFailures.With(prometheus.Labels{"device": "/dev/sda"}).Inc()

	// histogram
	//urlRequestTime.WithLabelValues("/url").Observe(10)
	//urlRequestTime.WithLabelValues("/url").Observe(5)
	//requestSummary.WithLabelValues("/url").Observe(10)
	//requestSummary.WithLabelValues("/url").Observe(5)

	// 修改值
	//时间触发:磁盘使用、CPU使用、内存使用
	go func() {
		// for range time.Tick(time.Second) {}
		ticker := time.NewTicker(3 * time.Second)
		for {
			disk.WithLabelValues("/dev/sda").Set(rand.Float64())
			disk.WithLabelValues("/dev/sdb").Set(rand.Float64())
			<-ticker.C
		}
	}()

	// 事件触发,如 HTTP 请求
	http.HandleFunc("/url/", func(writer http.ResponseWriter, request *http.Request) {
		requestTotal.Inc()
		urlRequestTime.WithLabelValues("/url").Observe(rand.Float64())
		requestSummary.WithLabelValues("/url").Observe(rand.Float64())
		writer.Write([]byte("done."))
	})

	// 在访问metrics时触发,只有这两种
	//prometheus.NewGaugeFunc()
	//prometheus.NewCounterFunc()
	fcall := prometheus.NewCounterFunc(prometheus.CounterOpts{
		Name: "abc",
		Help: "abc",
	}, func() float64 {
		fmt.Println("call")
		return rand.Float64()
	})
	prometheus.MustRegister(fcall)

	// The Handler function provides a default handler to expose metrics
	// via an HTTP server. "/metrics" is the usual endpoint for that.
	http.Handle("/metrics", promhttp.Handler())
	log.Fatal(http.ListenAndServe(":8080", nil))
}

mysql-exporter 示例

https://github.com/xiexianbin/mysql-exporter

应用监控

beego 实现 web.handler("/metrics", promhttp.Handler())参考

参考

  1. https://prometheus.io/docs/instrumenting/clientlibs/
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数