目标:估算Prometheus在监控系统中,采集目标的指标值时,所耗费的存储容量。

统计结果一般以每小时/每天消耗多少GB容量表示,以便于进行容量规划。

  1. PromQL计算样本收集率
rate(prometheus_tsdb_head_samples_appended_total[1m])

# 结果:2076个/s

根据过去1m采集到的tsdb的样本数,计算每秒的样本率。

  1. PromQL计算每个样本占用bytes

1) 估算:Prometheus的压缩算法(dod&xor),每个样本大小1~2bytes,保守按照2bytes计算;

2) 精算:

# 每个样本平均占用的bytes
rate(prometheus_tsdb_compaction_chunk_size_bytes_sum[1h]) / rate(prometheus_tsdb_compaction_chunk_samples_sum[1h])
  1. 计算存储用量

由上述统计得知,每秒入TSDB 2076个样本,每个样本2bytes,可以统计出,1hour的存储用量:

3600*2076*2 = 14,947,200 bytes = 15MB

也就是2hour存储用量大概30MB。

到prometheus实例上查看一下实际用量:

/prometheus $ ls -alh
total 24K
drwxrwsrwx   17 root     2000        4.0K Feb 22 05:00 .
drwxr-xr-x    1 root     root          28 Feb  2 06:03 ..
drwxr-sr-x    3 1000     2000          68 Feb 21 05:00 01EZ1FAVT6VZ7GQ2RKNZRFK47Z
drwxr-sr-x    3 1000     2000          68 Feb 21 07:00 01EZ1P6K16BXJQJDFF008VKVZ1
drwxr-sr-x    3 1000     2000          68 Feb 21 09:00 01EZ1X2A9B41NMEPD0T8FH9YH2
drwxr-sr-x    3 1000     2000          68 Feb 21 11:00 01EZ23Y1HQQPJZJTGF4NPH944Y
drwxr-sr-x    3 1000     2000          68 Feb 21 13:00 01EZ2ASRS728MQ2TWXC2K6R3G6
drwxr-sr-x    3 1000     2000          68 Feb 21 15:00 01EZ2HNG2GSF4GD2JZ25FBJHS3
drwxr-sr-x    3 1000     2000          68 Feb 21 17:00 01EZ2RH7A3M9V3RPDHDN4T21FM
drwxr-sr-x    3 1000     2000          68 Feb 21 19:00 01EZ2ZCYJFNG3HYWF326NJKXE3
drwxr-sr-x    3 1000     2000          68 Feb 21 21:00 01EZ368NS93N04A6RHDBGFBKJQ
drwxr-sr-x    3 1000     2000          68 Feb 21 23:00 01EZ3D4D13YT2HG8QPR4WB1QK0
drwxr-sr-x    3 1000     2000          68 Feb 22 01:00 01EZ3M04943Q1WW6SGAGN9ZVWX
drwxr-sr-x    3 1000     2000          68 Feb 22 03:00 01EZ3TVVHKWDFKNN697DPFE7J6
drwxr-sr-x    3 1000     2000          68 Feb 22 05:00 01EZ41QJS6YM7SHX18RQHSTV8H
drwxr-sr-x    2 1000     2000          34 Feb 22 05:00 chunks_head
-rw-r--r--    1 1000     2000       19.5K Feb 22 06:58 queries.active
drwxr-sr-x    3 1000     2000          97 Feb 22 05:00 wal
/prometheus $

/prometheus $ du -sh 01EZ1FAVT6VZ7GQ2RKNZRFK47Z
25.5M   01EZ1FAVT6VZ7GQ2RKNZRFK47Z
/prometheus $
/prometheus $ du -sh 01EZ1P6K16BXJQJDFF008VKVZ1
25.4M   01EZ1P6K16BXJQJDFF008VKVZ1
/prometheus $

可以看到,2hour的存储用量≈26MB,跟我们之前的评估结果差不多。

附:如何通过PromQL查询指标个数?

1) 按指标名称,查每个__name__下的指标个数

# count by (__name__)({__name__=~".+"})

prometheus_target_scrapes_sample_out_of_bounds_total{}  2
prometheus_tsdb_wal_corruptions_total{}  2
......

# prometheus_target_scrapes_sample_out_of_bounds_total

prometheus_target_scrapes_sample_out_of_bounds_total{endpoint="web",instance="172.160.230.215:9090",job="prometheus-k8s",namespace="monitoring",pod="prometheus-k8s-0",service="prometheus-k8s"}    0
prometheus_target_scrapes_sample_out_of_bounds_total{endpoint="web",instance="172.160.230.226:9090",job="prometheus-k8s",namespace="monitoring",pod="prometheus-k8s-1",service="prometheus-k8s"}    0

可以看出,这里统计的指标数是区分tag的。

2) 统计所有的指标个数

sum(count by (__name__)({__name__=~".+"}))

# 结果:59428 个

a朋
63 声望38 粉丝