Updated stat metrics with CompressFactor

This commit is contained in:
Tripon Alexandru-Ionut
2019-04-02 15:07:33 +03:00
committed by Dan Christian Bogos
parent 7b6674e4b5
commit 19d3cf4fd9
5 changed files with 33 additions and 22 deletions

View File

@@ -96,9 +96,9 @@ func testDMitCRUDStatQueue(t *testing.T) {
Answered: 2,
Count: 3,
Events: map[string]*AnsweredWithCompress{
"cgrates.org:ev1": &AnsweredWithCompress{Answered: true},
"cgrates.org:ev2": &AnsweredWithCompress{Answered: true},
"cgrates.org:ev3": &AnsweredWithCompress{Answered: false},
"cgrates.org:ev1": &AnsweredWithCompress{Answered: 1},
"cgrates.org:ev2": &AnsweredWithCompress{Answered: 1},
"cgrates.org:ev3": &AnsweredWithCompress{Answered: 0},
},
},
},

View File

@@ -53,8 +53,8 @@ func TestStatRemEventWithID(t *testing.T) {
Answered: 1,
Count: 2,
Events: map[string]*AnsweredWithCompress{
"cgrates.org:TestRemEventWithID_1": &AnsweredWithCompress{Answered: true},
"cgrates.org:TestRemEventWithID_2": &AnsweredWithCompress{Answered: false},
"cgrates.org:TestRemEventWithID_1": &AnsweredWithCompress{Answered: 1},
"cgrates.org:TestRemEventWithID_2": &AnsweredWithCompress{Answered: 0},
},
},
},
@@ -96,9 +96,9 @@ func TestStatRemExpired(t *testing.T) {
Answered: 2,
Count: 3,
Events: map[string]*AnsweredWithCompress{
"cgrates.org:TestStatRemExpired_1": &AnsweredWithCompress{Answered: true},
"cgrates.org:TestStatRemExpired_2": &AnsweredWithCompress{Answered: false},
"cgrates.org:TestStatRemExpired_3": &AnsweredWithCompress{Answered: true},
"cgrates.org:TestStatRemExpired_1": &AnsweredWithCompress{Answered: 1},
"cgrates.org:TestStatRemExpired_2": &AnsweredWithCompress{Answered: 0},
"cgrates.org:TestStatRemExpired_3": &AnsweredWithCompress{Answered: 1},
},
},
},
@@ -180,7 +180,7 @@ func TestStatAddStatEvent(t *testing.T) {
Answered: 1,
Count: 1,
Events: map[string]*AnsweredWithCompress{
"cgrates.org:TestStatRemExpired_1": &AnsweredWithCompress{Answered: true},
"cgrates.org:TestStatRemExpired_1": &AnsweredWithCompress{Answered: 1},
},
},
},

View File

@@ -1463,9 +1463,9 @@ func testOnStorITStatQueue(t *testing.T) {
Answered: 2,
Count: 3,
Events: map[string]*AnsweredWithCompress{
"cgrates.org:ev1": &AnsweredWithCompress{Answered: true},
"cgrates.org:ev2": &AnsweredWithCompress{Answered: true},
"cgrates.org:ev3": &AnsweredWithCompress{Answered: false},
"cgrates.org:ev1": &AnsweredWithCompress{Answered: 1},
"cgrates.org:ev2": &AnsweredWithCompress{Answered: 1},
"cgrates.org:ev3": &AnsweredWithCompress{Answered: 0},
},
},
},
@@ -1496,9 +1496,9 @@ func testOnStorITStatQueue(t *testing.T) {
Answered: 3,
Count: 3,
Events: map[string]*AnsweredWithCompress{
"cgrates.org:ev1": &AnsweredWithCompress{Answered: true},
"cgrates.org:ev2": &AnsweredWithCompress{Answered: true},
"cgrates.org:ev3": &AnsweredWithCompress{Answered: true},
"cgrates.org:ev1": &AnsweredWithCompress{Answered: 1},
"cgrates.org:ev2": &AnsweredWithCompress{Answered: 1},
"cgrates.org:ev3": &AnsweredWithCompress{Answered: 1},
},
},
}

View File

@@ -77,7 +77,7 @@ func NewASR(minItems int, extraParams string, filterIDs []string) (StatMetric, e
// ASRHelper structure
type AnsweredWithCompress struct {
Answered bool
Answered float64
CompressFactor int
}
@@ -125,22 +125,23 @@ func (asr *StatASR) GetFloat64Value() (val float64) {
// AddEvent is part of StatMetric interface
func (asr *StatASR) AddEvent(ev *utils.CGREvent) (err error) {
var answered bool
var answered int
if at, err := ev.FieldAsTime(utils.AnswerTime,
config.CgrConfig().GeneralCfg().DefaultTimezone); err != nil &&
err != utils.ErrNotFound {
return err
} else if !at.IsZero() {
answered = true
answered = 1
}
if val, has := asr.Events[ev.ID]; !has {
asr.Events[ev.ID] = &AnsweredWithCompress{Answered: answered}
asr.Events[ev.ID] = &AnsweredWithCompress{Answered: float64(answered)}
} else {
val.Answered = (val.Answered*float64(val.CompressFactor) + float64(answered)) / float64(val.CompressFactor)
val.CompressFactor = val.CompressFactor + 1
}
asr.Count += 1
if answered {
if answered == 1 {
asr.Answered += 1
}
asr.val = nil
@@ -152,13 +153,16 @@ func (asr *StatASR) RemEvent(evID string) (err error) {
if !has {
return utils.ErrNotFound
}
if val.Answered {
ans := 0
if val.Answered >= 0.5 {
ans = 1
asr.Answered -= 1
}
asr.Count -= 1
if val.CompressFactor <= 0 {
delete(asr.Events, evID)
} else {
val.Answered = (val.Answered*float64(val.CompressFactor) - float64(ans)) / (float64(val.CompressFactor - 1))
val.CompressFactor = val.CompressFactor - 1
}
asr.val = nil
@@ -246,6 +250,7 @@ func (acd *StatACD) AddEvent(ev *utils.CGREvent) (err error) {
if val, has := acd.Events[ev.ID]; !has {
acd.Events[ev.ID] = &DurationWithCompress{Duration: dur}
} else {
val.Duration = time.Duration((float64(val.Duration.Nanoseconds())*float64(val.CompressFactor) + float64(dur.Nanoseconds())) / float64(val.CompressFactor+1))
val.CompressFactor = val.CompressFactor + 1
}
acd.Count += 1
@@ -343,6 +348,7 @@ func (tcd *StatTCD) AddEvent(ev *utils.CGREvent) (err error) {
if val, has := tcd.Events[ev.ID]; !has {
tcd.Events[ev.ID] = &DurationWithCompress{Duration: dur}
} else {
val.Duration = time.Duration((float64(val.Duration.Nanoseconds())*float64(val.CompressFactor) + float64(dur.Nanoseconds())) / float64(val.CompressFactor+1))
val.CompressFactor = val.CompressFactor + 1
}
tcd.Count += 1
@@ -444,6 +450,7 @@ func (acc *StatACC) AddEvent(ev *utils.CGREvent) (err error) {
if val, has := acc.Events[ev.ID]; !has {
acc.Events[ev.ID] = &StatWithCompress{Stat: cost}
} else {
val.Stat = (val.Stat*float64(val.CompressFactor) + cost) / float64(val.CompressFactor+1)
val.CompressFactor = val.CompressFactor + 1
}
acc.Count += 1
@@ -537,6 +544,7 @@ func (tcc *StatTCC) AddEvent(ev *utils.CGREvent) (err error) {
if val, has := tcc.Events[ev.ID]; !has {
tcc.Events[ev.ID] = &StatWithCompress{Stat: cost}
} else {
val.Stat = (val.Stat*float64(val.CompressFactor) + cost) / float64(val.CompressFactor+1)
val.CompressFactor = val.CompressFactor + 1
}
tcc.Count += 1
@@ -635,6 +643,7 @@ func (pdd *StatPDD) AddEvent(ev *utils.CGREvent) (err error) {
if val, has := pdd.Events[ev.ID]; !has {
pdd.Events[ev.ID] = &DurationWithCompress{Duration: dur}
} else {
val.Duration = time.Duration((float64(val.Duration.Nanoseconds())*float64(val.CompressFactor) + float64(dur.Nanoseconds())) / float64(val.CompressFactor+1))
val.CompressFactor = val.CompressFactor + 1
}
pdd.Count += 1
@@ -805,6 +814,7 @@ func (sum *StatSum) AddEvent(ev *utils.CGREvent) (err error) {
if v, has := sum.Events[ev.ID]; !has {
sum.Events[ev.ID] = &StatWithCompress{Stat: val}
} else {
v.Stat = (v.Stat*float64(v.CompressFactor) + val) / float64(v.CompressFactor+1)
v.CompressFactor = v.CompressFactor + 1
}
sum.Count += 1
@@ -902,6 +912,7 @@ func (avg *StatAverage) AddEvent(ev *utils.CGREvent) (err error) {
if v, has := avg.Events[ev.ID]; !has {
avg.Events[ev.ID] = &StatWithCompress{Stat: val}
} else {
v.Stat = (v.Stat*float64(v.CompressFactor) + val) / float64(v.CompressFactor+1)
v.CompressFactor = v.CompressFactor + 1
}
avg.Count += 1

View File

@@ -1287,7 +1287,7 @@ func TestASRMarshal(t *testing.T) {
"AnswerTime": time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC)}}
asr.AddEvent(ev)
var nasr StatASR
expected := []byte(`{"FilterIDs":["*string:Account:1001"],"Answered":1,"Count":1,"Events":{"EVENT_1":{"Answered":true,"CompressFactor":0}},"MinItems":2}`)
expected := []byte(`{"FilterIDs":["*string:Account:1001"],"Answered":1,"Count":1,"Events":{"EVENT_1":{"Answered":1,"CompressFactor":0}},"MinItems":2}`)
if b, err := asr.Marshal(&jMarshaler); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expected, b) {