From d3992b81ef0d75e610f9f605df8c73994daa269f Mon Sep 17 00:00:00 2001 From: yubo Date: Wed, 18 Nov 2020 11:13:45 +0800 Subject: [PATCH] use consolFun instead of aggrFunc with resample (#408) --- src/modules/transfer/backend/m3db/convert.go | 21 +++++++----- src/modules/transfer/backend/m3db/m3db.go | 34 +++++++++++--------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/modules/transfer/backend/m3db/convert.go b/src/modules/transfer/backend/m3db/convert.go index 6c17ff88..74b5950f 100644 --- a/src/modules/transfer/backend/m3db/convert.go +++ b/src/modules/transfer/backend/m3db/convert.go @@ -115,13 +115,18 @@ func xcludeResp(iter ident.TagIterator) *dataobj.XcludeResp { } func aggregateResp(data []*dataobj.TsdbQueryResponse, opts dataobj.QueryDataForUI) []*dataobj.TsdbQueryResponse { - if len(data) < 2 || opts.AggrFunc == "" { + if len(data) < 2 { return data } // resample the data for _, v := range data { - v.Values = resample(v.Values, opts.Start, opts.End, int64(opts.Step), opts.AggrFunc) + v.Values = resample(v.Values, opts.Start, opts.End, int64(opts.Step), opts.ConsolFunc) + } + + // aggregateResp + if opts.AggrFunc == "" { + return data } // 没有聚合 tag, 或者曲线没有其他 tags, 直接所有曲线进行计算 @@ -182,7 +187,7 @@ func aggregateResp(data []*dataobj.TsdbQueryResponse, opts dataobj.QueryDataForU return aggrDatas } -func resample(data []*dataobj.RRDData, start, end, step int64, aggrFunc string) []*dataobj.RRDData { +func resample(data []*dataobj.RRDData, start, end, step int64, consolFunc string) []*dataobj.RRDData { l := int((end - start) / step) if l <= 0 { return []*dataobj.RRDData{} @@ -192,7 +197,7 @@ func resample(data []*dataobj.RRDData, start, end, step int64, aggrFunc string) ts := start if t := data[0].Timestamp; t > start { - ts = t - t%step + ts = t } j := 0 @@ -220,7 +225,7 @@ func resample(data []*dataobj.RRDData, start, end, step int64, aggrFunc string) } ret = append(ret, &dataobj.RRDData{ Timestamp: ts, - Value: aggrData(aggrFunc, get()), + Value: aggrData(consolFunc, get()), }) } @@ -234,11 +239,11 @@ func aggrData(fn string, data []dataobj.JsonFloat) dataobj.JsonFloat { switch fn { case "sum": return sum(data) - case "avg": + case "avg", "AVERAGE": return avg(data) - case "max": + case "max", "MAX": return max(data) - case "min": + case "min", "MIN": return min(data) // case "last": default: diff --git a/src/modules/transfer/backend/m3db/m3db.go b/src/modules/transfer/backend/m3db/m3db.go index b7f22f23..b655744e 100644 --- a/src/modules/transfer/backend/m3db/m3db.go +++ b/src/modules/transfer/backend/m3db/m3db.go @@ -36,6 +36,7 @@ type M3dbSection struct { DocsLimit int `yaml:"docsLimit"` MinStep int `yaml:"minStep"` Config client.Configuration `yaml:",inline"` + timeLimit int64 `yaml:"-"` } type Client struct { @@ -65,6 +66,8 @@ func NewClient(cfg M3dbSection) (*Client, error) { cfg.MinStep = 1 } + cfg.timeLimit = int64(86400 * cfg.DaysLimit) + ret := &Client{ namespace: cfg.Namespace, config: &cfg, @@ -476,30 +479,29 @@ func (cfg M3dbSection) validateQueryDataForUI(in *dataobj.QueryDataForUI) (err e return fmt.Errorf("%s is invalid aggrfunc", in.AggrFunc) } - if err := cfg.validateTime(in.Start, in.End, &in.Step); err != nil { - return err - } - - return nil -} - -func (cfg M3dbSection) validateTime(start, end int64, step *int) error { - if end <= start { - return fmt.Errorf("query time range is invalid end %d <= start %d", end, start) + if in.End <= in.Start { + return fmt.Errorf("query time range is invalid end %d <= start %d", in.End, in.Start) } if cfg.DaysLimit > 0 { - if days := int((end - start) / 86400); days > cfg.DaysLimit { - return fmt.Errorf("query time reange in invalid, daysLimit(%d/%d)", days, cfg.DaysLimit) + if t := in.End - cfg.timeLimit; in.Start < t { + // return fmt.Errorf("query time reange in invalid, daysLimit(%d/%d)", days, cfg.DaysLimit) + in.Start = t } } - if *step == 0 { - *step = int((end - start) / MAX_PONINTS) + if in.Step > 0 { + if n := (in.End - in.Start) / int64(in.Step); n > MAX_PONINTS { + in.Step = 0 + } } - if *step > cfg.MinStep { - *step = cfg.MinStep + if in.Step <= 0 { + in.Step = int((in.End - in.Start) / MAX_PONINTS) + } + + if in.Step < cfg.MinStep { + in.Step = cfg.MinStep } return nil }