@geekmidas/telescope 10.0.0-alpha.98 → 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,160 @@
1
+ import { createHttpServerSpan, endHttpSpan, extractTraceContext } from "./http-DQzgLczm.mjs";
2
+ import { context, trace } from "@opentelemetry/api";
3
+
4
+ //#region src/instrumentation/middleware.ts
5
+ const SPAN_SYMBOL = Symbol("telemetry.span");
6
+ const CONTEXT_SYMBOL = Symbol("telemetry.context");
7
+ /**
8
+ * Get the current span from the Lambda event
9
+ */
10
+ function getSpanFromEvent(event) {
11
+ return event?.[SPAN_SYMBOL];
12
+ }
13
+ /**
14
+ * Get the current trace context from the Lambda event
15
+ */
16
+ function getContextFromEvent(event) {
17
+ return event?.[CONTEXT_SYMBOL];
18
+ }
19
+ /**
20
+ * Create a telemetry middleware for Lambda handlers
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * import { telemetryMiddleware } from '@geekmidas/telescope/instrumentation';
25
+ *
26
+ * const adaptor = new AmazonApiGatewayV2Endpoint(envParser, endpoint, {
27
+ * telemetry: { middleware: telemetryMiddleware() },
28
+ * });
29
+ * ```
30
+ */
31
+ function telemetryMiddleware(options = {}) {
32
+ return {
33
+ before: async (request) => {
34
+ if (options.shouldSkip?.(request.event)) return;
35
+ const event = request.event;
36
+ const lambdaContext = request.context;
37
+ const headers = normalizeHeaders(event.headers || {});
38
+ const parentContext = extractTraceContext(headers);
39
+ const attrs = buildSpanAttributes(event, lambdaContext, options);
40
+ const span = createHttpServerSpan(attrs, parentContext);
41
+ event[SPAN_SYMBOL] = span;
42
+ event[CONTEXT_SYMBOL] = trace.setSpan(parentContext, span);
43
+ span.setAttribute("faas.invocation_id", lambdaContext.awsRequestId);
44
+ span.setAttribute("faas.name", lambdaContext.functionName);
45
+ if (options.recordBody && event.body) {
46
+ const bodyStr = typeof event.body === "string" ? event.body : JSON.stringify(event.body);
47
+ span.setAttribute("http.request.body", bodyStr.length > 4096 ? `${bodyStr.slice(0, 4096)}...` : bodyStr);
48
+ }
49
+ },
50
+ after: async (request) => {
51
+ const span = getSpanFromEvent(request.event);
52
+ if (!span) return;
53
+ const response = request.response;
54
+ const statusCode = typeof response?.statusCode === "number" ? response.statusCode : 200;
55
+ if (options.recordResponseBody && response?.body) {
56
+ const bodyStr = typeof response.body === "string" ? response.body : JSON.stringify(response.body);
57
+ span.setAttribute("http.response.body", bodyStr.length > 4096 ? `${bodyStr.slice(0, 4096)}...` : bodyStr);
58
+ }
59
+ endHttpSpan(span, { statusCode });
60
+ },
61
+ onError: async (request) => {
62
+ const span = getSpanFromEvent(request.event);
63
+ if (!span) return;
64
+ const error = request.error;
65
+ const response = request.response;
66
+ let statusCode = 500;
67
+ if (response?.statusCode) statusCode = response.statusCode;
68
+ else if (error && "statusCode" in error) statusCode = error.statusCode;
69
+ endHttpSpan(span, { statusCode }, error instanceof Error ? error : new Error(String(error)));
70
+ }
71
+ };
72
+ }
73
+ /**
74
+ * Build span attributes from Lambda event
75
+ */
76
+ function buildSpanAttributes(event, lambdaContext, options) {
77
+ const isV2 = "requestContext" in event && "http" in (event.requestContext || {});
78
+ const isV1 = "requestContext" in event && "httpMethod" in event && !("http" in (event.requestContext || {}));
79
+ let method = "INVOKE";
80
+ let path = "/";
81
+ let route;
82
+ let host;
83
+ let scheme;
84
+ let userAgent;
85
+ let clientIp;
86
+ let requestId;
87
+ if (isV2) {
88
+ const http = event.requestContext.http;
89
+ method = http.method;
90
+ path = event.rawPath || http.path;
91
+ route = event.routeKey?.replace(/^[A-Z]+\s+/, "");
92
+ host = event.headers?.host;
93
+ scheme = "https";
94
+ userAgent = http.userAgent;
95
+ clientIp = http.sourceIp;
96
+ requestId = event.requestContext.requestId;
97
+ } else if (isV1) {
98
+ method = event.httpMethod;
99
+ path = event.path;
100
+ route = event.resource;
101
+ host = event.headers?.Host || event.headers?.host;
102
+ scheme = "https";
103
+ userAgent = event.headers?.["User-Agent"] || event.headers?.["user-agent"];
104
+ clientIp = event.requestContext?.identity?.sourceIp;
105
+ requestId = event.requestContext?.requestId;
106
+ } else if ("httpMethod" in event) {
107
+ method = event.httpMethod;
108
+ path = event.path;
109
+ host = event.headers?.host;
110
+ userAgent = event.headers?.["user-agent"] || event.headers?.["User-Agent"];
111
+ clientIp = event.headers?.["x-forwarded-for"]?.split(",")[0]?.trim();
112
+ }
113
+ const attrs = {
114
+ method,
115
+ path,
116
+ route,
117
+ host,
118
+ scheme,
119
+ userAgent,
120
+ clientIp,
121
+ requestId: requestId || lambdaContext.awsRequestId
122
+ };
123
+ if (options.getEndpointName || options.getOperationId) attrs.endpoint = {
124
+ name: options.getEndpointName?.(event),
125
+ operationId: options.getOperationId?.(event)
126
+ };
127
+ if (options.getUserId) {
128
+ const userId = options.getUserId(event);
129
+ if (userId) attrs.user = { userId };
130
+ }
131
+ return attrs;
132
+ }
133
+ /**
134
+ * Normalize headers to lowercase keys
135
+ */
136
+ function normalizeHeaders(headers) {
137
+ const normalized = {};
138
+ for (const [key, value] of Object.entries(headers)) normalized[key.toLowerCase()] = value;
139
+ return normalized;
140
+ }
141
+ /**
142
+ * Run a function within the span context from a Lambda event
143
+ *
144
+ * @example
145
+ * ```typescript
146
+ * await withEventContext(event, async () => {
147
+ * // Any spans created here will be children of the request span
148
+ * await doSomething();
149
+ * });
150
+ * ```
151
+ */
152
+ async function withEventContext(event, fn) {
153
+ const ctx = getContextFromEvent(event);
154
+ if (!ctx) return fn();
155
+ return context.with(ctx, fn);
156
+ }
157
+
158
+ //#endregion
159
+ export { getContextFromEvent, getSpanFromEvent, telemetryMiddleware, withEventContext };
160
+ //# sourceMappingURL=middleware-BTDncHwm.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware-BTDncHwm.mjs","names":["event: any","options: TelemetryMiddlewareOptions","lambdaContext: LambdaContext","route: string | undefined","host: string | undefined","scheme: 'http' | 'https' | undefined","userAgent: string | undefined","clientIp: string | undefined","requestId: string | undefined","attrs: HttpSpanAttributes","headers: Record<string, string | string[] | undefined>","normalized: Record<string, string | string[] | undefined>","fn: () => Promise<T>"],"sources":["../src/instrumentation/middleware.ts"],"sourcesContent":["/**\n * OpenTelemetry instrumentation middleware for @geekmidas/constructs\n *\n * This middleware automatically creates spans for HTTP requests,\n * extracts trace context from incoming headers, and records\n * request/response metadata as span attributes.\n */\nimport type { MiddlewareObj } from '@middy/core';\nimport { context, type Span, trace } from '@opentelemetry/api';\nimport type { Context as LambdaContext } from 'aws-lambda';\nimport {\n\tcreateHttpServerSpan,\n\tendHttpSpan,\n\textractTraceContext,\n\ttype HttpSpanAttributes,\n} from './http';\n\n/**\n * Options for the telemetry middleware\n */\nexport interface TelemetryMiddlewareOptions {\n\t/**\n\t * Whether to record request body as span attribute\n\t * @default false\n\t */\n\trecordBody?: boolean;\n\n\t/**\n\t * Whether to record response body as span attribute\n\t * @default false\n\t */\n\trecordResponseBody?: boolean;\n\n\t/**\n\t * Custom function to extract endpoint name from event\n\t */\n\tgetEndpointName?: (event: any) => string | undefined;\n\n\t/**\n\t * Custom function to extract operation ID from event\n\t */\n\tgetOperationId?: (event: any) => string | undefined;\n\n\t/**\n\t * Custom function to extract user ID from event\n\t */\n\tgetUserId?: (event: any) => string | undefined;\n\n\t/**\n\t * Whether to skip tracing for this request\n\t */\n\tshouldSkip?: (event: any) => boolean;\n}\n\n// Symbol for storing span on event\nconst SPAN_SYMBOL = Symbol('telemetry.span');\nconst CONTEXT_SYMBOL = Symbol('telemetry.context');\n\n/**\n * Get the current span from the Lambda event\n */\nexport function getSpanFromEvent(event: any): Span | undefined {\n\treturn event?.[SPAN_SYMBOL];\n}\n\n/**\n * Get the current trace context from the Lambda event\n */\nexport function getContextFromEvent(event: any): any {\n\treturn event?.[CONTEXT_SYMBOL];\n}\n\n/**\n * Create a telemetry middleware for Lambda handlers\n *\n * @example\n * ```typescript\n * import { telemetryMiddleware } from '@geekmidas/telescope/instrumentation';\n *\n * const adaptor = new AmazonApiGatewayV2Endpoint(envParser, endpoint, {\n * telemetry: { middleware: telemetryMiddleware() },\n * });\n * ```\n */\nexport function telemetryMiddleware(\n\toptions: TelemetryMiddlewareOptions = {},\n): MiddlewareObj<any, any, Error, LambdaContext> {\n\treturn {\n\t\tbefore: async (request) => {\n\t\t\t// Skip if custom skip function returns true\n\t\t\tif (options.shouldSkip?.(request.event)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst event = request.event;\n\t\t\tconst lambdaContext = request.context;\n\n\t\t\t// Extract trace context from headers\n\t\t\tconst headers = normalizeHeaders(event.headers || {});\n\t\t\tconst parentContext = extractTraceContext(headers);\n\n\t\t\t// Build span attributes from event\n\t\t\tconst attrs = buildSpanAttributes(event, lambdaContext, options);\n\n\t\t\t// Create the span\n\t\t\tconst span = createHttpServerSpan(attrs, parentContext);\n\n\t\t\t// Store span and context on event for access in handler\n\t\t\tevent[SPAN_SYMBOL] = span;\n\t\t\tevent[CONTEXT_SYMBOL] = trace.setSpan(parentContext, span);\n\n\t\t\t// Add Lambda-specific attributes\n\t\t\tspan.setAttribute('faas.invocation_id', lambdaContext.awsRequestId);\n\t\t\tspan.setAttribute('faas.name', lambdaContext.functionName);\n\n\t\t\tif (options.recordBody && event.body) {\n\t\t\t\tconst bodyStr =\n\t\t\t\t\ttypeof event.body === 'string'\n\t\t\t\t\t\t? event.body\n\t\t\t\t\t\t: JSON.stringify(event.body);\n\t\t\t\t// Truncate large bodies\n\t\t\t\tspan.setAttribute(\n\t\t\t\t\t'http.request.body',\n\t\t\t\t\tbodyStr.length > 4096 ? `${bodyStr.slice(0, 4096)}...` : bodyStr,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tafter: async (request) => {\n\t\t\tconst span = getSpanFromEvent(request.event);\n\t\t\tif (!span) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst response = request.response;\n\t\t\tconst statusCode =\n\t\t\t\ttypeof response?.statusCode === 'number' ? response.statusCode : 200;\n\n\t\t\tif (options.recordResponseBody && response?.body) {\n\t\t\t\tconst bodyStr =\n\t\t\t\t\ttypeof response.body === 'string'\n\t\t\t\t\t\t? response.body\n\t\t\t\t\t\t: JSON.stringify(response.body);\n\t\t\t\tspan.setAttribute(\n\t\t\t\t\t'http.response.body',\n\t\t\t\t\tbodyStr.length > 4096 ? `${bodyStr.slice(0, 4096)}...` : bodyStr,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tendHttpSpan(span, { statusCode });\n\t\t},\n\n\t\tonError: async (request) => {\n\t\t\tconst span = getSpanFromEvent(request.event);\n\t\t\tif (!span) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst error = request.error;\n\t\t\tconst response = request.response;\n\n\t\t\t// Determine status code from response or error\n\t\t\tlet statusCode = 500;\n\t\t\tif (response?.statusCode) {\n\t\t\t\tstatusCode = response.statusCode;\n\t\t\t} else if (error && 'statusCode' in error) {\n\t\t\t\tstatusCode = (error as any).statusCode;\n\t\t\t}\n\n\t\t\tendHttpSpan(\n\t\t\t\tspan,\n\t\t\t\t{ statusCode },\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * Build span attributes from Lambda event\n */\nfunction buildSpanAttributes(\n\tevent: any,\n\tlambdaContext: LambdaContext,\n\toptions: TelemetryMiddlewareOptions,\n): HttpSpanAttributes {\n\t// Detect event type (API Gateway v1, v2, ALB, or direct invoke)\n\tconst isV2 =\n\t\t'requestContext' in event && 'http' in (event.requestContext || {});\n\tconst isV1 =\n\t\t'requestContext' in event &&\n\t\t'httpMethod' in event &&\n\t\t!('http' in (event.requestContext || {}));\n\n\tlet method = 'INVOKE';\n\tlet path = '/';\n\tlet route: string | undefined;\n\tlet host: string | undefined;\n\tlet scheme: 'http' | 'https' | undefined;\n\tlet userAgent: string | undefined;\n\tlet clientIp: string | undefined;\n\tlet requestId: string | undefined;\n\n\tif (isV2) {\n\t\t// API Gateway v2 (HTTP API)\n\t\tconst http = event.requestContext.http;\n\t\tmethod = http.method;\n\t\tpath = event.rawPath || http.path;\n\t\troute = event.routeKey?.replace(/^[A-Z]+\\s+/, ''); // Remove HTTP method prefix\n\t\thost = event.headers?.host;\n\t\tscheme = 'https';\n\t\tuserAgent = http.userAgent;\n\t\tclientIp = http.sourceIp;\n\t\trequestId = event.requestContext.requestId;\n\t} else if (isV1) {\n\t\t// API Gateway v1 (REST API)\n\t\tmethod = event.httpMethod;\n\t\tpath = event.path;\n\t\troute = event.resource;\n\t\thost = event.headers?.Host || event.headers?.host;\n\t\tscheme = 'https';\n\t\tuserAgent = event.headers?.['User-Agent'] || event.headers?.['user-agent'];\n\t\tclientIp = event.requestContext?.identity?.sourceIp;\n\t\trequestId = event.requestContext?.requestId;\n\t} else if ('httpMethod' in event) {\n\t\t// ALB event\n\t\tmethod = event.httpMethod;\n\t\tpath = event.path;\n\t\thost = event.headers?.host;\n\t\tuserAgent = event.headers?.['user-agent'] || event.headers?.['User-Agent'];\n\t\tclientIp = event.headers?.['x-forwarded-for']?.split(',')[0]?.trim();\n\t}\n\n\tconst attrs: HttpSpanAttributes = {\n\t\tmethod,\n\t\tpath,\n\t\troute,\n\t\thost,\n\t\tscheme,\n\t\tuserAgent,\n\t\tclientIp,\n\t\trequestId: requestId || lambdaContext.awsRequestId,\n\t};\n\n\t// Add endpoint metadata if extractors provided\n\tif (options.getEndpointName || options.getOperationId) {\n\t\tattrs.endpoint = {\n\t\t\tname: options.getEndpointName?.(event),\n\t\t\toperationId: options.getOperationId?.(event),\n\t\t};\n\t}\n\n\t// Add user metadata if extractor provided\n\tif (options.getUserId) {\n\t\tconst userId = options.getUserId(event);\n\t\tif (userId) {\n\t\t\tattrs.user = { userId };\n\t\t}\n\t}\n\n\treturn attrs;\n}\n\n/**\n * Normalize headers to lowercase keys\n */\nfunction normalizeHeaders(\n\theaders: Record<string, string | string[] | undefined>,\n): Record<string, string | string[] | undefined> {\n\tconst normalized: Record<string, string | string[] | undefined> = {};\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tnormalized[key.toLowerCase()] = value;\n\t}\n\treturn normalized;\n}\n\n/**\n * Run a function within the span context from a Lambda event\n *\n * @example\n * ```typescript\n * await withEventContext(event, async () => {\n * // Any spans created here will be children of the request span\n * await doSomething();\n * });\n * ```\n */\nexport async function withEventContext<T>(\n\tevent: any,\n\tfn: () => Promise<T>,\n): Promise<T> {\n\tconst ctx = getContextFromEvent(event);\n\tif (!ctx) {\n\t\treturn fn();\n\t}\n\treturn context.with(ctx, fn);\n}\n"],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { Context } from "aws-lambda";
2
+ import { MiddlewareObj } from "@middy/core";
3
+ import { Span } from "@opentelemetry/api";
4
+
5
+ //#region src/instrumentation/middleware.d.ts
6
+
7
+ /**
8
+ * Options for the telemetry middleware
9
+ */
10
+ interface TelemetryMiddlewareOptions {
11
+ /**
12
+ * Whether to record request body as span attribute
13
+ * @default false
14
+ */
15
+ recordBody?: boolean;
16
+ /**
17
+ * Whether to record response body as span attribute
18
+ * @default false
19
+ */
20
+ recordResponseBody?: boolean;
21
+ /**
22
+ * Custom function to extract endpoint name from event
23
+ */
24
+ getEndpointName?: (event: any) => string | undefined;
25
+ /**
26
+ * Custom function to extract operation ID from event
27
+ */
28
+ getOperationId?: (event: any) => string | undefined;
29
+ /**
30
+ * Custom function to extract user ID from event
31
+ */
32
+ getUserId?: (event: any) => string | undefined;
33
+ /**
34
+ * Whether to skip tracing for this request
35
+ */
36
+ shouldSkip?: (event: any) => boolean;
37
+ }
38
+ /**
39
+ * Get the current span from the Lambda event
40
+ */
41
+ declare function getSpanFromEvent(event: any): Span | undefined;
42
+ /**
43
+ * Get the current trace context from the Lambda event
44
+ */
45
+ declare function getContextFromEvent(event: any): any;
46
+ /**
47
+ * Create a telemetry middleware for Lambda handlers
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * import { telemetryMiddleware } from '@geekmidas/telescope/instrumentation';
52
+ *
53
+ * const adaptor = new AmazonApiGatewayV2Endpoint(envParser, endpoint, {
54
+ * telemetry: { middleware: telemetryMiddleware() },
55
+ * });
56
+ * ```
57
+ */
58
+ declare function telemetryMiddleware(options?: TelemetryMiddlewareOptions): MiddlewareObj<any, any, Error, Context>;
59
+ /**
60
+ * Run a function within the span context from a Lambda event
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * await withEventContext(event, async () => {
65
+ * // Any spans created here will be children of the request span
66
+ * await doSomething();
67
+ * });
68
+ * ```
69
+ */
70
+ declare function withEventContext<T>(event: any, fn: () => Promise<T>): Promise<T>;
71
+ //# sourceMappingURL=middleware.d.ts.map
72
+ //#endregion
73
+ export { TelemetryMiddlewareOptions, getContextFromEvent, getSpanFromEvent, telemetryMiddleware, withEventContext };
74
+ //# sourceMappingURL=middleware-CA84nsNN.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware-CA84nsNN.d.cts","names":[],"sources":["../src/instrumentation/middleware.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAsFG,UAlEc,0BAAA,CAkEd;EAAa;AAyMhB;;;EAEoB,UAAT,CAAA,EAAA,OAAA;EAAO;;AACR;;;;;;;;;;;;;;;;;;;;;;;iBArOM,gBAAA,cAA8B;;;;iBAO9B,mBAAA;;;;;;;;;;;;;iBAgBA,mBAAA,WACN,6BACP,wBAAwB,OAAO;;;;;;;;;;;;iBAyMZ,0CAEX,QAAQ,KAChB,QAAQ"}
@@ -0,0 +1,74 @@
1
+ import { Span } from "@opentelemetry/api";
2
+ import { Context as Context$1 } from "aws-lambda";
3
+ import { MiddlewareObj } from "@middy/core";
4
+
5
+ //#region src/instrumentation/middleware.d.ts
6
+
7
+ /**
8
+ * Options for the telemetry middleware
9
+ */
10
+ interface TelemetryMiddlewareOptions {
11
+ /**
12
+ * Whether to record request body as span attribute
13
+ * @default false
14
+ */
15
+ recordBody?: boolean;
16
+ /**
17
+ * Whether to record response body as span attribute
18
+ * @default false
19
+ */
20
+ recordResponseBody?: boolean;
21
+ /**
22
+ * Custom function to extract endpoint name from event
23
+ */
24
+ getEndpointName?: (event: any) => string | undefined;
25
+ /**
26
+ * Custom function to extract operation ID from event
27
+ */
28
+ getOperationId?: (event: any) => string | undefined;
29
+ /**
30
+ * Custom function to extract user ID from event
31
+ */
32
+ getUserId?: (event: any) => string | undefined;
33
+ /**
34
+ * Whether to skip tracing for this request
35
+ */
36
+ shouldSkip?: (event: any) => boolean;
37
+ }
38
+ /**
39
+ * Get the current span from the Lambda event
40
+ */
41
+ declare function getSpanFromEvent(event: any): Span | undefined;
42
+ /**
43
+ * Get the current trace context from the Lambda event
44
+ */
45
+ declare function getContextFromEvent(event: any): any;
46
+ /**
47
+ * Create a telemetry middleware for Lambda handlers
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * import { telemetryMiddleware } from '@geekmidas/telescope/instrumentation';
52
+ *
53
+ * const adaptor = new AmazonApiGatewayV2Endpoint(envParser, endpoint, {
54
+ * telemetry: { middleware: telemetryMiddleware() },
55
+ * });
56
+ * ```
57
+ */
58
+ declare function telemetryMiddleware(options?: TelemetryMiddlewareOptions): MiddlewareObj<any, any, Error, Context$1>;
59
+ /**
60
+ * Run a function within the span context from a Lambda event
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * await withEventContext(event, async () => {
65
+ * // Any spans created here will be children of the request span
66
+ * await doSomething();
67
+ * });
68
+ * ```
69
+ */
70
+ declare function withEventContext<T>(event: any, fn: () => Promise<T>): Promise<T>;
71
+ //# sourceMappingURL=middleware.d.ts.map
72
+ //#endregion
73
+ export { TelemetryMiddlewareOptions, getContextFromEvent, getSpanFromEvent, telemetryMiddleware, withEventContext };
74
+ //# sourceMappingURL=middleware-DAceVpfw.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware-DAceVpfw.d.mts","names":[],"sources":["../src/instrumentation/middleware.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAsFG,UAlEc,0BAAA,CAkEd;EAAa;AAyMhB;;;EAEoB,UAAT,CAAA,EAAA,OAAA;EAAO;;AACR;;;;;;;;;;;;;;;;;;;;;;;iBArOM,gBAAA,cAA8B;;;;iBAO9B,mBAAA;;;;;;;;;;;;;iBAgBA,mBAAA,WACN,6BACP,wBAAwB,OAAO;;;;;;;;;;;;iBAyMZ,0CAEX,QAAQ,KAChB,QAAQ"}
@@ -0,0 +1,64 @@
1
+ import { Telescope } from "./Telescope-Dl6VSfxd.mjs";
2
+ import { APIGatewayProxyEvent, APIGatewayProxyEventV2, Context } from "aws-lambda";
3
+ import { MiddlewareObj } from "@middy/core";
4
+
5
+ //#region src/adapters/middy.d.ts
6
+
7
+ /**
8
+ * Options for the Telescope Middy middleware
9
+ */
10
+ interface TelescopeMiddlewareOptions {
11
+ /**
12
+ * Minimum remaining time (ms) before forcing a flush.
13
+ * If remaining time drops below this, flush immediately.
14
+ * @default 1000 (1 second)
15
+ */
16
+ flushThresholdMs?: number;
17
+ /**
18
+ * Whether to record request/response bodies
19
+ * @default true
20
+ */
21
+ recordBody?: boolean;
22
+ /**
23
+ * Timeout for flush operation in ms
24
+ * @default 5000
25
+ */
26
+ flushTimeoutMs?: number;
27
+ }
28
+ /**
29
+ * Middy middleware that integrates Telescope with Lambda handlers.
30
+ *
31
+ * Features:
32
+ * - Records all requests and responses to Telescope
33
+ * - Captures exceptions automatically
34
+ * - Flushes telemetry before Lambda freezes
35
+ * - Uses Lambda context for smart flush timing
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * import middy from '@middy/core';
40
+ * import { telescopeMiddleware } from '@geekmidas/telescope/lambda';
41
+ *
42
+ * const handler = middy(baseHandler)
43
+ * .use(telescopeMiddleware(telescope));
44
+ * ```
45
+ */
46
+ declare function telescopeMiddleware(telescope: Telescope, options?: TelescopeMiddlewareOptions): MiddlewareObj<APIGatewayProxyEvent | APIGatewayProxyEventV2, any, Error, Context>;
47
+ /**
48
+ * Create a wrapped Lambda handler with Telescope integration.
49
+ * Alternative to using Middy middleware directly.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * import { createTelescopeHandler } from '@geekmidas/telescope/lambda';
54
+ *
55
+ * export const handler = createTelescopeHandler(telescope, async (event, context) => {
56
+ * return { statusCode: 200, body: 'OK' };
57
+ * });
58
+ * ```
59
+ */
60
+ declare function createTelescopeHandler<TEvent, TResult>(telescope: Telescope, handler: (event: TEvent, context: Context) => Promise<TResult>, options?: TelescopeMiddlewareOptions): (event: TEvent, context: Context) => Promise<TResult>;
61
+ //# sourceMappingURL=middy.d.ts.map
62
+ //#endregion
63
+ export { TelescopeMiddlewareOptions, createTelescopeHandler, telescopeMiddleware };
64
+ //# sourceMappingURL=middy-B6Btl8XE.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middy-B6Btl8XE.d.mts","names":[],"sources":["../src/adapters/middy.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAYA;AA2MgB,UA3MC,0BAAA,CA2MkB;EAAA;;;;;EAIW,gBAE7C,CAAA,EAAA,MAAA;EAAK;;AAHU;AA8HhB;EAAsC,UAAA,CAAA,EAAA,OAAA;EAAA;;;;EAEwB,cAAf,CAAA,EAAA,MAAA;;;;;;AAEA;;;;;;;;;;;;;;iBArI/B,mBAAA,YACJ,qBACF,6BACP,cACF,uBAAuB,6BAEvB,OACA;;;;;;;;;;;;;;iBA0He,mDACJ,4BACM,iBAAiB,YAAY,QAAQ,oBAC7C,qCACC,iBAAiB,YAAY,QAAQ"}
@@ -0,0 +1,236 @@
1
+ import { flushTelemetry } from "./core-D6hJ6exL.mjs";
2
+
3
+ //#region src/adapters/middy.ts
4
+ let processHooksRegistered = false;
5
+ /**
6
+ * Register process-level hooks for telemetry flush.
7
+ * Called once per Lambda cold start.
8
+ */
9
+ function registerProcessHooks() {
10
+ if (processHooksRegistered) return;
11
+ processHooksRegistered = true;
12
+ process.on("SIGTERM", async () => {
13
+ await flushTelemetry(5e3).catch(() => {});
14
+ });
15
+ }
16
+ /**
17
+ * Extract request data from API Gateway event (v1 or v2)
18
+ */
19
+ function extractRequestData(event) {
20
+ const headers = {};
21
+ if (event.headers) {
22
+ for (const [key, value] of Object.entries(event.headers)) if (value) headers[key.toLowerCase()] = value;
23
+ }
24
+ const contentLength = headers["content-length"];
25
+ const requestSize = contentLength ? parseInt(contentLength, 10) : void 0;
26
+ if ("rawPath" in event && event.requestContext?.http) {
27
+ const v2Event = event;
28
+ const query = {};
29
+ if (v2Event.queryStringParameters) {
30
+ for (const [key, value] of Object.entries(v2Event.queryStringParameters)) if (value !== void 0) query[key] = value;
31
+ }
32
+ return {
33
+ method: v2Event.requestContext.http.method,
34
+ path: v2Event.rawPath,
35
+ url: v2Event.rawPath + (v2Event.rawQueryString ? `?${v2Event.rawQueryString}` : ""),
36
+ headers,
37
+ query,
38
+ body: parseBody(v2Event.body, v2Event.isBase64Encoded),
39
+ ip: v2Event.requestContext.http.sourceIp,
40
+ requestId: v2Event.requestContext.requestId,
41
+ requestSize
42
+ };
43
+ }
44
+ const v1Event = event;
45
+ const queryString = v1Event.queryStringParameters ? new URLSearchParams(v1Event.queryStringParameters).toString() : "";
46
+ return {
47
+ method: v1Event.httpMethod,
48
+ path: v1Event.path,
49
+ url: v1Event.path + (queryString ? `?${queryString}` : ""),
50
+ headers,
51
+ query: v1Event.queryStringParameters || {},
52
+ body: parseBody(v1Event.body, v1Event.isBase64Encoded),
53
+ ip: v1Event.requestContext?.identity?.sourceIp,
54
+ requestId: v1Event.requestContext?.requestId,
55
+ requestSize
56
+ };
57
+ }
58
+ /**
59
+ * Parse request body
60
+ */
61
+ function parseBody(body, isBase64Encoded) {
62
+ if (!body) return void 0;
63
+ try {
64
+ const decoded = isBase64Encoded ? Buffer.from(body, "base64").toString("utf-8") : body;
65
+ return JSON.parse(decoded);
66
+ } catch {
67
+ return body;
68
+ }
69
+ }
70
+ /**
71
+ * Extract response data from Lambda response
72
+ */
73
+ function extractResponseData(response) {
74
+ if (response && typeof response === "object" && "statusCode" in response) {
75
+ const res = response;
76
+ const headers = res.headers || {};
77
+ const contentLengthKey = Object.keys(headers).find((k) => k.toLowerCase() === "content-length");
78
+ const contentLengthValue = contentLengthKey ? headers[contentLengthKey] : void 0;
79
+ const responseSize = contentLengthValue ? parseInt(contentLengthValue, 10) : res.body ? Buffer.byteLength(res.body, "utf8") : void 0;
80
+ return {
81
+ status: res.statusCode || 200,
82
+ headers,
83
+ body: res.body ? tryParseJson(res.body) : void 0,
84
+ responseSize
85
+ };
86
+ }
87
+ return {
88
+ status: 200,
89
+ headers: {},
90
+ body: response
91
+ };
92
+ }
93
+ function tryParseJson(str) {
94
+ try {
95
+ return JSON.parse(str);
96
+ } catch {
97
+ return str;
98
+ }
99
+ }
100
+ /**
101
+ * Middy middleware that integrates Telescope with Lambda handlers.
102
+ *
103
+ * Features:
104
+ * - Records all requests and responses to Telescope
105
+ * - Captures exceptions automatically
106
+ * - Flushes telemetry before Lambda freezes
107
+ * - Uses Lambda context for smart flush timing
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * import middy from '@middy/core';
112
+ * import { telescopeMiddleware } from '@geekmidas/telescope/lambda';
113
+ *
114
+ * const handler = middy(baseHandler)
115
+ * .use(telescopeMiddleware(telescope));
116
+ * ```
117
+ */
118
+ function telescopeMiddleware(telescope, options = {}) {
119
+ const { flushThresholdMs = 1e3, recordBody = true, flushTimeoutMs = 5e3 } = options;
120
+ registerProcessHooks();
121
+ return {
122
+ before: async (request) => {
123
+ request.__telescopeStartTime = Date.now();
124
+ request.context.callbackWaitsForEmptyEventLoop = false;
125
+ },
126
+ after: async (request) => {
127
+ const startTime = request.__telescopeStartTime || Date.now();
128
+ const duration = Date.now() - startTime;
129
+ try {
130
+ const reqData = extractRequestData(request.event);
131
+ const resData = extractResponseData(request.response);
132
+ await telescope.recordRequest({
133
+ method: reqData.method,
134
+ path: reqData.path,
135
+ url: reqData.url,
136
+ headers: reqData.headers,
137
+ query: reqData.query,
138
+ body: recordBody ? reqData.body : void 0,
139
+ ip: reqData.ip,
140
+ status: resData.status,
141
+ responseHeaders: resData.headers,
142
+ responseBody: recordBody ? resData.body : void 0,
143
+ duration,
144
+ requestSize: reqData.requestSize,
145
+ responseSize: resData.responseSize
146
+ });
147
+ } catch {}
148
+ await smartFlush(request.context, flushThresholdMs, flushTimeoutMs);
149
+ },
150
+ onError: async (request) => {
151
+ const startTime = request.__telescopeStartTime || Date.now();
152
+ const duration = Date.now() - startTime;
153
+ try {
154
+ if (request.error) await telescope.exception(request.error);
155
+ const reqData = extractRequestData(request.event);
156
+ await telescope.recordRequest({
157
+ method: reqData.method,
158
+ path: reqData.path,
159
+ url: reqData.url,
160
+ headers: reqData.headers,
161
+ query: reqData.query,
162
+ body: recordBody ? reqData.body : void 0,
163
+ ip: reqData.ip,
164
+ status: 500,
165
+ responseHeaders: {},
166
+ responseBody: { error: request.error?.message },
167
+ duration,
168
+ requestSize: reqData.requestSize
169
+ });
170
+ } catch {}
171
+ await smartFlush(request.context, flushThresholdMs, flushTimeoutMs);
172
+ }
173
+ };
174
+ }
175
+ /**
176
+ * Smart flush that respects Lambda's remaining execution time
177
+ */
178
+ async function smartFlush(context, thresholdMs, timeoutMs) {
179
+ const remaining = context.getRemainingTimeInMillis();
180
+ const effectiveTimeout = Math.min(timeoutMs, Math.max(remaining - thresholdMs, 100));
181
+ if (effectiveTimeout > 0) await flushTelemetry(effectiveTimeout).catch(() => {});
182
+ }
183
+ /**
184
+ * Create a wrapped Lambda handler with Telescope integration.
185
+ * Alternative to using Middy middleware directly.
186
+ *
187
+ * @example
188
+ * ```typescript
189
+ * import { createTelescopeHandler } from '@geekmidas/telescope/lambda';
190
+ *
191
+ * export const handler = createTelescopeHandler(telescope, async (event, context) => {
192
+ * return { statusCode: 200, body: 'OK' };
193
+ * });
194
+ * ```
195
+ */
196
+ function createTelescopeHandler(telescope, handler, options = {}) {
197
+ const { flushThresholdMs = 1e3, recordBody = true, flushTimeoutMs = 5e3 } = options;
198
+ registerProcessHooks();
199
+ return async (event, context) => {
200
+ const startTime = Date.now();
201
+ context.callbackWaitsForEmptyEventLoop = false;
202
+ try {
203
+ const result = await handler(event, context);
204
+ const duration = Date.now() - startTime;
205
+ try {
206
+ const reqData = extractRequestData(event);
207
+ const resData = extractResponseData(result);
208
+ await telescope.recordRequest({
209
+ method: reqData.method,
210
+ path: reqData.path,
211
+ url: reqData.url,
212
+ headers: reqData.headers,
213
+ query: reqData.query,
214
+ body: recordBody ? reqData.body : void 0,
215
+ ip: reqData.ip,
216
+ status: resData.status,
217
+ responseHeaders: resData.headers,
218
+ responseBody: recordBody ? resData.body : void 0,
219
+ duration,
220
+ requestSize: reqData.requestSize,
221
+ responseSize: resData.responseSize
222
+ });
223
+ } catch {}
224
+ await smartFlush(context, flushThresholdMs, flushTimeoutMs);
225
+ return result;
226
+ } catch (error) {
227
+ if (error instanceof Error) await telescope.exception(error).catch(() => {});
228
+ await smartFlush(context, flushThresholdMs, flushTimeoutMs);
229
+ throw error;
230
+ }
231
+ };
232
+ }
233
+
234
+ //#endregion
235
+ export { createTelescopeHandler, telescopeMiddleware };
236
+ //# sourceMappingURL=middy-BTR3cyvk.mjs.map