From 1f391d9398340c8ffc10d1007cdcf4055b282e9f Mon Sep 17 00:00:00 2001 From: shats Date: Tue, 24 Feb 2026 14:39:25 +0700 Subject: [PATCH] feat(mikrotik): implement batch removal of address lists with fallback to individual deletes for improved efficiency and error handling --- .cursor/debug-378b5f.log | 267 +++++++------------------ backend/routes/mikrotikConfigRoutes.js | 66 +++++- 2 files changed, 123 insertions(+), 210 deletions(-) diff --git a/.cursor/debug-378b5f.log b/.cursor/debug-378b5f.log index 907f5c1..1593617 100644 --- a/.cursor/debug-378b5f.log +++ b/.cursor/debug-378b5f.log @@ -1,200 +1,67 @@ -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915608308} -{"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":1771915608646} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915615281} -{"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":1771915615733} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915668305} -{"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":1771915668662} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915674375} -{"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":1771915680196} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915728302} -{"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":1771915728641} -{"sessionId":"378b5f","runId":"nm-startup-investigation","hypothesisId":"H_STARTUP_SPEEDTEST","location":"backend/services/networkMapScheduler.js:init","message":"initNetworkMapScheduler called","data":{"port":3001,"baseUrl":"http://127.0.0.1:3001"},"timestamp":1771915726890} -{"sessionId":"378b5f","runId":"nm-startup-investigation","hypothesisId":"H_STARTUP_SPEEDTEST","location":"backend/services/networkMapScheduler.js:schedule-settings","message":"Schedule loaded settings","data":{"enabled":true,"intervalMinutes":90,"runPing":true,"runSpeedTest":true,"logMaxLines":500},"timestamp":1771915727143} -{"sessionId":"378b5f","runId":"nm-startup-investigation","hypothesisId":"H_STARTUP_SPEEDTEST","location":"backend/services/networkMapScheduler.js:schedule-startup-tick-skipped","message":"Startup delayed tick skipped","data":{"reason":"disabled_to_avoid_immediate_speedtest_after_restart","intervalMs":5400000},"timestamp":1771915727144} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915727565} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":194,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":107,"hasError":false},{"serverId":"msk-vpsville","durationMs":105,"hasError":false},{"serverId":"msk-dc","durationMs":104,"hasError":false},{"serverId":"srv-5","durationMs":96,"hasError":false},{"serverId":"nsk-servhost","durationMs":20,"hasError":false}]},"timestamp":1771915727673} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915735275} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915732376} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":130,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":56,"hasError":false},{"serverId":"msk-vpsville","durationMs":55,"hasError":false},{"serverId":"msk-dc","durationMs":54,"hasError":false},{"serverId":"srv-5","durationMs":49,"hasError":false},{"serverId":"rtk-home","durationMs":10,"hasError":false}]},"timestamp":1771915732433} -{"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":1771915735559} -{"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":15000,"noRetry":true,"hasAbortSignal":true},"timestamp":1771915750420} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/resource-stats","layout":"fluid"},"timestamp":1771915750421} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/resources/stats"},"timestamp":1771915750422} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915750422} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915747398} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915747822} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":1426,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"mts-home","durationMs":1345,"hasError":false},{"serverId":"rtk-home","durationMs":1342,"hasError":false},{"serverId":"msk-ihor","durationMs":107,"hasError":false},{"serverId":"msk-dc","durationMs":106,"hasError":false},{"serverId":"msk-vpsville","durationMs":104,"hasError":false}]},"timestamp":1771915748744} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/resources/stats","status":200},"timestamp":1771915751868} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":2938,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":2819,"hasError":false},{"serverId":"msk-vpsville","durationMs":1853,"hasError":false},{"serverId":"mts-home","durationMs":928,"hasError":false},{"serverId":"rtk-home","durationMs":925,"hasError":false},{"serverId":"msk-dc","durationMs":53,"hasError":false}]},"timestamp":1771915750642} -{"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":1771915753763} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/dashboard","layout":"fluid"},"timestamp":1771915754247} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/domains-new"},"timestamp":1771915754255} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/servers"},"timestamp":1771915754256} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/ip-ranges"},"timestamp":1771915754256} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/asns"},"timestamp":1771915754256} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/servers/availability"},"timestamp":1771915754256} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/s3/last-modified"},"timestamp":1771915754256} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/ping-services-list"},"timestamp":1771915754256} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/ping-services"},"timestamp":1771915754256} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/ip-ranges","status":200},"timestamp":1771915754378} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/domains-new","status":200},"timestamp":1771915754378} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/ping-services-list","status":200},"timestamp":1771915754452} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/s3/last-modified","status":200},"timestamp":1771915754497} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/servers","status":200},"timestamp":1771915754498} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/asns","status":200},"timestamp":1771915754511} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/ping-services","status":200},"timestamp":1771915754665} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/servers/availability","status":200},"timestamp":1771915755483} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/ui-settings"},"timestamp":1771915756475} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/traffic/interface-stats"},"timestamp":1771915756475} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/traffic","layout":"fluid"},"timestamp":1771915756471} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/ui-settings","status":200},"timestamp":1771915756563} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/traffic/interface-stats","status":200},"timestamp":1771915760644} -{"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":15000,"noRetry":true,"hasAbortSignal":true},"timestamp":1771915762275} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/resources/stats"},"timestamp":1771915762279} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/resource-stats","layout":"fluid"},"timestamp":1771915762275} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915759248} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":631,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"nsk-servhost","durationMs":561,"hasError":false},{"serverId":"msk-ihor","durationMs":107,"hasError":false},{"serverId":"msk-vpsville","durationMs":105,"hasError":false},{"serverId":"msk-dc","durationMs":104,"hasError":false},{"serverId":"srv-5","durationMs":91,"hasError":false}]},"timestamp":1771915759810} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/resources/stats","status":200},"timestamp":1771915762934} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/servers"},"timestamp":1771915764242} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/network-config"},"timestamp":1771915764242} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/network-map","layout":"fluid"},"timestamp":1771915764240} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/ui-settings"},"timestamp":1771915764242} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/network-map-cache"},"timestamp":1771915764242} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/servers","status":304},"timestamp":1771915764331} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/network-config","status":200},"timestamp":1771915764338} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/ui-settings","status":304},"timestamp":1771915764337} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/network-map-cache","status":200},"timestamp":1771915764359} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/interface-speed","layout":"fluid"},"timestamp":1771915782869} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/servers"},"timestamp":1771915782877} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/network-config"},"timestamp":1771915782877} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/ui-settings"},"timestamp":1771915782877} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/ui-settings","status":304},"timestamp":1771915782980} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/servers","status":304},"timestamp":1771915782980} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/network-config","status":304},"timestamp":1771915782983} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/mikrotik-tools","layout":"fluid"},"timestamp":1771915783798} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/network-config"},"timestamp":1771915783803} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/servers"},"timestamp":1771915783803} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/network-config","status":304},"timestamp":1771915783890} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/servers","status":304},"timestamp":1771915783890} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/mikrotik-backups","layout":"fluid"},"timestamp":1771915784696} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/servers"},"timestamp":1771915784701} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/ui-settings"},"timestamp":1771915784702} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/servers","status":304},"timestamp":1771915784791} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/ui-settings","status":304},"timestamp":1771915784792} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/mikrotik/backups"},"timestamp":1771915784814} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/mikrotik/backups","status":200},"timestamp":1771915784933} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/auto-urls","layout":"fluid"},"timestamp":1771915787629} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/auto-urls"},"timestamp":1771915787637} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/auto-urls","status":200},"timestamp":1771915787714} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915788300} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915785416} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915785444} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":170,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":106,"hasError":false},{"serverId":"msk-vpsville","durationMs":105,"hasError":false},{"serverId":"msk-dc","durationMs":105,"hasError":false},{"serverId":"srv-5","durationMs":90,"hasError":false},{"serverId":"rtk-home","durationMs":17,"hasError":false}]},"timestamp":1771915785523} -{"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":1771915788642} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":181,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":106,"hasError":false},{"serverId":"msk-dc","durationMs":106,"hasError":false},{"serverId":"msk-vpsville","durationMs":104,"hasError":false},{"serverId":"srv-5","durationMs":89,"hasError":false},{"serverId":"rtk-home","durationMs":8,"hasError":false}]},"timestamp":1771915785551} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915785748} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":119,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":54,"hasError":false},{"serverId":"msk-vpsville","durationMs":53,"hasError":false},{"serverId":"msk-dc","durationMs":53,"hasError":false},{"serverId":"srv-5","durationMs":46,"hasError":false},{"serverId":"nsk-servhost","durationMs":24,"hasError":false}]},"timestamp":1771915785802} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915786000} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":118,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":54,"hasError":false},{"serverId":"msk-vpsville","durationMs":53,"hasError":false},{"serverId":"msk-dc","durationMs":52,"hasError":false},{"serverId":"srv-5","durationMs":45,"hasError":false},{"serverId":"mts-home","durationMs":13,"hasError":false}]},"timestamp":1771915786055} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/servers"},"timestamp":1771915794784} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/uptime-monitor","layout":"fluid"},"timestamp":1771915794781} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/ui-settings"},"timestamp":1771915794785} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/ui-settings","status":304},"timestamp":1771915794876} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/servers","status":304},"timestamp":1771915794876} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/uptime/cache"},"timestamp":1771915794882} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/uptime/cache","status":200},"timestamp":1771915795034} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915798889} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915798888} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915798889} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915798889} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915801307} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915801308} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915801330} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915801330} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915801346} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915801347} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915802315} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915803782} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915803896} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915806095} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/uptime-monitor","layout":"fluid"},"timestamp":1771915807766} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/servers"},"timestamp":1771915807769} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915807769} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/ui-settings"},"timestamp":1771915807769} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/servers","status":200},"timestamp":1771915807844} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/ui-settings","status":200},"timestamp":1771915807847} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/uptime/cache"},"timestamp":1771915807857} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/uptime/cache","status":200},"timestamp":1771915807937} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915804867} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":178,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":110,"hasError":false},{"serverId":"msk-vpsville","durationMs":104,"hasError":false},{"serverId":"msk-dc","durationMs":102,"hasError":false},{"serverId":"srv-5","durationMs":93,"hasError":false},{"serverId":"rtk-home","durationMs":12,"hasError":false}]},"timestamp":1771915804978} -{"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":1771915808100} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915811862} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915811862} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915811862} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915811862} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915814222} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915814221} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915814310} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915814310} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915814452} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915814452} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915815384} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915816567} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915816902} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915818621} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915848292} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915845424} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915845504} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":179,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-dc","durationMs":114,"hasError":false},{"serverId":"msk-ihor","durationMs":106,"hasError":false},{"serverId":"srv-5","durationMs":106,"hasError":false},{"serverId":"msk-vpsville","durationMs":105,"hasError":false},{"serverId":"nsk-servhost","durationMs":19,"hasError":false}]},"timestamp":1771915845539} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":255,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":104,"hasError":false},{"serverId":"msk-vpsville","durationMs":104,"hasError":false},{"serverId":"msk-dc","durationMs":104,"hasError":false},{"serverId":"srv-5","durationMs":94,"hasError":false},{"serverId":"rtk-home","durationMs":16,"hasError":false}]},"timestamp":1771915845609} -{"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":1771915848728} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915845921} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":235,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":53,"hasError":false},{"serverId":"msk-vpsville","durationMs":53,"hasError":false},{"serverId":"msk-dc","durationMs":53,"hasError":false},{"serverId":"srv-5","durationMs":48,"hasError":false},{"serverId":"nsk-servhost","durationMs":15,"hasError":false}]},"timestamp":1771915845974} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915846181} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":121,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":54,"hasError":false},{"serverId":"msk-vpsville","durationMs":53,"hasError":false},{"serverId":"msk-dc","durationMs":53,"hasError":false},{"serverId":"srv-5","durationMs":48,"hasError":false},{"serverId":"mts-home","durationMs":15,"hasError":false}]},"timestamp":1771915846235} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915868279} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915865487} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":291,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-vpsville","durationMs":107,"hasError":false},{"serverId":"msk-ihor","durationMs":106,"hasError":false},{"serverId":"msk-dc","durationMs":104,"hasError":false},{"serverId":"srv-5","durationMs":93,"hasError":false},{"serverId":"nsk-servhost","durationMs":21,"hasError":false}]},"timestamp":1771915865595} -{"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":1771915868718} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915908321} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915905436} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":182,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-dc","durationMs":114,"hasError":false},{"serverId":"msk-ihor","durationMs":107,"hasError":false},{"serverId":"msk-vpsville","durationMs":106,"hasError":false},{"serverId":"srv-5","durationMs":95,"hasError":false},{"serverId":"mts-home","durationMs":20,"hasError":false}]},"timestamp":1771915905550} -{"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":1771915908669} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915905569} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":133,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":54,"hasError":false},{"serverId":"msk-vpsville","durationMs":53,"hasError":false},{"serverId":"msk-dc","durationMs":53,"hasError":false},{"serverId":"srv-5","durationMs":48,"hasError":false},{"serverId":"rtk-home","durationMs":9,"hasError":false}]},"timestamp":1771915905623} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915905839} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":123,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":54,"hasError":false},{"serverId":"msk-dc","durationMs":53,"hasError":false},{"serverId":"msk-vpsville","durationMs":52,"hasError":false},{"serverId":"srv-5","durationMs":47,"hasError":false},{"serverId":"mts-home","durationMs":14,"hasError":false}]},"timestamp":1771915905893} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915906106} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":123,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":53,"hasError":false},{"serverId":"msk-vpsville","durationMs":53,"hasError":false},{"serverId":"msk-dc","durationMs":53,"hasError":false},{"serverId":"srv-5","durationMs":47,"hasError":false},{"serverId":"mts-home","durationMs":17,"hasError":false}]},"timestamp":1771915906160} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915928268} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915928269} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915928269} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915928270} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915928269} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915925527} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":2178,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"srv-5","durationMs":2105,"hasError":false},{"serverId":"msk-ihor","durationMs":108,"hasError":false},{"serverId":"msk-vpsville","durationMs":107,"hasError":false},{"serverId":"msk-dc","durationMs":105,"hasError":false},{"serverId":"nsk-servhost","durationMs":25,"hasError":false}]},"timestamp":1771915927633} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915930758} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915930761} -{"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":1771915930781} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915930890} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915930889} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/uptime/check"},"timestamp":1771915930917} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915930916} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915931830} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915933096} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915933355} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771915935261} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915968311} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915965553} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915965560} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":171,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":106,"hasError":false},{"serverId":"msk-vpsville","durationMs":105,"hasError":false},{"serverId":"msk-dc","durationMs":102,"hasError":false},{"serverId":"srv-5","durationMs":90,"hasError":false},{"serverId":"mts-home","durationMs":34,"hasError":false}]},"timestamp":1771915965659} -{"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":1771915968778} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":298,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":105,"hasError":false},{"serverId":"msk-vpsville","durationMs":105,"hasError":false},{"serverId":"msk-dc","durationMs":103,"hasError":false},{"serverId":"srv-5","durationMs":93,"hasError":false},{"serverId":"rtk-home","durationMs":33,"hasError":false}]},"timestamp":1771915965666} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915965889} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":127,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":54,"hasError":false},{"serverId":"msk-vpsville","durationMs":53,"hasError":false},{"serverId":"msk-dc","durationMs":52,"hasError":false},{"serverId":"srv-5","durationMs":48,"hasError":false},{"serverId":"rtk-home","durationMs":14,"hasError":false}]},"timestamp":1771915965943} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915966170} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":127,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-ihor","durationMs":55,"hasError":false},{"serverId":"msk-vpsville","durationMs":53,"hasError":false},{"serverId":"srv-5","durationMs":53,"hasError":false},{"serverId":"msk-dc","durationMs":53,"hasError":false},{"serverId":"nsk-servhost","durationMs":17,"hasError":false}]},"timestamp":1771915966225} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771915988276} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-routers","message":"Resource stats routers loaded","data":{"serversCount":12,"routersCount":7},"timestamp":1771915985368} -{"sessionId":"378b5f","runId":"resource-stats-investigation","hypothesisId":"H_RS_BACKEND_SLOW","location":"backend/routes/resourceStatsRoutes.js:getResourceStatsData-done","message":"Resource stats aggregate timing","data":{"totalDurationMs":175,"routersCount":7,"errorsCount":0,"slowRouters":[{"serverId":"msk-vpsville","durationMs":106,"hasError":false},{"serverId":"msk-dc","durationMs":106,"hasError":false},{"serverId":"msk-ihor","durationMs":105,"hasError":false},{"serverId":"srv-5","durationMs":90,"hasError":false},{"serverId":"rtk-home","durationMs":13,"hasError":false}]},"timestamp":1771915985475} -{"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":1771915988597} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H5","location":"frontend/src/App.jsx:route-change","message":"Route changed in MainLayout","data":{"pathname":"/easy-switch","layout":"fluid"},"timestamp":1771918574971} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771918574974} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/communities"},"timestamp":1771918574974} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/communities","status":200},"timestamp":1771918575149} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/servers"},"timestamp":1771918575150} +{"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":1771918575158} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/network-config"},"timestamp":1771918575261} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/servers","status":200},"timestamp":1771918575260} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/network-config","status":200},"timestamp":1771918575342} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/server-configs"},"timestamp":1771918575343} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/server-configs","status":200},"timestamp":1771918575431} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/server-filters/srv-5"},"timestamp":1771918575432} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/server-filters/msk-vpsville"},"timestamp":1771918575432} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/server-filters/msk-ihor"},"timestamp":1771918575431} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/server-filters/msk-dc"},"timestamp":1771918575432} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/server-filters/nsk-servhost"},"timestamp":1771918575432} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/server-filters/msk-vpsville","status":200},"timestamp":1771918575519} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/server-filters/msk-ihor","status":200},"timestamp":1771918575641} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/server-filters/srv-5","status":200},"timestamp":1771918575645} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/server-filters/nsk-servhost","status":200},"timestamp":1771918575648} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/server-filters/msk-dc","status":200},"timestamp":1771918575649} +{"sessionId":"378b5f","runId":"post-fix","hypothesisId":"H6","location":"frontend/src/contexts/PingContext.jsx:requestPings","message":"Ping batch scheduled","data":{"scope":"easy-switch","count":20,"force":false},"timestamp":1771918575650} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575651} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575651} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575651} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575651} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575651} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575651} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575652} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575652} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575652} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575652} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575652} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575652} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575653} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575652} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575652} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575652} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575653} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575653} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575653} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"POST","url":"/mikrotik/ping"},"timestamp":1771918575653} +{"sessionId":"378b5f","runId":"post-fix","hypothesisId":"H6","location":"frontend/src/contexts/PingContext.jsx:requestPings","message":"Ping batch scheduled","data":{"scope":"easy-switch","count":0,"force":false},"timestamp":1771918575667} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918581171} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918581264} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918585199} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918585287} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918589219} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918589300} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918590962} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918593250} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918593325} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918594992} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918596225} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918599017} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918600849} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918601366} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918603038} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918604878} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918606344} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918608918} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918610433} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/mikrotik/ping","status":200},"timestamp":1771918614512} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771918634979} +{"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":1771918635314} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771918694983} +{"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":1771918695315} diff --git a/backend/routes/mikrotikConfigRoutes.js b/backend/routes/mikrotikConfigRoutes.js index dcc1dfe..d7b2c55 100644 --- a/backend/routes/mikrotikConfigRoutes.js +++ b/backend/routes/mikrotikConfigRoutes.js @@ -1475,6 +1475,58 @@ async function getAddressLists(req, res) { } const ADDRESS_LIST_PATH = 'ip/firewall/address-list'; +const ADDRESS_LIST_REMOVE_CHUNK_SIZE = 100; + +function chunkArray(items, size) { + if (!Array.isArray(items) || items.length === 0) return []; + const chunkSize = Math.max(1, Number(size) || 1); + const chunks = []; + for (let i = 0; i < items.length; i += chunkSize) { + chunks.push(items.slice(i, i + chunkSize)); + } + return chunks; +} + +/** + * Удаление address-list по .id: + * 1) пытаемся батчем через POST .../remove { numbers: "*1,*2" } + * 2) при ошибке откатываемся к поштучному DELETE, чтобы не ломать совместимость. + */ +async function removeAddressListIds(client, ids) { + const normalizedIds = [...new Set( + (Array.isArray(ids) ? ids : []) + .map((id) => String(id || '').trim()) + .filter(Boolean) + )]; + if (normalizedIds.length === 0) return 0; + + let removed = 0; + const chunks = chunkArray(normalizedIds, ADDRESS_LIST_REMOVE_CHUNK_SIZE); + + for (const chunk of chunks) { + try { + await client.command(`${ADDRESS_LIST_PATH}/remove`, { numbers: chunk.join(',') }); + removed += chunk.length; + continue; + } catch (err) { + console.warn( + `[address-lists] batch remove fallback (${chunk.length} ids):`, + err?.message || String(err) + ); + } + + for (const id of chunk) { + try { + await rosRemove(client, ADDRESS_LIST_PATH, id); + removed++; + } catch (err) { + console.warn(`[address-lists] remove ${id}:`, err?.message); + } + } + } + + return removed; +} /** * POST /api/mikrotik/address-lists/apply-summary @@ -1487,7 +1539,9 @@ async function applyAddressListSummary(req, res) { if (!serverId) { return sendError(res, 400, 'serverId is required', 'E_BAD_REQUEST'); } - const ids = Array.isArray(removeIds) ? removeIds.filter((id) => id != null && String(id).trim()) : []; + const ids = Array.isArray(removeIds) + ? [...new Set(removeIds.map((id) => String(id || '').trim()).filter(Boolean))] + : []; const entries = Array.isArray(addEntries) ? addEntries.filter((e) => e && (e.address || e.list)) : []; @@ -1507,15 +1561,7 @@ async function applyAddressListSummary(req, res) { let removed = 0; let added = 0; - for (const id of ids) { - try { - const pathId = String(id).trim(); - await rosRemove(client, ADDRESS_LIST_PATH, pathId); - removed++; - } catch (err) { - console.warn(`[address-lists] remove ${id}:`, err?.message); - } - } + removed = await removeAddressListIds(client, ids); for (const entry of entries) { try {