1. Prometheus是什么
Prometheus是一个具有活跃生态系统的开源系统监控和告警工具包。一言以蔽之,它是一套开源监控解决方案。
Prometheus主要特性:
- 多维数据模型,其中包含由指标名称和键/值对标识的时间序列数据
- PromQL,一种灵活的查询语言
- 不依赖分布式存储; 单服务器节点是自治的
- 时间序列收集通过HTTP上的pull模型进行
- 通过中间网关支持推送(push)时间序列
- 通过服务发现或静态配置发现目标
- 支持多种模式的图形和仪表盘
为什么用pull(拉取)而不用push(推送)呢?
因为,pull有以下优势:
- 进行更改时,可以在笔记本电脑上运行监控
- 可以更轻松地判断目标是否下线
- 可以手动转到目标并使用Web浏览器检查其运行状况
目标暴露HTTP端点,Prometheus服务端通过HTTP主动拉取数据。既然是服务端自己主动向目标拉取数据,那么服务端运行在本地(我们自己的电脑上)也是可以的,只要能访问目标端点即可,同时就像心跳检测一样可以判断目标是否下线,还有,服务端自己主动拉取,那么想拉取谁的数据就拉取谁的数据,因而可以随意切换拉取目标。
回想一下Skywalking是怎么做的,SkyWalking有客户端和服务端,需要在目标服务上安装探针(agent),探针采集目标服务的指标数据,上报给服务端OAP服务,这个对目标有一定的侵入性,不过可以接受。Prometheus不需要探针,可以借助push gateway来实现push效果。
对了,有个名词要先说清楚,metrics (译:度量,指标),个人更倾向于把它翻译成指标,后面说指标就是metrics
2. 基本概念
2.1. 数据模型
Prometheus基本上将所有数据存储为时间序列:具有时间戳的值流,它们属于同一个指标和同一组标记的维度。除了存储的时间序列外,Prometheus还可以生成临时派生的时间序列作为查询的结果。
Metric names and labels
Every time series is uniquely identified by its metric name and optional key-value pairs called labels.
每个时间序列都由它的指标名称和称为标签的可选键/值对唯一标识。
样本构成实际的时间序列数据。 每个样本包括:
- 一个64位的浮点值
- 一个毫秒时间戳
给定指标名称和一组标签,时间序列通常使用这种符号来标识:
<metric name>{<label name>=<label value>, ...}
例如,有一个时间序列,指标名称是api_http_requests_total,标签有method="POST"和handler="/messages",那么它可能被表示成这样:
api_http_requests_total{method="POST", handler="/messages"}
2.2. 指标类型
Counter
counter是一个累积量度,代表一个单调递增的计数器,其值只能增加或在重新启动时重置为零。例如,可以使用计数器来表示已服务请求数,已完成任务或错误的数量。
不要使用计数器来显示可以减小的值。例如,请勿对当前正在运行的进程数使用计数器,代替的应该使用量规。
Gauge
量规是一种指标,代表可以任意上下波动的单个数值。
量规通常用于测量值,例如温度或当前内存使用量,还用于可能上升和下降的“计数”,例如并发请求数。
Histogram
直方图对观察结果(通常是请求持续时间或响应大小)进行抽样,并在可配置的桶中对它们进行计数。它还提供了所有观测值的总和。
一个基础指标名称为<basename>的直方图在抓取期间会暴露多个时间序列:
- 观察桶的累积计数器,表示为 <basename>_bucket{le="<upper inclusive bound>"}
- 所有观测值的总和,表示为 <basename>_sum
- 观察到的事件数量,表示为 <basename>_count