Prometheus是什么?
Prometheus是一套开源的监控&报警&时间序列数据库的组合。
Prometheus数据模型
Prometheus 从根本上所有的存储都是按时间序列去实现的,每条时间序列是由唯一的 指标名称 和 一组 标签 (key=value)的形式组成。
指标名称
通常代表了监控对象的名称,可以简单理解为数据表的表名
标签
就是对一条时间序列不同维度的识别了,可以简单理解为数据表的字段。
四种指标类型
Counter 计数器
一种累加的 metric,典型的应用如:请求的个数,结束的任务数,出现的错误数等。随着客户端不断请求,数值越来越大。
Gauge 计量器
与Counter不同,Gauge类型的指标侧重于反应系统的当前状态。因此这类指标的样本数据可增可减,比如监控cpu使用率,内存占用等提供了增、减相关的方法.
Histogram 累积直方图
直方图,柱状图。常用于跟踪事件发生(通常是请求持续时间或响应大小)的规模,例如:请求耗时、响应大小。它特别之处是可以对记录的内容进行分组,提供 count 和 sum 全部值的功能。
Summary
跟 histogram 类似,summary 也对观测值(类似请求延迟或回复包大小)进行采样。同时它会给出一个总数以及所有观测值的总和,它在一个滑动的时间窗口上计算可配置的分位数。, 典型的应用如:请求持续时间,响应大小。主要做统计用,设置分位数的值,会实时返回该分位数上的值。
服务端收集监控数据主要有两种方式。
1、Prometheus server直接到client客户端拉取
2、由客户端将metrics推送至push gateway服务,再由prometheus server到push gateway拉取
具体实例:
package main
import (
"github.com/gin-gonic/gin"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
//定义指标
var (
requestHistogram = prometheus.NewHistogramVec(prometheus.HistogramOpts{
Namespace: "http_server",
Subsystem: "",
Name: "requests_seconds",
Help: "Histogram of response latency (seconds) of http handlers.",
ConstLabels: nil,
Buckets: []float64{0, 0.01, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 1, 2, 5, 10},
}, []string{"userId", "requestType"})
)
//注册监控指标
func init() {
prometheus.MustRegister(requestHistogram)
}
func main() {
r := gin.Default()
r.GET("/metrics", gin.WrapH(promhttp.Handler()))
//收集数据
//客户端统计的数据以 userId requestType 两个维度作为唯一建进行统计数据区分的
requestHistogram.With(prometheus.Labels{"userId": "11111", "requestType": "商品详情页"}).Observe(1.0)
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
直接访问: 127.0.0.1:8080/metrics 查看prometheus的数据
直方图详解:
1.什么是 Histogram?
Histogram 会在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中。但这句话还是不太好理解,下面通过具体的示例来说明。
假设我们想监控某个应用在一段时间内的响应时间,最后监控到的样本的响应时间范围为 0s~10s。现在我们将样本的值域划分为不同的区间,即不同的 bucket,每个 bucket 的宽度是 0.2s。那么第一个 bucket 表示响应时间小于等于 0.2s 的请求数量,第二个 bucket 表示响应时间大于 0.2s 小于等于 0.4s 的请求数量,以此类推。
Prometheus 的 histogram 是一种累积直方图,与上面的区间划分方式是有差别的,它的划分方式如下:还假设每个 bucket 的宽度是 0.2s,那么第一个 bucket 表示响应时间小于等于 0.2s 的请求数量,第二个 bucket 表示响应时间小于等于 0.4s 的请求数量,以此类推。也就是说,每一个 bucket 的样本包含了之前所有 bucket 的样本,所以叫累积直方图。
参考:
https://blog.csdn.net/weixin_...
http://www.45fan.com/article....
https://blog.csdn.net/kunyus/...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。