adonisjs-server-stats 1.5.3 → 1.6.1

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 (519) 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 +28 -1
  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 +116 -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 +33 -0
  244. package/dist/src/collectors/http_collector.d.ts.map +1 -1
  245. package/dist/src/collectors/http_collector.js +25 -6
  246. package/dist/src/collectors/index.d.ts +2 -0
  247. package/dist/src/collectors/index.d.ts.map +1 -1
  248. package/dist/src/collectors/index.js +1 -0
  249. package/dist/src/collectors/log_collector.d.ts +11 -4
  250. package/dist/src/collectors/log_collector.d.ts.map +1 -1
  251. package/dist/src/collectors/log_collector.js +51 -5
  252. package/dist/src/collectors/process_collector.d.ts.map +1 -1
  253. package/dist/src/collectors/process_collector.js +4 -0
  254. package/dist/src/collectors/queue_collector.d.ts.map +1 -1
  255. package/dist/src/collectors/queue_collector.js +55 -1
  256. package/dist/src/collectors/redis_collector.d.ts.map +1 -1
  257. package/dist/src/collectors/redis_collector.js +41 -3
  258. package/dist/src/collectors/system_collector.d.ts.map +1 -1
  259. package/dist/src/collectors/system_collector.js +4 -0
  260. package/dist/src/controller/api_controller.d.ts +101 -0
  261. package/dist/src/controller/api_controller.d.ts.map +1 -0
  262. package/dist/src/controller/api_controller.js +131 -0
  263. package/dist/src/controller/debug_controller.d.ts +14 -10
  264. package/dist/src/controller/debug_controller.d.ts.map +1 -1
  265. package/dist/src/controller/debug_controller.js +96 -102
  266. package/dist/src/core/theme.d.ts +42 -0
  267. package/dist/src/core/theme.d.ts.map +1 -0
  268. package/dist/src/core/theme.js +115 -0
  269. package/dist/src/dashboard/chart_aggregator.d.ts.map +1 -1
  270. package/dist/src/dashboard/dashboard_controller.d.ts +10 -14
  271. package/dist/src/dashboard/dashboard_controller.d.ts.map +1 -1
  272. package/dist/src/dashboard/dashboard_controller.js +132 -250
  273. package/dist/src/dashboard/dashboard_store.d.ts +62 -19
  274. package/dist/src/dashboard/dashboard_store.d.ts.map +1 -1
  275. package/dist/src/dashboard/dashboard_store.js +196 -43
  276. package/dist/src/dashboard/integrations/cache_inspector.d.ts +19 -1
  277. package/dist/src/dashboard/integrations/cache_inspector.d.ts.map +1 -1
  278. package/dist/src/dashboard/integrations/config_inspector.d.ts +1 -1
  279. package/dist/src/dashboard/integrations/config_inspector.d.ts.map +1 -1
  280. package/dist/src/dashboard/integrations/config_inspector.js +3 -2
  281. package/dist/src/dashboard/integrations/queue_inspector.d.ts +55 -10
  282. package/dist/src/dashboard/integrations/queue_inspector.d.ts.map +1 -1
  283. package/dist/src/dashboard/integrations/queue_inspector.js +70 -24
  284. package/dist/src/dashboard/models/stats_event.d.ts +1 -1
  285. package/dist/src/dashboard/models/stats_event.d.ts.map +1 -1
  286. package/dist/src/dashboard/models/stats_log.d.ts +1 -1
  287. package/dist/src/dashboard/models/stats_log.d.ts.map +1 -1
  288. package/dist/src/dashboard/models/stats_query.d.ts +1 -1
  289. package/dist/src/dashboard/models/stats_query.d.ts.map +1 -1
  290. package/dist/src/dashboard/models/stats_saved_filter.d.ts +1 -1
  291. package/dist/src/dashboard/models/stats_saved_filter.d.ts.map +1 -1
  292. package/dist/src/dashboard/models/stats_trace.d.ts +2 -1
  293. package/dist/src/dashboard/models/stats_trace.d.ts.map +1 -1
  294. package/dist/src/data/data_access.d.ts +103 -0
  295. package/dist/src/data/data_access.d.ts.map +1 -0
  296. package/dist/src/data/data_access.js +305 -0
  297. package/dist/src/data/index.d.ts +3 -0
  298. package/dist/src/data/index.d.ts.map +1 -0
  299. package/dist/src/data/index.js +1 -0
  300. package/dist/src/debug/debug_store.d.ts +20 -1
  301. package/dist/src/debug/debug_store.d.ts.map +1 -1
  302. package/dist/src/debug/debug_store.js +43 -15
  303. package/dist/src/debug/email_collector.d.ts +6 -2
  304. package/dist/src/debug/email_collector.d.ts.map +1 -1
  305. package/dist/src/debug/email_collector.js +3 -0
  306. package/dist/src/debug/event_collector.d.ts +6 -2
  307. package/dist/src/debug/event_collector.d.ts.map +1 -1
  308. package/dist/src/debug/event_collector.js +12 -8
  309. package/dist/src/debug/query_collector.d.ts +6 -2
  310. package/dist/src/debug/query_collector.d.ts.map +1 -1
  311. package/dist/src/debug/query_collector.js +3 -0
  312. package/dist/src/debug/ring_buffer.d.ts +1 -0
  313. package/dist/src/debug/ring_buffer.d.ts.map +1 -1
  314. package/dist/src/debug/ring_buffer.js +5 -2
  315. package/dist/src/debug/route_inspector.d.ts +2 -2
  316. package/dist/src/debug/route_inspector.d.ts.map +1 -1
  317. package/dist/src/debug/route_inspector.js +4 -3
  318. package/dist/src/debug/trace_collector.d.ts +7 -3
  319. package/dist/src/debug/trace_collector.d.ts.map +1 -1
  320. package/dist/src/debug/trace_collector.js +7 -5
  321. package/dist/src/debug/types.d.ts +107 -2
  322. package/dist/src/debug/types.d.ts.map +1 -1
  323. package/dist/src/debug/types.js +1 -1
  324. package/dist/src/define_config.d.ts +49 -5
  325. package/dist/src/define_config.d.ts.map +1 -1
  326. package/dist/src/define_config.js +360 -4
  327. package/dist/src/edge/bootstrap.d.ts +17 -0
  328. package/dist/src/edge/bootstrap.d.ts.map +1 -0
  329. package/dist/src/edge/bootstrap.js +29 -0
  330. package/dist/src/edge/client/dashboard.js +2 -3619
  331. package/dist/src/edge/client/debug-panel-deferred.js +1 -0
  332. package/dist/src/edge/client/debug-panel.js +1 -2140
  333. package/dist/src/edge/client/stats-bar.js +1 -801
  334. package/dist/src/edge/client-vue/dashboard.js +5 -0
  335. package/dist/src/edge/client-vue/debug-panel-deferred.js +4 -0
  336. package/dist/src/edge/client-vue/debug-panel.js +4 -0
  337. package/dist/src/edge/client-vue/stats-bar.js +4 -0
  338. package/dist/src/edge/plugin.d.ts +35 -2
  339. package/dist/src/edge/plugin.d.ts.map +1 -1
  340. package/dist/src/edge/plugin.js +30 -66
  341. package/dist/src/edge/types.d.ts +46 -0
  342. package/dist/src/edge/types.d.ts.map +1 -0
  343. package/dist/src/edge/types.js +4 -0
  344. package/dist/src/edge/views/dashboard.edge +1 -358
  345. package/dist/src/edge/views/debug-panel.edge +2 -154
  346. package/dist/src/edge/views/stats-bar.edge +15 -48
  347. package/dist/src/engine/stats_engine.d.ts +18 -0
  348. package/dist/src/engine/stats_engine.d.ts.map +1 -1
  349. package/dist/src/engine/stats_engine.js +45 -2
  350. package/dist/src/index.d.ts +1 -1
  351. package/dist/src/index.d.ts.map +1 -1
  352. package/dist/src/log_stream/log_stream_provider.d.ts.map +1 -1
  353. package/dist/src/log_stream/log_stream_provider.js +21 -4
  354. package/dist/src/log_stream/log_stream_service.d.ts +8 -1
  355. package/dist/src/log_stream/log_stream_service.d.ts.map +1 -1
  356. package/dist/src/log_stream/log_stream_service.js +27 -3
  357. package/dist/src/middleware/request_tracking_middleware.d.ts +1 -1
  358. package/dist/src/middleware/request_tracking_middleware.d.ts.map +1 -1
  359. package/dist/src/middleware/request_tracking_middleware.js +14 -6
  360. package/dist/src/prometheus/prometheus_collector.d.ts +2 -1
  361. package/dist/src/prometheus/prometheus_collector.d.ts.map +1 -1
  362. package/dist/src/provider/server_stats_provider.d.ts +98 -0
  363. package/dist/src/provider/server_stats_provider.d.ts.map +1 -1
  364. package/dist/src/provider/server_stats_provider.js +340 -50
  365. package/dist/src/routes/access_middleware.d.ts +2 -1
  366. package/dist/src/routes/access_middleware.d.ts.map +1 -1
  367. package/dist/src/routes/access_middleware.js +7 -1
  368. package/dist/src/routes/index.d.ts +4 -0
  369. package/dist/src/routes/index.d.ts.map +1 -0
  370. package/dist/src/routes/index.js +1 -0
  371. package/dist/src/routes/register_routes.d.ts +103 -0
  372. package/dist/src/routes/register_routes.d.ts.map +1 -0
  373. package/dist/src/routes/register_routes.js +356 -0
  374. package/dist/src/routes/router_types.d.ts +29 -0
  375. package/dist/src/routes/router_types.d.ts.map +1 -0
  376. package/dist/src/routes/router_types.js +1 -0
  377. package/dist/src/stubs/config.stub +12 -32
  378. package/dist/src/styles/components.css +1048 -0
  379. package/dist/src/{edge/client → styles}/dashboard.css +299 -736
  380. package/dist/src/{edge/client → styles}/debug-panel.css +117 -633
  381. package/dist/src/{edge/client → styles}/stats-bar.css +28 -10
  382. package/dist/src/styles/tokens.css +153 -0
  383. package/dist/src/styles/utilities.css +75 -0
  384. package/dist/src/types.d.ts +119 -16
  385. package/dist/src/types.d.ts.map +1 -1
  386. package/dist/src/utils/json_helpers.d.ts +2 -2
  387. package/dist/src/utils/json_helpers.d.ts.map +1 -1
  388. package/dist/src/utils/logger.d.ts +17 -0
  389. package/dist/src/utils/logger.d.ts.map +1 -0
  390. package/dist/src/utils/logger.js +27 -0
  391. package/dist/src/utils/mail_helpers.d.ts +1 -1
  392. package/dist/src/utils/mail_helpers.d.ts.map +1 -1
  393. package/dist/src/utils/mail_helpers.js +1 -1
  394. package/dist/vue/CacheSection-CkrIB4-j.js +149 -0
  395. package/dist/vue/CacheTab-BPisYYiQ.js +104 -0
  396. package/dist/vue/ConfigSection-gulpOiq1.js +576 -0
  397. package/dist/vue/ConfigTab-C8cafGUj.js +361 -0
  398. package/dist/vue/CustomPaneTab-J57ED_bh.js +172 -0
  399. package/dist/vue/EmailsSection-BlKvQDx8.js +206 -0
  400. package/dist/vue/EmailsTab-DhFhoNmU.js +157 -0
  401. package/dist/vue/EventsSection-BdzQvIVJ.js +107 -0
  402. package/dist/vue/EventsTab-DQ4Nd6AK.js +97 -0
  403. package/dist/vue/FilterBar.vue_vue_type_script_setup_true_lang-ClJ37hhT.js +62 -0
  404. package/dist/vue/InternalsSection-BJUXE-5F.js +468 -0
  405. package/dist/vue/InternalsTab-DEMjqtlw.js +471 -0
  406. package/dist/vue/JobsSection-DOzuMrG3.js +187 -0
  407. package/dist/vue/JobsTab-BCvhOARO.js +117 -0
  408. package/dist/vue/JsonViewer.vue_vue_type_script_setup_true_lang-Vsqar1zx.js +67 -0
  409. package/dist/vue/LogsSection-CNN4y92u.js +227 -0
  410. package/dist/vue/LogsTab-CJerb22r.js +122 -0
  411. package/dist/vue/OverviewSection-SITNR_dA.js +849 -0
  412. package/dist/vue/PaginationControls.vue_vue_type_script_setup_true_lang-CuN7g_8Z.js +50 -0
  413. package/dist/vue/QueriesSection-BAebAHkD.js +429 -0
  414. package/dist/vue/QueriesTab-C8_7oprC.js +107 -0
  415. package/dist/vue/RequestsSection-CIR0IX39.js +243 -0
  416. package/dist/vue/RoutesSection-j1U2oa0g.js +106 -0
  417. package/dist/vue/RoutesTab-Dz0MkZuF.js +80 -0
  418. package/dist/vue/TimelineSection-Dw980UPg.js +186 -0
  419. package/dist/vue/TimelineTab-Db6lKKsD.js +250 -0
  420. package/dist/vue/WaterfallChart.vue_vue_type_script_setup_true_lang-tZ13cNj1.js +118 -0
  421. package/dist/vue/components/Dashboard/DashboardPage.vue.d.ts +18 -0
  422. package/dist/vue/components/Dashboard/DashboardPage.vue.d.ts.map +1 -0
  423. package/dist/vue/components/Dashboard/sections/CacheSection.vue.d.ts +5 -0
  424. package/dist/vue/components/Dashboard/sections/CacheSection.vue.d.ts.map +1 -0
  425. package/dist/vue/components/Dashboard/sections/ConfigSection.vue.d.ts +3 -0
  426. package/dist/vue/components/Dashboard/sections/ConfigSection.vue.d.ts.map +1 -0
  427. package/dist/vue/components/Dashboard/sections/EmailsSection.vue.d.ts +5 -0
  428. package/dist/vue/components/Dashboard/sections/EmailsSection.vue.d.ts.map +1 -0
  429. package/dist/vue/components/Dashboard/sections/EventsSection.vue.d.ts +5 -0
  430. package/dist/vue/components/Dashboard/sections/EventsSection.vue.d.ts.map +1 -0
  431. package/dist/vue/components/Dashboard/sections/InternalsSection.vue.d.ts +3 -0
  432. package/dist/vue/components/Dashboard/sections/InternalsSection.vue.d.ts.map +1 -0
  433. package/dist/vue/components/Dashboard/sections/JobsSection.vue.d.ts +5 -0
  434. package/dist/vue/components/Dashboard/sections/JobsSection.vue.d.ts.map +1 -0
  435. package/dist/vue/components/Dashboard/sections/LogsSection.vue.d.ts +3 -0
  436. package/dist/vue/components/Dashboard/sections/LogsSection.vue.d.ts.map +1 -0
  437. package/dist/vue/components/Dashboard/sections/OverviewSection.vue.d.ts +5 -0
  438. package/dist/vue/components/Dashboard/sections/OverviewSection.vue.d.ts.map +1 -0
  439. package/dist/vue/components/Dashboard/sections/QueriesSection.vue.d.ts +45 -0
  440. package/dist/vue/components/Dashboard/sections/QueriesSection.vue.d.ts.map +1 -0
  441. package/dist/vue/components/Dashboard/sections/RequestsSection.vue.d.ts +5 -0
  442. package/dist/vue/components/Dashboard/sections/RequestsSection.vue.d.ts.map +1 -0
  443. package/dist/vue/components/Dashboard/sections/RoutesSection.vue.d.ts +5 -0
  444. package/dist/vue/components/Dashboard/sections/RoutesSection.vue.d.ts.map +1 -0
  445. package/dist/vue/components/Dashboard/sections/TimelineSection.vue.d.ts +11 -0
  446. package/dist/vue/components/Dashboard/sections/TimelineSection.vue.d.ts.map +1 -0
  447. package/dist/vue/components/Dashboard/shared/FilterBar.vue.d.ts +29 -0
  448. package/dist/vue/components/Dashboard/shared/FilterBar.vue.d.ts.map +1 -0
  449. package/dist/vue/components/Dashboard/shared/PaginationControls.vue.d.ts +12 -0
  450. package/dist/vue/components/Dashboard/shared/PaginationControls.vue.d.ts.map +1 -0
  451. package/dist/vue/components/Dashboard/shared/TimeRangeSelector.vue.d.ts +11 -0
  452. package/dist/vue/components/Dashboard/shared/TimeRangeSelector.vue.d.ts.map +1 -0
  453. package/dist/vue/components/Dashboard/shared/WaterfallChart.vue.d.ts +10 -0
  454. package/dist/vue/components/Dashboard/shared/WaterfallChart.vue.d.ts.map +1 -0
  455. package/dist/vue/components/DebugPanel/DebugPanel.vue.d.ts +21 -0
  456. package/dist/vue/components/DebugPanel/DebugPanel.vue.d.ts.map +1 -0
  457. package/dist/vue/components/DebugPanel/tabs/CacheTab.vue.d.ts +12 -0
  458. package/dist/vue/components/DebugPanel/tabs/CacheTab.vue.d.ts.map +1 -0
  459. package/dist/vue/components/DebugPanel/tabs/ConfigTab.vue.d.ts +11 -0
  460. package/dist/vue/components/DebugPanel/tabs/ConfigTab.vue.d.ts.map +1 -0
  461. package/dist/vue/components/DebugPanel/tabs/CustomPaneTab.vue.d.ts +11 -0
  462. package/dist/vue/components/DebugPanel/tabs/CustomPaneTab.vue.d.ts.map +1 -0
  463. package/dist/vue/components/DebugPanel/tabs/EmailsTab.vue.d.ts +12 -0
  464. package/dist/vue/components/DebugPanel/tabs/EmailsTab.vue.d.ts.map +1 -0
  465. package/dist/vue/components/DebugPanel/tabs/EventsTab.vue.d.ts +12 -0
  466. package/dist/vue/components/DebugPanel/tabs/EventsTab.vue.d.ts.map +1 -0
  467. package/dist/vue/components/DebugPanel/tabs/InternalsTab.vue.d.ts +11 -0
  468. package/dist/vue/components/DebugPanel/tabs/InternalsTab.vue.d.ts.map +1 -0
  469. package/dist/vue/components/DebugPanel/tabs/JobsTab.vue.d.ts +13 -0
  470. package/dist/vue/components/DebugPanel/tabs/JobsTab.vue.d.ts.map +1 -0
  471. package/dist/vue/components/DebugPanel/tabs/LogsTab.vue.d.ts +15 -0
  472. package/dist/vue/components/DebugPanel/tabs/LogsTab.vue.d.ts.map +1 -0
  473. package/dist/vue/components/DebugPanel/tabs/QueriesTab.vue.d.ts +12 -0
  474. package/dist/vue/components/DebugPanel/tabs/QueriesTab.vue.d.ts.map +1 -0
  475. package/dist/vue/components/DebugPanel/tabs/RoutesTab.vue.d.ts +12 -0
  476. package/dist/vue/components/DebugPanel/tabs/RoutesTab.vue.d.ts.map +1 -0
  477. package/dist/vue/components/DebugPanel/tabs/TimelineTab.vue.d.ts +15 -0
  478. package/dist/vue/components/DebugPanel/tabs/TimelineTab.vue.d.ts.map +1 -0
  479. package/dist/vue/components/StatsBar/MetricCard.vue.d.ts +19 -0
  480. package/dist/vue/components/StatsBar/MetricCard.vue.d.ts.map +1 -0
  481. package/dist/vue/components/StatsBar/Sparkline.vue.d.ts +17 -0
  482. package/dist/vue/components/StatsBar/Sparkline.vue.d.ts.map +1 -0
  483. package/dist/vue/components/StatsBar/StatsBar.vue.d.ts +22 -0
  484. package/dist/vue/components/StatsBar/StatsBar.vue.d.ts.map +1 -0
  485. package/dist/vue/components/shared/JsonViewer.vue.d.ts +13 -0
  486. package/dist/vue/components/shared/JsonViewer.vue.d.ts.map +1 -0
  487. package/dist/vue/components/shared/ThemeToggle.vue.d.ts +8 -0
  488. package/dist/vue/components/shared/ThemeToggle.vue.d.ts.map +1 -0
  489. package/dist/vue/composables/useApiClient.d.ts +9 -0
  490. package/dist/vue/composables/useApiClient.d.ts.map +1 -0
  491. package/dist/vue/composables/useDashboardData.d.ts +53 -0
  492. package/dist/vue/composables/useDashboardData.d.ts.map +1 -0
  493. package/dist/vue/composables/useDebugData.d.ts +25 -0
  494. package/dist/vue/composables/useDebugData.d.ts.map +1 -0
  495. package/dist/vue/composables/useFeatures.d.ts +80 -0
  496. package/dist/vue/composables/useFeatures.d.ts.map +1 -0
  497. package/dist/vue/composables/useResizableTable.d.ts +16 -0
  498. package/dist/vue/composables/useResizableTable.d.ts.map +1 -0
  499. package/dist/vue/composables/useServerStats.d.ts +104 -0
  500. package/dist/vue/composables/useServerStats.d.ts.map +1 -0
  501. package/dist/vue/composables/useTheme.d.ts +6 -0
  502. package/dist/vue/composables/useTheme.d.ts.map +1 -0
  503. package/dist/vue/index-COgsk_nv.js +1233 -0
  504. package/dist/vue/index.d.ts +10 -0
  505. package/dist/vue/index.d.ts.map +1 -0
  506. package/dist/vue/index.js +11 -0
  507. package/dist/vue/style.css +1 -0
  508. package/dist/vue/useApiClient-BQQ9CF-q.js +10 -0
  509. package/dist/vue/useResizableTable-BoivAevK.js +17 -0
  510. package/package.json +68 -10
  511. package/dist/src/dashboard/dashboard_routes.d.ts +0 -16
  512. package/dist/src/dashboard/dashboard_routes.d.ts.map +0 -1
  513. package/dist/src/dashboard/dashboard_routes.js +0 -77
  514. package/dist/src/routes/debug_routes.d.ts +0 -14
  515. package/dist/src/routes/debug_routes.d.ts.map +0 -1
  516. package/dist/src/routes/debug_routes.js +0 -42
  517. package/dist/src/routes/stats_routes.d.ts +0 -14
  518. package/dist/src/routes/stats_routes.d.ts.map +0 -1
  519. package/dist/src/routes/stats_routes.js +0 -27
@@ -0,0 +1,116 @@
1
+ import { log, dim, green, bold } from '../utils/logger.js';
2
+ /**
3
+ * Probe whether a package is importable at runtime.
4
+ *
5
+ * Uses dynamic `import()` wrapped in try/catch so a missing
6
+ * optional dependency simply returns `false` instead of crashing.
7
+ */
8
+ async function isInstalled(pkg) {
9
+ try {
10
+ await import(pkg);
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ /**
18
+ * Auto-detect which metric collectors to enable based on installed packages.
19
+ *
20
+ * Always enables collectors with no external dependencies:
21
+ * - `processCollector` -- Node.js process metrics
22
+ * - `systemCollector` -- OS-level system metrics
23
+ * - `httpCollector` -- HTTP request metrics
24
+ * - `logCollector` -- log stream metrics
25
+ *
26
+ * Conditionally enables collectors when their peer dependency is importable:
27
+ * - `dbPoolCollector` + `appCollector` -- when `@adonisjs/lucid` is installed
28
+ * - `redisCollector` -- when `@adonisjs/redis` is installed
29
+ * - `queueCollector` -- when `bullmq` is installed
30
+ *
31
+ * This function is meant to run at startup, so the async overhead of
32
+ * probing packages is acceptable.
33
+ *
34
+ * @returns Resolved collectors and detection metadata for the boot summary.
35
+ */
36
+ export async function autoDetectCollectors() {
37
+ const collectors = [];
38
+ const entries = [];
39
+ // ── Always-on collectors (no external deps) ──────────────────────
40
+ const { processCollector } = await import('./process_collector.js');
41
+ const { systemCollector } = await import('./system_collector.js');
42
+ const { httpCollector } = await import('./http_collector.js');
43
+ const { logCollector } = await import('./log_collector.js');
44
+ collectors.push(processCollector());
45
+ entries.push({ name: 'process', description: 'CPU, memory, event loop', enabled: true });
46
+ collectors.push(systemCollector());
47
+ entries.push({ name: 'system', description: 'OS load, memory, uptime', enabled: true });
48
+ collectors.push(httpCollector());
49
+ entries.push({ name: 'http', description: 'req/s, latency, errors', enabled: true });
50
+ collectors.push(logCollector());
51
+ entries.push({ name: 'log', description: 'error & warning counts', enabled: true });
52
+ // ── Conditional: @adonisjs/lucid ─────────────────────────────────
53
+ const hasLucid = await isInstalled('@adonisjs/lucid');
54
+ if (hasLucid) {
55
+ const { dbPoolCollector } = await import('./db_pool_collector.js');
56
+ const { appCollector } = await import('./app_collector.js');
57
+ collectors.push(dbPoolCollector());
58
+ collectors.push(appCollector());
59
+ }
60
+ entries.push({
61
+ name: 'db-pool',
62
+ description: 'connection pool stats',
63
+ enabled: hasLucid,
64
+ reason: hasLucid ? 'found @adonisjs/lucid' : 'install @adonisjs/lucid to enable',
65
+ });
66
+ entries.push({
67
+ name: 'app',
68
+ description: 'app-level DB metrics',
69
+ enabled: hasLucid,
70
+ reason: hasLucid ? 'found @adonisjs/lucid' : 'install @adonisjs/lucid to enable',
71
+ });
72
+ // ── Conditional: @adonisjs/redis ─────────────────────────────────
73
+ const hasRedis = await isInstalled('@adonisjs/redis');
74
+ if (hasRedis) {
75
+ const { redisCollector } = await import('./redis_collector.js');
76
+ collectors.push(redisCollector());
77
+ }
78
+ entries.push({
79
+ name: 'redis',
80
+ description: 'connections, commands, memory',
81
+ enabled: hasRedis,
82
+ reason: hasRedis ? 'found @adonisjs/redis' : 'install @adonisjs/redis to enable',
83
+ });
84
+ // ── Conditional: bullmq ──────────────────────────────────────────
85
+ const hasBullMQ = await isInstalled('bullmq');
86
+ if (hasBullMQ) {
87
+ const { queueCollector } = await import('./queue_collector.js');
88
+ collectors.push(queueCollector({
89
+ queueName: 'default',
90
+ connection: { host: '127.0.0.1', port: 6379 },
91
+ }));
92
+ }
93
+ entries.push({
94
+ name: 'queue',
95
+ description: 'jobs, wait time, throughput',
96
+ enabled: hasBullMQ,
97
+ reason: hasBullMQ ? 'found bullmq' : 'install bullmq to enable',
98
+ });
99
+ // ── Rich boot log ────────────────────────────────────────────────
100
+ const total = entries.length;
101
+ const active = entries.filter((e) => e.enabled).length;
102
+ const maxNameLen = Math.max(...entries.map((e) => e.name.length));
103
+ const lines = entries.map((entry) => {
104
+ const paddedName = entry.name.padEnd(maxNameLen);
105
+ if (entry.enabled) {
106
+ const mark = green('✔');
107
+ const detail = entry.reason ? dim('— ' + entry.reason) : dim('— ' + entry.description);
108
+ return ` ${mark} ${bold(paddedName)} ${detail}`;
109
+ }
110
+ const mark = dim('✗');
111
+ const detail = dim('— ' + (entry.reason ?? entry.description));
112
+ return ` ${mark} ${dim(paddedName)} ${detail}`;
113
+ });
114
+ log.block('collectors (auto-detected):', lines);
115
+ return { collectors, total, active };
116
+ }
@@ -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":"AAEA,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,4 @@
1
+ import { log, dim, bold } from '../utils/logger.js';
1
2
  /**
2
3
  * Monitors the Knex connection pool for a Lucid database connection.
3
4
  *
@@ -21,17 +22,41 @@
21
22
  */
22
23
  export function dbPoolCollector(opts) {
23
24
  const connectionName = opts?.connectionName ?? 'postgres';
25
+ let warnedLucidMissing = false;
26
+ let warnedConnectionNotFound = false;
27
+ let warnedPoolUnavailable = false;
24
28
  return {
25
29
  name: 'db_pool',
30
+ label: `db_pool — connection: ${connectionName}`,
31
+ getConfig() {
32
+ return { connectionName };
33
+ },
26
34
  async collect() {
27
35
  try {
28
36
  const { default: db } = await import('@adonisjs/lucid/services/db');
29
37
  const connection = db.manager.get(connectionName);
30
38
  if (!connection) {
39
+ if (!warnedConnectionNotFound) {
40
+ warnedConnectionNotFound = true;
41
+ log.block(`db_pool: connection ${bold(connectionName)} not found in db.manager`, [
42
+ dim('The name must match a key in your') +
43
+ ` ${bold('config/database.ts')} ` +
44
+ dim('connections object.'),
45
+ dim('Available connections are registered at app boot — double-check spelling.'),
46
+ ]);
47
+ }
31
48
  return { dbPoolUsed: 0, dbPoolFree: 0, dbPoolPending: 0, dbPoolMax: 0 };
32
49
  }
33
50
  const pool = connection.connection?.pool;
34
51
  if (!pool) {
52
+ if (!warnedPoolUnavailable) {
53
+ warnedPoolUnavailable = true;
54
+ log.block(`db_pool: pool not available on connection ${bold(connectionName)}`, [
55
+ dim('This usually means the connection has not been established yet,'),
56
+ dim('or the database driver does not expose a Knex-style pool.'),
57
+ dim('Pool metrics will report zeros until the pool is available.'),
58
+ ]);
59
+ }
35
60
  return { dbPoolUsed: 0, dbPoolFree: 0, dbPoolPending: 0, dbPoolMax: 0 };
36
61
  }
37
62
  return {
@@ -42,6 +67,14 @@ export function dbPoolCollector(opts) {
42
67
  };
43
68
  }
44
69
  catch {
70
+ if (!warnedLucidMissing) {
71
+ warnedLucidMissing = true;
72
+ log.block(`db_pool: ${bold('@adonisjs/lucid')} is not installed or failed to import`, [
73
+ dim('Install it with:'),
74
+ ` ${bold('node ace add @adonisjs/lucid')}`,
75
+ dim('Pool metrics will report zeros until the package is available.'),
76
+ ]);
77
+ }
45
78
  return { dbPoolUsed: 0, dbPoolFree: 0, dbPoolPending: 0, dbPoolMax: 0 };
46
79
  }
47
80
  },
@@ -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;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAOlD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG,eAAe,CAmC1E"}
@@ -1,4 +1,5 @@
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
@@ -43,14 +44,32 @@ export function httpCollector(opts) {
43
44
  sharedInstance = metrics;
44
45
  return {
45
46
  name: 'http',
46
- collect() {
47
- const m = metrics.getMetrics();
47
+ label: `http — buffer: ${(opts?.maxRecords ?? 10_000).toLocaleString()}, window: ${(opts?.windowMs ?? 60_000) / 1000}s`,
48
+ getConfig() {
48
49
  return {
49
- requestsPerSecond: m.requestsPerSecond,
50
- avgResponseTimeMs: m.averageResponseTimeMs,
51
- errorRate: m.errorRate,
52
- activeHttpConnections: m.activeConnections,
50
+ maxRecords: opts?.maxRecords ?? 10_000,
51
+ windowMs: opts?.windowMs ?? 60_000,
53
52
  };
54
53
  },
54
+ collect() {
55
+ try {
56
+ const m = metrics.getMetrics();
57
+ return {
58
+ requestsPerSecond: m.requestsPerSecond,
59
+ avgResponseTimeMs: m.averageResponseTimeMs,
60
+ errorRate: m.errorRate,
61
+ activeHttpConnections: m.activeConnections,
62
+ };
63
+ }
64
+ catch (error) {
65
+ log.warn(`http collector failed: ${error.message}`);
66
+ return {
67
+ requestsPerSecond: 0,
68
+ avgResponseTimeMs: 0,
69
+ errorRate: 0,
70
+ activeHttpConnections: 0,
71
+ };
72
+ }
73
+ },
55
74
  };
56
75
  }
@@ -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":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAMrD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,IAAI,eAAe,CAoGhD"}
@@ -1,3 +1,7 @@
1
+ import { log, dim, bold } from '../utils/logger.js';
2
+ let warnedNotInstalled = false;
3
+ let warnedPingFailed = false;
4
+ let warnedConnectionError = false;
1
5
  /**
2
6
  * Monitors Redis health, memory, connections, keys, and cache hit rate.
3
7
  *
@@ -16,6 +20,10 @@
16
20
  export function redisCollector() {
17
21
  return {
18
22
  name: 'redis',
23
+ label: 'redis — memory, clients, keys, hit rate',
24
+ getConfig() {
25
+ return {};
26
+ },
19
27
  async collect() {
20
28
  const defaults = {
21
29
  redisOk: false,
@@ -24,11 +32,33 @@ export function redisCollector() {
24
32
  redisKeysCount: 0,
25
33
  redisHitRate: 0,
26
34
  };
35
+ let redis;
36
+ try {
37
+ const mod = await import('@adonisjs/redis/services/main');
38
+ redis = mod.default;
39
+ }
40
+ catch {
41
+ if (!warnedNotInstalled) {
42
+ warnedNotInstalled = true;
43
+ log.block(`Redis collector ${bold('skipped')} — @adonisjs/redis is not installed`, [
44
+ dim('Redis metrics will return defaults until the package is added.'),
45
+ `Run ${bold('node ace add @adonisjs/redis')} to install it.`,
46
+ ]);
47
+ }
48
+ return defaults;
49
+ }
27
50
  try {
28
- const { default: redis } = await import('@adonisjs/redis/services/main');
29
51
  const pong = await redis.ping();
30
- if (pong !== 'PONG')
52
+ if (pong !== 'PONG') {
53
+ if (!warnedPingFailed) {
54
+ warnedPingFailed = true;
55
+ log.block(`Redis collector ${bold('unhealthy')} — PING returned ${bold(String(pong))} instead of PONG`, [
56
+ dim('Redis may be down or misconfigured.'),
57
+ `Check your connection settings in ${bold('config/redis.ts')}.`,
58
+ ]);
59
+ }
31
60
  return defaults;
61
+ }
32
62
  const [memoryInfo, statsInfo, dbSize] = await Promise.all([
33
63
  redis.info('memory'),
34
64
  redis.info('stats'),
@@ -60,7 +90,15 @@ export function redisCollector() {
60
90
  redisHitRate: hitRate,
61
91
  };
62
92
  }
63
- catch {
93
+ catch (error) {
94
+ if (!warnedConnectionError) {
95
+ warnedConnectionError = true;
96
+ const message = error instanceof Error ? error.message : String(error);
97
+ log.block(`Redis collector ${bold('error')} — failed to communicate with Redis`, [
98
+ dim(message),
99
+ `Make sure Redis is running and accessible. Check ${bold('config/redis.ts')} for connection details.`,
100
+ ]);
101
+ }
64
102
  return defaults;
65
103
  }
66
104
  },
@@ -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 {