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.
- package/README.md +191 -184
- package/dist/activation.cjs +371 -0
- package/dist/activation.cjs.map +1 -0
- package/dist/activation.d.cts +41 -0
- package/dist/activation.d.ts +41 -0
- package/dist/activation.js +357 -0
- package/dist/activation.js.map +1 -0
- package/dist/adonisjs/configure.cjs +88 -31
- package/dist/adonisjs/configure.cjs.map +1 -1
- package/dist/adonisjs/configure.d.cts +0 -4
- package/dist/adonisjs/configure.d.ts +0 -4
- package/dist/adonisjs/configure.js +85 -30
- package/dist/adonisjs/configure.js.map +1 -1
- package/dist/adonisjs/index.cjs +4 -23
- package/dist/adonisjs/index.cjs.map +1 -1
- package/dist/adonisjs/index.d.cts +3 -15
- package/dist/adonisjs/index.d.ts +3 -15
- package/dist/adonisjs/index.js +3 -20
- package/dist/adonisjs/index.js.map +1 -1
- package/dist/adonisjs/middleware.cjs +43 -109
- package/dist/adonisjs/middleware.cjs.map +1 -1
- package/dist/adonisjs/middleware.d.cts +1 -16
- package/dist/adonisjs/middleware.d.ts +1 -16
- package/dist/adonisjs/middleware.js +43 -110
- package/dist/adonisjs/middleware.js.map +1 -1
- package/dist/adonisjs/provider.cjs +19 -87
- package/dist/adonisjs/provider.cjs.map +1 -1
- package/dist/adonisjs/provider.d.cts +0 -22
- package/dist/adonisjs/provider.d.ts +0 -22
- package/dist/adonisjs/provider.js +19 -88
- package/dist/adonisjs/provider.js.map +1 -1
- package/dist/adonisjs/stubs/config/apitally.stub +11 -15
- package/dist/bodyCapture.cjs +128 -0
- package/dist/bodyCapture.cjs.map +1 -0
- package/dist/bodyCapture.d.cts +31 -0
- package/dist/bodyCapture.d.ts +31 -0
- package/dist/bodyCapture.js +101 -0
- package/dist/bodyCapture.js.map +1 -0
- package/dist/config.cjs +209 -0
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.cts +42 -0
- package/dist/config.d.ts +42 -0
- package/dist/config.js +174 -0
- package/dist/config.js.map +1 -0
- package/dist/consumer.cjs +98 -0
- package/dist/consumer.cjs.map +1 -0
- package/dist/consumer.d.cts +13 -0
- package/dist/consumer.d.ts +13 -0
- package/dist/consumer.js +78 -0
- package/dist/consumer.js.map +1 -0
- package/dist/context.cjs +68 -0
- package/dist/context.cjs.map +1 -0
- package/dist/context.d.cts +29 -0
- package/dist/context.d.ts +29 -0
- package/dist/context.js +40 -0
- package/dist/context.js.map +1 -0
- package/dist/elysia/index.cjs +12 -13
- package/dist/elysia/index.cjs.map +1 -1
- package/dist/elysia/index.d.cts +7 -16
- package/dist/elysia/index.d.ts +7 -16
- package/dist/elysia/index.js +10 -2
- package/dist/elysia/index.js.map +1 -1
- package/dist/elysia/middleware.cjs +248 -0
- package/dist/elysia/middleware.cjs.map +1 -0
- package/dist/elysia/middleware.d.cts +13 -0
- package/dist/elysia/middleware.d.ts +13 -0
- package/dist/elysia/middleware.js +237 -0
- package/dist/elysia/middleware.js.map +1 -0
- package/dist/{loggers/index.cjs → elysia/routes.cjs} +16 -19
- package/dist/elysia/routes.cjs.map +1 -0
- package/dist/elysia/routes.d.cts +7 -0
- package/dist/elysia/routes.d.ts +7 -0
- package/dist/elysia/routes.js +14 -0
- package/dist/elysia/routes.js.map +1 -0
- package/dist/exceptions.cjs +75 -0
- package/dist/exceptions.cjs.map +1 -0
- package/dist/exceptions.d.cts +7 -0
- package/dist/exceptions.d.ts +7 -0
- package/dist/exceptions.js +49 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/exportSerialization.cjs +56 -0
- package/dist/exportSerialization.cjs.map +1 -0
- package/dist/exportSerialization.d.cts +7 -0
- package/dist/exportSerialization.d.ts +7 -0
- package/dist/exportSerialization.js +32 -0
- package/dist/exportSerialization.js.map +1 -0
- package/dist/exportWorker.cjs +305 -0
- package/dist/exportWorker.cjs.map +1 -0
- package/dist/exportWorker.d.cts +46 -0
- package/dist/exportWorker.d.ts +46 -0
- package/dist/exportWorker.js +279 -0
- package/dist/exportWorker.js.map +1 -0
- package/dist/express/index.cjs +9 -4
- package/dist/express/index.cjs.map +1 -1
- package/dist/express/index.d.cts +6 -10
- package/dist/express/index.d.ts +6 -10
- package/dist/express/index.js +8 -2
- package/dist/express/index.js.map +1 -1
- package/dist/express/install.cjs +45 -0
- package/dist/express/install.cjs.map +1 -0
- package/dist/express/install.d.cts +9 -0
- package/dist/express/install.d.ts +9 -0
- package/dist/express/install.js +21 -0
- package/dist/express/install.js.map +1 -0
- package/dist/express/middleware.cjs +80 -331
- package/dist/express/middleware.cjs.map +1 -1
- package/dist/express/middleware.d.cts +3 -21
- package/dist/express/middleware.d.ts +3 -21
- package/dist/express/middleware.js +81 -328
- package/dist/express/middleware.js.map +1 -1
- package/dist/express/register.cjs +20 -0
- package/dist/express/register.cjs.map +1 -0
- package/dist/express/register.d.cts +2 -0
- package/dist/express/register.d.ts +2 -0
- package/dist/express/register.js +19 -0
- package/dist/express/register.js.map +1 -0
- package/dist/express/routes.cjs +419 -0
- package/dist/express/routes.cjs.map +1 -0
- package/dist/express/routes.d.cts +14 -0
- package/dist/express/routes.d.ts +14 -0
- package/dist/express/routes.js +391 -0
- package/dist/express/routes.js.map +1 -0
- package/dist/fastify/index.cjs +10 -15
- package/dist/fastify/index.cjs.map +1 -1
- package/dist/fastify/index.d.cts +6 -11
- package/dist/fastify/index.d.ts +6 -11
- package/dist/fastify/index.js +9 -3
- package/dist/fastify/index.js.map +1 -1
- package/dist/{common/logging.cjs → fastify/install.cjs} +15 -16
- package/dist/fastify/install.cjs.map +1 -0
- package/dist/fastify/install.d.cts +9 -0
- package/dist/fastify/install.d.ts +9 -0
- package/dist/fastify/install.js +15 -0
- package/dist/fastify/install.js.map +1 -0
- package/dist/fastify/middleware.cjs +118 -0
- package/dist/fastify/middleware.cjs.map +1 -0
- package/dist/fastify/middleware.d.cts +7 -0
- package/dist/fastify/middleware.d.ts +7 -0
- package/dist/fastify/middleware.js +97 -0
- package/dist/fastify/middleware.js.map +1 -0
- package/dist/{common/paramValidation.cjs → fastify/routes.cjs} +15 -17
- package/dist/fastify/routes.cjs.map +1 -0
- package/dist/fastify/routes.d.cts +8 -0
- package/dist/fastify/routes.d.ts +8 -0
- package/dist/fastify/routes.js +14 -0
- package/dist/fastify/routes.js.map +1 -0
- package/dist/h3/index.cjs +28 -4
- package/dist/h3/index.cjs.map +1 -1
- package/dist/h3/index.d.cts +7 -10
- package/dist/h3/index.d.ts +7 -10
- package/dist/h3/index.js +26 -2
- package/dist/h3/index.js.map +1 -1
- package/dist/h3/middleware.cjs +204 -0
- package/dist/h3/middleware.cjs.map +1 -0
- package/dist/h3/middleware.d.cts +5 -0
- package/dist/h3/middleware.d.ts +5 -0
- package/dist/h3/middleware.js +188 -0
- package/dist/h3/middleware.js.map +1 -0
- package/dist/h3/routes.cjs +66 -0
- package/dist/h3/routes.cjs.map +1 -0
- package/dist/h3/routes.d.cts +8 -0
- package/dist/h3/routes.d.ts +8 -0
- package/dist/h3/routes.js +41 -0
- package/dist/h3/routes.js.map +1 -0
- package/dist/hapi/index.cjs +15 -14
- package/dist/hapi/index.cjs.map +1 -1
- package/dist/hapi/index.d.cts +7 -10
- package/dist/hapi/index.d.ts +7 -10
- package/dist/hapi/index.js +14 -3
- package/dist/hapi/index.js.map +1 -1
- package/dist/{loggers/hapi.cjs → hapi/install.cjs} +20 -26
- package/dist/hapi/install.cjs.map +1 -0
- package/dist/hapi/install.d.cts +7 -0
- package/dist/hapi/install.d.ts +7 -0
- package/dist/hapi/install.js +22 -0
- package/dist/hapi/install.js.map +1 -0
- package/dist/hapi/middleware.cjs +158 -0
- package/dist/hapi/middleware.cjs.map +1 -0
- package/dist/hapi/middleware.d.cts +5 -0
- package/dist/hapi/middleware.d.ts +5 -0
- package/dist/hapi/middleware.js +137 -0
- package/dist/hapi/middleware.js.map +1 -0
- package/dist/hapi/routes.cjs +37 -0
- package/dist/hapi/routes.cjs.map +1 -0
- package/dist/hapi/routes.d.cts +8 -0
- package/dist/hapi/routes.d.ts +8 -0
- package/dist/hapi/routes.js +12 -0
- package/dist/hapi/routes.js.map +1 -0
- package/dist/hono/index.cjs +13 -3
- package/dist/hono/index.cjs.map +1 -1
- package/dist/hono/index.d.cts +6 -10
- package/dist/hono/index.d.ts +6 -10
- package/dist/hono/index.js +13 -2
- package/dist/hono/index.js.map +1 -1
- package/dist/hono/middleware.cjs +211 -127
- package/dist/hono/middleware.cjs.map +1 -1
- package/dist/hono/middleware.d.cts +3 -18
- package/dist/hono/middleware.d.ts +3 -18
- package/dist/hono/middleware.js +216 -125
- package/dist/hono/middleware.js.map +1 -1
- package/dist/hono/routes.cjs +74 -0
- package/dist/hono/routes.cjs.map +1 -0
- package/dist/hono/routes.d.cts +8 -0
- package/dist/hono/routes.d.ts +8 -0
- package/dist/hono/routes.js +49 -0
- package/dist/hono/routes.js.map +1 -0
- package/dist/index.cjs +108 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -1
- package/dist/index.d.ts +28 -1
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -1
- package/dist/koa/index.cjs +13 -3
- package/dist/koa/index.cjs.map +1 -1
- package/dist/koa/index.d.cts +6 -10
- package/dist/koa/index.d.ts +6 -10
- package/dist/koa/index.js +13 -2
- package/dist/koa/index.js.map +1 -1
- package/dist/koa/middleware.cjs +75 -184
- package/dist/koa/middleware.cjs.map +1 -1
- package/dist/koa/middleware.d.cts +3 -13
- package/dist/koa/middleware.d.ts +3 -13
- package/dist/koa/middleware.js +78 -183
- package/dist/koa/middleware.js.map +1 -1
- package/dist/koa/routes.cjs +71 -0
- package/dist/koa/routes.cjs.map +1 -0
- package/dist/koa/routes.d.cts +8 -0
- package/dist/koa/routes.d.ts +8 -0
- package/dist/koa/routes.js +46 -0
- package/dist/koa/routes.js.map +1 -0
- package/dist/logCapture.cjs +410 -0
- package/dist/logCapture.cjs.map +1 -0
- package/dist/logCapture.d.cts +16 -0
- package/dist/logCapture.d.ts +16 -0
- package/dist/logCapture.js +383 -0
- package/dist/logCapture.js.map +1 -0
- package/dist/logRecordExporter.cjs +83 -0
- package/dist/logRecordExporter.cjs.map +1 -0
- package/dist/logRecordExporter.d.cts +14 -0
- package/dist/logRecordExporter.d.ts +14 -0
- package/dist/logRecordExporter.js +59 -0
- package/dist/logRecordExporter.js.map +1 -0
- package/dist/logRecordProcessor.cjs +120 -0
- package/dist/logRecordProcessor.cjs.map +1 -0
- package/dist/logRecordProcessor.d.cts +23 -0
- package/dist/logRecordProcessor.d.ts +23 -0
- package/dist/logRecordProcessor.js +96 -0
- package/dist/logRecordProcessor.js.map +1 -0
- package/dist/{otel/index.cjs → logRecordTruncation.cjs} +10 -7
- package/dist/logRecordTruncation.cjs.map +1 -0
- package/dist/logRecordTruncation.d.cts +6 -0
- package/dist/logRecordTruncation.d.ts +6 -0
- package/dist/logRecordTruncation.js +8 -0
- package/dist/logRecordTruncation.js.map +1 -0
- package/dist/logger.cjs +62 -0
- package/dist/logger.cjs.map +1 -0
- package/dist/logger.d.cts +7 -0
- package/dist/logger.d.ts +7 -0
- package/dist/logger.js +34 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics.cjs +171 -0
- package/dist/metrics.cjs.map +1 -0
- package/dist/metrics.d.cts +24 -0
- package/dist/metrics.d.ts +24 -0
- package/dist/metrics.js +153 -0
- package/dist/metrics.js.map +1 -0
- package/dist/nestjs/index.cjs +61 -71
- package/dist/nestjs/index.cjs.map +1 -1
- package/dist/nestjs/index.d.cts +3 -11
- package/dist/nestjs/index.d.ts +3 -11
- package/dist/nestjs/index.js +61 -61
- package/dist/nestjs/index.js.map +1 -1
- package/dist/packageVersion.cjs +67 -0
- package/dist/packageVersion.cjs.map +1 -0
- package/dist/packageVersion.d.cts +5 -0
- package/dist/packageVersion.d.ts +5 -0
- package/dist/packageVersion.js +39 -0
- package/dist/packageVersion.js.map +1 -0
- package/dist/providers.cjs +149 -0
- package/dist/providers.cjs.map +1 -0
- package/dist/providers.d.cts +15 -0
- package/dist/providers.d.ts +15 -0
- package/dist/providers.js +136 -0
- package/dist/providers.js.map +1 -0
- package/dist/redaction.cjs +116 -0
- package/dist/redaction.cjs.map +1 -0
- package/dist/redaction.d.cts +17 -0
- package/dist/redaction.d.ts +17 -0
- package/dist/redaction.js +98 -0
- package/dist/redaction.js.map +1 -0
- package/dist/{common/packageVersions.cjs → requestAttributes.cjs} +21 -19
- package/dist/requestAttributes.cjs.map +1 -0
- package/dist/requestAttributes.d.cts +8 -0
- package/dist/requestAttributes.d.ts +8 -0
- package/dist/requestAttributes.js +22 -0
- package/dist/requestAttributes.js.map +1 -0
- package/dist/requestObservation.cjs +228 -0
- package/dist/requestObservation.cjs.map +1 -0
- package/dist/requestObservation.d.cts +60 -0
- package/dist/requestObservation.d.ts +60 -0
- package/dist/requestObservation.js +208 -0
- package/dist/requestObservation.js.map +1 -0
- package/dist/requestObservationNode.cjs +193 -0
- package/dist/requestObservationNode.cjs.map +1 -0
- package/dist/requestObservationNode.d.cts +29 -0
- package/dist/requestObservationNode.d.ts +29 -0
- package/dist/requestObservationNode.js +170 -0
- package/dist/requestObservationNode.js.map +1 -0
- package/dist/requestObservationWeb.cjs +202 -0
- package/dist/requestObservationWeb.cjs.map +1 -0
- package/dist/requestObservationWeb.d.cts +32 -0
- package/dist/requestObservationWeb.d.ts +32 -0
- package/dist/requestObservationWeb.js +182 -0
- package/dist/requestObservationWeb.js.map +1 -0
- package/dist/sentry.cjs +103 -0
- package/dist/sentry.cjs.map +1 -0
- package/dist/sentry.d.cts +3 -0
- package/dist/sentry.d.ts +3 -0
- package/dist/sentry.js +79 -0
- package/dist/sentry.js.map +1 -0
- package/dist/spanExporter.cjs +218 -0
- package/dist/spanExporter.cjs.map +1 -0
- package/dist/spanExporter.d.cts +33 -0
- package/dist/spanExporter.d.ts +33 -0
- package/dist/spanExporter.js +194 -0
- package/dist/spanExporter.js.map +1 -0
- package/dist/spanProcessor.cjs +523 -0
- package/dist/spanProcessor.cjs.map +1 -0
- package/dist/spanProcessor.d.cts +67 -0
- package/dist/spanProcessor.d.ts +67 -0
- package/dist/spanProcessor.js +501 -0
- package/dist/spanProcessor.js.map +1 -0
- package/dist/spool.cjs +314 -0
- package/dist/spool.cjs.map +1 -0
- package/dist/spool.d.cts +49 -0
- package/dist/spool.d.ts +49 -0
- package/dist/spool.js +297 -0
- package/dist/spool.js.map +1 -0
- package/dist/startup.cjs +93 -0
- package/dist/startup.cjs.map +1 -0
- package/dist/startup.d.cts +15 -0
- package/dist/startup.d.ts +15 -0
- package/dist/startup.js +68 -0
- package/dist/startup.js.map +1 -0
- package/dist/tracing.cjs +116 -0
- package/dist/tracing.cjs.map +1 -0
- package/dist/tracing.d.cts +5 -0
- package/dist/tracing.d.ts +5 -0
- package/dist/tracing.js +96 -0
- package/dist/tracing.js.map +1 -0
- package/package.json +113 -155
- package/dist/common/client.cjs +0 -335
- package/dist/common/client.cjs.map +0 -1
- package/dist/common/client.d.cts +0 -50
- package/dist/common/client.d.ts +0 -50
- package/dist/common/client.js +0 -302
- package/dist/common/client.js.map +0 -1
- package/dist/common/consumerRegistry.cjs +0 -84
- package/dist/common/consumerRegistry.cjs.map +0 -1
- package/dist/common/consumerRegistry.d.cts +0 -20
- package/dist/common/consumerRegistry.d.ts +0 -20
- package/dist/common/consumerRegistry.js +0 -61
- package/dist/common/consumerRegistry.js.map +0 -1
- package/dist/common/headers.cjs +0 -55
- package/dist/common/headers.cjs.map +0 -1
- package/dist/common/headers.d.cts +0 -6
- package/dist/common/headers.d.ts +0 -6
- package/dist/common/headers.js +0 -31
- package/dist/common/headers.js.map +0 -1
- package/dist/common/instance.cjs +0 -158
- package/dist/common/instance.cjs.map +0 -1
- package/dist/common/instance.d.cts +0 -4
- package/dist/common/instance.d.ts +0 -4
- package/dist/common/instance.js +0 -134
- package/dist/common/instance.js.map +0 -1
- package/dist/common/logging.cjs.map +0 -1
- package/dist/common/logging.d.cts +0 -11
- package/dist/common/logging.d.ts +0 -11
- package/dist/common/logging.js +0 -17
- package/dist/common/logging.js.map +0 -1
- package/dist/common/packageVersions.cjs.map +0 -1
- package/dist/common/packageVersions.d.cts +0 -3
- package/dist/common/packageVersions.d.ts +0 -3
- package/dist/common/packageVersions.js +0 -21
- package/dist/common/packageVersions.js.map +0 -1
- package/dist/common/paramValidation.cjs.map +0 -1
- package/dist/common/paramValidation.d.cts +0 -4
- package/dist/common/paramValidation.d.ts +0 -4
- package/dist/common/paramValidation.js +0 -17
- package/dist/common/paramValidation.js.map +0 -1
- package/dist/common/requestCounter.cjs +0 -109
- package/dist/common/requestCounter.cjs.map +0 -1
- package/dist/common/requestCounter.d.cts +0 -24
- package/dist/common/requestCounter.d.ts +0 -24
- package/dist/common/requestCounter.js +0 -90
- package/dist/common/requestCounter.js.map +0 -1
- package/dist/common/requestLogger.cjs +0 -541
- package/dist/common/requestLogger.cjs.map +0 -1
- package/dist/common/requestLogger.d.cts +0 -85
- package/dist/common/requestLogger.d.ts +0 -85
- package/dist/common/requestLogger.js +0 -507
- package/dist/common/requestLogger.js.map +0 -1
- package/dist/common/resources.cjs +0 -49
- package/dist/common/resources.cjs.map +0 -1
- package/dist/common/resources.d.cts +0 -6
- package/dist/common/resources.d.ts +0 -6
- package/dist/common/resources.js +0 -26
- package/dist/common/resources.js.map +0 -1
- package/dist/common/response.cjs +0 -104
- package/dist/common/response.cjs.map +0 -1
- package/dist/common/response.d.cts +0 -15
- package/dist/common/response.d.ts +0 -15
- package/dist/common/response.js +0 -80
- package/dist/common/response.js.map +0 -1
- package/dist/common/sentry.cjs +0 -56
- package/dist/common/sentry.cjs.map +0 -1
- package/dist/common/sentry.d.cts +0 -6
- package/dist/common/sentry.d.ts +0 -6
- package/dist/common/sentry.js +0 -23
- package/dist/common/sentry.js.map +0 -1
- package/dist/common/serverErrorCounter.cjs +0 -121
- package/dist/common/serverErrorCounter.cjs.map +0 -1
- package/dist/common/serverErrorCounter.d.cts +0 -23
- package/dist/common/serverErrorCounter.d.ts +0 -23
- package/dist/common/serverErrorCounter.js +0 -97
- package/dist/common/serverErrorCounter.js.map +0 -1
- package/dist/common/spanCollector.cjs +0 -199
- package/dist/common/spanCollector.cjs.map +0 -1
- package/dist/common/spanCollector.d.cts +0 -45
- package/dist/common/spanCollector.d.ts +0 -45
- package/dist/common/spanCollector.js +0 -176
- package/dist/common/spanCollector.js.map +0 -1
- package/dist/common/tempGzipFile.cjs +0 -125
- package/dist/common/tempGzipFile.cjs.map +0 -1
- package/dist/common/tempGzipFile.d.cts +0 -19
- package/dist/common/tempGzipFile.d.ts +0 -19
- package/dist/common/tempGzipFile.js +0 -102
- package/dist/common/tempGzipFile.js.map +0 -1
- package/dist/common/types.cjs +0 -17
- package/dist/common/types.cjs.map +0 -1
- package/dist/common/types.d.cts +0 -95
- package/dist/common/types.d.ts +0 -95
- package/dist/common/types.js +0 -1
- package/dist/common/types.js.map +0 -1
- package/dist/common/validationErrorCounter.cjs +0 -74
- package/dist/common/validationErrorCounter.cjs.map +0 -1
- package/dist/common/validationErrorCounter.d.cts +0 -20
- package/dist/common/validationErrorCounter.d.ts +0 -20
- package/dist/common/validationErrorCounter.js +0 -55
- package/dist/common/validationErrorCounter.js.map +0 -1
- package/dist/elysia/plugin.cjs +0 -237
- package/dist/elysia/plugin.cjs.map +0 -1
- package/dist/elysia/plugin.d.cts +0 -70
- package/dist/elysia/plugin.d.ts +0 -70
- package/dist/elysia/plugin.js +0 -218
- package/dist/elysia/plugin.js.map +0 -1
- package/dist/elysia/utils.cjs +0 -77
- package/dist/elysia/utils.cjs.map +0 -1
- package/dist/elysia/utils.d.cts +0 -14
- package/dist/elysia/utils.d.ts +0 -14
- package/dist/elysia/utils.js +0 -54
- package/dist/elysia/utils.js.map +0 -1
- package/dist/express/utils.cjs +0 -217
- package/dist/express/utils.cjs.map +0 -1
- package/dist/express/utils.d.cts +0 -37
- package/dist/express/utils.d.ts +0 -37
- package/dist/express/utils.js +0 -189
- package/dist/express/utils.js.map +0 -1
- package/dist/fastify/plugin.cjs +0 -316
- package/dist/fastify/plugin.cjs.map +0 -1
- package/dist/fastify/plugin.d.cts +0 -34
- package/dist/fastify/plugin.d.ts +0 -34
- package/dist/fastify/plugin.js +0 -282
- package/dist/fastify/plugin.js.map +0 -1
- package/dist/h3/plugin.cjs +0 -183
- package/dist/h3/plugin.cjs.map +0 -1
- package/dist/h3/plugin.d.cts +0 -27
- package/dist/h3/plugin.d.ts +0 -27
- package/dist/h3/plugin.js +0 -159
- package/dist/h3/plugin.js.map +0 -1
- package/dist/h3/utils.cjs +0 -77
- package/dist/h3/utils.cjs.map +0 -1
- package/dist/h3/utils.d.cts +0 -14
- package/dist/h3/utils.d.ts +0 -14
- package/dist/h3/utils.js +0 -54
- package/dist/h3/utils.js.map +0 -1
- package/dist/hapi/plugin.cjs +0 -210
- package/dist/hapi/plugin.cjs.map +0 -1
- package/dist/hapi/plugin.d.cts +0 -40
- package/dist/hapi/plugin.d.ts +0 -40
- package/dist/hapi/plugin.js +0 -187
- package/dist/hapi/plugin.js.map +0 -1
- package/dist/hapi/utils.cjs +0 -77
- package/dist/hapi/utils.cjs.map +0 -1
- package/dist/hapi/utils.d.cts +0 -16
- package/dist/hapi/utils.d.ts +0 -16
- package/dist/hapi/utils.js +0 -53
- package/dist/hapi/utils.js.map +0 -1
- package/dist/hono/utils.cjs +0 -113
- package/dist/hono/utils.cjs.map +0 -1
- package/dist/hono/utils.d.cts +0 -16
- package/dist/hono/utils.d.ts +0 -16
- package/dist/hono/utils.js +0 -88
- package/dist/hono/utils.js.map +0 -1
- package/dist/loggers/console.cjs +0 -67
- package/dist/loggers/console.cjs.map +0 -1
- package/dist/loggers/console.d.cts +0 -11
- package/dist/loggers/console.d.ts +0 -11
- package/dist/loggers/console.js +0 -44
- package/dist/loggers/console.js.map +0 -1
- package/dist/loggers/hapi.cjs.map +0 -1
- package/dist/loggers/hapi.d.cts +0 -12
- package/dist/loggers/hapi.d.ts +0 -12
- package/dist/loggers/hapi.js +0 -29
- package/dist/loggers/hapi.js.map +0 -1
- package/dist/loggers/index.cjs.map +0 -1
- package/dist/loggers/index.d.cts +0 -13
- package/dist/loggers/index.d.ts +0 -13
- package/dist/loggers/index.js +0 -13
- package/dist/loggers/index.js.map +0 -1
- package/dist/loggers/nestjs.cjs +0 -104
- package/dist/loggers/nestjs.cjs.map +0 -1
- package/dist/loggers/nestjs.d.cts +0 -11
- package/dist/loggers/nestjs.d.ts +0 -11
- package/dist/loggers/nestjs.js +0 -71
- package/dist/loggers/nestjs.js.map +0 -1
- package/dist/loggers/pino.cjs +0 -152
- package/dist/loggers/pino.cjs.map +0 -1
- package/dist/loggers/pino.d.cts +0 -11
- package/dist/loggers/pino.d.ts +0 -11
- package/dist/loggers/pino.js +0 -119
- package/dist/loggers/pino.js.map +0 -1
- package/dist/loggers/utils.cjs +0 -64
- package/dist/loggers/utils.cjs.map +0 -1
- package/dist/loggers/utils.d.cts +0 -6
- package/dist/loggers/utils.d.ts +0 -6
- package/dist/loggers/utils.js +0 -40
- package/dist/loggers/utils.js.map +0 -1
- package/dist/loggers/winston.cjs +0 -101
- package/dist/loggers/winston.cjs.map +0 -1
- package/dist/loggers/winston.d.cts +0 -11
- package/dist/loggers/winston.d.ts +0 -11
- package/dist/loggers/winston.js +0 -68
- package/dist/loggers/winston.js.map +0 -1
- package/dist/otel/index.cjs.map +0 -1
- package/dist/otel/index.d.cts +0 -2
- package/dist/otel/index.d.ts +0 -2
- package/dist/otel/index.js +0 -5
- package/dist/otel/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/spanExporter.ts"],"sourcesContent":["import type { Attributes } from \"@opentelemetry/api\";\nimport { SpanKind } from \"@opentelemetry/api\";\nimport type { ExportResult } from \"@opentelemetry/core\";\nimport { ProtobufTraceSerializer } from \"@opentelemetry/otlp-transformer\";\nimport { type Resource, resourceFromAttributes } from \"@opentelemetry/resources\";\nimport type { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\nimport { BODY_TOO_LARGE, BODY_TOO_LARGE_BUFFER, MAX_BODY_SIZE } from \"./bodyCapture.js\";\nimport { type BodyMaskingCallback, DEFAULT_ENV } from \"./config.js\";\nimport { serializeInChunksToSpool } from \"./exportSerialization.js\";\nimport { logWarning } from \"./logger.js\";\nimport { REDACTED, type Redaction } from \"./redaction.js\";\nimport { copySpan, type SpanCopy } from \"./spanProcessor.js\";\nimport type { Spool } from \"./spool.js\";\n\nconst QUERY_ATTRIBUTES = new Set([\"url.query\", \"url.full\", \"http.target\", \"http.url\"]);\nconst REQUEST_HEADER_ATTRIBUTE_PREFIX = \"http.request.header.\";\nconst RESPONSE_HEADER_ATTRIBUTE_PREFIX = \"http.response.header.\";\nconst DEPLOYMENT_ENVIRONMENT_NAME = \"deployment.environment.name\";\nconst SERVICE_INSTANCE_ID = \"service.instance.id\";\n\nexport interface ApitallySpanExporterOptions {\n redaction: Redaction;\n env: string;\n instanceId: string;\n spool: Spool;\n maskRequestBody?: BodyMaskingCallback;\n maskResponseBody?: BodyMaskingCallback;\n}\n\n// Export copies receive transport attributes, captured data, and redaction\n// without mutating the original spans.\nexport class ApitallySpanExporter implements SpanExporter {\n private readonly redaction: Redaction;\n private readonly env: string;\n private readonly instanceId: string;\n private readonly spool: Spool;\n private readonly maskRequestBody?: BodyMaskingCallback;\n private readonly maskResponseBody?: BodyMaskingCallback;\n\n constructor(options: ApitallySpanExporterOptions) {\n this.redaction = options.redaction;\n this.env = options.env;\n this.instanceId = options.instanceId;\n this.spool = options.spool;\n this.maskRequestBody = options.maskRequestBody;\n this.maskResponseBody = options.maskResponseBody;\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n // Rewritten resources are shared across the batch: the serializer groups\n // resourceSpans by object identity, never by attribute equality.\n const rewrittenResources = new Map<Resource, Resource>();\n const exportCopies: ReadableSpan[] = [];\n for (const span of spans) {\n try {\n exportCopies.push(this.buildExportCopy(span, rewrittenResources));\n } catch {\n // A span that failed redaction must never leave the process.\n logWarning(\"Failed to prepare a span for export to Apitally, so the span was dropped\");\n }\n }\n serializeInChunksToSpool(\n exportCopies,\n (chunk) => ProtobufTraceSerializer.serializeRequest(chunk),\n this.spool,\n \"traces\",\n resultCallback,\n );\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n\n private buildExportCopy(\n span: ReadableSpan,\n rewrittenResources: Map<Resource, Resource>,\n ): ReadableSpan {\n const data = (span as SpanCopy).apitallyData;\n const stash = data?.stash;\n // The record is applied last: a transport-observed value wins over anything\n // the producing instrumentation set for the same key.\n const attributes: Record<string, unknown> = {\n ...span.attributes,\n ...data?.record?.attributes,\n };\n this.redactQueryAndHeaderAttributes(attributes);\n if (stash?.requestHeaders) {\n writeCapturedHeaderAttributes(\n attributes,\n REQUEST_HEADER_ATTRIBUTE_PREFIX,\n stash.requestHeaders,\n this.redaction,\n );\n }\n if (stash?.responseHeaders) {\n writeCapturedHeaderAttributes(\n attributes,\n RESPONSE_HEADER_ATTRIBUTE_PREFIX,\n stash.responseHeaders,\n this.redaction,\n );\n }\n const copy = copySpan(span);\n copy.attributes = attributes as Attributes;\n copy.resource = this.resolveExportResource(span.resource, rewrittenResources);\n if (data?.demoteToInternal) {\n copy.kind = SpanKind.INTERNAL;\n }\n if (stash && (stash.requestBody !== undefined || stash.responseBody !== undefined)) {\n // Mask callbacks receive the redacted export copy with captured headers\n // attached, but without body attributes.\n const snapshot = copySpan(copy);\n snapshot.attributes = { ...attributes } as Attributes;\n if (stash.requestBody !== undefined) {\n attributes[\"apitally.request.body\"] = this.processBody(\n snapshot,\n stash.requestBody,\n this.maskRequestBody,\n \"maskRequestBody\",\n );\n }\n if (stash.responseBody !== undefined) {\n attributes[\"apitally.response.body\"] = this.processBody(\n snapshot,\n stash.responseBody,\n this.maskResponseBody,\n \"maskResponseBody\",\n );\n }\n }\n return copy;\n }\n\n // OpenTelemetry HTTP instrumentations leave query and header attributes raw.\n // Both legacy and stable HTTP attribute names are redacted before export.\n private redactQueryAndHeaderAttributes(attributes: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(attributes)) {\n if (QUERY_ATTRIBUTES.has(key) && typeof value === \"string\") {\n attributes[key] = this.redaction.redactQueryParams(value, key === \"url.query\");\n } else if (\n key.startsWith(REQUEST_HEADER_ATTRIBUTE_PREFIX) ||\n key.startsWith(RESPONSE_HEADER_ATTRIBUTE_PREFIX)\n ) {\n const headerName = key.slice(\n key.startsWith(REQUEST_HEADER_ATTRIBUTE_PREFIX)\n ? REQUEST_HEADER_ATTRIBUTE_PREFIX.length\n : RESPONSE_HEADER_ATTRIBUTE_PREFIX.length,\n );\n attributes[key] = this.redaction.redactHeaderValue(headerName, value);\n }\n }\n }\n\n // Bodies are masked, parsed, field-redacted, and serialized in that order.\n // Masking failures redact the entire body.\n private processBody(\n snapshot: ReadableSpan,\n body: Buffer,\n maskCallback: BodyMaskingCallback | undefined,\n optionName: string,\n ): string | Buffer {\n if (body.equals(BODY_TOO_LARGE_BUFFER)) {\n return BODY_TOO_LARGE;\n }\n let processed = body;\n if (maskCallback) {\n let masked: unknown;\n try {\n masked = maskCallback(body, snapshot);\n } catch {\n logWarning(\n `The Apitally ${optionName} callback threw an error, so the body was replaced with ${REDACTED}`,\n );\n return REDACTED;\n }\n if (masked === null || masked === undefined) {\n return REDACTED;\n }\n if (!Buffer.isBuffer(masked)) {\n logWarning(\n `The Apitally ${optionName} callback returned an invalid value, so the body was replaced with ${REDACTED}. Mask callbacks must synchronously return a Buffer or null.`,\n );\n return REDACTED;\n }\n if (masked.length > MAX_BODY_SIZE) {\n return BODY_TOO_LARGE;\n }\n processed = masked;\n }\n return this.redaction.redactBody(processed);\n }\n\n // Export resources must carry Apitally's process identity and match Apitally-Env.\n // Rewrites apply only to Apitally's copies.\n private resolveExportResource(\n resource: Resource,\n rewrittenResources: Map<Resource, Resource>,\n ): Resource {\n const resourceEnv = resource.attributes[DEPLOYMENT_ENVIRONMENT_NAME];\n const resourceInstanceId = resource.attributes[SERVICE_INSTANCE_ID];\n const envDiffers = typeof resourceEnv === \"string\" && resourceEnv !== this.env;\n const envMissing = resourceEnv === undefined && this.env !== DEFAULT_ENV;\n const instanceIdDiffers = resourceInstanceId !== this.instanceId;\n if (!envDiffers && !envMissing && !instanceIdDiffers) {\n return resource;\n }\n const existing = rewrittenResources.get(resource);\n if (existing) {\n return existing;\n }\n if (envDiffers) {\n logWarning(\n `The tracer provider's resource sets deployment.environment.name to \"${resourceEnv}\", which differs from the Apitally env \"${this.env}\". Spans are exported to Apitally with the env \"${this.env}\".`,\n );\n }\n const attributes: Attributes = {\n ...resource.attributes,\n [SERVICE_INSTANCE_ID]: this.instanceId,\n };\n if (envDiffers || envMissing) {\n attributes[DEPLOYMENT_ENVIRONMENT_NAME] = this.env;\n }\n const rewritten = resourceFromAttributes(attributes);\n rewrittenResources.set(resource, rewritten);\n return rewritten;\n }\n}\n\nfunction writeCapturedHeaderAttributes(\n attributes: Record<string, unknown>,\n prefix: string,\n headers: Record<string, string | string[]>,\n redaction: Redaction,\n): void {\n for (const [name, values] of Object.entries(headers)) {\n const redactedValues = redaction.redactHeaderValue(name, values);\n attributes[prefix + name] = Array.isArray(redactedValues) ? redactedValues : [redactedValues];\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ExportResult } from '@opentelemetry/core';
|
|
2
|
+
import { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';
|
|
3
|
+
import { BodyMaskingCallback } from './config.cjs';
|
|
4
|
+
import { Redaction } from './redaction.cjs';
|
|
5
|
+
import { Spool } from './spool.cjs';
|
|
6
|
+
import 'node:zlib';
|
|
7
|
+
|
|
8
|
+
interface ApitallySpanExporterOptions {
|
|
9
|
+
redaction: Redaction;
|
|
10
|
+
env: string;
|
|
11
|
+
instanceId: string;
|
|
12
|
+
spool: Spool;
|
|
13
|
+
maskRequestBody?: BodyMaskingCallback;
|
|
14
|
+
maskResponseBody?: BodyMaskingCallback;
|
|
15
|
+
}
|
|
16
|
+
declare class ApitallySpanExporter implements SpanExporter {
|
|
17
|
+
private readonly redaction;
|
|
18
|
+
private readonly env;
|
|
19
|
+
private readonly instanceId;
|
|
20
|
+
private readonly spool;
|
|
21
|
+
private readonly maskRequestBody?;
|
|
22
|
+
private readonly maskResponseBody?;
|
|
23
|
+
constructor(options: ApitallySpanExporterOptions);
|
|
24
|
+
export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void;
|
|
25
|
+
forceFlush(): Promise<void>;
|
|
26
|
+
shutdown(): Promise<void>;
|
|
27
|
+
private buildExportCopy;
|
|
28
|
+
private redactQueryAndHeaderAttributes;
|
|
29
|
+
private processBody;
|
|
30
|
+
private resolveExportResource;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { ApitallySpanExporter, type ApitallySpanExporterOptions };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ExportResult } from '@opentelemetry/core';
|
|
2
|
+
import { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';
|
|
3
|
+
import { BodyMaskingCallback } from './config.js';
|
|
4
|
+
import { Redaction } from './redaction.js';
|
|
5
|
+
import { Spool } from './spool.js';
|
|
6
|
+
import 'node:zlib';
|
|
7
|
+
|
|
8
|
+
interface ApitallySpanExporterOptions {
|
|
9
|
+
redaction: Redaction;
|
|
10
|
+
env: string;
|
|
11
|
+
instanceId: string;
|
|
12
|
+
spool: Spool;
|
|
13
|
+
maskRequestBody?: BodyMaskingCallback;
|
|
14
|
+
maskResponseBody?: BodyMaskingCallback;
|
|
15
|
+
}
|
|
16
|
+
declare class ApitallySpanExporter implements SpanExporter {
|
|
17
|
+
private readonly redaction;
|
|
18
|
+
private readonly env;
|
|
19
|
+
private readonly instanceId;
|
|
20
|
+
private readonly spool;
|
|
21
|
+
private readonly maskRequestBody?;
|
|
22
|
+
private readonly maskResponseBody?;
|
|
23
|
+
constructor(options: ApitallySpanExporterOptions);
|
|
24
|
+
export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void;
|
|
25
|
+
forceFlush(): Promise<void>;
|
|
26
|
+
shutdown(): Promise<void>;
|
|
27
|
+
private buildExportCopy;
|
|
28
|
+
private redactQueryAndHeaderAttributes;
|
|
29
|
+
private processBody;
|
|
30
|
+
private resolveExportResource;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { ApitallySpanExporter, type ApitallySpanExporterOptions };
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { SpanKind } from "@opentelemetry/api";
|
|
2
|
+
import { ProtobufTraceSerializer } from "@opentelemetry/otlp-transformer";
|
|
3
|
+
import { resourceFromAttributes } from "@opentelemetry/resources";
|
|
4
|
+
import { BODY_TOO_LARGE, BODY_TOO_LARGE_BUFFER, MAX_BODY_SIZE } from "./bodyCapture.js";
|
|
5
|
+
import { DEFAULT_ENV } from "./config.js";
|
|
6
|
+
import { serializeInChunksToSpool } from "./exportSerialization.js";
|
|
7
|
+
import { logWarning } from "./logger.js";
|
|
8
|
+
import { REDACTED } from "./redaction.js";
|
|
9
|
+
import { copySpan } from "./spanProcessor.js";
|
|
10
|
+
const QUERY_ATTRIBUTES = /* @__PURE__ */ new Set(["url.query", "url.full", "http.target", "http.url"]);
|
|
11
|
+
const REQUEST_HEADER_ATTRIBUTE_PREFIX = "http.request.header.";
|
|
12
|
+
const RESPONSE_HEADER_ATTRIBUTE_PREFIX = "http.response.header.";
|
|
13
|
+
const DEPLOYMENT_ENVIRONMENT_NAME = "deployment.environment.name";
|
|
14
|
+
const SERVICE_INSTANCE_ID = "service.instance.id";
|
|
15
|
+
class ApitallySpanExporter {
|
|
16
|
+
redaction;
|
|
17
|
+
env;
|
|
18
|
+
instanceId;
|
|
19
|
+
spool;
|
|
20
|
+
maskRequestBody;
|
|
21
|
+
maskResponseBody;
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.redaction = options.redaction;
|
|
24
|
+
this.env = options.env;
|
|
25
|
+
this.instanceId = options.instanceId;
|
|
26
|
+
this.spool = options.spool;
|
|
27
|
+
this.maskRequestBody = options.maskRequestBody;
|
|
28
|
+
this.maskResponseBody = options.maskResponseBody;
|
|
29
|
+
}
|
|
30
|
+
export(spans, resultCallback) {
|
|
31
|
+
const rewrittenResources = /* @__PURE__ */ new Map();
|
|
32
|
+
const exportCopies = [];
|
|
33
|
+
for (const span of spans) {
|
|
34
|
+
try {
|
|
35
|
+
exportCopies.push(this.buildExportCopy(span, rewrittenResources));
|
|
36
|
+
} catch {
|
|
37
|
+
logWarning("Failed to prepare a span for export to Apitally, so the span was dropped");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
serializeInChunksToSpool(
|
|
41
|
+
exportCopies,
|
|
42
|
+
(chunk) => ProtobufTraceSerializer.serializeRequest(chunk),
|
|
43
|
+
this.spool,
|
|
44
|
+
"traces",
|
|
45
|
+
resultCallback
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
forceFlush() {
|
|
49
|
+
return Promise.resolve();
|
|
50
|
+
}
|
|
51
|
+
shutdown() {
|
|
52
|
+
return Promise.resolve();
|
|
53
|
+
}
|
|
54
|
+
buildExportCopy(span, rewrittenResources) {
|
|
55
|
+
const data = span.apitallyData;
|
|
56
|
+
const stash = data?.stash;
|
|
57
|
+
const attributes = {
|
|
58
|
+
...span.attributes,
|
|
59
|
+
...data?.record?.attributes
|
|
60
|
+
};
|
|
61
|
+
this.redactQueryAndHeaderAttributes(attributes);
|
|
62
|
+
if (stash?.requestHeaders) {
|
|
63
|
+
writeCapturedHeaderAttributes(
|
|
64
|
+
attributes,
|
|
65
|
+
REQUEST_HEADER_ATTRIBUTE_PREFIX,
|
|
66
|
+
stash.requestHeaders,
|
|
67
|
+
this.redaction
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
if (stash?.responseHeaders) {
|
|
71
|
+
writeCapturedHeaderAttributes(
|
|
72
|
+
attributes,
|
|
73
|
+
RESPONSE_HEADER_ATTRIBUTE_PREFIX,
|
|
74
|
+
stash.responseHeaders,
|
|
75
|
+
this.redaction
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
const copy = copySpan(span);
|
|
79
|
+
copy.attributes = attributes;
|
|
80
|
+
copy.resource = this.resolveExportResource(span.resource, rewrittenResources);
|
|
81
|
+
if (data?.demoteToInternal) {
|
|
82
|
+
copy.kind = SpanKind.INTERNAL;
|
|
83
|
+
}
|
|
84
|
+
if (stash && (stash.requestBody !== void 0 || stash.responseBody !== void 0)) {
|
|
85
|
+
const snapshot = copySpan(copy);
|
|
86
|
+
snapshot.attributes = { ...attributes };
|
|
87
|
+
if (stash.requestBody !== void 0) {
|
|
88
|
+
attributes["apitally.request.body"] = this.processBody(
|
|
89
|
+
snapshot,
|
|
90
|
+
stash.requestBody,
|
|
91
|
+
this.maskRequestBody,
|
|
92
|
+
"maskRequestBody"
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
if (stash.responseBody !== void 0) {
|
|
96
|
+
attributes["apitally.response.body"] = this.processBody(
|
|
97
|
+
snapshot,
|
|
98
|
+
stash.responseBody,
|
|
99
|
+
this.maskResponseBody,
|
|
100
|
+
"maskResponseBody"
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return copy;
|
|
105
|
+
}
|
|
106
|
+
// OpenTelemetry HTTP instrumentations leave query and header attributes raw.
|
|
107
|
+
// Both legacy and stable HTTP attribute names are redacted before export.
|
|
108
|
+
redactQueryAndHeaderAttributes(attributes) {
|
|
109
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
110
|
+
if (QUERY_ATTRIBUTES.has(key) && typeof value === "string") {
|
|
111
|
+
attributes[key] = this.redaction.redactQueryParams(value, key === "url.query");
|
|
112
|
+
} else if (key.startsWith(REQUEST_HEADER_ATTRIBUTE_PREFIX) || key.startsWith(RESPONSE_HEADER_ATTRIBUTE_PREFIX)) {
|
|
113
|
+
const headerName = key.slice(
|
|
114
|
+
key.startsWith(REQUEST_HEADER_ATTRIBUTE_PREFIX) ? REQUEST_HEADER_ATTRIBUTE_PREFIX.length : RESPONSE_HEADER_ATTRIBUTE_PREFIX.length
|
|
115
|
+
);
|
|
116
|
+
attributes[key] = this.redaction.redactHeaderValue(headerName, value);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Bodies are masked, parsed, field-redacted, and serialized in that order.
|
|
121
|
+
// Masking failures redact the entire body.
|
|
122
|
+
processBody(snapshot, body, maskCallback, optionName) {
|
|
123
|
+
if (body.equals(BODY_TOO_LARGE_BUFFER)) {
|
|
124
|
+
return BODY_TOO_LARGE;
|
|
125
|
+
}
|
|
126
|
+
let processed = body;
|
|
127
|
+
if (maskCallback) {
|
|
128
|
+
let masked;
|
|
129
|
+
try {
|
|
130
|
+
masked = maskCallback(body, snapshot);
|
|
131
|
+
} catch {
|
|
132
|
+
logWarning(
|
|
133
|
+
`The Apitally ${optionName} callback threw an error, so the body was replaced with ${REDACTED}`
|
|
134
|
+
);
|
|
135
|
+
return REDACTED;
|
|
136
|
+
}
|
|
137
|
+
if (masked === null || masked === void 0) {
|
|
138
|
+
return REDACTED;
|
|
139
|
+
}
|
|
140
|
+
if (!Buffer.isBuffer(masked)) {
|
|
141
|
+
logWarning(
|
|
142
|
+
`The Apitally ${optionName} callback returned an invalid value, so the body was replaced with ${REDACTED}. Mask callbacks must synchronously return a Buffer or null.`
|
|
143
|
+
);
|
|
144
|
+
return REDACTED;
|
|
145
|
+
}
|
|
146
|
+
if (masked.length > MAX_BODY_SIZE) {
|
|
147
|
+
return BODY_TOO_LARGE;
|
|
148
|
+
}
|
|
149
|
+
processed = masked;
|
|
150
|
+
}
|
|
151
|
+
return this.redaction.redactBody(processed);
|
|
152
|
+
}
|
|
153
|
+
// Export resources must carry Apitally's process identity and match Apitally-Env.
|
|
154
|
+
// Rewrites apply only to Apitally's copies.
|
|
155
|
+
resolveExportResource(resource, rewrittenResources) {
|
|
156
|
+
const resourceEnv = resource.attributes[DEPLOYMENT_ENVIRONMENT_NAME];
|
|
157
|
+
const resourceInstanceId = resource.attributes[SERVICE_INSTANCE_ID];
|
|
158
|
+
const envDiffers = typeof resourceEnv === "string" && resourceEnv !== this.env;
|
|
159
|
+
const envMissing = resourceEnv === void 0 && this.env !== DEFAULT_ENV;
|
|
160
|
+
const instanceIdDiffers = resourceInstanceId !== this.instanceId;
|
|
161
|
+
if (!envDiffers && !envMissing && !instanceIdDiffers) {
|
|
162
|
+
return resource;
|
|
163
|
+
}
|
|
164
|
+
const existing = rewrittenResources.get(resource);
|
|
165
|
+
if (existing) {
|
|
166
|
+
return existing;
|
|
167
|
+
}
|
|
168
|
+
if (envDiffers) {
|
|
169
|
+
logWarning(
|
|
170
|
+
`The tracer provider's resource sets deployment.environment.name to "${resourceEnv}", which differs from the Apitally env "${this.env}". Spans are exported to Apitally with the env "${this.env}".`
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
const attributes = {
|
|
174
|
+
...resource.attributes,
|
|
175
|
+
[SERVICE_INSTANCE_ID]: this.instanceId
|
|
176
|
+
};
|
|
177
|
+
if (envDiffers || envMissing) {
|
|
178
|
+
attributes[DEPLOYMENT_ENVIRONMENT_NAME] = this.env;
|
|
179
|
+
}
|
|
180
|
+
const rewritten = resourceFromAttributes(attributes);
|
|
181
|
+
rewrittenResources.set(resource, rewritten);
|
|
182
|
+
return rewritten;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function writeCapturedHeaderAttributes(attributes, prefix, headers, redaction) {
|
|
186
|
+
for (const [name, values] of Object.entries(headers)) {
|
|
187
|
+
const redactedValues = redaction.redactHeaderValue(name, values);
|
|
188
|
+
attributes[prefix + name] = Array.isArray(redactedValues) ? redactedValues : [redactedValues];
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export {
|
|
192
|
+
ApitallySpanExporter
|
|
193
|
+
};
|
|
194
|
+
//# sourceMappingURL=spanExporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/spanExporter.ts"],"sourcesContent":["import type { Attributes } from \"@opentelemetry/api\";\nimport { SpanKind } from \"@opentelemetry/api\";\nimport type { ExportResult } from \"@opentelemetry/core\";\nimport { ProtobufTraceSerializer } from \"@opentelemetry/otlp-transformer\";\nimport { type Resource, resourceFromAttributes } from \"@opentelemetry/resources\";\nimport type { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\nimport { BODY_TOO_LARGE, BODY_TOO_LARGE_BUFFER, MAX_BODY_SIZE } from \"./bodyCapture.js\";\nimport { type BodyMaskingCallback, DEFAULT_ENV } from \"./config.js\";\nimport { serializeInChunksToSpool } from \"./exportSerialization.js\";\nimport { logWarning } from \"./logger.js\";\nimport { REDACTED, type Redaction } from \"./redaction.js\";\nimport { copySpan, type SpanCopy } from \"./spanProcessor.js\";\nimport type { Spool } from \"./spool.js\";\n\nconst QUERY_ATTRIBUTES = new Set([\"url.query\", \"url.full\", \"http.target\", \"http.url\"]);\nconst REQUEST_HEADER_ATTRIBUTE_PREFIX = \"http.request.header.\";\nconst RESPONSE_HEADER_ATTRIBUTE_PREFIX = \"http.response.header.\";\nconst DEPLOYMENT_ENVIRONMENT_NAME = \"deployment.environment.name\";\nconst SERVICE_INSTANCE_ID = \"service.instance.id\";\n\nexport interface ApitallySpanExporterOptions {\n redaction: Redaction;\n env: string;\n instanceId: string;\n spool: Spool;\n maskRequestBody?: BodyMaskingCallback;\n maskResponseBody?: BodyMaskingCallback;\n}\n\n// Export copies receive transport attributes, captured data, and redaction\n// without mutating the original spans.\nexport class ApitallySpanExporter implements SpanExporter {\n private readonly redaction: Redaction;\n private readonly env: string;\n private readonly instanceId: string;\n private readonly spool: Spool;\n private readonly maskRequestBody?: BodyMaskingCallback;\n private readonly maskResponseBody?: BodyMaskingCallback;\n\n constructor(options: ApitallySpanExporterOptions) {\n this.redaction = options.redaction;\n this.env = options.env;\n this.instanceId = options.instanceId;\n this.spool = options.spool;\n this.maskRequestBody = options.maskRequestBody;\n this.maskResponseBody = options.maskResponseBody;\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n // Rewritten resources are shared across the batch: the serializer groups\n // resourceSpans by object identity, never by attribute equality.\n const rewrittenResources = new Map<Resource, Resource>();\n const exportCopies: ReadableSpan[] = [];\n for (const span of spans) {\n try {\n exportCopies.push(this.buildExportCopy(span, rewrittenResources));\n } catch {\n // A span that failed redaction must never leave the process.\n logWarning(\"Failed to prepare a span for export to Apitally, so the span was dropped\");\n }\n }\n serializeInChunksToSpool(\n exportCopies,\n (chunk) => ProtobufTraceSerializer.serializeRequest(chunk),\n this.spool,\n \"traces\",\n resultCallback,\n );\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n\n private buildExportCopy(\n span: ReadableSpan,\n rewrittenResources: Map<Resource, Resource>,\n ): ReadableSpan {\n const data = (span as SpanCopy).apitallyData;\n const stash = data?.stash;\n // The record is applied last: a transport-observed value wins over anything\n // the producing instrumentation set for the same key.\n const attributes: Record<string, unknown> = {\n ...span.attributes,\n ...data?.record?.attributes,\n };\n this.redactQueryAndHeaderAttributes(attributes);\n if (stash?.requestHeaders) {\n writeCapturedHeaderAttributes(\n attributes,\n REQUEST_HEADER_ATTRIBUTE_PREFIX,\n stash.requestHeaders,\n this.redaction,\n );\n }\n if (stash?.responseHeaders) {\n writeCapturedHeaderAttributes(\n attributes,\n RESPONSE_HEADER_ATTRIBUTE_PREFIX,\n stash.responseHeaders,\n this.redaction,\n );\n }\n const copy = copySpan(span);\n copy.attributes = attributes as Attributes;\n copy.resource = this.resolveExportResource(span.resource, rewrittenResources);\n if (data?.demoteToInternal) {\n copy.kind = SpanKind.INTERNAL;\n }\n if (stash && (stash.requestBody !== undefined || stash.responseBody !== undefined)) {\n // Mask callbacks receive the redacted export copy with captured headers\n // attached, but without body attributes.\n const snapshot = copySpan(copy);\n snapshot.attributes = { ...attributes } as Attributes;\n if (stash.requestBody !== undefined) {\n attributes[\"apitally.request.body\"] = this.processBody(\n snapshot,\n stash.requestBody,\n this.maskRequestBody,\n \"maskRequestBody\",\n );\n }\n if (stash.responseBody !== undefined) {\n attributes[\"apitally.response.body\"] = this.processBody(\n snapshot,\n stash.responseBody,\n this.maskResponseBody,\n \"maskResponseBody\",\n );\n }\n }\n return copy;\n }\n\n // OpenTelemetry HTTP instrumentations leave query and header attributes raw.\n // Both legacy and stable HTTP attribute names are redacted before export.\n private redactQueryAndHeaderAttributes(attributes: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(attributes)) {\n if (QUERY_ATTRIBUTES.has(key) && typeof value === \"string\") {\n attributes[key] = this.redaction.redactQueryParams(value, key === \"url.query\");\n } else if (\n key.startsWith(REQUEST_HEADER_ATTRIBUTE_PREFIX) ||\n key.startsWith(RESPONSE_HEADER_ATTRIBUTE_PREFIX)\n ) {\n const headerName = key.slice(\n key.startsWith(REQUEST_HEADER_ATTRIBUTE_PREFIX)\n ? REQUEST_HEADER_ATTRIBUTE_PREFIX.length\n : RESPONSE_HEADER_ATTRIBUTE_PREFIX.length,\n );\n attributes[key] = this.redaction.redactHeaderValue(headerName, value);\n }\n }\n }\n\n // Bodies are masked, parsed, field-redacted, and serialized in that order.\n // Masking failures redact the entire body.\n private processBody(\n snapshot: ReadableSpan,\n body: Buffer,\n maskCallback: BodyMaskingCallback | undefined,\n optionName: string,\n ): string | Buffer {\n if (body.equals(BODY_TOO_LARGE_BUFFER)) {\n return BODY_TOO_LARGE;\n }\n let processed = body;\n if (maskCallback) {\n let masked: unknown;\n try {\n masked = maskCallback(body, snapshot);\n } catch {\n logWarning(\n `The Apitally ${optionName} callback threw an error, so the body was replaced with ${REDACTED}`,\n );\n return REDACTED;\n }\n if (masked === null || masked === undefined) {\n return REDACTED;\n }\n if (!Buffer.isBuffer(masked)) {\n logWarning(\n `The Apitally ${optionName} callback returned an invalid value, so the body was replaced with ${REDACTED}. Mask callbacks must synchronously return a Buffer or null.`,\n );\n return REDACTED;\n }\n if (masked.length > MAX_BODY_SIZE) {\n return BODY_TOO_LARGE;\n }\n processed = masked;\n }\n return this.redaction.redactBody(processed);\n }\n\n // Export resources must carry Apitally's process identity and match Apitally-Env.\n // Rewrites apply only to Apitally's copies.\n private resolveExportResource(\n resource: Resource,\n rewrittenResources: Map<Resource, Resource>,\n ): Resource {\n const resourceEnv = resource.attributes[DEPLOYMENT_ENVIRONMENT_NAME];\n const resourceInstanceId = resource.attributes[SERVICE_INSTANCE_ID];\n const envDiffers = typeof resourceEnv === \"string\" && resourceEnv !== this.env;\n const envMissing = resourceEnv === undefined && this.env !== DEFAULT_ENV;\n const instanceIdDiffers = resourceInstanceId !== this.instanceId;\n if (!envDiffers && !envMissing && !instanceIdDiffers) {\n return resource;\n }\n const existing = rewrittenResources.get(resource);\n if (existing) {\n return existing;\n }\n if (envDiffers) {\n logWarning(\n `The tracer provider's resource sets deployment.environment.name to \"${resourceEnv}\", which differs from the Apitally env \"${this.env}\". Spans are exported to Apitally with the env \"${this.env}\".`,\n );\n }\n const attributes: Attributes = {\n ...resource.attributes,\n [SERVICE_INSTANCE_ID]: this.instanceId,\n };\n if (envDiffers || envMissing) {\n attributes[DEPLOYMENT_ENVIRONMENT_NAME] = this.env;\n }\n const rewritten = resourceFromAttributes(attributes);\n rewrittenResources.set(resource, rewritten);\n return rewritten;\n }\n}\n\nfunction writeCapturedHeaderAttributes(\n attributes: Record<string, unknown>,\n prefix: string,\n headers: Record<string, string | string[]>,\n redaction: Redaction,\n): void {\n for (const [name, values] of Object.entries(headers)) {\n const redactedValues = redaction.redactHeaderValue(name, values);\n attributes[prefix + name] = Array.isArray(redactedValues) ? redactedValues : [redactedValues];\n }\n}\n"],"mappings":"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","names":[]}
|