From e16266ad023d235cf9301bde3c8a1ea57afb5a57 Mon Sep 17 00:00:00 2001 From: porosnicuadrian Date: Wed, 20 Apr 2022 14:30:18 +0300 Subject: [PATCH] Updated metrics for *acc and *tcc --- engine/statmetrics.go | 48 +++++++++++++++++++++++++++++++++++++++++-- utils/consts.go | 1 + 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/engine/statmetrics.go b/engine/statmetrics.go index a4a0adf50..c1b39c149 100644 --- a/engine/statmetrics.go +++ b/engine/statmetrics.go @@ -232,7 +232,12 @@ func (acc *StatACC) GetValue() *utils.Decimal { } func (acc *StatACC) AddEvent(evID string, ev utils.DataProvider) error { - ival, err := ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaCost}) + var newEv utils.DataProvider + var err error + if newEv, err = populateCost(ev); err != nil { + return err + } + ival, err := newEv.FieldAsInterface([]string{utils.MetaOpts, utils.MetaCost}) if err != nil { if err == utils.ErrNotFound { err = utils.ErrPrefix(err, utils.MetaCost) @@ -265,7 +270,12 @@ type StatTCC struct { } func (tcc *StatTCC) AddEvent(evID string, ev utils.DataProvider) error { - ival, err := ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaCost}) + var newEv utils.DataProvider + var err error + if newEv, err = populateCost(ev); err != nil { + return err + } + ival, err := newEv.FieldAsInterface([]string{utils.MetaOpts, utils.MetaCost}) if err != nil { if err == utils.ErrNotFound { err = utils.ErrPrefix(err, utils.MetaCost) @@ -890,3 +900,37 @@ func getStatTenantID(tntID string) (promTntID string, err error) { } return tntID, nil } + +func populateCost(ev utils.DataProvider) (newDP utils.DataProvider, err error) { + // if the cost is present, no need to change + var ival interface{} + if ival, err = ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaCost}); err == nil && ival != nil { + return + } + // if the cost is not present, get it from accounts cost + var cost float64 + if ival, err = ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaAccountSCost, utils.Concretes}); err != nil && err != utils.ErrNotFound { + return + } else if ival != nil { + if cost, err = utils.IfaceAsFloat64(ival); err != nil { + return + } + if err = ev.(*dynamicDP).initialDP.(utils.MapStorage).Set([]string{utils.MetaOpts, utils.MetaCost}, cost); err != nil { + return + } + return ev, nil + } + // if the cost is not present in accounts cost, get it from rates cost + if ival, err = ev.FieldAsInterface([]string{utils.MetaOpts, utils.MetaRateSCost, utils.Cost}); err != nil && err != utils.ErrNotFound { + return + } else if ival != nil { + if cost, err = utils.IfaceAsFloat64(ival); err != nil { + return + } + if err = ev.(*dynamicDP).initialDP.(utils.MapStorage).Set([]string{utils.MetaOpts, utils.MetaCost}, cost); err != nil { + return + } + return ev, nil + } + return +} diff --git a/utils/consts.go b/utils/consts.go index 886e216ec..60b497930 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -737,6 +737,7 @@ const ( MetaRounding = "*rounding" StatsNA = -1.0 InvalidUsage = -1 + Concretes = "Concretes" ActionS = "ActionS" Schedule = "Schedule" ActionFilterIDs = "ActionFilterIDs"