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
fc32b577
Commit
fc32b577
authored
Jan 09, 2026
by
IanShaw027
Browse files
feat(国际化): 添加运维监控多语言支持
- 添加英文翻译(en.ts)包含 ops 监控所有文案 - 添加中文翻译(zh.ts)包含 ops 监控所有文案
parent
337a1886
Changes
2
Hide whitespace changes
Inline
Side-by-side
frontend/src/i18n/locales/en.ts
View file @
fc32b577
...
@@ -131,6 +131,7 @@ export default {
...
@@ -131,6 +131,7 @@ export default {
noData
:
'
No data
'
,
noData
:
'
No data
'
,
success
:
'
Success
'
,
success
:
'
Success
'
,
error
:
'
Error
'
,
error
:
'
Error
'
,
critical
:
'
Critical
'
,
warning
:
'
Warning
'
,
warning
:
'
Warning
'
,
info
:
'
Info
'
,
info
:
'
Info
'
,
active
:
'
Active
'
,
active
:
'
Active
'
,
...
@@ -145,6 +146,8 @@ export default {
...
@@ -145,6 +146,8 @@ export default {
copiedToClipboard
:
'
Copied to clipboard
'
,
copiedToClipboard
:
'
Copied to clipboard
'
,
copyFailed
:
'
Failed to copy
'
,
copyFailed
:
'
Failed to copy
'
,
contactSupport
:
'
Contact Support
'
,
contactSupport
:
'
Contact Support
'
,
add
:
'
Add
'
,
invalidEmail
:
'
Please enter a valid email address
'
,
selectOption
:
'
Select an option
'
,
selectOption
:
'
Select an option
'
,
searchPlaceholder
:
'
Search...
'
,
searchPlaceholder
:
'
Search...
'
,
noOptionsFound
:
'
No options found
'
,
noOptionsFound
:
'
No options found
'
,
...
@@ -177,6 +180,7 @@ export default {
...
@@ -177,6 +180,7 @@ export default {
accounts
:
'
Accounts
'
,
accounts
:
'
Accounts
'
,
proxies
:
'
Proxies
'
,
proxies
:
'
Proxies
'
,
redeemCodes
:
'
Redeem Codes
'
,
redeemCodes
:
'
Redeem Codes
'
,
ops
:
'
Ops
'
,
settings
:
'
Settings
'
,
settings
:
'
Settings
'
,
myAccount
:
'
My Account
'
,
myAccount
:
'
My Account
'
,
lightMode
:
'
Light Mode
'
,
lightMode
:
'
Light Mode
'
,
...
@@ -1713,6 +1717,370 @@ export default {
...
@@ -1713,6 +1717,370 @@ export default {
failedToLoad
:
'
Failed to load usage records
'
failedToLoad
:
'
Failed to load usage records
'
},
},
// Ops Monitoring
ops
:
{
title
:
'
Ops Monitoring
'
,
description
:
'
Operational monitoring and troubleshooting
'
,
// Dashboard
systemHealth
:
'
System Health
'
,
overview
:
'
Overview
'
,
noSystemMetrics
:
'
No system metrics collected yet.
'
,
collectedAt
:
'
Collected at:
'
,
window
:
'
window
'
,
cpu
:
'
CPU
'
,
memory
:
'
Memory
'
,
db
:
'
DB
'
,
redis
:
'
Redis
'
,
goroutines
:
'
Goroutines
'
,
jobs
:
'
Jobs
'
,
active
:
'
active
'
,
idle
:
'
idle
'
,
ok
:
'
ok
'
,
lastRun
:
'
last_run:
'
,
lastSuccess
:
'
last_success:
'
,
lastError
:
'
last_error:
'
,
noData
:
'
No data.
'
,
loadingText
:
'
loading
'
,
ready
:
'
ready
'
,
requestsTotal
:
'
Requests (total)
'
,
slaScope
:
'
SLA scope:
'
,
tokens
:
'
Tokens
'
,
tps
:
'
TPS:
'
,
current
:
'
current
'
,
peak
:
'
peak
'
,
sla
:
'
SLA (excl business limits)
'
,
businessLimited
:
'
business_limited:
'
,
errors
:
'
Errors
'
,
errorRate
:
'
error_rate:
'
,
upstreamRate
:
'
upstream_rate:
'
,
latencyDuration
:
'
Latency (duration_ms)
'
,
ttftLabel
:
'
TTFT (first_token_ms)
'
,
p50
:
'
p50:
'
,
p90
:
'
p90:
'
,
p95
:
'
p95:
'
,
p99
:
'
p99:
'
,
avg
:
'
avg:
'
,
max
:
'
max:
'
,
qps
:
'
QPS
'
,
requests
:
'
Requests
'
,
upstream
:
'
Upstream
'
,
client
:
'
Client
'
,
system
:
'
System
'
,
other
:
'
Other
'
,
errorsSla
:
'
Errors (SLA scope)
'
,
upstreamExcl429529
:
'
Upstream (excl 429/529)
'
,
failedToLoadData
:
'
Failed to load ops data.
'
,
tpsK
:
'
TPS (K)
'
,
top
:
'
Top:
'
,
throughputTrend
:
'
Throughput Trend
'
,
latencyHistogram
:
'
Latency Histogram
'
,
errorTrend
:
'
Error Trend
'
,
errorDistribution
:
'
Error Distribution
'
,
// Error Log
errorLog
:
{
timeId
:
'
Time / ID
'
,
context
:
'
Context
'
,
status
:
'
Status
'
,
message
:
'
Message
'
,
latency
:
'
Latency
'
,
action
:
'
Action
'
,
noErrors
:
'
No errors in this window.
'
,
grp
:
'
GRP:
'
,
acc
:
'
ACC:
'
,
details
:
'
Details
'
,
phase
:
'
Phase
'
},
// Error Details Modal
errorDetails
:
{
upstreamErrors
:
'
Upstream Errors
'
,
requestErrors
:
'
Request Errors
'
,
total
:
'
Total:
'
,
searchPlaceholder
:
'
Search request_id / client_request_id / message
'
,
accountIdPlaceholder
:
'
account_id
'
},
// Error Detail Modal
errorDetail
:
{
loading
:
'
Loading…
'
,
requestId
:
'
Request ID
'
,
time
:
'
Time
'
,
phase
:
'
Phase
'
,
status
:
'
Status
'
,
message
:
'
Message
'
,
basicInfo
:
'
Basic Info
'
,
platform
:
'
Platform
'
,
model
:
'
Model
'
,
latency
:
'
Latency
'
,
ttft
:
'
TTFT
'
,
businessLimited
:
'
Business Limited
'
,
requestPath
:
'
Request Path
'
,
timings
:
'
Timings
'
,
auth
:
'
Auth
'
,
routing
:
'
Routing
'
,
upstream
:
'
Upstream
'
,
response
:
'
Response
'
,
retry
:
'
Retry
'
,
retryClient
:
'
Retry (Client)
'
,
retryUpstream
:
'
Retry (Upstream pinned)
'
,
pinnedAccountId
:
'
Pinned account_id
'
,
retryNotes
:
'
Retry Notes
'
,
requestBody
:
'
Request Body
'
,
errorBody
:
'
Error Body
'
,
trimmed
:
'
trimmed
'
,
confirmRetry
:
'
Confirm Retry
'
,
retrySuccess
:
'
Retry succeeded
'
,
retryFailed
:
'
Retry failed
'
,
na
:
'
N/A
'
,
retryHint
:
'
Retry will resend the request with the same parameters
'
,
retryClientHint
:
'
Use client retry (no account pinning)
'
,
retryUpstreamHint
:
'
Use upstream pinned retry (pin to the error account)
'
,
pinnedAccountIdHint
:
'
(auto from error log)
'
,
retryNote1
:
'
Retry will use the same request body and parameters
'
,
retryNote2
:
'
If the original request failed due to account issues, pinned retry may still fail
'
,
retryNote3
:
'
Client retry will reselect an account
'
,
confirmRetryMessage
:
'
Confirm retry this request?
'
,
confirmRetryHint
:
'
Will resend with the same request parameters
'
},
requestDetails
:
{
title
:
'
Request Details
'
,
details
:
'
Details
'
,
rangeLabel
:
'
Window: {range}
'
,
rangeMinutes
:
'
{n} minutes
'
,
rangeHours
:
'
{n} hours
'
,
empty
:
'
No requests in this window.
'
,
emptyHint
:
'
Try a different time range or remove filters.
'
,
failedToLoad
:
'
Failed to load request details
'
,
requestIdCopied
:
'
Request ID copied
'
,
copyFailed
:
'
Copy failed
'
,
copy
:
'
Copy
'
,
viewError
:
'
View Error
'
,
kind
:
{
success
:
'
SUCCESS
'
,
error
:
'
ERROR
'
},
table
:
{
time
:
'
Time
'
,
kind
:
'
Kind
'
,
platform
:
'
Platform
'
,
model
:
'
Model
'
,
duration
:
'
Duration
'
,
status
:
'
Status
'
,
requestId
:
'
Request ID
'
,
actions
:
'
Actions
'
}
},
alertEvents
:
{
title
:
'
Alert Events
'
,
description
:
'
Recent alert firing/resolution records (email-only)
'
,
loading
:
'
Loading...
'
,
empty
:
'
No alert events
'
,
loadFailed
:
'
Failed to load alert events
'
,
table
:
{
time
:
'
Time
'
,
status
:
'
Status
'
,
severity
:
'
Severity
'
,
title
:
'
Title
'
,
metric
:
'
Metric / Threshold
'
,
email
:
'
Email Sent
'
}
},
alertRules
:
{
title
:
'
Alert Rules
'
,
description
:
'
Create and manage threshold-based system alerts (email-only)
'
,
loading
:
'
Loading...
'
,
empty
:
'
No alert rules
'
,
loadFailed
:
'
Failed to load alert rules
'
,
saveFailed
:
'
Failed to save alert rule
'
,
deleteFailed
:
'
Failed to delete alert rule
'
,
create
:
'
Create Rule
'
,
createTitle
:
'
Create Alert Rule
'
,
editTitle
:
'
Edit Alert Rule
'
,
deleteConfirmTitle
:
'
Delete this rule?
'
,
deleteConfirmMessage
:
'
This will remove the rule and its related events. Continue?
'
,
metrics
:
{
successRate
:
'
Success Rate (%)
'
,
errorRate
:
'
Error Rate (%)
'
,
p95
:
'
P95 Latency (ms)
'
,
p99
:
'
P99 Latency (ms)
'
,
cpu
:
'
CPU Usage (%)
'
,
memory
:
'
Memory Usage (%)
'
,
queueDepth
:
'
Concurrency Queue Depth
'
},
table
:
{
name
:
'
Name
'
,
metric
:
'
Metric
'
,
severity
:
'
Severity
'
,
enabled
:
'
Enabled
'
,
actions
:
'
Actions
'
},
form
:
{
name
:
'
Name
'
,
description
:
'
Description
'
,
metric
:
'
Metric
'
,
operator
:
'
Operator
'
,
threshold
:
'
Threshold
'
,
severity
:
'
Severity
'
,
window
:
'
Window (minutes)
'
,
sustained
:
'
Sustained (samples)
'
,
cooldown
:
'
Cooldown (minutes)
'
,
enabled
:
'
Enabled
'
,
notifyEmail
:
'
Send email notifications
'
},
validation
:
{
title
:
'
Please fix the following issues
'
,
invalid
:
'
Invalid rule
'
,
nameRequired
:
'
Name is required
'
,
metricRequired
:
'
Metric is required
'
,
operatorRequired
:
'
Operator is required
'
,
thresholdRequired
:
'
Threshold must be a number
'
,
windowRange
:
'
Window must be one of: 1, 5, 60 minutes
'
,
sustainedRange
:
'
Sustained must be between 1 and 1440 samples
'
,
cooldownRange
:
'
Cooldown must be between 0 and 1440 minutes
'
}
},
runtime
:
{
title
:
'
Ops Runtime Settings
'
,
description
:
'
Stored in database; changes take effect without editing config files.
'
,
loading
:
'
Loading...
'
,
noData
:
'
No runtime settings available
'
,
loadFailed
:
'
Failed to load runtime settings
'
,
saveSuccess
:
'
Runtime settings saved
'
,
saveFailed
:
'
Failed to save runtime settings
'
,
alertTitle
:
'
Alert Evaluator
'
,
groupAvailabilityTitle
:
'
Group Availability Monitor
'
,
evalIntervalSeconds
:
'
Evaluation Interval (seconds)
'
,
silencing
:
{
title
:
'
Alert Silencing (Maintenance Mode)
'
,
enabled
:
'
Enable silencing
'
,
globalUntil
:
'
Silence until (RFC3339)
'
,
untilPlaceholder
:
'
2026-01-05T00:00:00Z
'
,
untilHint
:
'
Leave empty to only toggle silencing without an expiry (not recommended).
'
,
reason
:
'
Reason
'
,
reasonPlaceholder
:
'
e.g., planned maintenance
'
,
entries
:
{
title
:
'
Advanced: targeted silencing
'
,
hint
:
'
Optional: silence only certain rules or severities. Leave fields empty to match all.
'
,
add
:
'
Add Entry
'
,
empty
:
'
No targeted entries
'
,
entryTitle
:
'
Entry #{n}
'
,
ruleId
:
'
Rule ID (optional)
'
,
ruleIdPlaceholder
:
'
e.g., 1
'
,
severities
:
'
Severities (optional)
'
,
severitiesPlaceholder
:
'
e.g., P0,P1 (empty = all)
'
,
until
:
'
Until (RFC3339)
'
,
reason
:
'
Reason
'
,
validation
:
{
untilRequired
:
'
Entry until time is required
'
,
untilFormat
:
'
Entry until time must be a valid RFC3339 timestamp
'
,
ruleIdPositive
:
'
Entry rule_id must be a positive integer
'
,
severitiesFormat
:
'
Entry severities must be a comma-separated list of P0..P3
'
}
},
validation
:
{
timeFormat
:
'
Silence time must be a valid RFC3339 timestamp
'
}
},
lockEnabled
:
'
Distributed Lock Enabled
'
,
lockKey
:
'
Distributed Lock Key
'
,
lockTTLSeconds
:
'
Distributed Lock TTL (seconds)
'
,
showAdvancedDeveloperSettings
:
'
Show advanced developer settings (Distributed Lock)
'
,
advancedSettingsSummary
:
'
Advanced settings (Distributed Lock)
'
,
evalIntervalHint
:
'
How often the evaluator runs. Keeping the default is recommended.
'
,
validation
:
{
title
:
'
Please fix the following issues
'
,
invalid
:
'
Invalid settings
'
,
evalIntervalRange
:
'
Evaluation interval must be between 1 and 86400 seconds
'
,
lockKeyRequired
:
'
Distributed lock key is required when lock is enabled
'
,
lockKeyPrefix
:
'
Distributed lock key must start with "{prefix}"
'
,
lockKeyHint
:
'
Recommended: start with "{prefix}" to avoid conflicts
'
,
lockTtlRange
:
'
Distributed lock TTL must be between 1 and 86400 seconds
'
}
},
email
:
{
title
:
'
Email Notification
'
,
description
:
'
Configure alert/report email notifications (stored in database).
'
,
loading
:
'
Loading...
'
,
noData
:
'
No email notification config
'
,
loadFailed
:
'
Failed to load email notification config
'
,
saveSuccess
:
'
Email notification config saved
'
,
saveFailed
:
'
Failed to save email notification config
'
,
alertTitle
:
'
Alert Emails
'
,
reportTitle
:
'
Report Emails
'
,
recipients
:
'
Recipients
'
,
recipientsHint
:
'
If empty, the system may fallback to the first admin email.
'
,
minSeverity
:
'
Min Severity
'
,
minSeverityAll
:
'
All severities
'
,
rateLimitPerHour
:
'
Rate limit per hour
'
,
batchWindowSeconds
:
'
Batch window (seconds)
'
,
includeResolved
:
'
Include resolved alerts
'
,
dailySummary
:
'
Daily summary
'
,
weeklySummary
:
'
Weekly summary
'
,
errorDigest
:
'
Error digest
'
,
errorDigestMinCount
:
'
Min errors for digest
'
,
accountHealth
:
'
Account health
'
,
accountHealthThreshold
:
'
Error rate threshold (%)
'
,
cronPlaceholder
:
'
Cron expression
'
,
reportHint
:
'
Schedules use cron syntax; leave empty to use defaults.
'
,
validation
:
{
title
:
'
Please fix the following issues
'
,
invalid
:
'
Invalid email notification config
'
,
alertRecipientsRequired
:
'
Alert emails are enabled but no recipients are configured
'
,
reportRecipientsRequired
:
'
Report emails are enabled but no recipients are configured
'
,
invalidRecipients
:
'
One or more recipient emails are invalid
'
,
rateLimitRange
:
'
Rate limit per hour must be a number ≥ 0
'
,
batchWindowRange
:
'
Batch window must be between 0 and 86400 seconds
'
,
cronRequired
:
'
A cron expression is required when schedule is enabled
'
,
cronFormat
:
'
Cron expression format looks invalid (expected at least 5 parts)
'
,
digestMinCountRange
:
'
Min errors for digest must be a number ≥ 0
'
,
accountHealthThresholdRange
:
'
Account health threshold must be between 0 and 100
'
}
},
concurrency
:
{
title
:
'
Concurrency / Queue
'
,
byPlatform
:
'
By Platform
'
,
byGroup
:
'
By Group
'
,
byAccount
:
'
By Account
'
,
totalRows
:
'
{count} rows
'
,
disabledHint
:
'
Realtime monitoring is disabled in settings.
'
,
empty
:
'
No data
'
,
queued
:
'
Queue {count}
'
,
rateLimited
:
'
Rate-limited {count}
'
,
errorAccounts
:
'
Errors {count}
'
,
loadFailed
:
'
Failed to load concurrency data
'
},
realtime
:
{
connected
:
'
Realtime connected
'
,
connecting
:
'
Realtime connecting
'
,
reconnecting
:
'
Realtime reconnecting
'
,
offline
:
'
Realtime offline
'
,
closed
:
'
Realtime closed
'
,
reconnectIn
:
'
retry in {seconds}s
'
},
queryMode
:
{
auto
:
'
Auto
'
,
raw
:
'
Raw
'
,
preagg
:
'
Preagg
'
},
accountAvailability
:
{
available
:
'
Available
'
,
unavailable
:
'
Unavailable
'
,
accountError
:
'
Error
'
},
tooltips
:
{
throughputTrend
:
'
Requests/QPS + Tokens/TPS in the selected window.
'
,
latencyHistogram
:
'
Latency distribution (duration_ms) for successful requests.
'
,
errorTrend
:
'
Error counts over time (SLA scope excludes business limits; upstream excludes 429/529).
'
,
errorDistribution
:
'
Error distribution by status code.
'
},
charts
:
{
emptyRequest
:
'
No requests in this window.
'
,
emptyError
:
'
No errors in this window.
'
,
resetZoom
:
'
Reset
'
,
resetZoomHint
:
'
Reset zoom (if enabled)
'
,
downloadChart
:
'
Download
'
,
downloadChartHint
:
'
Download chart as image
'
}
},
// Settings
// Settings
settings
:
{
settings
:
{
title
:
'
System Settings
'
,
title
:
'
System Settings
'
,
...
@@ -1803,6 +2171,20 @@ export default {
...
@@ -1803,6 +2171,20 @@ export default {
sending
:
'
Sending...
'
,
sending
:
'
Sending...
'
,
enterRecipientHint
:
'
Please enter a recipient email address
'
enterRecipientHint
:
'
Please enter a recipient email address
'
},
},
opsMonitoring
:
{
title
:
'
Ops Monitoring
'
,
description
:
'
Enable ops monitoring for troubleshooting and health visibility
'
,
disabled
:
'
Ops monitoring is disabled
'
,
enabled
:
'
Enable Ops Monitoring
'
,
enabledHint
:
'
Enable the ops monitoring module (admin only)
'
,
realtimeEnabled
:
'
Enable Realtime Monitoring
'
,
realtimeEnabledHint
:
'
Enable realtime QPS/metrics push (WebSocket)
'
,
queryMode
:
'
Default Query Mode
'
,
queryModeHint
:
'
Default query mode for Ops Dashboard (auto/raw/preagg)
'
,
queryModeAuto
:
'
Auto (recommended)
'
,
queryModeRaw
:
'
Raw (most accurate, slower)
'
,
queryModePreagg
:
'
Preagg (fastest, requires aggregation)
'
},
adminApiKey
:
{
adminApiKey
:
{
title
:
'
Admin API Key
'
,
title
:
'
Admin API Key
'
,
description
:
'
Global API key for external system integration with full admin access
'
,
description
:
'
Global API key for external system integration with full admin access
'
,
...
...
frontend/src/i18n/locales/zh.ts
View file @
fc32b577
...
@@ -128,6 +128,7 @@ export default {
...
@@ -128,6 +128,7 @@ export default {
noData
:
'
暂无数据
'
,
noData
:
'
暂无数据
'
,
success
:
'
成功
'
,
success
:
'
成功
'
,
error
:
'
错误
'
,
error
:
'
错误
'
,
critical
:
'
严重
'
,
warning
:
'
警告
'
,
warning
:
'
警告
'
,
info
:
'
提示
'
,
info
:
'
提示
'
,
active
:
'
启用
'
,
active
:
'
启用
'
,
...
@@ -142,6 +143,8 @@ export default {
...
@@ -142,6 +143,8 @@ export default {
copiedToClipboard
:
'
已复制到剪贴板
'
,
copiedToClipboard
:
'
已复制到剪贴板
'
,
copyFailed
:
'
复制失败
'
,
copyFailed
:
'
复制失败
'
,
contactSupport
:
'
联系客服
'
,
contactSupport
:
'
联系客服
'
,
add
:
'
添加
'
,
invalidEmail
:
'
请输入有效的邮箱地址
'
,
selectOption
:
'
请选择
'
,
selectOption
:
'
请选择
'
,
searchPlaceholder
:
'
搜索...
'
,
searchPlaceholder
:
'
搜索...
'
,
noOptionsFound
:
'
无匹配选项
'
,
noOptionsFound
:
'
无匹配选项
'
,
...
@@ -175,6 +178,7 @@ export default {
...
@@ -175,6 +178,7 @@ export default {
accounts
:
'
账号管理
'
,
accounts
:
'
账号管理
'
,
proxies
:
'
IP管理
'
,
proxies
:
'
IP管理
'
,
redeemCodes
:
'
兑换码
'
,
redeemCodes
:
'
兑换码
'
,
ops
:
'
运维监控
'
,
settings
:
'
系统设置
'
,
settings
:
'
系统设置
'
,
myAccount
:
'
我的账户
'
,
myAccount
:
'
我的账户
'
,
lightMode
:
'
浅色模式
'
,
lightMode
:
'
浅色模式
'
,
...
@@ -1858,6 +1862,370 @@ export default {
...
@@ -1858,6 +1862,370 @@ export default {
failedToLoad
:
'
加载使用记录失败
'
failedToLoad
:
'
加载使用记录失败
'
},
},
// Ops Monitoring
ops
:
{
title
:
'
运维监控
'
,
description
:
'
运维监控与排障
'
,
// Dashboard
systemHealth
:
'
系统健康
'
,
overview
:
'
概览
'
,
noSystemMetrics
:
'
尚未收集系统指标。
'
,
collectedAt
:
'
采集时间:
'
,
window
:
'
窗口
'
,
cpu
:
'
CPU
'
,
memory
:
'
内存
'
,
db
:
'
数据库
'
,
redis
:
'
Redis
'
,
goroutines
:
'
协程
'
,
jobs
:
'
后台任务
'
,
active
:
'
活跃
'
,
idle
:
'
空闲
'
,
ok
:
'
正常
'
,
lastRun
:
'
最近运行
'
,
lastSuccess
:
'
最近成功
'
,
lastError
:
'
最近错误
'
,
noData
:
'
暂无数据
'
,
loadingText
:
'
加载中...
'
,
ready
:
'
就绪
'
,
requestsTotal
:
'
请求(总计)
'
,
slaScope
:
'
SLA 范围:
'
,
tokens
:
'
Token
'
,
tps
:
'
TPS
'
,
current
:
'
当前
'
,
peak
:
'
峰值
'
,
sla
:
'
SLA(排除业务限制)
'
,
businessLimited
:
'
业务限制:
'
,
errors
:
'
错误
'
,
errorRate
:
'
错误率:
'
,
upstreamRate
:
'
上游错误率:
'
,
latencyDuration
:
'
延迟 (duration_ms)
'
,
ttftLabel
:
'
TTFT (first_token_ms)
'
,
p50
:
'
p50
'
,
p90
:
'
p90
'
,
p95
:
'
p95
'
,
p99
:
'
p99
'
,
avg
:
'
avg
'
,
max
:
'
max
'
,
qps
:
'
QPS
'
,
requests
:
'
请求
'
,
upstream
:
'
上游
'
,
client
:
'
客户端
'
,
system
:
'
系统
'
,
other
:
'
其他
'
,
errorsSla
:
'
错误(SLA范围)
'
,
upstreamExcl429529
:
'
上游(排除429/529)
'
,
failedToLoadData
:
'
加载运维数据失败
'
,
tpsK
:
'
TPS (K)
'
,
top
:
'
最高:
'
,
throughputTrend
:
'
吞吐趋势
'
,
latencyHistogram
:
'
延迟分布
'
,
errorTrend
:
'
错误趋势
'
,
errorDistribution
:
'
错误分布
'
,
// Error Log
errorLog
:
{
timeId
:
'
时间 / ID
'
,
context
:
'
上下文
'
,
status
:
'
状态码
'
,
message
:
'
消息
'
,
latency
:
'
延迟
'
,
action
:
'
操作
'
,
noErrors
:
'
该窗口内暂无错误。
'
,
grp
:
'
GRP:
'
,
acc
:
'
ACC:
'
,
details
:
'
详情
'
,
phase
:
'
阶段
'
},
// Error Details Modal
errorDetails
:
{
upstreamErrors
:
'
上游错误
'
,
requestErrors
:
'
请求错误
'
,
total
:
'
总计:
'
,
searchPlaceholder
:
'
搜索 request_id / client_request_id / message
'
,
accountIdPlaceholder
:
'
account_id
'
},
// Error Detail Modal
errorDetail
:
{
loading
:
'
加载中…
'
,
requestId
:
'
请求 ID
'
,
time
:
'
时间
'
,
phase
:
'
阶段
'
,
status
:
'
状态码
'
,
message
:
'
消息
'
,
basicInfo
:
'
基本信息
'
,
platform
:
'
平台
'
,
model
:
'
模型
'
,
latency
:
'
延迟
'
,
ttft
:
'
TTFT
'
,
businessLimited
:
'
业务限制
'
,
requestPath
:
'
请求路径
'
,
timings
:
'
时序信息
'
,
auth
:
'
认证
'
,
routing
:
'
路由
'
,
upstream
:
'
上游
'
,
response
:
'
响应
'
,
retry
:
'
重试
'
,
retryClient
:
'
重试(客户端)
'
,
retryUpstream
:
'
重试(上游固定)
'
,
pinnedAccountId
:
'
固定 account_id
'
,
retryNotes
:
'
重试说明
'
,
requestBody
:
'
请求体
'
,
errorBody
:
'
错误体
'
,
trimmed
:
'
已截断
'
,
confirmRetry
:
'
确认重试
'
,
retrySuccess
:
'
重试成功
'
,
retryFailed
:
'
重试失败
'
,
na
:
'
N/A
'
,
retryHint
:
'
重试将使用相同的请求参数重新发送请求
'
,
retryClientHint
:
'
使用客户端重试(不固定账号)
'
,
retryUpstreamHint
:
'
使用上游固定重试(固定到错误的账号)
'
,
pinnedAccountIdHint
:
'
(自动从错误日志获取)
'
,
retryNote1
:
'
重试会使用相同的请求体和参数
'
,
retryNote2
:
'
如果原请求失败是因为账号问题,固定重试可能仍会失败
'
,
retryNote3
:
'
客户端重试会重新选择账号
'
,
confirmRetryMessage
:
'
确认要重试该请求吗?
'
,
confirmRetryHint
:
'
将使用相同的请求参数重新发送
'
},
requestDetails
:
{
title
:
'
请求明细
'
,
details
:
'
明细
'
,
rangeLabel
:
'
窗口:{range}
'
,
rangeMinutes
:
'
{n} 分钟
'
,
rangeHours
:
'
{n} 小时
'
,
empty
:
'
该窗口内暂无请求。
'
,
emptyHint
:
'
可尝试调整时间范围或取消部分筛选。
'
,
failedToLoad
:
'
加载请求明细失败
'
,
requestIdCopied
:
'
请求ID已复制
'
,
copyFailed
:
'
复制失败
'
,
copy
:
'
复制
'
,
viewError
:
'
查看错误
'
,
kind
:
{
success
:
'
成功
'
,
error
:
'
失败
'
},
table
:
{
time
:
'
时间
'
,
kind
:
'
类型
'
,
platform
:
'
平台
'
,
model
:
'
模型
'
,
duration
:
'
耗时
'
,
status
:
'
状态码
'
,
requestId
:
'
请求ID
'
,
actions
:
'
操作
'
}
},
alertEvents
:
{
title
:
'
告警事件
'
,
description
:
'
最近的告警触发/恢复记录(仅邮件通知)
'
,
loading
:
'
加载中...
'
,
empty
:
'
暂无告警事件
'
,
loadFailed
:
'
加载告警事件失败
'
,
table
:
{
time
:
'
时间
'
,
status
:
'
状态
'
,
severity
:
'
级别
'
,
title
:
'
标题
'
,
metric
:
'
指标 / 阈值
'
,
email
:
'
邮件已发送
'
}
},
alertRules
:
{
title
:
'
告警规则
'
,
description
:
'
创建与管理系统阈值告警(仅邮件通知)
'
,
loading
:
'
加载中...
'
,
empty
:
'
暂无告警规则
'
,
loadFailed
:
'
加载告警规则失败
'
,
saveFailed
:
'
保存告警规则失败
'
,
deleteFailed
:
'
删除告警规则失败
'
,
create
:
'
新建规则
'
,
createTitle
:
'
新建告警规则
'
,
editTitle
:
'
编辑告警规则
'
,
deleteConfirmTitle
:
'
确认删除该规则?
'
,
deleteConfirmMessage
:
'
将删除该规则及其关联的告警事件,是否继续?
'
,
metrics
:
{
successRate
:
'
成功率 (%)
'
,
errorRate
:
'
错误率 (%)
'
,
p95
:
'
P95 延迟 (ms)
'
,
p99
:
'
P99 延迟 (ms)
'
,
cpu
:
'
CPU 使用率 (%)
'
,
memory
:
'
内存使用率 (%)
'
,
queueDepth
:
'
并发排队深度
'
},
table
:
{
name
:
'
名称
'
,
metric
:
'
指标
'
,
severity
:
'
级别
'
,
enabled
:
'
启用
'
,
actions
:
'
操作
'
},
form
:
{
name
:
'
名称
'
,
description
:
'
描述
'
,
metric
:
'
指标
'
,
operator
:
'
运算符
'
,
threshold
:
'
阈值
'
,
severity
:
'
级别
'
,
window
:
'
统计窗口(分钟)
'
,
sustained
:
'
连续样本数(每分钟)
'
,
cooldown
:
'
冷却期(分钟)
'
,
enabled
:
'
启用
'
,
notifyEmail
:
'
发送邮件通知
'
},
validation
:
{
title
:
'
请先修正以下问题
'
,
invalid
:
'
规则不合法
'
,
nameRequired
:
'
名称不能为空
'
,
metricRequired
:
'
指标不能为空
'
,
operatorRequired
:
'
运算符不能为空
'
,
thresholdRequired
:
'
阈值必须为数字
'
,
windowRange
:
'
统计窗口必须为 1 / 5 / 60 分钟之一
'
,
sustainedRange
:
'
连续样本数必须在 1 到 1440 之间
'
,
cooldownRange
:
'
冷却期必须在 0 到 1440 分钟之间
'
}
},
runtime
:
{
title
:
'
运维监控运行设置
'
,
description
:
'
配置存储在数据库中,无需修改 config 文件即可生效。
'
,
loading
:
'
加载中...
'
,
noData
:
'
暂无运行设置
'
,
loadFailed
:
'
加载运行设置失败
'
,
saveSuccess
:
'
运行设置已保存
'
,
saveFailed
:
'
保存运行设置失败
'
,
alertTitle
:
'
告警评估器
'
,
groupAvailabilityTitle
:
'
分组可用性监控
'
,
evalIntervalSeconds
:
'
评估间隔(秒)
'
,
silencing
:
{
title
:
'
告警静默(维护模式)
'
,
enabled
:
'
启用静默
'
,
globalUntil
:
'
静默截止时间(RFC3339)
'
,
untilPlaceholder
:
'
2026-01-05T00:00:00Z
'
,
untilHint
:
'
建议填写截止时间,避免忘记关闭静默。
'
,
reason
:
'
原因
'
,
reasonPlaceholder
:
'
例如:计划维护
'
,
entries
:
{
title
:
'
高级:定向静默
'
,
hint
:
'
可选:仅静默特定规则或特定级别。字段留空表示匹配全部。
'
,
add
:
'
新增条目
'
,
empty
:
'
暂无定向静默条目
'
,
entryTitle
:
'
条目 #{n}
'
,
ruleId
:
'
规则ID(可选)
'
,
ruleIdPlaceholder
:
'
例如:1
'
,
severities
:
'
级别(可选)
'
,
severitiesPlaceholder
:
'
例如:P0,P1(留空=全部)
'
,
until
:
'
截止时间(RFC3339)
'
,
reason
:
'
原因
'
,
validation
:
{
untilRequired
:
'
条目截止时间不能为空
'
,
untilFormat
:
'
条目截止时间必须为合法的 RFC3339 时间戳
'
,
ruleIdPositive
:
'
条目 rule_id 必须为正整数
'
,
severitiesFormat
:
'
条目级别必须为 P0..P3 的逗号分隔列表
'
}
},
validation
:
{
timeFormat
:
'
静默时间必须为合法的 RFC3339 时间戳
'
}
},
lockEnabled
:
'
启用分布式锁
'
,
lockKey
:
'
分布式锁 Key
'
,
lockTTLSeconds
:
'
分布式锁 TTL(秒)
'
,
showAdvancedDeveloperSettings
:
'
显示高级开发者设置 (Distributed Lock)
'
,
advancedSettingsSummary
:
'
高级设置 (分布式锁)
'
,
evalIntervalHint
:
'
检测任务的执行频率,建议保持默认。
'
,
validation
:
{
title
:
'
请先修正以下问题
'
,
invalid
:
'
设置不合法
'
,
evalIntervalRange
:
'
评估间隔必须在 1 到 86400 秒之间
'
,
lockKeyRequired
:
'
启用分布式锁时必须填写 Lock Key
'
,
lockKeyPrefix
:
'
分布式锁 Key 必须以「{prefix}」开头
'
,
lockKeyHint
:
'
建议以「{prefix}」开头以避免冲突
'
,
lockTtlRange
:
'
分布式锁 TTL 必须在 1 到 86400 秒之间
'
}
},
email
:
{
title
:
'
邮件通知配置
'
,
description
:
'
配置告警/报告邮件通知(存储在数据库中)。
'
,
loading
:
'
加载中...
'
,
noData
:
'
暂无邮件通知配置
'
,
loadFailed
:
'
加载邮件通知配置失败
'
,
saveSuccess
:
'
邮件通知配置已保存
'
,
saveFailed
:
'
保存邮件通知配置失败
'
,
alertTitle
:
'
告警邮件
'
,
reportTitle
:
'
报告邮件
'
,
recipients
:
'
收件人
'
,
recipientsHint
:
'
若为空,系统可能会回退使用第一个管理员邮箱。
'
,
minSeverity
:
'
最低级别
'
,
minSeverityAll
:
'
全部级别
'
,
rateLimitPerHour
:
'
每小时限额
'
,
batchWindowSeconds
:
'
合并窗口(秒)
'
,
includeResolved
:
'
包含恢复通知
'
,
dailySummary
:
'
每日摘要
'
,
weeklySummary
:
'
每周摘要
'
,
errorDigest
:
'
错误摘要
'
,
errorDigestMinCount
:
'
错误摘要最小数量
'
,
accountHealth
:
'
账号健康报告
'
,
accountHealthThreshold
:
'
错误率阈值(%)
'
,
cronPlaceholder
:
'
Cron 表达式
'
,
reportHint
:
'
发送时间使用 Cron 语法;留空将使用默认值。
'
,
validation
:
{
title
:
'
请先修正以下问题
'
,
invalid
:
'
邮件通知配置不合法
'
,
alertRecipientsRequired
:
'
已启用告警邮件,但未配置任何收件人
'
,
reportRecipientsRequired
:
'
已启用报告邮件,但未配置任何收件人
'
,
invalidRecipients
:
'
存在不合法的收件人邮箱
'
,
rateLimitRange
:
'
每小时限额必须为 ≥ 0 的数字
'
,
batchWindowRange
:
'
合并窗口必须在 0 到 86400 秒之间
'
,
cronRequired
:
'
启用定时任务时必须填写 Cron 表达式
'
,
cronFormat
:
'
Cron 表达式格式可能不正确(至少应包含 5 段)
'
,
digestMinCountRange
:
'
错误摘要最小数量必须为 ≥ 0 的数字
'
,
accountHealthThresholdRange
:
'
账号健康错误率阈值必须在 0 到 100 之间
'
}
},
concurrency
:
{
title
:
'
并发 / 排队
'
,
byPlatform
:
'
按平台
'
,
byGroup
:
'
按分组
'
,
byAccount
:
'
按账号
'
,
totalRows
:
'
共 {count} 项
'
,
disabledHint
:
'
已在设置中关闭实时监控。
'
,
empty
:
'
暂无数据
'
,
queued
:
'
队列 {count}
'
,
rateLimited
:
'
限流 {count}
'
,
errorAccounts
:
'
异常 {count}
'
,
loadFailed
:
'
加载并发数据失败
'
},
realtime
:
{
connected
:
'
实时已连接
'
,
connecting
:
'
实时连接中
'
,
reconnecting
:
'
实时重连中
'
,
offline
:
'
实时离线
'
,
closed
:
'
实时已关闭
'
,
reconnectIn
:
'
重连 {seconds}s
'
},
queryMode
:
{
auto
:
'
Auto(自动)
'
,
raw
:
'
Raw(不聚合)
'
,
preagg
:
'
Preagg(聚合)
'
},
accountAvailability
:
{
available
:
'
可用
'
,
unavailable
:
'
不可用
'
,
accountError
:
'
异常
'
},
tooltips
:
{
throughputTrend
:
'
当前窗口内的请求/QPS 与 token/TPS 趋势。
'
,
latencyHistogram
:
'
成功请求的延迟分布(duration_ms)。
'
,
errorTrend
:
'
错误趋势(SLA 口径排除业务限制;上游错误率排除 429/529)。
'
,
errorDistribution
:
'
按状态码统计的错误分布。
'
},
charts
:
{
emptyRequest
:
'
该时间窗口内暂无请求。
'
,
emptyError
:
'
该时间窗口内暂无错误。
'
,
resetZoom
:
'
重置
'
,
resetZoomHint
:
'
重置缩放(若启用)
'
,
downloadChart
:
'
下载
'
,
downloadChartHint
:
'
下载图表图片
'
}
},
// Settings
// Settings
settings
:
{
settings
:
{
title
:
'
系统设置
'
,
title
:
'
系统设置
'
,
...
@@ -1947,6 +2315,20 @@ export default {
...
@@ -1947,6 +2315,20 @@ export default {
sending
:
'
发送中...
'
,
sending
:
'
发送中...
'
,
enterRecipientHint
:
'
请输入收件人邮箱地址
'
enterRecipientHint
:
'
请输入收件人邮箱地址
'
},
},
opsMonitoring
:
{
title
:
'
运维监控
'
,
description
:
'
启用运维监控模块,用于排障与健康可视化
'
,
disabled
:
'
运维监控已关闭
'
,
enabled
:
'
启用运维监控
'
,
enabledHint
:
'
启用 Ops 运维监控模块(仅管理员可见)
'
,
realtimeEnabled
:
'
启用实时监控
'
,
realtimeEnabledHint
:
'
启用实时 QPS/指标推送(WebSocket)
'
,
queryMode
:
'
默认查询模式
'
,
queryModeHint
:
'
Ops Dashboard 默认查询模式(auto/raw/preagg)
'
,
queryModeAuto
:
'
自动(推荐)
'
,
queryModeRaw
:
'
Raw(最准,但较慢)
'
,
queryModePreagg
:
'
Preagg(最快,需预聚合)
'
},
adminApiKey
:
{
adminApiKey
:
{
title
:
'
管理员 API Key
'
,
title
:
'
管理员 API Key
'
,
description
:
'
用于外部系统集成的全局 API Key,拥有完整的管理员权限
'
,
description
:
'
用于外部系统集成的全局 API Key,拥有完整的管理员权限
'
,
...
...
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