Improved stats + tests

This commit is contained in:
porosnicuadrian
2022-04-08 16:28:02 +03:00
committed by Dan Christian Bogos
parent d8289fa9d6
commit bb41017266
7 changed files with 711 additions and 734 deletions

View File

@@ -84,13 +84,13 @@ func TestStatRemEventWithID(t *testing.T) {
t.Errorf("unexpected Events in asrMetric: %+v", asrMetric.Events)
}
sq.remEventWithID("cgrates.org:TestRemEventWithID_2")
if asr := asrMetric.GetValue(); asr.Compare(utils.NewDecimal(-1, 0)) != 0 {
if asr := asrMetric.GetValue(); asr.Compare(utils.DecimalNaN) != 0 {
t.Errorf("received asrMetric: %v", asrMetric)
} else if len(asrMetric.Events) != 0 {
t.Errorf("unexpected Events in asrMetric: %+v", asrMetric.Events)
}
sq.remEventWithID("cgrates.org:TestRemEventWithID_2")
if asr := asrMetric.GetValue(); asr.Compare(utils.NewDecimal(-1, 0)) != 0 {
if asr := asrMetric.GetValue(); asr.Compare(utils.DecimalNaN) != 0 {
t.Errorf("received asrMetric: %v", asrMetric)
} else if len(asrMetric.Events) != 0 {
t.Errorf("unexpected Events in asrMetric: %+v", asrMetric.Events)
@@ -131,13 +131,13 @@ func TestStatRemEventWithID2(t *testing.T) {
}
sq.remEventWithID("cgrates.org:TestRemEventWithID_2")
sq.remEventWithID("cgrates.org:TestRemEventWithID_1")
if asr := asrMetric.GetValue(); asr.Compare(utils.NewDecimal(-1, 0)) != 0 {
if asr := asrMetric.GetValue(); asr.Compare(utils.DecimalNaN) != 0 {
t.Errorf("received asrMetric: %v", asrMetric)
} else if len(asrMetric.Events) != 0 {
t.Errorf("unexpected Events in asrMetric: %+v", asrMetric.Events)
}
sq.remEventWithID("cgrates.org:TestRemEventWithID_2")
if asr := asrMetric.GetValue(); asr.Compare(utils.NewDecimal(-1, 0)) != 0 {
if asr := asrMetric.GetValue(); asr.Compare(utils.DecimalNaN) != 0 {
t.Errorf("received asrMetric: %v", asrMetric)
} else if len(asrMetric.Events) != 0 {
t.Errorf("unexpected Events in asrMetric: %+v", asrMetric.Events)
@@ -234,15 +234,19 @@ func TestStatAddStatEvent(t *testing.T) {
t.Errorf("received ASR: %v", asr)
}
ev1 := &utils.CGREvent{Tenant: "cgrates.org", ID: "TestStatAddStatEvent_1"}
sq.addStatEvent(context.Background(), ev1.Tenant, ev1.ID, nil, utils.MapStorage{utils.MetaReq: ev1.Event})
sq.addStatEvent(context.Background(), ev1.Tenant, ev1.ID, nil, utils.MapStorage{utils.MetaOpts: ev1.Event})
if asr := asrMetric.GetValue(); asr.Compare(utils.NewDecimalFromFloat64(50)) != 0 {
t.Errorf("received ASR: %v", asr)
} else if asrMetric.Value.Compare(utils.NewDecimal(1, 0)) != 0 || asrMetric.Count != 2 {
t.Errorf("ASR: %v", asrMetric)
}
ev1.Event = map[string]interface{}{
utils.AnswerTime: time.Now()}
sq.addStatEvent(context.Background(), ev1.Tenant, ev1.ID, nil, utils.MapStorage{utils.MetaReq: ev1.Event})
/*
ev1.Event = map[string]interface{}{
utils.AnswerTime: time.Now()}
*/
ev1.APIOpts = map[string]interface{}{
utils.MetaStartTime: time.Now()}
sq.addStatEvent(context.Background(), ev1.Tenant, ev1.ID, nil, utils.MapStorage{utils.MetaOpts: ev1.APIOpts})
if asr := asrMetric.GetValue(); asr.Compare(utils.NewDecimalFromFloat64(66.66666666666667)) != 0 {
t.Errorf("received ASR: %v", asr)
} else if asrMetric.Value.Compare(utils.NewDecimal(2, 0)) != 0 || asrMetric.Count != 3 {

View File

@@ -99,22 +99,15 @@ func (asr *StatASR) GetValue() (val *utils.Decimal) {
func (asr *StatASR) AddEvent(evID string, ev utils.DataProvider) (err error) {
var answered int
var val interface{}
if val, err = ev.FieldAsInterface([]string{utils.MetaReq, utils.AnswerTime}); err != nil {
if err == utils.ErrNotFound {
if val, err = ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaStartTime}); err != nil {
if err != utils.ErrNotFound {
return utils.ErrPrefix(err, utils.MetaStartTime)
}
}
}
}
if val != nil {
if at, err := utils.IfaceAsTime(val,
config.CgrConfig().GeneralCfg().DefaultTimezone); err != nil {
if val, err = ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaStartTime}); err != nil {
if err != utils.ErrNotFound {
return err
} else if !at.IsZero() {
answered = 1
}
} else if at, err := utils.IfaceAsTime(val,
config.CgrConfig().GeneralCfg().DefaultTimezone); err != nil {
return err
} else if !at.IsZero() {
answered = 1
}
return asr.addEvent(evID, answered)
}
@@ -171,18 +164,12 @@ func (acd *StatACD) GetValue() *utils.Decimal {
}
func (acd *StatACD) AddEvent(evID string, ev utils.DataProvider) (err error) {
var ival interface{}
if ival, err = ev.FieldAsInterface([]string{utils.MetaReq, utils.Usage}); err != nil {
ival, err := ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaUsage})
if err != nil {
if err == utils.ErrNotFound {
if ival, err = ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaUsage}); err != nil {
if err == utils.ErrNotFound {
return utils.ErrPrefix(err, utils.MetaUsage)
}
return err
}
} else {
return err
err = utils.ErrPrefix(err, utils.MetaUsage)
}
return err
}
return acd.addEvent(evID, ival)
}
@@ -211,18 +198,12 @@ func (sum *StatTCD) GetStringValue(rounding int) string {
}
func (sum *StatTCD) AddEvent(evID string, ev utils.DataProvider) (err error) {
var ival interface{}
if ival, err = ev.FieldAsInterface([]string{utils.MetaReq, utils.Usage}); err != nil {
ival, err := ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaUsage})
if err != nil {
if err == utils.ErrNotFound {
if ival, err = ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaUsage}); err != nil {
if err == utils.ErrNotFound {
return utils.ErrPrefix(err, utils.MetaUsage)
}
return err
}
} else {
return err
err = utils.ErrPrefix(err, utils.MetaUsage)
}
return err
}
return sum.addEvent(evID, ival)
}
@@ -250,26 +231,20 @@ func (acc *StatACC) GetValue() *utils.Decimal {
return acc.getAvgValue()
}
func (acc *StatACC) AddEvent(evID string, ev utils.DataProvider) (err error) {
var ival interface{}
if ival, err = ev.FieldAsInterface([]string{utils.MetaReq, utils.Cost}); err != nil {
func (acc *StatACC) AddEvent(evID string, ev utils.DataProvider) error {
ival, err := ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaCost})
if err != nil {
if err == utils.ErrNotFound {
if ival, err = ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaCost}); err != nil {
if err == utils.ErrNotFound {
return utils.ErrPrefix(err, utils.MetaUsage)
}
return err
}
} else {
return err
err = utils.ErrPrefix(err, utils.MetaCost)
}
return err
}
val, err := utils.IfaceAsBig(ival)
if err != nil {
return err
}
if val.Cmp(decimal.New(0, 0)) < 0 {
return utils.ErrPrefix(utils.ErrNegative, utils.Cost)
return utils.ErrPrefix(utils.ErrNegative, utils.MetaCost)
}
return acc.addEvent(evID, val)
}
@@ -289,26 +264,20 @@ type StatTCC struct {
*Metric
}
func (tcc *StatTCC) AddEvent(evID string, ev utils.DataProvider) (err error) {
var ival interface{}
if ival, err = ev.FieldAsInterface([]string{utils.MetaReq, utils.Cost}); err != nil {
func (tcc *StatTCC) AddEvent(evID string, ev utils.DataProvider) error {
ival, err := ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaCost})
if err != nil {
if err == utils.ErrNotFound {
if ival, err = ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaCost}); err != nil {
if err == utils.ErrNotFound {
return utils.ErrPrefix(err, utils.MetaUsage)
}
return err
}
} else {
return err
err = utils.ErrPrefix(err, utils.MetaCost)
}
return err
}
val, err := utils.IfaceAsBig(ival)
if err != nil {
return err
}
if val.Cmp(decimal.New(0, 0)) < 0 {
return utils.ErrPrefix(utils.ErrNegative, utils.Cost)
return utils.ErrPrefix(utils.ErrNegative, utils.MetaCost)
}
return tcc.addEvent(evID, val)
}
@@ -767,8 +736,8 @@ func (dst *StatDistinct) GetValue() *utils.Decimal {
func (dst *StatDistinct) AddEvent(evID string, ev utils.DataProvider) (err error) {
var fieldValue string
// simply remove the ~*req. prefix and do normal process
if !strings.HasPrefix(dst.FieldName, utils.DynamicDataPrefix+utils.MetaReq+utils.NestingSep) {
// simply remove the ~*req./~*opts. prefix and do normal process
if !strings.HasPrefix(dst.FieldName, utils.DynamicDataPrefix+utils.MetaReq+utils.NestingSep) && !strings.HasPrefix(dst.FieldName, utils.DynamicDataPrefix+utils.MetaOpts+utils.NestingSep) {
return fmt.Errorf("Invalid format for field <%s>", dst.FieldName)
}

File diff suppressed because it is too large Load Diff

View File

@@ -483,7 +483,7 @@ func TestStatQueuesUpdateStatQueue(t *testing.T) {
Metrics: []*MetricWithFilters{{MetricID: utils.MetaTCC}},
}
sqm := NewTCC(0, utils.EmptyString, nil)
if err = sqm.AddEvent("ev1", utils.MapStorage{utils.MetaReq: utils.MapStorage{utils.Cost: 10}}); err != nil {
if err = sqm.AddEvent("ev1", utils.MapStorage{utils.MetaOpts: utils.MapStorage{utils.MetaCost: 10}}); err != nil {
t.Fatal(err)
}
sq := &StatQueue{