@geekmidas/telescope 10.0.0-alpha.2 → 10.0.0-alpha.21

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 (391) hide show
  1. package/dist/{MetricsAggregator-4SqelGcG.d.cts → MetricsAggregator-BxBLQUPj.d.cts} +3 -6
  2. package/dist/MetricsAggregator-BxBLQUPj.d.cts.map +1 -0
  3. package/dist/{MetricsAggregator-DZrW8ls6.d.mts → MetricsAggregator-j9wmZ0K_.d.mts} +3 -6
  4. package/dist/MetricsAggregator-j9wmZ0K_.d.mts.map +1 -0
  5. package/dist/{Telescope-D4nmwDRA.d.cts → Telescope-BcrWTaar.d.mts} +4 -7
  6. package/dist/Telescope-BcrWTaar.d.mts.map +1 -0
  7. package/dist/{Telescope-Dl6VSfxd.d.mts → Telescope-DnCMZT7V.d.cts} +4 -7
  8. package/dist/Telescope-DnCMZT7V.d.cts.map +1 -0
  9. package/dist/Telescope.cjs +385 -4
  10. package/dist/Telescope.cjs.map +1 -0
  11. package/dist/Telescope.d.cts +1 -3
  12. package/dist/Telescope.d.mts +1 -3
  13. package/dist/Telescope.mjs +384 -4
  14. package/dist/Telescope.mjs.map +1 -0
  15. package/dist/adapters/index.d.cts +2 -2
  16. package/dist/adapters/index.d.mts +2 -2
  17. package/dist/adapters/index.mjs +1 -0
  18. package/dist/adapters/lambda.cjs +9 -10
  19. package/dist/adapters/lambda.cjs.map +1 -1
  20. package/dist/adapters/lambda.d.cts +9 -13
  21. package/dist/adapters/lambda.d.cts.map +1 -1
  22. package/dist/adapters/lambda.d.mts +9 -13
  23. package/dist/adapters/lambda.d.mts.map +1 -1
  24. package/dist/adapters/lambda.mjs +3 -4
  25. package/dist/adapters/lambda.mjs.map +1 -1
  26. package/dist/adapters/middy.cjs +236 -4
  27. package/dist/adapters/middy.cjs.map +1 -0
  28. package/dist/adapters/middy.d.cts +60 -5
  29. package/dist/adapters/middy.d.cts.map +1 -0
  30. package/dist/adapters/middy.d.mts +60 -5
  31. package/dist/adapters/middy.d.mts.map +1 -0
  32. package/dist/adapters/middy.mjs +234 -3
  33. package/dist/adapters/middy.mjs.map +1 -0
  34. package/dist/adapters/types.d.cts +162 -2
  35. package/dist/adapters/types.d.cts.map +1 -0
  36. package/dist/adapters/types.d.mts +162 -2
  37. package/dist/adapters/types.d.mts.map +1 -0
  38. package/dist/adapters/types.mjs +1 -0
  39. package/dist/core.cjs +22 -22
  40. package/dist/core.d.cts +4 -4
  41. package/dist/core.d.mts +4 -4
  42. package/dist/core.mjs +3 -4
  43. package/dist/index.cjs +8 -9
  44. package/dist/index.d.cts +5 -6
  45. package/dist/index.d.mts +5 -6
  46. package/dist/index.mjs +5 -7
  47. package/dist/instrumentation/core.cjs +147 -11
  48. package/dist/instrumentation/core.cjs.map +1 -0
  49. package/dist/instrumentation/core.d.cts +74 -3
  50. package/dist/instrumentation/core.d.cts.map +1 -0
  51. package/dist/instrumentation/core.d.mts +74 -3
  52. package/dist/instrumentation/core.d.mts.map +1 -0
  53. package/dist/instrumentation/core.mjs +137 -2
  54. package/dist/instrumentation/core.mjs.map +1 -0
  55. package/dist/instrumentation/hono.cjs +134 -6
  56. package/dist/instrumentation/hono.cjs.map +1 -0
  57. package/dist/instrumentation/hono.d.cts +67 -2
  58. package/dist/instrumentation/hono.d.cts.map +1 -0
  59. package/dist/instrumentation/hono.d.mts +67 -2
  60. package/dist/instrumentation/hono.d.mts.map +1 -0
  61. package/dist/instrumentation/hono.mjs +130 -3
  62. package/dist/instrumentation/hono.mjs.map +1 -0
  63. package/dist/instrumentation/http.cjs +164 -11
  64. package/dist/instrumentation/http.cjs.map +1 -0
  65. package/dist/instrumentation/http.d.cts +103 -2
  66. package/dist/instrumentation/http.d.cts.map +1 -0
  67. package/dist/instrumentation/http.d.mts +103 -2
  68. package/dist/instrumentation/http.d.mts.map +1 -0
  69. package/dist/instrumentation/http.mjs +154 -2
  70. package/dist/instrumentation/http.mjs.map +1 -0
  71. package/dist/instrumentation/index.cjs +47 -47
  72. package/dist/instrumentation/index.d.cts +9 -9
  73. package/dist/instrumentation/index.d.mts +9 -9
  74. package/dist/instrumentation/index.mjs +8 -9
  75. package/dist/instrumentation/middleware.cjs +162 -6
  76. package/dist/instrumentation/middleware.cjs.map +1 -0
  77. package/dist/instrumentation/middleware.d.cts +70 -2
  78. package/dist/instrumentation/middleware.d.cts.map +1 -0
  79. package/dist/instrumentation/middleware.d.mts +70 -2
  80. package/dist/instrumentation/middleware.d.mts.map +1 -0
  81. package/dist/instrumentation/middleware.mjs +158 -3
  82. package/dist/instrumentation/middleware.mjs.map +1 -0
  83. package/dist/instrumentation/otel.cjs +137 -3
  84. package/dist/instrumentation/otel.cjs.map +1 -0
  85. package/dist/instrumentation/otel.d.cts +97 -2
  86. package/dist/instrumentation/otel.d.cts.map +1 -0
  87. package/dist/instrumentation/otel.d.mts +97 -2
  88. package/dist/instrumentation/otel.d.mts.map +1 -0
  89. package/dist/instrumentation/otel.mjs +136 -3
  90. package/dist/instrumentation/otel.mjs.map +1 -0
  91. package/dist/instrumentation/setup.cjs +100 -4
  92. package/dist/instrumentation/setup.cjs.map +1 -0
  93. package/dist/instrumentation/setup.d.cts +83 -3
  94. package/dist/instrumentation/setup.d.cts.map +1 -0
  95. package/dist/instrumentation/setup.d.mts +83 -3
  96. package/dist/instrumentation/setup.d.mts.map +1 -0
  97. package/dist/instrumentation/setup.mjs +98 -3
  98. package/dist/instrumentation/setup.mjs.map +1 -0
  99. package/dist/instrumentation/tracing.cjs +114 -10
  100. package/dist/instrumentation/tracing.cjs.map +1 -0
  101. package/dist/instrumentation/tracing.d.cts +49 -2
  102. package/dist/instrumentation/tracing.d.cts.map +1 -0
  103. package/dist/instrumentation/tracing.d.mts +49 -2
  104. package/dist/instrumentation/tracing.d.mts.map +1 -0
  105. package/dist/instrumentation/tracing.mjs +105 -2
  106. package/dist/instrumentation/tracing.mjs.map +1 -0
  107. package/dist/logger/console.cjs +18 -12
  108. package/dist/logger/console.cjs.map +1 -1
  109. package/dist/logger/console.d.cts +7 -10
  110. package/dist/logger/console.d.cts.map +1 -1
  111. package/dist/logger/console.d.mts +7 -10
  112. package/dist/logger/console.d.mts.map +1 -1
  113. package/dist/logger/console.mjs +17 -11
  114. package/dist/logger/console.mjs.map +1 -1
  115. package/dist/logger/pino.cjs +6 -5
  116. package/dist/logger/pino.cjs.map +1 -1
  117. package/dist/logger/pino.d.cts +6 -10
  118. package/dist/logger/pino.d.cts.map +1 -1
  119. package/dist/logger/pino.d.mts +6 -10
  120. package/dist/logger/pino.d.mts.map +1 -1
  121. package/dist/logger/pino.mjs +2 -3
  122. package/dist/logger/pino.mjs.map +1 -1
  123. package/dist/metrics/MetricsAggregator.cjs +354 -2
  124. package/dist/metrics/MetricsAggregator.cjs.map +1 -0
  125. package/dist/metrics/MetricsAggregator.d.cts +1 -2
  126. package/dist/metrics/MetricsAggregator.d.mts +1 -2
  127. package/dist/metrics/MetricsAggregator.mjs +353 -2
  128. package/dist/metrics/MetricsAggregator.mjs.map +1 -0
  129. package/dist/metrics/index.cjs +3 -4
  130. package/dist/metrics/index.d.cts +2 -4
  131. package/dist/metrics/index.d.mts +2 -4
  132. package/dist/metrics/index.mjs +2 -4
  133. package/dist/metrics/storage/InMemoryMetricsStorage.cjs +240 -3
  134. package/dist/metrics/storage/InMemoryMetricsStorage.cjs.map +1 -0
  135. package/dist/metrics/storage/InMemoryMetricsStorage.d.cts +43 -4
  136. package/dist/metrics/storage/InMemoryMetricsStorage.d.cts.map +1 -0
  137. package/dist/metrics/storage/InMemoryMetricsStorage.d.mts +43 -4
  138. package/dist/metrics/storage/InMemoryMetricsStorage.d.mts.map +1 -0
  139. package/dist/metrics/storage/InMemoryMetricsStorage.mjs +239 -3
  140. package/dist/metrics/storage/InMemoryMetricsStorage.mjs.map +1 -0
  141. package/dist/metrics/storage/MetricsStorage.cjs +0 -1
  142. package/dist/metrics/storage/MetricsStorage.d.cts +56 -3
  143. package/dist/metrics/storage/MetricsStorage.d.cts.map +1 -0
  144. package/dist/metrics/storage/MetricsStorage.d.mts +56 -3
  145. package/dist/metrics/storage/MetricsStorage.d.mts.map +1 -0
  146. package/dist/metrics/storage/MetricsStorage.mjs +1 -1
  147. package/dist/metrics/storage/index.cjs +6 -6
  148. package/dist/metrics/storage/index.d.cts +3 -3
  149. package/dist/metrics/storage/index.d.mts +3 -3
  150. package/dist/metrics/storage/index.mjs +4 -5
  151. package/dist/metrics/storage/types.cjs +34 -2
  152. package/dist/metrics/storage/types.cjs.map +1 -0
  153. package/dist/metrics/storage/types.d.cts +207 -2
  154. package/dist/metrics/storage/types.d.cts.map +1 -0
  155. package/dist/metrics/storage/types.d.mts +207 -2
  156. package/dist/metrics/storage/types.d.mts.map +1 -0
  157. package/dist/metrics/storage/types.mjs +33 -2
  158. package/dist/metrics/storage/types.mjs.map +1 -0
  159. package/dist/otlp/hono.cjs +9 -15
  160. package/dist/otlp/hono.cjs.map +1 -1
  161. package/dist/otlp/hono.d.cts +3 -13
  162. package/dist/otlp/hono.d.cts.map +1 -1
  163. package/dist/otlp/hono.d.mts +3 -13
  164. package/dist/otlp/hono.d.mts.map +1 -1
  165. package/dist/otlp/hono.mjs +5 -11
  166. package/dist/otlp/hono.mjs.map +1 -1
  167. package/dist/otlp/index.cjs +11 -11
  168. package/dist/otlp/index.d.cts +4 -7
  169. package/dist/otlp/index.d.mts +4 -7
  170. package/dist/otlp/index.mjs +4 -5
  171. package/dist/otlp/receiver.cjs +88 -4
  172. package/dist/otlp/receiver.cjs.map +1 -0
  173. package/dist/otlp/receiver.d.cts +59 -7
  174. package/dist/otlp/receiver.d.cts.map +1 -0
  175. package/dist/otlp/receiver.d.mts +59 -7
  176. package/dist/otlp/receiver.d.mts.map +1 -0
  177. package/dist/otlp/receiver.mjs +87 -4
  178. package/dist/otlp/receiver.mjs.map +1 -0
  179. package/dist/otlp/transformer.cjs +214 -5
  180. package/dist/otlp/transformer.cjs.map +1 -0
  181. package/dist/otlp/transformer.d.cts +1 -3
  182. package/dist/otlp/transformer.d.mts +1 -3
  183. package/dist/otlp/transformer.mjs +211 -3
  184. package/dist/otlp/transformer.mjs.map +1 -0
  185. package/dist/otlp/types.cjs +57 -5
  186. package/dist/otlp/types.cjs.map +1 -0
  187. package/dist/otlp/types.d.cts +1 -1
  188. package/dist/otlp/types.d.mts +1 -1
  189. package/dist/otlp/types.mjs +53 -2
  190. package/dist/otlp/types.mjs.map +1 -0
  191. package/dist/redact.cjs +84 -3
  192. package/dist/redact.cjs.map +1 -0
  193. package/dist/redact.d.cts +4 -8
  194. package/dist/redact.d.cts.map +1 -1
  195. package/dist/redact.d.mts +4 -8
  196. package/dist/redact.d.mts.map +1 -1
  197. package/dist/redact.mjs +80 -2
  198. package/dist/redact.mjs.map +1 -0
  199. package/dist/{chunk-CUT6urMc.cjs → rolldown-runtime-VH7oDXx4.cjs} +8 -10
  200. package/dist/server/hono.cjs +24 -33
  201. package/dist/server/hono.cjs.map +1 -1
  202. package/dist/server/hono.d.cts +10 -13
  203. package/dist/server/hono.d.cts.map +1 -1
  204. package/dist/server/hono.d.mts +10 -13
  205. package/dist/server/hono.d.mts.map +1 -1
  206. package/dist/server/hono.mjs +22 -31
  207. package/dist/server/hono.mjs.map +1 -1
  208. package/dist/storage/kysely.cjs +34 -32
  209. package/dist/storage/kysely.cjs.map +1 -1
  210. package/dist/storage/kysely.d.cts +8 -12
  211. package/dist/storage/kysely.d.cts.map +1 -1
  212. package/dist/storage/kysely.d.mts +8 -12
  213. package/dist/storage/kysely.d.mts.map +1 -1
  214. package/dist/storage/kysely.mjs +33 -31
  215. package/dist/storage/kysely.mjs.map +1 -1
  216. package/dist/storage/memory.cjs +122 -2
  217. package/dist/storage/memory.cjs.map +1 -0
  218. package/dist/storage/memory.d.cts +36 -3
  219. package/dist/storage/memory.d.cts.map +1 -0
  220. package/dist/storage/memory.d.mts +36 -3
  221. package/dist/storage/memory.d.mts.map +1 -0
  222. package/dist/storage/memory.mjs +121 -2
  223. package/dist/storage/memory.mjs.map +1 -0
  224. package/dist/{transformer-CTGsaVfV.d.mts → transformer-BBBXCjHP.d.mts} +4 -8
  225. package/dist/transformer-BBBXCjHP.d.mts.map +1 -0
  226. package/dist/{transformer-ICEbxpFf.d.cts → transformer-DlESim6Q.d.cts} +4 -8
  227. package/dist/transformer-DlESim6Q.d.cts.map +1 -0
  228. package/dist/{types-CmOB7CLO.d.cts → types-DVETVdpa.d.cts} +6 -7
  229. package/dist/types-DVETVdpa.d.cts.map +1 -0
  230. package/dist/{types-DBc0q5KD.d.mts → types-DVETVdpa.d.mts} +6 -7
  231. package/dist/types-DVETVdpa.d.mts.map +1 -0
  232. package/dist/{types-B1EIa_cQ.d.mts → types-a9Vistj1.d.cts} +2 -3
  233. package/dist/types-a9Vistj1.d.cts.map +1 -0
  234. package/dist/{types-l7Rlb5Mg.d.cts → types-a9Vistj1.d.mts} +2 -3
  235. package/dist/types-a9Vistj1.d.mts.map +1 -0
  236. package/dist/types.d.cts +1 -1
  237. package/dist/types.d.mts +1 -1
  238. package/dist/types.mjs +1 -0
  239. package/dist/ui-assets.cjs +31 -4
  240. package/dist/ui-assets.cjs.map +1 -0
  241. package/dist/ui-assets.d.cts +4 -6
  242. package/dist/ui-assets.d.cts.map +1 -1
  243. package/dist/ui-assets.d.mts +4 -6
  244. package/dist/ui-assets.d.mts.map +1 -1
  245. package/dist/ui-assets.mjs +28 -2
  246. package/dist/ui-assets.mjs.map +1 -0
  247. package/package.json +39 -37
  248. package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts +0 -47
  249. package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts.map +0 -1
  250. package/dist/InMemoryMetricsStorage-C4drxT7G.mjs +0 -247
  251. package/dist/InMemoryMetricsStorage-C4drxT7G.mjs.map +0 -1
  252. package/dist/InMemoryMetricsStorage-D0njWUSi.cjs +0 -252
  253. package/dist/InMemoryMetricsStorage-D0njWUSi.cjs.map +0 -1
  254. package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts +0 -47
  255. package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts.map +0 -1
  256. package/dist/MetricsAggregator-4SqelGcG.d.cts.map +0 -1
  257. package/dist/MetricsAggregator-B7lUICdH.cjs +0 -363
  258. package/dist/MetricsAggregator-B7lUICdH.cjs.map +0 -1
  259. package/dist/MetricsAggregator-DZrW8ls6.d.mts.map +0 -1
  260. package/dist/MetricsAggregator-S3DQWNas.mjs +0 -357
  261. package/dist/MetricsAggregator-S3DQWNas.mjs.map +0 -1
  262. package/dist/MetricsStorage-B86e4131.d.cts +0 -60
  263. package/dist/MetricsStorage-B86e4131.d.cts.map +0 -1
  264. package/dist/MetricsStorage-BWyP2_12.d.mts +0 -60
  265. package/dist/MetricsStorage-BWyP2_12.d.mts.map +0 -1
  266. package/dist/MetricsStorage-BypQXWiv.mjs +0 -0
  267. package/dist/MetricsStorage-Or8pVCe4.cjs +0 -0
  268. package/dist/Telescope-Cs3fv8jt.cjs +0 -395
  269. package/dist/Telescope-Cs3fv8jt.cjs.map +0 -1
  270. package/dist/Telescope-D4nmwDRA.d.cts.map +0 -1
  271. package/dist/Telescope-Dh5av3FC.mjs +0 -389
  272. package/dist/Telescope-Dh5av3FC.mjs.map +0 -1
  273. package/dist/Telescope-Dl6VSfxd.d.mts.map +0 -1
  274. package/dist/core--quSp5Qr.d.mts +0 -78
  275. package/dist/core--quSp5Qr.d.mts.map +0 -1
  276. package/dist/core-B4Jpia5H.d.cts +0 -78
  277. package/dist/core-B4Jpia5H.d.cts.map +0 -1
  278. package/dist/core-CtVHRJGv.cjs +0 -199
  279. package/dist/core-CtVHRJGv.cjs.map +0 -1
  280. package/dist/core-D6hJ6exL.mjs +0 -139
  281. package/dist/core-D6hJ6exL.mjs.map +0 -1
  282. package/dist/hono--uKQ7Jgi.d.mts +0 -71
  283. package/dist/hono--uKQ7Jgi.d.mts.map +0 -1
  284. package/dist/hono-Bw-ey6CT.mjs +0 -136
  285. package/dist/hono-Bw-ey6CT.mjs.map +0 -1
  286. package/dist/hono-CPHX7FAm.cjs +0 -160
  287. package/dist/hono-CPHX7FAm.cjs.map +0 -1
  288. package/dist/hono-CemCKU87.d.cts +0 -71
  289. package/dist/hono-CemCKU87.d.cts.map +0 -1
  290. package/dist/http-BIvr0YdI.mjs +0 -159
  291. package/dist/http-BIvr0YdI.mjs.map +0 -1
  292. package/dist/http-BiNtg85L.d.mts +0 -107
  293. package/dist/http-BiNtg85L.d.mts.map +0 -1
  294. package/dist/http-BsqmhurZ.cjs +0 -219
  295. package/dist/http-BsqmhurZ.cjs.map +0 -1
  296. package/dist/http-D1oTbfap.d.cts +0 -107
  297. package/dist/http-D1oTbfap.d.cts.map +0 -1
  298. package/dist/index-BL32-cvv.d.cts +0 -1
  299. package/dist/index-CsuikFeJ.d.mts +0 -1
  300. package/dist/memory--BK4iWiv.d.cts +0 -40
  301. package/dist/memory--BK4iWiv.d.cts.map +0 -1
  302. package/dist/memory-6S9H-IF5.mjs +0 -123
  303. package/dist/memory-6S9H-IF5.mjs.map +0 -1
  304. package/dist/memory-B0d_n1g5.cjs +0 -129
  305. package/dist/memory-B0d_n1g5.cjs.map +0 -1
  306. package/dist/memory-DCirEVFW.d.mts +0 -40
  307. package/dist/memory-DCirEVFW.d.mts.map +0 -1
  308. package/dist/metrics-D5YT-Rnq.mjs +0 -0
  309. package/dist/metrics-fhD3l3C3.cjs +0 -0
  310. package/dist/middleware-Bcq6XXGG.cjs +0 -184
  311. package/dist/middleware-Bcq6XXGG.cjs.map +0 -1
  312. package/dist/middleware-D1XEHvyy.mjs +0 -160
  313. package/dist/middleware-D1XEHvyy.mjs.map +0 -1
  314. package/dist/middleware-PeyS-9Ny.d.cts +0 -74
  315. package/dist/middleware-PeyS-9Ny.d.cts.map +0 -1
  316. package/dist/middleware-oHvo_ZgU.d.mts +0 -74
  317. package/dist/middleware-oHvo_ZgU.d.mts.map +0 -1
  318. package/dist/middy-B6Btl8XE.d.mts +0 -64
  319. package/dist/middy-B6Btl8XE.d.mts.map +0 -1
  320. package/dist/middy-Bq0defVg.d.cts +0 -64
  321. package/dist/middy-Bq0defVg.d.cts.map +0 -1
  322. package/dist/middy-DHWLmUAD.mjs +0 -236
  323. package/dist/middy-DHWLmUAD.mjs.map +0 -1
  324. package/dist/middy-DlWnZilH.cjs +0 -247
  325. package/dist/middy-DlWnZilH.cjs.map +0 -1
  326. package/dist/otel-B9bNoeZ2.mjs +0 -130
  327. package/dist/otel-B9bNoeZ2.mjs.map +0 -1
  328. package/dist/otel-Bk89b1lX.d.cts +0 -101
  329. package/dist/otel-Bk89b1lX.d.cts.map +0 -1
  330. package/dist/otel-BzjOtVxZ.cjs +0 -136
  331. package/dist/otel-BzjOtVxZ.cjs.map +0 -1
  332. package/dist/otel-lPMsM26e.d.mts +0 -101
  333. package/dist/otel-lPMsM26e.d.mts.map +0 -1
  334. package/dist/receiver-D46dfkYI.mjs +0 -89
  335. package/dist/receiver-D46dfkYI.mjs.map +0 -1
  336. package/dist/receiver-DLICx5uU.d.cts +0 -63
  337. package/dist/receiver-DLICx5uU.d.cts.map +0 -1
  338. package/dist/receiver-UeZT-H8u.d.mts +0 -63
  339. package/dist/receiver-UeZT-H8u.d.mts.map +0 -1
  340. package/dist/receiver-slCoAFat.cjs +0 -94
  341. package/dist/receiver-slCoAFat.cjs.map +0 -1
  342. package/dist/redact-BzkITCNW.mjs +0 -83
  343. package/dist/redact-BzkITCNW.mjs.map +0 -1
  344. package/dist/redact-DVaSSPZT.cjs +0 -95
  345. package/dist/redact-DVaSSPZT.cjs.map +0 -1
  346. package/dist/setup-Bkxm4g6b.d.mts +0 -87
  347. package/dist/setup-Bkxm4g6b.d.mts.map +0 -1
  348. package/dist/setup-D58N1f9O.d.cts +0 -87
  349. package/dist/setup-D58N1f9O.d.cts.map +0 -1
  350. package/dist/setup-DC9JMEYZ.mjs +0 -98
  351. package/dist/setup-DC9JMEYZ.mjs.map +0 -1
  352. package/dist/setup-DufxQpi9.cjs +0 -110
  353. package/dist/setup-DufxQpi9.cjs.map +0 -1
  354. package/dist/tracing-BX8uY2nR.d.cts +0 -53
  355. package/dist/tracing-BX8uY2nR.d.cts.map +0 -1
  356. package/dist/tracing-Bt1zWRlb.cjs +0 -167
  357. package/dist/tracing-Bt1zWRlb.cjs.map +0 -1
  358. package/dist/tracing-Cijm_5NI.mjs +0 -113
  359. package/dist/tracing-Cijm_5NI.mjs.map +0 -1
  360. package/dist/tracing-PnECEbEu.d.mts +0 -53
  361. package/dist/tracing-PnECEbEu.d.mts.map +0 -1
  362. package/dist/transformer-CFQ4WFk6.mjs +0 -215
  363. package/dist/transformer-CFQ4WFk6.mjs.map +0 -1
  364. package/dist/transformer-CTGsaVfV.d.mts.map +0 -1
  365. package/dist/transformer-Csl6fbgv.cjs +0 -232
  366. package/dist/transformer-Csl6fbgv.cjs.map +0 -1
  367. package/dist/transformer-ICEbxpFf.d.cts.map +0 -1
  368. package/dist/types-B1EIa_cQ.d.mts.map +0 -1
  369. package/dist/types-BMiHgsi4.cjs +0 -78
  370. package/dist/types-BMiHgsi4.cjs.map +0 -1
  371. package/dist/types-BRzW1NM8.d.cts +0 -166
  372. package/dist/types-BRzW1NM8.d.cts.map +0 -1
  373. package/dist/types-BS3Rx8Sk.d.cts +0 -209
  374. package/dist/types-BS3Rx8Sk.d.cts.map +0 -1
  375. package/dist/types-BzQ78Efw.d.mts +0 -166
  376. package/dist/types-BzQ78Efw.d.mts.map +0 -1
  377. package/dist/types-CbNGXnJE.d.mts +0 -209
  378. package/dist/types-CbNGXnJE.d.mts.map +0 -1
  379. package/dist/types-Cj59nqy7.mjs +0 -54
  380. package/dist/types-Cj59nqy7.mjs.map +0 -1
  381. package/dist/types-CmOB7CLO.d.cts.map +0 -1
  382. package/dist/types-DBc0q5KD.d.mts.map +0 -1
  383. package/dist/types-ZW-nfWf6.cjs +0 -40
  384. package/dist/types-ZW-nfWf6.cjs.map +0 -1
  385. package/dist/types-l7Rlb5Mg.d.cts.map +0 -1
  386. package/dist/types-ojhnLdwz.mjs +0 -34
  387. package/dist/types-ojhnLdwz.mjs.map +0 -1
  388. package/dist/ui-assets-BEXqOQLe.cjs +0 -48
  389. package/dist/ui-assets-BEXqOQLe.cjs.map +0 -1
  390. package/dist/ui-assets-BhTDUsrM.mjs +0 -30
  391. package/dist/ui-assets-BhTDUsrM.mjs.map +0 -1
@@ -1,4 +1,138 @@
1
- require('../http-BsqmhurZ.cjs');
2
- const require_otel = require('../otel-BzjOtVxZ.cjs');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_instrumentation_http = require("./http.cjs");
3
+ let _opentelemetry_api = require("@opentelemetry/api");
4
+ //#region src/instrumentation/otel.ts
5
+ /**
6
+ * OpenTelemetry implementation of the Telemetry interface
7
+ *
8
+ * This provides automatic span creation for Lambda handlers using
9
+ * OpenTelemetry. Works with any OTel-compatible backend (Jaeger, Zipkin,
10
+ * Datadog, Honeycomb, etc.)
11
+ */
12
+ /**
13
+ * OpenTelemetry implementation of the Telemetry interface
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { OTelTelemetry } from '@geekmidas/telescope/instrumentation';
18
+ *
19
+ * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {
20
+ * telemetry: new OTelTelemetry(),
21
+ * });
22
+ * ```
23
+ *
24
+ * @example With options
25
+ * ```typescript
26
+ * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {
27
+ * telemetry: new OTelTelemetry({
28
+ * recordBody: true,
29
+ * getUserId: (event) => event.requestContext?.authorizer?.userId,
30
+ * }),
31
+ * });
32
+ * ```
33
+ */
34
+ var OTelTelemetry = class {
35
+ options;
36
+ constructor(options = {}) {
37
+ this.options = options;
38
+ }
39
+ onRequestStart(request) {
40
+ const { event, context: lambdaContext } = request;
41
+ const headers = normalizeHeaders(event.headers || {});
42
+ const parentContext = require_instrumentation_http.extractTraceContext(headers);
43
+ const attrs = this.buildSpanAttributes(event, lambdaContext);
44
+ const span = require_instrumentation_http.createHttpServerSpan(attrs, parentContext);
45
+ const otelContext = _opentelemetry_api.trace.setSpan(parentContext, span);
46
+ span.setAttribute("faas.invocation_id", lambdaContext.awsRequestId);
47
+ span.setAttribute("faas.name", lambdaContext.functionName);
48
+ if (this.options.recordBody && event.body) {
49
+ const bodyStr = typeof event.body === "string" ? event.body : JSON.stringify(event.body);
50
+ span.setAttribute("http.request.body", bodyStr.length > 4096 ? `${bodyStr.slice(0, 4096)}...` : bodyStr);
51
+ }
52
+ return {
53
+ span,
54
+ otelContext
55
+ };
56
+ }
57
+ onRequestEnd(ctx, response) {
58
+ const { span } = ctx;
59
+ if (this.options.recordResponseBody && response.body) span.setAttribute("http.response.body", response.body.length > 4096 ? `${response.body.slice(0, 4096)}...` : response.body);
60
+ require_instrumentation_http.endHttpSpan(span, { statusCode: response.statusCode });
61
+ }
62
+ onRequestError(ctx, error) {
63
+ const { span } = ctx;
64
+ require_instrumentation_http.endHttpSpan(span, { statusCode: 500 }, error);
65
+ }
66
+ /**
67
+ * Build span attributes from Lambda event
68
+ */
69
+ buildSpanAttributes(event, lambdaContext) {
70
+ const isV2 = "requestContext" in event && "http" in (event.requestContext || {});
71
+ const isV1 = "requestContext" in event && "httpMethod" in event && !("http" in (event.requestContext || {}));
72
+ let method = "INVOKE";
73
+ let path = "/";
74
+ let route;
75
+ let host;
76
+ let scheme;
77
+ let userAgent;
78
+ let clientIp;
79
+ let requestId;
80
+ if (isV2) {
81
+ const http = event.requestContext.http;
82
+ method = http.method;
83
+ path = event.rawPath || http.path;
84
+ route = event.routeKey?.replace(/^[A-Z]+\s+/, "");
85
+ host = event.headers?.host;
86
+ scheme = "https";
87
+ userAgent = http.userAgent;
88
+ clientIp = http.sourceIp;
89
+ requestId = event.requestContext.requestId;
90
+ } else if (isV1) {
91
+ method = event.httpMethod;
92
+ path = event.path;
93
+ route = event.resource;
94
+ host = event.headers?.Host || event.headers?.host;
95
+ scheme = "https";
96
+ userAgent = event.headers?.["User-Agent"] || event.headers?.["user-agent"];
97
+ clientIp = event.requestContext?.identity?.sourceIp;
98
+ requestId = event.requestContext?.requestId;
99
+ } else if ("httpMethod" in event) {
100
+ method = event.httpMethod;
101
+ path = event.path;
102
+ host = event.headers?.host;
103
+ userAgent = event.headers?.["user-agent"] || event.headers?.["User-Agent"];
104
+ clientIp = event.headers?.["x-forwarded-for"]?.split(",")[0]?.trim();
105
+ }
106
+ const attrs = {
107
+ method,
108
+ path,
109
+ route,
110
+ host,
111
+ scheme,
112
+ userAgent,
113
+ clientIp,
114
+ requestId: requestId || lambdaContext.awsRequestId
115
+ };
116
+ if (this.options.getEndpointName || this.options.getOperationId) attrs.endpoint = {
117
+ name: this.options.getEndpointName?.(event),
118
+ operationId: this.options.getOperationId?.(event)
119
+ };
120
+ if (this.options.getUserId) {
121
+ const userId = this.options.getUserId(event);
122
+ if (userId) attrs.user = { userId };
123
+ }
124
+ return attrs;
125
+ }
126
+ };
127
+ /**
128
+ * Normalize headers to lowercase keys
129
+ */
130
+ function normalizeHeaders(headers) {
131
+ const normalized = {};
132
+ for (const [key, value] of Object.entries(headers)) normalized[key.toLowerCase()] = value;
133
+ return normalized;
134
+ }
135
+ //#endregion
136
+ exports.OTelTelemetry = OTelTelemetry;
3
137
 
4
- exports.OTelTelemetry = require_otel.OTelTelemetry;
138
+ //# sourceMappingURL=otel.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.cjs","names":["extractTraceContext","createHttpServerSpan","trace"],"sources":["../../src/instrumentation/otel.ts"],"sourcesContent":["/**\n * OpenTelemetry implementation of the Telemetry interface\n *\n * This provides automatic span creation for Lambda handlers using\n * OpenTelemetry. Works with any OTel-compatible backend (Jaeger, Zipkin,\n * Datadog, Honeycomb, etc.)\n */\nimport { type Span, trace } from '@opentelemetry/api';\nimport type { Context as LambdaContext } from 'aws-lambda';\n\n/**\n * Context object returned by onRequestStart, passed to subsequent hooks.\n * This matches the Telemetry interface from @geekmidas/constructs.\n */\nexport interface TelemetryContext {\n\t[key: string]: unknown;\n}\n\n/**\n * Request information passed to telemetry hooks.\n * This matches the Telemetry interface from @geekmidas/constructs.\n */\nexport interface TelemetryRequest {\n\tevent: any;\n\tcontext: LambdaContext;\n}\n\n/**\n * Response information passed to onRequestEnd.\n * This matches the Telemetry interface from @geekmidas/constructs.\n */\nexport interface TelemetryResponse {\n\tstatusCode: number;\n\tbody?: string;\n\theaders?: Record<string, string>;\n}\n\n/**\n * Telemetry interface for instrumenting endpoint requests.\n * This matches the Telemetry interface from @geekmidas/constructs.\n */\nexport interface Telemetry {\n\tonRequestStart(request: TelemetryRequest): TelemetryContext;\n\tonRequestEnd(ctx: TelemetryContext, response: TelemetryResponse): void;\n\tonRequestError(ctx: TelemetryContext, error: Error): void;\n}\n\nimport {\n\tcreateHttpServerSpan,\n\tendHttpSpan,\n\textractTraceContext,\n\ttype HttpSpanAttributes,\n} from './http';\n\n/**\n * Options for OTelTelemetry\n */\nexport interface OTelTelemetryOptions {\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 user ID from event\n\t */\n\tgetUserId?: (event: any) => string | undefined;\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\n/**\n * Telemetry context with span reference\n */\ninterface OTelContext extends TelemetryContext {\n\tspan: Span;\n\totelContext: any;\n}\n\n/**\n * OpenTelemetry implementation of the Telemetry interface\n *\n * @example\n * ```typescript\n * import { OTelTelemetry } from '@geekmidas/telescope/instrumentation';\n *\n * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {\n * telemetry: new OTelTelemetry(),\n * });\n * ```\n *\n * @example With options\n * ```typescript\n * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {\n * telemetry: new OTelTelemetry({\n * recordBody: true,\n * getUserId: (event) => event.requestContext?.authorizer?.userId,\n * }),\n * });\n * ```\n */\nexport class OTelTelemetry implements Telemetry {\n\tconstructor(private options: OTelTelemetryOptions = {}) {}\n\n\tonRequestStart(request: TelemetryRequest): TelemetryContext {\n\t\tconst { event, context: lambdaContext } = request;\n\n\t\t// Extract trace context from headers\n\t\tconst headers = normalizeHeaders(event.headers || {});\n\t\tconst parentContext = extractTraceContext(headers);\n\n\t\t// Build span attributes from event\n\t\tconst attrs = this.buildSpanAttributes(event, lambdaContext);\n\n\t\t// Create the span\n\t\tconst span = createHttpServerSpan(attrs, parentContext);\n\t\tconst otelContext = trace.setSpan(parentContext, span);\n\n\t\t// Add Lambda-specific attributes\n\t\tspan.setAttribute('faas.invocation_id', lambdaContext.awsRequestId);\n\t\tspan.setAttribute('faas.name', lambdaContext.functionName);\n\n\t\t// Record body if requested\n\t\tif (this.options.recordBody && event.body) {\n\t\t\tconst bodyStr =\n\t\t\t\ttypeof event.body === 'string'\n\t\t\t\t\t? event.body\n\t\t\t\t\t: JSON.stringify(event.body);\n\t\t\tspan.setAttribute(\n\t\t\t\t'http.request.body',\n\t\t\t\tbodyStr.length > 4096 ? `${bodyStr.slice(0, 4096)}...` : bodyStr,\n\t\t\t);\n\t\t}\n\n\t\treturn { span, otelContext } as OTelContext;\n\t}\n\n\tonRequestEnd(ctx: TelemetryContext, response: TelemetryResponse): void {\n\t\tconst { span } = ctx as OTelContext;\n\n\t\tif (this.options.recordResponseBody && response.body) {\n\t\t\tspan.setAttribute(\n\t\t\t\t'http.response.body',\n\t\t\t\tresponse.body.length > 4096\n\t\t\t\t\t? `${response.body.slice(0, 4096)}...`\n\t\t\t\t\t: response.body,\n\t\t\t);\n\t\t}\n\n\t\tendHttpSpan(span, { statusCode: response.statusCode });\n\t}\n\n\tonRequestError(ctx: TelemetryContext, error: Error): void {\n\t\tconst { span } = ctx as OTelContext;\n\t\tendHttpSpan(span, { statusCode: 500 }, error);\n\t}\n\n\t/**\n\t * Build span attributes from Lambda event\n\t */\n\tprivate buildSpanAttributes(\n\t\tevent: any,\n\t\tlambdaContext: any,\n\t): HttpSpanAttributes {\n\t\t// Detect event type (API Gateway v1, v2, ALB, or direct invoke)\n\t\tconst isV2 =\n\t\t\t'requestContext' in event && 'http' in (event.requestContext || {});\n\t\tconst isV1 =\n\t\t\t'requestContext' in event &&\n\t\t\t'httpMethod' in event &&\n\t\t\t!('http' in (event.requestContext || {}));\n\n\t\tlet method = 'INVOKE';\n\t\tlet path = '/';\n\t\tlet route: string | undefined;\n\t\tlet host: string | undefined;\n\t\tlet scheme: 'http' | 'https' | undefined;\n\t\tlet userAgent: string | undefined;\n\t\tlet clientIp: string | undefined;\n\t\tlet requestId: string | undefined;\n\n\t\tif (isV2) {\n\t\t\t// API Gateway v2 (HTTP API)\n\t\t\tconst http = event.requestContext.http;\n\t\t\tmethod = http.method;\n\t\t\tpath = event.rawPath || http.path;\n\t\t\troute = event.routeKey?.replace(/^[A-Z]+\\s+/, ''); // Remove HTTP method prefix\n\t\t\thost = event.headers?.host;\n\t\t\tscheme = 'https';\n\t\t\tuserAgent = http.userAgent;\n\t\t\tclientIp = http.sourceIp;\n\t\t\trequestId = event.requestContext.requestId;\n\t\t} else if (isV1) {\n\t\t\t// API Gateway v1 (REST API)\n\t\t\tmethod = event.httpMethod;\n\t\t\tpath = event.path;\n\t\t\troute = event.resource;\n\t\t\thost = event.headers?.Host || event.headers?.host;\n\t\t\tscheme = 'https';\n\t\t\tuserAgent =\n\t\t\t\tevent.headers?.['User-Agent'] || event.headers?.['user-agent'];\n\t\t\tclientIp = event.requestContext?.identity?.sourceIp;\n\t\t\trequestId = event.requestContext?.requestId;\n\t\t} else if ('httpMethod' in event) {\n\t\t\t// ALB event\n\t\t\tmethod = event.httpMethod;\n\t\t\tpath = event.path;\n\t\t\thost = event.headers?.host;\n\t\t\tuserAgent =\n\t\t\t\tevent.headers?.['user-agent'] || event.headers?.['User-Agent'];\n\t\t\tclientIp = event.headers?.['x-forwarded-for']?.split(',')[0]?.trim();\n\t\t}\n\n\t\tconst attrs: HttpSpanAttributes = {\n\t\t\tmethod,\n\t\t\tpath,\n\t\t\troute,\n\t\t\thost,\n\t\t\tscheme,\n\t\t\tuserAgent,\n\t\t\tclientIp,\n\t\t\trequestId: requestId || lambdaContext.awsRequestId,\n\t\t};\n\n\t\t// Add endpoint metadata if extractors provided\n\t\tif (this.options.getEndpointName || this.options.getOperationId) {\n\t\t\tattrs.endpoint = {\n\t\t\t\tname: this.options.getEndpointName?.(event),\n\t\t\t\toperationId: this.options.getOperationId?.(event),\n\t\t\t};\n\t\t}\n\n\t\t// Add user metadata if extractor provided\n\t\tif (this.options.getUserId) {\n\t\t\tconst userId = this.options.getUserId(event);\n\t\t\tif (userId) {\n\t\t\t\tattrs.user = { userId };\n\t\t\t}\n\t\t}\n\n\t\treturn attrs;\n\t}\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"],"mappings":"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"}
@@ -1,2 +1,97 @@
1
- import { OTelTelemetry, OTelTelemetryOptions, Telemetry, TelemetryContext, TelemetryRequest, TelemetryResponse } from "../otel-Bk89b1lX.cjs";
2
- export { OTelTelemetry, OTelTelemetryOptions, Telemetry, TelemetryContext, TelemetryRequest, TelemetryResponse };
1
+ import { Context } from "aws-lambda";
2
+ //#region src/instrumentation/otel.d.ts
3
+ /**
4
+ * Context object returned by onRequestStart, passed to subsequent hooks.
5
+ * This matches the Telemetry interface from @geekmidas/constructs.
6
+ */
7
+ export interface TelemetryContext {
8
+ [key: string]: unknown;
9
+ }
10
+ /**
11
+ * Request information passed to telemetry hooks.
12
+ * This matches the Telemetry interface from @geekmidas/constructs.
13
+ */
14
+ export interface TelemetryRequest {
15
+ event: any;
16
+ context: Context;
17
+ }
18
+ /**
19
+ * Response information passed to onRequestEnd.
20
+ * This matches the Telemetry interface from @geekmidas/constructs.
21
+ */
22
+ export interface TelemetryResponse {
23
+ statusCode: number;
24
+ body?: string;
25
+ headers?: Record<string, string>;
26
+ }
27
+ /**
28
+ * Telemetry interface for instrumenting endpoint requests.
29
+ * This matches the Telemetry interface from @geekmidas/constructs.
30
+ */
31
+ export interface Telemetry {
32
+ onRequestStart(request: TelemetryRequest): TelemetryContext;
33
+ onRequestEnd(ctx: TelemetryContext, response: TelemetryResponse): void;
34
+ onRequestError(ctx: TelemetryContext, error: Error): void;
35
+ }
36
+ /**
37
+ * Options for OTelTelemetry
38
+ */
39
+ export interface OTelTelemetryOptions {
40
+ /**
41
+ * Whether to record request body as span attribute
42
+ * @default false
43
+ */
44
+ recordBody?: boolean;
45
+ /**
46
+ * Whether to record response body as span attribute
47
+ * @default false
48
+ */
49
+ recordResponseBody?: boolean;
50
+ /**
51
+ * Custom function to extract user ID from event
52
+ */
53
+ getUserId?: (event: any) => string | undefined;
54
+ /**
55
+ * Custom function to extract endpoint name from event
56
+ */
57
+ getEndpointName?: (event: any) => string | undefined;
58
+ /**
59
+ * Custom function to extract operation ID from event
60
+ */
61
+ getOperationId?: (event: any) => string | undefined;
62
+ }
63
+ /**
64
+ * OpenTelemetry implementation of the Telemetry interface
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * import { OTelTelemetry } from '@geekmidas/telescope/instrumentation';
69
+ *
70
+ * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {
71
+ * telemetry: new OTelTelemetry(),
72
+ * });
73
+ * ```
74
+ *
75
+ * @example With options
76
+ * ```typescript
77
+ * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {
78
+ * telemetry: new OTelTelemetry({
79
+ * recordBody: true,
80
+ * getUserId: (event) => event.requestContext?.authorizer?.userId,
81
+ * }),
82
+ * });
83
+ * ```
84
+ */
85
+ export declare class OTelTelemetry implements Telemetry {
86
+ private options;
87
+ constructor(options?: OTelTelemetryOptions);
88
+ onRequestStart(request: TelemetryRequest): TelemetryContext;
89
+ onRequestEnd(ctx: TelemetryContext, response: TelemetryResponse): void;
90
+ onRequestError(ctx: TelemetryContext, error: Error): void;
91
+ /**
92
+ * Build span attributes from Lambda event
93
+ */
94
+ private buildSpanAttributes;
95
+ }
96
+ //#endregion
97
+ //# sourceMappingURL=otel.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.d.cts","names":["LambdaContext"],"sources":["../../src/instrumentation/otel.ts"],"mappings":";;;;;;iBAciB;GACf;;;;;;iBAOe;EAChB;EACA,SAASA;;;;;;iBAOO;EAChB;EACA;EACA,UAAU;;;;;;iBAOM;EAChB,eAAe,SAAS,mBAAmB;EAC3C,aAAa,KAAK,kBAAkB,UAAU;EAC9C,eAAe,KAAK,kBAAkB,OAAO;;;;;iBAa7B;;;;;EAKhB;;;;;EAMA;;;;EAKA,aAAa;;;;EAKb,mBAAmB;;;;EAKnB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;qBAiCN,yBAAyB;UACjB;EAApB,YAAoB,UAAS;EAE7B,eAAe,SAAS,mBAAmB;EAiC3C,aAAa,KAAK,kBAAkB,UAAU;EAe9C,eAAe,KAAK,kBAAkB,OAAO;;;;UAQrC"}
@@ -1,2 +1,97 @@
1
- import { OTelTelemetry, OTelTelemetryOptions, Telemetry, TelemetryContext, TelemetryRequest, TelemetryResponse } from "../otel-lPMsM26e.mjs";
2
- export { OTelTelemetry, OTelTelemetryOptions, Telemetry, TelemetryContext, TelemetryRequest, TelemetryResponse };
1
+ import { Context } from "aws-lambda";
2
+ //#region src/instrumentation/otel.d.ts
3
+ /**
4
+ * Context object returned by onRequestStart, passed to subsequent hooks.
5
+ * This matches the Telemetry interface from @geekmidas/constructs.
6
+ */
7
+ export interface TelemetryContext {
8
+ [key: string]: unknown;
9
+ }
10
+ /**
11
+ * Request information passed to telemetry hooks.
12
+ * This matches the Telemetry interface from @geekmidas/constructs.
13
+ */
14
+ export interface TelemetryRequest {
15
+ event: any;
16
+ context: Context;
17
+ }
18
+ /**
19
+ * Response information passed to onRequestEnd.
20
+ * This matches the Telemetry interface from @geekmidas/constructs.
21
+ */
22
+ export interface TelemetryResponse {
23
+ statusCode: number;
24
+ body?: string;
25
+ headers?: Record<string, string>;
26
+ }
27
+ /**
28
+ * Telemetry interface for instrumenting endpoint requests.
29
+ * This matches the Telemetry interface from @geekmidas/constructs.
30
+ */
31
+ export interface Telemetry {
32
+ onRequestStart(request: TelemetryRequest): TelemetryContext;
33
+ onRequestEnd(ctx: TelemetryContext, response: TelemetryResponse): void;
34
+ onRequestError(ctx: TelemetryContext, error: Error): void;
35
+ }
36
+ /**
37
+ * Options for OTelTelemetry
38
+ */
39
+ export interface OTelTelemetryOptions {
40
+ /**
41
+ * Whether to record request body as span attribute
42
+ * @default false
43
+ */
44
+ recordBody?: boolean;
45
+ /**
46
+ * Whether to record response body as span attribute
47
+ * @default false
48
+ */
49
+ recordResponseBody?: boolean;
50
+ /**
51
+ * Custom function to extract user ID from event
52
+ */
53
+ getUserId?: (event: any) => string | undefined;
54
+ /**
55
+ * Custom function to extract endpoint name from event
56
+ */
57
+ getEndpointName?: (event: any) => string | undefined;
58
+ /**
59
+ * Custom function to extract operation ID from event
60
+ */
61
+ getOperationId?: (event: any) => string | undefined;
62
+ }
63
+ /**
64
+ * OpenTelemetry implementation of the Telemetry interface
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * import { OTelTelemetry } from '@geekmidas/telescope/instrumentation';
69
+ *
70
+ * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {
71
+ * telemetry: new OTelTelemetry(),
72
+ * });
73
+ * ```
74
+ *
75
+ * @example With options
76
+ * ```typescript
77
+ * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {
78
+ * telemetry: new OTelTelemetry({
79
+ * recordBody: true,
80
+ * getUserId: (event) => event.requestContext?.authorizer?.userId,
81
+ * }),
82
+ * });
83
+ * ```
84
+ */
85
+ export declare class OTelTelemetry implements Telemetry {
86
+ private options;
87
+ constructor(options?: OTelTelemetryOptions);
88
+ onRequestStart(request: TelemetryRequest): TelemetryContext;
89
+ onRequestEnd(ctx: TelemetryContext, response: TelemetryResponse): void;
90
+ onRequestError(ctx: TelemetryContext, error: Error): void;
91
+ /**
92
+ * Build span attributes from Lambda event
93
+ */
94
+ private buildSpanAttributes;
95
+ }
96
+ //#endregion
97
+ //# sourceMappingURL=otel.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.d.mts","names":["LambdaContext"],"sources":["../../src/instrumentation/otel.ts"],"mappings":";;;;;;iBAciB;GACf;;;;;;iBAOe;EAChB;EACA,SAASA;;;;;;iBAOO;EAChB;EACA;EACA,UAAU;;;;;;iBAOM;EAChB,eAAe,SAAS,mBAAmB;EAC3C,aAAa,KAAK,kBAAkB,UAAU;EAC9C,eAAe,KAAK,kBAAkB,OAAO;;;;;iBAa7B;;;;;EAKhB;;;;;EAMA;;;;EAKA,aAAa;;;;EAKb,mBAAmB;;;;EAKnB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;qBAiCN,yBAAyB;UACjB;EAApB,YAAoB,UAAS;EAE7B,eAAe,SAAS,mBAAmB;EAiC3C,aAAa,KAAK,kBAAkB,UAAU;EAe9C,eAAe,KAAK,kBAAkB,OAAO;;;;UAQrC"}
@@ -1,4 +1,137 @@
1
- import "../http-BIvr0YdI.mjs";
2
- import { OTelTelemetry } from "../otel-B9bNoeZ2.mjs";
1
+ import { createHttpServerSpan, endHttpSpan, extractTraceContext } from "./http.mjs";
2
+ import { trace } from "@opentelemetry/api";
3
+ //#region src/instrumentation/otel.ts
4
+ /**
5
+ * OpenTelemetry implementation of the Telemetry interface
6
+ *
7
+ * This provides automatic span creation for Lambda handlers using
8
+ * OpenTelemetry. Works with any OTel-compatible backend (Jaeger, Zipkin,
9
+ * Datadog, Honeycomb, etc.)
10
+ */
11
+ /**
12
+ * OpenTelemetry implementation of the Telemetry interface
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import { OTelTelemetry } from '@geekmidas/telescope/instrumentation';
17
+ *
18
+ * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {
19
+ * telemetry: new OTelTelemetry(),
20
+ * });
21
+ * ```
22
+ *
23
+ * @example With options
24
+ * ```typescript
25
+ * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {
26
+ * telemetry: new OTelTelemetry({
27
+ * recordBody: true,
28
+ * getUserId: (event) => event.requestContext?.authorizer?.userId,
29
+ * }),
30
+ * });
31
+ * ```
32
+ */
33
+ var OTelTelemetry = class {
34
+ options;
35
+ constructor(options = {}) {
36
+ this.options = options;
37
+ }
38
+ onRequestStart(request) {
39
+ const { event, context: lambdaContext } = request;
40
+ const headers = normalizeHeaders(event.headers || {});
41
+ const parentContext = extractTraceContext(headers);
42
+ const attrs = this.buildSpanAttributes(event, lambdaContext);
43
+ const span = createHttpServerSpan(attrs, parentContext);
44
+ const otelContext = trace.setSpan(parentContext, span);
45
+ span.setAttribute("faas.invocation_id", lambdaContext.awsRequestId);
46
+ span.setAttribute("faas.name", lambdaContext.functionName);
47
+ if (this.options.recordBody && event.body) {
48
+ const bodyStr = typeof event.body === "string" ? event.body : JSON.stringify(event.body);
49
+ span.setAttribute("http.request.body", bodyStr.length > 4096 ? `${bodyStr.slice(0, 4096)}...` : bodyStr);
50
+ }
51
+ return {
52
+ span,
53
+ otelContext
54
+ };
55
+ }
56
+ onRequestEnd(ctx, response) {
57
+ const { span } = ctx;
58
+ if (this.options.recordResponseBody && response.body) span.setAttribute("http.response.body", response.body.length > 4096 ? `${response.body.slice(0, 4096)}...` : response.body);
59
+ endHttpSpan(span, { statusCode: response.statusCode });
60
+ }
61
+ onRequestError(ctx, error) {
62
+ const { span } = ctx;
63
+ endHttpSpan(span, { statusCode: 500 }, error);
64
+ }
65
+ /**
66
+ * Build span attributes from Lambda event
67
+ */
68
+ buildSpanAttributes(event, lambdaContext) {
69
+ const isV2 = "requestContext" in event && "http" in (event.requestContext || {});
70
+ const isV1 = "requestContext" in event && "httpMethod" in event && !("http" in (event.requestContext || {}));
71
+ let method = "INVOKE";
72
+ let path = "/";
73
+ let route;
74
+ let host;
75
+ let scheme;
76
+ let userAgent;
77
+ let clientIp;
78
+ let requestId;
79
+ if (isV2) {
80
+ const http = event.requestContext.http;
81
+ method = http.method;
82
+ path = event.rawPath || http.path;
83
+ route = event.routeKey?.replace(/^[A-Z]+\s+/, "");
84
+ host = event.headers?.host;
85
+ scheme = "https";
86
+ userAgent = http.userAgent;
87
+ clientIp = http.sourceIp;
88
+ requestId = event.requestContext.requestId;
89
+ } else if (isV1) {
90
+ method = event.httpMethod;
91
+ path = event.path;
92
+ route = event.resource;
93
+ host = event.headers?.Host || event.headers?.host;
94
+ scheme = "https";
95
+ userAgent = event.headers?.["User-Agent"] || event.headers?.["user-agent"];
96
+ clientIp = event.requestContext?.identity?.sourceIp;
97
+ requestId = event.requestContext?.requestId;
98
+ } else if ("httpMethod" in event) {
99
+ method = event.httpMethod;
100
+ path = event.path;
101
+ host = event.headers?.host;
102
+ userAgent = event.headers?.["user-agent"] || event.headers?.["User-Agent"];
103
+ clientIp = event.headers?.["x-forwarded-for"]?.split(",")[0]?.trim();
104
+ }
105
+ const attrs = {
106
+ method,
107
+ path,
108
+ route,
109
+ host,
110
+ scheme,
111
+ userAgent,
112
+ clientIp,
113
+ requestId: requestId || lambdaContext.awsRequestId
114
+ };
115
+ if (this.options.getEndpointName || this.options.getOperationId) attrs.endpoint = {
116
+ name: this.options.getEndpointName?.(event),
117
+ operationId: this.options.getOperationId?.(event)
118
+ };
119
+ if (this.options.getUserId) {
120
+ const userId = this.options.getUserId(event);
121
+ if (userId) attrs.user = { userId };
122
+ }
123
+ return attrs;
124
+ }
125
+ };
126
+ /**
127
+ * Normalize headers to lowercase keys
128
+ */
129
+ function normalizeHeaders(headers) {
130
+ const normalized = {};
131
+ for (const [key, value] of Object.entries(headers)) normalized[key.toLowerCase()] = value;
132
+ return normalized;
133
+ }
134
+ //#endregion
135
+ export { OTelTelemetry };
3
136
 
4
- export { OTelTelemetry };
137
+ //# sourceMappingURL=otel.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.mjs","names":[],"sources":["../../src/instrumentation/otel.ts"],"sourcesContent":["/**\n * OpenTelemetry implementation of the Telemetry interface\n *\n * This provides automatic span creation for Lambda handlers using\n * OpenTelemetry. Works with any OTel-compatible backend (Jaeger, Zipkin,\n * Datadog, Honeycomb, etc.)\n */\nimport { type Span, trace } from '@opentelemetry/api';\nimport type { Context as LambdaContext } from 'aws-lambda';\n\n/**\n * Context object returned by onRequestStart, passed to subsequent hooks.\n * This matches the Telemetry interface from @geekmidas/constructs.\n */\nexport interface TelemetryContext {\n\t[key: string]: unknown;\n}\n\n/**\n * Request information passed to telemetry hooks.\n * This matches the Telemetry interface from @geekmidas/constructs.\n */\nexport interface TelemetryRequest {\n\tevent: any;\n\tcontext: LambdaContext;\n}\n\n/**\n * Response information passed to onRequestEnd.\n * This matches the Telemetry interface from @geekmidas/constructs.\n */\nexport interface TelemetryResponse {\n\tstatusCode: number;\n\tbody?: string;\n\theaders?: Record<string, string>;\n}\n\n/**\n * Telemetry interface for instrumenting endpoint requests.\n * This matches the Telemetry interface from @geekmidas/constructs.\n */\nexport interface Telemetry {\n\tonRequestStart(request: TelemetryRequest): TelemetryContext;\n\tonRequestEnd(ctx: TelemetryContext, response: TelemetryResponse): void;\n\tonRequestError(ctx: TelemetryContext, error: Error): void;\n}\n\nimport {\n\tcreateHttpServerSpan,\n\tendHttpSpan,\n\textractTraceContext,\n\ttype HttpSpanAttributes,\n} from './http';\n\n/**\n * Options for OTelTelemetry\n */\nexport interface OTelTelemetryOptions {\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 user ID from event\n\t */\n\tgetUserId?: (event: any) => string | undefined;\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\n/**\n * Telemetry context with span reference\n */\ninterface OTelContext extends TelemetryContext {\n\tspan: Span;\n\totelContext: any;\n}\n\n/**\n * OpenTelemetry implementation of the Telemetry interface\n *\n * @example\n * ```typescript\n * import { OTelTelemetry } from '@geekmidas/telescope/instrumentation';\n *\n * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {\n * telemetry: new OTelTelemetry(),\n * });\n * ```\n *\n * @example With options\n * ```typescript\n * const adaptor = new AmazonApiGatewayV2Endpoint(endpoint, {\n * telemetry: new OTelTelemetry({\n * recordBody: true,\n * getUserId: (event) => event.requestContext?.authorizer?.userId,\n * }),\n * });\n * ```\n */\nexport class OTelTelemetry implements Telemetry {\n\tconstructor(private options: OTelTelemetryOptions = {}) {}\n\n\tonRequestStart(request: TelemetryRequest): TelemetryContext {\n\t\tconst { event, context: lambdaContext } = request;\n\n\t\t// Extract trace context from headers\n\t\tconst headers = normalizeHeaders(event.headers || {});\n\t\tconst parentContext = extractTraceContext(headers);\n\n\t\t// Build span attributes from event\n\t\tconst attrs = this.buildSpanAttributes(event, lambdaContext);\n\n\t\t// Create the span\n\t\tconst span = createHttpServerSpan(attrs, parentContext);\n\t\tconst otelContext = trace.setSpan(parentContext, span);\n\n\t\t// Add Lambda-specific attributes\n\t\tspan.setAttribute('faas.invocation_id', lambdaContext.awsRequestId);\n\t\tspan.setAttribute('faas.name', lambdaContext.functionName);\n\n\t\t// Record body if requested\n\t\tif (this.options.recordBody && event.body) {\n\t\t\tconst bodyStr =\n\t\t\t\ttypeof event.body === 'string'\n\t\t\t\t\t? event.body\n\t\t\t\t\t: JSON.stringify(event.body);\n\t\t\tspan.setAttribute(\n\t\t\t\t'http.request.body',\n\t\t\t\tbodyStr.length > 4096 ? `${bodyStr.slice(0, 4096)}...` : bodyStr,\n\t\t\t);\n\t\t}\n\n\t\treturn { span, otelContext } as OTelContext;\n\t}\n\n\tonRequestEnd(ctx: TelemetryContext, response: TelemetryResponse): void {\n\t\tconst { span } = ctx as OTelContext;\n\n\t\tif (this.options.recordResponseBody && response.body) {\n\t\t\tspan.setAttribute(\n\t\t\t\t'http.response.body',\n\t\t\t\tresponse.body.length > 4096\n\t\t\t\t\t? `${response.body.slice(0, 4096)}...`\n\t\t\t\t\t: response.body,\n\t\t\t);\n\t\t}\n\n\t\tendHttpSpan(span, { statusCode: response.statusCode });\n\t}\n\n\tonRequestError(ctx: TelemetryContext, error: Error): void {\n\t\tconst { span } = ctx as OTelContext;\n\t\tendHttpSpan(span, { statusCode: 500 }, error);\n\t}\n\n\t/**\n\t * Build span attributes from Lambda event\n\t */\n\tprivate buildSpanAttributes(\n\t\tevent: any,\n\t\tlambdaContext: any,\n\t): HttpSpanAttributes {\n\t\t// Detect event type (API Gateway v1, v2, ALB, or direct invoke)\n\t\tconst isV2 =\n\t\t\t'requestContext' in event && 'http' in (event.requestContext || {});\n\t\tconst isV1 =\n\t\t\t'requestContext' in event &&\n\t\t\t'httpMethod' in event &&\n\t\t\t!('http' in (event.requestContext || {}));\n\n\t\tlet method = 'INVOKE';\n\t\tlet path = '/';\n\t\tlet route: string | undefined;\n\t\tlet host: string | undefined;\n\t\tlet scheme: 'http' | 'https' | undefined;\n\t\tlet userAgent: string | undefined;\n\t\tlet clientIp: string | undefined;\n\t\tlet requestId: string | undefined;\n\n\t\tif (isV2) {\n\t\t\t// API Gateway v2 (HTTP API)\n\t\t\tconst http = event.requestContext.http;\n\t\t\tmethod = http.method;\n\t\t\tpath = event.rawPath || http.path;\n\t\t\troute = event.routeKey?.replace(/^[A-Z]+\\s+/, ''); // Remove HTTP method prefix\n\t\t\thost = event.headers?.host;\n\t\t\tscheme = 'https';\n\t\t\tuserAgent = http.userAgent;\n\t\t\tclientIp = http.sourceIp;\n\t\t\trequestId = event.requestContext.requestId;\n\t\t} else if (isV1) {\n\t\t\t// API Gateway v1 (REST API)\n\t\t\tmethod = event.httpMethod;\n\t\t\tpath = event.path;\n\t\t\troute = event.resource;\n\t\t\thost = event.headers?.Host || event.headers?.host;\n\t\t\tscheme = 'https';\n\t\t\tuserAgent =\n\t\t\t\tevent.headers?.['User-Agent'] || event.headers?.['user-agent'];\n\t\t\tclientIp = event.requestContext?.identity?.sourceIp;\n\t\t\trequestId = event.requestContext?.requestId;\n\t\t} else if ('httpMethod' in event) {\n\t\t\t// ALB event\n\t\t\tmethod = event.httpMethod;\n\t\t\tpath = event.path;\n\t\t\thost = event.headers?.host;\n\t\t\tuserAgent =\n\t\t\t\tevent.headers?.['user-agent'] || event.headers?.['User-Agent'];\n\t\t\tclientIp = event.headers?.['x-forwarded-for']?.split(',')[0]?.trim();\n\t\t}\n\n\t\tconst attrs: HttpSpanAttributes = {\n\t\t\tmethod,\n\t\t\tpath,\n\t\t\troute,\n\t\t\thost,\n\t\t\tscheme,\n\t\t\tuserAgent,\n\t\t\tclientIp,\n\t\t\trequestId: requestId || lambdaContext.awsRequestId,\n\t\t};\n\n\t\t// Add endpoint metadata if extractors provided\n\t\tif (this.options.getEndpointName || this.options.getOperationId) {\n\t\t\tattrs.endpoint = {\n\t\t\t\tname: this.options.getEndpointName?.(event),\n\t\t\t\toperationId: this.options.getOperationId?.(event),\n\t\t\t};\n\t\t}\n\n\t\t// Add user metadata if extractor provided\n\t\tif (this.options.getUserId) {\n\t\t\tconst userId = this.options.getUserId(event);\n\t\t\tif (userId) {\n\t\t\t\tattrs.user = { userId };\n\t\t\t}\n\t\t}\n\n\t\treturn attrs;\n\t}\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"],"mappings":"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"}
@@ -1,5 +1,101 @@
1
- require('../core-CtVHRJGv.cjs');
2
- const require_setup = require('../setup-DufxQpi9.cjs');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_instrumentation_core = require("./core.cjs");
3
+ let _opentelemetry_api = require("@opentelemetry/api");
4
+ let _opentelemetry_auto_instrumentations_node = require("@opentelemetry/auto-instrumentations-node");
5
+ let _opentelemetry_exporter_logs_otlp_http = require("@opentelemetry/exporter-logs-otlp-http");
6
+ let _opentelemetry_exporter_trace_otlp_http = require("@opentelemetry/exporter-trace-otlp-http");
7
+ let _opentelemetry_instrumentation_pino = require("@opentelemetry/instrumentation-pino");
8
+ let _opentelemetry_resources = require("@opentelemetry/resources");
9
+ let _opentelemetry_sdk_logs = require("@opentelemetry/sdk-logs");
10
+ let _opentelemetry_sdk_node = require("@opentelemetry/sdk-node");
11
+ let _opentelemetry_sdk_trace_node = require("@opentelemetry/sdk-trace-node");
12
+ let _opentelemetry_semantic_conventions = require("@opentelemetry/semantic-conventions");
13
+ //#region src/instrumentation/setup.ts
14
+ let sdk = null;
15
+ /**
16
+ * Set up OpenTelemetry instrumentation.
17
+ * Call this BEFORE importing your application code.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * // instrumentation.ts (create this file)
22
+ * import { setupTelemetry } from '@geekmidas/telescope/instrumentation';
23
+ *
24
+ * setupTelemetry({
25
+ * serviceName: 'my-api',
26
+ * endpoint: 'http://localhost:3000/__telescope/v1',
27
+ * });
28
+ *
29
+ * // Then in your entry point:
30
+ * // import './instrumentation';
31
+ * // import { app } from './app';
32
+ * ```
33
+ */
34
+ function setupTelemetry(options) {
35
+ if (sdk) return;
36
+ const { serviceName, serviceVersion = "1.0.0", endpoint, instrumentPino = true, autoInstrument = true, debug = false, resourceAttributes = {}, headers = {}, spanProcessorStrategy, environment = "server" } = options;
37
+ if (debug) _opentelemetry_api.diag.setLogger(new _opentelemetry_api.DiagConsoleLogger(), _opentelemetry_api.DiagLogLevel.DEBUG);
38
+ const resource = (0, _opentelemetry_resources.resourceFromAttributes)({
39
+ [_opentelemetry_semantic_conventions.ATTR_SERVICE_NAME]: serviceName,
40
+ [_opentelemetry_semantic_conventions.ATTR_SERVICE_VERSION]: serviceVersion,
41
+ ...resourceAttributes
42
+ });
43
+ const instrumentations = [];
44
+ if (instrumentPino) instrumentations.push(new _opentelemetry_instrumentation_pino.PinoInstrumentation({ logHook: (span, record) => {
45
+ record.trace_id = span.spanContext().traceId;
46
+ record.span_id = span.spanContext().spanId;
47
+ record.trace_flags = span.spanContext().traceFlags;
48
+ } }));
49
+ if (autoInstrument) instrumentations.push((0, _opentelemetry_auto_instrumentations_node.getNodeAutoInstrumentations)({
50
+ "@opentelemetry/instrumentation-fs": { enabled: false },
51
+ "@opentelemetry/instrumentation-http": { ignoreIncomingRequestHook: (request) => {
52
+ const path = request.url || "";
53
+ return path.includes("/__health") || path.includes("/__telescope") || path.includes("/favicon");
54
+ } }
55
+ }));
56
+ let traceExporter;
57
+ if (endpoint) traceExporter = new _opentelemetry_exporter_trace_otlp_http.OTLPTraceExporter({
58
+ url: `${endpoint}/traces`,
59
+ headers
60
+ });
61
+ else traceExporter = new _opentelemetry_sdk_trace_node.ConsoleSpanExporter();
62
+ const strategy = spanProcessorStrategy ?? require_instrumentation_core.getRecommendedStrategy(environment);
63
+ const spanProcessor = require_instrumentation_core.createSpanProcessor(traceExporter, { strategy });
64
+ require_instrumentation_core.setGlobalSpanProcessor(spanProcessor);
65
+ sdk = new _opentelemetry_sdk_node.NodeSDK({
66
+ resource,
67
+ traceExporter,
68
+ spanProcessors: [spanProcessor],
69
+ instrumentations
70
+ });
71
+ if (endpoint) {
72
+ const logExporter = new _opentelemetry_exporter_logs_otlp_http.OTLPLogExporter({
73
+ url: `${endpoint}/logs`,
74
+ headers
75
+ });
76
+ const logProcessor = new _opentelemetry_sdk_logs.BatchLogRecordProcessor({ exporter: logExporter });
77
+ new _opentelemetry_sdk_logs.LoggerProvider({
78
+ resource,
79
+ processors: [logProcessor]
80
+ });
81
+ require_instrumentation_core.setGlobalLogProcessor(logProcessor);
82
+ }
83
+ sdk.start();
84
+ process.on("SIGTERM", () => {
85
+ sdk?.shutdown().then(() => {}).catch((_error) => {}).finally(() => process.exit(0));
86
+ });
87
+ }
88
+ /**
89
+ * Shut down telemetry (for testing or graceful shutdown)
90
+ */
91
+ async function shutdownTelemetry() {
92
+ if (sdk) {
93
+ await sdk.shutdown();
94
+ sdk = null;
95
+ }
96
+ }
97
+ //#endregion
98
+ exports.setupTelemetry = setupTelemetry;
99
+ exports.shutdownTelemetry = shutdownTelemetry;
3
100
 
4
- exports.setupTelemetry = require_setup.setupTelemetry;
5
- exports.shutdownTelemetry = require_setup.shutdownTelemetry;
101
+ //# sourceMappingURL=setup.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.cjs","names":["DiagConsoleLogger","DiagLogLevel","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","PinoInstrumentation","getNodeAutoInstrumentations","OTLPTraceExporter","ConsoleSpanExporter","getRecommendedStrategy","createSpanProcessor","NodeSDK","OTLPLogExporter","BatchLogRecordProcessor","LoggerProvider"],"sources":["../../src/instrumentation/setup.ts"],"sourcesContent":["import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api';\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { PinoInstrumentation } from '@opentelemetry/instrumentation-pino';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport {\n\tBatchLogRecordProcessor,\n\tLoggerProvider,\n} from '@opentelemetry/sdk-logs';\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport {\n\tConsoleSpanExporter,\n\ttype SpanExporter,\n} from '@opentelemetry/sdk-trace-node';\nimport {\n\tATTR_SERVICE_NAME,\n\tATTR_SERVICE_VERSION,\n} from '@opentelemetry/semantic-conventions';\nimport type { SpanProcessorStrategy } from '../adapters/types';\nimport {\n\tcreateSpanProcessor,\n\tgetRecommendedStrategy,\n\tsetGlobalLogProcessor,\n\tsetGlobalSpanProcessor,\n} from './core';\n\n/**\n * Options for configuring telemetry\n */\nexport interface TelemetryOptions {\n\t/**\n\t * Service name for resource identification\n\t */\n\tserviceName: string;\n\n\t/**\n\t * Service version\n\t */\n\tserviceVersion?: string;\n\n\t/**\n\t * OTLP endpoint URL (e.g., 'http://localhost:3000/__telescope/v1')\n\t * If not provided, traces will be logged to console\n\t */\n\tendpoint?: string;\n\n\t/**\n\t * Whether to instrument Pino for log correlation\n\t * @default true\n\t */\n\tinstrumentPino?: boolean;\n\n\t/**\n\t * Whether to enable auto-instrumentation for common libraries\n\t * (http, fetch, express, etc.)\n\t * @default true\n\t */\n\tautoInstrument?: boolean;\n\n\t/**\n\t * Enable debug logging for OTel SDK\n\t * @default false\n\t */\n\tdebug?: boolean;\n\n\t/**\n\t * Additional resource attributes\n\t */\n\tresourceAttributes?: Record<string, string>;\n\n\t/**\n\t * Headers to send with OTLP requests\n\t */\n\theaders?: Record<string, string>;\n\n\t/**\n\t * Span processor strategy.\n\t * - 'batch': Efficient batching for long-running servers (default)\n\t * - 'simple': Immediate export for serverless environments (Lambda, Edge)\n\t *\n\t * If not specified, automatically selected based on environment detection.\n\t */\n\tspanProcessorStrategy?: SpanProcessorStrategy;\n\n\t/**\n\t * Environment type for automatic configuration\n\t * @default 'server'\n\t */\n\tenvironment?: 'server' | 'lambda' | 'edge' | 'custom';\n}\n\nlet sdk: NodeSDK | null = null;\n\n/**\n * Set up OpenTelemetry instrumentation.\n * Call this BEFORE importing your application code.\n *\n * @example\n * ```typescript\n * // instrumentation.ts (create this file)\n * import { setupTelemetry } from '@geekmidas/telescope/instrumentation';\n *\n * setupTelemetry({\n * serviceName: 'my-api',\n * endpoint: 'http://localhost:3000/__telescope/v1',\n * });\n *\n * // Then in your entry point:\n * // import './instrumentation';\n * // import { app } from './app';\n * ```\n */\nexport function setupTelemetry(options: TelemetryOptions): void {\n\tif (sdk) {\n\t\treturn;\n\t}\n\n\tconst {\n\t\tserviceName,\n\t\tserviceVersion = '1.0.0',\n\t\tendpoint,\n\t\tinstrumentPino = true,\n\t\tautoInstrument = true,\n\t\tdebug = false,\n\t\tresourceAttributes = {},\n\t\theaders = {},\n\t\tspanProcessorStrategy,\n\t\tenvironment = 'server',\n\t} = options;\n\n\t// Enable debug logging if requested\n\tif (debug) {\n\t\tdiag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n\t}\n\n\t// Create resource\n\t// `new Resource(...)` went in resources 2.x — a resource is now made from\n\t// attributes by a function, so a detector and a literal produce the same\n\t// thing rather than two shapes that had to be merged.\n\tconst resource = resourceFromAttributes({\n\t\t[ATTR_SERVICE_NAME]: serviceName,\n\t\t[ATTR_SERVICE_VERSION]: serviceVersion,\n\t\t...resourceAttributes,\n\t});\n\n\t// Build instrumentations list\n\tconst instrumentations = [];\n\n\t// Add Pino instrumentation for log correlation\n\tif (instrumentPino) {\n\t\tinstrumentations.push(\n\t\t\tnew PinoInstrumentation({\n\t\t\t\t// Inject trace context into log records\n\t\t\t\tlogHook: (span, record) => {\n\t\t\t\t\trecord.trace_id = span.spanContext().traceId;\n\t\t\t\t\trecord.span_id = span.spanContext().spanId;\n\t\t\t\t\trecord.trace_flags = span.spanContext().traceFlags;\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t}\n\n\t// Add auto-instrumentations for common libraries\n\tif (autoInstrument) {\n\t\tinstrumentations.push(\n\t\t\tgetNodeAutoInstrumentations({\n\t\t\t\t// Disable file system instrumentation (too noisy)\n\t\t\t\t'@opentelemetry/instrumentation-fs': { enabled: false },\n\t\t\t\t// Configure HTTP instrumentation\n\t\t\t\t'@opentelemetry/instrumentation-http': {\n\t\t\t\t\tignoreIncomingRequestHook: (request) => {\n\t\t\t\t\t\t// Ignore health checks and internal routes\n\t\t\t\t\t\tconst path = request.url || '';\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tpath.includes('/__health') ||\n\t\t\t\t\t\t\tpath.includes('/__telescope') ||\n\t\t\t\t\t\t\tpath.includes('/favicon')\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t}\n\n\t// Create exporters\n\tlet traceExporter: SpanExporter;\n\tif (endpoint) {\n\t\ttraceExporter = new OTLPTraceExporter({\n\t\t\turl: `${endpoint}/traces`,\n\t\t\theaders,\n\t\t});\n\t} else {\n\t\t// Fall back to console exporter for debugging\n\t\ttraceExporter = new ConsoleSpanExporter();\n\t}\n\n\t// Determine span processor strategy\n\tconst strategy = spanProcessorStrategy ?? getRecommendedStrategy(environment);\n\tconst spanProcessor = createSpanProcessor(traceExporter, { strategy });\n\n\t// Register globally for flush operations\n\tsetGlobalSpanProcessor(spanProcessor);\n\n\t// Create and configure SDK\n\tsdk = new NodeSDK({\n\t\tresource,\n\t\ttraceExporter,\n\t\tspanProcessors: [spanProcessor],\n\t\tinstrumentations,\n\t});\n\n\t// Set up log exporter if endpoint is provided\n\tif (endpoint) {\n\t\tconst logExporter = new OTLPLogExporter({\n\t\t\turl: `${endpoint}/logs`,\n\t\t\theaders,\n\t\t});\n\n\t\t// Both changed in sdk-logs 2.x, and for the same reason the trace SDK\n\t\t// changed: a provider whose processors could be swapped after it had begun\n\t\t// emitting was never safe, so processors are constructor-only and the\n\t\t// exporter is named rather than positional.\n\t\tconst logProcessor = new BatchLogRecordProcessor({\n\t\t\texporter: logExporter,\n\t\t});\n\t\tconst loggerProvider = new LoggerProvider({\n\t\t\tresource,\n\t\t\tprocessors: [logProcessor],\n\t\t});\n\n\t\t// Register for flush operations\n\t\tsetGlobalLogProcessor(logProcessor);\n\t}\n\n\t// Start the SDK\n\tsdk.start();\n\n\t// Graceful shutdown\n\tprocess.on('SIGTERM', () => {\n\t\tsdk\n\t\t\t?.shutdown()\n\t\t\t.then(() => {})\n\t\t\t.catch((_error) => {})\n\t\t\t.finally(() => process.exit(0));\n\t});\n}\n\n/**\n * Shut down telemetry (for testing or graceful shutdown)\n */\nexport async function shutdownTelemetry(): Promise<void> {\n\tif (sdk) {\n\t\tawait sdk.shutdown();\n\t\tsdk = null;\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;AA4FA,IAAI,MAAsB;;;;;;;;;;;;;;;;;;;;AAqB1B,SAAgB,eAAe,SAAiC;CAC/D,IAAI,KACH;CAGD,MAAM,EACL,aACA,iBAAiB,SACjB,UACA,iBAAiB,MACjB,iBAAiB,MACjB,QAAQ,OACR,qBAAqB,CAAC,GACtB,UAAU,CAAC,GACX,uBACA,cAAc,aACX;CAGJ,IAAI,OACH,mBAAA,KAAK,UAAU,IAAIA,mBAAAA,kBAAkB,GAAGC,mBAAAA,aAAa,KAAK;CAO3D,MAAM,YAAA,GAAWC,yBAAAA,uBAAAA,CAAuB;GACtCC,oCAAAA,oBAAoB;GACpBC,oCAAAA,uBAAuB;EACxB,GAAG;CACJ,CAAC;CAGD,MAAM,mBAAmB,CAAC;CAG1B,IAAI,gBACH,iBAAiB,KAChB,IAAIC,oCAAAA,oBAAoB,EAEvB,UAAU,MAAM,WAAW;EAC1B,OAAO,WAAW,KAAK,YAAY,CAAC,CAAC;EACrC,OAAO,UAAU,KAAK,YAAY,CAAC,CAAC;EACpC,OAAO,cAAc,KAAK,YAAY,CAAC,CAAC;CACzC,EACD,CAAC,CACF;CAID,IAAI,gBACH,iBAAiB,MAAA,GAChBC,0CAAAA,4BAAAA,CAA4B;EAE3B,qCAAqC,EAAE,SAAS,MAAM;EAEtD,uCAAuC,EACtC,4BAA4B,YAAY;GAEvC,MAAM,OAAO,QAAQ,OAAO;GAC5B,OACC,KAAK,SAAS,WAAW,KACzB,KAAK,SAAS,cAAc,KAC5B,KAAK,SAAS,UAAU;EAE1B,EACD;CACD,CAAC,CACF;CAID,IAAI;CACJ,IAAI,UACH,gBAAgB,IAAIC,wCAAAA,kBAAkB;EACrC,KAAK,GAAG,SAAS;EACjB;CACD,CAAC;MAGD,gBAAgB,IAAIC,8BAAAA,oBAAoB;CAIzC,MAAM,WAAW,yBAAyBC,6BAAAA,uBAAuB,WAAW;CAC5E,MAAM,gBAAgBC,6BAAAA,oBAAoB,eAAe,EAAE,SAAS,CAAC;CAGrE,6BAAA,uBAAuB,aAAa;CAGpC,MAAM,IAAIC,wBAAAA,QAAQ;EACjB;EACA;EACA,gBAAgB,CAAC,aAAa;EAC9B;CACD,CAAC;CAGD,IAAI,UAAU;EACb,MAAM,cAAc,IAAIC,uCAAAA,gBAAgB;GACvC,KAAK,GAAG,SAAS;GACjB;EACD,CAAC;EAMD,MAAM,eAAe,IAAIC,wBAAAA,wBAAwB,EAChD,UAAU,YACX,CAAC;EACsB,IAAIC,wBAAAA,eAAe;GACzC;GACA,YAAY,CAAC,YAAY;EAC1B,CAAC;EAGD,6BAAA,sBAAsB,YAAY;CACnC;CAGA,IAAI,MAAM;CAGV,QAAQ,GAAG,iBAAiB;EAC3B,KACG,SAAS,CAAC,CACX,WAAW,CAAC,CAAC,CAAC,CACd,OAAO,WAAW,CAAC,CAAC,CAAC,CACrB,cAAc,QAAQ,KAAK,CAAC,CAAC;CAChC,CAAC;AACF;;;;AAKA,eAAsB,oBAAmC;CACxD,IAAI,KAAK;EACR,MAAM,IAAI,SAAS;EACnB,MAAM;CACP;AACD"}