@@ -506,6 +506,48 @@ func (s *OpsAlertEvaluatorService) computeRuleMetric(
506506 return float64 (countAccountsByCondition (availability .Accounts , func (acc * AccountAvailability ) bool {
507507 return acc .HasError && acc .TempUnschedulableUntil == nil
508508 })), true
509+ case "group_rate_limit_ratio" :
510+ if groupID == nil || * groupID <= 0 {
511+ return 0 , false
512+ }
513+ if s == nil || s .opsService == nil {
514+ return 0 , false
515+ }
516+ availability , err := s .opsService .GetAccountAvailability (ctx , platform , groupID )
517+ if err != nil || availability == nil {
518+ return 0 , false
519+ }
520+ if availability .Group == nil || availability .Group .TotalAccounts <= 0 {
521+ return 0 , true
522+ }
523+ return (float64 (availability .Group .RateLimitCount ) / float64 (availability .Group .TotalAccounts )) * 100 , true
524+ case "account_error_ratio" :
525+ if s == nil || s .opsService == nil {
526+ return 0 , false
527+ }
528+ availability , err := s .opsService .GetAccountAvailability (ctx , platform , groupID )
529+ if err != nil || availability == nil {
530+ return 0 , false
531+ }
532+ total := int64 (len (availability .Accounts ))
533+ if total <= 0 {
534+ return 0 , true
535+ }
536+ errorCount := countAccountsByCondition (availability .Accounts , func (acc * AccountAvailability ) bool {
537+ return acc .HasError && acc .TempUnschedulableUntil == nil
538+ })
539+ return (float64 (errorCount ) / float64 (total )) * 100 , true
540+ case "overload_account_count" :
541+ if s == nil || s .opsService == nil {
542+ return 0 , false
543+ }
544+ availability , err := s .opsService .GetAccountAvailability (ctx , platform , groupID )
545+ if err != nil || availability == nil {
546+ return 0 , false
547+ }
548+ return float64 (countAccountsByCondition (availability .Accounts , func (acc * AccountAvailability ) bool {
549+ return acc .IsOverloaded
550+ })), true
509551 }
510552
511553 overview , err := s .opsRepo .GetDashboardOverview (ctx , & OpsDashboardFilter {
0 commit comments