介绍

Prometheus 支持 4 种 指标类型,分别是 Counter、Gauge、Histogram 和 Summary。

Counter 指标类型,指标值是只能递增,不能递减的数值。需要注意的是,当 Prometheus server 重启时,指标值会被重置为 0。该指标类型可用于统计接口的请求数、错误数等使用场景。

Gauge 指标类型,指标值是可增可减的数值。该指标类型可用于统计 CPU、内存和硬盘的使用情况,goroutine 的数量等使用场景。

Histogram 指标类型,指标值基于桶分布。开发者可以自定义桶的区间。该指标类型可用于统计接口的延时请求数等使用场景。

Summary 指标类型,与 Histogram 类似,区别是 Histogram 直接统计了不同区间中的指标数值,而 Summary 是基于客户端级别,因此不能统计多个实例的聚合数据。该指标类型可用于预先不知道指标桶划分区间的场景。

使用方式

一般在实际应用场景中,通常一个指标需要对应多条时序数据(Label Name 为维度),此时就需要使用支持标签的指标类型。

Prometheus 有 4 种支持标签的指标类型,分别是 ConterVec、GaugeVec、HistogramVec、SummaryVec。

CounterVec

CounterVec 与 Counter 的区别是,它支持 Label,我们可以按照 Lable 维度,将同一个指标的数据按照 Lable 分组统计。例如,同一个 Api 接口的请求数,我们可以定义 Lable (Code、Method),按照状态码和 HTTP 请求方式,分组统计同一个 Api 接口的请求数。

示例代码:

var (
// 标签名
labelNames = []string{"host", "code", "path", "method"}
// HttpReqs 实例化 CounterVec
HttpReqs *prometheus.CounterVec = prometheus.NewCounterVec(prometheus.CounterOpts{
Name: "http_requests_total",
Help: "How many HTTP requests processed, partitioned by status code and HTTP method.",
},
labelNames,
)
)

阅读上面这段代码,我们使用了 NewCounterVec 创建一个实例,它支持多个方法,我们可以使用其中一个性能相对较高的方法 WithLabelValues,返回一个 Counter

func Metrics() gin.HandlerFunc {
return func(c *gin.Context) {
c.Next()
host := c.RemoteIP()
code := fmt.Sprintf("%d", c.Writer.Status())
method := c.Request.Method
labelsByHttpReqs := []string{host, code, c.FullPath(), method}
prometheus_metrics.HttpReqs.WithLabelValues(labelsByHttpReqs...).Inc()
}
}

Counter 支持两个方法,分别是 Inc()Add(),其中 Inc()Counter 增加 1,Add()Counter 增加给定值,需要注意的是,给定值必须为非负值,否则会引发 panic

需要注意的是,在我们创建指标之后,还需要使用 Register() 接口的 Register() 方法,注册之后才可以被收集到指标数据。如果需要注册多个指标,可以使用 MustRegister() 方法。

示例代码:

reg := prometheus.NewRegistry()
reg.MustRegister(prometheus_metrics.HttpReqs, prometheus_metrics.OpsQueued, prometheus_metrics.Latencies, prometheus_metrics.Temps)

GaugeVec

GaugeVec 与 Gauge 的区别是,它支持 Label,我们可以按照 Lable 维度,将同一个指标的数据按照 Lable 分组统计。

示例代码:

var (
labelNamesByOpsQueued = []string{
"user",
"type",
}
OpsQueued = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "ops_queued",
Help: "Number of blob storage operations waiting to be processed, partitioned by user and type.",
},
labelNamesByOpsQueued,
)
)

阅读上面这段代码,我们使用了 NewGaugeVec 创建实例。

HistogramVec

HistogramVec 与 Histogram 的区别是,它支持 Label,我们可以按照 Lable 维度,将同一个指标的数据按照 Lable 分组统计。

示例代码:

var (
labelNamesByLatencies = []string{"method", "code"}
Latencies = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Tracks the latencies for HTTP requests.",
Buckets: []float64{0.99, 0.9, 0.5},
},
labelNamesByLatencies,
)
)

SummaryVec

SummaryVec 与 Summary 的区别是,它支持 Label,我们可以按照 Lable 维度,将同一个指标的数据按照 Lable 分组统计。

示例代码:

var (
labelNamesByTemps = []string{"species"}
Temps = prometheus.NewSummaryVec(
prometheus.SummaryOpts{
Name: "pond_temperature_celsius",
Help: "The temperature of the frog pond.",
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
},
labelNamesByTemps,
)
)

阅读上面这段代码,使用了 NewSummaryVec 创建实例。

总结

本文主要介绍 4 种指标类型的含义,通过 Label 可以将 4 种类型的指标数据,按照 Label 的维度分组统计,我们以支持 Label 的 CounterVec 为例,介绍了它的使用方式,其余 3 种支持 Label 的指标也提供了简单的使用示例。

Prometheus Go client library 详解的更多相关文章

  1. Memcached Java Client API详解

    针对Memcached官方网站提供的java_memcached-release_2.0.1版本进行阅读分析,Memcached Java客户端lib库主要提供的调用类是SockIOPool和MemC ...

  2. CGLIB(Code Generation Library)详解

    什么是CGLIB CGLIB是一个强大的.高性能的代码生成库.其被广泛应用于AOP框架(Spring.dynaop)中,用以提供方法拦截操作.Hibernate作为一个比较受欢迎的ORM框架,同样使用 ...

  3. Prometheus Alertmanager 介绍详解

    Prometheus 之 Alertmanager 介绍详解 告警无疑是监控中非常重要的环节,虽然监控数据可视化了,也非常容易观察到运行状态.但我们很难做到时刻盯着监控,所以程序来帮巡检并自动告警,这 ...

  4. prometheus学习系列十一: Prometheus exporter详解

    exporter详解 前面的系列中,我们在主机上面安装了node_exporter程序,该程序对外暴露一个用于获取当前监控样本数据的http的访问地址, 这个的一个程序成为exporter,Expor ...

  5. Prometheus+Grafana+Alertmanager实现告警推送教程 ----- 图文详解

    前言 本文主要介绍的是Prometheus采集数据,通过Grafana加上PromQL语句实现数据可视化以及通过Alertmanage实现告警推送功能.温馨提示,本篇文章特长,2w多的文字加上几十张图 ...

  6. Android Design Support Library使用详解

    Android Design Support Library使用详解 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的And ...

  7. js的client、scroll、offset详解与兼容性

    clientWidth:可视区宽说明:样式宽+padding参考:js的client详解 scrollTop : 滚动条滚动距离说明:chrome下他会以为滚动条是文档元素的,所以需要做兼容:var ...

  8. Oracle内存详解之 Library cache 库缓冲

    Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...

  9. 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解)

    不多说,直接上干货! 环境: windows10系统(64位) 最好先安装jre或jdk(此软件用来打开oracle自带的可视化操作界面,不装也没关系:可以安装plsql,或者直接用命令行操作) Or ...

  10. 全网最详细的Windows系统里Oracle 11g R2 Client客户端(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cmd— ...

随机推荐

  1. 关于Qt数据库开发的一些冷知识

    一.知识要点 Qt即支持库的形式直接和数据库通信,也支持ODBC数据源的形式和各种数据库通信,这样就涵盖了所有的情况. Qt数据库程序打包发布,所有前提:注意区分32/64位,你的程序是32位的就必须 ...

  2. [转]CMake:相关概念与使用入门

    CMake:相关概念与使用入门(一) CMake:搜索文件和指定头文件目录(三) CMake 子工程添加 根目录中他文件夹里的cpp文件 翻译 搜索 复制

  3. C#HTTP网络编程的一般流程

    1.同步HTTP网络要求 //第1步: 送出要求 string url="https://www.baidu.com/"; HttpWebRequest request = (Ht ...

  4. 一套亿级用户的IM架构技术干货(上篇):整体架构、服务拆分等

    1.引言 经历过稍有些规模的IM系统开发的同行们都有体会,要想实现大规模并发IM(比如亿级用户和数十亿日消息量这样的规模),在架构设计上需要一些额外的考虑,尤其是要解决用户高并发.服务高可用,架构和实 ...

  5. 微信小游戏直播在Android端的跨进程渲染推流实践

    本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...

  6. GRPC-JAVA

    近一年来一直在用公司内wiki进行技术调研以及记录,后期有时间将逐步迁移至博客园 参考资料: https://github.com/grpc/grpc-java https://www.cnblogs ...

  7. 使用Emgu.CV开发视频播放器简述

    OpenCV是大名鼎鼎的视觉处理库,其对应的c#版本为Emgu.CV.本人采用Emgu.CV开发了一款视频播放软件,可对本地视频文件和rstp在线视频流播放,还具有对视频局部区域放大功能.虽然功能比较 ...

  8. 一步一步abp电商模块-1、搭建模块环境

    前言 目前在开发abp电商模块,打算做一步,写一步,算是对自己的记录,主要是参考nopcommoner 并结合abp模块开发 知识都是连贯的,如果你熟悉asp.net core 3.x.abp(非vN ...

  9. w3cschool-Hadoop 教程

    https://www.w3cschool.cn/hadoop/ 铺垫 人产生数据的速度越来越快,机器则更加快,数据的增长速度通常比算法更快,所以需要另外的一种处理数据的方法. 硬盘的容量增加了,但性 ...

  10. 类的内部成员之五:内部类(Person.Bird bird = p.new Bird();)

    /* * 类的内部成员之五:内部类 * 1. Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类 * * 2.内部类的分类:成员内部类(静态.非静态) vs 局部内部类(方法 ...