@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,599 @@
1
+ import type { Kysely } from 'kysely';
2
+ import type {
3
+ ExceptionEntry,
4
+ LogEntry,
5
+ QueryOptions,
6
+ RequestEntry,
7
+ TelescopeStats,
8
+ TelescopeStorage,
9
+ } from '../types';
10
+
11
+ /**
12
+ * Database table interface for telescope requests.
13
+ * Use this to define your telescope_requests table in your Kysely database schema.
14
+ */
15
+ export interface TelescopeRequestTable {
16
+ id: string;
17
+ method: string;
18
+ path: string;
19
+ url: string;
20
+ headers: unknown;
21
+ body: unknown | null;
22
+ query: unknown | null;
23
+ status: number;
24
+ response_headers: unknown;
25
+ response_body: unknown | null;
26
+ duration: number;
27
+ timestamp: Date;
28
+ ip: string | null;
29
+ user_id: string | null;
30
+ tags: unknown | null;
31
+ }
32
+
33
+ /**
34
+ * Database table interface for telescope exceptions.
35
+ */
36
+ export interface TelescopeExceptionTable {
37
+ id: string;
38
+ name: string;
39
+ message: string;
40
+ stack: unknown;
41
+ source: unknown | null;
42
+ request_id: string | null;
43
+ timestamp: Date;
44
+ handled: boolean;
45
+ tags: unknown | null;
46
+ }
47
+
48
+ /**
49
+ * Database table interface for telescope logs.
50
+ */
51
+ export interface TelescopeLogTable {
52
+ id: string;
53
+ level: string;
54
+ message: string;
55
+ context: unknown | null;
56
+ request_id: string | null;
57
+ timestamp: Date;
58
+ }
59
+
60
+ /**
61
+ * Combined database interface for all telescope tables.
62
+ * Use this to extend your database schema.
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * import type { TelescopeTables } from '@geekmidas/telescope/storage/kysely';
67
+ *
68
+ * interface Database extends TelescopeTables {
69
+ * users: UserTable;
70
+ * // ... other tables
71
+ * }
72
+ * ```
73
+ */
74
+ export interface TelescopeTables {
75
+ telescope_requests: TelescopeRequestTable;
76
+ telescope_exceptions: TelescopeExceptionTable;
77
+ telescope_logs: TelescopeLogTable;
78
+ }
79
+
80
+ /**
81
+ * Configuration for KyselyStorage.
82
+ */
83
+ export interface KyselyStorageConfig<DB> {
84
+ /** Kysely database instance */
85
+ db: Kysely<DB>;
86
+ /**
87
+ * Table name prefix (default: 'telescope').
88
+ * Tables will be named: {prefix}_requests, {prefix}_exceptions, {prefix}_logs
89
+ */
90
+ tablePrefix?: string;
91
+ }
92
+
93
+ /**
94
+ * Kysely-based storage implementation for Telescope.
95
+ * Stores telescope data in PostgreSQL, MySQL, or SQLite using Kysely.
96
+ *
97
+ * @template DB - Your Kysely database schema (must include TelescopeTables)
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * import { Kysely, PostgresDialect } from 'kysely';
102
+ * import { KyselyStorage, type TelescopeTables } from '@geekmidas/telescope/storage/kysely';
103
+ *
104
+ * interface Database extends TelescopeTables {
105
+ * users: UserTable;
106
+ * }
107
+ *
108
+ * const db = new Kysely<Database>({ dialect: new PostgresDialect({ pool }) });
109
+ * const storage = new KyselyStorage({ db });
110
+ *
111
+ * const telescope = new Telescope({ storage });
112
+ * ```
113
+ */
114
+ export class KyselyStorage<DB> implements TelescopeStorage {
115
+ private readonly db: Kysely<DB>;
116
+ private readonly requestsTable: string;
117
+ private readonly exceptionsTable: string;
118
+ private readonly logsTable: string;
119
+
120
+ constructor(config: KyselyStorageConfig<DB>) {
121
+ this.db = config.db;
122
+ const prefix = config.tablePrefix ?? 'telescope';
123
+ this.requestsTable = `${prefix}_requests`;
124
+ this.exceptionsTable = `${prefix}_exceptions`;
125
+ this.logsTable = `${prefix}_logs`;
126
+ }
127
+
128
+ // ============================================
129
+ // Requests
130
+ // ============================================
131
+
132
+ async saveRequest(entry: RequestEntry): Promise<void> {
133
+ const row = this.requestToRow(entry);
134
+ await (this.db as any).insertInto(this.requestsTable).values(row).execute();
135
+ }
136
+
137
+ async saveRequests(entries: RequestEntry[]): Promise<void> {
138
+ if (entries.length === 0) return;
139
+
140
+ const rows = entries.map((e) => this.requestToRow(e));
141
+ await (this.db as any)
142
+ .insertInto(this.requestsTable)
143
+ .values(rows)
144
+ .execute();
145
+ }
146
+
147
+ async getRequests(options?: QueryOptions): Promise<RequestEntry[]> {
148
+ let query = (this.db as any)
149
+ .selectFrom(this.requestsTable)
150
+ .selectAll()
151
+ .orderBy('timestamp', 'desc');
152
+
153
+ // Apply request-specific filters
154
+ if (options?.method) {
155
+ query = query.where('method', '=', options.method);
156
+ }
157
+
158
+ if (options?.status) {
159
+ const statusFilter = options.status;
160
+ if (statusFilter.endsWith('xx')) {
161
+ // Handle status ranges like "2xx", "4xx", "5xx"
162
+ const firstChar = statusFilter[0];
163
+ if (firstChar) {
164
+ const category = parseInt(firstChar, 10);
165
+ const minStatus = category * 100;
166
+ const maxStatus = minStatus + 99;
167
+ query = query
168
+ .where('status', '>=', minStatus)
169
+ .where('status', '<=', maxStatus);
170
+ }
171
+ } else {
172
+ // Handle exact status codes
173
+ query = query.where('status', '=', parseInt(statusFilter, 10));
174
+ }
175
+ }
176
+
177
+ query = this.applyQueryOptions(query, options);
178
+
179
+ const rows = await query.execute();
180
+ return rows.map((row: TelescopeRequestTable) => this.rowToRequest(row));
181
+ }
182
+
183
+ async getRequest(id: string): Promise<RequestEntry | null> {
184
+ const row = await (this.db as any)
185
+ .selectFrom(this.requestsTable)
186
+ .selectAll()
187
+ .where('id', '=', id)
188
+ .executeTakeFirst();
189
+
190
+ return row ? this.rowToRequest(row) : null;
191
+ }
192
+
193
+ // ============================================
194
+ // Exceptions
195
+ // ============================================
196
+
197
+ async saveException(entry: ExceptionEntry): Promise<void> {
198
+ const row = this.exceptionToRow(entry);
199
+ await (this.db as any)
200
+ .insertInto(this.exceptionsTable)
201
+ .values(row)
202
+ .execute();
203
+ }
204
+
205
+ async saveExceptions(entries: ExceptionEntry[]): Promise<void> {
206
+ if (entries.length === 0) return;
207
+
208
+ const rows = entries.map((e) => this.exceptionToRow(e));
209
+ await (this.db as any)
210
+ .insertInto(this.exceptionsTable)
211
+ .values(rows)
212
+ .execute();
213
+ }
214
+
215
+ async getExceptions(options?: QueryOptions): Promise<ExceptionEntry[]> {
216
+ let query = (this.db as any)
217
+ .selectFrom(this.exceptionsTable)
218
+ .selectAll()
219
+ .orderBy('timestamp', 'desc');
220
+
221
+ query = this.applyQueryOptions(query, options);
222
+
223
+ const rows = await query.execute();
224
+ return rows.map((row: TelescopeExceptionTable) => this.rowToException(row));
225
+ }
226
+
227
+ async getException(id: string): Promise<ExceptionEntry | null> {
228
+ const row = await (this.db as any)
229
+ .selectFrom(this.exceptionsTable)
230
+ .selectAll()
231
+ .where('id', '=', id)
232
+ .executeTakeFirst();
233
+
234
+ return row ? this.rowToException(row) : null;
235
+ }
236
+
237
+ // ============================================
238
+ // Logs
239
+ // ============================================
240
+
241
+ async saveLog(entry: LogEntry): Promise<void> {
242
+ const row = this.logToRow(entry);
243
+ await (this.db as any).insertInto(this.logsTable).values(row).execute();
244
+ }
245
+
246
+ async saveLogs(entries: LogEntry[]): Promise<void> {
247
+ if (entries.length === 0) return;
248
+
249
+ const rows = entries.map((e) => this.logToRow(e));
250
+ await (this.db as any).insertInto(this.logsTable).values(rows).execute();
251
+ }
252
+
253
+ async getLogs(options?: QueryOptions): Promise<LogEntry[]> {
254
+ let query = (this.db as any)
255
+ .selectFrom(this.logsTable)
256
+ .selectAll()
257
+ .orderBy('timestamp', 'desc');
258
+
259
+ // Apply log-specific filters
260
+ if (options?.level) {
261
+ query = query.where('level', '=', options.level);
262
+ }
263
+
264
+ query = this.applyQueryOptions(query, options);
265
+
266
+ const rows = await query.execute();
267
+ return rows.map((row: TelescopeLogTable) => this.rowToLog(row));
268
+ }
269
+
270
+ // ============================================
271
+ // Cleanup
272
+ // ============================================
273
+
274
+ async prune(olderThan: Date): Promise<number> {
275
+ const results = await Promise.all([
276
+ (this.db as any)
277
+ .deleteFrom(this.requestsTable)
278
+ .where('timestamp', '<', olderThan)
279
+ .executeTakeFirst(),
280
+ (this.db as any)
281
+ .deleteFrom(this.exceptionsTable)
282
+ .where('timestamp', '<', olderThan)
283
+ .executeTakeFirst(),
284
+ (this.db as any)
285
+ .deleteFrom(this.logsTable)
286
+ .where('timestamp', '<', olderThan)
287
+ .executeTakeFirst(),
288
+ ]);
289
+
290
+ return results.reduce(
291
+ (sum, result) => sum + Number(result.numDeletedRows ?? 0),
292
+ 0,
293
+ );
294
+ }
295
+
296
+ // ============================================
297
+ // Stats
298
+ // ============================================
299
+
300
+ async getStats(): Promise<TelescopeStats> {
301
+ const [requestsResult, exceptionsResult, logsResult] = await Promise.all([
302
+ (this.db as any)
303
+ .selectFrom(this.requestsTable)
304
+ .select((eb: any) => [
305
+ eb.fn.count('id').as('count'),
306
+ eb.fn.min('timestamp').as('oldest'),
307
+ eb.fn.max('timestamp').as('newest'),
308
+ ])
309
+ .executeTakeFirst(),
310
+ (this.db as any)
311
+ .selectFrom(this.exceptionsTable)
312
+ .select((eb: any) => [
313
+ eb.fn.count('id').as('count'),
314
+ eb.fn.min('timestamp').as('oldest'),
315
+ eb.fn.max('timestamp').as('newest'),
316
+ ])
317
+ .executeTakeFirst(),
318
+ (this.db as any)
319
+ .selectFrom(this.logsTable)
320
+ .select((eb: any) => [
321
+ eb.fn.count('id').as('count'),
322
+ eb.fn.min('timestamp').as('oldest'),
323
+ eb.fn.max('timestamp').as('newest'),
324
+ ])
325
+ .executeTakeFirst(),
326
+ ]);
327
+
328
+ const allDates = [
329
+ requestsResult?.oldest,
330
+ requestsResult?.newest,
331
+ exceptionsResult?.oldest,
332
+ exceptionsResult?.newest,
333
+ logsResult?.oldest,
334
+ logsResult?.newest,
335
+ ]
336
+ .filter((d): d is Date => d != null)
337
+ .sort((a, b) => new Date(a).getTime() - new Date(b).getTime());
338
+
339
+ const newestDate = allDates[allDates.length - 1];
340
+ return {
341
+ requests: Number(requestsResult?.count ?? 0),
342
+ exceptions: Number(exceptionsResult?.count ?? 0),
343
+ logs: Number(logsResult?.count ?? 0),
344
+ oldestEntry: allDates[0] ? new Date(allDates[0]) : undefined,
345
+ newestEntry: newestDate ? new Date(newestDate) : undefined,
346
+ };
347
+ }
348
+
349
+ // ============================================
350
+ // Private Helpers
351
+ // ============================================
352
+
353
+ private applyQueryOptions(query: any, options?: QueryOptions): any {
354
+ if (!options) {
355
+ return query.limit(50);
356
+ }
357
+
358
+ if (options.after) {
359
+ query = query.where('timestamp', '>=', options.after);
360
+ }
361
+
362
+ if (options.before) {
363
+ query = query.where('timestamp', '<=', options.before);
364
+ }
365
+
366
+ if (options.search) {
367
+ // Search in relevant text fields - using ILIKE for case-insensitive
368
+ // This is a simple implementation; for production you'd want full-text search
369
+ query = query.where((eb: any) =>
370
+ eb.or([
371
+ eb('message', 'ilike', `%${options.search}%`),
372
+ eb('path', 'ilike', `%${options.search}%`),
373
+ eb('url', 'ilike', `%${options.search}%`),
374
+ ]),
375
+ );
376
+ }
377
+
378
+ // Tags filter would require array contains operation
379
+ // which is database-specific (PostgreSQL: @>, etc.)
380
+
381
+ const limit = options.limit ?? 50;
382
+ const offset = options.offset ?? 0;
383
+
384
+ return query.limit(limit).offset(offset);
385
+ }
386
+
387
+ private requestToRow(entry: RequestEntry): TelescopeRequestTable {
388
+ return {
389
+ id: entry.id,
390
+ method: entry.method,
391
+ path: entry.path,
392
+ url: entry.url,
393
+ headers: entry.headers,
394
+ body: entry.body ?? null,
395
+ query: entry.query ?? null,
396
+ status: entry.status,
397
+ response_headers: entry.responseHeaders,
398
+ response_body: entry.responseBody ?? null,
399
+ duration: entry.duration,
400
+ timestamp: entry.timestamp,
401
+ ip: entry.ip ?? null,
402
+ user_id: entry.userId ?? null,
403
+ tags: entry.tags ?? null,
404
+ };
405
+ }
406
+
407
+ private rowToRequest(row: TelescopeRequestTable): RequestEntry {
408
+ return {
409
+ id: row.id,
410
+ method: row.method,
411
+ path: row.path,
412
+ url: row.url,
413
+ headers: this.parseJson(row.headers) as Record<string, string>,
414
+ body: row.body ? this.parseJson(row.body) : undefined,
415
+ query: row.query
416
+ ? (this.parseJson(row.query) as Record<string, string>)
417
+ : undefined,
418
+ status: row.status,
419
+ responseHeaders: this.parseJson(row.response_headers) as Record<
420
+ string,
421
+ string
422
+ >,
423
+ responseBody: row.response_body
424
+ ? this.parseJson(row.response_body)
425
+ : undefined,
426
+ duration: row.duration,
427
+ timestamp: new Date(row.timestamp),
428
+ ip: row.ip ?? undefined,
429
+ userId: row.user_id ?? undefined,
430
+ tags: row.tags ? (this.parseJson(row.tags) as string[]) : undefined,
431
+ };
432
+ }
433
+
434
+ private exceptionToRow(entry: ExceptionEntry): TelescopeExceptionTable {
435
+ return {
436
+ id: entry.id,
437
+ name: entry.name,
438
+ message: entry.message,
439
+ stack: entry.stack,
440
+ source: entry.source ?? null,
441
+ request_id: entry.requestId ?? null,
442
+ timestamp: entry.timestamp,
443
+ handled: entry.handled,
444
+ tags: entry.tags ?? null,
445
+ };
446
+ }
447
+
448
+ private rowToException(row: TelescopeExceptionTable): ExceptionEntry {
449
+ return {
450
+ id: row.id,
451
+ name: row.name,
452
+ message: row.message,
453
+ stack: this.parseJson(row.stack) as ExceptionEntry['stack'],
454
+ source: row.source
455
+ ? (this.parseJson(row.source) as ExceptionEntry['source'])
456
+ : undefined,
457
+ requestId: row.request_id ?? undefined,
458
+ timestamp: new Date(row.timestamp),
459
+ handled: row.handled,
460
+ tags: row.tags ? (this.parseJson(row.tags) as string[]) : undefined,
461
+ };
462
+ }
463
+
464
+ private logToRow(entry: LogEntry): TelescopeLogTable {
465
+ return {
466
+ id: entry.id,
467
+ level: entry.level,
468
+ message: entry.message,
469
+ context: entry.context ?? null,
470
+ request_id: entry.requestId ?? null,
471
+ timestamp: entry.timestamp,
472
+ };
473
+ }
474
+
475
+ private rowToLog(row: TelescopeLogTable): LogEntry {
476
+ return {
477
+ id: row.id,
478
+ level: row.level as LogEntry['level'],
479
+ message: row.message,
480
+ context: row.context
481
+ ? (this.parseJson(row.context) as Record<string, unknown>)
482
+ : undefined,
483
+ requestId: row.request_id ?? undefined,
484
+ timestamp: new Date(row.timestamp),
485
+ };
486
+ }
487
+
488
+ /**
489
+ * Parse a JSON value that may already be parsed (e.g., from jsonb columns).
490
+ */
491
+ private parseJson(value: unknown): unknown {
492
+ if (typeof value === 'object' && value !== null) {
493
+ return value;
494
+ }
495
+ if (typeof value === 'string') {
496
+ try {
497
+ return JSON.parse(value);
498
+ } catch {
499
+ return value;
500
+ }
501
+ }
502
+ return value;
503
+ }
504
+ }
505
+
506
+ /**
507
+ * SQL migration to create telescope tables.
508
+ * Use this to set up the required tables in your database.
509
+ *
510
+ * @example
511
+ * ```typescript
512
+ * import { getTelescopeMigration } from '@geekmidas/telescope/storage/kysely';
513
+ *
514
+ * // In your migration file
515
+ * export async function up(db: Kysely<any>): Promise<void> {
516
+ * const migration = getTelescopeMigration();
517
+ * await db.schema.executeRaw(migration.up).execute();
518
+ * }
519
+ *
520
+ * export async function down(db: Kysely<any>): Promise<void> {
521
+ * const migration = getTelescopeMigration();
522
+ * await db.schema.executeRaw(migration.down).execute();
523
+ * }
524
+ * ```
525
+ */
526
+ export function getTelescopeMigration(tablePrefix = 'telescope'): {
527
+ up: string;
528
+ down: string;
529
+ } {
530
+ return {
531
+ up: `
532
+ -- Telescope requests table
533
+ CREATE TABLE IF NOT EXISTS ${tablePrefix}_requests (
534
+ id VARCHAR(21) PRIMARY KEY,
535
+ method VARCHAR(10) NOT NULL,
536
+ path TEXT NOT NULL,
537
+ url TEXT NOT NULL,
538
+ headers JSONB NOT NULL,
539
+ body JSONB,
540
+ query JSONB,
541
+ status INTEGER NOT NULL,
542
+ response_headers JSONB NOT NULL,
543
+ response_body JSONB,
544
+ duration DOUBLE PRECISION NOT NULL,
545
+ timestamp TIMESTAMPTZ NOT NULL,
546
+ ip VARCHAR(45),
547
+ user_id VARCHAR(255),
548
+ tags JSONB
549
+ );
550
+
551
+ CREATE INDEX IF NOT EXISTS idx_${tablePrefix}_requests_timestamp
552
+ ON ${tablePrefix}_requests (timestamp DESC);
553
+ CREATE INDEX IF NOT EXISTS idx_${tablePrefix}_requests_path
554
+ ON ${tablePrefix}_requests (path);
555
+ CREATE INDEX IF NOT EXISTS idx_${tablePrefix}_requests_status
556
+ ON ${tablePrefix}_requests (status);
557
+
558
+ -- Telescope exceptions table
559
+ CREATE TABLE IF NOT EXISTS ${tablePrefix}_exceptions (
560
+ id VARCHAR(21) PRIMARY KEY,
561
+ name VARCHAR(255) NOT NULL,
562
+ message TEXT NOT NULL,
563
+ stack JSONB NOT NULL,
564
+ source JSONB,
565
+ request_id VARCHAR(21),
566
+ timestamp TIMESTAMPTZ NOT NULL,
567
+ handled BOOLEAN NOT NULL DEFAULT FALSE,
568
+ tags JSONB
569
+ );
570
+
571
+ CREATE INDEX IF NOT EXISTS idx_${tablePrefix}_exceptions_timestamp
572
+ ON ${tablePrefix}_exceptions (timestamp DESC);
573
+ CREATE INDEX IF NOT EXISTS idx_${tablePrefix}_exceptions_request_id
574
+ ON ${tablePrefix}_exceptions (request_id);
575
+
576
+ -- Telescope logs table
577
+ CREATE TABLE IF NOT EXISTS ${tablePrefix}_logs (
578
+ id VARCHAR(21) PRIMARY KEY,
579
+ level VARCHAR(10) NOT NULL,
580
+ message TEXT NOT NULL,
581
+ context JSONB,
582
+ request_id VARCHAR(21),
583
+ timestamp TIMESTAMPTZ NOT NULL
584
+ );
585
+
586
+ CREATE INDEX IF NOT EXISTS idx_${tablePrefix}_logs_timestamp
587
+ ON ${tablePrefix}_logs (timestamp DESC);
588
+ CREATE INDEX IF NOT EXISTS idx_${tablePrefix}_logs_level
589
+ ON ${tablePrefix}_logs (level);
590
+ CREATE INDEX IF NOT EXISTS idx_${tablePrefix}_logs_request_id
591
+ ON ${tablePrefix}_logs (request_id);
592
+ `,
593
+ down: `
594
+ DROP TABLE IF EXISTS ${tablePrefix}_logs;
595
+ DROP TABLE IF EXISTS ${tablePrefix}_exceptions;
596
+ DROP TABLE IF EXISTS ${tablePrefix}_requests;
597
+ `,
598
+ };
599
+ }