-
Notifications
You must be signed in to change notification settings - Fork 1
Prometheus Learning Doc
[TOC]
启用新的实验标志,该标志将启用度量标准功能并定义要在localhost:9323上侦听的度量标准地址。
更新用于启动Docker的systemd配置
echo '{ "metrics-addr" : "127.0.0.1:9323", "experimental" : true }' > /etc/docker/daemon.json systemctl restart docke
指标以Prometheus格式输出,旨在由Prometheus服务器抓取,该服务器将在接下来的步骤中启动。
Prometheus服务器需要一个配置文件,该文件定义要扫描的端点以及访问度量的频率。
global:#间隔 scrape_interval: 15s evaluation_interval: 15s
scrape_configs:#服务器和端口
-空格 job_name: 'prometheus'
static_configs:
-空格targets: ['127.0.0.1:9090', '127.0.0.1:9100', '127.0.0.1:9323'] labels: group: 'prometheus'
#9090是普罗米修斯本身。Prometheus公开与其内部指标和绩效相关的信息。
9100是Node Exporter Prometheus进程。这会公开有关节点的信息,例如磁盘空间,内存和CPU使用情况。
9323是刚公开的Docker Metrics端口。这将报告来自Docker Engine的信息。
Docker Metrics端点将返回与Docker相关的信息。要在Docker主机上收集指标,需要运行Prometheus节点导出程序。
启动Node Exporter容器。通过挂载host / proc和/ sys目录,容器已访问必要的信息以进行报告。
docker run -d
-v "/proc:/host/proc"
-v "/sys:/host/sys"
-v "/:/rootfs"
--net="host"
--name=prometheus
quay.io/prometheus/node-exporter:v0.13.0
-collector.procfs /host/proc
-collector.sysfs /host/sys
-collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
- 多维度数据模型。
- PromQL
- 服务器节点是自主
- 基于HTTP的pull方式采集时序数据
- Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
- Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
- Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
- 在图形界面中,可视化采集数据。
基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。
对监控数据的获取,存储以及查询。 Prometheus Server本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中
端点通过HTTP服务的形式暴露给Prometheus Server
直接采集:有暴露的端点
间接采集:间接采集,原有监控目标并不直接支持Prometheus,因此我们需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如: Mysql Exporter,JMX Exporter,Consul Exporter等。
告警处理中心
Alertmanager组件用于处理由Prometheus产生的告警。Alertmanager即Prometheus体系中告警的统一处理中心。Alertmanager提供了多种内置第三方告警通知方式,同时还提供了对Webhook通知的支持,通过Webhook用户可以完成对告警更多个性化的扩展。
可自定义告警。
中转用
时间序列time-series
每一个点称为一个样本(sample),样本由以下三部分组成:
-
指标(metric):metric name和描述当前样本特征的labelsets;
< metric name >{< label name>=< label value>, ...}
在Prometheus源码中也可以指标(Metric)对应的数据结构
-
时间戳(timestamp):一个精确到毫秒的时间戳;
-
样本值(value): 一个folat64的浮点型数据表示当前样本的值。
<--------------- metric ---------------------> <-timestamp -> <-value->
http_request_total{status="200", method="GET"}@1434417560938 => 94355
在Prometheus源码中指标(Metric)对应的数据结构:
type Metric LabelSet
type LabelSet map[LabelName]LabelValue
type LabelName string
type LabelValue string
Prometheus的Client Library提供度量的四种基本类型包括:Counter,Gauge,Histogram,Summary。
在Prometheus的存储实现上所有的监控样本都是以time-series的形式保存在Prometheus内存的TSDB(时序数据库)中,而time-series所对应的监控指标(metric)也是通过labelset进行唯一命名的。
在4.2.1中同样也有相关内容。
统计类似于:CPU时间,API访问总次数,异常发生次数等等场景。这些指标的特点就是增加不减少。
http_requests_total
node_cpu
*_total
**increase(v range-vector)**其中参数v是一个区间向量,increase函数获取区间向量中的第一个后最后一个样本并返回其增长量。
**rate(v range-vector)**函数,rate函数可以直接计算区间向量v在时间窗口内平均增长速率
**irate(v range-vector)**同样用于计算区间向量的计算率,但是其反应出的是瞬时增长率。,为了解决“长尾问题”
可增可减 例内存使用率,当前CPU使用率,当前温度,当前速度
node_memory_MemFree
delta() 可以获取样本在一段时间返回内的变化情况。
deriv() 计算样本的线性回归模型,甚至是直接使用predict_linear()对数据的变化趋势进行预测
**predict_linear(v range-vector, t scalar)**可以预测时间序列v在t秒后的值。它基于简单线性回归的方式,对时间窗口内的样本数据进行统计,从而可以对时间序列的变化趋势做出预测。
状图图,更多的是用于统计一些数据分布的情况
一段时间内总量
为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在010ms之间的请求数有多少而1020ms之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram和Summary都是为了能够解决这样问题的存在,通过Histogram和Summary类型的监控指标,我们可以快速了解监控样本的分布情况。
-
直接搜metric name
-
label= or laber!= 完全匹配
-
|正则表达式 正则匹配
使用
label=~regx
表示选择那些标签符合正则表达式定义的时间序列;反之使用
label!~regx
进行排除; -
时间范围通过时间范围选择器
[]
进行定义 -
位移操作的关键字为offse
http_request_total{}[1d] offset 1d
合法
包含一个指标名称 或者 不会匹配到空字符串的标签过滤器(例如{code="200"})
可__name__
标签来指定监控指标名称
+
(加法)
-
(减法)
*
(乘法)
/
(除法)
%
(求余)
^
(幂运算)
==
(相等)
!=
(不相等)
>
(大于)
<
(小于)
>=
(大于等于)
<=
(小于等于)
and
(并且)
or
(或者)
unless
(排除)
两个标量之间使用布尔运算,则必须使用bool修饰符
使用bool修改符后,布尔运算不会对时间序列进行过滤,而是直接依次瞬时向量中的各个样本数据与标量的比较结果0或者1。从而形成一条新的时间序列。
优先级:
^
*, /, %
+, -
==, !=, <=, <, >=, >
and, unless
or
sum
(求和)
min
(最小值)
max
(最大值)
avg
(平均值)
stddev
(标准差)
stdvar
(标准差异)
count
(计数)
count_values
(对value进行计数)
bottomk
(后n条时序)
topk
(前n条时序)
quantile
(分布统计)
without用于从计算结果中移除列举的标签,而保留其它标签
by则正好相反,结果向量中只保留列出的标签,其余标签则移除。
Exporter的一个实例称为target,Prometheus通过轮询的方式定期从这些target中获取样本数据
Exporter返回的样本数据,主要由三个部分组成:样本的一般注释信息(HELP),样本的类型注释信息(TYPE)和样本
是Prometheus针对JVM类开发语言的client library库
-
收集器需要实现collect()方法并返回一组监控样本
定义监控指标
-
client_java下的simpleclient_httpserver模块实现了一个简单的HTTP服务器,当向该服务器发送获取样本数据的请求后,它会自动调用所有Collector的collect()方法,并将所有样本数据转换为Prometheus要求的数据输出格式规范。
调用Collector的register()然后启动一个HTTPServer实例
在client_java中除了使用Collector直接采集样本数据以外,还直接提供了对Prometheus中4种监控类型的实现分别是:Counter、Gauge、Summary和Histogram。
依赖可以用Gradle也可以用Maven(文档中是用gradle)
-
@EnablePrometheusEndpoint在启动类中加载
-
application中的配置,endpoint配置进行修改(暴露这个endpoint),Prometheus:
static_configs: - targets: - 127.0.0.1:8080 #此处填写 Spring Boot 应用的 IP + 端口号
-
启动应用程序访问http://localhost:8080/metrics或号密码访问http://localhost:8080/application/prometheus 看到 Prometheus 格式的指标数据
使用Prometheus提供的Counter,Summary,Gauage等构造监控指标
-
先添加拦截器
拦截器是啥: SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间。
-
用client java自定义多种监控指标
-
计数器:记录只会增加不会减少。一般而言,Counter类型的metrics指标在命名中我们使用_total结束.程序重启的时候会被重设为0
Counter.build()创建Counter类型的监控指标
name()方法定义监控指标的名称
labelNames()定义该指标包含的标签
register()将该指标注册到Collector的defaultRegistry中
-
Gauge: 反映应用的当前状态
-
Histogram主要用于在指定分布范围内(Buckets)记录大小(如http request bytes)或者事件发生的次数。
会自动创建3个指标:
事件发生总次数: basename_count
所有事件产生值的大小的总和: basename_sum
事件产生的值分布在bucket中的次数: basename_bucket{le="上包含"}
-
Summary:统计事件发生的次数或者发小,以及其分布情况。
可以通过histogram_quantile函数在服务器端计算分位数,而Sumamry的分位数则是直接在客户端进行定义。
会自动创建多个时间序列:
事件发生总的次数
事件产生的值的总和
事件产生的值的分布情况
-
通过自定义的Collector实现对相关业务指标的暴露。例如,我们可以通过自定义Collector直接从应用程序的数据库中统计监控指标
-
启动类@EnablePrometheusEndpoint
-
启动类一个private的CustomExporter,在调用Collector的register()方法后,当访问/metrics时,则会自动从Collector的collection()方法中获取采集到的监控指标。
@Component中写CustomExporter extends Collector
- 创建metrics指标
- 设置指标的label以及value
也可以使用CounterMetricFamily,SummaryMetricFamily声明其它的指标类型。