Files
vRp.CD2g_test/utils/log/survey/analyzer.go

102 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package survey
import (
"strings"
"sync"
)
// Analyzer 分析器
type Analyzer struct {
v map[string]float64 // 记录了每个 key 的当前值
vc map[string]int64 // 记录了每个 key 生效的计数数量
repeat map[string]struct{} // 去重信息
subs map[string]*Analyzer
m sync.Mutex
}
// Sub 获取子分析器
func (slf *Analyzer) Sub(key string) *Analyzer {
slf.m.Lock()
defer slf.m.Unlock()
if slf.subs == nil {
slf.subs = make(map[string]*Analyzer)
}
sub, e := slf.subs[key]
if !e {
sub = &Analyzer{}
slf.subs[key] = sub
}
return sub
}
// Increase 在指定 key 现有值的基础上增加 recordKey 的值
func (slf *Analyzer) Increase(key string, record R, recordKey string) {
slf.m.Lock()
defer slf.m.Unlock()
if !record.Exist(recordKey) {
return
}
if slf.v == nil {
slf.v = make(map[string]float64)
slf.vc = make(map[string]int64)
}
slf.v[key] += record.GetFloat64(recordKey)
slf.vc[key]++
}
// IncreaseValue 在指定 key 现有值的基础上增加 value
func (slf *Analyzer) IncreaseValue(key string, value float64) {
slf.m.Lock()
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 相同时,不会增加
func (slf *Analyzer) IncreaseNonRepeat(key string, record R, recordKey string, dimension ...string) {
slf.m.Lock()
if !record.Exist(recordKey) {
slf.m.Unlock()
return
}
if slf.repeat == nil {
slf.repeat = make(map[string]struct{})
}
dvs := make([]string, 0, len(dimension))
for _, v := range dimension {
dvs = append(dvs, record.GetString(v))
}
dk := strings.Join(append([]string{key}, dvs...), "_")
if _, e := slf.repeat[dk]; e {
slf.m.Unlock()
return
}
slf.repeat[dk] = struct{}{}
slf.m.Unlock()
slf.Increase(key, record, recordKey)
}
// IncreaseValueNonRepeat 在指定 key 现有值的基础上增加 value但是当去重维度 dimension 相同时,不会增加
func (slf *Analyzer) IncreaseValueNonRepeat(key string, record R, value float64, dimension ...string) {
slf.m.Lock()
if slf.repeat == nil {
slf.repeat = make(map[string]struct{})
}
dvs := make([]string, 0, len(dimension))
for _, v := range dimension {
dvs = append(dvs, record.GetString(v))
}
dk := strings.Join(append([]string{key}, dvs...), "_")
if _, e := slf.repeat[dk]; e {
slf.m.Unlock()
return
}
slf.repeat[dk] = struct{}{}
slf.m.Unlock()
slf.IncreaseValue(key, value)
}