adonisjs-server-stats 1.5.4 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +351 -171
- package/dist/configure.d.ts.map +1 -1
- package/dist/core/api-client.d.ts +73 -0
- package/dist/core/api-client.d.ts.map +1 -0
- package/dist/core/config-utils.d.ts +109 -0
- package/dist/core/config-utils.d.ts.map +1 -0
- package/dist/core/constants.d.ts +11 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/dashboard-api.d.ts +65 -0
- package/dist/core/dashboard-api.d.ts.map +1 -0
- package/dist/core/dashboard-data-controller.d.ts +157 -0
- package/dist/core/dashboard-data-controller.d.ts.map +1 -0
- package/dist/core/debug-data-controller.d.ts +89 -0
- package/dist/core/debug-data-controller.d.ts.map +1 -0
- package/dist/core/feature-detect.d.ts +67 -0
- package/dist/core/feature-detect.d.ts.map +1 -0
- package/dist/core/formatters.d.ts +189 -0
- package/dist/core/formatters.d.ts.map +1 -0
- package/dist/core/history-buffer.d.ts +23 -0
- package/dist/core/history-buffer.d.ts.map +1 -0
- package/dist/core/icons.d.ts +36 -0
- package/dist/core/icons.d.ts.map +1 -0
- package/dist/core/index.d.ts +39 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +1961 -0
- package/dist/core/internals-utils.d.ts +71 -0
- package/dist/core/internals-utils.d.ts.map +1 -0
- package/dist/core/job-utils.d.ts +45 -0
- package/dist/core/job-utils.d.ts.map +1 -0
- package/dist/core/log-utils.d.ts +34 -0
- package/dist/core/log-utils.d.ts.map +1 -0
- package/dist/core/metrics.d.ts +41 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/pagination.d.ts +128 -0
- package/dist/core/pagination.d.ts.map +1 -0
- package/dist/core/query-utils.d.ts +35 -0
- package/dist/core/query-utils.d.ts.map +1 -0
- package/dist/core/resizable-columns.d.ts +18 -0
- package/dist/core/resizable-columns.d.ts.map +1 -0
- package/dist/core/routes.d.ts +12 -0
- package/dist/core/routes.d.ts.map +1 -0
- package/dist/core/server-stats-controller.d.ts +106 -0
- package/dist/core/server-stats-controller.d.ts.map +1 -0
- package/dist/core/sparkline.d.ts +80 -0
- package/dist/core/sparkline.d.ts.map +1 -0
- package/dist/core/theme.d.ts +42 -0
- package/dist/core/theme.d.ts.map +1 -0
- package/dist/core/trace-utils.d.ts +62 -0
- package/dist/core/trace-utils.d.ts.map +1 -0
- package/dist/core/transmit-adapter.d.ts +59 -0
- package/dist/core/transmit-adapter.d.ts.map +1 -0
- package/dist/core/types.d.ts +619 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/react/CacheSection-DGxMDlWK.js +146 -0
- package/dist/react/CacheTab-CnVW5PLs.js +123 -0
- package/dist/react/ConfigContent-CnsEI4j3.js +397 -0
- package/dist/react/ConfigSection-DPcrfqXY.js +11 -0
- package/dist/react/ConfigTab-BSWq_o2p.js +15 -0
- package/dist/react/CustomPaneTab-xjkYwTvH.js +104 -0
- package/dist/react/DataTable-YyShr5B-.js +55 -0
- package/dist/react/EmailsSection-CSyTg1aX.js +262 -0
- package/dist/react/EmailsTab-Dh2YSa_f.js +131 -0
- package/dist/react/EventsSection-C1pbJDfW.js +86 -0
- package/dist/react/EventsTab-eCh02cdd.js +63 -0
- package/dist/react/FilterBar-DQRXpWrb.js +50 -0
- package/dist/react/InternalsContent-DBzsI0CG.js +346 -0
- package/dist/react/InternalsSection-t7ihcWO-.js +32 -0
- package/dist/react/InternalsTab-Oij0A2fN.js +30 -0
- package/dist/react/JobsSection-CLAin5vU.js +187 -0
- package/dist/react/JobsTab-Dl5nrj2z.js +141 -0
- package/dist/react/LogsSection-C1p81fXO.js +212 -0
- package/dist/react/LogsTab-D-kR7PjX.js +88 -0
- package/dist/react/OverviewSection-nm3xdACz.js +539 -0
- package/dist/react/Pagination-BkmzUDY8.js +64 -0
- package/dist/react/QueriesSection-DB12HMfQ.js +461 -0
- package/dist/react/QueriesTab-fyBB1u_Y.js +90 -0
- package/dist/react/RequestsSection-DTqB81ac.js +209 -0
- package/dist/react/RoutesSection-DJWa4NPV.js +74 -0
- package/dist/react/RoutesTab-D3l8TOpu.js +74 -0
- package/dist/react/TimelineSection-C4d-jRX1.js +158 -0
- package/dist/react/TimelineTab-C5TFaSmQ.js +193 -0
- package/dist/react/WaterfallChart-Cj73WdfM.js +100 -0
- package/dist/react/core/api-client.d.ts +73 -0
- package/dist/react/core/api-client.d.ts.map +1 -0
- package/dist/react/core/config-utils.d.ts +109 -0
- package/dist/react/core/config-utils.d.ts.map +1 -0
- package/dist/react/core/constants.d.ts +11 -0
- package/dist/react/core/constants.d.ts.map +1 -0
- package/dist/react/core/dashboard-api.d.ts +65 -0
- package/dist/react/core/dashboard-api.d.ts.map +1 -0
- package/dist/react/core/dashboard-data-controller.d.ts +157 -0
- package/dist/react/core/dashboard-data-controller.d.ts.map +1 -0
- package/dist/react/core/debug-data-controller.d.ts +89 -0
- package/dist/react/core/debug-data-controller.d.ts.map +1 -0
- package/dist/react/core/feature-detect.d.ts +67 -0
- package/dist/react/core/feature-detect.d.ts.map +1 -0
- package/dist/react/core/formatters.d.ts +189 -0
- package/dist/react/core/formatters.d.ts.map +1 -0
- package/dist/react/core/history-buffer.d.ts +23 -0
- package/dist/react/core/history-buffer.d.ts.map +1 -0
- package/dist/react/core/icons.d.ts +36 -0
- package/dist/react/core/icons.d.ts.map +1 -0
- package/dist/react/core/index.d.ts +39 -0
- package/dist/react/core/index.d.ts.map +1 -0
- package/dist/react/core/internals-utils.d.ts +71 -0
- package/dist/react/core/internals-utils.d.ts.map +1 -0
- package/dist/react/core/job-utils.d.ts +45 -0
- package/dist/react/core/job-utils.d.ts.map +1 -0
- package/dist/react/core/log-utils.d.ts +34 -0
- package/dist/react/core/log-utils.d.ts.map +1 -0
- package/dist/react/core/metrics.d.ts +41 -0
- package/dist/react/core/metrics.d.ts.map +1 -0
- package/dist/react/core/pagination.d.ts +128 -0
- package/dist/react/core/pagination.d.ts.map +1 -0
- package/dist/react/core/query-utils.d.ts +35 -0
- package/dist/react/core/query-utils.d.ts.map +1 -0
- package/dist/react/core/resizable-columns.d.ts +18 -0
- package/dist/react/core/resizable-columns.d.ts.map +1 -0
- package/dist/react/core/routes.d.ts +12 -0
- package/dist/react/core/routes.d.ts.map +1 -0
- package/dist/react/core/server-stats-controller.d.ts +106 -0
- package/dist/react/core/server-stats-controller.d.ts.map +1 -0
- package/dist/react/core/sparkline.d.ts +80 -0
- package/dist/react/core/sparkline.d.ts.map +1 -0
- package/dist/react/core/theme.d.ts +42 -0
- package/dist/react/core/theme.d.ts.map +1 -0
- package/dist/react/core/trace-utils.d.ts +62 -0
- package/dist/react/core/trace-utils.d.ts.map +1 -0
- package/dist/react/core/transmit-adapter.d.ts +59 -0
- package/dist/react/core/transmit-adapter.d.ts.map +1 -0
- package/dist/react/core/types.d.ts +619 -0
- package/dist/react/core/types.d.ts.map +1 -0
- package/dist/react/index-UdTfSvtO.js +1074 -0
- package/dist/react/index.js +18 -0
- package/dist/react/react/components/Dashboard/DashboardPage.d.ts +17 -0
- package/dist/react/react/components/Dashboard/DashboardPage.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/CacheSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/CacheSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/ConfigSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/ConfigSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/EmailsSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/EmailsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/EventsSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/EventsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/InternalsSection.d.ts +14 -0
- package/dist/react/react/components/Dashboard/sections/InternalsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/JobsSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/JobsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/LogsSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/LogsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/OverviewSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/OverviewSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/QueriesSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/QueriesSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/RequestsSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/RequestsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/RoutesSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/RoutesSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/TimelineSection.d.ts +9 -0
- package/dist/react/react/components/Dashboard/sections/TimelineSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/shared/DataTable.d.ts +27 -0
- package/dist/react/react/components/Dashboard/shared/DataTable.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/shared/FilterBar.d.ts +17 -0
- package/dist/react/react/components/Dashboard/shared/FilterBar.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/shared/Pagination.d.ts +13 -0
- package/dist/react/react/components/Dashboard/shared/Pagination.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/shared/TimeRangeSelector.d.ts +12 -0
- package/dist/react/react/components/Dashboard/shared/TimeRangeSelector.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/shared/WaterfallChart.d.ts +16 -0
- package/dist/react/react/components/Dashboard/shared/WaterfallChart.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/DebugPanel.d.ts +16 -0
- package/dist/react/react/components/DebugPanel/DebugPanel.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/CacheTab.d.ts +8 -0
- package/dist/react/react/components/DebugPanel/tabs/CacheTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/ConfigTab.d.ts +8 -0
- package/dist/react/react/components/DebugPanel/tabs/ConfigTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/CustomPaneTab.d.ts +14 -0
- package/dist/react/react/components/DebugPanel/tabs/CustomPaneTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/EmailsTab.d.ts +7 -0
- package/dist/react/react/components/DebugPanel/tabs/EmailsTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/EventsTab.d.ts +7 -0
- package/dist/react/react/components/DebugPanel/tabs/EventsTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/InternalsTab.d.ts +12 -0
- package/dist/react/react/components/DebugPanel/tabs/InternalsTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/JobsTab.d.ts +9 -0
- package/dist/react/react/components/DebugPanel/tabs/JobsTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/LogsTab.d.ts +7 -0
- package/dist/react/react/components/DebugPanel/tabs/LogsTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/QueriesTab.d.ts +7 -0
- package/dist/react/react/components/DebugPanel/tabs/QueriesTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/RoutesTab.d.ts +8 -0
- package/dist/react/react/components/DebugPanel/tabs/RoutesTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/TimelineTab.d.ts +7 -0
- package/dist/react/react/components/DebugPanel/tabs/TimelineTab.d.ts.map +1 -0
- package/dist/react/react/components/StatsBar/MetricCard.d.ts +21 -0
- package/dist/react/react/components/StatsBar/MetricCard.d.ts.map +1 -0
- package/dist/react/react/components/StatsBar/Sparkline.d.ts +15 -0
- package/dist/react/react/components/StatsBar/Sparkline.d.ts.map +1 -0
- package/dist/react/react/components/StatsBar/StatsBar.d.ts +22 -0
- package/dist/react/react/components/StatsBar/StatsBar.d.ts.map +1 -0
- package/dist/react/react/components/shared/Badge.d.ts +32 -0
- package/dist/react/react/components/shared/Badge.d.ts.map +1 -0
- package/dist/react/react/components/shared/ConfigContent.d.ts +13 -0
- package/dist/react/react/components/shared/ConfigContent.d.ts.map +1 -0
- package/dist/react/react/components/shared/InternalsContent.d.ts +10 -0
- package/dist/react/react/components/shared/InternalsContent.d.ts.map +1 -0
- package/dist/react/react/components/shared/JsonViewer.d.ts +12 -0
- package/dist/react/react/components/shared/JsonViewer.d.ts.map +1 -0
- package/dist/react/react/components/shared/ThemeToggle.d.ts +13 -0
- package/dist/react/react/components/shared/ThemeToggle.d.ts.map +1 -0
- package/dist/react/react/components/shared/Tooltip.d.ts +16 -0
- package/dist/react/react/components/shared/Tooltip.d.ts.map +1 -0
- package/dist/react/react/hooks/useApiClient.d.ts +10 -0
- package/dist/react/react/hooks/useApiClient.d.ts.map +1 -0
- package/dist/react/react/hooks/useDashboardApiBase.d.ts +19 -0
- package/dist/react/react/hooks/useDashboardApiBase.d.ts.map +1 -0
- package/dist/react/react/hooks/useDashboardData.d.ts +27 -0
- package/dist/react/react/hooks/useDashboardData.d.ts.map +1 -0
- package/dist/react/react/hooks/useDebugData.d.ts +17 -0
- package/dist/react/react/hooks/useDebugData.d.ts.map +1 -0
- package/dist/react/react/hooks/useFeatures.d.ts +13 -0
- package/dist/react/react/hooks/useFeatures.d.ts.map +1 -0
- package/dist/react/react/hooks/useResizableTable.d.ts +13 -0
- package/dist/react/react/hooks/useResizableTable.d.ts.map +1 -0
- package/dist/react/react/hooks/useServerStats.d.ts +21 -0
- package/dist/react/react/hooks/useServerStats.d.ts.map +1 -0
- package/dist/react/react/hooks/useTheme.d.ts +12 -0
- package/dist/react/react/hooks/useTheme.d.ts.map +1 -0
- package/dist/react/react/index.d.ts +14 -0
- package/dist/react/react/index.d.ts.map +1 -0
- package/dist/react/style.css +1 -0
- package/dist/react/useApiClient-BVtNCmnL.js +9 -0
- package/dist/react/useDashboardApiBase-Bi36pJ2L.js +14 -0
- package/dist/react/useResizableTable-CNJmACdt.js +13 -0
- package/dist/src/collectors/app_collector.d.ts.map +1 -1
- package/dist/src/collectors/app_collector.js +30 -2
- package/dist/src/collectors/auto_detect.d.ts +31 -0
- package/dist/src/collectors/auto_detect.d.ts.map +1 -0
- package/dist/src/collectors/auto_detect.js +120 -0
- package/dist/src/collectors/collector.d.ts +17 -0
- package/dist/src/collectors/collector.d.ts.map +1 -1
- package/dist/src/collectors/db_pool_collector.d.ts.map +1 -1
- package/dist/src/collectors/db_pool_collector.js +35 -1
- package/dist/src/collectors/http_collector.d.ts +4 -3
- package/dist/src/collectors/http_collector.d.ts.map +1 -1
- package/dist/src/collectors/http_collector.js +28 -11
- package/dist/src/collectors/index.d.ts +2 -0
- package/dist/src/collectors/index.d.ts.map +1 -1
- package/dist/src/collectors/index.js +1 -0
- package/dist/src/collectors/log_collector.d.ts +11 -4
- package/dist/src/collectors/log_collector.d.ts.map +1 -1
- package/dist/src/collectors/log_collector.js +51 -5
- package/dist/src/collectors/process_collector.d.ts.map +1 -1
- package/dist/src/collectors/process_collector.js +4 -0
- package/dist/src/collectors/queue_collector.d.ts.map +1 -1
- package/dist/src/collectors/queue_collector.js +55 -1
- package/dist/src/collectors/redis_collector.d.ts.map +1 -1
- package/dist/src/collectors/redis_collector.js +42 -3
- package/dist/src/collectors/system_collector.d.ts.map +1 -1
- package/dist/src/collectors/system_collector.js +4 -0
- package/dist/src/controller/api_controller.d.ts +101 -0
- package/dist/src/controller/api_controller.d.ts.map +1 -0
- package/dist/src/controller/api_controller.js +131 -0
- package/dist/src/controller/debug_controller.d.ts +19 -10
- package/dist/src/controller/debug_controller.d.ts.map +1 -1
- package/dist/src/controller/debug_controller.js +118 -101
- package/dist/src/core/theme.d.ts +42 -0
- package/dist/src/core/theme.d.ts.map +1 -0
- package/dist/src/core/theme.js +115 -0
- package/dist/src/dashboard/chart_aggregator.d.ts.map +1 -1
- package/dist/src/dashboard/chart_aggregator.js +3 -2
- package/dist/src/dashboard/dashboard_controller.d.ts +10 -14
- package/dist/src/dashboard/dashboard_controller.d.ts.map +1 -1
- package/dist/src/dashboard/dashboard_controller.js +132 -250
- package/dist/src/dashboard/dashboard_store.d.ts +62 -19
- package/dist/src/dashboard/dashboard_store.d.ts.map +1 -1
- package/dist/src/dashboard/dashboard_store.js +242 -53
- package/dist/src/dashboard/integrations/cache_inspector.d.ts +19 -1
- package/dist/src/dashboard/integrations/cache_inspector.d.ts.map +1 -1
- package/dist/src/dashboard/integrations/config_inspector.d.ts +1 -1
- package/dist/src/dashboard/integrations/config_inspector.d.ts.map +1 -1
- package/dist/src/dashboard/integrations/config_inspector.js +3 -2
- package/dist/src/dashboard/integrations/queue_inspector.d.ts +55 -10
- package/dist/src/dashboard/integrations/queue_inspector.d.ts.map +1 -1
- package/dist/src/dashboard/integrations/queue_inspector.js +70 -24
- package/dist/src/dashboard/migrator.d.ts +5 -0
- package/dist/src/dashboard/migrator.d.ts.map +1 -1
- package/dist/src/dashboard/migrator.js +44 -9
- package/dist/src/dashboard/models/stats_event.d.ts +1 -1
- package/dist/src/dashboard/models/stats_event.d.ts.map +1 -1
- package/dist/src/dashboard/models/stats_log.d.ts +1 -1
- package/dist/src/dashboard/models/stats_log.d.ts.map +1 -1
- package/dist/src/dashboard/models/stats_query.d.ts +1 -1
- package/dist/src/dashboard/models/stats_query.d.ts.map +1 -1
- package/dist/src/dashboard/models/stats_saved_filter.d.ts +1 -1
- package/dist/src/dashboard/models/stats_saved_filter.d.ts.map +1 -1
- package/dist/src/dashboard/models/stats_trace.d.ts +2 -1
- package/dist/src/dashboard/models/stats_trace.d.ts.map +1 -1
- package/dist/src/data/data_access.d.ts +105 -0
- package/dist/src/data/data_access.d.ts.map +1 -0
- package/dist/src/data/data_access.js +310 -0
- package/dist/src/data/index.d.ts +3 -0
- package/dist/src/data/index.d.ts.map +1 -0
- package/dist/src/data/index.js +1 -0
- package/dist/src/debug/debug_store.d.ts +20 -1
- package/dist/src/debug/debug_store.d.ts.map +1 -1
- package/dist/src/debug/debug_store.js +43 -15
- package/dist/src/debug/email_collector.d.ts +6 -2
- package/dist/src/debug/email_collector.d.ts.map +1 -1
- package/dist/src/debug/email_collector.js +3 -0
- package/dist/src/debug/event_collector.d.ts +6 -2
- package/dist/src/debug/event_collector.d.ts.map +1 -1
- package/dist/src/debug/event_collector.js +12 -8
- package/dist/src/debug/query_collector.d.ts +6 -2
- package/dist/src/debug/query_collector.d.ts.map +1 -1
- package/dist/src/debug/query_collector.js +3 -0
- package/dist/src/debug/ring_buffer.d.ts +1 -0
- package/dist/src/debug/ring_buffer.d.ts.map +1 -1
- package/dist/src/debug/ring_buffer.js +5 -2
- package/dist/src/debug/route_inspector.d.ts +2 -2
- package/dist/src/debug/route_inspector.d.ts.map +1 -1
- package/dist/src/debug/route_inspector.js +4 -3
- package/dist/src/debug/trace_collector.d.ts +7 -3
- package/dist/src/debug/trace_collector.d.ts.map +1 -1
- package/dist/src/debug/trace_collector.js +7 -5
- package/dist/src/debug/types.d.ts +107 -2
- package/dist/src/debug/types.d.ts.map +1 -1
- package/dist/src/debug/types.js +1 -1
- package/dist/src/define_config.d.ts +49 -5
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js +361 -4
- package/dist/src/edge/bootstrap.d.ts +17 -0
- package/dist/src/edge/bootstrap.d.ts.map +1 -0
- package/dist/src/edge/bootstrap.js +29 -0
- package/dist/src/edge/client/dashboard.js +2 -3619
- package/dist/src/edge/client/debug-panel-deferred.js +1 -0
- package/dist/src/edge/client/debug-panel.js +1 -2140
- package/dist/src/edge/client/stats-bar.js +1 -801
- package/dist/src/edge/client-vue/dashboard.js +5 -0
- package/dist/src/edge/client-vue/debug-panel-deferred.js +4 -0
- package/dist/src/edge/client-vue/debug-panel.js +4 -0
- package/dist/src/edge/client-vue/stats-bar.js +4 -0
- package/dist/src/edge/plugin.d.ts +35 -2
- package/dist/src/edge/plugin.d.ts.map +1 -1
- package/dist/src/edge/plugin.js +30 -66
- package/dist/src/edge/types.d.ts +46 -0
- package/dist/src/edge/types.d.ts.map +1 -0
- package/dist/src/edge/types.js +4 -0
- package/dist/src/edge/views/dashboard.edge +1 -358
- package/dist/src/edge/views/debug-panel.edge +2 -154
- package/dist/src/edge/views/stats-bar.edge +15 -48
- package/dist/src/engine/stats_engine.d.ts +18 -0
- package/dist/src/engine/stats_engine.d.ts.map +1 -1
- package/dist/src/engine/stats_engine.js +45 -2
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/log_stream/log_stream_provider.d.ts.map +1 -1
- package/dist/src/log_stream/log_stream_provider.js +21 -4
- package/dist/src/log_stream/log_stream_service.d.ts +8 -1
- package/dist/src/log_stream/log_stream_service.d.ts.map +1 -1
- package/dist/src/log_stream/log_stream_service.js +27 -3
- package/dist/src/middleware/request_tracking_middleware.d.ts +1 -1
- package/dist/src/middleware/request_tracking_middleware.d.ts.map +1 -1
- package/dist/src/middleware/request_tracking_middleware.js +21 -6
- package/dist/src/prometheus/prometheus_collector.d.ts +2 -1
- package/dist/src/prometheus/prometheus_collector.d.ts.map +1 -1
- package/dist/src/provider/server_stats_provider.d.ts +100 -0
- package/dist/src/provider/server_stats_provider.d.ts.map +1 -1
- package/dist/src/provider/server_stats_provider.js +460 -104
- package/dist/src/routes/access_middleware.d.ts +2 -1
- package/dist/src/routes/access_middleware.d.ts.map +1 -1
- package/dist/src/routes/access_middleware.js +7 -1
- package/dist/src/routes/index.d.ts +4 -0
- package/dist/src/routes/index.d.ts.map +1 -0
- package/dist/src/routes/index.js +1 -0
- package/dist/src/routes/register_routes.d.ts +103 -0
- package/dist/src/routes/register_routes.d.ts.map +1 -0
- package/dist/src/routes/register_routes.js +356 -0
- package/dist/src/routes/router_types.d.ts +29 -0
- package/dist/src/routes/router_types.d.ts.map +1 -0
- package/dist/src/routes/router_types.js +1 -0
- package/dist/src/stubs/config.stub +12 -32
- package/dist/src/styles/components.css +1048 -0
- package/dist/src/{edge/client → styles}/dashboard.css +299 -736
- package/dist/src/{edge/client → styles}/debug-panel.css +117 -633
- package/dist/src/{edge/client → styles}/stats-bar.css +28 -10
- package/dist/src/styles/tokens.css +153 -0
- package/dist/src/styles/utilities.css +75 -0
- package/dist/src/types.d.ts +119 -16
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/app_import.d.ts +23 -0
- package/dist/src/utils/app_import.d.ts.map +1 -0
- package/dist/src/utils/app_import.js +44 -0
- package/dist/src/utils/json_helpers.d.ts +2 -2
- package/dist/src/utils/json_helpers.d.ts.map +1 -1
- package/dist/src/utils/logger.d.ts +17 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +27 -0
- package/dist/src/utils/mail_helpers.d.ts +1 -1
- package/dist/src/utils/mail_helpers.d.ts.map +1 -1
- package/dist/src/utils/mail_helpers.js +1 -1
- package/dist/vue/CacheSection-C788Yfai.js +149 -0
- package/dist/vue/CacheTab-BPisYYiQ.js +104 -0
- package/dist/vue/ConfigSection-CRzYxqW2.js +576 -0
- package/dist/vue/ConfigTab-C8cafGUj.js +361 -0
- package/dist/vue/CustomPaneTab-BJxT5Dp7.js +172 -0
- package/dist/vue/EmailsSection-C8JFMtW7.js +206 -0
- package/dist/vue/EmailsTab-DhFhoNmU.js +157 -0
- package/dist/vue/EventsSection-C4wXUgxG.js +107 -0
- package/dist/vue/EventsTab-DQ4Nd6AK.js +97 -0
- package/dist/vue/FilterBar.vue_vue_type_script_setup_true_lang-ClJ37hhT.js +62 -0
- package/dist/vue/InternalsSection-BJUXE-5F.js +468 -0
- package/dist/vue/InternalsTab-DEMjqtlw.js +471 -0
- package/dist/vue/JobsSection-CsKWTjgN.js +187 -0
- package/dist/vue/JobsTab-BCvhOARO.js +117 -0
- package/dist/vue/JsonViewer.vue_vue_type_script_setup_true_lang-Vsqar1zx.js +67 -0
- package/dist/vue/LogsSection-BFVjSZ24.js +227 -0
- package/dist/vue/LogsTab-DpEQ7euu.js +122 -0
- package/dist/vue/OverviewSection-CbMdAido.js +849 -0
- package/dist/vue/PaginationControls.vue_vue_type_script_setup_true_lang-CuN7g_8Z.js +50 -0
- package/dist/vue/QueriesSection-BPiv7u3r.js +429 -0
- package/dist/vue/QueriesTab-C8_7oprC.js +107 -0
- package/dist/vue/RequestsSection-LtImH4rD.js +243 -0
- package/dist/vue/RoutesSection-CrxOxmzx.js +106 -0
- package/dist/vue/RoutesTab-Dz0MkZuF.js +80 -0
- package/dist/vue/TimelineSection-DLxMW2J_.js +186 -0
- package/dist/vue/TimelineTab-Db6lKKsD.js +250 -0
- package/dist/vue/WaterfallChart.vue_vue_type_script_setup_true_lang-tZ13cNj1.js +118 -0
- package/dist/vue/components/Dashboard/DashboardPage.vue.d.ts +18 -0
- package/dist/vue/components/Dashboard/DashboardPage.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/CacheSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/CacheSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/ConfigSection.vue.d.ts +3 -0
- package/dist/vue/components/Dashboard/sections/ConfigSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/EmailsSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/EmailsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/EventsSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/EventsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/InternalsSection.vue.d.ts +3 -0
- package/dist/vue/components/Dashboard/sections/InternalsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/JobsSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/JobsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/LogsSection.vue.d.ts +3 -0
- package/dist/vue/components/Dashboard/sections/LogsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/OverviewSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/OverviewSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/QueriesSection.vue.d.ts +45 -0
- package/dist/vue/components/Dashboard/sections/QueriesSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/RequestsSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/RequestsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/RoutesSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/RoutesSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/TimelineSection.vue.d.ts +11 -0
- package/dist/vue/components/Dashboard/sections/TimelineSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/shared/FilterBar.vue.d.ts +29 -0
- package/dist/vue/components/Dashboard/shared/FilterBar.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/shared/PaginationControls.vue.d.ts +12 -0
- package/dist/vue/components/Dashboard/shared/PaginationControls.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/shared/TimeRangeSelector.vue.d.ts +11 -0
- package/dist/vue/components/Dashboard/shared/TimeRangeSelector.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/shared/WaterfallChart.vue.d.ts +10 -0
- package/dist/vue/components/Dashboard/shared/WaterfallChart.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/DebugPanel.vue.d.ts +21 -0
- package/dist/vue/components/DebugPanel/DebugPanel.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/CacheTab.vue.d.ts +12 -0
- package/dist/vue/components/DebugPanel/tabs/CacheTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/ConfigTab.vue.d.ts +11 -0
- package/dist/vue/components/DebugPanel/tabs/ConfigTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/CustomPaneTab.vue.d.ts +11 -0
- package/dist/vue/components/DebugPanel/tabs/CustomPaneTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/EmailsTab.vue.d.ts +12 -0
- package/dist/vue/components/DebugPanel/tabs/EmailsTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/EventsTab.vue.d.ts +12 -0
- package/dist/vue/components/DebugPanel/tabs/EventsTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/InternalsTab.vue.d.ts +11 -0
- package/dist/vue/components/DebugPanel/tabs/InternalsTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/JobsTab.vue.d.ts +13 -0
- package/dist/vue/components/DebugPanel/tabs/JobsTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/LogsTab.vue.d.ts +15 -0
- package/dist/vue/components/DebugPanel/tabs/LogsTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/QueriesTab.vue.d.ts +12 -0
- package/dist/vue/components/DebugPanel/tabs/QueriesTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/RoutesTab.vue.d.ts +12 -0
- package/dist/vue/components/DebugPanel/tabs/RoutesTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/TimelineTab.vue.d.ts +15 -0
- package/dist/vue/components/DebugPanel/tabs/TimelineTab.vue.d.ts.map +1 -0
- package/dist/vue/components/StatsBar/MetricCard.vue.d.ts +19 -0
- package/dist/vue/components/StatsBar/MetricCard.vue.d.ts.map +1 -0
- package/dist/vue/components/StatsBar/Sparkline.vue.d.ts +17 -0
- package/dist/vue/components/StatsBar/Sparkline.vue.d.ts.map +1 -0
- package/dist/vue/components/StatsBar/StatsBar.vue.d.ts +22 -0
- package/dist/vue/components/StatsBar/StatsBar.vue.d.ts.map +1 -0
- package/dist/vue/components/shared/JsonViewer.vue.d.ts +13 -0
- package/dist/vue/components/shared/JsonViewer.vue.d.ts.map +1 -0
- package/dist/vue/components/shared/ThemeToggle.vue.d.ts +8 -0
- package/dist/vue/components/shared/ThemeToggle.vue.d.ts.map +1 -0
- package/dist/vue/composables/useApiClient.d.ts +9 -0
- package/dist/vue/composables/useApiClient.d.ts.map +1 -0
- package/dist/vue/composables/useDashboardData.d.ts +53 -0
- package/dist/vue/composables/useDashboardData.d.ts.map +1 -0
- package/dist/vue/composables/useDebugData.d.ts +25 -0
- package/dist/vue/composables/useDebugData.d.ts.map +1 -0
- package/dist/vue/composables/useFeatures.d.ts +80 -0
- package/dist/vue/composables/useFeatures.d.ts.map +1 -0
- package/dist/vue/composables/useResizableTable.d.ts +16 -0
- package/dist/vue/composables/useResizableTable.d.ts.map +1 -0
- package/dist/vue/composables/useServerStats.d.ts +104 -0
- package/dist/vue/composables/useServerStats.d.ts.map +1 -0
- package/dist/vue/composables/useTheme.d.ts +6 -0
- package/dist/vue/composables/useTheme.d.ts.map +1 -0
- package/dist/vue/index-qCQpBftQ.js +1233 -0
- package/dist/vue/index.d.ts +10 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +11 -0
- package/dist/vue/style.css +1 -0
- package/dist/vue/useApiClient-BQQ9CF-q.js +10 -0
- package/dist/vue/useResizableTable-BoivAevK.js +17 -0
- package/package.json +72 -10
- package/dist/src/dashboard/dashboard_routes.d.ts +0 -16
- package/dist/src/dashboard/dashboard_routes.d.ts.map +0 -1
- package/dist/src/dashboard/dashboard_routes.js +0 -77
- package/dist/src/routes/debug_routes.d.ts +0 -14
- package/dist/src/routes/debug_routes.d.ts.map +0 -1
- package/dist/src/routes/debug_routes.js +0 -42
- package/dist/src/routes/stats_routes.d.ts +0 -14
- package/dist/src/routes/stats_routes.d.ts.map +0 -1
- package/dist/src/routes/stats_routes.js +0 -27
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { appImport } from '../utils/app_import.js';
|
|
2
|
+
import { log, dim, green, bold } from '../utils/logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Probe whether a package is importable at runtime.
|
|
5
|
+
*
|
|
6
|
+
* Uses {@link appImport} which resolves from `process.cwd()` first,
|
|
7
|
+
* handling the common case where adonisjs-server-stats is symlinked
|
|
8
|
+
* (e.g. `file:../../adonisjs-server-stats` in package.json). Without
|
|
9
|
+
* this, `import(pkg)` resolves from the symlink *target* directory,
|
|
10
|
+
* which may have devDependency stubs instead of the real packages.
|
|
11
|
+
*/
|
|
12
|
+
async function isInstalled(pkg) {
|
|
13
|
+
try {
|
|
14
|
+
await appImport(pkg);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Auto-detect which metric collectors to enable based on installed packages.
|
|
23
|
+
*
|
|
24
|
+
* Always enables collectors with no external dependencies:
|
|
25
|
+
* - `processCollector` -- Node.js process metrics
|
|
26
|
+
* - `systemCollector` -- OS-level system metrics
|
|
27
|
+
* - `httpCollector` -- HTTP request metrics
|
|
28
|
+
* - `logCollector` -- log stream metrics
|
|
29
|
+
*
|
|
30
|
+
* Conditionally enables collectors when their peer dependency is importable:
|
|
31
|
+
* - `dbPoolCollector` + `appCollector` -- when `@adonisjs/lucid` is installed
|
|
32
|
+
* - `redisCollector` -- when `@adonisjs/redis` is installed
|
|
33
|
+
* - `queueCollector` -- when `bullmq` is installed
|
|
34
|
+
*
|
|
35
|
+
* This function is meant to run at startup, so the async overhead of
|
|
36
|
+
* probing packages is acceptable.
|
|
37
|
+
*
|
|
38
|
+
* @returns Resolved collectors and detection metadata for the boot summary.
|
|
39
|
+
*/
|
|
40
|
+
export async function autoDetectCollectors() {
|
|
41
|
+
const collectors = [];
|
|
42
|
+
const entries = [];
|
|
43
|
+
// ── Always-on collectors (no external deps) ──────────────────────
|
|
44
|
+
const { processCollector } = await import('./process_collector.js');
|
|
45
|
+
const { systemCollector } = await import('./system_collector.js');
|
|
46
|
+
const { httpCollector } = await import('./http_collector.js');
|
|
47
|
+
const { logCollector } = await import('./log_collector.js');
|
|
48
|
+
collectors.push(processCollector());
|
|
49
|
+
entries.push({ name: 'process', description: 'CPU, memory, event loop', enabled: true });
|
|
50
|
+
collectors.push(systemCollector());
|
|
51
|
+
entries.push({ name: 'system', description: 'OS load, memory, uptime', enabled: true });
|
|
52
|
+
collectors.push(httpCollector());
|
|
53
|
+
entries.push({ name: 'http', description: 'req/s, latency, errors', enabled: true });
|
|
54
|
+
collectors.push(logCollector());
|
|
55
|
+
entries.push({ name: 'log', description: 'error & warning counts', enabled: true });
|
|
56
|
+
// ── Conditional: @adonisjs/lucid ─────────────────────────────────
|
|
57
|
+
const hasLucid = await isInstalled('@adonisjs/lucid');
|
|
58
|
+
if (hasLucid) {
|
|
59
|
+
const { dbPoolCollector } = await import('./db_pool_collector.js');
|
|
60
|
+
const { appCollector } = await import('./app_collector.js');
|
|
61
|
+
collectors.push(dbPoolCollector());
|
|
62
|
+
collectors.push(appCollector());
|
|
63
|
+
}
|
|
64
|
+
entries.push({
|
|
65
|
+
name: 'db-pool',
|
|
66
|
+
description: 'connection pool stats',
|
|
67
|
+
enabled: hasLucid,
|
|
68
|
+
reason: hasLucid ? 'found @adonisjs/lucid' : 'install @adonisjs/lucid to enable',
|
|
69
|
+
});
|
|
70
|
+
entries.push({
|
|
71
|
+
name: 'app',
|
|
72
|
+
description: 'app-level DB metrics',
|
|
73
|
+
enabled: hasLucid,
|
|
74
|
+
reason: hasLucid ? 'found @adonisjs/lucid' : 'install @adonisjs/lucid to enable',
|
|
75
|
+
});
|
|
76
|
+
// ── Conditional: @adonisjs/redis ─────────────────────────────────
|
|
77
|
+
const hasRedis = await isInstalled('@adonisjs/redis');
|
|
78
|
+
if (hasRedis) {
|
|
79
|
+
const { redisCollector } = await import('./redis_collector.js');
|
|
80
|
+
collectors.push(redisCollector());
|
|
81
|
+
}
|
|
82
|
+
entries.push({
|
|
83
|
+
name: 'redis',
|
|
84
|
+
description: 'connections, commands, memory',
|
|
85
|
+
enabled: hasRedis,
|
|
86
|
+
reason: hasRedis ? 'found @adonisjs/redis' : 'install @adonisjs/redis to enable',
|
|
87
|
+
});
|
|
88
|
+
// ── Conditional: bullmq ──────────────────────────────────────────
|
|
89
|
+
const hasBullMQ = await isInstalled('bullmq');
|
|
90
|
+
if (hasBullMQ) {
|
|
91
|
+
const { queueCollector } = await import('./queue_collector.js');
|
|
92
|
+
collectors.push(queueCollector({
|
|
93
|
+
queueName: 'default',
|
|
94
|
+
connection: { host: '127.0.0.1', port: 6379 },
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
entries.push({
|
|
98
|
+
name: 'queue',
|
|
99
|
+
description: 'jobs, wait time, throughput',
|
|
100
|
+
enabled: hasBullMQ,
|
|
101
|
+
reason: hasBullMQ ? 'found bullmq' : 'install bullmq to enable',
|
|
102
|
+
});
|
|
103
|
+
// ── Rich boot log ────────────────────────────────────────────────
|
|
104
|
+
const total = entries.length;
|
|
105
|
+
const active = entries.filter((e) => e.enabled).length;
|
|
106
|
+
const maxNameLen = Math.max(...entries.map((e) => e.name.length));
|
|
107
|
+
const lines = entries.map((entry) => {
|
|
108
|
+
const paddedName = entry.name.padEnd(maxNameLen);
|
|
109
|
+
if (entry.enabled) {
|
|
110
|
+
const mark = green('✔');
|
|
111
|
+
const detail = entry.reason ? dim('— ' + entry.reason) : dim('— ' + entry.description);
|
|
112
|
+
return ` ${mark} ${bold(paddedName)} ${detail}`;
|
|
113
|
+
}
|
|
114
|
+
const mark = dim('✗');
|
|
115
|
+
const detail = dim('— ' + (entry.reason ?? entry.description));
|
|
116
|
+
return ` ${mark} ${dim(paddedName)} ${detail}`;
|
|
117
|
+
});
|
|
118
|
+
log.block('collectors (auto-detected):', lines);
|
|
119
|
+
return { collectors, total, active };
|
|
120
|
+
}
|
|
@@ -35,6 +35,15 @@ export interface MetricCollector {
|
|
|
35
35
|
* like `'process'`, `'http'`, `'redis'`, etc.
|
|
36
36
|
*/
|
|
37
37
|
name: string;
|
|
38
|
+
/**
|
|
39
|
+
* Short description shown in the startup log.
|
|
40
|
+
*
|
|
41
|
+
* Include key options so the developer can verify the collector
|
|
42
|
+
* is configured correctly at a glance.
|
|
43
|
+
*
|
|
44
|
+
* @example `'http — buffer: 10k, window: 60s'`
|
|
45
|
+
*/
|
|
46
|
+
label?: string;
|
|
38
47
|
/**
|
|
39
48
|
* Called once when the {@link StatsEngine} starts.
|
|
40
49
|
*
|
|
@@ -48,6 +57,14 @@ export interface MetricCollector {
|
|
|
48
57
|
* Use this to clean up resources (e.g. close connections, clear timers).
|
|
49
58
|
*/
|
|
50
59
|
stop?(): void | Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Return collector-specific configuration for diagnostics.
|
|
62
|
+
*
|
|
63
|
+
* Used by the Internals diagnostics endpoint to show resolved
|
|
64
|
+
* configuration for each collector. Sensitive values (e.g. passwords)
|
|
65
|
+
* should be redacted.
|
|
66
|
+
*/
|
|
67
|
+
getConfig?(): Record<string, unknown>;
|
|
51
68
|
/**
|
|
52
69
|
* Collect metrics and return them as a flat key-value record.
|
|
53
70
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;;;;OAKG;IACH,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE9B;;;;OAIG;IACH,IAAI,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7B;;;;;;;;;;;;;OAaG;IACH,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;CAC9E"}
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;;;OAKG;IACH,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE9B;;;;OAIG;IACH,IAAI,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7B;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAErC;;;;;;;;;;;;;OAaG;IACH,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;CAC9E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db_pool_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/db_pool_collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db_pool_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/db_pool_collector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAUrD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,sBAAsB,GAAG,eAAe,CA8D9E"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { appImport } from '../utils/app_import.js';
|
|
2
|
+
import { log, dim, bold } from '../utils/logger.js';
|
|
1
3
|
/**
|
|
2
4
|
* Monitors the Knex connection pool for a Lucid database connection.
|
|
3
5
|
*
|
|
@@ -21,17 +23,41 @@
|
|
|
21
23
|
*/
|
|
22
24
|
export function dbPoolCollector(opts) {
|
|
23
25
|
const connectionName = opts?.connectionName ?? 'postgres';
|
|
26
|
+
let warnedLucidMissing = false;
|
|
27
|
+
let warnedConnectionNotFound = false;
|
|
28
|
+
let warnedPoolUnavailable = false;
|
|
24
29
|
return {
|
|
25
30
|
name: 'db_pool',
|
|
31
|
+
label: `db_pool — connection: ${connectionName}`,
|
|
32
|
+
getConfig() {
|
|
33
|
+
return { connectionName };
|
|
34
|
+
},
|
|
26
35
|
async collect() {
|
|
27
36
|
try {
|
|
28
|
-
const { default: db } = await
|
|
37
|
+
const { default: db } = await appImport('@adonisjs/lucid/services/db');
|
|
29
38
|
const connection = db.manager.get(connectionName);
|
|
30
39
|
if (!connection) {
|
|
40
|
+
if (!warnedConnectionNotFound) {
|
|
41
|
+
warnedConnectionNotFound = true;
|
|
42
|
+
log.block(`db_pool: connection ${bold(connectionName)} not found in db.manager`, [
|
|
43
|
+
dim('The name must match a key in your') +
|
|
44
|
+
` ${bold('config/database.ts')} ` +
|
|
45
|
+
dim('connections object.'),
|
|
46
|
+
dim('Available connections are registered at app boot — double-check spelling.'),
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
31
49
|
return { dbPoolUsed: 0, dbPoolFree: 0, dbPoolPending: 0, dbPoolMax: 0 };
|
|
32
50
|
}
|
|
33
51
|
const pool = connection.connection?.pool;
|
|
34
52
|
if (!pool) {
|
|
53
|
+
if (!warnedPoolUnavailable) {
|
|
54
|
+
warnedPoolUnavailable = true;
|
|
55
|
+
log.block(`db_pool: pool not available on connection ${bold(connectionName)}`, [
|
|
56
|
+
dim('This usually means the connection has not been established yet,'),
|
|
57
|
+
dim('or the database driver does not expose a Knex-style pool.'),
|
|
58
|
+
dim('Pool metrics will report zeros until the pool is available.'),
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
35
61
|
return { dbPoolUsed: 0, dbPoolFree: 0, dbPoolPending: 0, dbPoolMax: 0 };
|
|
36
62
|
}
|
|
37
63
|
return {
|
|
@@ -42,6 +68,14 @@ export function dbPoolCollector(opts) {
|
|
|
42
68
|
};
|
|
43
69
|
}
|
|
44
70
|
catch {
|
|
71
|
+
if (!warnedLucidMissing) {
|
|
72
|
+
warnedLucidMissing = true;
|
|
73
|
+
log.block(`db_pool: ${bold('@adonisjs/lucid')} is not installed or failed to import`, [
|
|
74
|
+
dim('Install it with:'),
|
|
75
|
+
` ${bold('node ace add @adonisjs/lucid')}`,
|
|
76
|
+
dim('Pool metrics will report zeros until the package is available.'),
|
|
77
|
+
]);
|
|
78
|
+
}
|
|
45
79
|
return { dbPoolUsed: 0, dbPoolFree: 0, dbPoolPending: 0, dbPoolMax: 0 };
|
|
46
80
|
}
|
|
47
81
|
},
|
|
@@ -27,12 +27,13 @@ export interface HttpCollectorOptions {
|
|
|
27
27
|
* Returns the shared {@link RequestMetrics} instance created by
|
|
28
28
|
* `httpCollector()`.
|
|
29
29
|
*
|
|
30
|
+
* Returns `null` if `httpCollector()` has not been called yet
|
|
31
|
+
* (e.g. during the startup window before collectors initialize).
|
|
32
|
+
*
|
|
30
33
|
* Useful for accessing request metrics outside of the collector
|
|
31
34
|
* (e.g. in custom middleware or controllers).
|
|
32
|
-
*
|
|
33
|
-
* @throws If `httpCollector()` has not been included in the config.
|
|
34
35
|
*/
|
|
35
|
-
export declare function getRequestMetrics(): RequestMetrics;
|
|
36
|
+
export declare function getRequestMetrics(): RequestMetrics | null;
|
|
36
37
|
/**
|
|
37
38
|
* Tracks HTTP request throughput, response times, and error rates.
|
|
38
39
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/http_collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"http_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/http_collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAG7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAID;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAEzD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG,eAAe,CAmC1E"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import { RequestMetrics } from '../engine/request_metrics.js';
|
|
2
|
+
import { log } from '../utils/logger.js';
|
|
2
3
|
let sharedInstance = null;
|
|
3
4
|
/**
|
|
4
5
|
* Returns the shared {@link RequestMetrics} instance created by
|
|
5
6
|
* `httpCollector()`.
|
|
6
7
|
*
|
|
8
|
+
* Returns `null` if `httpCollector()` has not been called yet
|
|
9
|
+
* (e.g. during the startup window before collectors initialize).
|
|
10
|
+
*
|
|
7
11
|
* Useful for accessing request metrics outside of the collector
|
|
8
12
|
* (e.g. in custom middleware or controllers).
|
|
9
|
-
*
|
|
10
|
-
* @throws If `httpCollector()` has not been included in the config.
|
|
11
13
|
*/
|
|
12
14
|
export function getRequestMetrics() {
|
|
13
|
-
if (!sharedInstance) {
|
|
14
|
-
throw new Error('RequestMetrics not initialized. Ensure httpCollector() is included in your collectors config.');
|
|
15
|
-
}
|
|
16
15
|
return sharedInstance;
|
|
17
16
|
}
|
|
18
17
|
/**
|
|
@@ -43,14 +42,32 @@ export function httpCollector(opts) {
|
|
|
43
42
|
sharedInstance = metrics;
|
|
44
43
|
return {
|
|
45
44
|
name: 'http',
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
label: `http — buffer: ${(opts?.maxRecords ?? 10_000).toLocaleString()}, window: ${(opts?.windowMs ?? 60_000) / 1000}s`,
|
|
46
|
+
getConfig() {
|
|
48
47
|
return {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
errorRate: m.errorRate,
|
|
52
|
-
activeHttpConnections: m.activeConnections,
|
|
48
|
+
maxRecords: opts?.maxRecords ?? 10_000,
|
|
49
|
+
windowMs: opts?.windowMs ?? 60_000,
|
|
53
50
|
};
|
|
54
51
|
},
|
|
52
|
+
collect() {
|
|
53
|
+
try {
|
|
54
|
+
const m = metrics.getMetrics();
|
|
55
|
+
return {
|
|
56
|
+
requestsPerSecond: m.requestsPerSecond,
|
|
57
|
+
avgResponseTimeMs: m.averageResponseTimeMs,
|
|
58
|
+
errorRate: m.errorRate,
|
|
59
|
+
activeHttpConnections: m.activeConnections,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
log.warn(`http collector failed: ${error.message}`);
|
|
64
|
+
return {
|
|
65
|
+
requestsPerSecond: 0,
|
|
66
|
+
avgResponseTimeMs: 0,
|
|
67
|
+
errorRate: 0,
|
|
68
|
+
activeHttpConnections: 0,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
},
|
|
55
72
|
};
|
|
56
73
|
}
|
|
@@ -11,4 +11,6 @@ export type { QueueCollectorOptions, QueueRedisConnection } from './queue_collec
|
|
|
11
11
|
export { logCollector, getLogStreamService } from './log_collector.js';
|
|
12
12
|
export type { LogCollectorOptions } from './log_collector.js';
|
|
13
13
|
export { appCollector } from './app_collector.js';
|
|
14
|
+
export { autoDetectCollectors } from './auto_detect.js';
|
|
15
|
+
export type { AutoDetectResult } from './auto_detect.js';
|
|
14
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collectors/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AACvF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collectors/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AACvF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -6,3 +6,4 @@ export { redisCollector } from './redis_collector.js';
|
|
|
6
6
|
export { queueCollector } from './queue_collector.js';
|
|
7
7
|
export { logCollector, getLogStreamService } from './log_collector.js';
|
|
8
8
|
export { appCollector } from './app_collector.js';
|
|
9
|
+
export { autoDetectCollectors } from './auto_detect.js';
|
|
@@ -24,10 +24,13 @@ export interface LogCollectorOptions {
|
|
|
24
24
|
*/
|
|
25
25
|
export declare function getLogStreamService(): LogStreamService | null;
|
|
26
26
|
/**
|
|
27
|
-
* Monitors
|
|
27
|
+
* Monitors log entries and reports rolling error/warning counts.
|
|
28
28
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
29
|
+
* **Two modes:**
|
|
30
|
+
* - **Zero-config (no args):** the provider auto-hooks into the AdonisJS
|
|
31
|
+
* Pino logger at boot. Entries arrive in real-time, no file path needed.
|
|
32
|
+
* - **File-based (with `logPath`):** polls a JSON log file every 2 seconds.
|
|
33
|
+
* Use this as a fallback if the auto-hook doesn't work for your setup.
|
|
31
34
|
*
|
|
32
35
|
* **Metrics produced:**
|
|
33
36
|
* - `logErrorsLast5m` -- error + fatal entries in the last 5 minutes
|
|
@@ -41,8 +44,12 @@ export declare function getLogStreamService(): LogStreamService | null;
|
|
|
41
44
|
* ```ts
|
|
42
45
|
* import { logCollector } from 'adonisjs-server-stats/collectors'
|
|
43
46
|
*
|
|
47
|
+
* // Zero-config — auto-hooks into AdonisJS logger (recommended)
|
|
48
|
+
* logCollector()
|
|
49
|
+
*
|
|
50
|
+
* // File-based fallback
|
|
44
51
|
* logCollector({ logPath: 'logs/adonisjs.log' })
|
|
45
52
|
* ```
|
|
46
53
|
*/
|
|
47
|
-
export declare function logCollector(opts
|
|
54
|
+
export declare function logCollector(opts?: LogCollectorOptions): MetricCollector;
|
|
48
55
|
//# sourceMappingURL=log_collector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/log_collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"log_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/log_collector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAGtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;OAQG;IACH,OAAO,EAAE,MAAM,CAAA;CAChB;AAID;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAE7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,eAAe,CAmExE"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
1
2
|
import { LogStreamService } from '../log_stream/log_stream_service.js';
|
|
3
|
+
import { log, dim, bold } from '../utils/logger.js';
|
|
2
4
|
let sharedLogStream = null;
|
|
3
5
|
/**
|
|
4
6
|
* Returns the shared {@link LogStreamService} instance created by
|
|
@@ -11,10 +13,13 @@ export function getLogStreamService() {
|
|
|
11
13
|
return sharedLogStream;
|
|
12
14
|
}
|
|
13
15
|
/**
|
|
14
|
-
* Monitors
|
|
16
|
+
* Monitors log entries and reports rolling error/warning counts.
|
|
15
17
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
+
* **Two modes:**
|
|
19
|
+
* - **Zero-config (no args):** the provider auto-hooks into the AdonisJS
|
|
20
|
+
* Pino logger at boot. Entries arrive in real-time, no file path needed.
|
|
21
|
+
* - **File-based (with `logPath`):** polls a JSON log file every 2 seconds.
|
|
22
|
+
* Use this as a fallback if the auto-hook doesn't work for your setup.
|
|
18
23
|
*
|
|
19
24
|
* **Metrics produced:**
|
|
20
25
|
* - `logErrorsLast5m` -- error + fatal entries in the last 5 minutes
|
|
@@ -28,16 +33,57 @@ export function getLogStreamService() {
|
|
|
28
33
|
* ```ts
|
|
29
34
|
* import { logCollector } from 'adonisjs-server-stats/collectors'
|
|
30
35
|
*
|
|
36
|
+
* // Zero-config — auto-hooks into AdonisJS logger (recommended)
|
|
37
|
+
* logCollector()
|
|
38
|
+
*
|
|
39
|
+
* // File-based fallback
|
|
31
40
|
* logCollector({ logPath: 'logs/adonisjs.log' })
|
|
32
41
|
* ```
|
|
33
42
|
*/
|
|
34
43
|
export function logCollector(opts) {
|
|
35
|
-
const service = new LogStreamService(opts
|
|
44
|
+
const service = new LogStreamService(opts?.logPath);
|
|
36
45
|
sharedLogStream = service;
|
|
46
|
+
let warnedMissingFile = false;
|
|
47
|
+
let warnedStartFailure = false;
|
|
37
48
|
return {
|
|
38
49
|
name: 'log',
|
|
50
|
+
label: opts?.logPath ? `log — file: ${opts.logPath}` : 'log — pino stream (zero-config)',
|
|
51
|
+
getConfig() {
|
|
52
|
+
return {
|
|
53
|
+
logPath: opts?.logPath ?? null,
|
|
54
|
+
mode: opts?.logPath ? 'file' : 'stream',
|
|
55
|
+
};
|
|
56
|
+
},
|
|
39
57
|
async start() {
|
|
40
|
-
|
|
58
|
+
if (opts?.logPath) {
|
|
59
|
+
// File-based mode
|
|
60
|
+
if (!existsSync(opts.logPath) && !warnedMissingFile) {
|
|
61
|
+
warnedMissingFile = true;
|
|
62
|
+
log.warn(`Log file not found: ${bold(opts.logPath)}`);
|
|
63
|
+
log.block('The log collector will keep retrying, but no metrics will appear until the file exists.', [
|
|
64
|
+
dim('Make sure the path is correct and your app is writing logs there.'),
|
|
65
|
+
dim('The file must contain newline-delimited JSON with') +
|
|
66
|
+
` ${bold('level')} ` +
|
|
67
|
+
dim('and') +
|
|
68
|
+
` ${bold('time')} ` +
|
|
69
|
+
dim('fields (Pino format).'),
|
|
70
|
+
]);
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
await service.start();
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (!warnedStartFailure) {
|
|
77
|
+
warnedStartFailure = true;
|
|
78
|
+
log.warn(`Log collector failed to start: ${bold(String(error))}`);
|
|
79
|
+
log.block('The log collector will not produce metrics until this is resolved.', [
|
|
80
|
+
dim('Configured log path:') + ` ${bold(opts.logPath)}`,
|
|
81
|
+
dim('Check file permissions and ensure the directory exists.'),
|
|
82
|
+
]);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Stream mode: no startup needed — entries arrive via ingest()
|
|
41
87
|
},
|
|
42
88
|
stop() {
|
|
43
89
|
service.stop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/process_collector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"process_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/process_collector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,CAmDlD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/queue_collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queue_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/queue_collector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAA;IAEZ,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAA;IAEZ,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;;;;;;;;;;;;OAcG;IACH,UAAU,EAAE,oBAAoB,CAAA;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,eAAe,CA0F3E"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { log, dim, bold } from '../utils/logger.js';
|
|
1
2
|
/**
|
|
2
3
|
* Monitors a BullMQ job queue for active, waiting, delayed, and failed jobs.
|
|
3
4
|
*
|
|
@@ -27,9 +28,36 @@
|
|
|
27
28
|
*/
|
|
28
29
|
export function queueCollector(opts) {
|
|
29
30
|
const queueName = opts.queueName ?? 'default';
|
|
31
|
+
let warnedMissingBullmq = false;
|
|
32
|
+
let warnedConnectionError = false;
|
|
33
|
+
let warnedMissingConnection = false;
|
|
30
34
|
return {
|
|
31
35
|
name: 'queue',
|
|
36
|
+
label: `queue — ${queueName} @ ${opts.connection?.host ?? '?'}:${opts.connection?.port ?? '?'}`,
|
|
37
|
+
getConfig() {
|
|
38
|
+
return {
|
|
39
|
+
queueName,
|
|
40
|
+
connectionHost: opts.connection?.host ?? '?',
|
|
41
|
+
connectionPort: opts.connection?.port ?? '?',
|
|
42
|
+
};
|
|
43
|
+
},
|
|
32
44
|
async collect() {
|
|
45
|
+
if (!opts.connection) {
|
|
46
|
+
if (!warnedMissingConnection) {
|
|
47
|
+
warnedMissingConnection = true;
|
|
48
|
+
log.warn(`Queue collector ${bold(queueName)}: missing ${bold('connection')} option`);
|
|
49
|
+
log.block('Provide a Redis connection when creating the collector:', [
|
|
50
|
+
`${dim('queueCollector({ connection: { host: "localhost", port: 6379 } })')}`,
|
|
51
|
+
]);
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
queueActive: 0,
|
|
55
|
+
queueWaiting: 0,
|
|
56
|
+
queueDelayed: 0,
|
|
57
|
+
queueFailed: 0,
|
|
58
|
+
queueWorkerCount: 0,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
33
61
|
try {
|
|
34
62
|
const { Queue } = await import('bullmq');
|
|
35
63
|
const queue = new Queue(queueName, { connection: opts.connection });
|
|
@@ -43,7 +71,33 @@ export function queueCollector(opts) {
|
|
|
43
71
|
queueWorkerCount: workers.length,
|
|
44
72
|
};
|
|
45
73
|
}
|
|
46
|
-
catch {
|
|
74
|
+
catch (error) {
|
|
75
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
76
|
+
const isImportError = message.includes('Cannot find package') ||
|
|
77
|
+
message.includes('MODULE_NOT_FOUND') ||
|
|
78
|
+
message.includes('ERR_MODULE_NOT_FOUND');
|
|
79
|
+
if (isImportError) {
|
|
80
|
+
if (!warnedMissingBullmq) {
|
|
81
|
+
warnedMissingBullmq = true;
|
|
82
|
+
log.warn(`Queue collector ${bold(queueName)}: ${bold('bullmq')} is not installed`);
|
|
83
|
+
log.block('Install the peer dependency to enable queue metrics:', [
|
|
84
|
+
`${bold('npm install bullmq')}`,
|
|
85
|
+
dim('Queue metrics will return zeros until bullmq is available.'),
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
if (!warnedConnectionError) {
|
|
91
|
+
warnedConnectionError = true;
|
|
92
|
+
const { host, port } = opts.connection;
|
|
93
|
+
log.warn(`Queue collector ${bold(queueName)}: cannot connect to Redis at ${bold(`${host}:${port}`)}`);
|
|
94
|
+
log.block('Connection failed:', [
|
|
95
|
+
`${dim('Error:')} ${message}`,
|
|
96
|
+
dim('Is Redis running? Check with: redis-cli ping'),
|
|
97
|
+
dim('Queue metrics will return zeros until the connection succeeds.'),
|
|
98
|
+
]);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
47
101
|
return {
|
|
48
102
|
queueActive: 0,
|
|
49
103
|
queueWaiting: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/redis_collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"redis_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/redis_collector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAMrD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,IAAI,eAAe,CAoGhD"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { appImport } from '../utils/app_import.js';
|
|
2
|
+
import { log, dim, bold } from '../utils/logger.js';
|
|
3
|
+
let warnedNotInstalled = false;
|
|
4
|
+
let warnedPingFailed = false;
|
|
5
|
+
let warnedConnectionError = false;
|
|
1
6
|
/**
|
|
2
7
|
* Monitors Redis health, memory, connections, keys, and cache hit rate.
|
|
3
8
|
*
|
|
@@ -16,6 +21,10 @@
|
|
|
16
21
|
export function redisCollector() {
|
|
17
22
|
return {
|
|
18
23
|
name: 'redis',
|
|
24
|
+
label: 'redis — memory, clients, keys, hit rate',
|
|
25
|
+
getConfig() {
|
|
26
|
+
return {};
|
|
27
|
+
},
|
|
19
28
|
async collect() {
|
|
20
29
|
const defaults = {
|
|
21
30
|
redisOk: false,
|
|
@@ -24,11 +33,33 @@ export function redisCollector() {
|
|
|
24
33
|
redisKeysCount: 0,
|
|
25
34
|
redisHitRate: 0,
|
|
26
35
|
};
|
|
36
|
+
let redis;
|
|
37
|
+
try {
|
|
38
|
+
const mod = await appImport('@adonisjs/redis/services/main');
|
|
39
|
+
redis = mod.default;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
if (!warnedNotInstalled) {
|
|
43
|
+
warnedNotInstalled = true;
|
|
44
|
+
log.block(`Redis collector ${bold('skipped')} — @adonisjs/redis is not installed`, [
|
|
45
|
+
dim('Redis metrics will return defaults until the package is added.'),
|
|
46
|
+
`Run ${bold('node ace add @adonisjs/redis')} to install it.`,
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
return defaults;
|
|
50
|
+
}
|
|
27
51
|
try {
|
|
28
|
-
const { default: redis } = await import('@adonisjs/redis/services/main');
|
|
29
52
|
const pong = await redis.ping();
|
|
30
|
-
if (pong !== 'PONG')
|
|
53
|
+
if (pong !== 'PONG') {
|
|
54
|
+
if (!warnedPingFailed) {
|
|
55
|
+
warnedPingFailed = true;
|
|
56
|
+
log.block(`Redis collector ${bold('unhealthy')} — PING returned ${bold(String(pong))} instead of PONG`, [
|
|
57
|
+
dim('Redis may be down or misconfigured.'),
|
|
58
|
+
`Check your connection settings in ${bold('config/redis.ts')}.`,
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
31
61
|
return defaults;
|
|
62
|
+
}
|
|
32
63
|
const [memoryInfo, statsInfo, dbSize] = await Promise.all([
|
|
33
64
|
redis.info('memory'),
|
|
34
65
|
redis.info('stats'),
|
|
@@ -60,7 +91,15 @@ export function redisCollector() {
|
|
|
60
91
|
redisHitRate: hitRate,
|
|
61
92
|
};
|
|
62
93
|
}
|
|
63
|
-
catch {
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (!warnedConnectionError) {
|
|
96
|
+
warnedConnectionError = true;
|
|
97
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
98
|
+
log.block(`Redis collector ${bold('error')} — failed to communicate with Redis`, [
|
|
99
|
+
dim(message),
|
|
100
|
+
`Make sure Redis is running and accessible. Check ${bold('config/redis.ts')} for connection details.`,
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
64
103
|
return defaults;
|
|
65
104
|
}
|
|
66
105
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/system_collector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"system_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/system_collector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,eAAe,CAqBjD"}
|