目标:估算Prometheus在监控系统中,采集目标的指标值时,所耗费的存储容量。
统计结果一般以每小时/每天消耗多少GB容量表示,以便于进行容量规划。
- PromQL计算样本收集率
rate(prometheus_tsdb_head_samples_appended_total[1m])
# 结果:2076个/s
根据过去1m采集到的tsdb的样本数,计算每秒的样本率。
- 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])
- 计算存储用量
由上述统计得知,每秒入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 个