Prometheus 四大度量指标和应用

2020-07-16  本文已影响0人  会理发的店小二

Prometheus 四大度量指标和应用

一. 四大度量指标

1. Counter (计数器)

方法名 作用
Inc 将计数器递增1
Add (float64) 将给定添加计数器中,小于0报错

2. Gauge (仪表盘)

Gauge 类型代表一个可以任意变化的指标数据,其可增可减。在应用场景中,像是 Go 应用程序运行时的 Goroutine 的数量就可以用该类型来表示,在系统中统计 CPU、Memory 等等时很常见,而在业务场景中,业务队列的数量也可以用 Gauge 来统计,实时观察队列数量,及时发现堆积情况,因为其是浮动的数值,并非固定的,侧重于反馈当前的情况

方法名 作用
Set(float64) 将仪表设置为任意值
Inc() 将仪表增加 1
Dec() 将仪表减少 1
Add(float64) 将给定值添加到仪表,该值如果为负数,那么将导致仪表值减少
Sub(float64) 从仪表中减去给定值,该值如果为负数,那么将导致仪表值增加
SetToCurrentTime() 将仪表设置为当前Unix时间(以秒为单位)

3. Histogram(累积直方图)

Histogram 类型将会在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等等),并将其计入可配置的存储桶(bucket)中,后续可通过指定区间筛选样本,也可以统计样本总数。

Histogram 类型在应用场景中非常的常用,因为其代表的就是分组区间的统计,而在分布式场景盛行的现在,链路追踪系统是必不可少的,那么针对不同的链路的分析统计就非常的有必要,例如像是对 RPC、SQL、HTTP、Redis 的 P90、P95、P99 进行计算统计,并且更进一步的做告警,就能够及时的发现应用链路缓慢,进而发现和减少第三方系统的影响。

方法名 作用
Observe(float64) 将一个观察值添加到直方图。

4. Summary(摘要)

Summary 类型将会在一段时间范围内对数据进行采样,但是与 Histogram 类型不同的是 Summary 类型将会存储分位数(在客户端进行计算),而不像 Histogram 类型,根据所设置的区间情况统计存储。提供三种摘要指标: 样本值的分位数分布情况,所有样本值的大小总和,样本总数

方法名 作用
Observe(float64) 将一个观察值添加到直方图。

二.实战

package main

import (
    "github.com/gin-gonic/gin"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
    "math/rand"
    "net/http"
    "net/url"
    "strconv"
)

var AccessCounter = prometheus.NewCounterVec(
    prometheus.CounterOpts{
        Name: "api_requests_tatol",
    },
    []string{"method", "path"},
)

var QueueGauge = prometheus.NewGaugeVec(
    prometheus.GaugeOpts{
        Name: "queue_num_total",
    },
    []string{"name"},
)

var HttpHistogram = prometheus.NewHistogramVec(
    prometheus.HistogramOpts{
        Name: "http_durations_histogram_seconds",
        Buckets: []float64{0.2, 0.5, 1, 2, 5, 10, 30},
    },
    []string{"path"},
    )
var HttpDurations = prometheus.NewSummaryVec(
    prometheus.SummaryOpts{
        Name:       "http_durations_seconds",
        Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
    },
    []string{"path"},
)



func init() {
    prometheus.MustRegister(AccessCounter,QueueGauge,HttpHistogram,HttpDurations)
}

func main() {

    r := gin.Default()
    // counter 计数器
    r.GET("/counter", func(context *gin.Context) {
        url, _ := url.Parse(context.Request.RequestURI)
        AccessCounter.With(prometheus.Labels{
            "method": context.Request.Method,
            "path":   url.Path,
        }).Add(1)
        context.JSON(http.StatusOK, gin.H{"status": "ok"})
    })

    // queue_eddycjy 仪表盘
    r.GET("/queue", func(context *gin.Context) {
        numStr := context.Query("num")
        num,_ := strconv.Atoi(numStr)

        QueueGauge.With(prometheus.Labels{
            "name":"queue_eddycjy",
        }).Set(float64(num))
        context.JSON(http.StatusOK, gin.H{"status": "ok"})
    })

    // http_durations_histogram_seconds 累积直方图
    r.GET("/histogram", func(c *gin.Context) {
        url,_ := url.Parse(c.Request.RequestURI)
        HttpHistogram.With(prometheus.Labels{
            "path":url.Path,
        }).Observe(float64(rand.Intn(30)))
        c.JSON(http.StatusOK, gin.H{"status": "ok"})
    })

    // summary 摘要
    r.GET("/summary", func(c *gin.Context) {
        purl, _ := url.Parse(c.Request.RequestURI)
        HttpDurations.With(prometheus.Labels{"path": purl.Path}).Observe(float64(rand.Intn(30)))
    })

    r.GET("/metrics", gin.WrapH(promhttp.Handler()))

    r.Run()
}

三.简单展示一下

简单是展示配合grafanahttp_durations_histogram_seconds_bucket的效果

image.png
上一篇 下一篇

猜你喜欢

热点阅读