diff --git a/apier/v1/stats_it_test.go b/apier/v1/stats_it_test.go index 1d6948b16..f851cad86 100644 --- a/apier/v1/stats_it_test.go +++ b/apier/v1/stats_it_test.go @@ -20,6 +20,9 @@ along with this program. If not, see package v1 import ( + "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/engine" + "github.com/cgrates/cgrates/utils" "math/rand" "net/rpc" "net/rpc/jsonrpc" @@ -27,10 +30,6 @@ import ( "reflect" "testing" "time" - - "github.com/cgrates/cgrates/config" - "github.com/cgrates/cgrates/engine" - "github.com/cgrates/cgrates/utils" ) var ( @@ -47,12 +46,14 @@ var evs = []*engine.StatEvent{ Tenant: "cgrates.org", ID: "event1", Fields: map[string]interface{}{ - utils.ANSWER_TIME: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC).Local()}}, + utils.ANSWER_TIME: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC).Local(), + }}, &engine.StatEvent{ Tenant: "cgrates.org", ID: "event2", Fields: map[string]interface{}{ - utils.ANSWER_TIME: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC).Local()}}, + utils.ANSWER_TIME: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC).Local(), + }}, &engine.StatEvent{ Tenant: "cgrates.org", ID: "event3", @@ -151,9 +152,12 @@ func testV1STSGetStats(t *testing.T) { expectedMetrics := map[string]string{ utils.MetaASR: utils.NOT_AVAILABLE, utils.MetaACD: utils.NOT_AVAILABLE, + utils.MetaTCC: utils.NOT_AVAILABLE, + utils.MetaTCD: utils.NOT_AVAILABLE, + utils.MetaACC: utils.NOT_AVAILABLE, } if err := stsV1Rpc.Call("StatSV1.GetQueueStringMetrics", - &utils.TenantID{"cgrates.org", expectedIDs[0]}, &metrics); err != nil { + &utils.TenantID{Tenant: "cgrates.org", ID: expectedIDs[0]}, &metrics); err != nil { t.Error(err) } else if !reflect.DeepEqual(expectedMetrics, metrics) { t.Errorf("expecting: %+v, received reply: %s", expectedMetrics, metrics) @@ -162,51 +166,52 @@ func testV1STSGetStats(t *testing.T) { func testV1STSProcessEvent(t *testing.T) { var reply string - if err := stsV1Rpc.Call("StatSV1.ProcessEvent", - engine.StatEvent{ - Tenant: "cgrates.org", - ID: "event1", - Fields: map[string]interface{}{ - utils.ACCOUNT: "1001", - utils.ANSWER_TIME: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), - utils.USAGE: time.Duration(125 * time.Second)}}, - &reply); err != nil { + ev1 := engine.StatEvent{ + Tenant: "cgrates.org", + ID: "event1", + Fields: map[string]interface{}{ + utils.ACCOUNT: "1001", + utils.ANSWER_TIME: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), + utils.USAGE: time.Duration(135 * time.Second), + utils.COST: 123.0}} + if err := stsV1Rpc.Call("StatSV1.ProcessEvent", &ev1, &reply); err != nil { t.Error(err) } else if reply != utils.OK { t.Errorf("received reply: %s", reply) } - if err := stsV1Rpc.Call("StatSV1.ProcessEvent", - engine.StatEvent{ - Tenant: "cgrates.org", - ID: "event2", - Fields: map[string]interface{}{ - utils.ACCOUNT: "1002", - utils.ANSWER_TIME: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), - utils.USAGE: time.Duration(45 * time.Second)}}, - &reply); err != nil { + ev2 := engine.StatEvent{ + Tenant: "cgrates.org", + ID: "event2", + Fields: map[string]interface{}{ + utils.ACCOUNT: "1002", + utils.ANSWER_TIME: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), + utils.USAGE: time.Duration(45 * time.Second)}} + if err := stsV1Rpc.Call("StatSV1.ProcessEvent", &ev2, &reply); err != nil { t.Error(err) } else if reply != utils.OK { t.Errorf("received reply: %s", reply) } - if err := stsV1Rpc.Call("StatSV1.ProcessEvent", - engine.StatEvent{ - Tenant: "cgrates.org", - ID: "event3", - Fields: map[string]interface{}{ - utils.ACCOUNT: "1002", - utils.SETUP_TIME: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), - utils.USAGE: 0}}, - &reply); err != nil { + ev3 := engine.StatEvent{ + Tenant: "cgrates.org", + ID: "event3", + Fields: map[string]interface{}{ + utils.ACCOUNT: "1002", + utils.SETUP_TIME: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), + utils.USAGE: 0}} + if err := stsV1Rpc.Call("StatSV1.ProcessEvent", &ev3, &reply); err != nil { t.Error(err) } else if reply != utils.OK { t.Errorf("received reply: %s", reply) } expectedMetrics := map[string]string{ utils.MetaASR: "66.66667%", - utils.MetaACD: "0s", + utils.MetaACD: "1m30s", + utils.MetaACC: "61.5", + utils.MetaTCD: "3m0s", + utils.MetaTCC: "123", } var metrics map[string]string - if err := stsV1Rpc.Call("StatSV1.GetQueueStringMetrics", &utils.TenantID{"cgrates.org", "STATS_1"}, &metrics); err != nil { + if err := stsV1Rpc.Call("StatSV1.GetQueueStringMetrics", &utils.TenantID{Tenant: "cgrates.org", ID: "STATS_1"}, &metrics); err != nil { t.Error(err) } else if !reflect.DeepEqual(expectedMetrics, metrics) { t.Errorf("expecting: %+v, received reply: %s", expectedMetrics, metrics) diff --git a/data/tariffplans/testtp/Stats.csv b/data/tariffplans/testtp/Stats.csv index 28fb633ff..8cc037dab 100755 --- a/data/tariffplans/testtp/Stats.csv +++ b/data/tariffplans/testtp/Stats.csv @@ -1,2 +1,2 @@ #Tenant[0],Id[1],FilterType[2],FilterFieldName[3],FilterFieldValues[4],ActivationInterval[5],QueueLength[6],TTL[7],Metrics[8],Blocker[9],Stored[10],Weight[11],Thresholds[12] -cgrates.org,Stats1,*string,Account,1001;1002,2014-07-29T15:00:00Z,100,1s,*asr;*acd;*acc,true,true,20,THRESH1;THRESH2 +cgrates.org,Stats1,*string,Account,1001;1002,2014-07-29T15:00:00Z,100,1s,*asr;*acd;*acc;*tcd;*tcc,true,true,20,THRESH1;THRESH2 diff --git a/data/tariffplans/tutorial/Stats.csv b/data/tariffplans/tutorial/Stats.csv index b3122b4db..db4cccbad 100755 --- a/data/tariffplans/tutorial/Stats.csv +++ b/data/tariffplans/tutorial/Stats.csv @@ -1,2 +1,2 @@ #Tenant[0],Id[1],FilterType[2],FilterFieldName[3],FilterFieldValues[4],ActivationInterval[5],QueueLength[6],TTL[7],Metrics[8],Blocker[9],Stored[10],Weight[11],Thresholds[12] -cgrates.org,STATS_1,*string,Account,1001;1002,2014-07-29T15:00:00Z,100,1s,*asr;*acd,true,true,20,THRESH1;THRESH2 \ No newline at end of file +cgrates.org,STATS_1,*string,Account,1001;1002,2014-07-29T15:00:00Z,100,1s,*asr;*acc;*tcc;*acd;*tcd,true,true,20,THRESH1;THRESH2 diff --git a/engine/libstats.go b/engine/libstats.go index 96c08ecc8..2ff21724a 100755 --- a/engine/libstats.go +++ b/engine/libstats.go @@ -80,6 +80,9 @@ func (se StatEvent) Usage(timezone string) (at time.Duration, err error) { if !has { return at, utils.ErrNotFound } + if us, canCast := usIf.(float64); canCast { + return time.Duration(int64(us)), nil + } if us, canCast := usIf.(time.Duration); canCast { return us, nil } diff --git a/engine/statmetrics.go b/engine/statmetrics.go index 365e7363d..d4392aacc 100644 --- a/engine/statmetrics.go +++ b/engine/statmetrics.go @@ -181,8 +181,7 @@ func (acd *StatACD) GetFloat64Value() (v float64) { func (acd *StatACD) AddEvent(ev *StatEvent) (err error) { var value time.Duration - if at, err := ev.AnswerTime(config.CgrConfig().DefaultTimezone); err != nil && - err != utils.ErrNotFound { + if at, err := ev.AnswerTime(config.CgrConfig().DefaultTimezone); err != nil { return err } else if !at.IsZero() { if duration, err := ev.Usage(config.CgrConfig().DefaultTimezone); err != nil && @@ -264,8 +263,7 @@ func (tcd *StatTCD) GetFloat64Value() (v float64) { func (tcd *StatTCD) AddEvent(ev *StatEvent) (err error) { var value time.Duration - if at, err := ev.AnswerTime(config.CgrConfig().DefaultTimezone); err != nil && - err != utils.ErrNotFound { + if at, err := ev.AnswerTime(config.CgrConfig().DefaultTimezone); err != nil { return err } else if !at.IsZero() { if duration, err := ev.Usage(config.CgrConfig().DefaultTimezone); err != nil && @@ -348,8 +346,7 @@ func (acc *StatACC) GetFloat64Value() (v float64) { func (acc *StatACC) AddEvent(ev *StatEvent) (err error) { var value float64 - if at, err := ev.AnswerTime(config.CgrConfig().DefaultTimezone); err != nil && - err != utils.ErrNotFound { + if at, err := ev.AnswerTime(config.CgrConfig().DefaultTimezone); err != nil { return err } else if !at.IsZero() { if cost, err := ev.Cost(config.CgrConfig().DefaultTimezone); err != nil && @@ -430,8 +427,7 @@ func (tcc *StatTCC) GetFloat64Value() (v float64) { func (tcc *StatTCC) AddEvent(ev *StatEvent) (err error) { var value float64 - if at, err := ev.AnswerTime(config.CgrConfig().DefaultTimezone); err != nil && - err != utils.ErrNotFound { + if at, err := ev.AnswerTime(config.CgrConfig().DefaultTimezone); err != nil { return err } else if !at.IsZero() { if cost, err := ev.Cost(config.CgrConfig().DefaultTimezone); err != nil && diff --git a/engine/statmetrics_test.go b/engine/statmetrics_test.go index d0332d25d..7b3ac0a7f 100644 --- a/engine/statmetrics_test.go +++ b/engine/statmetrics_test.go @@ -119,7 +119,7 @@ func TestACDGetStringValue(t *testing.T) { acd, _ := NewACD() ev := &StatEvent{Tenant: "cgrates.org", ID: "EVENT_1", Fields: map[string]interface{}{ - "Usage": time.Duration(10 * time.Second), + utils.USAGE: time.Duration(10 * time.Second), "AnswerTime": time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), }} if strVal := acd.GetStringValue(""); strVal != utils.NOT_AVAILABLE {