Forked from ggzeng/golang_prometheus_metric_counter.go
Created
October 14, 2022 08:57
-
-
Save zx1986/529236030a824bbd77293fc9baf32680 to your computer and use it in GitHub Desktop.
prometheus golang 客户端中的各类metric写法
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//step1:初始一个counter, with help string | |
pushCounter = prometheus.NewCounter(prometheus.CounterOpts{ | |
Name: "repository_pushes", | |
Help: "Number of pushes to external repository.", | |
}) | |
//setp2: 注册容器 | |
err = prometheus.Register(pushCounter) | |
if err != nil { | |
fmt.Println("Push counter couldn't be registered AGAIN, no counting will happen:", err) | |
return | |
} | |
pushComplete := make(chan struct{}) | |
// TODO: Start a goroutine that performs repository pushes and reports | |
// each completion via the channel. | |
for range pushComplete { | |
//step3:向容器中写入值 | |
pushCounter.Inc() | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// CounterVec是一组counter,这些计数器具有相同的描述,但它们的变量标签具有不同的值。 | |
//step1:初始化一个容器 | |
httpReqs := prometheus.NewCounterVec( | |
prometheus.CounterOpts{ | |
Name: "http_requests_total", | |
Help: "How many HTTP requests processed, partitioned by status code and HTTP method.", | |
}, | |
[]string{"code", "method"}, | |
) | |
//step2:注册容器 | |
prometheus.MustRegister(httpReqs) | |
httpReqs.WithLabelValues("404", "POST").Add(42) | |
// If you have to access the same set of labels very frequently, it | |
// might be good to retrieve the metric only once and keep a handle to | |
// it. But beware of deletion of that metric, see below! | |
//step3:向容器中写入值,主要调用容器的方法如Inc()或者Add()方法 | |
m := httpReqs.WithLabelValues("200", "GET") | |
for i := 0; i < 1000000; i++ { | |
m.Inc() | |
} | |
// Delete a metric from the vector. If you have previously kept a handle | |
// to that metric (as above), future updates via that handle will go | |
// unseen (even if you re-create a metric with the same label set | |
// later). | |
httpReqs.DeleteLabelValues("200", "GET") | |
// Same thing with the more verbose Labels syntax. | |
httpReqs.Delete(prometheus.Labels{"method": "GET", "code": "200"}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Gauge可以用来存放一个可以任意变大变小的数值,通常用于测量值,例如温度或当前内存使用情况,或者运行的goroutine数量 | |
//step1:初始化容器 | |
cpuTemprature := prometheus.NewGauge(prometheus.GaugeOpts{ | |
Name: "CPU_Temperature", | |
Help: "the temperature of CPU", | |
}) | |
//step2:注册容器 | |
prometheus.MustRegister(cpuTemprature) | |
//定时获取cpu温度并且写入到容器 | |
func(){ | |
tem = getCpuTemprature() | |
//step3:向容器中写入值。调用容器的方法 | |
cpuTemprature.Set(tem) | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
cpusTemprature := prometheus.NewGaugeVec( | |
prometheus.GaugeOpts{ | |
Name: "CPUs_Temperature", | |
Help: "the temperature of CPUs.", | |
}, | |
[]string{ | |
"cpuName", // Which cpu temperature? | |
}, | |
) | |
prometheus.MustRegister(cpusTemprature) | |
// 一次性统计多个cpu的温度 | |
cpusTemprature.WithLabelValues("cpu1").Set(temperature1) | |
cpusTemprature.WithLabelValues("cpu2").Set(temperature2) | |
cpusTemprature.WithLabelValues("cpu3").Set(temperature3) | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
temps := prometheus.NewHistogram(prometheus.HistogramOpts{ | |
Name: "pond_temperature_celsius", | |
Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. | |
Buckets: prometheus.LinearBuckets(20, 5, 5), // 5 buckets, each 5 centigrade wide. | |
}) | |
// Simulate some observations. | |
for i := 0; i < 1000; i++ { | |
temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) | |
} | |
// Just for demonstration, let's check the state of the histogram by | |
// (ab)using its Write method (which is usually only used by Prometheus | |
// internally). | |
metric := &dto.Metric{} | |
temps.Write(metric) | |
fmt.Println(proto.MarshalTextString(metric)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
temps := prometheus.NewSummary(prometheus.SummaryOpts{ | |
Name: "pond_temperature_celsius", | |
Help: "The temperature of the frog pond.", | |
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, // 分为数:偏差值 | |
}) | |
// Simulate some observations. | |
for i := 0; i < 1000; i++ { | |
temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) | |
} | |
// Just for demonstration, let's check the state of the summary by | |
// (ab)using its Write method (which is usually only used by Prometheus | |
// internally). | |
metric := &dto.Metric{} | |
temps.Write(metric) | |
fmt.Println(proto.MarshalTextString(metric)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"log" | |
"net/http" | |
"github.com/prometheus/client_golang/prometheus" | |
"github.com/prometheus/client_golang/prometheus/promhttp" | |
) | |
var ( | |
cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{ | |
Name: "cpu_temperature_celsius", | |
Help: "Current temperature of the CPU.", | |
}) | |
hdFailures = prometheus.NewCounterVec( | |
prometheus.CounterOpts{ | |
Name: "hd_errors_total", | |
Help: "Number of hard-disk errors.", | |
}, | |
[]string{"device"}, | |
) | |
) | |
func init() { | |
// Metrics have to be registered to be exposed: | |
prometheus.MustRegister(cpuTemp) | |
prometheus.MustRegister(hdFailures) | |
} | |
func main() { | |
cpuTemp.Set(65.3) | |
hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() | |
// 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)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment