Prometheus监控之检查工具Promtool TSDB

时间:2022-12-26 15:03:21

一、概述

Promtool在TSDB方面一个有6个子命令,分别用来进行写性能测试、TSDB分析、列出TSDB数据块、dump、从OpenMetric导入数据块、为新的记录规则创建数据块

二、TSDB

1、写性能测试

Promtool 可以对 Prometheus 进行写的性能测试,命令参数如下:
./promtool tsdb bench write --help
usage: promtool tsdb bench write [<flags>] [<file>]
Run a write performance benchmark.
Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man).
--version Show application version.
--enable-feature= ... Comma separated feature names to enable (only PromQL related). See
https://prometheus.io/docs/prometheus/latest/feature_flags/ for the options and more details.
--out="benchout" Set the output path.
--metrics=10000 Number of metrics to read.
--scrapes=3000 Number of scrapes to simulate.
Args:
[<file>] Input file with samples data, default is (../../tsdb/testdata/20kseries.json).

首先从官网下载测试所需要的数据 20kseries.json 文件,这个文件在源码仓库的 /tsdb/testdata/ 下,可以通过这个命令来下载
wget https://raw.githubusercontent.com/prometheus/prometheus/main/tsdb/testdata/20kseries.json
下载好以后,指定 metrics 和 scrapes 两个参数进行测试
./promtool tsdb bench write --metrics=10000 --scrapes=3000 ./20kseries.json
level=info ts=2022-07-27T13:21:25.546626055Z caller=head.go:493 msg="Replaying on-disk memory mappable chunks if any"
level=info ts=2022-07-27T13:21:25.546734166Z caller=head.go:536 msg="On-disk memory mappable chunks replay completed" duration=11.815µs
level=info ts=2022-07-27T13:21:25.546766084Z caller=head.go:542 msg="Replaying WAL, this may take a while"
level=info ts=2022-07-27T13:21:25.547101874Z caller=head.go:613 msg="WAL segment loaded" segment=0 maxSegment=0
level=info ts=2022-07-27T13:21:25.547131383Z caller=head.go:619 msg="WAL replay completed" checkpoint_replay_duration=38.26µs wal_replay_duration=315.491µs total_replay_duration=409.177µs
level=info ts=2022-07-27T13:21:25.549132675Z caller=db.go:1467 msg="Compactions disabled"
>> start stage=readData
>> completed stage=readData duration=145.973395ms
>> start stage=ingestScrapes
ingestion completed
>> completed stage=ingestScrapes duration=3.628682202s
> total samples: 30000000
> samples/sec: 8.267435217071414e+06
>> start stage=stopStorage
>> completed stage=stopStorage duration=1.522008202s
这个测试会在当前目录生成一个 benchout 的文件夹,里边是测试生成的文件。这个路径也可以通过参数来进行修改,生成到其他地方或者其他名称。
简单来看,这次读数据消耗了 145ms ,存储数据消耗了 1.5s 。

2、TSDB分析

Promtool 可以对 Prometheus 的数据块进行分析,分析 churn 、label 对的基数和压缩效率,命令参数如下:
./promtool tsdb analyze --help
usage: promtool tsdb analyze [<flags>] [<db path>] [<block id>]
Analyze churn, label pair cardinality and compaction efficiency.
Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man).
--version Show application version.
--enable-feature= ... Comma separated feature names to enable (only PromQL related). See
https://prometheus.io/docs/prometheus/latest/feature_flags/ for the options and more details.
--limit=20 How many items to show in each list.
--extended Run extended analysis.
Args:
[<db path>] Database path (default is data/).
[<block id>] Block to analyze (default is the last block).

在分析的时候可以指定每个列表最多显示多少个项,必须要指定数据的 data 目录,block id 可以指定也可以不指定,
不指定的话会分析最新的那个 block 。执行命令以后可以看到如下输出。
./promtool tsdb analyze ./prometheus/data/
Block ID: 01G8ZXKAHRGF7BV0FTQYZ18FH5
Duration: 59m55.713s
Series: 606677
Label names: 26
Postings (unique label pairs): 13190
Postings entries (total label pairs): 7819776
......

3、列出TSDB数据块

使用 Promtool 还可以列出当前 Prometheus 的所有数据块。命令的参数如下:
./promtool tsdb list --help
usage: promtool tsdb list [<flags>] [<db path>]
List tsdb blocks.
Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man).
--version Show application version.
--enable-feature= ... Comma separated feature names to enable (only PromQL related). See
https://prometheus.io/docs/prometheus/latest/feature_flags/ for the options and more details.
-r, --human-readable Print human readable values.
Args:
[<db path>] Database path (default is data/).

执行这个命令我们来看一下效果,建议加上-r参数
./promtool tsdb list -r ./prometheus-pushgateway/data/
BLOCK ULID MIN TIME MAX TIME DURATION NUM SAMPLES NUM CHUNKS NUM SERIES SIZE
01G8XB6J42S6FTDMAPYV30CTR3 2022-07-26 12:00:03 +0000 UTC 2022-07-26 13:00:00 +0000 UTC 59m56.018s 78421200 435860 435412 92MiB217KiB450B
01G8XEMDR374M816NZ2NMNS5AQ 2022-07-26 13:00:03 +0000 UTC 2022-07-26 14:00:00 +0000 UTC 59m56.018s 78421200 435860 435412 92MiB217KiB825B
通过这个命令我们可以看到 Block ID、数据存储的开始时间和结束时间,一共存储了多长时间段 数据,Sample 的数量,Chunk 的数量,
Serie 的数量、以及 Block 的大小。

4、dump

Promtool 还行可以进行 dump,只不过是从 TSDB 中 dump Sample 数据出来。
./promtool tsdb dump --help
usage: promtool tsdb dump [<flags>] [<db path>]
Dump samples from a TSDB.
Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man).
--version Show application version.
--enable-feature= ... Comma separated feature names to enable (only PromQL related). See
https://prometheus.io/docs/prometheus/latest/feature_flags/ for the options and more details.
--min-time=-9223372036854775808
Minimum timestamp to dump.
--max-time=9223372036854775807
Maximum timestamp to dump.
Args:
[<db path>] Database path (default is data/).

对于这个命令一定要指定数据目录 data 的路径,另外最大最小时间也指定一下,否则会 dump 数据库中所有的 Sample 数据。
./promtool tsdb dump --min-time=1658927217000 --max-time=1658930818000 ../prometheus-pushgateway/data/
这个命令 dump 出来的数据好像只会在屏幕输出,并不会输出到文件,dump 的时候记得人为导入到某个文件。

5、从OpenMetric导入数据块

Promtool工具还可以从OpenMetrics输入导入sample数据并生成TSDB数据块。 
这个命令的使用场景是在不同的监控系统或者时序数据库之间迁移数据使用的,先将对应的数据转换成OpenMetric格式,然后将OpenMetric格式的数据导入到Prometheus的TSDB数据库中。
./promtool tsdb create-blocks-from openmetrics --help
usage: promtool tsdb create-blocks-from openmetrics <input file> [<output directory>]
Import samples from OpenMetrics input and produce TSDB blocks. Please refer to the storage docs for more details.

Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man).
--version Show application version.
--enable-feature= ... Comma separated feature names to enable (only PromQL related). See
https://prometheus.io/docs/prometheus/latest/feature_flags/ for the options and more details.
-r, --human-readable Print human readable values.
-q, --quiet Do not print created blocks.
Args:
<input file> OpenMetrics file to read samples from.
[<output directory>] Output directory for generated blocks.

6、为新的记录规则创建数据块

当创建新的记录规则以后,这个新的记录规则是没有历史数据的。记录规则所产生的数据只在创建时开始存储到数据库中,Promtool可以创建记录规则的历史数据。
./promtool tsdb create-blocks-from rules --help
usage: promtool tsdb create-blocks-from rules --start=START [<flags>] <rule-files>...
Create blocks of data for new recording rules.
Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man).
--version Show application version.
--enable-feature= ... Comma separated feature names to enable (only PromQL related). See
https://prometheus.io/docs/prometheus/latest/feature_flags/ for the options and more details.
-r, --human-readable Print human readable values.
-q, --quiet Do not print created blocks.
--url=http://localhost:9090
The URL for the Prometheus API with the data where the rule will be backfilled from.
--start=START The time to start backfilling the new rule from. Must be a RFC3339 formatted date
or Unix timestamp. Required.
--end=END If an end time is provided, all recording rules in the rule files provided will
be backfilled to the end time. Default will backfill up to 3 hours ago. Must be a
RFC3339 formatted date or Unix timestamp.
--output-dir="data/" Output directory for generated blocks.
--eval-interval=60s How frequently to evaluate rules when backfilling if a value is not set in the
recording rule files.
Args:
<rule-files> A list of one or more files containing recording rules to be backfilled. All recording rules
listed in the files will be backfilled. Alerting rules are not evaluated.

命令中提供的记录规则文件应该是一个普通的 Prometheus 规则文件,然后指定要生成的历史数据的时间范围,
./promtool tsdb create-blocks-from rules \
--start 1617079873 \
--end 1617097873 \
--url http://mypromserver.com:9090 \
rules.yaml rules2.yaml
命令promtool tsdb create-blocks-from rules的输出结果为一个目录,该目录中包含记录规则文件中所有规则的历史规则数据块。默认情况下,
输出目录为data/。为了利用这些新的块数据,必须将这些块移动到正在运行的 Prometheus 实例数据目录下,然后在 Prometheus 实例启动的时候
将参数--storage.tsdb.allow-overlapping-blocks设为启用。之后 Prometheus 会在在下一次压缩运行时,将新块与现有块合并。这样记录规
则文件生成的历史数据就可以在 Prometheus 中进行查询了。

创建记录规则的历史数据有一些限制:
如果多次执行生成历史数据 ,且开始时间和结束时间重叠,则每次运行记录规则生成历史数据时都会创建包含相同数据的块。
记录规则文件中的所有规则都将被评估。
如果在记录规则文件中设置了时间间隔,该时间间隔优先于 tsdb create-blocks-from rules 命令中的--eval-interval 参数。
如果告警规则在记录规则文件中,那么告警规则会被忽略。
同一组中的规则无法看到之前规则的结果。这意味着不支持引用正在生成历史数据的其他规则的规则。一种解决方法是多次生成历史数据并首先创建依赖
数据(并将依赖数据移动到 Prometheus 服务器数据目录,以便从 Prometheus API 访问它)。