Timescale Cloud:性能、扩展性、企业级
自托管产品
MST
在监控应用程序性能时,主要有两种类型的指标可以收集:Gauges(计量器)和 Counters(计数器)。Gauges 像温度或速度一样上下波动,而 Counters 则总是增加,例如车辆行驶的总里程数。
处理计数器数据时,通常假定如果计数器的值下降,则表示计数器已重置。例如,如果您想计算车辆行驶的总里程数,您会期望这些值持续增加:1、2、3、4 等。如果计数器重置为 0,您会认为这是一次新的行程,或者是一辆全新的车辆。如果您想从上次停止的地方继续计数,而不是重置为 0,这可能会成为一个问题。重置可能发生在服务器短暂中断或任何其他原因。为了解决这个问题,您可以分析计数器数据的时间变化,这会考虑重置的情况。
在 SQL 中处理重置可能很困难,因此 Timescale 开发了聚合函数和访问器函数,以更实用的方式处理计数器计算。
注意
计数器聚合可以在连续聚合中使用,尽管它们在 PostgreSQL 中不可并行化。有关更多信息,请参阅并行性与顺序部分。
有关计数器聚合 API 调用的更多信息,请参阅超函数 API 文档。
在此过程中,我们使用一个名为 example
的示例表,其中包含计数器数据。
创建名为
example
的表CREATE TABLE example (measure_id BIGINT,ts TIMESTAMPTZ ,val DOUBLE PRECISION,PRIMARY KEY (measure_id, ts));创建计数器聚合和 delta 访问器函数。这为您提供了计数器在时间段内的值变化,同时考虑了任何重置。这使您能够查找计数器增量较大或较小的十五分钟时间段。
SELECT measure_id,delta(counter_agg(ts, val))FROM exampleGROUP BY measure_id;您还可以使用
time_bucket
函数,以十五分钟为增量生成一系列 delta 值。SELECT measure_id,time_bucket('15 min'::interval, ts) as bucket,delta(counter_agg(ts, val))FROM exampleGROUP BY measure_id, time_bucket('15 min'::interval, ts);
如果您的序列不那么规则,delta 值会受到每个十五分钟周期内样本数量的影响。您可以通过使用 extrapolated_delta
函数来改进这一点。为此,您需要提供定义外推范围的边界。在此示例中,我们使用 time_bucket_range
函数,它与 time_bucket
的工作方式相同,但会生成桶中所有时间的开放范围。此示例还使用 CTE 进行计数器聚合,这有助于更容易理解每个部分的作用。
创建名为
example
的超表CREATE TABLE example (measure_id BIGINT,ts TIMESTAMPTZ ,val DOUBLE PRECISION,PRIMARY KEY (measure_id, ts)) WITH (tsdb.hypertable,tsdb.partition_column='ts',tsdb.chunk_interval='15 days');如果您正在自托管 TimescaleDB v2.19.3 及更早版本,请创建一个PostgreSQL 关系表
,然后使用 create_hypertable 进行转换。之后,您可以通过调用 ALTER TABLE 来启用 hypercore。
创建计数器聚合和外推 delta 函数
with t as (SELECT measure_id,time_bucket('15 min'::interval, ts) as bucket,counter_agg(ts, val, toolkit_experimental.time_bucket_range('15 min'::interval, ts))FROM exampleGROUP BY measure_id, time_bucket('15 min'::interval, ts))SELECT time_bucket,extrapolated_delta(counter_agg, method => 'prometheus')FROM t ;
注意
在此过程中,Prometheus
用于进行外推。Timescale 当前的 extrapolation
函数旨在模仿 Prometheus 项目的 increase
函数,该函数测量计数器外推到查询区域边缘的变化。
如果您将计数器聚合制作成连续聚合,它可能会更有用。
创建连续聚合
CREATE MATERIALIZED VIEW example_15WITH (timescaledb.continuous)AS SELECT measure_id,time_bucket('15 min'::interval, ts) as bucket,counter_agg(ts, val, time_bucket_range('15 min'::interval, ts))FROM exampleGROUP BY measure_id, time_bucket('15 min'::interval, ts);您还可以从连续聚合重新聚合到更大的桶大小。
SELECTmeasure_id,time_bucket('1 day'::interval, bucket),delta(rollup(counter_agg))FROM example_15GROUP BY measure_id, time_bucket('1 day'::interval, bucket);
计数器重置计算需要严格的输入顺序,这意味着它们在 PostgreSQL 中不可并行化。这是因为 PostgreSQL 通过随机向工作进程分发行来处理并行性。但是,如果您的并行性可以保证行集在时间上是不相交的,那么算法可以并行化,只要它在一个时间范围内,并且所有行都分配给同一个工作进程。对于连续聚合和分布式超表都是如此,只要分区键在 group by
中,尽管否则聚合本身没有实际意义。
有关并行性与顺序的更多信息,请参阅我们的开发者文档
关键词