From a2e35d42ea57a7ebde05965d6781bb34016939db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Thu, 8 Jan 2026 15:23:20 +0800 Subject: [PATCH] fix(monitor): optimized monitor resource list (#24038) --- pkg/monitor/models/monitor_resource.go | 42 +++++++++++++++++--------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/pkg/monitor/models/monitor_resource.go b/pkg/monitor/models/monitor_resource.go index 25c993d16a..d3ff71cb82 100644 --- a/pkg/monitor/models/monitor_resource.go +++ b/pkg/monitor/models/monitor_resource.go @@ -403,11 +403,38 @@ func (man *SMonitorResourceManager) FetchCustomizeColumns( ) []monitor.MonitorResourceDetails { rows := make([]monitor.MonitorResourceDetails, len(objs)) virtRows := man.SVirtualResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) + resIds := make([]string, len(objs)) for i := range rows { rows[i] = monitor.MonitorResourceDetails{ VirtualResourceDetails: virtRows[i], } - rows[i] = objs[i].(*SMonitorResource).getMoreDetails(rows[i]) + mr := objs[i].(*SMonitorResource) + resIds[i] = mr.ResId + _, object := MonitorResourceManager.GetResourceObj(mr.ResId) + if object != nil { + object.Unmarshal(&rows[i]) + } + } + sq := MonitorResourceAlertManager.Query().In("monitor_resource_id", resIds).SubQuery() + q := sq.Query( + sq.Field("monitor_resource_id"), + sqlchemy.COUNT("count", sq.Field("row_id")), + ).GroupBy(sq.Field("monitor_resource_id")) + mrs := []struct { + MonitorResourceId string + Count int64 + }{} + err := q.All(&mrs) + if err != nil { + log.Errorf("query monitor resource alert error: %v", err) + return rows + } + mrMap := make(map[string]int64) + for _, mr := range mrs { + mrMap[mr.MonitorResourceId] = mr.Count + } + for i := range rows { + rows[i].AttachAlertCount = mrMap[resIds[i]] } return rows } @@ -471,19 +498,6 @@ func (self *SMonitorResource) DetachJoint(ctx context.Context, userCred mcclient return nil } -func (self *SMonitorResource) getMoreDetails(out monitor.MonitorResourceDetails) monitor.MonitorResourceDetails { - joints, err := MonitorResourceAlertManager.GetJoinsByListInput(monitor.MonitorResourceJointListInput{MonitorResourceId: self.ResId}) - if err != nil { - log.Errorf("getMoreDetails err:%v", err) - } - _, object := MonitorResourceManager.GetResourceObj(self.ResId) - if object != nil { - object.Unmarshal(&out) - } - out.AttachAlertCount = int64(len(joints)) - return out -} - type AlertStatusCount struct { CountId int64 AlertState string