“时序敏感应用” 如何prometheus自定义上报时间戳
1、场景
在物理网络监控中,对于流量趋势是极其敏感的,物理网络监控流量的点通常是秒级别甚至毫秒级别,此时这些时许点通过各种上报上传到监控系统中,由于网络波动,可能会有后采集的点,prometheus先处理了的情况,导致可能原本带宽突增,但由于时序点的达到顺序反了,导致监控视图展示成带宽突降
2、prometheus 数据点的组成形式
在 Prometheus 里一个数据点由: Metric(metric + labelsets) + timestamp + value 组成。
exporter提供给prometheus的采集数据格式:
<监控指标名称>{ <标签名称>=<标签值>,<标签名称>=<标签值>…} <样本值1> <时间戳>
<监控指标名称>{ <标签名称>=<标签值>,<标签名称>=<标签值>…} <样本值2> <时间戳>
3、prometheus采集数据的两种方式
push模式需要注意:
4、prometheus如何决定数据点的时间戳
通过pull的方式,exporter把数据传递给Prometheus Server时,可以自己打上时间戳,也可以不打。时间戳应为采集数据的时间,是可选项,如果 Exporter 没有提供时间戳的话,Prometheus Server 会在拉取到样本数据时将时间戳设置为当前时间;
5、如何为数据点指定自定义时间戳
方法: 上报时使用Timestamp方法来创建metrics
参考:NewMetricWithTimestamp
example:
package main
import (
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/prometheus/common/log"
)
type myCollector struct {
metric *prometheus.Desc
}
func (c *myCollector) Describe(ch chan<- *prometheus.Desc) {
ch <- c.metric
}
func (c *myCollector) Collect(ch chan<- prometheus.Metric) {
// your logic should be placed here
t := time.Date(2009, time.November, 10, 23, 0, 0, 12345678, time.UTC)
s := prometheus.NewMetricWithTimestamp(t, prometheus.MustNewConstMetric(c.metric, prometheus.CounterValue, 123))
ch <- s
}
func main() {
collector := &myCollector{
metric: prometheus.NewDesc(
"my_metric",
"This is my metric with custom TS",
nil,
nil,
),
}
prometheus.MustRegister(collector)
http.Handle("/metrics", promhttp.Handler())
log.Info("Beginning to serve on port :8080")
http.ListenAndServe(":2112", nil)
}