Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
62771583
Commit
62771583
authored
Jan 12, 2026
by
IanShaw027
Browse files
feat(ops): 集成实时流量API接口
- 添加实时流量handler处理逻辑 - 注册实时流量路由 - 扩展ops service接口定义
parent
5526f122
Changes
3
Show whitespace changes
Inline
Side-by-side
backend/internal/handler/admin/ops_realtime_handler.go
View file @
62771583
...
...
@@ -118,3 +118,96 @@ func (h *OpsHandler) GetAccountAvailability(c *gin.Context) {
}
response
.
Success
(
c
,
payload
)
}
func
parseOpsRealtimeWindow
(
v
string
)
(
time
.
Duration
,
string
,
bool
)
{
switch
strings
.
ToLower
(
strings
.
TrimSpace
(
v
))
{
case
""
,
"1min"
,
"1m"
:
return
1
*
time
.
Minute
,
"1min"
,
true
case
"5min"
,
"5m"
:
return
5
*
time
.
Minute
,
"5min"
,
true
case
"30min"
,
"30m"
:
return
30
*
time
.
Minute
,
"30min"
,
true
case
"1h"
,
"60m"
,
"60min"
:
return
1
*
time
.
Hour
,
"1h"
,
true
default
:
return
0
,
""
,
false
}
}
// GetRealtimeTrafficSummary returns QPS/TPS current/peak/avg for the selected window.
// GET /api/v1/admin/ops/realtime-traffic
//
// Query params:
// - window: 1min|5min|30min|1h (default: 1min)
// - platform: optional
// - group_id: optional
func
(
h
*
OpsHandler
)
GetRealtimeTrafficSummary
(
c
*
gin
.
Context
)
{
if
h
.
opsService
==
nil
{
response
.
Error
(
c
,
http
.
StatusServiceUnavailable
,
"Ops service not available"
)
return
}
if
err
:=
h
.
opsService
.
RequireMonitoringEnabled
(
c
.
Request
.
Context
());
err
!=
nil
{
response
.
ErrorFrom
(
c
,
err
)
return
}
windowDur
,
windowLabel
,
ok
:=
parseOpsRealtimeWindow
(
c
.
Query
(
"window"
))
if
!
ok
{
response
.
BadRequest
(
c
,
"Invalid window"
)
return
}
platform
:=
strings
.
TrimSpace
(
c
.
Query
(
"platform"
))
var
groupID
*
int64
if
v
:=
strings
.
TrimSpace
(
c
.
Query
(
"group_id"
));
v
!=
""
{
id
,
err
:=
strconv
.
ParseInt
(
v
,
10
,
64
)
if
err
!=
nil
||
id
<=
0
{
response
.
BadRequest
(
c
,
"Invalid group_id"
)
return
}
groupID
=
&
id
}
endTime
:=
time
.
Now
()
.
UTC
()
startTime
:=
endTime
.
Add
(
-
windowDur
)
if
!
h
.
opsService
.
IsRealtimeMonitoringEnabled
(
c
.
Request
.
Context
())
{
disabledSummary
:=
&
service
.
OpsRealtimeTrafficSummary
{
Window
:
windowLabel
,
StartTime
:
startTime
,
EndTime
:
endTime
,
Platform
:
platform
,
GroupID
:
groupID
,
QPS
:
service
.
OpsRateSummary
{},
TPS
:
service
.
OpsRateSummary
{},
}
response
.
Success
(
c
,
gin
.
H
{
"enabled"
:
false
,
"summary"
:
disabledSummary
,
"timestamp"
:
endTime
,
})
return
}
filter
:=
&
service
.
OpsDashboardFilter
{
StartTime
:
startTime
,
EndTime
:
endTime
,
Platform
:
platform
,
GroupID
:
groupID
,
QueryMode
:
service
.
OpsQueryModeRaw
,
}
summary
,
err
:=
h
.
opsService
.
GetRealtimeTrafficSummary
(
c
.
Request
.
Context
(),
filter
)
if
err
!=
nil
{
response
.
ErrorFrom
(
c
,
err
)
return
}
if
summary
!=
nil
{
summary
.
Window
=
windowLabel
}
response
.
Success
(
c
,
gin
.
H
{
"enabled"
:
true
,
"summary"
:
summary
,
"timestamp"
:
endTime
,
})
}
backend/internal/server/routes/admin.go
View file @
62771583
...
...
@@ -73,6 +73,7 @@ func registerOpsRoutes(admin *gin.RouterGroup, h *handler.Handlers) {
// Realtime ops signals
ops
.
GET
(
"/concurrency"
,
h
.
Admin
.
Ops
.
GetConcurrencyStats
)
ops
.
GET
(
"/account-availability"
,
h
.
Admin
.
Ops
.
GetAccountAvailability
)
ops
.
GET
(
"/realtime-traffic"
,
h
.
Admin
.
Ops
.
GetRealtimeTrafficSummary
)
// Alerts (rules + events)
ops
.
GET
(
"/alert-rules"
,
h
.
Admin
.
Ops
.
ListAlertRules
)
...
...
backend/internal/service/ops_port.go
View file @
62771583
...
...
@@ -17,6 +17,8 @@ type OpsRepository interface {
// Lightweight window stats (for realtime WS / quick sampling).
GetWindowStats
(
ctx
context
.
Context
,
filter
*
OpsDashboardFilter
)
(
*
OpsWindowStats
,
error
)
// Lightweight realtime traffic summary (for the Ops dashboard header card).
GetRealtimeTrafficSummary
(
ctx
context
.
Context
,
filter
*
OpsDashboardFilter
)
(
*
OpsRealtimeTrafficSummary
,
error
)
GetDashboardOverview
(
ctx
context
.
Context
,
filter
*
OpsDashboardFilter
)
(
*
OpsDashboardOverview
,
error
)
GetThroughputTrend
(
ctx
context
.
Context
,
filter
*
OpsDashboardFilter
,
bucketSeconds
int
)
(
*
OpsThroughputTrendResponse
,
error
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment