https://blog.csdn.net/luanpeng825485697/article/details/82318204
https://www.cnblogs.com/yangxiaoyi/p/7398156.html
Prometheus 实战
1. 简介
主要功能
- 多维数据模型 (时序由 metric 名字和 k/v 的 labels 构成)
- 灵活的查询语句(PromQL)
- 无依赖存储,支持 local 和 remote 不同模型
- 采用 http 协议,使用 pull 模式,拉取数据,简单易懂
- 监控目标,可以采用服务发现或静态配置的方式
- 支持多种统计数据模型,图形化友好
核心组件
- Prometheus Server 主要用于抓取数据和存储时序数据,另外还提供查询和 Alert Rule 配置管理
- client libraries 用于对接 Prometheus Server,可以查询和上报数据
- push gateway 用于批量,短期的监控数据的汇总节点,主要用于业务数据汇报等
- exporters 各种汇报数据的 exporters ,例如汇报机器数据的 node_exporter等
- alertmanager 用于告警通知管理
基础架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NstOO69d-1617085973407)(C:\Users\Administrator\Desktop\Prometheus\PrometheusArchitecture.png)]
大致逻辑:
- Prometheus Server 定期从静态配置的 targets 或者服务发现的 targets 拉取数据。
- 当新拉取的数据大于配置内存缓存区的时候,Prometheus 会将数据持久化到磁盘(如果使用 remote storage 将持久化到云端)。
- Prometheus 可以配置 rules,然后定时查询数据,当条件触发的时候,会将 alert 推送到配置的 Alertmanager。
- Alertmanager 收到警告的时候,可以根据配置,聚合,去重,降噪,最后发送警告。
- 可以使用 API, Prometheus Console 或者 Grafana 查询和聚合数据。
注意
- Prometheus 的数据是基于时序的 float64 的值,如果你的数据值有更多类型,无法满足。
- Prometheus 不适合做审计计费,因为它的数据是按一定时间采集的,关注的更多是系统的运行瞬时状态以及趋势,即使有少量数据没有采集也能容忍,但是审计计费需要记录每个请求,并且数据长期存储,这个和 Prometheus 无法满足,可能需要采用专门的审计系统。
Docker方式安装
2. 基础概念
- 数据模型
- 时序索引
- 时序样本
- 格式
2.1 数据模型
Promethues 存储的是 时序数据,即按照相同时序(相同的名字和标签),以时间维度存储连续的数据的集合
2.1.1 时序索引
时序(time series) 是由名字(Metric),以及一组 key/value 标签定义的,具有相同的名字以及标签属于相同时序。
时序的名字由 ASCII 字符,数字,下划线,以及冒号组成,它必须满足正则表达式 [a-zA-Z_:][a-zA-Z0-9_:]*
,其名字应该具有语义化,一般表示一个可以度量的指标,例如 http_requests_total
,表示 http 请求的总数。
时序的标签可以使 Prometheus 的数据更加丰富,能够区分具体不同的实例,例如 http_requests_total{method="POST"}
可以表示所有 http 中的 POST 请求。
标签名称由 ASCII 字符,数字,以及下划线组成, 其中 __ 开头属于 Prometheus 保留,标签的值可以是任何 Unicode 字符,支持中文。
2.1.2 时序样本
按照某个时序以时间维度采集的数据,称之为样本,其值包含:
- 一个 float64 值
- 一个毫秒级的 unix 时间戳
2.1.3 格式
<metric name>{<label name>=<label value>, ...}
其中包含时序名字以及时序的标签。
2.2 Metric types
- 时序 4 中类型
- Counter
- Guage
- Histogram
- Summary
- Histogram vs Summary
时序 4 种类型 Prometheus 时序数据分为 Counter 、 Guage、 Histogram、 Summary 四种类型
2.2.1 Counter
Counter 表示收集的数据是按照某个趋势(增加/减少)一直变化的,我们往往用它记录服务请求总量,错误总数等。
2.2.2 Guage
Gauge 表示搜集的数据是一个瞬时的,与时间没有关系,可以任意变高变低,往往可以用来记录内存使用率、磁盘使用率等。
2.2.3 Histogram
Histogram 由<basename>_bucket{le="<upper inclusive bound>"}, <basename>_bucket{le="+Inf"} ,<basename>_sum, <basename>_count
组成,主要用于表示一段时间范围内对数据进行采样,(通常是请求持续时间或响应大小),并能够对其指定区间以及总数进行统计,通常我们用它计算分位数的直方图。
2.2.4 Summary
Summary 和 Histogram 类似,由 <basename>{quantile="<φ>"}, <basename>_sum, <basename>_count
组成,主要用于表示一段时间内数据采样结果,(通常是请求持续时间或响应大小),它直接存储了 quantile 数据,而不是根据统计区间计算出来的。
Histogram vs Summary
- 都包含
<basename>_sum , <basename>_count
- Histogram 需要通过
<basename>_bucket
计算 quantile, 而Summary 直接存储了 quantile 的值。
2.3 作业与实例
2.3.1 作业和实例
prometheus 中,将任意一个独立的数据源(target)称之为实例(instance)。包含相同类型的实例的集合称之为作业(job)。
例:如下是一个含有四个重复实例的作业:
- job: api-server
- instance 1: 1.2.3.4:5670
- instance 2: 1.2.3.4:5671
- instance 3: 5.6.7.8:5670
- instance 4: 5.6.7.8:5671
2.3.2 自生成标签和时序
prometheus 在采集数据的同时,会自动在时序的基础上添加标签,作为数据源(target)的标识,以便区分:
3. PromQL
3.1 PromQL 基本使用
PromQL (Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言,语言表现力非常丰富,内置函数很多,在日常数据可视化,rule 告警中都会使用到它。
-
字符串 在查询语句中,字符串往往作为查询条件 labels 的值,和Golang 字符串语法一致,可以使用
" "
,''
, 或者``
, -
数字 表达式中可以使用正数或浮点数,例如
3 -2.4
3.2 查询结果类型
PromQL 查询结果主要有 3 种类型:
- 瞬时数据 (Instant vector): 包含一组时序,每个时序只有一个点,例如:
http_requests_total
- 区间数据 (Range vector): 包含一组时序,每个时序有多个点,例如:
http_requests_total[5m]
- 纯量数据 (Scalar): 纯量只有一个数字,没有时序,例如:
count(http_requests_total)
3.3 查询条件
一个简单的查询相当于是对各种标签的筛选,例如:
http_requests_total{code="200"} // 表示查询名字为
http_requests_total,code 为 "200" 的数据
查询条件支持正则匹配,例如:
http_requests_total{code!="200"} // 表示查询 code 不为 "200" 的数据
http_requests_total{code=~"2.."} // 表示查询 code 为 "2xx" 的数据
http_requests_total{code!~"2.."} // 表示查询 code 不为 "2xx" 的数据
3.4 操作符
Prometheus 查询语句中,支持常见的各种表达式操作符
-
算术运算符:
+,-,*,/,%,^
例如
http_requests_total *2
表示将http_requests_total
所有数据 double 一倍。 -
比较运算符:
==,!=,>,<,>=,<=
例如
http_requests_total > 100
表示http_requests_total
结果中大于 100 的数据。 -
逻辑运算符
and,or,unless
例如
http_requests_total ==5 or http_requests_total == 2
表示http_requests_total
结果中
等于 5 或者 2 的数据。 -
聚合运算符:
sum,min,max,avg,stddev,stdvar,count,count_values,bottomk,topk,quantile,
3.5 内置函数
Prometheus 内置不少函数,方便查询以及数据格式化,例如将结果由浮点数转为整数的 floor 和 ceil,
floor(avg(http_requests_total{code="200"}))
ceil(avg(http_requests_total{code="200"}))
//查看 http_requests_total 5分钟内,平均每秒数据
rate(http_requests_total[5m])
4. 数据可视化
Prometheus 自带的 Web Consul 、 Grafana
5. Prometheus 配置
6. Exporter
在 Prometheus 中负责数据汇报的程序统一叫做 Exporter, 而不同的 Exporter 负责不同的业务。如负责主机信息手机的 node_exporter
6.1 文本格式
一个 Exporter 本质上就是将收集的数据,转化为对应的文本格式,并提供 http 请求。
Exporter 收集的数据转化的文本内容以行 ( \n ) 为单位,空行将被忽略, 文本内容最后一行为空行。
6.1.1 注释
文本内容,如果以#
开头通常表示注释。
6.1.2 采样数据
内容如果不以 #
开头,表示采样数据。它通常紧挨着类型定义行,满足以下格式:
metric_name [
"{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"
] value [ timestamp ]
6.2 Node Exporter 安装使用
6.3 Node Exporter 常用查询
- CPU 使用率
- CPU 各 mode 占比率
- 机器平均负载
- 内存使用率
- 磁盘使用率
- 网络 IO
- 网卡出 / 入 包
6.4 其它 Exporter
- MySQL sercer Exporter 收集 Mysql Server 的信息
- MongoDB exporter 收集 MongoDB 信息
7. Pushgateway
7.1 Pushgateway 简介
- Prometheus 采用 pull 模式,可能由于不在一个子网或者防火墙原因,导致 Prometheus 无法直接拉取各个 target 数据。
- 在监控业务数据的时候,需要将不同数据汇总, 由 Prometheus统一收集。
安装
docker pull prom/pushgateway
docker run -d -p 9091:9091 prom/pushgateway
8. Alertmanager
9. 高可用方案探讨
9.1 高可用
Prometheus 监控系统的高可用主要分为两部分:
- Prometheus Server 的高可用,无单点风险
- Alertmanager 的高可用,避免告警消息丢失和重复。