• 【prometheus上报和使用】


    prometheus

    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"))
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    这里监听了2个路由,分别是request和request1这两个路由,然后每个指标都会上报四种指标,分别是httpRequestCount,httpRequestGauge,httpRequestHistogram,httpRequestDuration,然后对应的metric的指标分别是Count,Gauge,Histogram,Summary。

    Count

    请求几次看看这个效果。
    在这里插入图片描述
    在这里插入图片描述
    注意第一个是时间分配图,然后第二个是具体的打点分布图,然后取的是当前的时间也就是选中的时间的点。然后endpoint=“/request”,env=“test”,instance=“127.0.0.1:9101”,job=“metrics”,endpoint是请求的路由,后面的分别是在启动prometheus中指定的参数,如下在这里插入图片描述
    因为counte是增长,不会降低,看一下counter的常规用法,需要配合函数一起使用。先简单介绍一下几个相关的函数

    rate

    rate函数是计算一定范围方向内容内的平均增长率,对应的该时间范围内第一个和最后一个点。看个例子,取5分钟的数据,如下,在这里插入图片描述
    在这里插入图片描述
    第一个点是22,最后一个点是30,那么平均增长率=(30-22)%30 =0.0266666。然后看一下结果
    在这里插入图片描述
    然后因为时间和精度问题有一点差距,但是总体是对的上的。

    irate

    rate可以反应一段时间的平均增长率,但是对于方差过大的数据,存在被平均的情况,比如对于5分钟内的点,第一分钟和第五分钟的这两个点,分别是1,100,那么就会被平均下去,那么irate就登场了。
    irate计算范围向量中时间序列的每秒瞬时增加率。这基于最后两个数据点。还是一样举个例子。
    可以看出来irate在14:09:26的irate的点是1对应下面,然后对应的值最近的两个点,分别是图二的103和图三的101,平均下就是1了。
    图一

    图二
    图三

    increase

    increase计算的是一段时间内的差值,例如接下来是increase的值是20如下面图一,然后在15分钟的第一个点107,然后第二个是127,对应的值就20
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    Gauge

    这个是可以增加或者减少,和counter相比就是可以减少。
    往往计算动态变化的,例如温度变化、内存使用变化。

    histogram

    这个是柱状图,可以分析当前值的分布图。我们这边上面的代码分为了10, 40, 50, 70, 100这四个桶。然后histogram分为了_bucket,记录的是每个桶里面的值,_sum所有的值的和,_count所有值的数量。
    下面的分为别是记录了bucket,sum,count对应的图。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    分位线

    然后看一下经常所有的99线的语法,一般就是请求耗时。如下因为手动请求样本较少,使用了90线.这个如果就是取的样本就是90%的值是多少
    在这里插入图片描述

    summary

    summary其实有点类似上面的histogram_quantile函数,可以在生成指标的时候指定默认分位数。也就是指定不同的分位所对应的值,举个例子,如图,在这张图中50%的值小于53,90%小于104等等。
    在这里插入图片描述

  • 相关阅读:
    【操作系统】操作系统课后作业-聊天程序
    WebAPI文档与自动化测试
    linux常见环境安装
    Java的日期与时间之如何计算业务代码的运行时间呢?
    垃圾收集器
    【Kotlin基础系列】第1章 简介
    iptables
    C++(四)
    有哪些不为人知的安全运维小技巧?
    C语言运算符优先级一览表
  • 原文地址:https://blog.csdn.net/qq_37674060/article/details/127955106