From 19d3cf4fd9bbb2b48a312fb50d69537c340d3345 Mon Sep 17 00:00:00 2001 From: Tripon Alexandru-Ionut Date: Tue, 2 Apr 2019 15:07:33 +0300 Subject: [PATCH] Updated stat metrics with CompressFactor --- engine/datamanager_it_test.go | 6 +++--- engine/libstats_test.go | 12 ++++++------ engine/onstor_it_test.go | 12 ++++++------ engine/statmetrics.go | 23 +++++++++++++++++------ engine/statmetrics_test.go | 2 +- 5 files changed, 33 insertions(+), 22 deletions(-) diff --git a/engine/datamanager_it_test.go b/engine/datamanager_it_test.go index 713449602..3ec770b0b 100644 --- a/engine/datamanager_it_test.go +++ b/engine/datamanager_it_test.go @@ -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}, }, }, }, diff --git a/engine/libstats_test.go b/engine/libstats_test.go index c5dc5d647..7689f77c8 100644 --- a/engine/libstats_test.go +++ b/engine/libstats_test.go @@ -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}, }, }, }, diff --git a/engine/onstor_it_test.go b/engine/onstor_it_test.go index e218f2828..830600da1 100644 --- a/engine/onstor_it_test.go +++ b/engine/onstor_it_test.go @@ -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}, }, }, } diff --git a/engine/statmetrics.go b/engine/statmetrics.go index a2b8754b0..fad108410 100644 --- a/engine/statmetrics.go +++ b/engine/statmetrics.go @@ -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 diff --git a/engine/statmetrics_test.go b/engine/statmetrics_test.go index 182cec9db..7ec7cb8f2 100644 --- a/engine/statmetrics_test.go +++ b/engine/statmetrics_test.go @@ -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) {