yanom blog

様々な技術について書きます

PrometheusでNewMetricWithTimestampを使って時刻指定する

会社でPrometheusのexporterを作っているんですが、Gauge型でいくつかのlabel付けつつtimestampも指定するサンプルの情報があまりなかったので記事にしておきます。

以下のサンプルでは現在時刻を指定しているのであまり意味がありませんが、 そこはデータの発生時刻など良しなにしてください。

package main

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

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

// type
type myCollector struct {
    temp *prometheus.Desc
}

var label = []string{"addr", "host"}

func newMyCollector() *myCollector {
    return &myCollector{
        temp: prometheus.NewDesc(
            "temp",
            "hello world",
            label,
            nil,
        ),
    }
}

func (c *myCollector) Describe(ch chan<- *prometheus.Desc) {
    ch <- c.temp
}

func (c *myCollector) Collect(ch chan<- prometheus.Metric) {

    labelValue := prometheus.Labels{
        "addr": "xxx.xxx.xxx.xxx", //ラベルの値
        "host": "japan",           //ラベルの値
    }
    ch <- prometheus.NewMetricWithTimestamp(
        time.Now(),  // 時刻を指定する
        prometheus.MustNewConstMetric(
            c.temp,
            prometheus.GaugeValue,
            1000.0,             //メトリクス値
            labelValue["addr"], //ラベル
            labelValue["host"], //ラベル
        ),
    )
}

// main
func main() {

    //create (cc myCollector)
    cc := newMyCollector()

    //register
    prometheus.MustRegister(cc)

    //HTTP Server
    http.Handle("/metrics", promhttp.Handler())
    log.Fatal(http.ListenAndServe(":8080", nil))

}