Skip to content

Prometheus Learning Doc

ash i am edited this page Apr 28, 2019 · 1 revision

Prometheus Learning Doc

[TOC]

1 开始

1.1.导入

1.1.1启用指标

启用新的实验标志,该标志将启用度量标准功能并定义要在localhost:9323上侦听的度量标准地址。

更新用于启动Docker的systemd配置

echo '{ "metrics-addr" : "127.0.0.1:9323", "experimental" : true }' > /etc/docker/daemon.json systemctl restart docke

指标以Prometheus格式输出,旨在由Prometheus服务器抓取,该服务器将在接下来的步骤中启动。

1.1.2.配置

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的信息。

1.1.3.节点导出

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)($|/)"

1.2.特点

  • 多维度数据模型。
  • PromQL
  • 服务器节点是自主
  • 基于HTTP的pull方式采集时序数据

1.3.工作流程

  1. Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
  2. Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
  3. Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
  4. 在图形界面中,可视化采集数据。

基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。

1.4.组件

Prometheus Server

对监控数据的获取,存储以及查询。 Prometheus Server本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中

Exporters

端点通过HTTP服务的形式暴露给Prometheus Server

直接采集:有暴露的端点

间接采集:间接采集,原有监控目标并不直接支持Prometheus,因此我们需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如: Mysql Exporter,JMX Exporter,Consul Exporter等。

AlertManager

告警处理中心

Alertmanager组件用于处理由Prometheus产生的告警。Alertmanager即Prometheus体系中告警的统一处理中心。Alertmanager提供了多种内置第三方告警通知方式,同时还提供了对Webhook通知的支持,通过Webhook用户可以完成对告警更多个性化的扩展。

可自定义告警。

PushGateway

中转用

2 数据模型

时间序列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中同样也有相关内容。

2.1.Counter

统计类似于:CPU时间,API访问总次数,异常发生次数等等场景。这些指标的特点就是增加不减少。

http_requests_total

node_cpu

*_total

**increase(v range-vector)**其中参数v是一个区间向量,increase函数获取区间向量中的第一个后最后一个样本并返回其增长量。

**rate(v range-vector)**函数,rate函数可以直接计算区间向量v在时间窗口内平均增长速率

**irate(v range-vector)**同样用于计算区间向量的计算率,但是其反应出的是瞬时增长率。,为了解决“长尾问题”

2.2.Gauge

可增可减 例内存使用率,当前CPU使用率,当前温度,当前速度

node_memory_MemFree

delta() 可以获取样本在一段时间返回内的变化情况。

deriv() 计算样本的线性回归模型,甚至是直接使用predict_linear()对数据的变化趋势进行预测

**predict_linear(v range-vector, t scalar)**可以预测时间序列v在t秒后的值。它基于简单线性回归的方式,对时间窗口内的样本数据进行统计,从而可以对时间序列的变化趋势做出预测。

2.3.Histogram

状图图,更多的是用于统计一些数据分布的情况

2.4.Summary

一段时间内总量

为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在010ms之间的请求数有多少而1020ms之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram和Summary都是为了能够解决这样问题的存在,通过Histogram和Summary类型的监控指标,我们可以快速了解监控样本的分布情况。

3 PromQL

3.1.简单查询

  • 直接搜metric name

  • label= or laber!= 完全匹配

  • |正则表达式 正则匹配

    使用label=~regx表示选择那些标签符合正则表达式定义的时间序列;

    反之使用label!~regx进行排除;

  • 时间范围通过时间范围选择器[]进行定义

  • 位移操作的关键字为offse

http_request_total{}[1d] offset 1d

合法

包含一个指标名称 或者 不会匹配到空字符串的标签过滤器(例如{code="200"})

__name__标签来指定监控指标名称

3.2.运算符

+ (加法)

- (减法)

* (乘法)

/ (除法)

% (求余)

^ (幂运算)

== (相等)

!= (不相等)

> (大于)

< (小于)

>= (大于等于)

<= (小于等于)

and (并且)

or (或者)

unless (排除)

两个标量之间使用布尔运算,则必须使用bool修饰符

使用bool修改符后,布尔运算不会对时间序列进行过滤,而是直接依次瞬时向量中的各个样本数据与标量的比较结果0或者1。从而形成一条新的时间序列。

优先级:

^
*, /, %
+, -
==, !=, <=, <, >=, >
and, unless
or

3.3.聚合

sum (求和)

min (最小值)

max (最大值)

avg (平均值)

stddev (标准差)

stdvar (标准差异)

count (计数)

count_values (对value进行计数)

bottomk (后n条时序)

topk (前n条时序)

quantile (分布统计)

without用于从计算结果中移除列举的标签,而保留其它标签

by则正好相反,结果向量中只保留列出的标签,其余标签则移除。

4 Exporter

Exporter的一个实例称为target,Prometheus通过轮询的方式定期从这些target中获取样本数据

Exporter返回的样本数据,主要由三个部分组成:样本的一般注释信息(HELP),样本的类型注释信息(TYPE)和样本

使用Java自定义Exporter

https://yunlzheng.gitbook.io/prometheus-book/part-ii-prometheus-jin-jie/exporter/custom_exporter_with_java/client_library_java

4.1.client_java

是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。

4.2.Spring Boot

https://yunlzheng.gitbook.io/prometheus-book/part-ii-prometheus-jin-jie/exporter/custom_exporter_with_java/custom_app_support_prometheus

依赖可以用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 格式的指标数据

4.2.1.自带的监控指标

使用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的分位数则是直接在客户端进行定义。

      会自动创建多个时间序列:

      事件发生总的次数

      事件产生的值的总和

      事件产生的值的分布情况

4.2.2.写Collector自定义其它指标

通过自定义的Collector实现对相关业务指标的暴露。例如,我们可以通过自定义Collector直接从应用程序的数据库中统计监控指标

  • 启动类@EnablePrometheusEndpoint

  • 启动类一个private的CustomExporter,在调用Collector的register()方法后,当访问/metrics时,则会自动从Collector的collection()方法中获取采集到的监控指标

    @Component中写CustomExporter extends Collector

    • 创建metrics指标
    • 设置指标的label以及value

也可以使用CounterMetricFamily,SummaryMetricFamily声明其它的指标类型。