Files
LokiStack/frontend/src/i18n/locales/en/common.ts
T
opsx 95dcd9408c fix(logs,analysis,alerts): 数据源不可达、分析页超时、告警规则混入基础设施项
=== 1. 主机模式数据源地址 0.0.0.0 → 主机真实 IP(查询页"永远加载中"的根因)===
现象:切换数据源后命名空间/App 下拉不动,一直显示"加载中…",控制台报
    Get "http://0.0.0.0:3100/loki/api/v1/labels": dial tcp 0.0.0.0:3100: connect: connection refused

根因:主机模式部署的 endpoint 记的是**容器监听地址** 0.0.0.0:3100,
而平台进程不在被采集主机上,0.0.0.0 只在本机有意义。
EnsureLogSourceForDeployment 把它原样写成了数据源 URL。

修法:
  - 新增 reachableEndpoint():把 0.0.0.0 / [::] 换成关联主机的真实 IP
  - schemaVersion v3→v4 迁移 fixUnreachableLogSourceURLs(),修正已有脏数据
  - 实测:http://0.0.0.0:3100 → http://172.19.16.8:3100,该源 label 查询由 502 变 200

=== 2. 前端:区分"加载中"与"加载失败" ===
原来用 `loading={!options.length}` 表示加载中 —— 数据源不可达时列表永远为空,
于是界面永远转圈,把真实错误完全藏起来了(这次的 0.0.0.0 就是这样被掩盖的)。
改为独立的 namespaceLoading / namespaceError 两个状态:
  - 切换数据源先清空旧 options(否则显示上一个源的命名空间,看着像"没反应")
  - 失败显示"加载失败"并在旁边给「重试」按钮,不用刷新整页

=== 3. 日志分析页:主图改走索引接口(原来 5 条 count_over_time 全超时)===
实测 astralx(约 370GB/天)15 分钟窗口:
  count_over_time   → exec 29s + 排队 95s,超过 30s 护栏 → 502
  index/volume_range → 0s
改为两阶段渲染:
  - 总量趋势改用 /logs/histogram(内部 index/volume_range),**0s 出图**
  - 错误/警告/app 维度仍需读日志内容,串行执行,先渲染主图再更新
  - heavyQueryTimeout 30s → 90s(实测 error 维度查询 14s 可完成)

=== 4. 告警规则按日志平台定位收敛 ===
  - seed 里删掉「Kubernetes 节点 NotReady」「容器 OOMKilled」:
    这类属于 kube-state-metrics / Prometheus 的职责,用日志字符串匹配不可靠
  - 迁移里清掉线上已存在的同类规则(3 条)
  - 修 AlertRule / NotifyChannel 重复 ID(同 logSources 一样漏在 sequences 重建外)

=== 5. 告警页 UI ===
  - 规则列表由"每条一张卡"改为紧凑表格(一屏看全,阈值可对齐比较)
  - 通知通道(飞书/Lark/Webhook)从「系统设置」搬到告警页折叠区:
    规则和"发到哪"是一件事的两半,分两页配容易漏配导致告警发不出去

=== 6. 权限收敛 ===
  - /alerts 加 adminOnly:普通用户按查询授权只看「日志查询」,不再看到告警菜单
  - 系统设置从侧栏移到右上角齿轮(低频平台配置,不占侧栏一位)

=== 7. 迁移设计教训(写进代码注释)===
v2 时把"告警去重 + 清基础设施规则"塞进 case 1,但线上库已到 v2,
那段代码永远不执行。**结构变更只要逻辑变了、目标库已达该版本,就必须再抬一版**,
不能改历史迁移分支。

=== 实测(v4-1028-2210 / 979bdb4a48e8)===
  v4 迁移:数据源 URL 修正 http://0.0.0.0:3100 → http://172.19.16.8:3100
  source 1 label:200,0s(astralx / log)
  source 2 label:200,0s(不再 connection refused)
  分析页 histogram astralx 15m:0s
  分析页 metrics  error  astralx 15m:14s
  告警规则:10 条(已无基础设施类)、ID 唯一
  另清理 172.19.16.8 上 13 个残留容器,回收 6.1GB
2026-10-28 22:11:48 +00:00

128 lines
3.4 KiB
TypeScript

// common namespace — app shell (menu / top bar / login / shared components / status)
export default {
appName: 'LokiStack',
menu: {
groups: {
resources: 'Resources',
services: 'Log Service',
system: 'Users & Audit',
},
dashboard: 'Dashboard',
wizard: 'Deploy Wizard',
clusters: 'Clusters',
hosts: 'Hosts',
storage: 'Storage',
deployments: 'Component Deploy',
collectors: 'Log Collectors',
logs: 'Log Query',
alerts: 'Alerts',
analysis: 'Log Analysis',
settings: 'Settings',
users: 'Users',
audit: 'Audit Log',
login: 'Sign In',
notFound: 'Page Not Found',
},
layout: {
nav: 'Main navigation',
sheetTitle: 'LokiStack Navigation',
collapse: 'Collapse menu',
expand: 'Expand menu',
openNav: 'Open navigation menu',
logout: 'Sign out',
logoutShort: 'Sign out',
toLight: 'Switch to light theme',
toDark: 'Switch to dark theme',
admin: 'Admin',
loading: 'Loading page',
},
login: {
subtitle: 'Loki Log Management Platform',
heading: 'Sign In',
username: 'Username',
usernamePlaceholder: 'Enter username',
password: 'Password',
passwordPlaceholder: 'Enter password',
remember: 'Remember username',
submit: 'Sign In',
submitting: 'Signing in...',
errCredential: 'Invalid username or password',
errConn: 'Cannot reach the backend. Make sure it is running on port 8080.',
errFallback: 'Sign-in failed',
backendDown: 'Service temporarily unavailable',
showPassword: 'Show password',
hidePassword: 'Hide password',
backendDownHint: 'Cannot reach the service. Try again later or contact an admin.',
},
dialog: {
confirmTitle: 'Confirm Deletion',
confirmText: 'Delete',
cancel: 'Cancel',
processing: 'Processing...',
confirmIrreversible: 'Are you sure? This cannot be undone.',
confirmDefault: 'Delete "{{name}}"? This cannot be undone.',
},
error: {
title: 'Failed to load',
hint: 'Check the network or backend service, then retry',
retry: 'Retry',
},
pagination: {
total: '{{count}} items',
summary: '{{count}} items · Page {{page}} of {{pages}}',
},
status: {
active: 'Running',
running: 'Running',
inactive: 'Stopped',
stopped: 'Stopped',
pending: 'Pending',
deploying: 'Deploying',
failed: 'Failed',
error: 'Error',
},
notFound: {
heading: 'Page Not Found',
hint: 'The page does not exist or has been removed',
backHome: 'Back to Home',
},
lang: {
section: 'Language',
zh: '中文',
en: 'English',
},
boundary: {
title: 'Rendering Error',
hint: 'Something went wrong. Try refreshing; if it persists, report the details below.',
unknown: 'Unknown error',
reload: 'Reload Page',
reset: 'Reset Component',
},
spinner: {
default: 'Loading...',
},
range: {
lastMinutes: 'Last {{count}} minutes',
lastHours: 'Last {{count}} hours',
lastHours_one: 'Last {{count}} hour',
custom: 'Custom time',
title: 'Select time range',
start: 'Start time',
end: 'End time',
apply: 'Apply',
recent: 'Recently used',
},
ui: {
close: 'Close',
prevPage: 'Previous',
nextPage: 'Next',
goPrevPage: 'Go to previous page',
goNextPage: 'Go to next page',
morePages: 'More pages',
},
password: {
hide: 'Hide password',
show: 'Show password',
},
}