@geekmidas/telescope 10.0.0-alpha.99 → 10.0.0

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 (480) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/README.md +18 -28
  3. package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts +47 -0
  4. package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts.map +1 -0
  5. package/dist/InMemoryMetricsStorage-C4drxT7G.mjs +247 -0
  6. package/dist/InMemoryMetricsStorage-C4drxT7G.mjs.map +1 -0
  7. package/dist/InMemoryMetricsStorage-D0njWUSi.cjs +252 -0
  8. package/dist/InMemoryMetricsStorage-D0njWUSi.cjs.map +1 -0
  9. package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts +47 -0
  10. package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts.map +1 -0
  11. package/dist/{MetricsAggregator-BJdIvfEv.d.mts → MetricsAggregator-4SqelGcG.d.cts} +6 -3
  12. package/dist/MetricsAggregator-4SqelGcG.d.cts.map +1 -0
  13. package/dist/MetricsAggregator-B7lUICdH.cjs +363 -0
  14. package/dist/MetricsAggregator-B7lUICdH.cjs.map +1 -0
  15. package/dist/{MetricsAggregator-CnC3oT5q.d.cts → MetricsAggregator-DZrW8ls6.d.mts} +6 -3
  16. package/dist/MetricsAggregator-DZrW8ls6.d.mts.map +1 -0
  17. package/dist/MetricsAggregator-S3DQWNas.mjs +357 -0
  18. package/dist/MetricsAggregator-S3DQWNas.mjs.map +1 -0
  19. package/dist/MetricsStorage-B86e4131.d.cts +60 -0
  20. package/dist/MetricsStorage-B86e4131.d.cts.map +1 -0
  21. package/dist/MetricsStorage-BWyP2_12.d.mts +60 -0
  22. package/dist/MetricsStorage-BWyP2_12.d.mts.map +1 -0
  23. package/dist/MetricsStorage-BypQXWiv.mjs +0 -0
  24. package/dist/MetricsStorage-Or8pVCe4.cjs +0 -0
  25. package/dist/Telescope-Cs3fv8jt.cjs +395 -0
  26. package/dist/Telescope-Cs3fv8jt.cjs.map +1 -0
  27. package/dist/{Telescope-BVfDvVvY.d.mts → Telescope-D4nmwDRA.d.cts} +7 -4
  28. package/dist/Telescope-D4nmwDRA.d.cts.map +1 -0
  29. package/dist/Telescope-Dh5av3FC.mjs +389 -0
  30. package/dist/Telescope-Dh5av3FC.mjs.map +1 -0
  31. package/dist/{Telescope-DeqSHfuB.d.cts → Telescope-Dl6VSfxd.d.mts} +7 -4
  32. package/dist/Telescope-Dl6VSfxd.d.mts.map +1 -0
  33. package/dist/Telescope.cjs +4 -385
  34. package/dist/Telescope.d.cts +3 -1
  35. package/dist/Telescope.d.mts +3 -1
  36. package/dist/Telescope.mjs +4 -384
  37. package/dist/adapters/index.d.cts +2 -2
  38. package/dist/adapters/index.d.mts +2 -2
  39. package/dist/adapters/index.mjs +0 -1
  40. package/dist/adapters/lambda.cjs +10 -9
  41. package/dist/adapters/lambda.cjs.map +1 -1
  42. package/dist/adapters/lambda.d.cts +13 -9
  43. package/dist/adapters/lambda.d.cts.map +1 -1
  44. package/dist/adapters/lambda.d.mts +13 -9
  45. package/dist/adapters/lambda.d.mts.map +1 -1
  46. package/dist/adapters/lambda.mjs +4 -3
  47. package/dist/adapters/lambda.mjs.map +1 -1
  48. package/dist/adapters/middy.cjs +4 -236
  49. package/dist/adapters/middy.d.cts +5 -60
  50. package/dist/adapters/middy.d.mts +5 -60
  51. package/dist/adapters/middy.mjs +3 -234
  52. package/dist/adapters/types.d.cts +2 -162
  53. package/dist/adapters/types.d.mts +2 -162
  54. package/dist/adapters/types.mjs +0 -1
  55. package/dist/{rolldown-runtime-VH7oDXx4.cjs → chunk-CUT6urMc.cjs} +10 -8
  56. package/dist/core--quSp5Qr.d.mts +78 -0
  57. package/dist/core--quSp5Qr.d.mts.map +1 -0
  58. package/dist/core-B4Jpia5H.d.cts +78 -0
  59. package/dist/core-B4Jpia5H.d.cts.map +1 -0
  60. package/dist/core-CtVHRJGv.cjs +199 -0
  61. package/dist/core-CtVHRJGv.cjs.map +1 -0
  62. package/dist/core-D6hJ6exL.mjs +139 -0
  63. package/dist/core-D6hJ6exL.mjs.map +1 -0
  64. package/dist/core.cjs +22 -22
  65. package/dist/core.d.cts +4 -4
  66. package/dist/core.d.mts +4 -4
  67. package/dist/core.mjs +4 -3
  68. package/dist/hono--uKQ7Jgi.d.mts +71 -0
  69. package/dist/hono--uKQ7Jgi.d.mts.map +1 -0
  70. package/dist/hono-C4EgpbKQ.cjs +160 -0
  71. package/dist/hono-C4EgpbKQ.cjs.map +1 -0
  72. package/dist/hono-CemCKU87.d.cts +71 -0
  73. package/dist/hono-CemCKU87.d.cts.map +1 -0
  74. package/dist/hono-DxhvnVbF.mjs +136 -0
  75. package/dist/hono-DxhvnVbF.mjs.map +1 -0
  76. package/dist/http-BiNtg85L.d.mts +107 -0
  77. package/dist/http-BiNtg85L.d.mts.map +1 -0
  78. package/dist/http-DQzgLczm.mjs +159 -0
  79. package/dist/http-DQzgLczm.mjs.map +1 -0
  80. package/dist/http-D_Z8sYXZ.cjs +219 -0
  81. package/dist/http-D_Z8sYXZ.cjs.map +1 -0
  82. package/dist/http-Dvca6fC3.d.cts +107 -0
  83. package/dist/http-Dvca6fC3.d.cts.map +1 -0
  84. package/dist/index-BL32-cvv.d.cts +1 -0
  85. package/dist/index-CsuikFeJ.d.mts +1 -0
  86. package/dist/index.cjs +9 -8
  87. package/dist/index.d.cts +6 -5
  88. package/dist/index.d.mts +6 -5
  89. package/dist/index.mjs +7 -5
  90. package/dist/instrumentation/core.cjs +11 -147
  91. package/dist/instrumentation/core.d.cts +3 -74
  92. package/dist/instrumentation/core.d.mts +3 -74
  93. package/dist/instrumentation/core.mjs +2 -137
  94. package/dist/instrumentation/hono.cjs +6 -174
  95. package/dist/instrumentation/hono.d.cts +2 -86
  96. package/dist/instrumentation/hono.d.mts +2 -86
  97. package/dist/instrumentation/hono.mjs +3 -170
  98. package/dist/instrumentation/http.cjs +11 -189
  99. package/dist/instrumentation/http.d.cts +2 -119
  100. package/dist/instrumentation/http.d.mts +2 -119
  101. package/dist/instrumentation/http.mjs +2 -178
  102. package/dist/instrumentation/index.cjs +47 -56
  103. package/dist/instrumentation/index.d.cts +9 -11
  104. package/dist/instrumentation/index.d.mts +9 -11
  105. package/dist/instrumentation/index.mjs +9 -10
  106. package/dist/instrumentation/middleware.cjs +6 -164
  107. package/dist/instrumentation/middleware.d.cts +2 -83
  108. package/dist/instrumentation/middleware.d.mts +2 -83
  109. package/dist/instrumentation/middleware.mjs +3 -160
  110. package/dist/instrumentation/otel.cjs +3 -137
  111. package/dist/instrumentation/otel.d.cts +2 -97
  112. package/dist/instrumentation/otel.d.mts +2 -97
  113. package/dist/instrumentation/otel.mjs +3 -136
  114. package/dist/instrumentation/setup.cjs +4 -142
  115. package/dist/instrumentation/setup.d.cts +3 -139
  116. package/dist/instrumentation/setup.d.mts +3 -139
  117. package/dist/instrumentation/setup.mjs +3 -139
  118. package/dist/instrumentation/tracing.cjs +10 -114
  119. package/dist/instrumentation/tracing.d.cts +2 -49
  120. package/dist/instrumentation/tracing.d.mts +2 -49
  121. package/dist/instrumentation/tracing.mjs +2 -105
  122. package/dist/logger/console.cjs +12 -18
  123. package/dist/logger/console.cjs.map +1 -1
  124. package/dist/logger/console.d.cts +10 -7
  125. package/dist/logger/console.d.cts.map +1 -1
  126. package/dist/logger/console.d.mts +10 -7
  127. package/dist/logger/console.d.mts.map +1 -1
  128. package/dist/logger/console.mjs +11 -17
  129. package/dist/logger/console.mjs.map +1 -1
  130. package/dist/logger/pino.cjs +5 -6
  131. package/dist/logger/pino.cjs.map +1 -1
  132. package/dist/logger/pino.d.cts +10 -6
  133. package/dist/logger/pino.d.cts.map +1 -1
  134. package/dist/logger/pino.d.mts +10 -6
  135. package/dist/logger/pino.d.mts.map +1 -1
  136. package/dist/logger/pino.mjs +3 -2
  137. package/dist/logger/pino.mjs.map +1 -1
  138. package/dist/memory--BK4iWiv.d.cts +40 -0
  139. package/dist/memory--BK4iWiv.d.cts.map +1 -0
  140. package/dist/memory-6S9H-IF5.mjs +123 -0
  141. package/dist/memory-6S9H-IF5.mjs.map +1 -0
  142. package/dist/memory-B0d_n1g5.cjs +129 -0
  143. package/dist/memory-B0d_n1g5.cjs.map +1 -0
  144. package/dist/memory-DCirEVFW.d.mts +40 -0
  145. package/dist/memory-DCirEVFW.d.mts.map +1 -0
  146. package/dist/metrics/MetricsAggregator.cjs +2 -354
  147. package/dist/metrics/MetricsAggregator.d.cts +2 -1
  148. package/dist/metrics/MetricsAggregator.d.mts +2 -1
  149. package/dist/metrics/MetricsAggregator.mjs +2 -353
  150. package/dist/metrics/index.cjs +4 -3
  151. package/dist/metrics/index.d.cts +4 -2
  152. package/dist/metrics/index.d.mts +4 -2
  153. package/dist/metrics/index.mjs +4 -2
  154. package/dist/metrics/storage/InMemoryMetricsStorage.cjs +3 -240
  155. package/dist/metrics/storage/InMemoryMetricsStorage.d.cts +4 -43
  156. package/dist/metrics/storage/InMemoryMetricsStorage.d.mts +4 -43
  157. package/dist/metrics/storage/InMemoryMetricsStorage.mjs +3 -239
  158. package/dist/metrics/storage/MetricsStorage.cjs +1 -0
  159. package/dist/metrics/storage/MetricsStorage.d.cts +3 -56
  160. package/dist/metrics/storage/MetricsStorage.d.mts +3 -56
  161. package/dist/metrics/storage/MetricsStorage.mjs +1 -1
  162. package/dist/metrics/storage/index.cjs +6 -6
  163. package/dist/metrics/storage/index.d.cts +3 -3
  164. package/dist/metrics/storage/index.d.mts +3 -3
  165. package/dist/metrics/storage/index.mjs +5 -4
  166. package/dist/metrics/storage/types.cjs +2 -34
  167. package/dist/metrics/storage/types.d.cts +2 -207
  168. package/dist/metrics/storage/types.d.mts +2 -207
  169. package/dist/metrics/storage/types.mjs +2 -33
  170. package/dist/metrics-D5YT-Rnq.mjs +0 -0
  171. package/dist/metrics-fhD3l3C3.cjs +0 -0
  172. package/dist/middleware-B2jFUukM.cjs +184 -0
  173. package/dist/middleware-B2jFUukM.cjs.map +1 -0
  174. package/dist/middleware-BTDncHwm.mjs +160 -0
  175. package/dist/middleware-BTDncHwm.mjs.map +1 -0
  176. package/dist/middleware-CA84nsNN.d.cts +74 -0
  177. package/dist/middleware-CA84nsNN.d.cts.map +1 -0
  178. package/dist/middleware-DAceVpfw.d.mts +74 -0
  179. package/dist/middleware-DAceVpfw.d.mts.map +1 -0
  180. package/dist/middy-B6Btl8XE.d.mts +64 -0
  181. package/dist/middy-B6Btl8XE.d.mts.map +1 -0
  182. package/dist/middy-BTR3cyvk.mjs +236 -0
  183. package/dist/middy-BTR3cyvk.mjs.map +1 -0
  184. package/dist/middy-Bq0defVg.d.cts +64 -0
  185. package/dist/middy-Bq0defVg.d.cts.map +1 -0
  186. package/dist/middy-y5Zp27eG.cjs +247 -0
  187. package/dist/middy-y5Zp27eG.cjs.map +1 -0
  188. package/dist/otel-1bJPb2Z7.d.mts +101 -0
  189. package/dist/otel-1bJPb2Z7.d.mts.map +1 -0
  190. package/dist/otel-C1HqHA2O.cjs +136 -0
  191. package/dist/otel-C1HqHA2O.cjs.map +1 -0
  192. package/dist/otel-SBVoVEHr.d.cts +101 -0
  193. package/dist/otel-SBVoVEHr.d.cts.map +1 -0
  194. package/dist/otel-wulj5B-X.mjs +130 -0
  195. package/dist/otel-wulj5B-X.mjs.map +1 -0
  196. package/dist/otlp/hono.cjs +15 -9
  197. package/dist/otlp/hono.cjs.map +1 -1
  198. package/dist/otlp/hono.d.cts +13 -3
  199. package/dist/otlp/hono.d.cts.map +1 -1
  200. package/dist/otlp/hono.d.mts +13 -3
  201. package/dist/otlp/hono.d.mts.map +1 -1
  202. package/dist/otlp/hono.mjs +11 -5
  203. package/dist/otlp/hono.mjs.map +1 -1
  204. package/dist/otlp/index.cjs +11 -11
  205. package/dist/otlp/index.d.cts +7 -4
  206. package/dist/otlp/index.d.mts +7 -4
  207. package/dist/otlp/index.mjs +5 -4
  208. package/dist/otlp/receiver.cjs +4 -88
  209. package/dist/otlp/receiver.d.cts +7 -59
  210. package/dist/otlp/receiver.d.mts +7 -59
  211. package/dist/otlp/receiver.mjs +4 -87
  212. package/dist/otlp/transformer.cjs +5 -214
  213. package/dist/otlp/transformer.d.cts +3 -1
  214. package/dist/otlp/transformer.d.mts +3 -1
  215. package/dist/otlp/transformer.mjs +3 -211
  216. package/dist/otlp/types.cjs +5 -57
  217. package/dist/otlp/types.d.cts +1 -1
  218. package/dist/otlp/types.d.mts +1 -1
  219. package/dist/otlp/types.mjs +2 -53
  220. package/dist/receiver-Cj1lbAOO.cjs +94 -0
  221. package/dist/receiver-Cj1lbAOO.cjs.map +1 -0
  222. package/dist/receiver-CxVd_9CB.mjs +89 -0
  223. package/dist/receiver-CxVd_9CB.mjs.map +1 -0
  224. package/dist/receiver-DLICx5uU.d.cts +63 -0
  225. package/dist/receiver-DLICx5uU.d.cts.map +1 -0
  226. package/dist/receiver-UeZT-H8u.d.mts +63 -0
  227. package/dist/receiver-UeZT-H8u.d.mts.map +1 -0
  228. package/dist/redact-BzkITCNW.mjs +83 -0
  229. package/dist/redact-BzkITCNW.mjs.map +1 -0
  230. package/dist/redact-DVaSSPZT.cjs +95 -0
  231. package/dist/redact-DVaSSPZT.cjs.map +1 -0
  232. package/dist/redact.cjs +3 -84
  233. package/dist/redact.d.cts +8 -4
  234. package/dist/redact.d.cts.map +1 -1
  235. package/dist/redact.d.mts +8 -4
  236. package/dist/redact.d.mts.map +1 -1
  237. package/dist/redact.mjs +2 -80
  238. package/dist/server/hono.cjs +54 -33
  239. package/dist/server/hono.cjs.map +1 -1
  240. package/dist/server/hono.d.cts +14 -19
  241. package/dist/server/hono.d.cts.map +1 -1
  242. package/dist/server/hono.d.mts +14 -19
  243. package/dist/server/hono.d.mts.map +1 -1
  244. package/dist/server/hono.mjs +52 -31
  245. package/dist/server/hono.mjs.map +1 -1
  246. package/dist/setup-B9jM77Qk.mjs +98 -0
  247. package/dist/setup-B9jM77Qk.mjs.map +1 -0
  248. package/dist/setup-Bkxm4g6b.d.mts +87 -0
  249. package/dist/setup-Bkxm4g6b.d.mts.map +1 -0
  250. package/dist/setup-CYpff5B9.cjs +110 -0
  251. package/dist/setup-CYpff5B9.cjs.map +1 -0
  252. package/dist/setup-D58N1f9O.d.cts +87 -0
  253. package/dist/setup-D58N1f9O.d.cts.map +1 -0
  254. package/dist/storage/kysely.cjs +70 -82
  255. package/dist/storage/kysely.cjs.map +1 -1
  256. package/dist/storage/kysely.d.cts +20 -36
  257. package/dist/storage/kysely.d.cts.map +1 -1
  258. package/dist/storage/kysely.d.mts +20 -36
  259. package/dist/storage/kysely.d.mts.map +1 -1
  260. package/dist/storage/kysely.mjs +69 -81
  261. package/dist/storage/kysely.mjs.map +1 -1
  262. package/dist/storage/memory.cjs +2 -122
  263. package/dist/storage/memory.d.cts +3 -36
  264. package/dist/storage/memory.d.mts +3 -36
  265. package/dist/storage/memory.mjs +2 -121
  266. package/dist/tracing-BX8uY2nR.d.cts +53 -0
  267. package/dist/tracing-BX8uY2nR.d.cts.map +1 -0
  268. package/dist/tracing-Bt1zWRlb.cjs +167 -0
  269. package/dist/tracing-Bt1zWRlb.cjs.map +1 -0
  270. package/dist/tracing-Cijm_5NI.mjs +113 -0
  271. package/dist/tracing-Cijm_5NI.mjs.map +1 -0
  272. package/dist/tracing-PnECEbEu.d.mts +53 -0
  273. package/dist/tracing-PnECEbEu.d.mts.map +1 -0
  274. package/dist/transformer-BXQPhzql.mjs +215 -0
  275. package/dist/transformer-BXQPhzql.mjs.map +1 -0
  276. package/dist/transformer-CLGZ0EQc.cjs +232 -0
  277. package/dist/transformer-CLGZ0EQc.cjs.map +1 -0
  278. package/dist/{transformer-BtqjAs0b.d.cts → transformer-CTGsaVfV.d.mts} +8 -4
  279. package/dist/transformer-CTGsaVfV.d.mts.map +1 -0
  280. package/dist/{transformer-DI6t8-YA.d.mts → transformer-ICEbxpFf.d.cts} +8 -4
  281. package/dist/transformer-ICEbxpFf.d.cts.map +1 -0
  282. package/dist/{types-BVujq4zd.d.mts → types-B1EIa_cQ.d.mts} +4 -3
  283. package/dist/types-B1EIa_cQ.d.mts.map +1 -0
  284. package/dist/types-BRzW1NM8.d.cts +166 -0
  285. package/dist/types-BRzW1NM8.d.cts.map +1 -0
  286. package/dist/types-BS3Rx8Sk.d.cts +209 -0
  287. package/dist/types-BS3Rx8Sk.d.cts.map +1 -0
  288. package/dist/types-Bwm_jNU7.mjs +54 -0
  289. package/dist/types-Bwm_jNU7.mjs.map +1 -0
  290. package/dist/types-BzQ78Efw.d.mts +166 -0
  291. package/dist/types-BzQ78Efw.d.mts.map +1 -0
  292. package/dist/types-CbNGXnJE.d.mts +209 -0
  293. package/dist/types-CbNGXnJE.d.mts.map +1 -0
  294. package/dist/{types-DVETVdpa.d.cts → types-CmOB7CLO.d.cts} +7 -6
  295. package/dist/types-CmOB7CLO.d.cts.map +1 -0
  296. package/dist/{types-DVETVdpa.d.mts → types-DBc0q5KD.d.mts} +7 -6
  297. package/dist/types-DBc0q5KD.d.mts.map +1 -0
  298. package/dist/types-Dsh-DIO_.cjs +78 -0
  299. package/dist/types-Dsh-DIO_.cjs.map +1 -0
  300. package/dist/types-ZW-nfWf6.cjs +40 -0
  301. package/dist/types-ZW-nfWf6.cjs.map +1 -0
  302. package/dist/{types-BVujq4zd.d.cts → types-l7Rlb5Mg.d.cts} +4 -3
  303. package/dist/types-l7Rlb5Mg.d.cts.map +1 -0
  304. package/dist/types-ojhnLdwz.mjs +34 -0
  305. package/dist/types-ojhnLdwz.mjs.map +1 -0
  306. package/dist/types.d.cts +1 -1
  307. package/dist/types.d.mts +1 -1
  308. package/dist/types.mjs +0 -1
  309. package/dist/ui-assets-BEXqOQLe.cjs +48 -0
  310. package/dist/ui-assets-BEXqOQLe.cjs.map +1 -0
  311. package/dist/ui-assets-BhTDUsrM.mjs +30 -0
  312. package/dist/ui-assets-BhTDUsrM.mjs.map +1 -0
  313. package/dist/ui-assets.cjs +5 -0
  314. package/dist/ui-assets.d.cts +13 -0
  315. package/dist/ui-assets.d.cts.map +1 -0
  316. package/dist/ui-assets.d.mts +13 -0
  317. package/dist/ui-assets.d.mts.map +1 -0
  318. package/dist/ui-assets.mjs +3 -0
  319. package/package.json +46 -46
  320. package/src/Telescope.ts +561 -0
  321. package/src/__tests__/Telescope.spec.ts +438 -0
  322. package/src/__tests__/pino-transport.spec.ts +115 -0
  323. package/src/__tests__/redact.spec.ts +336 -0
  324. package/src/adapters/__tests__/lambda.spec.ts +318 -0
  325. package/src/adapters/__tests__/middy.spec.ts +741 -0
  326. package/src/adapters/index.ts +22 -0
  327. package/src/adapters/lambda.ts +432 -0
  328. package/src/adapters/middy.ts +402 -0
  329. package/src/adapters/types.ts +181 -0
  330. package/src/core.ts +51 -0
  331. package/src/index.ts +34 -0
  332. package/src/instrumentation/__tests__/core.spec.ts +248 -0
  333. package/src/instrumentation/__tests__/hono.spec.ts +348 -0
  334. package/src/instrumentation/__tests__/middleware.spec.ts +528 -0
  335. package/src/instrumentation/__tests__/otel.spec.ts +291 -0
  336. package/src/instrumentation/__tests__/tracing.spec.ts +208 -0
  337. package/src/instrumentation/core.ts +228 -0
  338. package/src/instrumentation/hono.ts +270 -0
  339. package/src/instrumentation/http.ts +306 -0
  340. package/src/instrumentation/index.ts +90 -0
  341. package/src/instrumentation/middleware.ts +297 -0
  342. package/src/instrumentation/otel.ts +271 -0
  343. package/src/instrumentation/setup.ts +246 -0
  344. package/src/instrumentation/tracing.ts +145 -0
  345. package/src/logger/__tests__/console.spec.ts +366 -0
  346. package/src/logger/__tests__/pino.spec.ts +217 -0
  347. package/src/logger/console.ts +230 -0
  348. package/src/logger/pino.ts +201 -0
  349. package/src/metrics/MetricsAggregator.ts +555 -0
  350. package/src/metrics/__tests__/MetricsAggregator.spec.ts +298 -0
  351. package/src/metrics/index.ts +2 -0
  352. package/src/metrics/storage/InMemoryMetricsStorage.ts +380 -0
  353. package/src/metrics/storage/MetricsStorage.ts +74 -0
  354. package/src/metrics/storage/index.ts +3 -0
  355. package/src/metrics/storage/types.ts +243 -0
  356. package/src/otlp/__tests__/receiver.spec.ts +367 -0
  357. package/src/otlp/__tests__/transformer.spec.ts +455 -0
  358. package/src/otlp/hono.ts +120 -0
  359. package/src/otlp/index.ts +22 -0
  360. package/src/otlp/receiver.ts +162 -0
  361. package/src/otlp/transformer.ts +367 -0
  362. package/src/otlp/types.ts +364 -0
  363. package/src/redact.ts +116 -0
  364. package/src/server/__tests__/hono.spec.ts +814 -0
  365. package/src/server/hono.ts +442 -0
  366. package/src/storage/__tests__/kysely.spec.ts +715 -0
  367. package/src/storage/__tests__/memory.spec.ts +694 -0
  368. package/src/storage/kysely.ts +599 -0
  369. package/src/storage/memory.ts +204 -0
  370. package/src/types.ts +447 -0
  371. package/src/ui-assets.ts +40 -0
  372. package/tsconfig.json +9 -0
  373. package/ui/CHANGELOG.md +7 -0
  374. package/ui/index.html +12 -0
  375. package/ui/node_modules/.bin/tsc +21 -0
  376. package/ui/node_modules/.bin/tsserver +21 -0
  377. package/ui/node_modules/.bin/vite +21 -0
  378. package/ui/package.json +24 -0
  379. package/ui/src/App.tsx +595 -0
  380. package/ui/src/api.ts +88 -0
  381. package/ui/src/components/ExceptionDetail.tsx +100 -0
  382. package/ui/src/components/FilterBar.tsx +162 -0
  383. package/ui/src/components/LogDetail.tsx +91 -0
  384. package/ui/src/components/RequestDetail.tsx +143 -0
  385. package/ui/src/main.tsx +10 -0
  386. package/ui/src/styles.css +11 -0
  387. package/ui/src/types.ts +63 -0
  388. package/ui/src/vite-env.d.ts +1 -0
  389. package/ui/src/vite-plugin-gkm-config.ts +54 -0
  390. package/ui/tsconfig.json +20 -0
  391. package/ui/tsconfig.tsbuildinfo +1 -0
  392. package/ui/vite.config.ts +13 -0
  393. package/dist/MetricsAggregator-BJdIvfEv.d.mts.map +0 -1
  394. package/dist/MetricsAggregator-CnC3oT5q.d.cts.map +0 -1
  395. package/dist/Telescope-BVfDvVvY.d.mts.map +0 -1
  396. package/dist/Telescope-DeqSHfuB.d.cts.map +0 -1
  397. package/dist/Telescope.cjs.map +0 -1
  398. package/dist/Telescope.mjs.map +0 -1
  399. package/dist/adapters/middy.cjs.map +0 -1
  400. package/dist/adapters/middy.d.cts.map +0 -1
  401. package/dist/adapters/middy.d.mts.map +0 -1
  402. package/dist/adapters/middy.mjs.map +0 -1
  403. package/dist/adapters/types.d.cts.map +0 -1
  404. package/dist/adapters/types.d.mts.map +0 -1
  405. package/dist/instrumentation/core.cjs.map +0 -1
  406. package/dist/instrumentation/core.d.cts.map +0 -1
  407. package/dist/instrumentation/core.d.mts.map +0 -1
  408. package/dist/instrumentation/core.mjs.map +0 -1
  409. package/dist/instrumentation/hono.cjs.map +0 -1
  410. package/dist/instrumentation/hono.d.cts.map +0 -1
  411. package/dist/instrumentation/hono.d.mts.map +0 -1
  412. package/dist/instrumentation/hono.mjs.map +0 -1
  413. package/dist/instrumentation/http.cjs.map +0 -1
  414. package/dist/instrumentation/http.d.cts.map +0 -1
  415. package/dist/instrumentation/http.d.mts.map +0 -1
  416. package/dist/instrumentation/http.mjs.map +0 -1
  417. package/dist/instrumentation/middleware.cjs.map +0 -1
  418. package/dist/instrumentation/middleware.d.cts.map +0 -1
  419. package/dist/instrumentation/middleware.d.mts.map +0 -1
  420. package/dist/instrumentation/middleware.mjs.map +0 -1
  421. package/dist/instrumentation/otel.cjs.map +0 -1
  422. package/dist/instrumentation/otel.d.cts.map +0 -1
  423. package/dist/instrumentation/otel.d.mts.map +0 -1
  424. package/dist/instrumentation/otel.mjs.map +0 -1
  425. package/dist/instrumentation/sampler.cjs +0 -54
  426. package/dist/instrumentation/sampler.cjs.map +0 -1
  427. package/dist/instrumentation/sampler.d.cts +0 -38
  428. package/dist/instrumentation/sampler.d.cts.map +0 -1
  429. package/dist/instrumentation/sampler.d.mts +0 -38
  430. package/dist/instrumentation/sampler.d.mts.map +0 -1
  431. package/dist/instrumentation/sampler.mjs +0 -52
  432. package/dist/instrumentation/sampler.mjs.map +0 -1
  433. package/dist/instrumentation/setup.cjs.map +0 -1
  434. package/dist/instrumentation/setup.d.cts.map +0 -1
  435. package/dist/instrumentation/setup.d.mts.map +0 -1
  436. package/dist/instrumentation/setup.mjs.map +0 -1
  437. package/dist/instrumentation/tracing.cjs.map +0 -1
  438. package/dist/instrumentation/tracing.d.cts.map +0 -1
  439. package/dist/instrumentation/tracing.d.mts.map +0 -1
  440. package/dist/instrumentation/tracing.mjs.map +0 -1
  441. package/dist/instrumentation/trust.cjs +0 -107
  442. package/dist/instrumentation/trust.cjs.map +0 -1
  443. package/dist/instrumentation/trust.d.cts +0 -57
  444. package/dist/instrumentation/trust.d.cts.map +0 -1
  445. package/dist/instrumentation/trust.d.mts +0 -57
  446. package/dist/instrumentation/trust.d.mts.map +0 -1
  447. package/dist/instrumentation/trust.mjs +0 -104
  448. package/dist/instrumentation/trust.mjs.map +0 -1
  449. package/dist/metrics/MetricsAggregator.cjs.map +0 -1
  450. package/dist/metrics/MetricsAggregator.mjs.map +0 -1
  451. package/dist/metrics/storage/InMemoryMetricsStorage.cjs.map +0 -1
  452. package/dist/metrics/storage/InMemoryMetricsStorage.d.cts.map +0 -1
  453. package/dist/metrics/storage/InMemoryMetricsStorage.d.mts.map +0 -1
  454. package/dist/metrics/storage/InMemoryMetricsStorage.mjs.map +0 -1
  455. package/dist/metrics/storage/MetricsStorage.d.cts.map +0 -1
  456. package/dist/metrics/storage/MetricsStorage.d.mts.map +0 -1
  457. package/dist/metrics/storage/types.cjs.map +0 -1
  458. package/dist/metrics/storage/types.d.cts.map +0 -1
  459. package/dist/metrics/storage/types.d.mts.map +0 -1
  460. package/dist/metrics/storage/types.mjs.map +0 -1
  461. package/dist/otlp/receiver.cjs.map +0 -1
  462. package/dist/otlp/receiver.d.cts.map +0 -1
  463. package/dist/otlp/receiver.d.mts.map +0 -1
  464. package/dist/otlp/receiver.mjs.map +0 -1
  465. package/dist/otlp/transformer.cjs.map +0 -1
  466. package/dist/otlp/transformer.mjs.map +0 -1
  467. package/dist/otlp/types.cjs.map +0 -1
  468. package/dist/otlp/types.mjs.map +0 -1
  469. package/dist/redact.cjs.map +0 -1
  470. package/dist/redact.mjs.map +0 -1
  471. package/dist/storage/memory.cjs.map +0 -1
  472. package/dist/storage/memory.d.cts.map +0 -1
  473. package/dist/storage/memory.d.mts.map +0 -1
  474. package/dist/storage/memory.mjs.map +0 -1
  475. package/dist/transformer-BtqjAs0b.d.cts.map +0 -1
  476. package/dist/transformer-DI6t8-YA.d.mts.map +0 -1
  477. package/dist/types-BVujq4zd.d.cts.map +0 -1
  478. package/dist/types-BVujq4zd.d.mts.map +0 -1
  479. package/dist/types-DVETVdpa.d.cts.map +0 -1
  480. package/dist/types-DVETVdpa.d.mts.map +0 -1
@@ -0,0 +1,694 @@
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
+ import type { ExceptionEntry, LogEntry, RequestEntry } from '../../types';
3
+ import { InMemoryStorage } from '../memory';
4
+
5
+ describe('InMemoryStorage', () => {
6
+ let storage: InMemoryStorage;
7
+
8
+ beforeEach(() => {
9
+ storage = new InMemoryStorage();
10
+ });
11
+
12
+ describe('requests', () => {
13
+ const createRequest = (
14
+ overrides: Partial<RequestEntry> = {},
15
+ ): RequestEntry => ({
16
+ id: `req-${Math.random().toString(36).slice(2)}`,
17
+ method: 'GET',
18
+ path: '/api/users',
19
+ url: 'http://localhost:3000/api/users',
20
+ headers: { 'content-type': 'application/json' },
21
+ query: {},
22
+ status: 200,
23
+ responseHeaders: {},
24
+ duration: 50,
25
+ timestamp: new Date(),
26
+ ...overrides,
27
+ });
28
+
29
+ it('should save and retrieve a request', async () => {
30
+ const request = createRequest({ id: 'req-123' });
31
+ await storage.saveRequest(request);
32
+
33
+ const retrieved = await storage.getRequest('req-123');
34
+ expect(retrieved).toEqual(request);
35
+ });
36
+
37
+ it('should return null for non-existent request', async () => {
38
+ const result = await storage.getRequest('non-existent');
39
+ expect(result).toBeNull();
40
+ });
41
+
42
+ it('should list requests in reverse chronological order', async () => {
43
+ const req1 = createRequest({
44
+ id: 'req-1',
45
+ timestamp: new Date('2024-01-01T10:00:00Z'),
46
+ });
47
+ const req2 = createRequest({
48
+ id: 'req-2',
49
+ timestamp: new Date('2024-01-01T11:00:00Z'),
50
+ });
51
+ const req3 = createRequest({
52
+ id: 'req-3',
53
+ timestamp: new Date('2024-01-01T12:00:00Z'),
54
+ });
55
+
56
+ await storage.saveRequest(req1);
57
+ await storage.saveRequest(req2);
58
+ await storage.saveRequest(req3);
59
+
60
+ const requests = await storage.getRequests();
61
+ expect(requests.map((r) => r.id)).toEqual(['req-3', 'req-2', 'req-1']);
62
+ });
63
+
64
+ it('should respect limit and offset options', async () => {
65
+ for (let i = 0; i < 10; i++) {
66
+ await storage.saveRequest(
67
+ createRequest({
68
+ id: `req-${i}`,
69
+ timestamp: new Date(Date.now() + i * 1000),
70
+ }),
71
+ );
72
+ }
73
+
74
+ const page1 = await storage.getRequests({ limit: 3, offset: 0 });
75
+ expect(page1).toHaveLength(3);
76
+ expect(page1[0].id).toBe('req-9');
77
+
78
+ const page2 = await storage.getRequests({ limit: 3, offset: 3 });
79
+ expect(page2).toHaveLength(3);
80
+ expect(page2[0].id).toBe('req-6');
81
+ });
82
+
83
+ it('should filter by search term in path', async () => {
84
+ await storage.saveRequest(
85
+ createRequest({
86
+ id: 'req-1',
87
+ path: '/api/users',
88
+ url: 'http://localhost/api/users',
89
+ }),
90
+ );
91
+ await storage.saveRequest(
92
+ createRequest({
93
+ id: 'req-2',
94
+ path: '/api/posts',
95
+ url: 'http://localhost/api/posts',
96
+ }),
97
+ );
98
+ await storage.saveRequest(
99
+ createRequest({
100
+ id: 'req-3',
101
+ path: '/api/orders',
102
+ url: 'http://localhost/api/orders',
103
+ }),
104
+ );
105
+
106
+ const results = await storage.getRequests({ search: 'posts' });
107
+ expect(results).toHaveLength(1);
108
+ expect(results[0].id).toBe('req-2');
109
+ });
110
+
111
+ it('should filter by date range', async () => {
112
+ await storage.saveRequest(
113
+ createRequest({ id: 'req-1', timestamp: new Date('2024-01-01') }),
114
+ );
115
+ await storage.saveRequest(
116
+ createRequest({ id: 'req-2', timestamp: new Date('2024-01-15') }),
117
+ );
118
+ await storage.saveRequest(
119
+ createRequest({ id: 'req-3', timestamp: new Date('2024-02-01') }),
120
+ );
121
+
122
+ const results = await storage.getRequests({
123
+ after: new Date('2024-01-10'),
124
+ before: new Date('2024-01-20'),
125
+ });
126
+
127
+ expect(results).toHaveLength(1);
128
+ expect(results[0].id).toBe('req-2');
129
+ });
130
+
131
+ it('should filter by tags', async () => {
132
+ await storage.saveRequest(
133
+ createRequest({ id: 'req-1', tags: ['auth', 'api'] }),
134
+ );
135
+ await storage.saveRequest(createRequest({ id: 'req-2', tags: ['api'] }));
136
+ await storage.saveRequest(
137
+ createRequest({ id: 'req-3', tags: ['admin'] }),
138
+ );
139
+
140
+ const results = await storage.getRequests({ tags: ['auth'] });
141
+ expect(results).toHaveLength(1);
142
+ expect(results[0].id).toBe('req-1');
143
+ });
144
+
145
+ it('should enforce maxEntries limit', async () => {
146
+ const smallStorage = new InMemoryStorage({ maxEntries: 5 });
147
+
148
+ for (let i = 0; i < 10; i++) {
149
+ await smallStorage.saveRequest(
150
+ createRequest({
151
+ id: `req-${i}`,
152
+ timestamp: new Date(Date.now() + i * 1000),
153
+ }),
154
+ );
155
+ }
156
+
157
+ const requests = await smallStorage.getRequests();
158
+ expect(requests).toHaveLength(5);
159
+ // Should keep the newest entries
160
+ expect(requests[0].id).toBe('req-9');
161
+ expect(requests[4].id).toBe('req-5');
162
+ });
163
+ });
164
+
165
+ describe('exceptions', () => {
166
+ const createException = (
167
+ overrides: Partial<ExceptionEntry> = {},
168
+ ): ExceptionEntry => ({
169
+ id: `exc-${Math.random().toString(36).slice(2)}`,
170
+ name: 'Error',
171
+ message: 'Something went wrong',
172
+ stack: [
173
+ {
174
+ file: '/app/src/index.ts',
175
+ line: 10,
176
+ column: 5,
177
+ function: 'main',
178
+ isApp: true,
179
+ },
180
+ ],
181
+ timestamp: new Date(),
182
+ handled: false,
183
+ ...overrides,
184
+ });
185
+
186
+ it('should save and retrieve an exception', async () => {
187
+ const exception = createException({ id: 'exc-123' });
188
+ await storage.saveException(exception);
189
+
190
+ const retrieved = await storage.getException('exc-123');
191
+ expect(retrieved).toEqual(exception);
192
+ });
193
+
194
+ it('should return null for non-existent exception', async () => {
195
+ const result = await storage.getException('non-existent');
196
+ expect(result).toBeNull();
197
+ });
198
+
199
+ it('should list exceptions in reverse chronological order', async () => {
200
+ await storage.saveException(
201
+ createException({
202
+ id: 'exc-1',
203
+ timestamp: new Date('2024-01-01T10:00:00Z'),
204
+ }),
205
+ );
206
+ await storage.saveException(
207
+ createException({
208
+ id: 'exc-2',
209
+ timestamp: new Date('2024-01-01T11:00:00Z'),
210
+ }),
211
+ );
212
+
213
+ const exceptions = await storage.getExceptions();
214
+ expect(exceptions.map((e) => e.id)).toEqual(['exc-2', 'exc-1']);
215
+ });
216
+
217
+ it('should filter exceptions by search term in message', async () => {
218
+ await storage.saveException(
219
+ createException({ id: 'exc-1', message: 'Database connection failed' }),
220
+ );
221
+ await storage.saveException(
222
+ createException({ id: 'exc-2', message: 'Invalid user input' }),
223
+ );
224
+
225
+ const results = await storage.getExceptions({ search: 'database' });
226
+ expect(results).toHaveLength(1);
227
+ expect(results[0].id).toBe('exc-1');
228
+ });
229
+ });
230
+
231
+ describe('logs', () => {
232
+ const createLog = (overrides: Partial<LogEntry> = {}): LogEntry => ({
233
+ id: `log-${Math.random().toString(36).slice(2)}`,
234
+ level: 'info',
235
+ message: 'Test log message',
236
+ timestamp: new Date(),
237
+ ...overrides,
238
+ });
239
+
240
+ it('should save and retrieve logs', async () => {
241
+ await storage.saveLog(createLog({ id: 'log-1', message: 'First log' }));
242
+ await storage.saveLog(createLog({ id: 'log-2', message: 'Second log' }));
243
+
244
+ const logs = await storage.getLogs();
245
+ expect(logs).toHaveLength(2);
246
+ });
247
+
248
+ it('should filter logs by level via search', async () => {
249
+ await storage.saveLog(createLog({ id: 'log-1', level: 'debug' }));
250
+ await storage.saveLog(createLog({ id: 'log-2', level: 'error' }));
251
+ await storage.saveLog(createLog({ id: 'log-3', level: 'error' }));
252
+
253
+ const results = await storage.getLogs({ search: 'error' });
254
+ expect(results).toHaveLength(2);
255
+ });
256
+
257
+ it('should include context in logs', async () => {
258
+ await storage.saveLog(
259
+ createLog({
260
+ id: 'log-1',
261
+ context: { userId: '123', action: 'login' },
262
+ }),
263
+ );
264
+
265
+ const logs = await storage.getLogs();
266
+ expect(logs[0].context).toEqual({ userId: '123', action: 'login' });
267
+ });
268
+ });
269
+
270
+ describe('prune', () => {
271
+ it('should remove entries older than specified date', async () => {
272
+ const oldDate = new Date('2024-01-01');
273
+ const newDate = new Date('2024-06-01');
274
+
275
+ await storage.saveRequest({
276
+ id: 'req-old',
277
+ method: 'GET',
278
+ path: '/old',
279
+ url: 'http://localhost/old',
280
+ headers: {},
281
+ query: {},
282
+ status: 200,
283
+ responseHeaders: {},
284
+ duration: 10,
285
+ timestamp: oldDate,
286
+ });
287
+
288
+ await storage.saveRequest({
289
+ id: 'req-new',
290
+ method: 'GET',
291
+ path: '/new',
292
+ url: 'http://localhost/new',
293
+ headers: {},
294
+ query: {},
295
+ status: 200,
296
+ responseHeaders: {},
297
+ duration: 10,
298
+ timestamp: newDate,
299
+ });
300
+
301
+ await storage.saveException({
302
+ id: 'exc-old',
303
+ name: 'Error',
304
+ message: 'Old error',
305
+ stack: [],
306
+ timestamp: oldDate,
307
+ handled: false,
308
+ });
309
+
310
+ await storage.saveLog({
311
+ id: 'log-old',
312
+ level: 'info',
313
+ message: 'Old log',
314
+ timestamp: oldDate,
315
+ });
316
+
317
+ const pruneDate = new Date('2024-03-01');
318
+ const deleted = await storage.prune(pruneDate);
319
+
320
+ expect(deleted).toBe(3);
321
+
322
+ const requests = await storage.getRequests();
323
+ expect(requests).toHaveLength(1);
324
+ expect(requests[0].id).toBe('req-new');
325
+
326
+ const exceptions = await storage.getExceptions();
327
+ expect(exceptions).toHaveLength(0);
328
+
329
+ const logs = await storage.getLogs();
330
+ expect(logs).toHaveLength(0);
331
+ });
332
+ });
333
+
334
+ describe('getStats', () => {
335
+ it('should return correct statistics', async () => {
336
+ await storage.saveRequest({
337
+ id: 'req-1',
338
+ method: 'GET',
339
+ path: '/api',
340
+ url: 'http://localhost/api',
341
+ headers: {},
342
+ query: {},
343
+ status: 200,
344
+ responseHeaders: {},
345
+ duration: 10,
346
+ timestamp: new Date(),
347
+ });
348
+
349
+ await storage.saveException({
350
+ id: 'exc-1',
351
+ name: 'Error',
352
+ message: 'Test',
353
+ stack: [],
354
+ timestamp: new Date(),
355
+ handled: false,
356
+ });
357
+
358
+ await storage.saveLog({
359
+ id: 'log-1',
360
+ level: 'info',
361
+ message: 'Test',
362
+ timestamp: new Date(),
363
+ });
364
+ await storage.saveLog({
365
+ id: 'log-2',
366
+ level: 'error',
367
+ message: 'Test',
368
+ timestamp: new Date(),
369
+ });
370
+
371
+ const stats = await storage.getStats();
372
+
373
+ expect(stats.requests).toBe(1);
374
+ expect(stats.exceptions).toBe(1);
375
+ expect(stats.logs).toBe(2);
376
+ });
377
+ });
378
+
379
+ describe('clear', () => {
380
+ it('should remove all entries', async () => {
381
+ await storage.saveRequest({
382
+ id: 'req-1',
383
+ method: 'GET',
384
+ path: '/api',
385
+ url: 'http://localhost/api',
386
+ headers: {},
387
+ query: {},
388
+ status: 200,
389
+ responseHeaders: {},
390
+ duration: 10,
391
+ timestamp: new Date(),
392
+ });
393
+
394
+ await storage.saveException({
395
+ id: 'exc-1',
396
+ name: 'Error',
397
+ message: 'Test',
398
+ stack: [],
399
+ timestamp: new Date(),
400
+ handled: false,
401
+ });
402
+
403
+ storage.clear();
404
+
405
+ const stats = await storage.getStats();
406
+ expect(stats.requests).toBe(0);
407
+ expect(stats.exceptions).toBe(0);
408
+ expect(stats.logs).toBe(0);
409
+ });
410
+ });
411
+
412
+ describe('bulk operations', () => {
413
+ it('should save multiple requests at once', async () => {
414
+ await storage.saveRequests([
415
+ {
416
+ id: 'req-1',
417
+ method: 'GET',
418
+ path: '/api/a',
419
+ url: 'http://localhost/api/a',
420
+ headers: {},
421
+ query: {},
422
+ status: 200,
423
+ responseHeaders: {},
424
+ duration: 10,
425
+ timestamp: new Date(),
426
+ },
427
+ {
428
+ id: 'req-2',
429
+ method: 'POST',
430
+ path: '/api/b',
431
+ url: 'http://localhost/api/b',
432
+ headers: {},
433
+ query: {},
434
+ status: 201,
435
+ responseHeaders: {},
436
+ duration: 20,
437
+ timestamp: new Date(),
438
+ },
439
+ ]);
440
+
441
+ const requests = await storage.getRequests();
442
+ expect(requests).toHaveLength(2);
443
+ });
444
+
445
+ it('should save multiple exceptions at once', async () => {
446
+ await storage.saveExceptions([
447
+ {
448
+ id: 'exc-1',
449
+ name: 'Error',
450
+ message: 'First',
451
+ stack: [],
452
+ timestamp: new Date(),
453
+ handled: false,
454
+ },
455
+ {
456
+ id: 'exc-2',
457
+ name: 'Error',
458
+ message: 'Second',
459
+ stack: [],
460
+ timestamp: new Date(),
461
+ handled: true,
462
+ },
463
+ ]);
464
+
465
+ const exceptions = await storage.getExceptions();
466
+ expect(exceptions).toHaveLength(2);
467
+ });
468
+
469
+ it('should save multiple logs at once', async () => {
470
+ await storage.saveLogs([
471
+ { id: 'log-1', level: 'info', message: 'First', timestamp: new Date() },
472
+ {
473
+ id: 'log-2',
474
+ level: 'error',
475
+ message: 'Second',
476
+ timestamp: new Date(),
477
+ },
478
+ ]);
479
+
480
+ const logs = await storage.getLogs();
481
+ expect(logs).toHaveLength(2);
482
+ });
483
+ });
484
+
485
+ describe('request filters', () => {
486
+ it('should filter by HTTP method', async () => {
487
+ await storage.saveRequest({
488
+ id: 'req-1',
489
+ method: 'GET',
490
+ path: '/api',
491
+ url: 'http://localhost/api',
492
+ headers: {},
493
+ query: {},
494
+ status: 200,
495
+ responseHeaders: {},
496
+ duration: 10,
497
+ timestamp: new Date(),
498
+ });
499
+ await storage.saveRequest({
500
+ id: 'req-2',
501
+ method: 'POST',
502
+ path: '/api',
503
+ url: 'http://localhost/api',
504
+ headers: {},
505
+ query: {},
506
+ status: 201,
507
+ responseHeaders: {},
508
+ duration: 10,
509
+ timestamp: new Date(),
510
+ });
511
+
512
+ const getRequests = await storage.getRequests({ method: 'GET' });
513
+ expect(getRequests).toHaveLength(1);
514
+ expect(getRequests[0].id).toBe('req-1');
515
+ });
516
+
517
+ it('should filter by exact status code', async () => {
518
+ await storage.saveRequest({
519
+ id: 'req-1',
520
+ method: 'GET',
521
+ path: '/api',
522
+ url: 'http://localhost/api',
523
+ headers: {},
524
+ query: {},
525
+ status: 200,
526
+ responseHeaders: {},
527
+ duration: 10,
528
+ timestamp: new Date(),
529
+ });
530
+ await storage.saveRequest({
531
+ id: 'req-2',
532
+ method: 'GET',
533
+ path: '/api',
534
+ url: 'http://localhost/api',
535
+ headers: {},
536
+ query: {},
537
+ status: 404,
538
+ responseHeaders: {},
539
+ duration: 10,
540
+ timestamp: new Date(),
541
+ });
542
+
543
+ const notFoundRequests = await storage.getRequests({ status: '404' });
544
+ expect(notFoundRequests).toHaveLength(1);
545
+ expect(notFoundRequests[0].id).toBe('req-2');
546
+ });
547
+
548
+ it('should filter by status category (2xx)', async () => {
549
+ await storage.saveRequest({
550
+ id: 'req-1',
551
+ method: 'GET',
552
+ path: '/api',
553
+ url: 'http://localhost/api',
554
+ headers: {},
555
+ query: {},
556
+ status: 200,
557
+ responseHeaders: {},
558
+ duration: 10,
559
+ timestamp: new Date(),
560
+ });
561
+ await storage.saveRequest({
562
+ id: 'req-2',
563
+ method: 'GET',
564
+ path: '/api',
565
+ url: 'http://localhost/api',
566
+ headers: {},
567
+ query: {},
568
+ status: 201,
569
+ responseHeaders: {},
570
+ duration: 10,
571
+ timestamp: new Date(),
572
+ });
573
+ await storage.saveRequest({
574
+ id: 'req-3',
575
+ method: 'GET',
576
+ path: '/api',
577
+ url: 'http://localhost/api',
578
+ headers: {},
579
+ query: {},
580
+ status: 500,
581
+ responseHeaders: {},
582
+ duration: 10,
583
+ timestamp: new Date(),
584
+ });
585
+
586
+ const successRequests = await storage.getRequests({ status: '2xx' });
587
+ expect(successRequests).toHaveLength(2);
588
+ });
589
+
590
+ it('should filter by status category (5xx)', async () => {
591
+ await storage.saveRequest({
592
+ id: 'req-1',
593
+ method: 'GET',
594
+ path: '/api',
595
+ url: 'http://localhost/api',
596
+ headers: {},
597
+ query: {},
598
+ status: 200,
599
+ responseHeaders: {},
600
+ duration: 10,
601
+ timestamp: new Date(),
602
+ });
603
+ await storage.saveRequest({
604
+ id: 'req-2',
605
+ method: 'GET',
606
+ path: '/api',
607
+ url: 'http://localhost/api',
608
+ headers: {},
609
+ query: {},
610
+ status: 500,
611
+ responseHeaders: {},
612
+ duration: 10,
613
+ timestamp: new Date(),
614
+ });
615
+ await storage.saveRequest({
616
+ id: 'req-3',
617
+ method: 'GET',
618
+ path: '/api',
619
+ url: 'http://localhost/api',
620
+ headers: {},
621
+ query: {},
622
+ status: 503,
623
+ responseHeaders: {},
624
+ duration: 10,
625
+ timestamp: new Date(),
626
+ });
627
+
628
+ const errorRequests = await storage.getRequests({ status: '5xx' });
629
+ expect(errorRequests).toHaveLength(2);
630
+ });
631
+ });
632
+
633
+ describe('log filters', () => {
634
+ it('should filter logs by level', async () => {
635
+ await storage.saveLog({
636
+ id: 'log-1',
637
+ level: 'info',
638
+ message: 'Info message',
639
+ timestamp: new Date(),
640
+ });
641
+ await storage.saveLog({
642
+ id: 'log-2',
643
+ level: 'error',
644
+ message: 'Error message',
645
+ timestamp: new Date(),
646
+ });
647
+ await storage.saveLog({
648
+ id: 'log-3',
649
+ level: 'error',
650
+ message: 'Another error',
651
+ timestamp: new Date(),
652
+ });
653
+
654
+ const errorLogs = await storage.getLogs({ level: 'error' });
655
+ expect(errorLogs).toHaveLength(2);
656
+ });
657
+ });
658
+
659
+ describe('enforceLimit', () => {
660
+ it('should enforce limit on exceptions', async () => {
661
+ const smallStorage = new InMemoryStorage({ maxEntries: 3 });
662
+
663
+ for (let i = 0; i < 5; i++) {
664
+ await smallStorage.saveException({
665
+ id: `exc-${i}`,
666
+ name: 'Error',
667
+ message: `Error ${i}`,
668
+ stack: [],
669
+ timestamp: new Date(Date.now() + i * 1000),
670
+ handled: false,
671
+ });
672
+ }
673
+
674
+ const exceptions = await smallStorage.getExceptions();
675
+ expect(exceptions).toHaveLength(3);
676
+ });
677
+
678
+ it('should enforce limit on logs', async () => {
679
+ const smallStorage = new InMemoryStorage({ maxEntries: 3 });
680
+
681
+ for (let i = 0; i < 5; i++) {
682
+ await smallStorage.saveLog({
683
+ id: `log-${i}`,
684
+ level: 'info',
685
+ message: `Log ${i}`,
686
+ timestamp: new Date(Date.now() + i * 1000),
687
+ });
688
+ }
689
+
690
+ const logs = await smallStorage.getLogs();
691
+ expect(logs).toHaveLength(3);
692
+ });
693
+ });
694
+ });