=== 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
103 lines
3.8 KiB
TypeScript
103 lines
3.8 KiB
TypeScript
// 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',
|
||
},
|
||
}
|