存储结构
基本数据结构:
type DataPoint struct{
Timestamp int64
Value float64
}
type DataPointSet []DataPoint
type Tag struct {
Key string
Value string
}
type TagSet []Tag
type InputRecord struct{
MetricName string
Tags TagSet
Dp DataPoint
}
type TimeSeries struct {
MetricName string
Tags TagSet
Dps DataPointSet
}
即对生产方来说,每次打点形成的结构是InputRecord
, 而对存储方来说,收到的所有InputRecord
根据MetricName+Tags
存储为一组基本的数据,这是最基本的分组:
查询
以查询sum:rate:5m-avg-none:throughput:{service=risk|login}
为例,查询要经过下面几步:过滤 --> 转换(求导) --> 降采样(减少待计算的样本数) --> 分组(根据tag条件,消解未指定的tag) --> 聚合运算
-
过滤:根据MetricName和TagSet选出候选集
-
Rate转换
-
降采样,即对指定时间长度内的数据只保留一个,避免计算量过大。保留的值可以是平均值
-
分组,根据tag指定的条件分组,未指定条件的tag将被"熔合",即那些tag将如同被从数据中移除一样。注意,分组之后,每一组中仍然有多个TimeSeries数据,需要后一步的聚合使得最终结果每组只有一个TimeSeries
-
聚合:在每一个分组内,对组内的所有TimeSeries进行聚合,相同时间点的数据进行Sum/Count等运算