From 52555312177b6479c674cb4a05cc95c5637a81ec Mon Sep 17 00:00:00 2001 From: li Date: Tue, 7 Jul 2026 13:49:42 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(web):=20add=20"Yesterday"=20ti?= =?UTF-8?q?me=20range=20to=20request=20monitoring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #204 (yesterday dimension) --- .../features/monitoring/components/MonitoringFiltersPanel.tsx | 1 + apps/web/src/features/monitoring/model/range.ts | 3 +++ apps/web/src/features/monitoring/model/types.ts | 2 +- .../src/features/monitoring/monitoringCenterUiState.test.ts | 1 + apps/web/src/features/monitoring/monitoringCenterUiState.ts | 3 ++- apps/web/src/i18n/locales/en.json | 1 + apps/web/src/i18n/locales/ru.json | 1 + apps/web/src/i18n/locales/zh-CN.json | 1 + apps/web/src/i18n/locales/zh-TW.json | 1 + 9 files changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/web/src/features/monitoring/components/MonitoringFiltersPanel.tsx b/apps/web/src/features/monitoring/components/MonitoringFiltersPanel.tsx index 2e71f73f6..cb071e44c 100644 --- a/apps/web/src/features/monitoring/components/MonitoringFiltersPanel.tsx +++ b/apps/web/src/features/monitoring/components/MonitoringFiltersPanel.tsx @@ -41,6 +41,7 @@ type MonitoringFiltersPanelProps = { const TIME_RANGE_OPTIONS: Array<{ value: MonitoringTimeRange; labelKey: string }> = [ { value: 'today', labelKey: 'monitoring.range_today' }, + { value: 'yesterday', labelKey: 'monitoring.range_yesterday' }, { value: '7d', labelKey: 'monitoring.range_7d' }, { value: '14d', labelKey: 'monitoring.range_14d' }, { value: '30d', labelKey: 'monitoring.range_30d' }, diff --git a/apps/web/src/features/monitoring/model/range.ts b/apps/web/src/features/monitoring/model/range.ts index 8bdb5b915..4d0af9bf0 100644 --- a/apps/web/src/features/monitoring/model/range.ts +++ b/apps/web/src/features/monitoring/model/range.ts @@ -44,6 +44,8 @@ export const getRangeBounds = ( switch (range) { case 'today': return { startMs: todayStart, endMs: nowMs }; + case 'yesterday': + return { startMs: todayStart - 24 * 60 * 60 * 1000, endMs: todayStart }; case '7d': return { startMs: todayStart - 6 * 24 * 60 * 60 * 1000, endMs: nowMs }; case '14d': @@ -61,6 +63,7 @@ export const shouldUseHourlyTimeline = ( customRange?: MonitoringCustomTimeRange | null ) => range === 'today' || + range === 'yesterday' || (range === 'custom' && isValidCustomTimeRange(customRange) && buildLocalDayKey(customRange.startMs) === buildLocalDayKey(customRange.endMs)); diff --git a/apps/web/src/features/monitoring/model/types.ts b/apps/web/src/features/monitoring/model/types.ts index 5ab6e9ea1..2aeaaf565 100644 --- a/apps/web/src/features/monitoring/model/types.ts +++ b/apps/web/src/features/monitoring/model/types.ts @@ -27,7 +27,7 @@ export type MonitoringAuthMeta = { updatedAt: string; }; -export type MonitoringTimeRange = 'today' | '7d' | '14d' | '30d' | 'all' | 'custom'; +export type MonitoringTimeRange = 'today' | 'yesterday' | '7d' | '14d' | '30d' | 'all' | 'custom'; export type MonitoringCustomTimeRange = { startMs: number; diff --git a/apps/web/src/features/monitoring/monitoringCenterUiState.test.ts b/apps/web/src/features/monitoring/monitoringCenterUiState.test.ts index 372b5c606..aa1871327 100644 --- a/apps/web/src/features/monitoring/monitoringCenterUiState.test.ts +++ b/apps/web/src/features/monitoring/monitoringCenterUiState.test.ts @@ -67,6 +67,7 @@ describe('monitoringCenterUiState', () => { it('normalizes persisted filter fields', () => { expect(normalizeMonitoringTimeRange('30d')).toBe('30d'); + expect(normalizeMonitoringTimeRange('yesterday')).toBe('yesterday'); expect(normalizeMonitoringTimeRange('bad')).toBe('today'); expect(normalizeMonitoringStatusFilter('failed')).toBe('failed'); expect(normalizeMonitoringStatusFilter('bad')).toBe('all'); diff --git a/apps/web/src/features/monitoring/monitoringCenterUiState.ts b/apps/web/src/features/monitoring/monitoringCenterUiState.ts index e0a550831..332b3d8ec 100644 --- a/apps/web/src/features/monitoring/monitoringCenterUiState.ts +++ b/apps/web/src/features/monitoring/monitoringCenterUiState.ts @@ -1,5 +1,5 @@ export type MonitoringDataTab = 'accounts' | 'apiKeys' | 'realtime'; -export type MonitoringCenterTimeRange = 'today' | '7d' | '14d' | '30d' | 'all' | 'custom'; +export type MonitoringCenterTimeRange = 'today' | 'yesterday' | '7d' | '14d' | '30d' | 'all' | 'custom'; export type MonitoringCenterStatusFilter = 'all' | 'success' | 'failed'; export const MONITORING_DATA_TABS: readonly MonitoringDataTab[] = [ @@ -37,6 +37,7 @@ export type MonitoringCenterUiState = { const TAB_SET = new Set(MONITORING_DATA_TABS); const TIME_RANGE_SET = new Set([ 'today', + 'yesterday', '7d', '14d', '30d', diff --git a/apps/web/src/i18n/locales/en.json b/apps/web/src/i18n/locales/en.json index 723dd82e3..155330fbe 100644 --- a/apps/web/src/i18n/locales/en.json +++ b/apps/web/src/i18n/locales/en.json @@ -1568,6 +1568,7 @@ "realtime_console_eyebrow": "Realtime Runtime Monitor", "console_subtitle": "Track call volume, success and failure, token structure, and spend by account within the selected time range, with a live table that behaves more like a request log console.", "range_today": "Today", + "range_yesterday": "Yesterday", "range_7d": "7d", "range_14d": "14d", "range_30d": "30d", diff --git a/apps/web/src/i18n/locales/ru.json b/apps/web/src/i18n/locales/ru.json index 72d69f5b3..776c925f9 100644 --- a/apps/web/src/i18n/locales/ru.json +++ b/apps/web/src/i18n/locales/ru.json @@ -1568,6 +1568,7 @@ "realtime_console_eyebrow": "Мониторинг в реальном времени", "console_subtitle": "Следите за количеством вызовов, успехами, ошибками, токенами и расходами по аккаунтам за выбранный период.", "range_today": "Сегодня", + "range_yesterday": "Вчера", "range_7d": "7д", "range_14d": "14д", "range_30d": "30д", diff --git a/apps/web/src/i18n/locales/zh-CN.json b/apps/web/src/i18n/locales/zh-CN.json index 2790eeff4..0bd793edd 100644 --- a/apps/web/src/i18n/locales/zh-CN.json +++ b/apps/web/src/i18n/locales/zh-CN.json @@ -1568,6 +1568,7 @@ "realtime_console_eyebrow": "实时运行监控", "console_subtitle": "按账号和时间范围追踪调用规模、成功失败、Token 结构和花费,并提供接近请求日志的实时监控表。", "range_today": "今天", + "range_yesterday": "昨天", "range_7d": "7 天", "range_14d": "14 天", "range_30d": "30 天", diff --git a/apps/web/src/i18n/locales/zh-TW.json b/apps/web/src/i18n/locales/zh-TW.json index e23306589..bad103355 100644 --- a/apps/web/src/i18n/locales/zh-TW.json +++ b/apps/web/src/i18n/locales/zh-TW.json @@ -1568,6 +1568,7 @@ "realtime_console_eyebrow": "即時運行監控", "console_subtitle": "按帳號與時間範圍追蹤呼叫規模、成功失敗、Token 結構與花費,並提供接近請求日誌的即時監控表。", "range_today": "今天", + "range_yesterday": "昨天", "range_7d": "7 天", "range_14d": "14 天", "range_30d": "30 天",