浅谈prometheus(普罗米修斯) client golang

本文深入探讨Prometheus client golang,包括counter、gauge、histogram和summary四种类型,详细解释它们的接口和使用场景。通过示例展示了如何安全地操作这些类型,并提供了一些实用技巧,如利用promauto简化注册过程和使用Histogram、Summary的分位数分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅谈prometheus client golang

含类型精讲+接口示例+源码节选

Prometheus:

prometheus是什么,网上已经有很多文章了,prometheus的部署和启动可以参照这个链接。prometheus为使用者提供了http接口,使用者可以使用PromQl通过get或post来从prometheus进行queryprometheus http api传送
示例:
example

命名规则

https://github.com/prometheus/common/blob/master/model/metric.go定义了prometheus metric的命名规则,即只能为大小写字母,数字,’_’,’:’,并且名字不能为空string,其他的字符均不可出现

    func IsValidMetricName(n LabelValue) bool {
   
        if len(n) == 0 {
   
            return false
        }
        for i, b := range n {
   
            if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0)) {
   
                return false
            }
        }
        return true
    }  

Client golang四种类型:

counter

计数器,并且只能增长和重置。例如:一个网站的总访问量,机器的运行时长

gauge

测量值,或瞬时记录值,可以增加,也可以减少。例如:一个视频的同时观看人数,当前运行的进程数

histogram

  • 直方图,一个histogram会生成三个指标,分别是_count,_sum,_bucket。暂时为了好理解,先把_sum指标理解为Gauge,然后_count指标就是对Gauge值修改的总次数,而_bucket指标分成了几个桶子,把每次修改的值放进桶子里,不过会把值分几个层次,进入不同的桶,每个桶子里面的个数,就是直方图的纵坐标(实际情况是这个桶之前所有桶里面的个数是这个桶的纵坐标),而桶子的划分条件,就是横坐标。
  • 举个铁球做例子,我们一共有1000个大小不同的铁球,质量从1kg-100kg不等,假设我分5个桶,每个桶存储不同质量的铁球,第一个桶0-20kg,第二个20-40kg,后面依此。然后1000个铁球,就是histogram的count,而1000个铁球的总质量就是histogram的sum,那么bucket就是那五个桶,当然几个桶,桶的规则怎样都是可以设计的,这五个桶每个的0-20,20-40…就是横坐标,而每个桶中的个数,就是纵坐标。根据这些数据就可以形成一个直方图。
  • 因为直方图能够分出数据的质量,所以应用直方图的例子如:页面的响应时间,一块业务代码的时延
  • 一个不错的例子:传送门
  • 刚接触的可能会懵懵的,不过不太复杂,建议多去实践一下。

summary

  • 概要,summary和histogram类似也会产生三个指标,分别是_count,_sum,和{quantile} ,count和sum与histogram的概念相同,quantile的含义是分位数,我们都知道中位数,那么中位数其实就是一个五分quantile,而summary可以在定义时指定很多分位数,如五分数,九分数,九九分数。九分数的概念就是比这个数小的数占百分之九十。
  • summary和histogram类似也可以用来描述页面响应时间这类型的值,但差别是,histogram可以很容易看出来长尾值,比如投票很多时候都是去掉一个最高分,去掉一个最低分这种,长尾值就是很影响平均数的值,所有直方图能够很容易分析出问题数据。 而summary更能发现百分之多少的页面响应时间是多少,更能分析出页面响应时间的总体情况。

比较

  • summary和histogram都很容易看出平均数(即_sum/_count),但是histogram容易发现影响平均数的极端值,而histogram可以直接得到分位数,两种结构可以由开发者根据数据需求自行抉择。
  • histogram由clinet go直接算出分位数,而summary虽然可以算出分位数,但是更多是由开发者计算,或者调用prometheus的api获取histogram的分位数,prometheus处理函数传送门

四种类型的接口(go):

下面图片可传送:

Counter

counter.Inc(), counter.Add(123)
counter

Gauge

gauge.Set(), gauge.Inc(), gauge.Dec(), gauge.Add(123) , gauge.Sub(321)
gauge

Histogram

histogram.Observer(123)//添加此数据到此histogram实例(使其观察)
histogram

Summary

summary.Observer(123)
summary

共有接口

    type Metric interface {
        //获取此metric的描述
        Desc() *Desc
        //转化为proto格式的Metric,返回
        Write(*dto.Metric) error //dto "github.com/prometheus/client_model/go"
    }

四种类型使用:

client golang的代码均是安全的,使用了sync库下的读写锁和CAS原子操作

    package main
    //不是伪代码,可以直接go run

    import (
        "net/http"
		"time"
		"log"
		"math"
        "github.com/prometheus/client_golang/prometheus"
        "github.com/prometheus/client_golang/prometheus/promhttp"
    )

    var (
        MyTestCounter = prometheus.NewCounter(prometheus.CounterOpts{
   
                                        //因为Name不可以重复,所以建议规则为:"部门名_业务名_模块名_标量名_类型"
            Name: "my_test_counter",	//唯一id,不可重复Register(),可以Unregister()
            Help: "my test counter",	//对此Counter的描述
		})
		MyTestGauge = prometheus.NewGauge(prometheus.GaugeOpts{
   
			Name: "my_test_gauge",
			Help: "my test gauge",
		})
		MyTestHistogram = prometheus.NewHistogram(prometheus.HistogramOpts{<
Prometheus Client 是一个用于监控和度量的开源工具集,而 Prometheus Client GolangPrometheus 官方提供的 Golang 版本的客户端库。允许 Golang 应用程序暴露指标(metrics)并将其暴露给 Prometheus 服务器进行收集和分析。 使用 Prometheus Client Golang,你可以在你的 Golang 应用程序中定义和注册自定义指标,并且通过 HTTP 接口将指标暴露给 Prometheus 服务器。这样,你就可以使用 Prometheus 的强大功能来监控和可视化你的应用程序的性能指标、错误率、资源使用情况等。 要使用 Prometheus Client Golang,你需要导入 `github.com/prometheus/client_golang/prometheus` 包并使用其中的函数和结构体来定义和注册指标。然后,在你的应用程序中,可以通过适当的接口将指标暴露给 Prometheus 服务器。 以下是一个简单的示例,展示了如何在 Golang 应用程序中使用 Prometheus Client Golang: ```go package main import ( "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) func main() { // 创建一个新的 Counter 指标 counter := prometheus.NewCounter(prometheus.CounterOpts{ Name: "my_counter", Help: "A simple counter", }) // 注册指标 prometheus.MustRegister(counter) // 增加指标值 counter.Inc() // 创建一个 HTTP 处理程序来暴露指标 http.Handle("/metrics", promhttp.Handler()) // 启动 HTTP 服务器 http.ListenAndServe(":8080", nil) } ``` 在上面的示例中,我们首先创建了一个名为 `my_counter` 的 Counter 指标。然后,我们注册这个指标,并通过 `Inc()` 方法增加其值。接下来,我们创建了一个 HTTP 处理程序来暴露指标,并将其绑定到 `/metrics` 路径上。最后,我们启动了一个 HTTP 服务器来监听端口 8080,并通过该端口暴露指标给 Prometheus。 通过运行上面的代码,你可以在浏览器中访问 `http://localhost:8080/metrics` 查看 Prometheus 格式的指标数据。这些数据可以被 Prometheus 服务器抓取并进行监控和分析。 希望这个简单示例能帮助你了解如何在 Golang 应用程序中使用 Prometheus Client Golang。有关更多详细信息和更高级的用法,请参考 Prometheus Client Golang 的官方文档。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值