声明

本文是个人对Getting started | Prometheus的翻译、整理和小部分扩展,翻译内容基于Prometheus版本: 2.43

本篇翻译的目的是为了帮助更多的读者了解Prometheus官方文档中的内容,同时为中文用户提供更便利地阅读体验

Prometheus的国际化工作在发文截止前(2023-04-24 11:22:20)还处于讨论阶段,所以我没有向官方提交PR,详情请看https://github.com/prometheus/docs/issues/2151。

如有任何版权问题或翻译错误,请您通过电子邮件联系我:956465331@qq.com或:ufovsmba@gmail.com

概述

什么是Prometheus

Prometheus(普罗米修斯)是有个开源监控系统和告警开发工具最开始建立在SoundCloud.。它最开始创建于2012年,很多公司和组织已经开始使用Prometheus,而且项目拥有非常活跃的开发者和使用者社区。它现在是独立开源的项目和不依赖任何公司维护。为了强调和澄清项目的治理结构,Prometheus在2016年参加了 Cloud Native Computing Foundation,在Kubernetes之后成为第二个托管项目。

Prometheus收集它自己的metrics(指标)作为时间序列数据存储,即metrics信息和timestamp(时间戳)一起储存,以及称为labels(标签)的可选的键值对。

有关Prometheus的更详细概述,请参阅媒体部分链接的资源。

快速开始

这个指南是一个“Hello World”风格的教程用于展示如何安装,配置和使用一个简单的Prometheus实例。你将在本地下载和运行Prometheus,配置它去scrape(抓取)它自己和一个简单应用程序的数据,然后用查询,规则和图表来使用收集到的时间序列数据

scrape是Prometheus里面从目标服务器(如应用程序、消息代理等)收集指标数据的操作

下载Prometheus

下载地址:Download the latest release

Linux系统可以运行下列指令解压并进入Prometheus文件夹:

1
2
tar xvfz prometheus-*.tar.gz
cd prometheus-*

window用户建议直接可视化操作

在启动Prometheus前,让我们先对它进行配置

配置Prometheus监控自身

Prometheus通过scrap(抓取)Http endpoints的方式从targets(目标)上收集metrics(指标)。因为Prometheus用同样的方式暴露它自己的数据,所以它也可以scrap和监控它自己的健康。尽管仅收集关于自身数据的Prometheus服务器并不是非常有用,但它是一个很好的起始示例。

保存下面的Prometheus基本配置到prometheus.yml文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.

# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'

# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s

static_configs:
- targets: ['localhost:9090']

有关配置选项的完整规范,请参阅官方配置文档

启动Prometheus

为了使用你刚刚的配置的配置文件来启动Prometheus,我们需要先进入包含Prometheus二进制文件的目录,然后运行下面的指令

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

Prometheus应该成功启动。你应该在localhost:9090浏览关于他本身状态的页面。给它几秒去从它自己的Http metrics endpoint中收集他自己的数据

使用表达式浏览器(Expression Browser)

让我们来探索一下Prometheus收集到的关于它自己的数据。为了是使用Prometheus内置的表达式浏览器,导航到http://localhost:9090/graph中,选择”Table“视图

localhost:9090/metrics中可以看出,Prometheus 导出的关于其自身的一个命名为prometheus_target_interval_length_seconds(抓取目标之间的实际时间间隔)的metric。请在表达式控制台中输入以下内容,然后单击“Execute”

1
prometheus_target_interval_length_seconds

这应该会返回一些不同时间序列(以及各自的最新记录值),每一个metric都叫prometheus_target_interval_length_seconds,但是有着不同的标签(label)。这些标签指定不同的延迟百分位数和target组的时间间隔

如果我们只对第99个百分位数延迟感兴趣,我们可以使用下面的这个查询:

1
prometheus_target_interval_length_seconds{quantile="0.99"}

为了统计返回的时间序列的数量,你可以写:

1
count(prometheus_target_interval_length_seconds)

有关表达式语言的更多信息,请参阅表达式语言文档

使用图表界面

为了绘制表达式图表,导航到 http://localhost:9090/graph然后选择"Graph"选项卡

例如,输入下面的表达式去绘制Prometheus中自我抓取的每一秒的创建块的速率的图表

1
rate(prometheus_tsdb_head_chunks_created_total[1m])

你可以尝试使用图表的范围参数和其他的设定

建立一些示例目标

让我们添加一些用于Prometheus抓取的额外的目标。

接下来,Node Exporter被用于作为示例目标,下载地址:Download | Prometheus

1
2
3
4
5
6
7
tar -xzvf node_exporter-*.*.tar.gz
cd node_exporter-*.*

# 在三个不同的终端中分别开启三个示例目标:
./node_exporter --web.listen-address 127.0.0.1:8080
./node_exporter --web.listen-address 127.0.0.1:8081
./node_exporter --web.listen-address 127.0.0.1:8082

现在你应该可以通过这些地址访问到这三个示例程序: http://localhost:8080/metrics, http://localhost:8081/metrics, 和 http://localhost:8082/metrics.

Window系统虽然不被Node Exporter支持,但使用Window exporter可以达到类似的效果

更多关于Node Exporter的信息,请参阅Node Exporter说明

配置Prometheus监控示例目标

现在我们将配置Prometheus去爬取这些新的目标。让我们把这三个endpoints分组到一个名为node的job下面。我们将想象第1第2个endpoints是生产目标,但是第三个代表一个金丝雀实例。为了在Prometheus中构建模型,我们可以在一个job里面添加几个的endpoints的分组,给不同的目标组别添加额外的标签(label)。在这里例子中,我们可以添加group="production"标签在第一组目标,添加group="canary"在第二组。

为了实现这一点,在你的prometheus.yml文件中添加下面的job定义到scrape_configs 部分,然后重启Prometheus实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
scrape_configs:
- job_name: 'node'

# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s

static_configs:
- targets: ['localhost:8080', 'localhost:8081']
labels:
group: 'production'

- targets: ['localhost:8082']
labels:
group: 'canary'

打开表达式浏览器,确认Prometheus现在是否有关于这些示例endpoint的时间序列信息,例如node_cpu_seconds_total

配置规则将抓取的数据聚合到新的时间序列中

尽管在我们的示例中并不有问题,但即席计算(ad-hoc)实时,聚合了上千条时间序列的查询会变慢。为了更高的效率,Prometheus可以通过配置recording rules(记录规则)来提前记录表达式到一个持久化的时间序列里面。假设我们感兴趣于记录在窗口每5分钟内测量的所有cpu的每一个实例每秒的cpu时间速率(node_cpu_seconds_total) 的平均值(但是提保留job, instancemode 维度)。我们可以这样写:

1
avg by (job, instance, mode) (rate(node_cpu_seconds_total[5m]))

让我们尝试绘制这个表达式的图表

为了记录这个新表达式的产生的时间序列到一个名为job_instance_mode:node_cpu_seconds:avg_rate5m的新metric中,我们创建一个文件带有下面的记录规则,然后另存为prometheus.rules.yml

1
2
3
4
5
groups:
- name: cpu-node
rules:
- record: job_instance_mode:node_cpu_seconds:avg_rate5m
expr: avg by (job, instance, mode) (rate(node_cpu_seconds_total[5m]))

为了使Prometheus接收这个新规则,添加一个rule_files声明在你的 prometheus.yml中。现在整个配置文件一个看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
evaluation_interval: 15s # Evaluate rules every 15 seconds.

# Attach these extra labels to all timeseries collected by this Prometheus instance.
external_labels:
monitor: 'codelab-monitor'

rule_files:
- 'prometheus.rules.yml'

scrape_configs:
- job_name: 'prometheus'

# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s

static_configs:
- targets: ['localhost:9090']

- job_name: 'node'

# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s

static_configs:
- targets: ['localhost:8080', 'localhost:8081']
labels:
group: 'production'

- targets: ['localhost:8082']
labels:
group: 'canary'

用新配置重启Prometheus,然后通过表达式浏览器查询或绘制图表来验证metric名为job_instance_mode:node_cpu_seconds:avg_rate5m的新时间序列是否可用。