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.
Files changed (527) hide show
  1. package/README.md +351 -171
  2. package/dist/configure.d.ts.map +1 -1
  3. package/dist/core/api-client.d.ts +73 -0
  4. package/dist/core/api-client.d.ts.map +1 -0
  5. package/dist/core/config-utils.d.ts +109 -0
  6. package/dist/core/config-utils.d.ts.map +1 -0
  7. package/dist/core/constants.d.ts +11 -0
  8. package/dist/core/constants.d.ts.map +1 -0
  9. package/dist/core/dashboard-api.d.ts +65 -0
  10. package/dist/core/dashboard-api.d.ts.map +1 -0
  11. package/dist/core/dashboard-data-controller.d.ts +157 -0
  12. package/dist/core/dashboard-data-controller.d.ts.map +1 -0
  13. package/dist/core/debug-data-controller.d.ts +89 -0
  14. package/dist/core/debug-data-controller.d.ts.map +1 -0
  15. package/dist/core/feature-detect.d.ts +67 -0
  16. package/dist/core/feature-detect.d.ts.map +1 -0
  17. package/dist/core/formatters.d.ts +189 -0
  18. package/dist/core/formatters.d.ts.map +1 -0
  19. package/dist/core/history-buffer.d.ts +23 -0
  20. package/dist/core/history-buffer.d.ts.map +1 -0
  21. package/dist/core/icons.d.ts +36 -0
  22. package/dist/core/icons.d.ts.map +1 -0
  23. package/dist/core/index.d.ts +39 -0
  24. package/dist/core/index.d.ts.map +1 -0
  25. package/dist/core/index.js +1961 -0
  26. package/dist/core/internals-utils.d.ts +71 -0
  27. package/dist/core/internals-utils.d.ts.map +1 -0
  28. package/dist/core/job-utils.d.ts +45 -0
  29. package/dist/core/job-utils.d.ts.map +1 -0
  30. package/dist/core/log-utils.d.ts +34 -0
  31. package/dist/core/log-utils.d.ts.map +1 -0
  32. package/dist/core/metrics.d.ts +41 -0
  33. package/dist/core/metrics.d.ts.map +1 -0
  34. package/dist/core/pagination.d.ts +128 -0
  35. package/dist/core/pagination.d.ts.map +1 -0
  36. package/dist/core/query-utils.d.ts +35 -0
  37. package/dist/core/query-utils.d.ts.map +1 -0
  38. package/dist/core/resizable-columns.d.ts +18 -0
  39. package/dist/core/resizable-columns.d.ts.map +1 -0
  40. package/dist/core/routes.d.ts +12 -0
  41. package/dist/core/routes.d.ts.map +1 -0
  42. package/dist/core/server-stats-controller.d.ts +106 -0
  43. package/dist/core/server-stats-controller.d.ts.map +1 -0
  44. package/dist/core/sparkline.d.ts +80 -0
  45. package/dist/core/sparkline.d.ts.map +1 -0
  46. package/dist/core/theme.d.ts +42 -0
  47. package/dist/core/theme.d.ts.map +1 -0
  48. package/dist/core/trace-utils.d.ts +62 -0
  49. package/dist/core/trace-utils.d.ts.map +1 -0
  50. package/dist/core/transmit-adapter.d.ts +59 -0
  51. package/dist/core/transmit-adapter.d.ts.map +1 -0
  52. package/dist/core/types.d.ts +619 -0
  53. package/dist/core/types.d.ts.map +1 -0
  54. package/dist/react/CacheSection-DGxMDlWK.js +146 -0
  55. package/dist/react/CacheTab-CnVW5PLs.js +123 -0
  56. package/dist/react/ConfigContent-CnsEI4j3.js +397 -0
  57. package/dist/react/ConfigSection-DPcrfqXY.js +11 -0
  58. package/dist/react/ConfigTab-BSWq_o2p.js +15 -0
  59. package/dist/react/CustomPaneTab-xjkYwTvH.js +104 -0
  60. package/dist/react/DataTable-YyShr5B-.js +55 -0
  61. package/dist/react/EmailsSection-CSyTg1aX.js +262 -0
  62. package/dist/react/EmailsTab-Dh2YSa_f.js +131 -0
  63. package/dist/react/EventsSection-C1pbJDfW.js +86 -0
  64. package/dist/react/EventsTab-eCh02cdd.js +63 -0
  65. package/dist/react/FilterBar-DQRXpWrb.js +50 -0
  66. package/dist/react/InternalsContent-DBzsI0CG.js +346 -0
  67. package/dist/react/InternalsSection-t7ihcWO-.js +32 -0
  68. package/dist/react/InternalsTab-Oij0A2fN.js +30 -0
  69. package/dist/react/JobsSection-CLAin5vU.js +187 -0
  70. package/dist/react/JobsTab-Dl5nrj2z.js +141 -0
  71. package/dist/react/LogsSection-C1p81fXO.js +212 -0
  72. package/dist/react/LogsTab-D-kR7PjX.js +88 -0
  73. package/dist/react/OverviewSection-nm3xdACz.js +539 -0
  74. package/dist/react/Pagination-BkmzUDY8.js +64 -0
  75. package/dist/react/QueriesSection-DB12HMfQ.js +461 -0
  76. package/dist/react/QueriesTab-fyBB1u_Y.js +90 -0
  77. package/dist/react/RequestsSection-DTqB81ac.js +209 -0
  78. package/dist/react/RoutesSection-DJWa4NPV.js +74 -0
  79. package/dist/react/RoutesTab-D3l8TOpu.js +74 -0
  80. package/dist/react/TimelineSection-C4d-jRX1.js +158 -0
  81. package/dist/react/TimelineTab-C5TFaSmQ.js +193 -0
  82. package/dist/react/WaterfallChart-Cj73WdfM.js +100 -0
  83. package/dist/react/core/api-client.d.ts +73 -0
  84. package/dist/react/core/api-client.d.ts.map +1 -0
  85. package/dist/react/core/config-utils.d.ts +109 -0
  86. package/dist/react/core/config-utils.d.ts.map +1 -0
  87. package/dist/react/core/constants.d.ts +11 -0
  88. package/dist/react/core/constants.d.ts.map +1 -0
  89. package/dist/react/core/dashboard-api.d.ts +65 -0
  90. package/dist/react/core/dashboard-api.d.ts.map +1 -0
  91. package/dist/react/core/dashboard-data-controller.d.ts +157 -0
  92. package/dist/react/core/dashboard-data-controller.d.ts.map +1 -0
  93. package/dist/react/core/debug-data-controller.d.ts +89 -0
  94. package/dist/react/core/debug-data-controller.d.ts.map +1 -0
  95. package/dist/react/core/feature-detect.d.ts +67 -0
  96. package/dist/react/core/feature-detect.d.ts.map +1 -0
  97. package/dist/react/core/formatters.d.ts +189 -0
  98. package/dist/react/core/formatters.d.ts.map +1 -0
  99. package/dist/react/core/history-buffer.d.ts +23 -0
  100. package/dist/react/core/history-buffer.d.ts.map +1 -0
  101. package/dist/react/core/icons.d.ts +36 -0
  102. package/dist/react/core/icons.d.ts.map +1 -0
  103. package/dist/react/core/index.d.ts +39 -0
  104. package/dist/react/core/index.d.ts.map +1 -0
  105. package/dist/react/core/internals-utils.d.ts +71 -0
  106. package/dist/react/core/internals-utils.d.ts.map +1 -0
  107. package/dist/react/core/job-utils.d.ts +45 -0
  108. package/dist/react/core/job-utils.d.ts.map +1 -0
  109. package/dist/react/core/log-utils.d.ts +34 -0
  110. package/dist/react/core/log-utils.d.ts.map +1 -0
  111. package/dist/react/core/metrics.d.ts +41 -0
  112. package/dist/react/core/metrics.d.ts.map +1 -0
  113. package/dist/react/core/pagination.d.ts +128 -0
  114. package/dist/react/core/pagination.d.ts.map +1 -0
  115. package/dist/react/core/query-utils.d.ts +35 -0
  116. package/dist/react/core/query-utils.d.ts.map +1 -0
  117. package/dist/react/core/resizable-columns.d.ts +18 -0
  118. package/dist/react/core/resizable-columns.d.ts.map +1 -0
  119. package/dist/react/core/routes.d.ts +12 -0
  120. package/dist/react/core/routes.d.ts.map +1 -0
  121. package/dist/react/core/server-stats-controller.d.ts +106 -0
  122. package/dist/react/core/server-stats-controller.d.ts.map +1 -0
  123. package/dist/react/core/sparkline.d.ts +80 -0
  124. package/dist/react/core/sparkline.d.ts.map +1 -0
  125. package/dist/react/core/theme.d.ts +42 -0
  126. package/dist/react/core/theme.d.ts.map +1 -0
  127. package/dist/react/core/trace-utils.d.ts +62 -0
  128. package/dist/react/core/trace-utils.d.ts.map +1 -0
  129. package/dist/react/core/transmit-adapter.d.ts +59 -0
  130. package/dist/react/core/transmit-adapter.d.ts.map +1 -0
  131. package/dist/react/core/types.d.ts +619 -0
  132. package/dist/react/core/types.d.ts.map +1 -0
  133. package/dist/react/index-UdTfSvtO.js +1074 -0
  134. package/dist/react/index.js +18 -0
  135. package/dist/react/react/components/Dashboard/DashboardPage.d.ts +17 -0
  136. package/dist/react/react/components/Dashboard/DashboardPage.d.ts.map +1 -0
  137. package/dist/react/react/components/Dashboard/sections/CacheSection.d.ts +7 -0
  138. package/dist/react/react/components/Dashboard/sections/CacheSection.d.ts.map +1 -0
  139. package/dist/react/react/components/Dashboard/sections/ConfigSection.d.ts +7 -0
  140. package/dist/react/react/components/Dashboard/sections/ConfigSection.d.ts.map +1 -0
  141. package/dist/react/react/components/Dashboard/sections/EmailsSection.d.ts +7 -0
  142. package/dist/react/react/components/Dashboard/sections/EmailsSection.d.ts.map +1 -0
  143. package/dist/react/react/components/Dashboard/sections/EventsSection.d.ts +7 -0
  144. package/dist/react/react/components/Dashboard/sections/EventsSection.d.ts.map +1 -0
  145. package/dist/react/react/components/Dashboard/sections/InternalsSection.d.ts +14 -0
  146. package/dist/react/react/components/Dashboard/sections/InternalsSection.d.ts.map +1 -0
  147. package/dist/react/react/components/Dashboard/sections/JobsSection.d.ts +7 -0
  148. package/dist/react/react/components/Dashboard/sections/JobsSection.d.ts.map +1 -0
  149. package/dist/react/react/components/Dashboard/sections/LogsSection.d.ts +7 -0
  150. package/dist/react/react/components/Dashboard/sections/LogsSection.d.ts.map +1 -0
  151. package/dist/react/react/components/Dashboard/sections/OverviewSection.d.ts +7 -0
  152. package/dist/react/react/components/Dashboard/sections/OverviewSection.d.ts.map +1 -0
  153. package/dist/react/react/components/Dashboard/sections/QueriesSection.d.ts +7 -0
  154. package/dist/react/react/components/Dashboard/sections/QueriesSection.d.ts.map +1 -0
  155. package/dist/react/react/components/Dashboard/sections/RequestsSection.d.ts +7 -0
  156. package/dist/react/react/components/Dashboard/sections/RequestsSection.d.ts.map +1 -0
  157. package/dist/react/react/components/Dashboard/sections/RoutesSection.d.ts +7 -0
  158. package/dist/react/react/components/Dashboard/sections/RoutesSection.d.ts.map +1 -0
  159. package/dist/react/react/components/Dashboard/sections/TimelineSection.d.ts +9 -0
  160. package/dist/react/react/components/Dashboard/sections/TimelineSection.d.ts.map +1 -0
  161. package/dist/react/react/components/Dashboard/shared/DataTable.d.ts +27 -0
  162. package/dist/react/react/components/Dashboard/shared/DataTable.d.ts.map +1 -0
  163. package/dist/react/react/components/Dashboard/shared/FilterBar.d.ts +17 -0
  164. package/dist/react/react/components/Dashboard/shared/FilterBar.d.ts.map +1 -0
  165. package/dist/react/react/components/Dashboard/shared/Pagination.d.ts +13 -0
  166. package/dist/react/react/components/Dashboard/shared/Pagination.d.ts.map +1 -0
  167. package/dist/react/react/components/Dashboard/shared/TimeRangeSelector.d.ts +12 -0
  168. package/dist/react/react/components/Dashboard/shared/TimeRangeSelector.d.ts.map +1 -0
  169. package/dist/react/react/components/Dashboard/shared/WaterfallChart.d.ts +16 -0
  170. package/dist/react/react/components/Dashboard/shared/WaterfallChart.d.ts.map +1 -0
  171. package/dist/react/react/components/DebugPanel/DebugPanel.d.ts +16 -0
  172. package/dist/react/react/components/DebugPanel/DebugPanel.d.ts.map +1 -0
  173. package/dist/react/react/components/DebugPanel/tabs/CacheTab.d.ts +8 -0
  174. package/dist/react/react/components/DebugPanel/tabs/CacheTab.d.ts.map +1 -0
  175. package/dist/react/react/components/DebugPanel/tabs/ConfigTab.d.ts +8 -0
  176. package/dist/react/react/components/DebugPanel/tabs/ConfigTab.d.ts.map +1 -0
  177. package/dist/react/react/components/DebugPanel/tabs/CustomPaneTab.d.ts +14 -0
  178. package/dist/react/react/components/DebugPanel/tabs/CustomPaneTab.d.ts.map +1 -0
  179. package/dist/react/react/components/DebugPanel/tabs/EmailsTab.d.ts +7 -0
  180. package/dist/react/react/components/DebugPanel/tabs/EmailsTab.d.ts.map +1 -0
  181. package/dist/react/react/components/DebugPanel/tabs/EventsTab.d.ts +7 -0
  182. package/dist/react/react/components/DebugPanel/tabs/EventsTab.d.ts.map +1 -0
  183. package/dist/react/react/components/DebugPanel/tabs/InternalsTab.d.ts +12 -0
  184. package/dist/react/react/components/DebugPanel/tabs/InternalsTab.d.ts.map +1 -0
  185. package/dist/react/react/components/DebugPanel/tabs/JobsTab.d.ts +9 -0
  186. package/dist/react/react/components/DebugPanel/tabs/JobsTab.d.ts.map +1 -0
  187. package/dist/react/react/components/DebugPanel/tabs/LogsTab.d.ts +7 -0
  188. package/dist/react/react/components/DebugPanel/tabs/LogsTab.d.ts.map +1 -0
  189. package/dist/react/react/components/DebugPanel/tabs/QueriesTab.d.ts +7 -0
  190. package/dist/react/react/components/DebugPanel/tabs/QueriesTab.d.ts.map +1 -0
  191. package/dist/react/react/components/DebugPanel/tabs/RoutesTab.d.ts +8 -0
  192. package/dist/react/react/components/DebugPanel/tabs/RoutesTab.d.ts.map +1 -0
  193. package/dist/react/react/components/DebugPanel/tabs/TimelineTab.d.ts +7 -0
  194. package/dist/react/react/components/DebugPanel/tabs/TimelineTab.d.ts.map +1 -0
  195. package/dist/react/react/components/StatsBar/MetricCard.d.ts +21 -0
  196. package/dist/react/react/components/StatsBar/MetricCard.d.ts.map +1 -0
  197. package/dist/react/react/components/StatsBar/Sparkline.d.ts +15 -0
  198. package/dist/react/react/components/StatsBar/Sparkline.d.ts.map +1 -0
  199. package/dist/react/react/components/StatsBar/StatsBar.d.ts +22 -0
  200. package/dist/react/react/components/StatsBar/StatsBar.d.ts.map +1 -0
  201. package/dist/react/react/components/shared/Badge.d.ts +32 -0
  202. package/dist/react/react/components/shared/Badge.d.ts.map +1 -0
  203. package/dist/react/react/components/shared/ConfigContent.d.ts +13 -0
  204. package/dist/react/react/components/shared/ConfigContent.d.ts.map +1 -0
  205. package/dist/react/react/components/shared/InternalsContent.d.ts +10 -0
  206. package/dist/react/react/components/shared/InternalsContent.d.ts.map +1 -0
  207. package/dist/react/react/components/shared/JsonViewer.d.ts +12 -0
  208. package/dist/react/react/components/shared/JsonViewer.d.ts.map +1 -0
  209. package/dist/react/react/components/shared/ThemeToggle.d.ts +13 -0
  210. package/dist/react/react/components/shared/ThemeToggle.d.ts.map +1 -0
  211. package/dist/react/react/components/shared/Tooltip.d.ts +16 -0
  212. package/dist/react/react/components/shared/Tooltip.d.ts.map +1 -0
  213. package/dist/react/react/hooks/useApiClient.d.ts +10 -0
  214. package/dist/react/react/hooks/useApiClient.d.ts.map +1 -0
  215. package/dist/react/react/hooks/useDashboardApiBase.d.ts +19 -0
  216. package/dist/react/react/hooks/useDashboardApiBase.d.ts.map +1 -0
  217. package/dist/react/react/hooks/useDashboardData.d.ts +27 -0
  218. package/dist/react/react/hooks/useDashboardData.d.ts.map +1 -0
  219. package/dist/react/react/hooks/useDebugData.d.ts +17 -0
  220. package/dist/react/react/hooks/useDebugData.d.ts.map +1 -0
  221. package/dist/react/react/hooks/useFeatures.d.ts +13 -0
  222. package/dist/react/react/hooks/useFeatures.d.ts.map +1 -0
  223. package/dist/react/react/hooks/useResizableTable.d.ts +13 -0
  224. package/dist/react/react/hooks/useResizableTable.d.ts.map +1 -0
  225. package/dist/react/react/hooks/useServerStats.d.ts +21 -0
  226. package/dist/react/react/hooks/useServerStats.d.ts.map +1 -0
  227. package/dist/react/react/hooks/useTheme.d.ts +12 -0
  228. package/dist/react/react/hooks/useTheme.d.ts.map +1 -0
  229. package/dist/react/react/index.d.ts +14 -0
  230. package/dist/react/react/index.d.ts.map +1 -0
  231. package/dist/react/style.css +1 -0
  232. package/dist/react/useApiClient-BVtNCmnL.js +9 -0
  233. package/dist/react/useDashboardApiBase-Bi36pJ2L.js +14 -0
  234. package/dist/react/useResizableTable-CNJmACdt.js +13 -0
  235. package/dist/src/collectors/app_collector.d.ts.map +1 -1
  236. package/dist/src/collectors/app_collector.js +30 -2
  237. package/dist/src/collectors/auto_detect.d.ts +31 -0
  238. package/dist/src/collectors/auto_detect.d.ts.map +1 -0
  239. package/dist/src/collectors/auto_detect.js +120 -0
  240. package/dist/src/collectors/collector.d.ts +17 -0
  241. package/dist/src/collectors/collector.d.ts.map +1 -1
  242. package/dist/src/collectors/db_pool_collector.d.ts.map +1 -1
  243. package/dist/src/collectors/db_pool_collector.js +35 -1
  244. package/dist/src/collectors/http_collector.d.ts +4 -3
  245. package/dist/src/collectors/http_collector.d.ts.map +1 -1
  246. package/dist/src/collectors/http_collector.js +28 -11
  247. package/dist/src/collectors/index.d.ts +2 -0
  248. package/dist/src/collectors/index.d.ts.map +1 -1
  249. package/dist/src/collectors/index.js +1 -0
  250. package/dist/src/collectors/log_collector.d.ts +11 -4
  251. package/dist/src/collectors/log_collector.d.ts.map +1 -1
  252. package/dist/src/collectors/log_collector.js +51 -5
  253. package/dist/src/collectors/process_collector.d.ts.map +1 -1
  254. package/dist/src/collectors/process_collector.js +4 -0
  255. package/dist/src/collectors/queue_collector.d.ts.map +1 -1
  256. package/dist/src/collectors/queue_collector.js +55 -1
  257. package/dist/src/collectors/redis_collector.d.ts.map +1 -1
  258. package/dist/src/collectors/redis_collector.js +42 -3
  259. package/dist/src/collectors/system_collector.d.ts.map +1 -1
  260. package/dist/src/collectors/system_collector.js +4 -0
  261. package/dist/src/controller/api_controller.d.ts +101 -0
  262. package/dist/src/controller/api_controller.d.ts.map +1 -0
  263. package/dist/src/controller/api_controller.js +131 -0
  264. package/dist/src/controller/debug_controller.d.ts +19 -10
  265. package/dist/src/controller/debug_controller.d.ts.map +1 -1
  266. package/dist/src/controller/debug_controller.js +118 -101
  267. package/dist/src/core/theme.d.ts +42 -0
  268. package/dist/src/core/theme.d.ts.map +1 -0
  269. package/dist/src/core/theme.js +115 -0
  270. package/dist/src/dashboard/chart_aggregator.d.ts.map +1 -1
  271. package/dist/src/dashboard/chart_aggregator.js +3 -2
  272. package/dist/src/dashboard/dashboard_controller.d.ts +10 -14
  273. package/dist/src/dashboard/dashboard_controller.d.ts.map +1 -1
  274. package/dist/src/dashboard/dashboard_controller.js +132 -250
  275. package/dist/src/dashboard/dashboard_store.d.ts +62 -19
  276. package/dist/src/dashboard/dashboard_store.d.ts.map +1 -1
  277. package/dist/src/dashboard/dashboard_store.js +242 -53
  278. package/dist/src/dashboard/integrations/cache_inspector.d.ts +19 -1
  279. package/dist/src/dashboard/integrations/cache_inspector.d.ts.map +1 -1
  280. package/dist/src/dashboard/integrations/config_inspector.d.ts +1 -1
  281. package/dist/src/dashboard/integrations/config_inspector.d.ts.map +1 -1
  282. package/dist/src/dashboard/integrations/config_inspector.js +3 -2
  283. package/dist/src/dashboard/integrations/queue_inspector.d.ts +55 -10
  284. package/dist/src/dashboard/integrations/queue_inspector.d.ts.map +1 -1
  285. package/dist/src/dashboard/integrations/queue_inspector.js +70 -24
  286. package/dist/src/dashboard/migrator.d.ts +5 -0
  287. package/dist/src/dashboard/migrator.d.ts.map +1 -1
  288. package/dist/src/dashboard/migrator.js +44 -9
  289. package/dist/src/dashboard/models/stats_event.d.ts +1 -1
  290. package/dist/src/dashboard/models/stats_event.d.ts.map +1 -1
  291. package/dist/src/dashboard/models/stats_log.d.ts +1 -1
  292. package/dist/src/dashboard/models/stats_log.d.ts.map +1 -1
  293. package/dist/src/dashboard/models/stats_query.d.ts +1 -1
  294. package/dist/src/dashboard/models/stats_query.d.ts.map +1 -1
  295. package/dist/src/dashboard/models/stats_saved_filter.d.ts +1 -1
  296. package/dist/src/dashboard/models/stats_saved_filter.d.ts.map +1 -1
  297. package/dist/src/dashboard/models/stats_trace.d.ts +2 -1
  298. package/dist/src/dashboard/models/stats_trace.d.ts.map +1 -1
  299. package/dist/src/data/data_access.d.ts +105 -0
  300. package/dist/src/data/data_access.d.ts.map +1 -0
  301. package/dist/src/data/data_access.js +310 -0
  302. package/dist/src/data/index.d.ts +3 -0
  303. package/dist/src/data/index.d.ts.map +1 -0
  304. package/dist/src/data/index.js +1 -0
  305. package/dist/src/debug/debug_store.d.ts +20 -1
  306. package/dist/src/debug/debug_store.d.ts.map +1 -1
  307. package/dist/src/debug/debug_store.js +43 -15
  308. package/dist/src/debug/email_collector.d.ts +6 -2
  309. package/dist/src/debug/email_collector.d.ts.map +1 -1
  310. package/dist/src/debug/email_collector.js +3 -0
  311. package/dist/src/debug/event_collector.d.ts +6 -2
  312. package/dist/src/debug/event_collector.d.ts.map +1 -1
  313. package/dist/src/debug/event_collector.js +12 -8
  314. package/dist/src/debug/query_collector.d.ts +6 -2
  315. package/dist/src/debug/query_collector.d.ts.map +1 -1
  316. package/dist/src/debug/query_collector.js +3 -0
  317. package/dist/src/debug/ring_buffer.d.ts +1 -0
  318. package/dist/src/debug/ring_buffer.d.ts.map +1 -1
  319. package/dist/src/debug/ring_buffer.js +5 -2
  320. package/dist/src/debug/route_inspector.d.ts +2 -2
  321. package/dist/src/debug/route_inspector.d.ts.map +1 -1
  322. package/dist/src/debug/route_inspector.js +4 -3
  323. package/dist/src/debug/trace_collector.d.ts +7 -3
  324. package/dist/src/debug/trace_collector.d.ts.map +1 -1
  325. package/dist/src/debug/trace_collector.js +7 -5
  326. package/dist/src/debug/types.d.ts +107 -2
  327. package/dist/src/debug/types.d.ts.map +1 -1
  328. package/dist/src/debug/types.js +1 -1
  329. package/dist/src/define_config.d.ts +49 -5
  330. package/dist/src/define_config.d.ts.map +1 -1
  331. package/dist/src/define_config.js +361 -4
  332. package/dist/src/edge/bootstrap.d.ts +17 -0
  333. package/dist/src/edge/bootstrap.d.ts.map +1 -0
  334. package/dist/src/edge/bootstrap.js +29 -0
  335. package/dist/src/edge/client/dashboard.js +2 -3619
  336. package/dist/src/edge/client/debug-panel-deferred.js +1 -0
  337. package/dist/src/edge/client/debug-panel.js +1 -2140
  338. package/dist/src/edge/client/stats-bar.js +1 -801
  339. package/dist/src/edge/client-vue/dashboard.js +5 -0
  340. package/dist/src/edge/client-vue/debug-panel-deferred.js +4 -0
  341. package/dist/src/edge/client-vue/debug-panel.js +4 -0
  342. package/dist/src/edge/client-vue/stats-bar.js +4 -0
  343. package/dist/src/edge/plugin.d.ts +35 -2
  344. package/dist/src/edge/plugin.d.ts.map +1 -1
  345. package/dist/src/edge/plugin.js +30 -66
  346. package/dist/src/edge/types.d.ts +46 -0
  347. package/dist/src/edge/types.d.ts.map +1 -0
  348. package/dist/src/edge/types.js +4 -0
  349. package/dist/src/edge/views/dashboard.edge +1 -358
  350. package/dist/src/edge/views/debug-panel.edge +2 -154
  351. package/dist/src/edge/views/stats-bar.edge +15 -48
  352. package/dist/src/engine/stats_engine.d.ts +18 -0
  353. package/dist/src/engine/stats_engine.d.ts.map +1 -1
  354. package/dist/src/engine/stats_engine.js +45 -2
  355. package/dist/src/index.d.ts +1 -1
  356. package/dist/src/index.d.ts.map +1 -1
  357. package/dist/src/log_stream/log_stream_provider.d.ts.map +1 -1
  358. package/dist/src/log_stream/log_stream_provider.js +21 -4
  359. package/dist/src/log_stream/log_stream_service.d.ts +8 -1
  360. package/dist/src/log_stream/log_stream_service.d.ts.map +1 -1
  361. package/dist/src/log_stream/log_stream_service.js +27 -3
  362. package/dist/src/middleware/request_tracking_middleware.d.ts +1 -1
  363. package/dist/src/middleware/request_tracking_middleware.d.ts.map +1 -1
  364. package/dist/src/middleware/request_tracking_middleware.js +21 -6
  365. package/dist/src/prometheus/prometheus_collector.d.ts +2 -1
  366. package/dist/src/prometheus/prometheus_collector.d.ts.map +1 -1
  367. package/dist/src/provider/server_stats_provider.d.ts +100 -0
  368. package/dist/src/provider/server_stats_provider.d.ts.map +1 -1
  369. package/dist/src/provider/server_stats_provider.js +460 -104
  370. package/dist/src/routes/access_middleware.d.ts +2 -1
  371. package/dist/src/routes/access_middleware.d.ts.map +1 -1
  372. package/dist/src/routes/access_middleware.js +7 -1
  373. package/dist/src/routes/index.d.ts +4 -0
  374. package/dist/src/routes/index.d.ts.map +1 -0
  375. package/dist/src/routes/index.js +1 -0
  376. package/dist/src/routes/register_routes.d.ts +103 -0
  377. package/dist/src/routes/register_routes.d.ts.map +1 -0
  378. package/dist/src/routes/register_routes.js +356 -0
  379. package/dist/src/routes/router_types.d.ts +29 -0
  380. package/dist/src/routes/router_types.d.ts.map +1 -0
  381. package/dist/src/routes/router_types.js +1 -0
  382. package/dist/src/stubs/config.stub +12 -32
  383. package/dist/src/styles/components.css +1048 -0
  384. package/dist/src/{edge/client → styles}/dashboard.css +299 -736
  385. package/dist/src/{edge/client → styles}/debug-panel.css +117 -633
  386. package/dist/src/{edge/client → styles}/stats-bar.css +28 -10
  387. package/dist/src/styles/tokens.css +153 -0
  388. package/dist/src/styles/utilities.css +75 -0
  389. package/dist/src/types.d.ts +119 -16
  390. package/dist/src/types.d.ts.map +1 -1
  391. package/dist/src/utils/app_import.d.ts +23 -0
  392. package/dist/src/utils/app_import.d.ts.map +1 -0
  393. package/dist/src/utils/app_import.js +44 -0
  394. package/dist/src/utils/json_helpers.d.ts +2 -2
  395. package/dist/src/utils/json_helpers.d.ts.map +1 -1
  396. package/dist/src/utils/logger.d.ts +17 -0
  397. package/dist/src/utils/logger.d.ts.map +1 -0
  398. package/dist/src/utils/logger.js +27 -0
  399. package/dist/src/utils/mail_helpers.d.ts +1 -1
  400. package/dist/src/utils/mail_helpers.d.ts.map +1 -1
  401. package/dist/src/utils/mail_helpers.js +1 -1
  402. package/dist/vue/CacheSection-C788Yfai.js +149 -0
  403. package/dist/vue/CacheTab-BPisYYiQ.js +104 -0
  404. package/dist/vue/ConfigSection-CRzYxqW2.js +576 -0
  405. package/dist/vue/ConfigTab-C8cafGUj.js +361 -0
  406. package/dist/vue/CustomPaneTab-BJxT5Dp7.js +172 -0
  407. package/dist/vue/EmailsSection-C8JFMtW7.js +206 -0
  408. package/dist/vue/EmailsTab-DhFhoNmU.js +157 -0
  409. package/dist/vue/EventsSection-C4wXUgxG.js +107 -0
  410. package/dist/vue/EventsTab-DQ4Nd6AK.js +97 -0
  411. package/dist/vue/FilterBar.vue_vue_type_script_setup_true_lang-ClJ37hhT.js +62 -0
  412. package/dist/vue/InternalsSection-BJUXE-5F.js +468 -0
  413. package/dist/vue/InternalsTab-DEMjqtlw.js +471 -0
  414. package/dist/vue/JobsSection-CsKWTjgN.js +187 -0
  415. package/dist/vue/JobsTab-BCvhOARO.js +117 -0
  416. package/dist/vue/JsonViewer.vue_vue_type_script_setup_true_lang-Vsqar1zx.js +67 -0
  417. package/dist/vue/LogsSection-BFVjSZ24.js +227 -0
  418. package/dist/vue/LogsTab-DpEQ7euu.js +122 -0
  419. package/dist/vue/OverviewSection-CbMdAido.js +849 -0
  420. package/dist/vue/PaginationControls.vue_vue_type_script_setup_true_lang-CuN7g_8Z.js +50 -0
  421. package/dist/vue/QueriesSection-BPiv7u3r.js +429 -0
  422. package/dist/vue/QueriesTab-C8_7oprC.js +107 -0
  423. package/dist/vue/RequestsSection-LtImH4rD.js +243 -0
  424. package/dist/vue/RoutesSection-CrxOxmzx.js +106 -0
  425. package/dist/vue/RoutesTab-Dz0MkZuF.js +80 -0
  426. package/dist/vue/TimelineSection-DLxMW2J_.js +186 -0
  427. package/dist/vue/TimelineTab-Db6lKKsD.js +250 -0
  428. package/dist/vue/WaterfallChart.vue_vue_type_script_setup_true_lang-tZ13cNj1.js +118 -0
  429. package/dist/vue/components/Dashboard/DashboardPage.vue.d.ts +18 -0
  430. package/dist/vue/components/Dashboard/DashboardPage.vue.d.ts.map +1 -0
  431. package/dist/vue/components/Dashboard/sections/CacheSection.vue.d.ts +5 -0
  432. package/dist/vue/components/Dashboard/sections/CacheSection.vue.d.ts.map +1 -0
  433. package/dist/vue/components/Dashboard/sections/ConfigSection.vue.d.ts +3 -0
  434. package/dist/vue/components/Dashboard/sections/ConfigSection.vue.d.ts.map +1 -0
  435. package/dist/vue/components/Dashboard/sections/EmailsSection.vue.d.ts +5 -0
  436. package/dist/vue/components/Dashboard/sections/EmailsSection.vue.d.ts.map +1 -0
  437. package/dist/vue/components/Dashboard/sections/EventsSection.vue.d.ts +5 -0
  438. package/dist/vue/components/Dashboard/sections/EventsSection.vue.d.ts.map +1 -0
  439. package/dist/vue/components/Dashboard/sections/InternalsSection.vue.d.ts +3 -0
  440. package/dist/vue/components/Dashboard/sections/InternalsSection.vue.d.ts.map +1 -0
  441. package/dist/vue/components/Dashboard/sections/JobsSection.vue.d.ts +5 -0
  442. package/dist/vue/components/Dashboard/sections/JobsSection.vue.d.ts.map +1 -0
  443. package/dist/vue/components/Dashboard/sections/LogsSection.vue.d.ts +3 -0
  444. package/dist/vue/components/Dashboard/sections/LogsSection.vue.d.ts.map +1 -0
  445. package/dist/vue/components/Dashboard/sections/OverviewSection.vue.d.ts +5 -0
  446. package/dist/vue/components/Dashboard/sections/OverviewSection.vue.d.ts.map +1 -0
  447. package/dist/vue/components/Dashboard/sections/QueriesSection.vue.d.ts +45 -0
  448. package/dist/vue/components/Dashboard/sections/QueriesSection.vue.d.ts.map +1 -0
  449. package/dist/vue/components/Dashboard/sections/RequestsSection.vue.d.ts +5 -0
  450. package/dist/vue/components/Dashboard/sections/RequestsSection.vue.d.ts.map +1 -0
  451. package/dist/vue/components/Dashboard/sections/RoutesSection.vue.d.ts +5 -0
  452. package/dist/vue/components/Dashboard/sections/RoutesSection.vue.d.ts.map +1 -0
  453. package/dist/vue/components/Dashboard/sections/TimelineSection.vue.d.ts +11 -0
  454. package/dist/vue/components/Dashboard/sections/TimelineSection.vue.d.ts.map +1 -0
  455. package/dist/vue/components/Dashboard/shared/FilterBar.vue.d.ts +29 -0
  456. package/dist/vue/components/Dashboard/shared/FilterBar.vue.d.ts.map +1 -0
  457. package/dist/vue/components/Dashboard/shared/PaginationControls.vue.d.ts +12 -0
  458. package/dist/vue/components/Dashboard/shared/PaginationControls.vue.d.ts.map +1 -0
  459. package/dist/vue/components/Dashboard/shared/TimeRangeSelector.vue.d.ts +11 -0
  460. package/dist/vue/components/Dashboard/shared/TimeRangeSelector.vue.d.ts.map +1 -0
  461. package/dist/vue/components/Dashboard/shared/WaterfallChart.vue.d.ts +10 -0
  462. package/dist/vue/components/Dashboard/shared/WaterfallChart.vue.d.ts.map +1 -0
  463. package/dist/vue/components/DebugPanel/DebugPanel.vue.d.ts +21 -0
  464. package/dist/vue/components/DebugPanel/DebugPanel.vue.d.ts.map +1 -0
  465. package/dist/vue/components/DebugPanel/tabs/CacheTab.vue.d.ts +12 -0
  466. package/dist/vue/components/DebugPanel/tabs/CacheTab.vue.d.ts.map +1 -0
  467. package/dist/vue/components/DebugPanel/tabs/ConfigTab.vue.d.ts +11 -0
  468. package/dist/vue/components/DebugPanel/tabs/ConfigTab.vue.d.ts.map +1 -0
  469. package/dist/vue/components/DebugPanel/tabs/CustomPaneTab.vue.d.ts +11 -0
  470. package/dist/vue/components/DebugPanel/tabs/CustomPaneTab.vue.d.ts.map +1 -0
  471. package/dist/vue/components/DebugPanel/tabs/EmailsTab.vue.d.ts +12 -0
  472. package/dist/vue/components/DebugPanel/tabs/EmailsTab.vue.d.ts.map +1 -0
  473. package/dist/vue/components/DebugPanel/tabs/EventsTab.vue.d.ts +12 -0
  474. package/dist/vue/components/DebugPanel/tabs/EventsTab.vue.d.ts.map +1 -0
  475. package/dist/vue/components/DebugPanel/tabs/InternalsTab.vue.d.ts +11 -0
  476. package/dist/vue/components/DebugPanel/tabs/InternalsTab.vue.d.ts.map +1 -0
  477. package/dist/vue/components/DebugPanel/tabs/JobsTab.vue.d.ts +13 -0
  478. package/dist/vue/components/DebugPanel/tabs/JobsTab.vue.d.ts.map +1 -0
  479. package/dist/vue/components/DebugPanel/tabs/LogsTab.vue.d.ts +15 -0
  480. package/dist/vue/components/DebugPanel/tabs/LogsTab.vue.d.ts.map +1 -0
  481. package/dist/vue/components/DebugPanel/tabs/QueriesTab.vue.d.ts +12 -0
  482. package/dist/vue/components/DebugPanel/tabs/QueriesTab.vue.d.ts.map +1 -0
  483. package/dist/vue/components/DebugPanel/tabs/RoutesTab.vue.d.ts +12 -0
  484. package/dist/vue/components/DebugPanel/tabs/RoutesTab.vue.d.ts.map +1 -0
  485. package/dist/vue/components/DebugPanel/tabs/TimelineTab.vue.d.ts +15 -0
  486. package/dist/vue/components/DebugPanel/tabs/TimelineTab.vue.d.ts.map +1 -0
  487. package/dist/vue/components/StatsBar/MetricCard.vue.d.ts +19 -0
  488. package/dist/vue/components/StatsBar/MetricCard.vue.d.ts.map +1 -0
  489. package/dist/vue/components/StatsBar/Sparkline.vue.d.ts +17 -0
  490. package/dist/vue/components/StatsBar/Sparkline.vue.d.ts.map +1 -0
  491. package/dist/vue/components/StatsBar/StatsBar.vue.d.ts +22 -0
  492. package/dist/vue/components/StatsBar/StatsBar.vue.d.ts.map +1 -0
  493. package/dist/vue/components/shared/JsonViewer.vue.d.ts +13 -0
  494. package/dist/vue/components/shared/JsonViewer.vue.d.ts.map +1 -0
  495. package/dist/vue/components/shared/ThemeToggle.vue.d.ts +8 -0
  496. package/dist/vue/components/shared/ThemeToggle.vue.d.ts.map +1 -0
  497. package/dist/vue/composables/useApiClient.d.ts +9 -0
  498. package/dist/vue/composables/useApiClient.d.ts.map +1 -0
  499. package/dist/vue/composables/useDashboardData.d.ts +53 -0
  500. package/dist/vue/composables/useDashboardData.d.ts.map +1 -0
  501. package/dist/vue/composables/useDebugData.d.ts +25 -0
  502. package/dist/vue/composables/useDebugData.d.ts.map +1 -0
  503. package/dist/vue/composables/useFeatures.d.ts +80 -0
  504. package/dist/vue/composables/useFeatures.d.ts.map +1 -0
  505. package/dist/vue/composables/useResizableTable.d.ts +16 -0
  506. package/dist/vue/composables/useResizableTable.d.ts.map +1 -0
  507. package/dist/vue/composables/useServerStats.d.ts +104 -0
  508. package/dist/vue/composables/useServerStats.d.ts.map +1 -0
  509. package/dist/vue/composables/useTheme.d.ts +6 -0
  510. package/dist/vue/composables/useTheme.d.ts.map +1 -0
  511. package/dist/vue/index-qCQpBftQ.js +1233 -0
  512. package/dist/vue/index.d.ts +10 -0
  513. package/dist/vue/index.d.ts.map +1 -0
  514. package/dist/vue/index.js +11 -0
  515. package/dist/vue/style.css +1 -0
  516. package/dist/vue/useApiClient-BQQ9CF-q.js +10 -0
  517. package/dist/vue/useResizableTable-BoivAevK.js +17 -0
  518. package/package.json +72 -10
  519. package/dist/src/dashboard/dashboard_routes.d.ts +0 -16
  520. package/dist/src/dashboard/dashboard_routes.d.ts.map +0 -1
  521. package/dist/src/dashboard/dashboard_routes.js +0 -77
  522. package/dist/src/routes/debug_routes.d.ts +0 -14
  523. package/dist/src/routes/debug_routes.d.ts.map +0 -1
  524. package/dist/src/routes/debug_routes.js +0 -42
  525. package/dist/src/routes/stats_routes.d.ts +0 -14
  526. package/dist/src/routes/stats_routes.d.ts.map +0 -1
  527. 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":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;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,CA4B9E"}
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 import('@adonisjs/lucid/services/db');
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;AAE7D,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;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAOlD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG,eAAe,CAiB1E"}
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
- collect() {
47
- const m = metrics.getMetrics();
45
+ label: `http — buffer: ${(opts?.maxRecords ?? 10_000).toLocaleString()}, window: ${(opts?.windowMs ?? 60_000) / 1000}s`,
46
+ getConfig() {
48
47
  return {
49
- requestsPerSecond: m.requestsPerSecond,
50
- avgResponseTimeMs: m.averageResponseTimeMs,
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 a JSON log file and reports rolling error/warning counts.
27
+ * Monitors log entries and reports rolling error/warning counts.
28
28
  *
29
- * Uses {@link LogStreamService} internally to poll the log file every
30
- * 2 seconds and maintain a 5-minute sliding window of entries.
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: LogCollectorOptions): MetricCollector;
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":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAEtE,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;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe,CAyBvE"}
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 a JSON log file and reports rolling error/warning counts.
16
+ * Monitors log entries and reports rolling error/warning counts.
15
17
  *
16
- * Uses {@link LogStreamService} internally to poll the log file every
17
- * 2 seconds and maintain a 5-minute sliding window of entries.
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.logPath);
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
- await service.start();
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,CA8ClD"}
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"}
@@ -33,6 +33,10 @@ export function processCollector() {
33
33
  }
34
34
  return {
35
35
  name: 'process',
36
+ label: 'process — cpu, memory, event loop, uptime',
37
+ getConfig() {
38
+ return {};
39
+ },
36
40
  start() {
37
41
  if (!started) {
38
42
  histogram.enable();
@@ -1 +1 @@
1
- {"version":3,"file":"queue_collector.d.ts","sourceRoot":"","sources":["../../../src/collectors/queue_collector.ts"],"names":[],"mappings":"AAAA,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,CA8B3E"}
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":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,IAAI,eAAe,CA4DhD"}
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,CAgBjD"}
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"}
@@ -13,6 +13,10 @@ import os from 'node:os';
13
13
  export function systemCollector() {
14
14
  return {
15
15
  name: 'system',
16
+ label: 'system — load avg, memory, uptime',
17
+ getConfig() {
18
+ return {};
19
+ },
16
20
  collect() {
17
21
  const loadAvg = os.loadavg();
18
22
  return {