本指南是一个“Hello World”风格的教程,展示了如何安装、配置和使用一个简单的 Prometheus 实例。您将下载并在本地运行 Prometheus,配置它来抓取自身和一个示例应用程序,然后使用查询、规则和图表来使用收集的时间序列数据。
从下载最新版本的 Prometheus,然后解压并运行它。
tar xvfz prometheus-*.tar.gz
cd 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 二进制文件的目录并运行。
# Start Prometheus.
# By default, Prometheus stores its database in ./data (flag --storage.tsdb.path).
./prometheus --config.file=prometheus.yml
Prometheus 应该会启动。您还应该能够浏览到 localhost:9090 上的自身状态页面。请等待几秒钟,让它从自己的 HTTP 指标端点收集自身数据。
您还可以通过导航到其指标端点 localhost:9090/metrics 来验证 Prometheus 是否正在提供自身的相关指标。
让我们探索 Prometheus 已收集的自身数据。要使用 Prometheus 的内置表达式浏览器,请导航到 https://127.0.0.1:9090/graph,并在“图表”选项卡中选择“表格”视图。
从localhost:9090/metrics 中可以看出,Prometheus 导出关于自身的一个指标名为prometheus_target_interval_length_seconds
(目标抓取之间实际的时间量)。在表达式控制台中输入以下内容,然后点击“执行”。
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://127.0.0.1:9090/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://127.0.0.1:8080/metrics、https://127.0.0.1:8081/metrics 和 https://127.0.0.1:8082/metrics 上监听。
现在我们将配置 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 可以通过配置的录制规则将表达式预先记录到新的持久化时间序列中。假设我们有兴趣记录所有 CPU 上每个实例的 CPU 时间(node_cpu_seconds_total
)的每秒速率的平均值(但保留job
、instance
和mode
维度),如在 5 分钟的窗口内测量的。我们可以这样写。
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 在发生突然的进程故障时确实具有恢复机制,但建议使用SIGTERM
信号来干净地关闭 Prometheus 实例。如果您在 Linux 上运行,则可以通过使用kill -s SIGTERM <PID>
来执行此操作,并将<PID>
替换为您 Prometheus 进程的 ID。
本文档是开源的。请通过提交问题或拉取请求来帮助改进它。