From 657c23d23790e7fb62a4a55de1c24fa555181461 Mon Sep 17 00:00:00 2001 From: shats Date: Tue, 24 Feb 2026 13:39:59 +0700 Subject: [PATCH] feat(logging): enhance API request logging and implement noRetry flag for improved error handling and diagnostics --- .cursor/debug-378b5f.log | 10 ++++++++++ backend/services/networkMapScheduler.js | 10 +++++----- frontend/src/ResourceStatsPage.jsx | 5 ++++- frontend/src/lib/api.js | 8 ++++++++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/.cursor/debug-378b5f.log b/.cursor/debug-378b5f.log index e69de29..32b78b7 100644 --- a/.cursor/debug-378b5f.log +++ b/.cursor/debug-378b5f.log @@ -0,0 +1,10 @@ +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915099232} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/alerts","status":200},"timestamp":1771915099568} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915128313} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/alerts","status":200},"timestamp":1771915128707} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/mikrotik/address-lists"},"timestamp":1771915153565} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/mikrotik/address-lists","status":200},"timestamp":1771915154115} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915159241} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/alerts","status":200},"timestamp":1771915159566} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915188306} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/alerts","status":200},"timestamp":1771915188980} diff --git a/backend/services/networkMapScheduler.js b/backend/services/networkMapScheduler.js index cf7922e..c5ad8b5 100644 --- a/backend/services/networkMapScheduler.js +++ b/backend/services/networkMapScheduler.js @@ -436,16 +436,16 @@ function initNetworkMapScheduler(logger, port) { const intervalMs = settings.intervalMinutes * 60 * 1000; log.info( { component: 'network-map-scheduler', intervalMinutes: settings.intervalMinutes }, - 'Network map scheduler started (first run in 10 s, then every %d min)', + 'Network map scheduler started (runs every %d min by interval only)', settings.intervalMinutes ); schedulerTimer = setInterval(() => tick('interval'), intervalMs); - // Первый запуск через 10 сек, чтобы кеш появился вскоре после старта сервера - sendDebugLog('backend/services/networkMapScheduler.js:schedule-startup-tick', 'Startup delayed tick scheduled', { - delayMs: 10000, + // #region agent log + sendDebugLog('backend/services/networkMapScheduler.js:schedule-startup-tick-skipped', 'Startup delayed tick skipped', { + reason: 'disabled_to_avoid_immediate_speedtest_after_restart', intervalMs, }); - setTimeout(() => tick('startup-delay'), 10 * 1000); + // #endregion } schedule(); diff --git a/frontend/src/ResourceStatsPage.jsx b/frontend/src/ResourceStatsPage.jsx index eeec38e..1292887 100644 --- a/frontend/src/ResourceStatsPage.jsx +++ b/frontend/src/ResourceStatsPage.jsx @@ -151,7 +151,10 @@ export default function ResourceStatsPage() { const fetchStats = useCallback(async (abortSignal) => { setLoading(true); setError(null); - const opts = { timeout: REQUEST_TIMEOUT_MS, ...(abortSignal ? { signal: abortSignal } : {}) }; + const opts = { timeout: REQUEST_TIMEOUT_MS, noRetry: true, ...(abortSignal ? { signal: abortSignal } : {}) }; + // #region agent log + fetch('http://127.0.0.1:7343/ingest/aa002dd6-6968-4a35-b09d-f05302d83266',{method:'POST',headers:{'Content-Type':'application/json','X-Debug-Session-Id':'378b5f'},body:JSON.stringify({sessionId:'378b5f',runId:'resource-stats-fix',hypothesisId:'H_RS_RETRY',location:'frontend/src/ResourceStatsPage.jsx:fetchStats',message:'Resource stats request started with noRetry',data:{timeoutMs:REQUEST_TIMEOUT_MS,noRetry:true,hasAbortSignal:Boolean(abortSignal)},timestamp:Date.now()})}).catch(()=>{}); + // #endregion try { const res = await api.get('/resources/stats', opts); const data = res?.data; diff --git a/frontend/src/lib/api.js b/frontend/src/lib/api.js index 81e6203..fd8ac85 100644 --- a/frontend/src/lib/api.js +++ b/frontend/src/lib/api.js @@ -74,6 +74,14 @@ api.interceptors.response.use( const config = error?.config || {}; const method = String(config.method || 'get').toUpperCase(); + const noRetry = config?.noRetry === true || config?.__noRetry === true; + + if (noRetry) { + // #region agent log + fetch('http://127.0.0.1:7343/ingest/aa002dd6-6968-4a35-b09d-f05302d83266',{method:'POST',headers:{'Content-Type':'application/json','X-Debug-Session-Id':'378b5f'},body:JSON.stringify({sessionId:'378b5f',runId:'resource-stats-fix',hypothesisId:'H_RS_RETRY',location:'frontend/src/lib/api.js:retry-disabled-by-config',message:'Skip retry due to noRetry flag',data:{method:String(method),url:String(config?.url||''),code:String(error?.code||''),retryCount:Number(config?.__retryCount||0)},timestamp:Date.now()})}).catch(()=>{}); + // #endregion + return Promise.reject(error); + } // Инициализируем счетчик попыток config.__retryCount = config.__retryCount || 0;