From 8fd4e8f722dc7b6813912d9852428971ee4ddfe8 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Sat, 9 Sep 2023 09:39:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20survey=20=E5=8C=85=20Report=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20Avg=E3=80=81Count=E3=80=81Sum=20=E7=AD=89=E8=BE=85?= =?UTF-8?q?=E5=8A=A9=E8=AE=A1=E7=AE=97=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/log/survey/analyzer.go | 16 ++++++++-------- utils/log/survey/report.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/utils/log/survey/analyzer.go b/utils/log/survey/analyzer.go index e338cff..7cdf9ae 100644 --- a/utils/log/survey/analyzer.go +++ b/utils/log/survey/analyzer.go @@ -7,8 +7,9 @@ import ( // Analyzer 分析器 type Analyzer struct { - v map[string]float64 - repeat map[string]struct{} + v map[string]float64 // 记录了每个 key 的当前值 + vc map[string]int64 // 记录了每个 key 生效的计数数量 + repeat map[string]struct{} // 去重信息 subs map[string]*Analyzer m sync.Mutex } @@ -37,13 +38,10 @@ func (slf *Analyzer) Increase(key string, record R, recordKey string) { } if slf.v == nil { slf.v = make(map[string]float64) + slf.vc = make(map[string]int64) } - v, e := slf.v[key] - if !e { - slf.v[key] = record.GetFloat64(recordKey) - return - } - slf.v[key] = v + record.GetFloat64(recordKey) + slf.v[key] += record.GetFloat64(recordKey) + slf.vc[key]++ } // IncreaseValue 在指定 key 现有值的基础上增加 value @@ -52,8 +50,10 @@ func (slf *Analyzer) IncreaseValue(key string, value float64) { defer slf.m.Unlock() if slf.v == nil { slf.v = make(map[string]float64) + slf.vc = make(map[string]int64) } slf.v[key] += value + slf.vc[key]++ } // IncreaseNonRepeat 在指定 key 现有值的基础上增加 recordKey 的值,但是当去重维度 dimension 相同时,不会增加 diff --git a/utils/log/survey/report.go b/utils/log/survey/report.go index caacd54..111e6ab 100644 --- a/utils/log/survey/report.go +++ b/utils/log/survey/report.go @@ -9,6 +9,7 @@ func newReport(analyzer *Analyzer) *Report { analyzer: analyzer, Name: "ROOT", Values: analyzer.v, + Counter: analyzer.vc, Subs: make([]*Report, 0, len(analyzer.subs)), } for k, v := range analyzer.subs { @@ -24,9 +25,39 @@ type Report struct { analyzer *Analyzer Name string // 报告名称(默认为 ROOT) Values map[string]float64 `json:"Values,omitempty"` + Counter map[string]int64 `json:"Count,omitempty"` Subs []*Report `json:"Reports,omitempty"` } +// Avg 计算平均值 +func (slf *Report) Avg(key string) float64 { + return slf.Values[key] / float64(slf.Counter[key]) +} + +// Count 获取特定 key 的计数次数 +func (slf *Report) Count(key string) int64 { + return slf.Counter[key] +} + +// Sum 获取特定 key 的总和 +func (slf *Report) Sum(keys ...string) float64 { + var sum float64 + for _, key := range keys { + sum += slf.Values[key] + } + return sum +} + +// Sub 获取特定名称的子报告 +func (slf *Report) Sub(name string) *Report { + for _, sub := range slf.Subs { + if sub.Name == name { + return sub + } + } + return nil +} + // ReserveSub 仅保留特定名称子报告 func (slf *Report) ReserveSub(names ...string) *Report { report := newReport(slf.analyzer)