feat: survey 包 Report 新增 Avg、Count、Sum 等辅助计算函数

This commit is contained in:
kercylan98 2023-09-09 09:39:27 +08:00
parent 3c3dc83830
commit 8fd4e8f722
2 changed files with 39 additions and 8 deletions

View File

@ -7,8 +7,9 @@ import (
// Analyzer 分析器 // Analyzer 分析器
type Analyzer struct { type Analyzer struct {
v map[string]float64 v map[string]float64 // 记录了每个 key 的当前值
repeat map[string]struct{} vc map[string]int64 // 记录了每个 key 生效的计数数量
repeat map[string]struct{} // 去重信息
subs map[string]*Analyzer subs map[string]*Analyzer
m sync.Mutex m sync.Mutex
} }
@ -37,13 +38,10 @@ func (slf *Analyzer) Increase(key string, record R, recordKey string) {
} }
if slf.v == nil { if slf.v == nil {
slf.v = make(map[string]float64) slf.v = make(map[string]float64)
slf.vc = make(map[string]int64)
} }
v, e := slf.v[key] slf.v[key] += record.GetFloat64(recordKey)
if !e { slf.vc[key]++
slf.v[key] = record.GetFloat64(recordKey)
return
}
slf.v[key] = v + record.GetFloat64(recordKey)
} }
// IncreaseValue 在指定 key 现有值的基础上增加 value // IncreaseValue 在指定 key 现有值的基础上增加 value
@ -52,8 +50,10 @@ func (slf *Analyzer) IncreaseValue(key string, value float64) {
defer slf.m.Unlock() defer slf.m.Unlock()
if slf.v == nil { if slf.v == nil {
slf.v = make(map[string]float64) slf.v = make(map[string]float64)
slf.vc = make(map[string]int64)
} }
slf.v[key] += value slf.v[key] += value
slf.vc[key]++
} }
// IncreaseNonRepeat 在指定 key 现有值的基础上增加 recordKey 的值,但是当去重维度 dimension 相同时,不会增加 // IncreaseNonRepeat 在指定 key 现有值的基础上增加 recordKey 的值,但是当去重维度 dimension 相同时,不会增加

View File

@ -9,6 +9,7 @@ func newReport(analyzer *Analyzer) *Report {
analyzer: analyzer, analyzer: analyzer,
Name: "ROOT", Name: "ROOT",
Values: analyzer.v, Values: analyzer.v,
Counter: analyzer.vc,
Subs: make([]*Report, 0, len(analyzer.subs)), Subs: make([]*Report, 0, len(analyzer.subs)),
} }
for k, v := range analyzer.subs { for k, v := range analyzer.subs {
@ -24,9 +25,39 @@ type Report struct {
analyzer *Analyzer analyzer *Analyzer
Name string // 报告名称(默认为 ROOT Name string // 报告名称(默认为 ROOT
Values map[string]float64 `json:"Values,omitempty"` Values map[string]float64 `json:"Values,omitempty"`
Counter map[string]int64 `json:"Count,omitempty"`
Subs []*Report `json:"Reports,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 仅保留特定名称子报告 // ReserveSub 仅保留特定名称子报告
func (slf *Report) ReserveSub(names ...string) *Report { func (slf *Report) ReserveSub(names ...string) *Report {
report := newReport(slf.analyzer) report := newReport(slf.analyzer)