Prometheus是由SoundCloud开发的开源监控系统,由GO语言编写而成,采用Pull的方式来获取监控信息,并且提供了多维度的数据模型和灵活的查询接口。Prometheus既支持通过静态文件配置监控对象,还支持自动发现机制,能通过Kubernetes、Consl、DNS等多种方式动态获取监控对象。
接下来先通过docker-compose搭建一个环境,有需要的同学可以私聊我,如下:
这个是启动之后在本地启动的服务,也是默认的前端,可以在搜索栏中搜索自己上报的指标。
然后就是进行上报了,prometheus 使用的metric然后语法是PromQL的语法。然后基于时间维度进行聚合。
然后metric总共分为四种指标,Counter,Gauge,Histogram,Summary。接下来把这些指标都进行上报,看一下演示的代码:
var httpRequestCount = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_request_count",
Subsystem: "req",
Help: "http request count"},
[]string{"endpoint"})
var httpRequestGauge = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "http_request_gauge",
Subsystem: "req",
Help: "http request gauge"})
var httpRequestHistogram = prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: "http_request_duration_histogram",
Subsystem: "req",
Help: "http request duration",
Buckets: []float64{10, 40, 50, 70, 100},
}, []string{"endpoint"})
var httpRequestDuration = prometheus.NewSummaryVec(
prometheus.SummaryOpts{
Name: "http_request_duration",
Subsystem: "req",
Help: "http request duration",
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.95: 0.005, 0.99: 0.001},
},
[]string{"endpoint"},
)
func init() {
prometheus.MustRegister(httpRequestCount)
prometheus.MustRegister(httpRequestGauge)
prometheus.MustRegister(httpRequestDuration)
prometheus.MustRegister(httpRequestHistogram)
}
func main() {
http.Handle("/metrics", promhttp.Handler())
http.HandleFunc("/request", request)
http.HandleFunc("/request1", request1)
fmt.Println("服务器启动 :9101")
err := http.ListenAndServe(":9101", nil)
if err != nil {
fmt.Println(err)
}
}
func request(w http.ResponseWriter, r *http.Request) {
httpRequestCount.With(map[string]string{"endpoint": r.URL.Path}).Inc()
start := time.Now()
n := rand.Intn(100)
if n >= 90 {
httpRequestGauge.Dec()
time.Sleep(100 * time.Millisecond)
} else {
httpRequestGauge.Inc()
time.Sleep(50 * time.Millisecond)
}
elapsed := (float64)(time.Since(start) / time.Millisecond)
httpRequestDuration.WithLabelValues(r.URL.Path).Observe(elapsed)
httpRequestHistogram.WithLabelValues(r.URL.Path).Observe(elapsed)
w.Write([]byte("ok"))
}
func request1(w http.ResponseWriter, r *http.Request) {
httpRequestCount.With(map[string]string{"endpoint": r.URL.Path}).Inc()
start := time.Now()
n := rand.Intn(100)
if n >= 90 {
httpRequestGauge.Dec()
time.Sleep(100 * time.Millisecond)
} else {
httpRequestGauge.Inc()
time.Sleep(50 * time.Millisecond)
}
elapsed := (float64)(time.Since(start) / time.Millisecond)
httpRequestDuration.WithLabelValues(r.URL.Path).Observe(elapsed)
httpRequestHistogram.WithLabelValues(r.URL.Path).Observe(elapsed)
w.Write([]byte("ok"))
}
这里监听了2个路由,分别是request和request1这两个路由,然后每个指标都会上报四种指标,分别是httpRequestCount,httpRequestGauge,httpRequestHistogram,httpRequestDuration,然后对应的metric的指标分别是Count,Gauge,Histogram,Summary。
请求几次看看这个效果。
注意第一个是时间分配图,然后第二个是具体的打点分布图,然后取的是当前的时间也就是选中的时间的点。然后endpoint=“/request”,env=“test”,instance=“127.0.0.1:9101”,job=“metrics”,endpoint是请求的路由,后面的分别是在启动prometheus中指定的参数,如下
因为counte是增长,不会降低,看一下counter的常规用法,需要配合函数一起使用。先简单介绍一下几个相关的函数
rate函数是计算一定范围方向内容内的平均增长率,对应的该时间范围内第一个和最后一个点。看个例子,取5分钟的数据,如下,
第一个点是22,最后一个点是30,那么平均增长率=(30-22)%30 =0.0266666。然后看一下结果
然后因为时间和精度问题有一点差距,但是总体是对的上的。
rate可以反应一段时间的平均增长率,但是对于方差过大的数据,存在被平均的情况,比如对于5分钟内的点,第一分钟和第五分钟的这两个点,分别是1,100,那么就会被平均下去,那么irate就登场了。
irate计算范围向量中时间序列的每秒瞬时增加率。这基于最后两个数据点。还是一样举个例子。
可以看出来irate在14:09:26的irate的点是1对应下面,然后对应的值最近的两个点,分别是图二的103和图三的101,平均下就是1了。
increase计算的是一段时间内的差值,例如接下来是increase的值是20如下面图一,然后在15分钟的第一个点107,然后第二个是127,对应的值就20
这个是可以增加或者减少,和counter相比就是可以减少。
往往计算动态变化的,例如温度变化、内存使用变化。
这个是柱状图,可以分析当前值的分布图。我们这边上面的代码分为了10, 40, 50, 70, 100这四个桶。然后histogram分为了_bucket,记录的是每个桶里面的值,_sum所有的值的和,_count所有值的数量。
下面的分为别是记录了bucket,sum,count对应的图。
然后看一下经常所有的99线的语法,一般就是请求耗时。如下因为手动请求样本较少,使用了90线.这个如果就是取的样本就是90%的值是多少
summary其实有点类似上面的histogram_quantile函数,可以在生成指标的时候指定默认分位数。也就是指定不同的分位所对应的值,举个例子,如图,在这张图中50%的值小于53,90%小于104等等。