apitally 0.25.7 → 1.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (549) hide show
  1. package/README.md +191 -184
  2. package/dist/activation.cjs +371 -0
  3. package/dist/activation.cjs.map +1 -0
  4. package/dist/activation.d.cts +41 -0
  5. package/dist/activation.d.ts +41 -0
  6. package/dist/activation.js +357 -0
  7. package/dist/activation.js.map +1 -0
  8. package/dist/adonisjs/configure.cjs +88 -31
  9. package/dist/adonisjs/configure.cjs.map +1 -1
  10. package/dist/adonisjs/configure.d.cts +0 -4
  11. package/dist/adonisjs/configure.d.ts +0 -4
  12. package/dist/adonisjs/configure.js +85 -30
  13. package/dist/adonisjs/configure.js.map +1 -1
  14. package/dist/adonisjs/index.cjs +4 -23
  15. package/dist/adonisjs/index.cjs.map +1 -1
  16. package/dist/adonisjs/index.d.cts +3 -15
  17. package/dist/adonisjs/index.d.ts +3 -15
  18. package/dist/adonisjs/index.js +3 -20
  19. package/dist/adonisjs/index.js.map +1 -1
  20. package/dist/adonisjs/middleware.cjs +43 -109
  21. package/dist/adonisjs/middleware.cjs.map +1 -1
  22. package/dist/adonisjs/middleware.d.cts +1 -16
  23. package/dist/adonisjs/middleware.d.ts +1 -16
  24. package/dist/adonisjs/middleware.js +43 -110
  25. package/dist/adonisjs/middleware.js.map +1 -1
  26. package/dist/adonisjs/provider.cjs +19 -87
  27. package/dist/adonisjs/provider.cjs.map +1 -1
  28. package/dist/adonisjs/provider.d.cts +0 -22
  29. package/dist/adonisjs/provider.d.ts +0 -22
  30. package/dist/adonisjs/provider.js +19 -88
  31. package/dist/adonisjs/provider.js.map +1 -1
  32. package/dist/adonisjs/stubs/config/apitally.stub +11 -15
  33. package/dist/bodyCapture.cjs +128 -0
  34. package/dist/bodyCapture.cjs.map +1 -0
  35. package/dist/bodyCapture.d.cts +31 -0
  36. package/dist/bodyCapture.d.ts +31 -0
  37. package/dist/bodyCapture.js +101 -0
  38. package/dist/bodyCapture.js.map +1 -0
  39. package/dist/config.cjs +209 -0
  40. package/dist/config.cjs.map +1 -0
  41. package/dist/config.d.cts +42 -0
  42. package/dist/config.d.ts +42 -0
  43. package/dist/config.js +174 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/consumer.cjs +98 -0
  46. package/dist/consumer.cjs.map +1 -0
  47. package/dist/consumer.d.cts +13 -0
  48. package/dist/consumer.d.ts +13 -0
  49. package/dist/consumer.js +78 -0
  50. package/dist/consumer.js.map +1 -0
  51. package/dist/context.cjs +68 -0
  52. package/dist/context.cjs.map +1 -0
  53. package/dist/context.d.cts +29 -0
  54. package/dist/context.d.ts +29 -0
  55. package/dist/context.js +40 -0
  56. package/dist/context.js.map +1 -0
  57. package/dist/elysia/index.cjs +12 -13
  58. package/dist/elysia/index.cjs.map +1 -1
  59. package/dist/elysia/index.d.cts +7 -16
  60. package/dist/elysia/index.d.ts +7 -16
  61. package/dist/elysia/index.js +10 -2
  62. package/dist/elysia/index.js.map +1 -1
  63. package/dist/elysia/middleware.cjs +248 -0
  64. package/dist/elysia/middleware.cjs.map +1 -0
  65. package/dist/elysia/middleware.d.cts +13 -0
  66. package/dist/elysia/middleware.d.ts +13 -0
  67. package/dist/elysia/middleware.js +237 -0
  68. package/dist/elysia/middleware.js.map +1 -0
  69. package/dist/{loggers/index.cjs → elysia/routes.cjs} +16 -19
  70. package/dist/elysia/routes.cjs.map +1 -0
  71. package/dist/elysia/routes.d.cts +7 -0
  72. package/dist/elysia/routes.d.ts +7 -0
  73. package/dist/elysia/routes.js +14 -0
  74. package/dist/elysia/routes.js.map +1 -0
  75. package/dist/exceptions.cjs +75 -0
  76. package/dist/exceptions.cjs.map +1 -0
  77. package/dist/exceptions.d.cts +7 -0
  78. package/dist/exceptions.d.ts +7 -0
  79. package/dist/exceptions.js +49 -0
  80. package/dist/exceptions.js.map +1 -0
  81. package/dist/exportSerialization.cjs +56 -0
  82. package/dist/exportSerialization.cjs.map +1 -0
  83. package/dist/exportSerialization.d.cts +7 -0
  84. package/dist/exportSerialization.d.ts +7 -0
  85. package/dist/exportSerialization.js +32 -0
  86. package/dist/exportSerialization.js.map +1 -0
  87. package/dist/exportWorker.cjs +305 -0
  88. package/dist/exportWorker.cjs.map +1 -0
  89. package/dist/exportWorker.d.cts +46 -0
  90. package/dist/exportWorker.d.ts +46 -0
  91. package/dist/exportWorker.js +279 -0
  92. package/dist/exportWorker.js.map +1 -0
  93. package/dist/express/index.cjs +9 -4
  94. package/dist/express/index.cjs.map +1 -1
  95. package/dist/express/index.d.cts +6 -10
  96. package/dist/express/index.d.ts +6 -10
  97. package/dist/express/index.js +8 -2
  98. package/dist/express/index.js.map +1 -1
  99. package/dist/express/install.cjs +45 -0
  100. package/dist/express/install.cjs.map +1 -0
  101. package/dist/express/install.d.cts +9 -0
  102. package/dist/express/install.d.ts +9 -0
  103. package/dist/express/install.js +21 -0
  104. package/dist/express/install.js.map +1 -0
  105. package/dist/express/middleware.cjs +80 -331
  106. package/dist/express/middleware.cjs.map +1 -1
  107. package/dist/express/middleware.d.cts +3 -21
  108. package/dist/express/middleware.d.ts +3 -21
  109. package/dist/express/middleware.js +81 -328
  110. package/dist/express/middleware.js.map +1 -1
  111. package/dist/express/register.cjs +20 -0
  112. package/dist/express/register.cjs.map +1 -0
  113. package/dist/express/register.d.cts +2 -0
  114. package/dist/express/register.d.ts +2 -0
  115. package/dist/express/register.js +19 -0
  116. package/dist/express/register.js.map +1 -0
  117. package/dist/express/routes.cjs +419 -0
  118. package/dist/express/routes.cjs.map +1 -0
  119. package/dist/express/routes.d.cts +14 -0
  120. package/dist/express/routes.d.ts +14 -0
  121. package/dist/express/routes.js +391 -0
  122. package/dist/express/routes.js.map +1 -0
  123. package/dist/fastify/index.cjs +10 -15
  124. package/dist/fastify/index.cjs.map +1 -1
  125. package/dist/fastify/index.d.cts +6 -11
  126. package/dist/fastify/index.d.ts +6 -11
  127. package/dist/fastify/index.js +9 -3
  128. package/dist/fastify/index.js.map +1 -1
  129. package/dist/{common/logging.cjs → fastify/install.cjs} +15 -16
  130. package/dist/fastify/install.cjs.map +1 -0
  131. package/dist/fastify/install.d.cts +9 -0
  132. package/dist/fastify/install.d.ts +9 -0
  133. package/dist/fastify/install.js +15 -0
  134. package/dist/fastify/install.js.map +1 -0
  135. package/dist/fastify/middleware.cjs +118 -0
  136. package/dist/fastify/middleware.cjs.map +1 -0
  137. package/dist/fastify/middleware.d.cts +7 -0
  138. package/dist/fastify/middleware.d.ts +7 -0
  139. package/dist/fastify/middleware.js +97 -0
  140. package/dist/fastify/middleware.js.map +1 -0
  141. package/dist/{common/paramValidation.cjs → fastify/routes.cjs} +15 -17
  142. package/dist/fastify/routes.cjs.map +1 -0
  143. package/dist/fastify/routes.d.cts +8 -0
  144. package/dist/fastify/routes.d.ts +8 -0
  145. package/dist/fastify/routes.js +14 -0
  146. package/dist/fastify/routes.js.map +1 -0
  147. package/dist/h3/index.cjs +28 -4
  148. package/dist/h3/index.cjs.map +1 -1
  149. package/dist/h3/index.d.cts +7 -10
  150. package/dist/h3/index.d.ts +7 -10
  151. package/dist/h3/index.js +26 -2
  152. package/dist/h3/index.js.map +1 -1
  153. package/dist/h3/middleware.cjs +204 -0
  154. package/dist/h3/middleware.cjs.map +1 -0
  155. package/dist/h3/middleware.d.cts +5 -0
  156. package/dist/h3/middleware.d.ts +5 -0
  157. package/dist/h3/middleware.js +188 -0
  158. package/dist/h3/middleware.js.map +1 -0
  159. package/dist/h3/routes.cjs +66 -0
  160. package/dist/h3/routes.cjs.map +1 -0
  161. package/dist/h3/routes.d.cts +8 -0
  162. package/dist/h3/routes.d.ts +8 -0
  163. package/dist/h3/routes.js +41 -0
  164. package/dist/h3/routes.js.map +1 -0
  165. package/dist/hapi/index.cjs +15 -14
  166. package/dist/hapi/index.cjs.map +1 -1
  167. package/dist/hapi/index.d.cts +7 -10
  168. package/dist/hapi/index.d.ts +7 -10
  169. package/dist/hapi/index.js +14 -3
  170. package/dist/hapi/index.js.map +1 -1
  171. package/dist/{loggers/hapi.cjs → hapi/install.cjs} +20 -26
  172. package/dist/hapi/install.cjs.map +1 -0
  173. package/dist/hapi/install.d.cts +7 -0
  174. package/dist/hapi/install.d.ts +7 -0
  175. package/dist/hapi/install.js +22 -0
  176. package/dist/hapi/install.js.map +1 -0
  177. package/dist/hapi/middleware.cjs +158 -0
  178. package/dist/hapi/middleware.cjs.map +1 -0
  179. package/dist/hapi/middleware.d.cts +5 -0
  180. package/dist/hapi/middleware.d.ts +5 -0
  181. package/dist/hapi/middleware.js +137 -0
  182. package/dist/hapi/middleware.js.map +1 -0
  183. package/dist/hapi/routes.cjs +37 -0
  184. package/dist/hapi/routes.cjs.map +1 -0
  185. package/dist/hapi/routes.d.cts +8 -0
  186. package/dist/hapi/routes.d.ts +8 -0
  187. package/dist/hapi/routes.js +12 -0
  188. package/dist/hapi/routes.js.map +1 -0
  189. package/dist/hono/index.cjs +13 -3
  190. package/dist/hono/index.cjs.map +1 -1
  191. package/dist/hono/index.d.cts +6 -10
  192. package/dist/hono/index.d.ts +6 -10
  193. package/dist/hono/index.js +13 -2
  194. package/dist/hono/index.js.map +1 -1
  195. package/dist/hono/middleware.cjs +211 -127
  196. package/dist/hono/middleware.cjs.map +1 -1
  197. package/dist/hono/middleware.d.cts +3 -18
  198. package/dist/hono/middleware.d.ts +3 -18
  199. package/dist/hono/middleware.js +216 -125
  200. package/dist/hono/middleware.js.map +1 -1
  201. package/dist/hono/routes.cjs +74 -0
  202. package/dist/hono/routes.cjs.map +1 -0
  203. package/dist/hono/routes.d.cts +8 -0
  204. package/dist/hono/routes.d.ts +8 -0
  205. package/dist/hono/routes.js +49 -0
  206. package/dist/hono/routes.js.map +1 -0
  207. package/dist/index.cjs +108 -0
  208. package/dist/index.cjs.map +1 -1
  209. package/dist/index.d.cts +28 -1
  210. package/dist/index.d.ts +28 -1
  211. package/dist/index.js +77 -0
  212. package/dist/index.js.map +1 -1
  213. package/dist/koa/index.cjs +13 -3
  214. package/dist/koa/index.cjs.map +1 -1
  215. package/dist/koa/index.d.cts +6 -10
  216. package/dist/koa/index.d.ts +6 -10
  217. package/dist/koa/index.js +13 -2
  218. package/dist/koa/index.js.map +1 -1
  219. package/dist/koa/middleware.cjs +75 -184
  220. package/dist/koa/middleware.cjs.map +1 -1
  221. package/dist/koa/middleware.d.cts +3 -13
  222. package/dist/koa/middleware.d.ts +3 -13
  223. package/dist/koa/middleware.js +78 -183
  224. package/dist/koa/middleware.js.map +1 -1
  225. package/dist/koa/routes.cjs +71 -0
  226. package/dist/koa/routes.cjs.map +1 -0
  227. package/dist/koa/routes.d.cts +8 -0
  228. package/dist/koa/routes.d.ts +8 -0
  229. package/dist/koa/routes.js +46 -0
  230. package/dist/koa/routes.js.map +1 -0
  231. package/dist/logCapture.cjs +410 -0
  232. package/dist/logCapture.cjs.map +1 -0
  233. package/dist/logCapture.d.cts +16 -0
  234. package/dist/logCapture.d.ts +16 -0
  235. package/dist/logCapture.js +383 -0
  236. package/dist/logCapture.js.map +1 -0
  237. package/dist/logRecordExporter.cjs +83 -0
  238. package/dist/logRecordExporter.cjs.map +1 -0
  239. package/dist/logRecordExporter.d.cts +14 -0
  240. package/dist/logRecordExporter.d.ts +14 -0
  241. package/dist/logRecordExporter.js +59 -0
  242. package/dist/logRecordExporter.js.map +1 -0
  243. package/dist/logRecordProcessor.cjs +120 -0
  244. package/dist/logRecordProcessor.cjs.map +1 -0
  245. package/dist/logRecordProcessor.d.cts +23 -0
  246. package/dist/logRecordProcessor.d.ts +23 -0
  247. package/dist/logRecordProcessor.js +96 -0
  248. package/dist/logRecordProcessor.js.map +1 -0
  249. package/dist/{otel/index.cjs → logRecordTruncation.cjs} +10 -7
  250. package/dist/logRecordTruncation.cjs.map +1 -0
  251. package/dist/logRecordTruncation.d.cts +6 -0
  252. package/dist/logRecordTruncation.d.ts +6 -0
  253. package/dist/logRecordTruncation.js +8 -0
  254. package/dist/logRecordTruncation.js.map +1 -0
  255. package/dist/logger.cjs +62 -0
  256. package/dist/logger.cjs.map +1 -0
  257. package/dist/logger.d.cts +7 -0
  258. package/dist/logger.d.ts +7 -0
  259. package/dist/logger.js +34 -0
  260. package/dist/logger.js.map +1 -0
  261. package/dist/metrics.cjs +171 -0
  262. package/dist/metrics.cjs.map +1 -0
  263. package/dist/metrics.d.cts +24 -0
  264. package/dist/metrics.d.ts +24 -0
  265. package/dist/metrics.js +153 -0
  266. package/dist/metrics.js.map +1 -0
  267. package/dist/nestjs/index.cjs +61 -71
  268. package/dist/nestjs/index.cjs.map +1 -1
  269. package/dist/nestjs/index.d.cts +3 -11
  270. package/dist/nestjs/index.d.ts +3 -11
  271. package/dist/nestjs/index.js +61 -61
  272. package/dist/nestjs/index.js.map +1 -1
  273. package/dist/packageVersion.cjs +67 -0
  274. package/dist/packageVersion.cjs.map +1 -0
  275. package/dist/packageVersion.d.cts +5 -0
  276. package/dist/packageVersion.d.ts +5 -0
  277. package/dist/packageVersion.js +39 -0
  278. package/dist/packageVersion.js.map +1 -0
  279. package/dist/providers.cjs +149 -0
  280. package/dist/providers.cjs.map +1 -0
  281. package/dist/providers.d.cts +15 -0
  282. package/dist/providers.d.ts +15 -0
  283. package/dist/providers.js +136 -0
  284. package/dist/providers.js.map +1 -0
  285. package/dist/redaction.cjs +116 -0
  286. package/dist/redaction.cjs.map +1 -0
  287. package/dist/redaction.d.cts +17 -0
  288. package/dist/redaction.d.ts +17 -0
  289. package/dist/redaction.js +98 -0
  290. package/dist/redaction.js.map +1 -0
  291. package/dist/{common/packageVersions.cjs → requestAttributes.cjs} +21 -19
  292. package/dist/requestAttributes.cjs.map +1 -0
  293. package/dist/requestAttributes.d.cts +8 -0
  294. package/dist/requestAttributes.d.ts +8 -0
  295. package/dist/requestAttributes.js +22 -0
  296. package/dist/requestAttributes.js.map +1 -0
  297. package/dist/requestObservation.cjs +228 -0
  298. package/dist/requestObservation.cjs.map +1 -0
  299. package/dist/requestObservation.d.cts +60 -0
  300. package/dist/requestObservation.d.ts +60 -0
  301. package/dist/requestObservation.js +208 -0
  302. package/dist/requestObservation.js.map +1 -0
  303. package/dist/requestObservationNode.cjs +193 -0
  304. package/dist/requestObservationNode.cjs.map +1 -0
  305. package/dist/requestObservationNode.d.cts +29 -0
  306. package/dist/requestObservationNode.d.ts +29 -0
  307. package/dist/requestObservationNode.js +170 -0
  308. package/dist/requestObservationNode.js.map +1 -0
  309. package/dist/requestObservationWeb.cjs +202 -0
  310. package/dist/requestObservationWeb.cjs.map +1 -0
  311. package/dist/requestObservationWeb.d.cts +32 -0
  312. package/dist/requestObservationWeb.d.ts +32 -0
  313. package/dist/requestObservationWeb.js +182 -0
  314. package/dist/requestObservationWeb.js.map +1 -0
  315. package/dist/sentry.cjs +103 -0
  316. package/dist/sentry.cjs.map +1 -0
  317. package/dist/sentry.d.cts +3 -0
  318. package/dist/sentry.d.ts +3 -0
  319. package/dist/sentry.js +79 -0
  320. package/dist/sentry.js.map +1 -0
  321. package/dist/spanExporter.cjs +218 -0
  322. package/dist/spanExporter.cjs.map +1 -0
  323. package/dist/spanExporter.d.cts +33 -0
  324. package/dist/spanExporter.d.ts +33 -0
  325. package/dist/spanExporter.js +194 -0
  326. package/dist/spanExporter.js.map +1 -0
  327. package/dist/spanProcessor.cjs +523 -0
  328. package/dist/spanProcessor.cjs.map +1 -0
  329. package/dist/spanProcessor.d.cts +67 -0
  330. package/dist/spanProcessor.d.ts +67 -0
  331. package/dist/spanProcessor.js +501 -0
  332. package/dist/spanProcessor.js.map +1 -0
  333. package/dist/spool.cjs +314 -0
  334. package/dist/spool.cjs.map +1 -0
  335. package/dist/spool.d.cts +49 -0
  336. package/dist/spool.d.ts +49 -0
  337. package/dist/spool.js +297 -0
  338. package/dist/spool.js.map +1 -0
  339. package/dist/startup.cjs +93 -0
  340. package/dist/startup.cjs.map +1 -0
  341. package/dist/startup.d.cts +15 -0
  342. package/dist/startup.d.ts +15 -0
  343. package/dist/startup.js +68 -0
  344. package/dist/startup.js.map +1 -0
  345. package/dist/tracing.cjs +116 -0
  346. package/dist/tracing.cjs.map +1 -0
  347. package/dist/tracing.d.cts +5 -0
  348. package/dist/tracing.d.ts +5 -0
  349. package/dist/tracing.js +96 -0
  350. package/dist/tracing.js.map +1 -0
  351. package/package.json +113 -155
  352. package/dist/common/client.cjs +0 -335
  353. package/dist/common/client.cjs.map +0 -1
  354. package/dist/common/client.d.cts +0 -50
  355. package/dist/common/client.d.ts +0 -50
  356. package/dist/common/client.js +0 -302
  357. package/dist/common/client.js.map +0 -1
  358. package/dist/common/consumerRegistry.cjs +0 -84
  359. package/dist/common/consumerRegistry.cjs.map +0 -1
  360. package/dist/common/consumerRegistry.d.cts +0 -20
  361. package/dist/common/consumerRegistry.d.ts +0 -20
  362. package/dist/common/consumerRegistry.js +0 -61
  363. package/dist/common/consumerRegistry.js.map +0 -1
  364. package/dist/common/headers.cjs +0 -55
  365. package/dist/common/headers.cjs.map +0 -1
  366. package/dist/common/headers.d.cts +0 -6
  367. package/dist/common/headers.d.ts +0 -6
  368. package/dist/common/headers.js +0 -31
  369. package/dist/common/headers.js.map +0 -1
  370. package/dist/common/instance.cjs +0 -158
  371. package/dist/common/instance.cjs.map +0 -1
  372. package/dist/common/instance.d.cts +0 -4
  373. package/dist/common/instance.d.ts +0 -4
  374. package/dist/common/instance.js +0 -134
  375. package/dist/common/instance.js.map +0 -1
  376. package/dist/common/logging.cjs.map +0 -1
  377. package/dist/common/logging.d.cts +0 -11
  378. package/dist/common/logging.d.ts +0 -11
  379. package/dist/common/logging.js +0 -17
  380. package/dist/common/logging.js.map +0 -1
  381. package/dist/common/packageVersions.cjs.map +0 -1
  382. package/dist/common/packageVersions.d.cts +0 -3
  383. package/dist/common/packageVersions.d.ts +0 -3
  384. package/dist/common/packageVersions.js +0 -21
  385. package/dist/common/packageVersions.js.map +0 -1
  386. package/dist/common/paramValidation.cjs.map +0 -1
  387. package/dist/common/paramValidation.d.cts +0 -4
  388. package/dist/common/paramValidation.d.ts +0 -4
  389. package/dist/common/paramValidation.js +0 -17
  390. package/dist/common/paramValidation.js.map +0 -1
  391. package/dist/common/requestCounter.cjs +0 -109
  392. package/dist/common/requestCounter.cjs.map +0 -1
  393. package/dist/common/requestCounter.d.cts +0 -24
  394. package/dist/common/requestCounter.d.ts +0 -24
  395. package/dist/common/requestCounter.js +0 -90
  396. package/dist/common/requestCounter.js.map +0 -1
  397. package/dist/common/requestLogger.cjs +0 -541
  398. package/dist/common/requestLogger.cjs.map +0 -1
  399. package/dist/common/requestLogger.d.cts +0 -85
  400. package/dist/common/requestLogger.d.ts +0 -85
  401. package/dist/common/requestLogger.js +0 -507
  402. package/dist/common/requestLogger.js.map +0 -1
  403. package/dist/common/resources.cjs +0 -49
  404. package/dist/common/resources.cjs.map +0 -1
  405. package/dist/common/resources.d.cts +0 -6
  406. package/dist/common/resources.d.ts +0 -6
  407. package/dist/common/resources.js +0 -26
  408. package/dist/common/resources.js.map +0 -1
  409. package/dist/common/response.cjs +0 -104
  410. package/dist/common/response.cjs.map +0 -1
  411. package/dist/common/response.d.cts +0 -15
  412. package/dist/common/response.d.ts +0 -15
  413. package/dist/common/response.js +0 -80
  414. package/dist/common/response.js.map +0 -1
  415. package/dist/common/sentry.cjs +0 -56
  416. package/dist/common/sentry.cjs.map +0 -1
  417. package/dist/common/sentry.d.cts +0 -6
  418. package/dist/common/sentry.d.ts +0 -6
  419. package/dist/common/sentry.js +0 -23
  420. package/dist/common/sentry.js.map +0 -1
  421. package/dist/common/serverErrorCounter.cjs +0 -121
  422. package/dist/common/serverErrorCounter.cjs.map +0 -1
  423. package/dist/common/serverErrorCounter.d.cts +0 -23
  424. package/dist/common/serverErrorCounter.d.ts +0 -23
  425. package/dist/common/serverErrorCounter.js +0 -97
  426. package/dist/common/serverErrorCounter.js.map +0 -1
  427. package/dist/common/spanCollector.cjs +0 -199
  428. package/dist/common/spanCollector.cjs.map +0 -1
  429. package/dist/common/spanCollector.d.cts +0 -45
  430. package/dist/common/spanCollector.d.ts +0 -45
  431. package/dist/common/spanCollector.js +0 -176
  432. package/dist/common/spanCollector.js.map +0 -1
  433. package/dist/common/tempGzipFile.cjs +0 -125
  434. package/dist/common/tempGzipFile.cjs.map +0 -1
  435. package/dist/common/tempGzipFile.d.cts +0 -19
  436. package/dist/common/tempGzipFile.d.ts +0 -19
  437. package/dist/common/tempGzipFile.js +0 -102
  438. package/dist/common/tempGzipFile.js.map +0 -1
  439. package/dist/common/types.cjs +0 -17
  440. package/dist/common/types.cjs.map +0 -1
  441. package/dist/common/types.d.cts +0 -95
  442. package/dist/common/types.d.ts +0 -95
  443. package/dist/common/types.js +0 -1
  444. package/dist/common/types.js.map +0 -1
  445. package/dist/common/validationErrorCounter.cjs +0 -74
  446. package/dist/common/validationErrorCounter.cjs.map +0 -1
  447. package/dist/common/validationErrorCounter.d.cts +0 -20
  448. package/dist/common/validationErrorCounter.d.ts +0 -20
  449. package/dist/common/validationErrorCounter.js +0 -55
  450. package/dist/common/validationErrorCounter.js.map +0 -1
  451. package/dist/elysia/plugin.cjs +0 -237
  452. package/dist/elysia/plugin.cjs.map +0 -1
  453. package/dist/elysia/plugin.d.cts +0 -70
  454. package/dist/elysia/plugin.d.ts +0 -70
  455. package/dist/elysia/plugin.js +0 -218
  456. package/dist/elysia/plugin.js.map +0 -1
  457. package/dist/elysia/utils.cjs +0 -77
  458. package/dist/elysia/utils.cjs.map +0 -1
  459. package/dist/elysia/utils.d.cts +0 -14
  460. package/dist/elysia/utils.d.ts +0 -14
  461. package/dist/elysia/utils.js +0 -54
  462. package/dist/elysia/utils.js.map +0 -1
  463. package/dist/express/utils.cjs +0 -217
  464. package/dist/express/utils.cjs.map +0 -1
  465. package/dist/express/utils.d.cts +0 -37
  466. package/dist/express/utils.d.ts +0 -37
  467. package/dist/express/utils.js +0 -189
  468. package/dist/express/utils.js.map +0 -1
  469. package/dist/fastify/plugin.cjs +0 -316
  470. package/dist/fastify/plugin.cjs.map +0 -1
  471. package/dist/fastify/plugin.d.cts +0 -34
  472. package/dist/fastify/plugin.d.ts +0 -34
  473. package/dist/fastify/plugin.js +0 -282
  474. package/dist/fastify/plugin.js.map +0 -1
  475. package/dist/h3/plugin.cjs +0 -183
  476. package/dist/h3/plugin.cjs.map +0 -1
  477. package/dist/h3/plugin.d.cts +0 -27
  478. package/dist/h3/plugin.d.ts +0 -27
  479. package/dist/h3/plugin.js +0 -159
  480. package/dist/h3/plugin.js.map +0 -1
  481. package/dist/h3/utils.cjs +0 -77
  482. package/dist/h3/utils.cjs.map +0 -1
  483. package/dist/h3/utils.d.cts +0 -14
  484. package/dist/h3/utils.d.ts +0 -14
  485. package/dist/h3/utils.js +0 -54
  486. package/dist/h3/utils.js.map +0 -1
  487. package/dist/hapi/plugin.cjs +0 -210
  488. package/dist/hapi/plugin.cjs.map +0 -1
  489. package/dist/hapi/plugin.d.cts +0 -40
  490. package/dist/hapi/plugin.d.ts +0 -40
  491. package/dist/hapi/plugin.js +0 -187
  492. package/dist/hapi/plugin.js.map +0 -1
  493. package/dist/hapi/utils.cjs +0 -77
  494. package/dist/hapi/utils.cjs.map +0 -1
  495. package/dist/hapi/utils.d.cts +0 -16
  496. package/dist/hapi/utils.d.ts +0 -16
  497. package/dist/hapi/utils.js +0 -53
  498. package/dist/hapi/utils.js.map +0 -1
  499. package/dist/hono/utils.cjs +0 -113
  500. package/dist/hono/utils.cjs.map +0 -1
  501. package/dist/hono/utils.d.cts +0 -16
  502. package/dist/hono/utils.d.ts +0 -16
  503. package/dist/hono/utils.js +0 -88
  504. package/dist/hono/utils.js.map +0 -1
  505. package/dist/loggers/console.cjs +0 -67
  506. package/dist/loggers/console.cjs.map +0 -1
  507. package/dist/loggers/console.d.cts +0 -11
  508. package/dist/loggers/console.d.ts +0 -11
  509. package/dist/loggers/console.js +0 -44
  510. package/dist/loggers/console.js.map +0 -1
  511. package/dist/loggers/hapi.cjs.map +0 -1
  512. package/dist/loggers/hapi.d.cts +0 -12
  513. package/dist/loggers/hapi.d.ts +0 -12
  514. package/dist/loggers/hapi.js +0 -29
  515. package/dist/loggers/hapi.js.map +0 -1
  516. package/dist/loggers/index.cjs.map +0 -1
  517. package/dist/loggers/index.d.cts +0 -13
  518. package/dist/loggers/index.d.ts +0 -13
  519. package/dist/loggers/index.js +0 -13
  520. package/dist/loggers/index.js.map +0 -1
  521. package/dist/loggers/nestjs.cjs +0 -104
  522. package/dist/loggers/nestjs.cjs.map +0 -1
  523. package/dist/loggers/nestjs.d.cts +0 -11
  524. package/dist/loggers/nestjs.d.ts +0 -11
  525. package/dist/loggers/nestjs.js +0 -71
  526. package/dist/loggers/nestjs.js.map +0 -1
  527. package/dist/loggers/pino.cjs +0 -152
  528. package/dist/loggers/pino.cjs.map +0 -1
  529. package/dist/loggers/pino.d.cts +0 -11
  530. package/dist/loggers/pino.d.ts +0 -11
  531. package/dist/loggers/pino.js +0 -119
  532. package/dist/loggers/pino.js.map +0 -1
  533. package/dist/loggers/utils.cjs +0 -64
  534. package/dist/loggers/utils.cjs.map +0 -1
  535. package/dist/loggers/utils.d.cts +0 -6
  536. package/dist/loggers/utils.d.ts +0 -6
  537. package/dist/loggers/utils.js +0 -40
  538. package/dist/loggers/utils.js.map +0 -1
  539. package/dist/loggers/winston.cjs +0 -101
  540. package/dist/loggers/winston.cjs.map +0 -1
  541. package/dist/loggers/winston.d.cts +0 -11
  542. package/dist/loggers/winston.d.ts +0 -11
  543. package/dist/loggers/winston.js +0 -68
  544. package/dist/loggers/winston.js.map +0 -1
  545. package/dist/otel/index.cjs.map +0 -1
  546. package/dist/otel/index.d.cts +0 -2
  547. package/dist/otel/index.d.ts +0 -2
  548. package/dist/otel/index.js +0 -5
  549. package/dist/otel/index.js.map +0 -1
@@ -0,0 +1,523 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var spanProcessor_exports = {};
20
+ __export(spanProcessor_exports, {
21
+ ApitallySpanProcessor: () => ApitallySpanProcessor,
22
+ SpanPipeline: () => SpanPipeline,
23
+ copySpan: () => copySpan,
24
+ getActiveSpanPipeline: () => getActiveSpanPipeline,
25
+ isApitallySpanProcessorDeclared: () => isApitallySpanProcessorDeclared,
26
+ resetSpanProcessorState: () => resetSpanProcessorState,
27
+ setActiveSpanPipeline: () => setActiveSpanPipeline,
28
+ setServerSpanActivationCallback: () => setServerSpanActivationCallback
29
+ });
30
+ module.exports = __toCommonJS(spanProcessor_exports);
31
+ var import_api = require("@opentelemetry/api");
32
+ var import_core = require("@opentelemetry/core");
33
+ var import_config = require('./config.cjs');
34
+ var import_consumer = require('./consumer.cjs');
35
+ var import_context = require('./context.cjs');
36
+ var import_logger = require('./logger.cjs');
37
+ const MAX_BUFFERED_SPANS = 1e3;
38
+ const MAX_TRACKED_SPAN_IDS = MAX_BUFFERED_SPANS + 1;
39
+ const MAX_STASHED_REQUESTS = 2048;
40
+ const MAX_KEPT_SPAN_IDS = 1e4;
41
+ const EXCLUDE_USER_AGENT_PATTERNS = (0, import_config.compilePatterns)(import_config.EXCLUDE_USER_AGENTS);
42
+ class ApitallySpanProcessor {
43
+ constructor() {
44
+ setApitallySpanProcessorDeclared();
45
+ }
46
+ onStart(span, parentContext) {
47
+ let pipeline = getActiveSpanPipeline();
48
+ if (!pipeline && span.kind === import_api.SpanKind.SERVER) {
49
+ getServerSpanActivationCallback()?.(span);
50
+ pipeline = getActiveSpanPipeline();
51
+ }
52
+ pipeline?.onStart(span, parentContext);
53
+ }
54
+ onEnd(span) {
55
+ getActiveSpanPipeline()?.onEnd(span);
56
+ }
57
+ // Flush failures resolve instead of rejecting into the user's provider.
58
+ forceFlush() {
59
+ const pipeline = getActiveSpanPipeline();
60
+ if (!pipeline) {
61
+ return Promise.resolve();
62
+ }
63
+ return pipeline.forceFlush().catch((error) => {
64
+ (0, import_logger.logDebug)(`Error flushing spans: ${String(error)}`);
65
+ });
66
+ }
67
+ // A user provider's shutdown only flushes released requests; SDK shutdown owns
68
+ // teardown.
69
+ shutdown() {
70
+ return this.forceFlush();
71
+ }
72
+ }
73
+ const ACTIVE_SPAN_PIPELINE_KEY = /* @__PURE__ */ Symbol.for("apitally.activeSpanPipeline");
74
+ const APITALLY_SPAN_PROCESSOR_DECLARED_KEY = /* @__PURE__ */ Symbol.for("apitally.spanProcessorDeclared");
75
+ const SERVER_SPAN_ACTIVATION_CALLBACK_KEY = /* @__PURE__ */ Symbol.for("apitally.serverSpanActivationCallback");
76
+ function setActiveSpanPipeline(pipeline) {
77
+ globalThis[ACTIVE_SPAN_PIPELINE_KEY] = pipeline;
78
+ }
79
+ function getActiveSpanPipeline() {
80
+ return globalThis[ACTIVE_SPAN_PIPELINE_KEY];
81
+ }
82
+ function setServerSpanActivationCallback(callback) {
83
+ const holder = globalThis;
84
+ holder[SERVER_SPAN_ACTIVATION_CALLBACK_KEY] ??= callback;
85
+ }
86
+ function isApitallySpanProcessorDeclared() {
87
+ return globalThis[APITALLY_SPAN_PROCESSOR_DECLARED_KEY] === true;
88
+ }
89
+ function resetSpanProcessorState() {
90
+ const holder = globalThis;
91
+ delete holder[ACTIVE_SPAN_PIPELINE_KEY];
92
+ delete holder[APITALLY_SPAN_PROCESSOR_DECLARED_KEY];
93
+ delete holder[SERVER_SPAN_ACTIVATION_CALLBACK_KEY];
94
+ }
95
+ function setApitallySpanProcessorDeclared() {
96
+ globalThis[APITALLY_SPAN_PROCESSOR_DECLARED_KEY] = true;
97
+ }
98
+ function getServerSpanActivationCallback() {
99
+ return globalThis[SERVER_SPAN_ACTIVATION_CALLBACK_KEY];
100
+ }
101
+ class SpanPipeline {
102
+ // Callbacks are optional because metrics and log pipelines start at activation.
103
+ metricsRecorder;
104
+ onRequestFinished;
105
+ downstream;
106
+ config;
107
+ sampleRateBound;
108
+ excludePathPatterns;
109
+ // Every span ID remains mapped to one request until completion so late logs
110
+ // resolve. A miss means dropped, completed, or non-request telemetry.
111
+ requests = /* @__PURE__ */ new Map();
112
+ stash = /* @__PURE__ */ new Map();
113
+ demotedSpanIds = /* @__PURE__ */ new Set();
114
+ // Kept span IDs remain resolvable after release for late spans and logs; the
115
+ // oldest are evicted at the cap.
116
+ keptSpanIds = /* @__PURE__ */ new Map();
117
+ constructor(downstream) {
118
+ this.downstream = downstream;
119
+ this.config = (0, import_config.getConfig)();
120
+ this.sampleRateBound = boundForSampleRate(this.config.sampleRate);
121
+ this.excludePathPatterns = (0, import_config.compilePatterns)(import_config.DEFAULT_EXCLUDE_PATHS, this.config.excludePaths);
122
+ }
123
+ onStart(span, parentContext) {
124
+ try {
125
+ if (isContribPerMessageSpan(span)) {
126
+ return;
127
+ }
128
+ const parent = span.parentSpanContext;
129
+ if (!parent || parent.isRemote) {
130
+ if (span.kind === import_api.SpanKind.SERVER) {
131
+ this.startRequest(span, parentContext);
132
+ }
133
+ return;
134
+ }
135
+ const entry = this.requests.get(parent.spanId);
136
+ const spanId = span.spanContext().spanId;
137
+ if (!entry) {
138
+ const kept = this.keptSpanIds.get(parent.spanId);
139
+ if (kept) {
140
+ this.addKeptSpanId(spanId, {
141
+ serverSpanId: kept.serverSpanId,
142
+ demoted: false
143
+ });
144
+ }
145
+ return;
146
+ }
147
+ if (entry.spanIds.size >= MAX_TRACKED_SPAN_IDS) {
148
+ (0, import_logger.logDebug)("Apitally span tracking cap reached, dropping the span");
149
+ return;
150
+ }
151
+ if (span.kind === import_api.SpanKind.SERVER) {
152
+ this.demotedSpanIds.add(spanId);
153
+ (0, import_logger.logWarning)(
154
+ `Detected a duplicate SERVER span produced by the instrumentation scope "${span.instrumentationScope?.name ?? "unknown"}" inside an active request. Apitally exports it as an INTERNAL span, but your own OpenTelemetry exporters still receive the duplicate. To resolve this, remove the middleware that produces it.`
155
+ );
156
+ }
157
+ this.requests.set(spanId, entry);
158
+ entry.spanIds.add(spanId);
159
+ } catch (error) {
160
+ (0, import_logger.logWarning)(`Error in the Apitally span processor: ${String(error)}`);
161
+ }
162
+ }
163
+ onEnd(span) {
164
+ try {
165
+ const spanId = span.spanContext().spanId;
166
+ const isDemoted = this.demotedSpanIds.delete(spanId);
167
+ const entry = this.requests.get(spanId);
168
+ if (!entry) {
169
+ const kept = this.keptSpanIds.get(spanId);
170
+ if (kept) {
171
+ let exportSpan2 = span;
172
+ if (kept.demoted) {
173
+ const copy = copySpan(span);
174
+ copy.apitallyData = { demoteToInternal: true };
175
+ exportSpan2 = copy;
176
+ }
177
+ this.downstream.onEnd(exportSpan2);
178
+ }
179
+ return;
180
+ }
181
+ if (spanId === entry.serverSpanId) {
182
+ entry.endedServerSpan = span;
183
+ this.releaseIfComplete(entry);
184
+ return;
185
+ }
186
+ let exportSpan = span;
187
+ if (isDemoted) {
188
+ const copy = copySpan(span);
189
+ copy.apitallyData = { demoteToInternal: true };
190
+ exportSpan = copy;
191
+ }
192
+ if (entry.buffered.length < MAX_BUFFERED_SPANS) {
193
+ entry.buffered.push(exportSpan);
194
+ } else {
195
+ (0, import_logger.logDebug)("Apitally span buffer cap reached, dropping the span");
196
+ }
197
+ } catch (error) {
198
+ (0, import_logger.logWarning)(`Error in the Apitally span processor: ${String(error)}`);
199
+ }
200
+ }
201
+ // Transport completion triggers response sampling and metrics independently
202
+ // of span-end timing. Map misses still record metrics and discard other data.
203
+ handleTransportCompletion(record) {
204
+ try {
205
+ record.dropReason = resolveTransportDropReason(record.attributes) ?? record.dropReason;
206
+ const entry = record.serverSpanId !== void 0 ? this.requests.get(record.serverSpanId) : void 0;
207
+ if (entry && !entry.transportCompleted && !entry.released) {
208
+ entry.record ??= record;
209
+ entry.transportCompleted = true;
210
+ if (!this.isResponseSampledIn(entry)) {
211
+ this.dropRequestOnResponse(entry, record);
212
+ }
213
+ }
214
+ this.metricsRecorder?.(record);
215
+ if (entry) {
216
+ this.releaseIfComplete(entry);
217
+ }
218
+ } catch (error) {
219
+ (0, import_logger.logWarning)(`Error in the Apitally span processor: ${String(error)}`);
220
+ }
221
+ }
222
+ // Holds captured headers and bodies until the exporter attaches them to the
223
+ // exported SERVER span copy. Fields already stashed are kept unless replaced.
224
+ updateStash(serverSpanId, update) {
225
+ try {
226
+ if (!this.requests.has(serverSpanId)) {
227
+ return;
228
+ }
229
+ let entry = this.stash.get(serverSpanId);
230
+ if (!entry) {
231
+ if (this.stash.size >= MAX_STASHED_REQUESTS) {
232
+ const oldestKey = this.stash.keys().next().value;
233
+ if (oldestKey !== void 0) {
234
+ this.stash.delete(oldestKey);
235
+ (0, import_logger.logDebug)("Apitally payload stash cap reached, dropping the oldest entry");
236
+ }
237
+ }
238
+ entry = {};
239
+ this.stash.set(serverSpanId, entry);
240
+ }
241
+ if (update.requestHeaders !== void 0) {
242
+ entry.requestHeaders = update.requestHeaders;
243
+ }
244
+ if (update.requestBody !== void 0) {
245
+ entry.requestBody = update.requestBody;
246
+ }
247
+ if (update.responseHeaders !== void 0) {
248
+ entry.responseHeaders = update.responseHeaders;
249
+ }
250
+ if (update.responseBody !== void 0) {
251
+ entry.responseBody = update.responseBody;
252
+ }
253
+ } catch (error) {
254
+ (0, import_logger.logDebug)(`Error updating the request stash: ${String(error)}`);
255
+ }
256
+ }
257
+ // Kept requests remain resolvable after release so late logs retain their
258
+ // request association.
259
+ resolveServerSpanId(spanId) {
260
+ return this.requests.get(spanId)?.serverSpanId ?? this.keptSpanIds.get(spanId)?.serverSpanId;
261
+ }
262
+ isRequestInFlight(serverSpanId) {
263
+ return this.requests.has(serverSpanId);
264
+ }
265
+ // Exclusion answers "never wanted" and runs strictly before sampling; an
266
+ // excluded request never invokes a user sampling callback.
267
+ resolveRequestDropReasonBeforeSampling(attributes) {
268
+ const transportDropReason = resolveTransportDropReason(attributes);
269
+ if (transportDropReason !== void 0) {
270
+ return transportDropReason;
271
+ }
272
+ const path = attributes["url.path"] ?? attributes["http.target"];
273
+ if (typeof path === "string" && (0, import_config.matchesAny)(this.excludePathPatterns, path.split("?")[0])) {
274
+ return "excluded";
275
+ }
276
+ const userAgent = attributes["user_agent.original"] ?? attributes["http.user_agent"];
277
+ if (typeof userAgent === "string" && (0, import_config.matchesAny)(EXCLUDE_USER_AGENT_PATTERNS, userAgent)) {
278
+ return "excluded";
279
+ }
280
+ return void 0;
281
+ }
282
+ forceFlush() {
283
+ return this.downstream.forceFlush();
284
+ }
285
+ // Shutdown releases requests with completed transport observation once and
286
+ // discards incomplete requests, which cannot complete afterward.
287
+ async shutdown() {
288
+ try {
289
+ for (const entry of new Set(this.requests.values())) {
290
+ if (!entry.released && entry.transportCompleted) {
291
+ this.releaseRequest(entry, entry.endedServerSpan ?? entry.serverSpan);
292
+ }
293
+ }
294
+ this.requests.clear();
295
+ this.stash.clear();
296
+ this.demotedSpanIds.clear();
297
+ this.keptSpanIds.clear();
298
+ } catch (error) {
299
+ (0, import_logger.logWarning)(`Error in the Apitally span processor: ${String(error)}`);
300
+ }
301
+ await this.downstream.shutdown();
302
+ }
303
+ startRequest(span, parentContext) {
304
+ const spanId = span.spanContext().spanId;
305
+ const handle = parentContext.getValue(import_context.SPAN_HANDLE_KEY);
306
+ if (handle) {
307
+ handle.span = span;
308
+ }
309
+ const record = parentContext.getValue(import_context.REQUEST_RECORD_KEY);
310
+ if (record) {
311
+ record.serverSpanId = spanId;
312
+ }
313
+ (0, import_consumer.writeConsumerAttributesFromContext)(parentContext, span, record);
314
+ writeUrlAttributesFromFullUrl(span);
315
+ const dropReason = this.resolveRequestDropReasonBeforeSampling(span.attributes) ?? (this.isRequestSampledIn(span) ? void 0 : "sampled-out");
316
+ if (dropReason) {
317
+ if (record) {
318
+ record.dropReason = dropReason;
319
+ }
320
+ return;
321
+ }
322
+ this.requests.set(spanId, {
323
+ serverSpanId: spanId,
324
+ serverSpan: span,
325
+ spanIds: /* @__PURE__ */ new Set([spanId]),
326
+ record,
327
+ buffered: [],
328
+ transportCompleted: false,
329
+ released: false
330
+ });
331
+ }
332
+ isRequestSampledIn(span) {
333
+ const callback = this.config.sampleOnRequest;
334
+ const rate = callback ? resolveCallbackSampleRate(callback, span, "sampleOnRequest") : void 0;
335
+ const bound = rate === void 0 ? this.sampleRateBound : boundForSampleRate(rate);
336
+ return isTraceSampledIn(span.spanContext().traceId, bound);
337
+ }
338
+ // Abstention leaves the request-stage decision standing; it never re-tests the
339
+ // static sample rate.
340
+ isResponseSampledIn(entry) {
341
+ const callback = this.config.sampleOnResponse;
342
+ if (!callback) {
343
+ return true;
344
+ }
345
+ const serverSpan = entry.endedServerSpan ?? entry.serverSpan;
346
+ let snapshot = serverSpan;
347
+ if (entry.record && Object.keys(entry.record.attributes).length > 0) {
348
+ const copy = copySpan(serverSpan);
349
+ copy.attributes = {
350
+ ...serverSpan.attributes,
351
+ ...entry.record.attributes
352
+ };
353
+ snapshot = copy;
354
+ }
355
+ const rate = resolveCallbackSampleRate(callback, snapshot, "sampleOnResponse");
356
+ if (rate === void 0) {
357
+ return true;
358
+ }
359
+ return isTraceSampledIn(serverSpan.spanContext().traceId, boundForSampleRate(rate));
360
+ }
361
+ dropRequestOnResponse(entry, record) {
362
+ entry.released = true;
363
+ entry.buffered = [];
364
+ record.dropReason = "sampled-out";
365
+ if (entry.record) {
366
+ entry.record.dropReason = "sampled-out";
367
+ }
368
+ this.removeCompletedRequestSpanIds(entry);
369
+ this.stash.delete(entry.serverSpanId);
370
+ this.onRequestFinished?.(entry.serverSpanId, false);
371
+ }
372
+ releaseIfComplete(entry) {
373
+ if (entry.released || !entry.transportCompleted || !entry.endedServerSpan) {
374
+ return;
375
+ }
376
+ this.releaseRequest(entry, entry.endedServerSpan);
377
+ }
378
+ // Descendants, the SERVER span, and logs enter downstream processing once, in
379
+ // that order. The exporter applies the request record and stash later.
380
+ releaseRequest(entry, serverSpan) {
381
+ entry.released = true;
382
+ for (const spanId of entry.spanIds) {
383
+ this.requests.delete(spanId);
384
+ this.addKeptSpanId(spanId, {
385
+ serverSpanId: entry.serverSpanId,
386
+ demoted: this.demotedSpanIds.delete(spanId)
387
+ });
388
+ }
389
+ for (const bufferedSpan of entry.buffered) {
390
+ this.downstream.onEnd(bufferedSpan);
391
+ }
392
+ entry.buffered = [];
393
+ const stash = this.stash.get(entry.serverSpanId);
394
+ this.stash.delete(entry.serverSpanId);
395
+ let exportSpan = serverSpan;
396
+ if (entry.record || stash || !serverSpan.ended) {
397
+ const copy = copySpan(serverSpan);
398
+ if (!serverSpan.ended) {
399
+ copy.endTime = (0, import_core.hrTime)();
400
+ copy.duration = (0, import_core.hrTimeDuration)(copy.startTime, copy.endTime);
401
+ copy.ended = true;
402
+ }
403
+ copy.apitallyData = { record: entry.record, stash };
404
+ exportSpan = copy;
405
+ }
406
+ this.downstream.onEnd(exportSpan);
407
+ this.onRequestFinished?.(entry.serverSpanId, true);
408
+ }
409
+ removeCompletedRequestSpanIds(entry) {
410
+ for (const spanId of entry.spanIds) {
411
+ this.requests.delete(spanId);
412
+ this.demotedSpanIds.delete(spanId);
413
+ }
414
+ }
415
+ addKeptSpanId(spanId, kept) {
416
+ if (this.keptSpanIds.size >= MAX_KEPT_SPAN_IDS) {
417
+ const oldestId = this.keptSpanIds.keys().next().value;
418
+ if (oldestId !== void 0) {
419
+ this.keptSpanIds.delete(oldestId);
420
+ }
421
+ }
422
+ this.keptSpanIds.set(spanId, kept);
423
+ }
424
+ }
425
+ function copySpan(span) {
426
+ const spanContext = span.spanContext();
427
+ return {
428
+ name: span.name,
429
+ kind: span.kind,
430
+ spanContext: () => spanContext,
431
+ parentSpanContext: span.parentSpanContext,
432
+ startTime: span.startTime,
433
+ endTime: span.endTime,
434
+ status: span.status,
435
+ attributes: span.attributes,
436
+ links: span.links,
437
+ events: span.events,
438
+ duration: span.duration,
439
+ ended: span.ended,
440
+ resource: span.resource,
441
+ instrumentationScope: span.instrumentationScope,
442
+ droppedAttributesCount: span.droppedAttributesCount,
443
+ droppedEventsCount: span.droppedEventsCount,
444
+ droppedLinksCount: span.droppedLinksCount
445
+ };
446
+ }
447
+ function resolveTransportDropReason(attributes) {
448
+ const method = attributes["http.request.method"] ?? attributes["http.method"];
449
+ if (method === "OPTIONS") {
450
+ return "method";
451
+ }
452
+ const scheme = attributes["url.scheme"] ?? attributes["http.scheme"];
453
+ return scheme === "ws" || scheme === "wss" ? "scheme" : void 0;
454
+ }
455
+ function writeUrlAttributesFromFullUrl(span) {
456
+ const attributes = span.attributes;
457
+ if (attributes["url.path"] !== void 0 || attributes["http.target"] !== void 0) {
458
+ return;
459
+ }
460
+ const url = attributes["url.full"] ?? attributes["http.url"];
461
+ if (typeof url !== "string") {
462
+ return;
463
+ }
464
+ let parsed;
465
+ try {
466
+ parsed = new URL(url);
467
+ } catch {
468
+ return;
469
+ }
470
+ const query = parsed.search.replace(/^\?/, "");
471
+ span.setAttribute("url.path", parsed.pathname);
472
+ if (query) {
473
+ span.setAttribute("url.query", query);
474
+ }
475
+ span.setAttribute("http.target", query ? `${parsed.pathname}?${query}` : parsed.pathname);
476
+ }
477
+ const TRACE_ID_LOW_64_BITS_MASK = (1n << 64n) - 1n;
478
+ function boundForSampleRate(rate) {
479
+ return BigInt(Math.round(rate * 2 ** 64));
480
+ }
481
+ function isTraceSampledIn(traceId, bound) {
482
+ return (BigInt(`0x${traceId}`) & TRACE_ID_LOW_64_BITS_MASK) < bound;
483
+ }
484
+ function resolveCallbackSampleRate(callback, span, optionName) {
485
+ let result;
486
+ try {
487
+ result = callback(span);
488
+ } catch {
489
+ (0, import_logger.logWarning)(`The Apitally ${optionName} callback threw an error, so the request was captured`);
490
+ return 1;
491
+ }
492
+ if (result === void 0 || result === null) {
493
+ return void 0;
494
+ }
495
+ if (typeof result === "boolean") {
496
+ return result ? 1 : 0;
497
+ }
498
+ if (typeof result === "number" && result >= 0 && result <= 1) {
499
+ return result;
500
+ }
501
+ (0, import_logger.logWarning)(
502
+ `The Apitally ${optionName} callback returned an invalid value, so the request was captured. Sampling callbacks must synchronously return a number between 0 and 1, a boolean, or undefined.`
503
+ );
504
+ return 1;
505
+ }
506
+ function isContribPerMessageSpan(span) {
507
+ const scopeName = span.instrumentationScope?.name ?? "";
508
+ return span.kind === import_api.SpanKind.INTERNAL && [" http send", " http receive", " websocket send", " websocket receive"].some(
509
+ (suffix) => span.name.endsWith(suffix)
510
+ ) && (scopeName.startsWith("@opentelemetry/instrumentation") || scopeName.startsWith("opentelemetry.instrumentation."));
511
+ }
512
+ // Annotate the CommonJS export names for ESM import in node:
513
+ 0 && (module.exports = {
514
+ ApitallySpanProcessor,
515
+ SpanPipeline,
516
+ copySpan,
517
+ getActiveSpanPipeline,
518
+ isApitallySpanProcessorDeclared,
519
+ resetSpanProcessorState,
520
+ setActiveSpanPipeline,
521
+ setServerSpanActivationCallback
522
+ });
523
+ //# sourceMappingURL=spanProcessor.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/spanProcessor.ts"],"sourcesContent":["import { type Attributes, type Context, SpanKind } from \"@opentelemetry/api\";\nimport { hrTime, hrTimeDuration } from \"@opentelemetry/core\";\nimport type { ReadableSpan, Span, SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport {\n type ApitallyConfig,\n compilePatterns,\n DEFAULT_EXCLUDE_PATHS,\n EXCLUDE_USER_AGENTS,\n getConfig,\n matchesAny,\n type SamplingCallback,\n} from \"./config.js\";\nimport { writeConsumerAttributesFromContext } from \"./consumer.js\";\nimport {\n REQUEST_RECORD_KEY,\n type RequestDropReason,\n type RequestRecord,\n SPAN_HANDLE_KEY,\n type SpanHandle,\n} from \"./context.js\";\nimport { logDebug, logWarning } from \"./logger.js\";\n\nconst MAX_BUFFERED_SPANS = 1_000;\nconst MAX_TRACKED_SPAN_IDS = MAX_BUFFERED_SPANS + 1;\nconst MAX_STASHED_REQUESTS = 2_048;\nconst MAX_KEPT_SPAN_IDS = 10_000;\nconst EXCLUDE_USER_AGENT_PATTERNS = compilePatterns(EXCLUDE_USER_AGENTS);\n\n// Transport-captured headers and bodies are attached only to Apitally's export\n// copy.\nexport interface RequestStash {\n requestHeaders?: Record<string, string | string[]>;\n requestBody?: Buffer;\n responseHeaders?: Record<string, string | string[]>;\n responseBody?: Buffer;\n}\n\nexport interface ApitallySpanData {\n record?: RequestRecord;\n stash?: RequestStash;\n demoteToInternal?: boolean;\n}\n\n// Mutable ReadableSpan-shaped copy on Apitally's private export path; the span\n// handed to user-attached processors is never mutated.\nexport type SpanCopy = {\n -readonly [Key in keyof ReadableSpan]: ReadableSpan[Key];\n} & { apitallyData?: ApitallySpanData };\n\n// The public processor delegates to the process-global pipeline. Construction\n// only declares that the application owns the tracer provider.\nexport class ApitallySpanProcessor implements SpanProcessor {\n constructor() {\n setApitallySpanProcessorDeclared();\n }\n\n onStart(span: Span, parentContext: Context): void {\n let pipeline = getActiveSpanPipeline();\n if (!pipeline && span.kind === SpanKind.SERVER) {\n getServerSpanActivationCallback()?.(span);\n pipeline = getActiveSpanPipeline();\n }\n pipeline?.onStart(span, parentContext);\n }\n\n onEnd(span: ReadableSpan): void {\n getActiveSpanPipeline()?.onEnd(span);\n }\n\n // Flush failures resolve instead of rejecting into the user's provider.\n forceFlush(): Promise<void> {\n const pipeline = getActiveSpanPipeline();\n if (!pipeline) {\n return Promise.resolve();\n }\n return pipeline.forceFlush().catch((error: unknown) => {\n logDebug(`Error flushing spans: ${String(error)}`);\n });\n }\n\n // A user provider's shutdown only flushes released requests; SDK shutdown owns\n // teardown.\n shutdown(): Promise<void> {\n return this.forceFlush();\n }\n}\n\ntype ServerSpanActivationCallback = (span: Span) => void;\n\n// Symbol.for keys let ESM and CJS builds share processor coordination.\nconst ACTIVE_SPAN_PIPELINE_KEY = Symbol.for(\"apitally.activeSpanPipeline\");\nconst APITALLY_SPAN_PROCESSOR_DECLARED_KEY = Symbol.for(\"apitally.spanProcessorDeclared\");\nconst SERVER_SPAN_ACTIVATION_CALLBACK_KEY = Symbol.for(\"apitally.serverSpanActivationCallback\");\n\nexport function setActiveSpanPipeline(pipeline: SpanPipeline | undefined): void {\n (globalThis as Record<symbol, SpanPipeline | undefined>)[ACTIVE_SPAN_PIPELINE_KEY] = pipeline;\n}\n\nexport function getActiveSpanPipeline(): SpanPipeline | undefined {\n return (globalThis as Record<symbol, SpanPipeline | undefined>)[ACTIVE_SPAN_PIPELINE_KEY];\n}\n\nexport function setServerSpanActivationCallback(callback: ServerSpanActivationCallback): void {\n const holder = globalThis as Record<symbol, ServerSpanActivationCallback | undefined>;\n holder[SERVER_SPAN_ACTIVATION_CALLBACK_KEY] ??= callback;\n}\n\nexport function isApitallySpanProcessorDeclared(): boolean {\n return (\n (globalThis as Record<symbol, boolean | undefined>)[APITALLY_SPAN_PROCESSOR_DECLARED_KEY] ===\n true\n );\n}\n\nexport function resetSpanProcessorState(): void {\n const holder = globalThis as Record<symbol, unknown>;\n delete holder[ACTIVE_SPAN_PIPELINE_KEY];\n delete holder[APITALLY_SPAN_PROCESSOR_DECLARED_KEY];\n delete holder[SERVER_SPAN_ACTIVATION_CALLBACK_KEY];\n}\n\nfunction setApitallySpanProcessorDeclared(): void {\n (globalThis as Record<symbol, boolean>)[APITALLY_SPAN_PROCESSOR_DECLARED_KEY] = true;\n}\n\nfunction getServerSpanActivationCallback(): ServerSpanActivationCallback | undefined {\n return (globalThis as Record<symbol, ServerSpanActivationCallback | undefined>)[\n SERVER_SPAN_ACTIVATION_CALLBACK_KEY\n ];\n}\n\ninterface RequestEntry {\n readonly serverSpanId: string;\n readonly serverSpan: Span;\n readonly spanIds: Set<string>;\n record?: RequestRecord;\n buffered: ReadableSpan[];\n endedServerSpan?: ReadableSpan;\n transportCompleted: boolean;\n released: boolean;\n}\n\ninterface KeptSpanEntry {\n readonly serverSpanId: string;\n // Carries the demotion decision across release for spans that end late.\n readonly demoted: boolean;\n}\n\n// Requests remain buffered until the SERVER span and transport complete, then\n// one keep/drop decision releases them once.\nexport class SpanPipeline implements SpanProcessor {\n // Callbacks are optional because metrics and log pipelines start at activation.\n metricsRecorder?: (record: RequestRecord) => void;\n onRequestFinished?: (serverSpanId: string, kept: boolean) => void;\n private readonly downstream: SpanProcessor;\n private readonly config: ApitallyConfig;\n private readonly sampleRateBound: bigint;\n private readonly excludePathPatterns: RegExp[];\n // Every span ID remains mapped to one request until completion so late logs\n // resolve. A miss means dropped, completed, or non-request telemetry.\n private readonly requests = new Map<string, RequestEntry>();\n private readonly stash = new Map<string, RequestStash>();\n private readonly demotedSpanIds = new Set<string>();\n // Kept span IDs remain resolvable after release for late spans and logs; the\n // oldest are evicted at the cap.\n private readonly keptSpanIds = new Map<string, KeptSpanEntry>();\n\n constructor(downstream: SpanProcessor) {\n this.downstream = downstream;\n this.config = getConfig();\n this.sampleRateBound = boundForSampleRate(this.config.sampleRate);\n this.excludePathPatterns = compilePatterns(DEFAULT_EXCLUDE_PATHS, this.config.excludePaths);\n }\n\n onStart(span: Span, parentContext: Context): void {\n try {\n if (isContribPerMessageSpan(span)) {\n return;\n }\n const parent = span.parentSpanContext;\n if (!parent || parent.isRemote) {\n if (span.kind === SpanKind.SERVER) {\n this.startRequest(span, parentContext);\n }\n return;\n }\n const entry = this.requests.get(parent.spanId);\n const spanId = span.spanContext().spanId;\n if (!entry) {\n // A span started under a request already released as kept exports at\n // its end, like the released request's other late telemetry.\n const kept = this.keptSpanIds.get(parent.spanId);\n if (kept) {\n this.addKeptSpanId(spanId, {\n serverSpanId: kept.serverSpanId,\n demoted: false,\n });\n }\n return;\n }\n if (entry.spanIds.size >= MAX_TRACKED_SPAN_IDS) {\n logDebug(\"Apitally span tracking cap reached, dropping the span\");\n return;\n }\n if (span.kind === SpanKind.SERVER) {\n // A second middleware produced a SERVER span for this request. Apitally\n // demotes its copy, but user exporters retain the duplicate.\n this.demotedSpanIds.add(spanId);\n logWarning(\n `Detected a duplicate SERVER span produced by the instrumentation scope \"${span.instrumentationScope?.name ?? \"unknown\"}\" inside an active request. Apitally exports it as an INTERNAL span, but your own OpenTelemetry exporters still receive the duplicate. To resolve this, remove the middleware that produces it.`,\n );\n }\n this.requests.set(spanId, entry);\n entry.spanIds.add(spanId);\n } catch (error) {\n logWarning(`Error in the Apitally span processor: ${String(error)}`);\n }\n }\n\n onEnd(span: ReadableSpan): void {\n try {\n const spanId = span.spanContext().spanId;\n const isDemoted = this.demotedSpanIds.delete(spanId);\n const entry = this.requests.get(spanId);\n if (!entry) {\n const kept = this.keptSpanIds.get(spanId);\n if (kept) {\n let exportSpan = span;\n if (kept.demoted) {\n const copy = copySpan(span);\n copy.apitallyData = { demoteToInternal: true };\n exportSpan = copy;\n }\n this.downstream.onEnd(exportSpan);\n }\n return;\n }\n if (spanId === entry.serverSpanId) {\n entry.endedServerSpan = span;\n this.releaseIfComplete(entry);\n return;\n }\n // The span id stays mapped so log records emitted after this span ended\n // still resolve to the request until it completes.\n let exportSpan = span;\n if (isDemoted) {\n const copy = copySpan(span);\n copy.apitallyData = { demoteToInternal: true };\n exportSpan = copy;\n }\n if (entry.buffered.length < MAX_BUFFERED_SPANS) {\n entry.buffered.push(exportSpan);\n } else {\n logDebug(\"Apitally span buffer cap reached, dropping the span\");\n }\n } catch (error) {\n logWarning(`Error in the Apitally span processor: ${String(error)}`);\n }\n }\n\n // Transport completion triggers response sampling and metrics independently\n // of span-end timing. Map misses still record metrics and discard other data.\n handleTransportCompletion(record: RequestRecord): void {\n try {\n record.dropReason = resolveTransportDropReason(record.attributes) ?? record.dropReason;\n const entry =\n record.serverSpanId !== undefined ? this.requests.get(record.serverSpanId) : undefined;\n if (entry && !entry.transportCompleted && !entry.released) {\n // The user-produced SERVER span started before the request record existed;\n // attaching the record here carries transport attributes to the export copy.\n entry.record ??= record;\n entry.transportCompleted = true;\n if (!this.isResponseSampledIn(entry)) {\n this.dropRequestOnResponse(entry, record);\n }\n }\n this.metricsRecorder?.(record);\n if (entry) {\n this.releaseIfComplete(entry);\n }\n } catch (error) {\n logWarning(`Error in the Apitally span processor: ${String(error)}`);\n }\n }\n\n // Holds captured headers and bodies until the exporter attaches them to the\n // exported SERVER span copy. Fields already stashed are kept unless replaced.\n updateStash(serverSpanId: string, update: RequestStash): void {\n try {\n // A request without an in-flight map entry can never release, so its\n // stash entry would sit unconsumed until the cap evicts it.\n if (!this.requests.has(serverSpanId)) {\n return;\n }\n let entry = this.stash.get(serverSpanId);\n if (!entry) {\n if (this.stash.size >= MAX_STASHED_REQUESTS) {\n const oldestKey = this.stash.keys().next().value;\n if (oldestKey !== undefined) {\n this.stash.delete(oldestKey);\n logDebug(\"Apitally payload stash cap reached, dropping the oldest entry\");\n }\n }\n entry = {};\n this.stash.set(serverSpanId, entry);\n }\n if (update.requestHeaders !== undefined) {\n entry.requestHeaders = update.requestHeaders;\n }\n if (update.requestBody !== undefined) {\n entry.requestBody = update.requestBody;\n }\n if (update.responseHeaders !== undefined) {\n entry.responseHeaders = update.responseHeaders;\n }\n if (update.responseBody !== undefined) {\n entry.responseBody = update.responseBody;\n }\n } catch (error) {\n logDebug(`Error updating the request stash: ${String(error)}`);\n }\n }\n\n // Kept requests remain resolvable after release so late logs retain their\n // request association.\n resolveServerSpanId(spanId: string): string | undefined {\n return this.requests.get(spanId)?.serverSpanId ?? this.keptSpanIds.get(spanId)?.serverSpanId;\n }\n\n isRequestInFlight(serverSpanId: string): boolean {\n return this.requests.has(serverSpanId);\n }\n\n // Exclusion answers \"never wanted\" and runs strictly before sampling; an\n // excluded request never invokes a user sampling callback.\n resolveRequestDropReasonBeforeSampling(attributes: Attributes): RequestDropReason | undefined {\n const transportDropReason = resolveTransportDropReason(attributes);\n if (transportDropReason !== undefined) {\n return transportDropReason;\n }\n const path = attributes[\"url.path\"] ?? attributes[\"http.target\"];\n if (typeof path === \"string\" && matchesAny(this.excludePathPatterns, path.split(\"?\")[0])) {\n return \"excluded\";\n }\n const userAgent = attributes[\"user_agent.original\"] ?? attributes[\"http.user_agent\"];\n if (typeof userAgent === \"string\" && matchesAny(EXCLUDE_USER_AGENT_PATTERNS, userAgent)) {\n return \"excluded\";\n }\n return undefined;\n }\n\n forceFlush(): Promise<void> {\n return this.downstream.forceFlush();\n }\n\n // Shutdown releases requests with completed transport observation once and\n // discards incomplete requests, which cannot complete afterward.\n async shutdown(): Promise<void> {\n try {\n for (const entry of new Set(this.requests.values())) {\n if (!entry.released && entry.transportCompleted) {\n this.releaseRequest(entry, entry.endedServerSpan ?? entry.serverSpan);\n }\n }\n this.requests.clear();\n this.stash.clear();\n this.demotedSpanIds.clear();\n this.keptSpanIds.clear();\n } catch (error) {\n logWarning(`Error in the Apitally span processor: ${String(error)}`);\n }\n await this.downstream.shutdown();\n }\n\n private startRequest(span: Span, parentContext: Context): void {\n const spanId = span.spanContext().spanId;\n // The handle is filled for every local-root SERVER span, independent of the\n // keep decision, so runtime writes always reach the current request's span.\n const handle = parentContext.getValue(SPAN_HANDLE_KEY) as SpanHandle | undefined;\n if (handle) {\n handle.span = span;\n }\n const record = parentContext.getValue(REQUEST_RECORD_KEY) as RequestRecord | undefined;\n if (record) {\n record.serverSpanId = spanId;\n }\n writeConsumerAttributesFromContext(parentContext, span, record);\n writeUrlAttributesFromFullUrl(span);\n const dropReason =\n this.resolveRequestDropReasonBeforeSampling(span.attributes) ??\n (this.isRequestSampledIn(span) ? undefined : \"sampled-out\");\n if (dropReason) {\n if (record) {\n record.dropReason = dropReason;\n }\n return;\n }\n this.requests.set(spanId, {\n serverSpanId: spanId,\n serverSpan: span,\n spanIds: new Set([spanId]),\n record,\n buffered: [],\n transportCompleted: false,\n released: false,\n });\n }\n\n private isRequestSampledIn(span: Span): boolean {\n const callback = this.config.sampleOnRequest;\n const rate = callback\n ? resolveCallbackSampleRate(callback, span, \"sampleOnRequest\")\n : undefined;\n const bound = rate === undefined ? this.sampleRateBound : boundForSampleRate(rate);\n return isTraceSampledIn(span.spanContext().traceId, bound);\n }\n\n // Abstention leaves the request-stage decision standing; it never re-tests the\n // static sample rate.\n private isResponseSampledIn(entry: RequestEntry): boolean {\n const callback = this.config.sampleOnResponse;\n if (!callback) {\n return true;\n }\n const serverSpan = entry.endedServerSpan ?? entry.serverSpan;\n let snapshot: ReadableSpan = serverSpan;\n if (entry.record && Object.keys(entry.record.attributes).length > 0) {\n // The callback sees transport-observed values even when they were learned\n // after the span ended (final route, response size).\n const copy = copySpan(serverSpan);\n copy.attributes = {\n ...serverSpan.attributes,\n ...entry.record.attributes,\n };\n snapshot = copy;\n }\n const rate = resolveCallbackSampleRate(callback, snapshot, \"sampleOnResponse\");\n if (rate === undefined) {\n return true;\n }\n return isTraceSampledIn(serverSpan.spanContext().traceId, boundForSampleRate(rate));\n }\n\n private dropRequestOnResponse(entry: RequestEntry, record: RequestRecord): void {\n // Removing every span id sends the dropped request's late telemetry to the\n // lookup-miss rule, so it is discarded locally.\n entry.released = true;\n entry.buffered = [];\n record.dropReason = \"sampled-out\";\n if (entry.record) {\n entry.record.dropReason = \"sampled-out\";\n }\n this.removeCompletedRequestSpanIds(entry);\n this.stash.delete(entry.serverSpanId);\n this.onRequestFinished?.(entry.serverSpanId, false);\n }\n\n private releaseIfComplete(entry: RequestEntry): void {\n if (entry.released || !entry.transportCompleted || !entry.endedServerSpan) {\n return;\n }\n this.releaseRequest(entry, entry.endedServerSpan);\n }\n\n // Descendants, the SERVER span, and logs enter downstream processing once, in\n // that order. The exporter applies the request record and stash later.\n private releaseRequest(entry: RequestEntry, serverSpan: ReadableSpan): void {\n entry.released = true;\n for (const spanId of entry.spanIds) {\n this.requests.delete(spanId);\n this.addKeptSpanId(spanId, {\n serverSpanId: entry.serverSpanId,\n demoted: this.demotedSpanIds.delete(spanId),\n });\n }\n for (const bufferedSpan of entry.buffered) {\n this.downstream.onEnd(bufferedSpan);\n }\n entry.buffered = [];\n const stash = this.stash.get(entry.serverSpanId);\n this.stash.delete(entry.serverSpanId);\n let exportSpan = serverSpan;\n if (entry.record || stash || !serverSpan.ended) {\n const copy = copySpan(serverSpan);\n if (!serverSpan.ended) {\n // A SERVER span released during shutdown uses shutdown as its end time.\n copy.endTime = hrTime();\n copy.duration = hrTimeDuration(copy.startTime, copy.endTime);\n copy.ended = true;\n }\n copy.apitallyData = { record: entry.record, stash };\n exportSpan = copy;\n }\n this.downstream.onEnd(exportSpan);\n this.onRequestFinished?.(entry.serverSpanId, true);\n }\n\n private removeCompletedRequestSpanIds(entry: RequestEntry): void {\n for (const spanId of entry.spanIds) {\n this.requests.delete(spanId);\n this.demotedSpanIds.delete(spanId);\n }\n }\n\n private addKeptSpanId(spanId: string, kept: KeptSpanEntry): void {\n if (this.keptSpanIds.size >= MAX_KEPT_SPAN_IDS) {\n const oldestId = this.keptSpanIds.keys().next().value;\n if (oldestId !== undefined) {\n this.keptSpanIds.delete(oldestId);\n }\n }\n this.keptSpanIds.set(spanId, kept);\n }\n}\n\nexport function copySpan(span: ReadableSpan): SpanCopy {\n const spanContext = span.spanContext();\n return {\n name: span.name,\n kind: span.kind,\n spanContext: () => spanContext,\n parentSpanContext: span.parentSpanContext,\n startTime: span.startTime,\n endTime: span.endTime,\n status: span.status,\n attributes: span.attributes,\n links: span.links,\n events: span.events,\n duration: span.duration,\n ended: span.ended,\n resource: span.resource,\n instrumentationScope: span.instrumentationScope,\n droppedAttributesCount: span.droppedAttributesCount,\n droppedEventsCount: span.droppedEventsCount,\n droppedLinksCount: span.droppedLinksCount,\n };\n}\n\nfunction resolveTransportDropReason(attributes: Attributes): RequestDropReason | undefined {\n const method = attributes[\"http.request.method\"] ?? attributes[\"http.method\"];\n if (method === \"OPTIONS\") {\n return \"method\";\n }\n const scheme = attributes[\"url.scheme\"] ?? attributes[\"http.scheme\"];\n return scheme === \"ws\" || scheme === \"wss\" ? \"scheme\" : undefined;\n}\n\n// Missing path, query, and target attributes are derived from the full URL\n// because exclusion, display, and redaction require them.\nfunction writeUrlAttributesFromFullUrl(span: Span): void {\n const attributes = span.attributes;\n if (attributes[\"url.path\"] !== undefined || attributes[\"http.target\"] !== undefined) {\n return;\n }\n const url = attributes[\"url.full\"] ?? attributes[\"http.url\"];\n if (typeof url !== \"string\") {\n return;\n }\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return;\n }\n const query = parsed.search.replace(/^\\?/, \"\");\n span.setAttribute(\"url.path\", parsed.pathname);\n if (query) {\n span.setAttribute(\"url.query\", query);\n }\n span.setAttribute(\"http.target\", query ? `${parsed.pathname}?${query}` : parsed.pathname);\n}\n\nconst TRACE_ID_LOW_64_BITS_MASK = (1n << 64n) - 1n;\n\nfunction boundForSampleRate(rate: number): bigint {\n return BigInt(Math.round(rate * 2 ** 64));\n}\n\n// Low 64-bit ratio sampling is deterministic per trace. Comparing the same\n// value at both stages makes the lower rate decisive.\nfunction isTraceSampledIn(traceId: string, bound: bigint): boolean {\n return (BigInt(`0x${traceId}`) & TRACE_ID_LOW_64_BITS_MASK) < bound;\n}\n\n// A throwing or invalid-returning callback resolves to keep: a user bug must\n// never lose data without a warning. Undefined means the callback abstained.\nfunction resolveCallbackSampleRate(\n callback: SamplingCallback,\n span: ReadableSpan,\n optionName: string,\n): number | undefined {\n let result: unknown;\n try {\n result = callback(span);\n } catch {\n logWarning(`The Apitally ${optionName} callback threw an error, so the request was captured`);\n return 1;\n }\n if (result === undefined || result === null) {\n return undefined;\n }\n if (typeof result === \"boolean\") {\n return result ? 1 : 0;\n }\n if (typeof result === \"number\" && result >= 0 && result <= 1) {\n return result;\n }\n logWarning(\n `The Apitally ${optionName} callback returned an invalid value, so the request was captured. Sampling callbacks must synchronously return a number between 0 and 1, a boolean, or undefined.`,\n );\n return 1;\n}\n\nfunction isContribPerMessageSpan(span: Span): boolean {\n const scopeName = span.instrumentationScope?.name ?? \"\";\n return (\n span.kind === SpanKind.INTERNAL &&\n [\" http send\", \" http receive\", \" websocket send\", \" websocket receive\"].some((suffix) =>\n span.name.endsWith(suffix),\n ) &&\n (scopeName.startsWith(\"@opentelemetry/instrumentation\") ||\n scopeName.startsWith(\"opentelemetry.instrumentation.\"))\n );\n}\n"],"mappings":"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","names":["exportSpan"]}
@@ -0,0 +1,67 @@
1
+ import { Context, Attributes } from '@opentelemetry/api';
2
+ import { SpanProcessor, Span, ReadableSpan } from '@opentelemetry/sdk-trace-base';
3
+ import { RequestRecord, RequestDropReason } from './context.cjs';
4
+ import '@opentelemetry/core';
5
+
6
+ interface RequestStash {
7
+ requestHeaders?: Record<string, string | string[]>;
8
+ requestBody?: Buffer;
9
+ responseHeaders?: Record<string, string | string[]>;
10
+ responseBody?: Buffer;
11
+ }
12
+ interface ApitallySpanData {
13
+ record?: RequestRecord;
14
+ stash?: RequestStash;
15
+ demoteToInternal?: boolean;
16
+ }
17
+ type SpanCopy = {
18
+ -readonly [Key in keyof ReadableSpan]: ReadableSpan[Key];
19
+ } & {
20
+ apitallyData?: ApitallySpanData;
21
+ };
22
+ declare class ApitallySpanProcessor implements SpanProcessor {
23
+ constructor();
24
+ onStart(span: Span, parentContext: Context): void;
25
+ onEnd(span: ReadableSpan): void;
26
+ forceFlush(): Promise<void>;
27
+ shutdown(): Promise<void>;
28
+ }
29
+ type ServerSpanActivationCallback = (span: Span) => void;
30
+ declare function setActiveSpanPipeline(pipeline: SpanPipeline | undefined): void;
31
+ declare function getActiveSpanPipeline(): SpanPipeline | undefined;
32
+ declare function setServerSpanActivationCallback(callback: ServerSpanActivationCallback): void;
33
+ declare function isApitallySpanProcessorDeclared(): boolean;
34
+ declare function resetSpanProcessorState(): void;
35
+ declare class SpanPipeline implements SpanProcessor {
36
+ metricsRecorder?: (record: RequestRecord) => void;
37
+ onRequestFinished?: (serverSpanId: string, kept: boolean) => void;
38
+ private readonly downstream;
39
+ private readonly config;
40
+ private readonly sampleRateBound;
41
+ private readonly excludePathPatterns;
42
+ private readonly requests;
43
+ private readonly stash;
44
+ private readonly demotedSpanIds;
45
+ private readonly keptSpanIds;
46
+ constructor(downstream: SpanProcessor);
47
+ onStart(span: Span, parentContext: Context): void;
48
+ onEnd(span: ReadableSpan): void;
49
+ handleTransportCompletion(record: RequestRecord): void;
50
+ updateStash(serverSpanId: string, update: RequestStash): void;
51
+ resolveServerSpanId(spanId: string): string | undefined;
52
+ isRequestInFlight(serverSpanId: string): boolean;
53
+ resolveRequestDropReasonBeforeSampling(attributes: Attributes): RequestDropReason | undefined;
54
+ forceFlush(): Promise<void>;
55
+ shutdown(): Promise<void>;
56
+ private startRequest;
57
+ private isRequestSampledIn;
58
+ private isResponseSampledIn;
59
+ private dropRequestOnResponse;
60
+ private releaseIfComplete;
61
+ private releaseRequest;
62
+ private removeCompletedRequestSpanIds;
63
+ private addKeptSpanId;
64
+ }
65
+ declare function copySpan(span: ReadableSpan): SpanCopy;
66
+
67
+ export { type ApitallySpanData, ApitallySpanProcessor, type RequestStash, type SpanCopy, SpanPipeline, copySpan, getActiveSpanPipeline, isApitallySpanProcessorDeclared, resetSpanProcessorState, setActiveSpanPipeline, setServerSpanActivationCallback };