Prometheus如何理解

67次阅读
没有评论

共计 9292 个字符,预计需要花费 24 分钟才能阅读完成。

这篇文章的内容主要围绕 Prometheus 如何理解进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随丸趣 TV 小编一起阅读吧。希望大家通过这篇文章有所收获!

Prometheus(译:普罗米修斯)用领先的开源监控解决方案为你的指标和警报提供动力(赋能)。

1 概述

1.1. Prometheus 是什么?

Prometheus 是一个开源的系统监控和警报工具包。自 2012 年启动以来,许多公司和组织都采用了 Prometheus,该项目拥有非常活跃的开发人员和用户社区。它现在是一个独立的开源项目,独立于任何公司进行维护。Prometheus 于 2016 年加入云原生计算基金会,成为继 Kubernetes 之后的第二个托管项目。

1.1.1. Prometheus 的主要特性:

一个多维数据模型,包含由指标名称和键 / 值对(Tag)标识的时间序列数据

PromQL 是一种灵活的查询语音,用于查询并利用这些维度数据 不依赖分布式存储,单个服务器节点是自治的

时间序列收集是通过 HTTP 上的 pull 模型进行的(支持 Pull)

推送时间序列是通过一个中间网关来支持的(也支持 Push)

目标是通过服务发现或静态配置发现的

多种模式的图形和仪表盘支持

总结一下,就是多维数据模型、PromQL 查询语言、节点自治、HTTP 主动拉取或者网关主动推送的方式获取时间序列数据、自动发现目标、多种仪表盘支持

1.1.2. 组件:

Prometheus server,它负责抓取和存储时间序列数据,是最主要的组件

client libraries,用于检测应用程序代码的客户端库

push gateway,用于支持短期的 jobs

exporters,用于支持 HAProxy 等第三方

alertmanager,用于处理告警

各种支持工具

大多数 Prometheus 组件都是用 Go 编写的,这使得它们易于作为静态二进制文件构建和部署

1.1.3. 架构:

这张图展示了架构及其生态系统的一些组成部分:

Prometheus 从工具化的作业中获取指标,要么直接获取,要么通过中介推送网关获取短期作业。它在本地存储所有抓取的样本,并对这些数据应用规则将这些数据进行聚合,并记录新的时间序列,或者生成警报。可以用 Grafana 或其他 API 来可视化收集的数据。

1.2. 什么时候用它合适

Prometheus 可以很好地记录任何纯数字时间序列。它既适合以机器为中心的监视,也适合高度动态的面向服务的体系结构的监视。在微服务的世界中,它对多维数据收集和查询的支持是一个特别的优势。

Prometheus 是为可靠性而设计的,在你的服务宕机的时候,你可以快速诊断问题。每台 Prometheus 服务器都是独立的,不依赖于网络存储或其他远程服务。

1.3. 什么时候用它不合适

Prometheus 的值的可靠性。你总是可以查看有关系统的统计信息,即使在出现故障的情况下也是如此。如果你需要 100% 的准确性,例如按请求计费,Prometheus 不是一个好的选择,因为收集的数据可能不够详细和完整。在这种情况下,最好使用其他系统来收集和分析用于计费的数据,并使用 Prometheus 来完成剩下的监视工作。

1.4. Prometheus VS InfluxDB

InfluxDB 是一个开源的时间序列数据库,具有扩展和集群的商业选项。InfluxDB 项目是在 Prometheus 开发开始将近一年后发布的,所以当时无法考虑将其作为替代方案。尽管如此,Prometheus 和 fluxdb 之间仍然存在显著的差异。二者有许多相似之处。两者都有标签 (在 InfluxDB 中称为 tags) 来有效地支持多维度度量。它们基本上使用相同的数据压缩算法。两者都具有广泛的集成,包括彼此之间的集成。两者都有挂钩,允许进一步扩展它们,例如在统计工具中分析数据或执行自动化操作。

下列情况,用 InfluxDB 更好:

如果你正在进行事件日志记录

商业选项为 InfluxDB 提供集群,这对于长期数据存储也更好

最终实现副本之间数据的一致性

下列情况,用 Prometheus 更好:

如果你主要做的是度量

如果你需要更强大的查询语言、警报和通知功能

更高的可用性和正常运行时间,用于绘图和报警

InfluxDB 由一家遵循开放核心模型的商业公司维护,提供高级特性,如闭源集群、托管和支持。

Prometheus 是一个完全开源和独立的项目,由许多公司和个人维护,其中一些还提供商业服务和支持。

2. 基本概念

2.1. 数据模型

Prometheus 基本上将所有数据存储为时间序列:属于同一指标和同一组标记维度的时间戳值流。除了存储时间序列外,Prometheus 还可以根据查询结果生成临时派生的时间序列。

(PS:这里对时间序列的解释是这样的,

time series: streams of timestamped values belonging to the same metric and the same set of labeled dimensions

2.1.1. Metric names and labels

Every time series is uniquely identified by its metric name and optional key-value pairs called labels.

(每个时间序列都由其指标名称和称为标签的可选键值对唯一标识)

指标名称指定要度量的系统的一般特性(例如,http_requests_total 表示接收的 HTTP 请求的总数)。它可能包含 ASCII 字母和数字,以及下划线和冒号。它必须匹配正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*

标签名称可以包含 ASCII 字母、数字和下划线。它们必须匹配正则表达式[a-zA-Z_][a-zA-Z0-9_]*。以__开头的标签名称保留内部使用。

标签值可以包含任何 Unicode 字符。

2.1.2. Sample(样本)

样本构成实际的时间序列数据。每个样本包括:

a float64 value
a millisecond-precision timestamp

2.1.3. notation(记法)

给定一个度量名称和一组标签,时间序列通常使用以下符号标识:

metric name {label name = label value ,...}

例如,有这样一个时间序列,指标名称是 api_http_requests_total,有两个标签 method= POST 和 handler= /messages,那么这个时间序列可以这样写:

api_http_requests_total{method= POST , handler= /messages}

2.2. metric types(指标类型)

2.2.1. Counter(计数器)

计数器是一个累积指标,它表示一个单调递增的计数器,其值只能在重启时递增或重置为零。例如,可以使用计数器来表示已服务的请求数、已完成的任务数或错误数。不要使用计数器来反映一个可能会减小的值。例如,不要使用计数器表示当前正在运行的进程的数量,这种情况下,你应该用 gauge。

2.2.2. Gauge(计量器)

计量器表示一个可以任意上下移动的数值。

计量器通常用于测量温度或当前内存使用量等,也用于“计数”,比如并发请求的数量。

2.2.3. Histogram(直方图、柱状图)

直方图对观察结果(通常是请求持续时间或响应大小之类的东西)进行采样,并在可配置的桶中计数。它还提供了所有观测值的和。

直方图用一个基本的指标名 basename 暴露在一个抓取期间的多个时间序列:

观察桶的累积计数器,格式为 basename _bucket{le= upper inclusive bound} 所有观测值的总和,格式为 basename _sum 已观察到的事件的计数,格式为 basename _count

2.2.4. Summary(摘要)

与柱状图类似,摘要样例观察结果(通常是请求持续时间和响应大小之类的内容)。虽然它还提供了观测值的总数和所有观测值的总和,但它计算了一个滑动时间窗口上的可配置分位数。

2.3. Jobs AND Instances(作业与实例)

在 Prometheus 的术语中,可以抓取的端点称为实例,通常对应于单个进程。具有相同目的的实例集合称为作业。

例如,一个 API Server job 有 4 个副本 instances:

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.1. 自动生成标签和时间序列

当 Prometheus 抓取目标时,它会自动在抓取的时间序列上附加一些标签,用来识别被抓取的目标:

job:目标所属的已配置作业名称 instance:host : port 是被抓取的目标 URL 的一部分 3. 快速开始 Prometheus 是一个开源的系统监控和警报工具包,具有活跃的生态系统。

3.1. 下载与安装

Prometheus 是一个监控平台,它通过抓取这些目标上的 HTTP 端点来收集被监控目标的指标。

需要下载、安装并运行 Prometheus。还需要下载并安装一个 exporter,它是将主机和服务上的时间序列数据导出的工具。

https://prometheus.io/download/

在运行 Prometheus 之前,我们先配置一下

3.1.1. 配置 Prometheus 监视它自己

Prometheus 通过抓取目标上的 HTTP 端点数据来从被监控的目标收集数据。由于 Prometheus 也以同样的方式公开自己的数据,因此它还可以抓取和监测自己的健康状况。

虽然 Prometheus 服务器在实践中只收集关于自己的数据不是很有用,但是它是一个很好的开始示例。将以下基本的 Prometheus 配置保存为一个名为 Prometheus.yml 的文件:

1 global:

 2 scrape_interval: 15s # By default, scrape targets every 15 seconds.
 3 
 4 # Attach these labels to any time series or alerts when communicating with
 5 # external systems (federation, remote storage, Alertmanager).
 6 external_labels:
 7 monitor:  codelab-monitor 
 8 
 9 # A scrape configuration containing exactly one endpoint to scrape:
10 # Here it s Prometheus itself.
11 scrape_configs:
12 # The job name is added as a label `job= job_name ` to any timeseries scraped from this config.
13 - job_name:  prometheus 
14 
15 # Override the global default and scrape targets from this job every 5 seconds.
16 scrape_interval: 5s
17 
18 static_configs:
19 - targets: [localhost:9090]

3.1.2. 启动 Prometheus

1 # Start Prometheus.
2 # By default, Prometheus stores its database in ./data (flag --storage.tsdb.path).
3 ./prometheus --config.file=prometheus.yml

3.2. 配置

Prometheus 可以通过命令行和配置文件进行配置。配置文件定义了与抓取作业及其实例相关的所有内容,以及要加载哪些规则文件。

运行./prometheus - h 可以查看所有支持的命令

为了指定要加载哪个配置文件,请使用 –config 选项

配置文件是 YAML 格式的

配置项太多,不一一列举,自行查看

https://prometheus.io/docs/prometheus/latest/configuration/configuration/

global:

 # How frequently to scrape targets by default.
 [ scrape_interval:  duration  | default = 1m ]
 
 # How long until a scrape request times out.
 [ scrape_timeout:  duration  | default = 10s ]
 
 # How frequently to evaluate rules.
 [ evaluation_interval:  duration  | default = 1m ]
 
 # The labels to add to any time series or alerts when communicating with
 # external systems (federation, remote storage, Alertmanager).
 external_labels:
 [  labelname :  labelvalue  ... ]
 
 # Rule files specifies a list of globs. Rules and alerts are read from
 # all matching files.
 rule_files:
 [ -  filepath_glob  ... ]
 
 # A list of scrape configurations.
 scrape_configs:
 [ -  scrape_config  ... ]
 
 # Alerting specifies settings related to the Alertmanager.
 alerting:
 alert_relabel_configs:
 [ -  relabel_config  ... ]
 alertmanagers:
 [ -  alertmanager_config  ... ]
 
 # Settings related to the remote write feature.
 remote_write:
 [ -  remote_write  ... ]
 
 # Settings related to the remote read feature.
 remote_read:
 [ -  remote_read  ... ]

这里有一个有效的示例配置文件

3.3. 查询

Prometheus 提供了一种名为 PromQL(Prometheus 查询语言)的函数式查询语言,允许用户实时选择和聚合时间序列数据。表达式的结果既可以显示为图形,也可以在 Prometheus 的表达式浏览器中作为表格数据查看,或者通过 HTTP API 由外部系统使用。

3.3.1. 表达式数据类型

在 Prometheus 的表达式语言中,表达式或子表达式可以计算为以下四种类型之一:

Instant vector(瞬时向量):一组时间序列,每个时间序列包含一个样本,所有样本共享相同的时间戳

Range vector(范围向量):一组时间序列,其中包含每个时间序列随时间变化的数据点范围

Scalar(标量):一个简单的数值浮点值

String(字符串):一个简单的字符串值,目前未使用

3.3.2. 字面值

字符串字面值

字符串可以指定为单引号、双引号或反引号中的文字。例如:

1  this is a string 
2  these are unescaped: \n \\ \t 
3 `these are not unescaped: \n     \t`

浮点数字面值

例如:-2.34

3.3.3. 时间序列选择器

瞬时向量选择器

瞬时向量选择器允许在给定的时间戳(瞬时)上为每个时间序列选择一组时间序列和一个样本值:在最简单的形式中,只指定一个度量名称。这样一个向量就会包含这个度量名称的所有时间序列元素。

下面的例子,选择指标名称是 http_requests_total 的所有时间序列:

 http_requests_total

通过在花括号 ({}) 中添加一组匹配的标签,可以进一步过滤这些时间序列。

下面的例子,选择指标名称是 http_requests_total,并且有 job 标签值是 prometheus,并且 group 标签值是 canary 的时间序列:

 http_requests_total{job= prometheus ,group= canary}

标签匹配操作符:

=:选择与提供的字符串完全相同的标签(等于)!=:选择不等于提供的字符串的标签(不等于)=~:正则匹配 !~:非正则匹配

下面的例子,选择所有 staging, testing, development 环境,并且 HTTP 请求方式不是 GET 的 http_requests_total 时间序列

http_requests_total{environment=~ staging|testing|development ,method!= GET} 不要匹配空标签

 {job=~ .+} # Good!
 {job=~ .* ,method= get} # Good!

3.3.4. 范围向量选择器

范围向量字面量的工作原理与瞬时向量字面量类似,只是它们从当前瞬时量中选择一个样本范围。从语法上讲,范围持续时间被添加到向量选择器末尾的方括号 ([]) 中,以指定应该为每个结果范围向量元素获取多少时间值。

时间期限指定为一个数字,紧接其后的是下列单位之一:s(秒)、m(分钟)、h(小时)、d(天)、w(周)、y(年)

下面的例子,选择指标名是 http_requests_total,且 job 标签值是 prometheus 的已经记录的最近 5 分钟内的时间序列:

http_requests_total{job= prometheus}[5m] Offset 修饰符

下面的表达式返回 http_requests_total 在过去 5 分钟相对于当前查询计算时间的值:

http_requests_total offset 5m 注意,offset 总是紧跟在选择器后面的

sum(http_requests_total{method= GET} offset 5m) 下面的例子,返回一周前的最近 5 分钟 http_requests_total 的时间序列

rate(http_requests_total[5m] offset 1w)

3.3.5. 子查询

Syntax: instant_query [range : [ resolution] ] [offset duration]

3.3.5. 运算符

Prometheus 的查询语言支持基本的逻辑运算符和算术运算符。

算术二元运算符

+(加)、-(减)、*(乘)、/(除)、%(余数)、^(指数)

二进制算术运算符定义在标量 / 标量、向量 / 标量和向量 / 向量值对之间

比较二元运算符

==、!=、、、=、=

逻辑运算符

and、or、unless

聚合运算符

sum(求和)、min(最小值)、max(最大值)、avg(求平均)、stddev(标准偏差)、stdvar(方差)、count(个数)、count_values(相同值的元素个数)、bottomk(样本值的最小元素)、topk(样本值的最大元素)、quantile(0 ≤ φ ≤ 1)

这些操作符既可以用于聚合所有标签维度,也可以通过包含 without 子句或 by 子句来保存不同的维度。

1  aggr-op ([parameter,]  vector expression ) [without|by ( label list)]

例如,假设 http_requests_total 有 application、instance、group 三个标签,那么下面两个是等价的:

1 sum(http_requests_total) without (instance)
2 sum(http_requests_total) by (application, group)

3.3.6. 函数

https://prometheus.io/docs/prometheus/latest/querying/functions/

3.3.7. 示例

 1 #  返回 http_requests_total 的所有时间序列
 2 http_requests_total
 3 
 4 #  返回 http_requests_total 的且限定了 job 和 handler 标签的时间序列
 5 http_requests_total{job= apiserver , handler= /api/comments}
 6 http_requests_total{job= apiserver , handler= /api/comments}[5m]
 7 
 8 #  正则表达式
 9 http_requests_total{job=~ .*server}
10 http_requests_total{status!~ 4..}
11 
12 #  过去的 5 分钟内每秒 HTTP 请求速率
13 rate(http_requests_total{job= api-server}[5m])
14 #  过去的 30 分钟内每 5 分钟
15 rate(http_requests_total[5m])[30m:1m]
16 #  过去 5 分钟的所有请求速率求和,保留 job 维度
17 sum(rate(http_requests_total[5m])) by (job)
18 # cpu 使用率最高的前 3 个
19 topk(3, sum(rate(instance_cpu_time_ns[5m])) by (app, proc))

4. Grafana 支持

Grafana 支持查询 Prometheus

下面是 Grafana dashboard 查询 Prometheus 数据的例子:

使用

默认情况下,Grafana 监听 http://localhost:3000,默认用 admin/admin 登录

创建一个 Prometheus 数据源,接着创建面板并定义查询的指标

Prometheus 如何理解

Prometheus 如何理解

Prometheus 如何理解

刚开始,如果不知道 PromeQL 怎么写,可以去 Prometheus 上去找 http://localhost:9090/graph

Prometheus 如何理解 Prometheus 如何理解

Prometheus 如何理解

感谢你的阅读,相信你对“Prometheus 如何理解”这一问题有一定的了解,快去动手实践吧,如果想了解更多相关知识点,可以关注丸趣 TV 网站!丸趣 TV 小编会继续为大家带来更好的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计9292字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)