From e94628a482ead3818d6f53bf8148d79cfb8934ba Mon Sep 17 00:00:00 2001 From: DanB Date: Fri, 13 Feb 2026 21:30:22 +0100 Subject: [PATCH] Adding RateSCost to SessionSv1.ProcessEvent --- config/sessionscfg.go | 1 + sessions/apis.go | 22 ++++++++++++++++++++++ sessions/sessions.go | 14 ++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/config/sessionscfg.go b/config/sessionscfg.go index 6e9725e48..f9a12f39c 100644 --- a/config/sessionscfg.go +++ b/config/sessionscfg.go @@ -64,6 +64,7 @@ const ( type SessionsOpts struct { Accounts []*DynamicBoolOpt + Rates []*DynamicBoolOpt Attributes []*DynamicBoolOpt CDRs []*DynamicBoolOpt Chargers []*DynamicBoolOpt diff --git a/sessions/apis.go b/sessions/apis.go index 4e50f1468..31c024cd3 100644 --- a/sessions/apis.go +++ b/sessions/apis.go @@ -880,6 +880,28 @@ func (sS *SessionS) BiRPCv1ProcessEvent(ctx *context.Context, for runID, cgrEv := range cgrEvs { cchEv := make(map[string]any) + // RateS Enabled + if rtS, errRTs := engine.GetBoolOpts(ctx, apiArgs.Tenant, apiArgs.AsDataProvider(), cchEv, + sS.fltrS, sS.cfg.SessionSCfg().Opts.Rates, + utils.MetaRates); errRTs != nil { + if cch[utils.OptsSesBlockerError].(bool) { + return errRTs + } + utils.Logger.Warning( + fmt.Sprintf("<%s> error: %s processing event: %+v with %s", + utils.SessionS, err.Error(), cgrEv, utils.RateS)) + } else if rtS { + var rtsCost *utils.Decimal + if rtsCost, err = sS.ratesCost(ctx, cgrEv); err != nil { + return + } + if apiRply.RateSCost == nil { + apiRply.RateSCost = make(map[string]float64) + } + costFlt, _ := rtsCost.Float64() + apiRply.RateSCost[runID] = costFlt + } + // IPs Enabled if ipS, errIPs := engine.GetBoolOpts(ctx, apiArgs.Tenant, apiArgs.AsDataProvider(), cchEv, sS.fltrS, sS.cfg.SessionSCfg().Opts.IPs, diff --git a/sessions/sessions.go b/sessions/sessions.go index fabb3cde7..963bcb9b6 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -1010,6 +1010,20 @@ func (sS *SessionS) accountsMaxAbstracts(ctx *context.Context, cgrEv *utils.CGRE return &acntCost, nil } +// ratesCost will query the RateS cost for Event +func (sS *SessionS) ratesCost(ctx *context.Context, cgrEv *utils.CGREvent) (cost *utils.Decimal, err error) { + if len(sS.cfg.SessionSCfg().RateSConns) == 0 { + err = errors.New("RateS is disabled") + return + } + var rtsCost utils.RateProfileCost + if err = sS.connMgr.Call(ctx, sS.cfg.SessionSCfg().RateSConns, + utils.RateSv1CostForEvent, cgrEv, &rtsCost); err != nil { + return + } + return rtsCost.Cost, nil +} + // getSessions is used to return in a thread-safe manner active or passive sessions func (sS *SessionS) getSessions(originID string, pSessions bool) (ss []*Session) { ssMux := &sS.aSsMux // get the pointer so we don't copy, otherwise locks will not work