Skip to content

Commit 87dfc66

Browse files
authored
Merge pull request Wei-Shaw#3659 from jianjianai/fix/ops-realtime-stats-performance
fix: 优化运维实时账号统计接口性能
2 parents 5d7f213 + 3f2ef60 commit 87dfc66

4 files changed

Lines changed: 77 additions & 4 deletions

File tree

backend/internal/handler/admin/ops_realtime_handler.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package admin
22

33
import (
4+
"context"
5+
"errors"
46
"net/http"
57
"strconv"
68
"strings"
@@ -47,6 +49,9 @@ func (h *OpsHandler) GetConcurrencyStats(c *gin.Context) {
4749

4850
platform, group, account, collectedAt, err := h.opsService.GetConcurrencyStats(c.Request.Context(), platformFilter, groupID)
4951
if err != nil {
52+
if isOpsRealtimeRequestCanceled(c, err) {
53+
return
54+
}
5055
response.ErrorFrom(c, err)
5156
return
5257
}
@@ -86,6 +91,9 @@ func (h *OpsHandler) GetUserConcurrencyStats(c *gin.Context) {
8691

8792
users, collectedAt, err := h.opsService.GetUserConcurrencyStats(c.Request.Context())
8893
if err != nil {
94+
if isOpsRealtimeRequestCanceled(c, err) {
95+
return
96+
}
8997
response.ErrorFrom(c, err)
9098
return
9199
}
@@ -140,6 +148,9 @@ func (h *OpsHandler) GetAccountAvailability(c *gin.Context) {
140148

141149
platformStats, groupStats, accountStats, collectedAt, err := h.opsService.GetAccountAvailabilityStats(c.Request.Context(), platform, groupID)
142150
if err != nil {
151+
if isOpsRealtimeRequestCanceled(c, err) {
152+
return
153+
}
143154
response.ErrorFrom(c, err)
144155
return
145156
}
@@ -156,6 +167,19 @@ func (h *OpsHandler) GetAccountAvailability(c *gin.Context) {
156167
response.Success(c, payload)
157168
}
158169

170+
func isOpsRealtimeRequestCanceled(c *gin.Context, err error) bool {
171+
if err == nil {
172+
return false
173+
}
174+
if errors.Is(err, context.Canceled) {
175+
return true
176+
}
177+
if c != nil && c.Request != nil && errors.Is(c.Request.Context().Err(), context.Canceled) {
178+
return true
179+
}
180+
return strings.Contains(err.Error(), "canceling statement due to user request")
181+
}
182+
159183
func parseOpsRealtimeWindow(v string) (time.Duration, string, bool) {
160184
switch strings.ToLower(strings.TrimSpace(v)) {
161185
case "", "1min", "1m":
@@ -236,6 +260,9 @@ func (h *OpsHandler) GetRealtimeTrafficSummary(c *gin.Context) {
236260

237261
summary, err := h.opsService.GetRealtimeTrafficSummary(c.Request.Context(), filter)
238262
if err != nil {
263+
if isOpsRealtimeRequestCanceled(c, err) {
264+
return
265+
}
239266
response.ErrorFrom(c, err)
240267
return
241268
}

backend/internal/repository/account_repo.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,41 @@ func (r *accountRepository) ListWithFilters(ctx context.Context, params paginati
603603
return outAccounts, paginationResultFromTotal(int64(total), params), nil
604604
}
605605

606+
func (r *accountRepository) ListOpsAccountsForStats(ctx context.Context, platformFilter string, groupIDFilter *int64) ([]service.Account, error) {
607+
if r == nil || r.client == nil {
608+
return []service.Account{}, nil
609+
}
610+
611+
q := r.client.Account.Query()
612+
if platformFilter = strings.TrimSpace(platformFilter); platformFilter != "" {
613+
q = q.Where(dbaccount.PlatformEQ(platformFilter))
614+
}
615+
if groupIDFilter != nil && *groupIDFilter > 0 {
616+
q = q.Where(dbaccount.HasAccountGroupsWith(dbaccountgroup.GroupIDEQ(*groupIDFilter)))
617+
}
618+
619+
accounts, err := q.
620+
Select(
621+
dbaccount.FieldID,
622+
dbaccount.FieldName,
623+
dbaccount.FieldPlatform,
624+
dbaccount.FieldConcurrency,
625+
dbaccount.FieldLoadFactor,
626+
dbaccount.FieldStatus,
627+
dbaccount.FieldErrorMessage,
628+
dbaccount.FieldSchedulable,
629+
dbaccount.FieldRateLimitResetAt,
630+
dbaccount.FieldOverloadUntil,
631+
dbaccount.FieldTempUnschedulableUntil,
632+
).
633+
Order(dbent.Asc(dbaccount.FieldID)).
634+
All(ctx)
635+
if err != nil {
636+
return nil, err
637+
}
638+
return r.accountsToService(ctx, accounts)
639+
}
640+
606641
func accountListOrder(params pagination.PaginationParams) []func(*entsql.Selector) {
607642
sortBy := strings.ToLower(strings.TrimSpace(params.SortBy))
608643
sortOrder := params.NormalizedSortOrder(pagination.SortOrderAsc)

backend/internal/service/ops_account_availability.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func (s *OpsService) GetAccountAvailabilityStats(ctx context.Context, platformFi
2020
return nil, nil, nil, nil, err
2121
}
2222

23-
accounts, err := s.listAllAccountsForOps(ctx, platformFilter)
23+
accounts, err := s.listAllAccountsForOps(ctx, platformFilter, groupIDFilter)
2424
if err != nil {
2525
return nil, nil, nil, nil, err
2626
}

backend/internal/service/ops_concurrency.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,29 @@ const (
1313
opsConcurrencyBatchChunkSize = 200
1414
)
1515

16-
func (s *OpsService) listAllAccountsForOps(ctx context.Context, platformFilter string) ([]Account, error) {
16+
type opsAccountStatsRepository interface {
17+
ListOpsAccountsForStats(ctx context.Context, platformFilter string, groupIDFilter *int64) ([]Account, error)
18+
}
19+
20+
func (s *OpsService) listAllAccountsForOps(ctx context.Context, platformFilter string, groupIDFilter *int64) ([]Account, error) {
1721
if s == nil || s.accountRepo == nil {
1822
return []Account{}, nil
1923
}
24+
if repo, ok := s.accountRepo.(opsAccountStatsRepository); ok {
25+
return repo.ListOpsAccountsForStats(ctx, platformFilter, groupIDFilter)
26+
}
2027

2128
out := make([]Account, 0, 128)
2229
page := 1
30+
groupID := int64(0)
31+
if groupIDFilter != nil {
32+
groupID = *groupIDFilter
33+
}
2334
for {
2435
accounts, pageInfo, err := s.accountRepo.ListWithFilters(ctx, pagination.PaginationParams{
2536
Page: page,
2637
PageSize: opsAccountsPageSize,
27-
}, platformFilter, "", "", "", 0, "")
38+
}, platformFilter, "", "", "", groupID, "")
2839
if err != nil {
2940
return nil, err
3041
}
@@ -112,7 +123,7 @@ func (s *OpsService) GetConcurrencyStats(
112123
return nil, nil, nil, nil, err
113124
}
114125

115-
accounts, err := s.listAllAccountsForOps(ctx, platformFilter)
126+
accounts, err := s.listAllAccountsForOps(ctx, platformFilter, groupIDFilter)
116127
if err != nil {
117128
return nil, nil, nil, nil, err
118129
}

0 commit comments

Comments
 (0)