From c861adc0436cfce8ab4d87e75b45d436bc013b53 Mon Sep 17 00:00:00 2001 From: ionutboangiu Date: Thu, 4 Nov 2021 18:22:47 +0200 Subject: [PATCH] Add verification for ignoreFilters opt when matching stats --- engine/stats.go | 39 +++++++++++++++++++++++++++------------ engine/stats_test.go | 24 ++++++++++++------------ 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/engine/stats.go b/engine/stats.go index 40845d6f7..f7b1de9c5 100644 --- a/engine/stats.go +++ b/engine/stats.go @@ -156,9 +156,10 @@ func (sS *StatService) StoreStatQueue(sq *StatQueue) (err error) { } // matchingStatQueuesForEvent returns ordered list of matching statQueues which are active by the time of the call -func (sS *StatService) matchingStatQueuesForEvent(tnt string, statsIDs []string, actTime *time.Time, evNm utils.MapStorage) (sqs StatQueues, err error) { +func (sS *StatService) matchingStatQueuesForEvent(tnt string, statsIDs []string, actTime *time.Time, evNm utils.MapStorage, ignoreFilters bool) (sqs StatQueues, err error) { sqIDs := utils.NewStringSet(statsIDs) if len(sqIDs) == 0 { + ignoreFilters = false sqIDs, err = MatchingItemIDsForEvent(evNm, sS.cgrcfg.StatSCfg().StringIndexedFields, sS.cgrcfg.StatSCfg().PrefixIndexedFields, @@ -192,15 +193,17 @@ func (sS *StatService) matchingStatQueuesForEvent(tnt string, statsIDs []string, sqPrfl.unlock() continue } - var pass bool - if pass, err = sS.filterS.Pass(tnt, sqPrfl.FilterIDs, - evNm); err != nil { - sqPrfl.unlock() - sqs.unlock() - return nil, err - } else if !pass { - sqPrfl.unlock() - continue + if !ignoreFilters { + var pass bool + if pass, err = sS.filterS.Pass(tnt, sqPrfl.FilterIDs, + evNm); err != nil { + sqPrfl.unlock() + sqs.unlock() + return nil, err + } else if !pass { + sqPrfl.unlock() + continue + } } lkID := guardian.Guardian.GuardIDs(utils.EmptyString, config.CgrConfig().GeneralCfg().LockingTimeout, @@ -331,7 +334,13 @@ func (sS *StatService) processEvent(tnt string, args *utils.CGREvent) (statQueue return } } - matchSQs, err := sS.matchingStatQueuesForEvent(tnt, stsIDs, args.Time, evNm) + ignFilters := sS.cgrcfg.StatSCfg().Opts.ProfileIgnoreFilters + if opt, has := args.APIOpts[utils.OptsStatsProfileIDs]; has { + if ignFilters, err = utils.IfaceAsBool(opt); err != nil { + return + } + } + matchSQs, err := sS.matchingStatQueuesForEvent(tnt, stsIDs, args.Time, evNm, ignFilters) if err != nil { return nil, err } @@ -398,11 +407,17 @@ func (sS *StatService) V1GetStatQueuesForEvent(args *utils.CGREvent, reply *[]st return } } + ignFilters := sS.cgrcfg.StatSCfg().Opts.ProfileIgnoreFilters + if opt, has := args.APIOpts[utils.OptsStatsProfileIDs]; has { + if ignFilters, err = utils.IfaceAsBool(opt); err != nil { + return + } + } var sQs StatQueues if sQs, err = sS.matchingStatQueuesForEvent(tnt, stsIDs, args.Time, utils.MapStorage{ utils.MetaReq: args.Event, utils.MetaOpts: args.APIOpts, - }); err != nil { + }, ignFilters); err != nil { return } diff --git a/engine/stats_test.go b/engine/stats_test.go index 03cdd6f5b..91d50cfb5 100644 --- a/engine/stats_test.go +++ b/engine/stats_test.go @@ -242,7 +242,7 @@ func TestMatchingStatQueuesForEvent(t *testing.T) { t.Error(err) } msq, err := statService.matchingStatQueuesForEvent(testStatsArgs[0].Tenant, stsIDs, testStatsArgs[0].Time, - utils.MapStorage{utils.MetaReq: testStatsArgs[0].Event, utils.MetaOpts: testStatsArgs[0].APIOpts}) + utils.MapStorage{utils.MetaReq: testStatsArgs[0].Event, utils.MetaOpts: testStatsArgs[0].APIOpts}, false) if err != nil { t.Errorf("Error: %+v", err) } @@ -259,7 +259,7 @@ func TestMatchingStatQueuesForEvent(t *testing.T) { t.Error(err) } msq, err = statService.matchingStatQueuesForEvent(testStatsArgs[1].Tenant, stsIDs, testStatsArgs[1].Time, - utils.MapStorage{utils.MetaReq: testStatsArgs[1].Event, utils.MetaOpts: testStatsArgs[1].APIOpts}) + utils.MapStorage{utils.MetaReq: testStatsArgs[1].Event, utils.MetaOpts: testStatsArgs[1].APIOpts}, false) if err != nil { t.Errorf("Error: %+v", err) } @@ -276,7 +276,7 @@ func TestMatchingStatQueuesForEvent(t *testing.T) { t.Error(err) } msq, err = statService.matchingStatQueuesForEvent(testStatsArgs[2].Tenant, stsIDs, testStatsArgs[2].Time, - utils.MapStorage{utils.MetaReq: testStatsArgs[2].Event, utils.MetaOpts: testStatsArgs[2].APIOpts}) + utils.MapStorage{utils.MetaReq: testStatsArgs[2].Event, utils.MetaOpts: testStatsArgs[2].APIOpts}, false) if err != nil { t.Errorf("Error: %+v", err) } @@ -358,7 +358,7 @@ func TestStatQueuesMatchWithIndexFalse(t *testing.T) { t.Error(err) } msq, err := statService.matchingStatQueuesForEvent(testStatsArgs[0].Tenant, stsIDs, testStatsArgs[0].Time, - utils.MapStorage{utils.MetaReq: testStatsArgs[0].Event, utils.MetaOpts: testStatsArgs[0].APIOpts}) + utils.MapStorage{utils.MetaReq: testStatsArgs[0].Event, utils.MetaOpts: testStatsArgs[0].APIOpts}, false) if err != nil { t.Errorf("Error: %+v", err) } @@ -375,7 +375,7 @@ func TestStatQueuesMatchWithIndexFalse(t *testing.T) { t.Error(err) } msq, err = statService.matchingStatQueuesForEvent(testStatsArgs[1].Tenant, stsIDs, testStatsArgs[1].Time, - utils.MapStorage{utils.MetaReq: testStatsArgs[1].Event, utils.MetaOpts: testStatsArgs[1].APIOpts}) + utils.MapStorage{utils.MetaReq: testStatsArgs[1].Event, utils.MetaOpts: testStatsArgs[1].APIOpts}, false) if err != nil { t.Errorf("Error: %+v", err) } @@ -392,7 +392,7 @@ func TestStatQueuesMatchWithIndexFalse(t *testing.T) { t.Error(err) } msq, err = statService.matchingStatQueuesForEvent(testStatsArgs[2].Tenant, stsIDs, testStatsArgs[2].Time, - utils.MapStorage{utils.MetaReq: testStatsArgs[2].Event, utils.MetaOpts: testStatsArgs[2].APIOpts}) + utils.MapStorage{utils.MetaReq: testStatsArgs[2].Event, utils.MetaOpts: testStatsArgs[2].APIOpts}, false) if err != nil { t.Errorf("Error: %+v", err) } @@ -692,7 +692,7 @@ func TestStatQueueMatchingStatQueuesForEventLocks(t *testing.T) { ids.Add(rPrf.ID) } dm.RemoveStatQueue("cgrates.org", "STS1") - _, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), nil, utils.MapStorage{}) + _, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), nil, utils.MapStorage{}, false) if err != utils.ErrNotFound { t.Errorf("Error: %+v", err) } @@ -753,7 +753,7 @@ func TestStatQueueMatchingStatQueuesForEventLocks2(t *testing.T) { } prfs = append(prfs, rPrf) ids.Add(rPrf.ID) - _, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), nil, utils.MapStorage{}) + _, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), nil, utils.MapStorage{}, false) expErr := utils.ErrPrefixNotFound(rPrf.FilterIDs[0]) if err == nil || err.Error() != expErr.Error() { t.Errorf("Expected error: %s ,received: %+v", expErr, err) @@ -800,7 +800,7 @@ func TestStatQueueMatchingStatQueuesForEventLocksBlocker(t *testing.T) { prfs = append(prfs, rPrf) ids.Add(rPrf.ID) } - mres, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), nil, utils.MapStorage{}) + mres, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), nil, utils.MapStorage{}, false) if err != nil { t.Errorf("Error: %+v", err) } @@ -867,7 +867,7 @@ func TestStatQueueMatchingStatQueuesForEventLocksActivationInterval(t *testing.T } dm.SetStatQueueProfile(rPrf, true) ids.Add(rPrf.ID) - mres, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), utils.TimePointer(time.Now()), utils.MapStorage{}) + mres, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), utils.TimePointer(time.Now()), utils.MapStorage{}, false) if err != nil { t.Errorf("Error: %+v", err) } @@ -919,7 +919,7 @@ func TestStatQueueMatchingStatQueuesForEventLocks3(t *testing.T) { for i := 0; i < 10; i++ { ids.Add(fmt.Sprintf("STS%d", i)) } - _, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), nil, utils.MapStorage{}) + _, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), nil, utils.MapStorage{}, false) if err != utils.ErrNotImplemented { t.Fatalf("Error: %+v", err) } @@ -958,7 +958,7 @@ func TestStatQueueMatchingStatQueuesForEventLocks4(t *testing.T) { ids.Add(rPrf.ID) } ids.Add("STS20") - mres, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), nil, utils.MapStorage{}) + mres, err := rS.matchingStatQueuesForEvent("cgrates.org", ids.AsSlice(), nil, utils.MapStorage{}, false) if err != nil { t.Errorf("Error: %+v", err) }