入门
本指南是一个“Hello World”风格的教程,展示了如何安装、配置和使用一个简单的 Prometheus 实例。你将下载并在本地运行 Prometheus,配置它来采集自身和一个示例应用程序,然后使用查询、规则和图表来使用收集到的时间序列数据。
下载并运行 Prometheus
为你的平台下载最新版本的 Prometheus,然后解压并运行它
tar xvfz prometheus-*.tar.gz
cd prometheus-*
在启动 Prometheus 之前,我们先来配置它。
配置 Prometheus 监控自身
Prometheus 通过采集指标 HTTP 端点从*目标*收集指标。由于 Prometheus 以同样的方式暴露关于自身的数据,它也可以采集并监控自身的健康状况。
虽然一个只收集自身数据的 Prometheus 服务器不是很有用,但它是一个很好的入门示例。将以下基本的 Prometheus 配置保存为一个名为 prometheus.yml 的文件
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 二进制文件的目录并运行
# Start Prometheus.
# By default, Prometheus stores its database in ./data (flag --storage.tsdb.path).
./prometheus --config.file=prometheus.yml
Prometheus 应该会启动。你也应该能够浏览到关于它自身的状态页面 localhost:9090 。给它几秒钟的时间,让它从自己的 HTTP 指标端点收集关于自身的数据。
你还可以通过导航到其指标端点来验证 Prometheus 是否正在提供关于自身的指标:localhost:9090/metrics
使用表达式浏览器
让我们来探索 Prometheus 收集到的关于自身的数据。要使用 Prometheus 内置的表达式浏览器,请导航至 https://:9090/query 并选择“Graph”选项卡。
正如你可以从 localhost:9090/metrics 中收集到的信息,Prometheus 暴露的关于自身的其中一个指标名为 prometheus_target_interval_length_seconds(目标采集之间的实际时间量)。将以下内容输入到表达式控制台,然后点击“Execute”
prometheus_target_interval_length_seconds
这应该会返回许多不同的时间序列(以及每个序列记录的最新值),每个时间序列的指标名称都是 prometheus_target_interval_length_seconds,但标签不同。这些标签表示不同的延迟百分位数和目标组间隔。
如果我们只对 99 百分位的延迟感兴趣,我们可以使用这个查询
prometheus_target_interval_length_seconds{quantile="0.99"}
要计算返回的时间序列数量,你可以写
count(prometheus_target_interval_length_seconds)
有关表达式语言的更多信息,请参阅表达式语言文档。
使用图表界面
要绘制表达式图表,请导航至 https://:9090/query 并使用“Graph”选项卡。
例如,输入以下表达式以绘制在自我采集的 Prometheus 中每秒创建的数据块速率
rate(prometheus_tsdb_head_chunks_created_total[1m])
尝试使用图表范围参数和其他设置进行实验。
启动一些示例目标
让我们为 Prometheus 添加额外的采集目标。
Node Exporter 被用作示例目标,有关使用它的更多信息,请参阅这些说明。
tar -xzvf node_exporter-*.*.tar.gz
cd node_exporter-*.*
# Start 3 example targets in separate terminals:
./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
现在你应该有示例目标在 https://:8080/metrics 、https://:8081/metrics 和 https://:8082/metrics 上监听。
配置 Prometheus 监控示例目标
现在我们将配置 Prometheus 来采集这些新目标。让我们将所有三个端点分组到一个名为 node 的作业中。我们将想象前两个端点是生产目标,而第三个代表一个金丝雀实例。为了在 Prometheus 中模拟这一点,我们可以向单个作业添加多组端点,并为每组目标添加额外的标签。在这个例子中,我们将为第一组目标添加 group="production" 标签,同时为第二组添加 group="canary"。
为了实现这一点,请将以下作业定义添加到您的 prometheus.yml 的 scrape_configs 部分,并重启您的 Prometheus 实例
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 现在是否拥有关于这些示例端点暴露的时间序列的信息,例如 node_cpu_seconds_total。
配置规则将采集的数据聚合到新的时间序列中
虽然在我们的例子中不是问题,但聚合数千个时间序列的查询在临时计算时可能会变得很慢。为了提高效率,Prometheus 可以通过配置的*记录规则*将表达式预先记录到新的持久化时间序列中。假设我们有兴趣记录在 5 分钟窗口内测量的每个实例所有 CPU 的平均每秒 CPU 时间(node_cpu_seconds_total)速率(但保留 job、instance 和 mode 维度)。我们可以这样写
avg by (job, instance, mode) (rate(node_cpu_seconds_total[5m]))
尝试绘制这个表达式的图表。
要将此表达式产生的时间序列记录到一个名为 job_instance_mode:node_cpu_seconds:avg_rate5m 的新指标中,请创建一个包含以下记录规则的文件,并将其保存为 prometheus.rules.yml
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 接收这个新规则,请在您的 prometheus.yml 中添加一个 rule_files 语句。配置现在应该看起来像这样
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,并通过表达式浏览器查询或绘制图表,验证一个名为 job_instance_mode:node_cpu_seconds:avg_rate5m 的新时间序列现已可用。
重新加载配置
正如配置文档中提到的,Prometheus 实例的配置可以通过使用 SIGHUP 信号重新加载,而无需重启进程。如果您在 Linux 上运行,可以通过使用 kill -s SIGHUP <PID> 来完成,将 <PID> 替换为您的 Prometheus 进程 ID。
平稳地关闭您的实例。
虽然 Prometheus 在发生突发进程故障时有恢复机制,但建议使用信号或中断来平稳关闭 Prometheus 实例。在 Linux 上,这可以通过向 Prometheus 进程发送 SIGTERM 或 SIGINT 信号来完成。例如,您可以使用 kill -s <SIGNAL> <PID>,将 <SIGNAL> 替换为信号名称,并将 <PID> 替换为 Prometheus 进程 ID。或者,您可以在控制终端按下中断字符,默认为 ^C(Control-C)。