From ec145d778ea63763fd49e71352c236203ed1b7af Mon Sep 17 00:00:00 2001 From: ionutboangiu Date: Wed, 11 Jun 2025 11:55:07 +0300 Subject: [PATCH] remove :*ids: syntax from agent stats/thresholds flags --- agents/diam_prom_it_test.go | 44 ++++++++- agents/libagents.go | 22 +++-- agents/radagent.go | 12 ++- diff.txt | 178 ++++++++++++++++++++++++++++++++++++ 4 files changed, 238 insertions(+), 18 deletions(-) create mode 100644 diff.txt diff --git a/agents/diam_prom_it_test.go b/agents/diam_prom_it_test.go index 381d3cd83..b53612b21 100644 --- a/agents/diam_prom_it_test.go +++ b/agents/diam_prom_it_test.go @@ -69,7 +69,7 @@ func TestDiamPrometheus(t *testing.T) { "prometheus_agent": { "enabled": true, "stats_conns": ["*localhost"], - "stat_queue_ids": ["SQ_1"] + "stat_queue_ids": ["SQ_1","SQ_2"] }, "stats": { "enabled": true, @@ -105,8 +105,8 @@ func TestDiamPrometheus(t *testing.T) { "*message", "*accounts", "*cdrs", - "*daStats:*ids:SQ_1", - "*daThresholds:*ids:TH_1", + "*daStats:SQ_1&SQ_2", + "*daThresholds:TH_1&TH_2", ], "request_fields": [{ "tag": "ToR", @@ -248,6 +248,29 @@ cgrates.org,DEFAULT,*string:~*req.Account:1001,,*default,*none,10`, t.Fatal(err) } + if err := client.Call(context.Background(), utils.APIerSv1SetStatQueueProfile, + engine.StatQueueProfileWithAPIOpts{ + StatQueueProfile: &engine.StatQueueProfile{ + Tenant: "cgrates.org", + ID: "SQ_2", + FilterIDs: []string{"*string:~*req.Category:sms"}, + QueueLength: -1, + TTL: 10 * time.Second, + Metrics: []*engine.MetricWithFilters{ + { + MetricID: "*average#~*req.ProcessingTime", + }, + { + MetricID: "*sum#~*req.ProcessingTime", + }, + }, + Stored: true, + MinItems: 1, + }, + }, &reply); err != nil { + t.Fatal(err) + } + if err := client.Call(context.Background(), utils.APIerSv1SetThresholdProfile, engine.ThresholdProfileWithAPIOpts{ ThresholdProfile: &engine.ThresholdProfile{ @@ -263,6 +286,21 @@ cgrates.org,DEFAULT,*string:~*req.Account:1001,,*default,*none,10`, t.Fatal(err) } + if err := client.Call(context.Background(), utils.APIerSv1SetThresholdProfile, + engine.ThresholdProfileWithAPIOpts{ + ThresholdProfile: &engine.ThresholdProfile{ + Tenant: "cgrates.org", + ID: "TH_2", + FilterIDs: []string{"*string:~*req.Category:sms"}, + MaxHits: -1, + MinHits: 10, + MinSleep: time.Second, + ActionIDs: []string{"ACT_LOG_WARNING"}, + }, + }, &reply); err != nil { + t.Fatal(err) + } + time.Sleep(500 * time.Millisecond) diamClient, err := NewDiameterClient(cfg.DiameterAgentCfg().Listen, "localhost", cfg.DiameterAgentCfg().OriginRealm, cfg.DiameterAgentCfg().VendorID, diff --git a/agents/libagents.go b/agents/libagents.go index 6f189cd57..80916f7de 100644 --- a/agents/libagents.go +++ b/agents/libagents.go @@ -213,21 +213,21 @@ func processRequest(ctx *context.Context, reqProcessor *config.RequestProcessor, return true, nil } - var statIDs, thIDs []string + var rawStatIDs, rawThIDs string switch agentName { case utils.DiameterAgent: - statIDs = reqProcessor.Flags.ParamsSlice(utils.MetaDAStats, utils.MetaIDs) - thIDs = reqProcessor.Flags.ParamsSlice(utils.MetaDAThresholds, utils.MetaIDs) + rawStatIDs = reqProcessor.Flags.ParamValue(utils.MetaDAStats) + rawThIDs = reqProcessor.Flags.ParamValue(utils.MetaDAThresholds) case utils.HTTPAgent: - statIDs = reqProcessor.Flags.ParamsSlice(utils.MetaHAStats, utils.MetaIDs) - thIDs = reqProcessor.Flags.ParamsSlice(utils.MetaHAThresholds, utils.MetaIDs) + rawStatIDs = reqProcessor.Flags.ParamValue(utils.MetaHAStats) + rawThIDs = reqProcessor.Flags.ParamValue(utils.MetaHAThresholds) case utils.DNSAgent: - statIDs = reqProcessor.Flags.ParamsSlice(utils.MetaDNSStats, utils.MetaIDs) - thIDs = reqProcessor.Flags.ParamsSlice(utils.MetaDNSThresholds, utils.MetaIDs) + rawStatIDs = reqProcessor.Flags.ParamValue(utils.MetaDNSStats) + rawThIDs = reqProcessor.Flags.ParamValue(utils.MetaDNSThresholds) } // Return early if nothing to process. - if len(statIDs) == 0 && len(thIDs) == 0 { + if rawStatIDs == "" && rawThIDs == "" { return true, nil } @@ -241,7 +241,8 @@ func processRequest(ctx *context.Context, reqProcessor *config.RequestProcessor, ev.Event[utils.Source] = agentName ev.APIOpts[utils.MetaEventType] = utils.ProcessTime - if len(statIDs) > 0 { + if rawStatIDs != "" { + statIDs := strings.Split(rawStatIDs, utils.ANDSep) ev.APIOpts[utils.OptsStatsProfileIDs] = statIDs var reply []string if err := connMgr.Call(ctx, statsConns, utils.StatSv1ProcessEvent, @@ -252,7 +253,8 @@ func processRequest(ctx *context.Context, reqProcessor *config.RequestProcessor, // NOTE: ProfileIDs APIOpts key persists for the ThresholdS request, // although it would be ignored. Might want to delete it. } - if len(thIDs) > 0 { + if rawThIDs != "" { + thIDs := strings.Split(rawThIDs, utils.ANDSep) ev.APIOpts[utils.OptsThresholdsProfileIDs] = thIDs var reply []string if err := connMgr.Call(ctx, thConns, utils.ThresholdSv1ProcessEvent, diff --git a/agents/radagent.go b/agents/radagent.go index c942dd1da..ffb8861eb 100644 --- a/agents/radagent.go +++ b/agents/radagent.go @@ -482,11 +482,11 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R return true, nil } - statIDs := reqProcessor.Flags.ParamsSlice(utils.MetaRAStats, utils.MetaIDs) - thIDs := reqProcessor.Flags.ParamsSlice(utils.MetaRAThresholds, utils.MetaIDs) + rawStatIDs := reqProcessor.Flags.ParamValue(utils.MetaRAStats) + rawThIDs := reqProcessor.Flags.ParamValue(utils.MetaRAThresholds) // Early return if nothing to process. - if len(statIDs) == 0 && len(thIDs) == 0 { + if rawStatIDs == "" && rawThIDs == "" { return true, nil } @@ -500,7 +500,8 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R ev.Event[utils.Source] = utils.RadiusAgent ev.APIOpts[utils.MetaEventType] = utils.ProcessTime - if len(statIDs) > 0 { + if rawStatIDs != "" { + statIDs := strings.Split(rawStatIDs, utils.ANDSep) ev.APIOpts[utils.OptsStatsProfileIDs] = statIDs var reply []string if err := ra.connMgr.Call(ra.ctx, ra.cgrCfg.RadiusAgentCfg().StatSConns, @@ -511,7 +512,8 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R // NOTE: ProfileIDs APIOpts key persists for the ThresholdS request, // although it would be ignored. Might want to delete it. } - if len(thIDs) > 0 { + if rawThIDs != "" { + thIDs := strings.Split(rawThIDs, utils.ANDSep) ev.APIOpts[utils.OptsThresholdsProfileIDs] = thIDs var reply []string if err := ra.connMgr.Call(ra.ctx, ra.cgrCfg.RadiusAgentCfg().ThresholdSConns, diff --git a/diff.txt b/diff.txt new file mode 100644 index 000000000..38d768ee2 --- /dev/null +++ b/diff.txt @@ -0,0 +1,178 @@ +diff --git a/agents/diam_prom_it_test.go b/agents/diam_prom_it_test.go +index 381d3cd83..a05a9c437 100644 +--- a/agents/diam_prom_it_test.go ++++ b/agents/diam_prom_it_test.go +@@ -34,7 +34,7 @@ import ( + ) + + func TestDiamPrometheus(t *testing.T) { +- t.Skip("test by looking at the log output") ++ // t.Skip("test by looking at the log output") + switch *utils.DBType { + case utils.MetaInternal: + case utils.MetaMySQL, utils.MetaMongo, utils.MetaPostgres: +@@ -69,7 +69,7 @@ func TestDiamPrometheus(t *testing.T) { + "prometheus_agent": { + "enabled": true, + "stats_conns": ["*localhost"], +- "stat_queue_ids": ["SQ_1"] ++ "stat_queue_ids": ["SQ_1","SQ_2"] + }, + "stats": { + "enabled": true, +@@ -105,8 +105,8 @@ func TestDiamPrometheus(t *testing.T) { + "*message", + "*accounts", + "*cdrs", +- "*daStats:*ids:SQ_1", +- "*daThresholds:*ids:TH_1", ++ "*daStats:SQ_1&SQ_2", ++ "*daThresholds:TH_1&TH_2", + ], + "request_fields": [{ + "tag": "ToR", +@@ -248,6 +248,29 @@ cgrates.org,DEFAULT,*string:~*req.Account:1001,,*default,*none,10`, + t.Fatal(err) + } + ++ if err := client.Call(context.Background(), utils.APIerSv1SetStatQueueProfile, ++ engine.StatQueueProfileWithAPIOpts{ ++ StatQueueProfile: &engine.StatQueueProfile{ ++ Tenant: "cgrates.org", ++ ID: "SQ_2", ++ FilterIDs: []string{"*string:~*req.Category:sms"}, ++ QueueLength: -1, ++ TTL: 10 * time.Second, ++ Metrics: []*engine.MetricWithFilters{ ++ { ++ MetricID: "*average#~*req.ProcessingTime", ++ }, ++ { ++ MetricID: "*sum#~*req.ProcessingTime", ++ }, ++ }, ++ Stored: true, ++ MinItems: 1, ++ }, ++ }, &reply); err != nil { ++ t.Fatal(err) ++ } ++ + if err := client.Call(context.Background(), utils.APIerSv1SetThresholdProfile, + engine.ThresholdProfileWithAPIOpts{ + ThresholdProfile: &engine.ThresholdProfile{ +@@ -263,6 +286,21 @@ cgrates.org,DEFAULT,*string:~*req.Account:1001,,*default,*none,10`, + t.Fatal(err) + } + ++ if err := client.Call(context.Background(), utils.APIerSv1SetThresholdProfile, ++ engine.ThresholdProfileWithAPIOpts{ ++ ThresholdProfile: &engine.ThresholdProfile{ ++ Tenant: "cgrates.org", ++ ID: "TH_2", ++ FilterIDs: []string{"*string:~*req.Category:sms"}, ++ MaxHits: -1, ++ MinHits: 10, ++ MinSleep: time.Second, ++ ActionIDs: []string{"ACT_LOG_WARNING"}, ++ }, ++ }, &reply); err != nil { ++ t.Fatal(err) ++ } ++ + time.Sleep(500 * time.Millisecond) + diamClient, err := NewDiameterClient(cfg.DiameterAgentCfg().Listen, "localhost", + cfg.DiameterAgentCfg().OriginRealm, cfg.DiameterAgentCfg().VendorID, +diff --git a/agents/libagents.go b/agents/libagents.go +index 6f189cd57..80916f7de 100644 +--- a/agents/libagents.go ++++ b/agents/libagents.go +@@ -213,21 +213,21 @@ func processRequest(ctx *context.Context, reqProcessor *config.RequestProcessor, + return true, nil + } + +- var statIDs, thIDs []string ++ var rawStatIDs, rawThIDs string + switch agentName { + case utils.DiameterAgent: +- statIDs = reqProcessor.Flags.ParamsSlice(utils.MetaDAStats, utils.MetaIDs) +- thIDs = reqProcessor.Flags.ParamsSlice(utils.MetaDAThresholds, utils.MetaIDs) ++ rawStatIDs = reqProcessor.Flags.ParamValue(utils.MetaDAStats) ++ rawThIDs = reqProcessor.Flags.ParamValue(utils.MetaDAThresholds) + case utils.HTTPAgent: +- statIDs = reqProcessor.Flags.ParamsSlice(utils.MetaHAStats, utils.MetaIDs) +- thIDs = reqProcessor.Flags.ParamsSlice(utils.MetaHAThresholds, utils.MetaIDs) ++ rawStatIDs = reqProcessor.Flags.ParamValue(utils.MetaHAStats) ++ rawThIDs = reqProcessor.Flags.ParamValue(utils.MetaHAThresholds) + case utils.DNSAgent: +- statIDs = reqProcessor.Flags.ParamsSlice(utils.MetaDNSStats, utils.MetaIDs) +- thIDs = reqProcessor.Flags.ParamsSlice(utils.MetaDNSThresholds, utils.MetaIDs) ++ rawStatIDs = reqProcessor.Flags.ParamValue(utils.MetaDNSStats) ++ rawThIDs = reqProcessor.Flags.ParamValue(utils.MetaDNSThresholds) + } + + // Return early if nothing to process. +- if len(statIDs) == 0 && len(thIDs) == 0 { ++ if rawStatIDs == "" && rawThIDs == "" { + return true, nil + } + +@@ -241,7 +241,8 @@ func processRequest(ctx *context.Context, reqProcessor *config.RequestProcessor, + ev.Event[utils.Source] = agentName + ev.APIOpts[utils.MetaEventType] = utils.ProcessTime + +- if len(statIDs) > 0 { ++ if rawStatIDs != "" { ++ statIDs := strings.Split(rawStatIDs, utils.ANDSep) + ev.APIOpts[utils.OptsStatsProfileIDs] = statIDs + var reply []string + if err := connMgr.Call(ctx, statsConns, utils.StatSv1ProcessEvent, +@@ -252,7 +253,8 @@ func processRequest(ctx *context.Context, reqProcessor *config.RequestProcessor, + // NOTE: ProfileIDs APIOpts key persists for the ThresholdS request, + // although it would be ignored. Might want to delete it. + } +- if len(thIDs) > 0 { ++ if rawThIDs != "" { ++ thIDs := strings.Split(rawThIDs, utils.ANDSep) + ev.APIOpts[utils.OptsThresholdsProfileIDs] = thIDs + var reply []string + if err := connMgr.Call(ctx, thConns, utils.ThresholdSv1ProcessEvent, +diff --git a/agents/radagent.go b/agents/radagent.go +index c942dd1da..ffb8861eb 100644 +--- a/agents/radagent.go ++++ b/agents/radagent.go +@@ -482,11 +482,11 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R + return true, nil + } + +- statIDs := reqProcessor.Flags.ParamsSlice(utils.MetaRAStats, utils.MetaIDs) +- thIDs := reqProcessor.Flags.ParamsSlice(utils.MetaRAThresholds, utils.MetaIDs) ++ rawStatIDs := reqProcessor.Flags.ParamValue(utils.MetaRAStats) ++ rawThIDs := reqProcessor.Flags.ParamValue(utils.MetaRAThresholds) + + // Early return if nothing to process. +- if len(statIDs) == 0 && len(thIDs) == 0 { ++ if rawStatIDs == "" && rawThIDs == "" { + return true, nil + } + +@@ -500,7 +500,8 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R + ev.Event[utils.Source] = utils.RadiusAgent + ev.APIOpts[utils.MetaEventType] = utils.ProcessTime + +- if len(statIDs) > 0 { ++ if rawStatIDs != "" { ++ statIDs := strings.Split(rawStatIDs, utils.ANDSep) + ev.APIOpts[utils.OptsStatsProfileIDs] = statIDs + var reply []string + if err := ra.connMgr.Call(ra.ctx, ra.cgrCfg.RadiusAgentCfg().StatSConns, +@@ -511,7 +512,8 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R + // NOTE: ProfileIDs APIOpts key persists for the ThresholdS request, + // although it would be ignored. Might want to delete it. + } +- if len(thIDs) > 0 { ++ if rawThIDs != "" { ++ thIDs := strings.Split(rawThIDs, utils.ANDSep) + ev.APIOpts[utils.OptsThresholdsProfileIDs] = thIDs + var reply []string + if err := ra.connMgr.Call(ra.ctx, ra.cgrCfg.RadiusAgentCfg().ThresholdSConns,