时间序列是按时间戳排序的一系列 (timestamp, value) 对。每个时间序列的对数可以是任意的——从一到数千亿。时间戳具有毫秒精度,而值是 64 位浮点数。每个时间序列都有一个名称。例如:
此外,为了命名每个时间序列可以有任意数量的 label=”value” 标签。例如:
每个时间序列都由其名称和一组标签唯一标识。例如,这些都是不同的时间序列:
来自任何时间序列的每个(timestamp, value)对都称为数据点或样本。
存储在 TSDB 中的unique time series 的数量称为cardinality。
“High cardinality” means high number of series. Prometheus tsdb 存储针对处理相对较少数量的时间序列进行了优化。
当大量时间序列存储在其中时,它可能开始工作缓慢或在摄取、查询或压缩期间使用大量 RAM、CPU 或磁盘 IO。 Prometheus 的高基数从几百万个时间序列开始
如果 Prometheus 最近为它抓取了新数据,则时间序列被认为是活跃的。 Prometheus 提供了 prometheus_tsdb_head_series 指标,它显示了活动时间序列的数量。 Prometheus 在 RAM 中保存最近添加的活动时间序列样本,因此其 RAM 使用率在很大程度上取决于活动时间序列的数量。活动时间序列的数量通过流失率与基数相关联。
如果活动时间序列停止接收新样本,则活动时间序列将变为非活动状态。新的时间序列可以在标签值变化上替代旧的时间序列。例如,在 Kubernetes 中每次部署后,pod_name 标签值可能会针对大量时间序列发生变化。旧时间序列被新时间序列替代的速率称为流失率。显然,高流失率会增加基数。这可能会导致性能下降、高 RAM 使用率和内存不足错误(也称为 OOM)。
Prometheus 公开了 prometheus_tsdb_head_series_created_total 指标,可用于使用以下 PromQL 查询估算流失率:
rate(prometheus_tsdb_head_series_created_total[5m])
从 v2.10 开始,Prometheus 公开了每个目标的 scrape_series_added 指标,可用于确定高系列流失率的来源:
sum(sum_over_time(scrape_series_added[5m])) by (job)
摄取率是每秒放入 tsdb 存储的数据点数。
可以使用以下 PromQL 查询从 Prometheus 公开的 scrape_samples_scraped 指标计算摄取率:
sum_over_time(scrape_samples_scraped[5m]) / 300
此外,可以使用以下公式估算摄取率:
ingestion_rate = targets_count * metrics_per_target / scrape_interval
ingestion_rate = active_time_series / scrape_interval
Prometheus 以配置的时间间隔抓取目标,称为抓取间隔。默认情况下,它为所有抓取目标设置1分钟的抓取间隔。它可以通过 Prometheus 配置中的 global->scrape_interval 选项覆盖。虽然可以为每个目标设置不同的抓取间隔,但不建议这样做。
较低的抓取间隔会导致更高的摄取率和更高的 Prometheus RAM 使用率,因为在将更多数据点刷新到磁盘之前必须将它们保存在 RAM 中。
Prometheus 提供 --storage.tsdb.retention.time 命令行标志,用于配置存储数据的生命周期。保留之外的数据将自动删除。默认情况下,保留配置为 15 天。磁盘上存储的数据量取决于保留时间——更高的保留时间意味着磁盘上的数据更多。
Prometheus 支持的最低保留时间为 2 小时 (2h)。在为 Prometheus 配置远程存储时,这种保留可能很有用。在这种情况下,Prometheus 同时将所有抓取的数据复制到本地存储和所有配置的远程存储后端。这意味着本地存储的保留可以是最小的,因为所有数据都已经复制到远程存储,并且远程存储可用于从 Grafana 和任何其他具有 Prometheus 查询 API 支持的客户端进行查询。
请注意,配置的保留时间必须涵盖警报和记录规则的时间范围。
Prometheus 支持重新标记,可用于操作每个指标的标签、过滤抓取目标和样本。这是一个相当复杂但非常强大的机制