Files
LokiStack/frontend/src/i18n/locales/en/analysis.ts
T
opsx d4422f1541
CI / Backend (go vet + test) (push) Canceled after 0s
CI / Frontend (lint + build + test) (push) Canceled after 0s
refactor(analysis): 去掉排行 10/30/50 选择器,改为一次取 50 + 前端分页;零点结算昨天
=== 1. 为什么去掉「显示条数」选择器 ===
topk 的 N 不影响查询成本(扫描的 chunk 集合完全相同),实测:
  topk(10)  17833ms / 11 条
  topk(30)  18019ms / 34 条
  topk(50)   7394ms / 54 条
  topk(100) 17553ms / 74 条
波动来自集群负载,与 N 无关 —— 它只决定最后返回多少序列。
所以"选 30"既不更快也不更慢,本质是个翻页开关;
而选它还要重新等一次十几秒的查询,纯亏。
改为:一次 topk(50),前端 10 条/页 → 5 页只需 1 次查询。
附带收益:占比的分母从"前 10 合计"变成"前 50 合计",更接近真实占比。
副标题明确写清"一次取前 50 个应用(占比按这 50 个合计计算)"。

=== 2. 零点结算昨天(daily volume)===
原来只有 30 分钟 ticker 回补,且启动时间不对齐整点 →
昨天最早的一段可能已经超出 Loki 24h 保留期被删,
结算结果系统性偏低,图上却标"完整一天",属静默错数。
新增 nextMidnightFinalize():每天 00:01 触发 FinalizeYesterdayVolume()
  - 昨天定稿 partial=false
  - 补一次条数(index/stats,一天一次可接受)
  - 顺带刷新今天 partial=true 的柱子
ticker 仍保留,负责当天数据的 30 分钟刷新。

=== 3. 顺带 ===
- 去掉每日量"其中 N 天平台没有留存记录"的提示文案(按用户要求)
- 修 QuickQueryTemplates.tsx 的未使用变量导致 tsc -b 失败
- 工作区里上一轮中断的"排行体积列"改动一并纳入(app-ranking 返回 bytes,
  TopAppsTable 增加体积列,快照记录 per-app 字节数)

Pod = Hub latest = a16978d2f88b
2026-10-30 17:13:18 +00:00

103 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Log analysis page (admin) — registered via i18n/domains.ts; page entry imports '@/i18n/domains'
export default {
title: 'Log Analysis',
subtitle: 'Log volume, errors and trends by app and namespace — identify the highest-volume workloads',
adminOnly: {
title: 'Admin only',
desc: 'Log analysis provides platform-wide statistics for administrators. Contact an administrator for access.',
},
emptySource: {
title: 'No Loki data source yet',
desc: 'Connect a data source on the log query page, then view the aggregate analysis here.',
goLogs: 'Go to log query',
},
filter: {
source: 'Source',
sourceEmpty: 'No data sources',
namespace: 'Namespace',
namespaceEmpty: 'Loading namespaces…',
namespaceAll: 'All namespaces (slow)',
refresh: 'Refresh',
pendingApply: 'Filters changed — click Refresh to apply',
},
stats: {
total: 'Total logs',
totalVolume: 'Volume (index)',
totalEntries: 'Entries (index)',
errors: 'Error lines',
warnings: 'Warning lines',
apps: 'Active apps',
},
trend: {
title: 'Log volume trend',
subtitle: 'Log volume per time bucket (from index stats, instant)',
peak: 'Peak',
avg: 'Avg',
unitHint: 'Unit: volume per bucket',
seriesTotal: 'Total',
seriesVolume: 'Volume',
seriesError: 'Errors',
seriesWarn: 'Warnings',
empty: 'No log data in this time range',
},
stream: {
title: 'App volume stream',
subtitle: 'Stacked distribution over time for the top {{count}} apps by volume',
empty: 'No app-dimension data',
},
pie: {
title: 'Top 5 apps by volume',
subtitle: 'Top 5 apps by log lines, the rest grouped as Other',
empty: 'No app-dimension data',
other: 'Other',
},
daily: {
notRetained: 'Not retained',
missingHint: '{{count}} day(s) have no retained snapshot (grey bars) — that does NOT mean zero logs on those days.',
fixedBadge: 'Platform history',
badge: 'Platform history',
title: 'Daily volume',
subtitle: 'Daily log volume — history kept by the platform',
empty: 'No history yet — the platform records one snapshot per day',
lastDays: '{{count}}d',
oneYear: '1y',
coverage: '{{count}} days captured',
seriesVolume: 'Volume',
inProgress: 'today: in progress',
},
table: {
pagerInfo: '{{total}} apps · page {{page}}/{{pages}}',
prevPage: 'Prev',
nextPage: 'Next',
subtitleHistory: 'This {{range}}-minute range exceeds live-scan limits, so this reads the platform\'s hourly pre-aggregated snapshots ({{hours}} hours retained) — returns in milliseconds, sorted by volume, without error counts or trends.',
bytesCoverage: 'Only {{bytesHours}} of {{hours}} hours have volume data (earlier snapshots stored entries only), so volume may be understated.',
title: 'App volume ranking',
computing: 'Computing per-app volume (reads log content, usually 20–30s)…',
subtitle: 'Fetches the top 50 apps once (share is computed against those 50), 10 rows per page; click "View logs" to open the query page',
rank: '#',
app: 'App',
appWithKey: 'App ({{key}})',
volume: 'Volume',
bytes: 'Volume',
entries: 'Entries',
share: 'Share',
errors: 'Errors',
errorRate: 'Error rate',
trend: 'Trend',
actions: 'Actions',
viewLogs: 'View logs',
untagged: '(untagged)',
empty: 'No app-dimension data',
},
ingress: {
title: 'Ingress access analysis',
noIngress: 'No ingress-nginx / ingress namespace access logs found on this source',
empty: 'No parseable ingress access logs in this time range',
loading: 'Loading ingress access logs…',
notDetected: 'No ingress-nginx detected',
toggleAria: 'Expand / collapse Ingress access analysis',
loadFailed: 'Failed to load ingress access logs',
},
}