apitally 0.25.8 → 1.0.0-beta.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 +228 -178
- package/dist/activation.cjs +393 -0
- package/dist/activation.cjs.map +1 -0
- package/dist/activation.d.cts +42 -0
- package/dist/activation.d.ts +42 -0
- package/dist/activation.js +383 -0
- package/dist/activation.js.map +1 -0
- package/dist/adonisjs/configure.cjs +86 -30
- 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 +83 -29
- package/dist/adonisjs/configure.js.map +1 -1
- package/dist/adonisjs/index.cjs +38 -21
- package/dist/adonisjs/index.cjs.map +1 -1
- package/dist/adonisjs/index.d.cts +5 -14
- package/dist/adonisjs/index.d.ts +5 -14
- package/dist/adonisjs/index.js +39 -18
- 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 +227 -0
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.cts +45 -0
- package/dist/config.d.ts +45 -0
- package/dist/config.js +192 -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 +15 -0
- package/dist/consumer.d.ts +15 -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 +33 -0
- package/dist/context.d.ts +33 -0
- package/dist/context.js +40 -0
- package/dist/context.js.map +1 -0
- package/dist/elysia/index.cjs +12 -3
- package/dist/elysia/index.cjs.map +1 -1
- package/dist/elysia/index.d.cts +8 -16
- package/dist/elysia/index.d.ts +8 -16
- package/dist/elysia/index.js +10 -2
- package/dist/elysia/index.js.map +1 -1
- package/dist/elysia/middleware.cjs +261 -0
- package/dist/elysia/middleware.cjs.map +1 -0
- package/dist/elysia/middleware.d.cts +14 -0
- package/dist/elysia/middleware.d.ts +14 -0
- package/dist/elysia/middleware.js +250 -0
- package/dist/elysia/middleware.js.map +1 -0
- package/dist/{otel/index.cjs → elysia/routes.cjs} +16 -7
- 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 +81 -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 +55 -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 +7 -10
- package/dist/express/index.d.ts +7 -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 +10 -0
- package/dist/express/install.d.ts +10 -0
- package/dist/express/install.js +21 -0
- package/dist/express/install.js.map +1 -0
- package/dist/express/middleware.cjs +87 -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 +91 -327
- 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 +429 -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 +401 -0
- package/dist/express/routes.js.map +1 -0
- package/dist/fastify/index.cjs +10 -5
- package/dist/fastify/index.cjs.map +1 -1
- package/dist/fastify/index.d.cts +7 -11
- package/dist/fastify/index.d.ts +7 -11
- package/dist/fastify/index.js +9 -3
- package/dist/fastify/index.js.map +1 -1
- package/dist/{loggers/index.cjs → fastify/install.cjs} +17 -19
- package/dist/fastify/install.cjs.map +1 -0
- package/dist/fastify/install.d.cts +10 -0
- package/dist/fastify/install.d.ts +10 -0
- package/dist/fastify/install.js +15 -0
- package/dist/fastify/install.js.map +1 -0
- package/dist/fastify/middleware.cjs +135 -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 +114 -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 +8 -10
- package/dist/h3/index.d.ts +8 -10
- package/dist/h3/index.js +26 -2
- package/dist/h3/index.js.map +1 -1
- package/dist/h3/middleware.cjs +210 -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 +194 -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 -4
- package/dist/hapi/index.cjs.map +1 -1
- package/dist/hapi/index.d.cts +8 -10
- package/dist/hapi/index.d.ts +8 -10
- package/dist/hapi/index.js +13 -2
- 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 +8 -0
- package/dist/hapi/install.d.ts +8 -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/{common/logging.cjs → hapi/routes.cjs} +14 -17
- 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 +7 -10
- package/dist/hono/index.d.ts +7 -10
- package/dist/hono/index.js +13 -2
- package/dist/hono/index.js.map +1 -1
- package/dist/hono/middleware.cjs +219 -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 +229 -126
- 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 +29 -1
- package/dist/index.d.ts +29 -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 +7 -10
- package/dist/koa/index.d.ts +7 -10
- package/dist/koa/index.js +13 -2
- package/dist/koa/index.js.map +1 -1
- package/dist/koa/middleware.cjs +85 -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 +88 -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 +417 -0
- package/dist/logCapture.cjs.map +1 -0
- package/dist/logCapture.d.cts +18 -0
- package/dist/logCapture.d.ts +18 -0
- package/dist/logCapture.js +390 -0
- package/dist/logCapture.js.map +1 -0
- package/dist/logRecordExporter.cjs +51 -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 +27 -0
- package/dist/logRecordExporter.js.map +1 -0
- package/dist/logRecordProcessor.cjs +137 -0
- package/dist/logRecordProcessor.cjs.map +1 -0
- package/dist/logRecordProcessor.d.cts +27 -0
- package/dist/logRecordProcessor.d.ts +27 -0
- package/dist/logRecordProcessor.js +113 -0
- package/dist/logRecordProcessor.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 +26 -0
- package/dist/metrics.d.ts +26 -0
- package/dist/metrics.js +153 -0
- package/dist/metrics.js.map +1 -0
- package/dist/nestjs/index.cjs +81 -71
- package/dist/nestjs/index.cjs.map +1 -1
- package/dist/nestjs/index.d.cts +4 -11
- package/dist/nestjs/index.d.ts +4 -11
- package/dist/nestjs/index.js +81 -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 +10 -0
- package/dist/requestAttributes.d.ts +10 -0
- package/dist/requestAttributes.js +22 -0
- package/dist/requestAttributes.js.map +1 -0
- package/dist/requestObservation.cjs +246 -0
- package/dist/requestObservation.cjs.map +1 -0
- package/dist/requestObservation.d.cts +62 -0
- package/dist/requestObservation.d.ts +62 -0
- package/dist/requestObservation.js +226 -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 +31 -0
- package/dist/requestObservationNode.d.ts +31 -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 +34 -0
- package/dist/requestObservationWeb.d.ts +34 -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/serverErrors.cjs +118 -0
- package/dist/serverErrors.cjs.map +1 -0
- package/dist/serverErrors.d.cts +8 -0
- package/dist/serverErrors.d.ts +8 -0
- package/dist/serverErrors.js +91 -0
- package/dist/serverErrors.js.map +1 -0
- package/dist/spanExporter.cjs +217 -0
- package/dist/spanExporter.cjs.map +1 -0
- package/dist/spanExporter.d.cts +34 -0
- package/dist/spanExporter.d.ts +34 -0
- package/dist/spanExporter.js +193 -0
- package/dist/spanExporter.js.map +1 -0
- package/dist/spanProcessor.cjs +535 -0
- package/dist/spanProcessor.cjs.map +1 -0
- package/dist/spanProcessor.d.cts +70 -0
- package/dist/spanProcessor.d.ts +70 -0
- package/dist/spanProcessor.js +513 -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 +98 -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 +73 -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/dist/validationErrors.cjs +229 -0
- package/dist/validationErrors.cjs.map +1 -0
- package/dist/validationErrors.d.cts +21 -0
- package/dist/validationErrors.d.ts +21 -0
- package/dist/validationErrors.js +195 -0
- package/dist/validationErrors.js.map +1 -0
- package/package.json +113 -154
- 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 -86
- 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 -62
- 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 -114
- 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 -91
- package/dist/common/requestCounter.js.map +0 -1
- package/dist/common/requestLogger.cjs +0 -543
- 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 -508
- 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 -123
- 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 -98
- package/dist/common/serverErrorCounter.js.map +0 -1
- package/dist/common/spanCollector.cjs +0 -201
- 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 -177
- package/dist/common/spanCollector.js.map +0 -1
- package/dist/common/tempGzipFile.cjs +0 -127
- 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 -103
- 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 -79
- 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 -56
- package/dist/common/validationErrorCounter.js.map +0 -1
- package/dist/elysia/plugin.cjs +0 -242
- 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 -219
- 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 -319
- 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 -284
- 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 -212
- 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 -188
- 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,383 @@
|
|
|
1
|
+
import { isMainThread } from "node:worker_threads";
|
|
2
|
+
import { ROOT_CONTEXT } from "@opentelemetry/api";
|
|
3
|
+
import { UndiciInstrumentation } from "@opentelemetry/instrumentation-undici";
|
|
4
|
+
import { BatchLogRecordProcessor } from "@opentelemetry/sdk-logs";
|
|
5
|
+
import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
6
|
+
import {
|
|
7
|
+
getConfig,
|
|
8
|
+
isApitallyDisabledViaEnv,
|
|
9
|
+
setConfig
|
|
10
|
+
} from "./config.js";
|
|
11
|
+
import { ExportWorker } from "./exportWorker.js";
|
|
12
|
+
import {
|
|
13
|
+
installConsoleCapture,
|
|
14
|
+
installNestLoggerCapture,
|
|
15
|
+
installPinoCapture,
|
|
16
|
+
installWinstonCapture
|
|
17
|
+
} from "./logCapture.js";
|
|
18
|
+
import { logDebug, logError, logWarning } from "./logger.js";
|
|
19
|
+
import { ApitallyLogRecordExporter } from "./logRecordExporter.js";
|
|
20
|
+
import { ApitallyLogRecordProcessor } from "./logRecordProcessor.js";
|
|
21
|
+
import { MetricsPipeline } from "./metrics.js";
|
|
22
|
+
import { getDistroVersion } from "./packageVersion.js";
|
|
23
|
+
import {
|
|
24
|
+
createLoggerProvider,
|
|
25
|
+
resolveEnvAndCreateResource,
|
|
26
|
+
setupTracerProvider
|
|
27
|
+
} from "./providers.js";
|
|
28
|
+
import { Redaction } from "./redaction.js";
|
|
29
|
+
import { installSentryEventIdRecording } from "./sentry.js";
|
|
30
|
+
import { drainServerErrors, resetServerErrors, SERVER_ERROR_EVENT_NAME } from "./serverErrors.js";
|
|
31
|
+
import { ApitallySpanExporter } from "./spanExporter.js";
|
|
32
|
+
import {
|
|
33
|
+
isApitallySpanProcessorDeclared,
|
|
34
|
+
SpanPipeline,
|
|
35
|
+
setActiveSpanPipeline,
|
|
36
|
+
setServerSpanActivationCallback
|
|
37
|
+
} from "./spanProcessor.js";
|
|
38
|
+
import { Spool } from "./spool.js";
|
|
39
|
+
import { emitStartupEvent } from "./startup.js";
|
|
40
|
+
import {
|
|
41
|
+
drainValidationErrors,
|
|
42
|
+
resetValidationErrors,
|
|
43
|
+
VALIDATION_ERROR_EVENT_NAME
|
|
44
|
+
} from "./validationErrors.js";
|
|
45
|
+
const BATCH_SCHEDULE_DELAY_MILLIS = 1e3;
|
|
46
|
+
const BATCH_EXPORT_TIMEOUT_MILLIS = 3e4;
|
|
47
|
+
const BATCH_MAX_QUEUE_SIZE = 2048;
|
|
48
|
+
const BATCH_MAX_EXPORT_BATCH_SIZE = 512;
|
|
49
|
+
const BATCH_MAX_EXPORT_BATCH_SIZE_WITH_BODY_CAPTURE = 32;
|
|
50
|
+
const SIGNAL_FLUSH_TIMEOUT_MILLIS = 5e3;
|
|
51
|
+
const ACTIVATION_STATE_KEY = /* @__PURE__ */ Symbol.for("apitally.activation");
|
|
52
|
+
function configure(options = {}) {
|
|
53
|
+
const config = setConfig(options);
|
|
54
|
+
if (!config.disabled && process.env.OTEL_SEMCONV_STABILITY_OPT_IN === void 0) {
|
|
55
|
+
process.env.OTEL_SEMCONV_STABILITY_OPT_IN = "http/dup";
|
|
56
|
+
}
|
|
57
|
+
setServerSpanActivationCallback(activate);
|
|
58
|
+
return config;
|
|
59
|
+
}
|
|
60
|
+
function registerStartupEventInfo(info) {
|
|
61
|
+
const activationState = getActivationState();
|
|
62
|
+
activationState.startupEventInfo ??= info;
|
|
63
|
+
}
|
|
64
|
+
function activate(triggeringSpan) {
|
|
65
|
+
const activationState = getActivationState();
|
|
66
|
+
if (activationState.activationAttempted) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
activationState.activationAttempted = true;
|
|
70
|
+
if (shouldSkipActivation()) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const handles = startPipelines(activationState.startupEventInfo, triggeringSpan);
|
|
75
|
+
activationState.handles = handles;
|
|
76
|
+
activationState.runShutdown = () => drainAndStop(handles);
|
|
77
|
+
installBeforeExitHook(activationState);
|
|
78
|
+
installSignalHooks(activationState);
|
|
79
|
+
} catch (error) {
|
|
80
|
+
logError(`Apitally activation failed: ${String(error)}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function isActivated() {
|
|
84
|
+
return getActivationState().handles !== void 0;
|
|
85
|
+
}
|
|
86
|
+
function getActivationHandles() {
|
|
87
|
+
return getActivationState().handles;
|
|
88
|
+
}
|
|
89
|
+
async function flushTelemetry() {
|
|
90
|
+
try {
|
|
91
|
+
await getActivationState().handles?.worker.runCycle();
|
|
92
|
+
} catch (error) {
|
|
93
|
+
logDebug(`Error flushing telemetry: ${String(error)}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function shutdown() {
|
|
97
|
+
const activationState = getActivationState();
|
|
98
|
+
const handles = activationState.handles;
|
|
99
|
+
const runShutdown = activationState.runShutdown;
|
|
100
|
+
if (!handles || !runShutdown) {
|
|
101
|
+
return Promise.resolve();
|
|
102
|
+
}
|
|
103
|
+
if (!activationState.shutdownPromise) {
|
|
104
|
+
removeLifecycleHooks(activationState);
|
|
105
|
+
const signalDrainPromise = activationState.signalDrainPromise;
|
|
106
|
+
activationState.shutdownPromise = (signalDrainPromise ? signalDrainPromise.then(() => handles.worker.waitForIdle()) : Promise.resolve()).then(runShutdown);
|
|
107
|
+
}
|
|
108
|
+
return activationState.shutdownPromise;
|
|
109
|
+
}
|
|
110
|
+
const activationFactories = {
|
|
111
|
+
createSpool: () => new Spool(),
|
|
112
|
+
createExportWorker: (options) => new ExportWorker(options)
|
|
113
|
+
};
|
|
114
|
+
const defaultFactories = { ...activationFactories };
|
|
115
|
+
async function resetActivation() {
|
|
116
|
+
Object.assign(activationFactories, defaultFactories);
|
|
117
|
+
const holder = globalThis;
|
|
118
|
+
const activationState = holder[ACTIVATION_STATE_KEY];
|
|
119
|
+
delete holder[ACTIVATION_STATE_KEY];
|
|
120
|
+
hasWarnedAboutVersionSkew = false;
|
|
121
|
+
resetValidationErrors();
|
|
122
|
+
resetServerErrors();
|
|
123
|
+
if (!activationState) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
removeLifecycleHooks(activationState);
|
|
127
|
+
const handles = activationState.handles;
|
|
128
|
+
if (!handles) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
handles.undiciInstrumentation?.disable();
|
|
132
|
+
await handles.worker.stop();
|
|
133
|
+
await handles.spanPipeline.shutdown();
|
|
134
|
+
await handles.loggerProvider.shutdown();
|
|
135
|
+
await handles.spool.clear();
|
|
136
|
+
}
|
|
137
|
+
let hasWarnedAboutVersionSkew = false;
|
|
138
|
+
function emitErrorEvents(loggerProvider) {
|
|
139
|
+
const logger = loggerProvider.getLogger("apitally");
|
|
140
|
+
const events = [
|
|
141
|
+
[VALIDATION_ERROR_EVENT_NAME, drainValidationErrors()],
|
|
142
|
+
[SERVER_ERROR_EVENT_NAME, drainServerErrors()]
|
|
143
|
+
];
|
|
144
|
+
for (const [eventName, bodies] of events) {
|
|
145
|
+
for (const body of bodies) {
|
|
146
|
+
logger.emit({ timestamp: Date.now(), context: ROOT_CONTEXT, eventName, body });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function getActivationState() {
|
|
151
|
+
const holder = globalThis;
|
|
152
|
+
const existing = holder[ACTIVATION_STATE_KEY];
|
|
153
|
+
if (existing) {
|
|
154
|
+
if (!hasWarnedAboutVersionSkew && existing.sdkVersion !== getDistroVersion()) {
|
|
155
|
+
hasWarnedAboutVersionSkew = true;
|
|
156
|
+
logWarning(
|
|
157
|
+
`Two copies of the apitally package with different versions (${existing.sdkVersion} and ${getDistroVersion()}) are loaded in this process; version ${existing.sdkVersion} stays active. To resolve this, deduplicate the apitally installation.`
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
return existing;
|
|
161
|
+
}
|
|
162
|
+
const activationState = {
|
|
163
|
+
sdkVersion: getDistroVersion(),
|
|
164
|
+
activationAttempted: false
|
|
165
|
+
};
|
|
166
|
+
holder[ACTIVATION_STATE_KEY] = activationState;
|
|
167
|
+
return activationState;
|
|
168
|
+
}
|
|
169
|
+
function shouldSkipActivation() {
|
|
170
|
+
return Boolean(process.env.JEST_WORKER_ID) || Boolean(process.env.VITEST) || process.env.NODE_ENV === "test" || // The emergency kill switch overrides an explicit disabled: false option.
|
|
171
|
+
isApitallyDisabledViaEnv() || getConfig().disabled;
|
|
172
|
+
}
|
|
173
|
+
function startPipelines(startupEventInfo, triggeringSpan) {
|
|
174
|
+
const config = getConfig();
|
|
175
|
+
let hasUserProvider = isApitallySpanProcessorDeclared();
|
|
176
|
+
const { env, resource } = resolveEnvAndCreateResource(hasUserProvider, triggeringSpan?.resource);
|
|
177
|
+
const instanceId = resource.attributes["service.instance.id"];
|
|
178
|
+
const spool = activationFactories.createSpool();
|
|
179
|
+
const spanExporter = new ApitallySpanExporter({
|
|
180
|
+
redaction: new Redaction(),
|
|
181
|
+
env,
|
|
182
|
+
instanceId,
|
|
183
|
+
spool,
|
|
184
|
+
maskRequestBody: config.maskRequestBody,
|
|
185
|
+
maskResponseBody: config.maskResponseBody
|
|
186
|
+
});
|
|
187
|
+
const batchSpanProcessor = new BatchSpanProcessor(spanExporter, {
|
|
188
|
+
scheduledDelayMillis: BATCH_SCHEDULE_DELAY_MILLIS,
|
|
189
|
+
exportTimeoutMillis: BATCH_EXPORT_TIMEOUT_MILLIS,
|
|
190
|
+
maxQueueSize: BATCH_MAX_QUEUE_SIZE,
|
|
191
|
+
maxExportBatchSize: config.captureRequestBody || config.captureResponseBody ? BATCH_MAX_EXPORT_BATCH_SIZE_WITH_BODY_CAPTURE : BATCH_MAX_EXPORT_BATCH_SIZE
|
|
192
|
+
});
|
|
193
|
+
const spanPipeline = new SpanPipeline(batchSpanProcessor);
|
|
194
|
+
let tracerProvider;
|
|
195
|
+
if (!hasUserProvider) {
|
|
196
|
+
tracerProvider = setupTracerProvider(resource, [spanPipeline]);
|
|
197
|
+
if (!tracerProvider) {
|
|
198
|
+
hasUserProvider = true;
|
|
199
|
+
logWarning(
|
|
200
|
+
"Apitally could not register its OpenTelemetry tracer provider because another provider is already registered. Only metrics and the startup event are sent to Apitally until you add ApitallySpanProcessor (exported by the apitally package) to your tracer provider's spanProcessors constructor option or the NodeSDK spanProcessors option."
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
setActiveSpanPipeline(spanPipeline);
|
|
205
|
+
const batchLogProcessor = new BatchLogRecordProcessor({
|
|
206
|
+
exporter: new ApitallyLogRecordExporter(spool),
|
|
207
|
+
scheduledDelayMillis: BATCH_SCHEDULE_DELAY_MILLIS,
|
|
208
|
+
exportTimeoutMillis: BATCH_EXPORT_TIMEOUT_MILLIS,
|
|
209
|
+
maxQueueSize: BATCH_MAX_QUEUE_SIZE,
|
|
210
|
+
maxExportBatchSize: BATCH_MAX_EXPORT_BATCH_SIZE
|
|
211
|
+
});
|
|
212
|
+
const logRecordProcessor = new ApitallyLogRecordProcessor(
|
|
213
|
+
batchLogProcessor,
|
|
214
|
+
spanPipeline,
|
|
215
|
+
config.maskLogRecord
|
|
216
|
+
);
|
|
217
|
+
const loggerProvider = createLoggerProvider(resource, [logRecordProcessor]);
|
|
218
|
+
const metricsPipeline = new MetricsPipeline(resource, spool);
|
|
219
|
+
spanPipeline.metricsRecorder = (record) => metricsPipeline.recordFromRequest(record);
|
|
220
|
+
const worker = activationFactories.createExportWorker({
|
|
221
|
+
spool,
|
|
222
|
+
otlpEndpoint: config.otlpEndpoint,
|
|
223
|
+
writeToken: config.writeToken,
|
|
224
|
+
env
|
|
225
|
+
});
|
|
226
|
+
worker.flushCallbacks.push(
|
|
227
|
+
() => metricsPipeline.collectAndExport(),
|
|
228
|
+
() => batchSpanProcessor.forceFlush(),
|
|
229
|
+
() => emitErrorEvents(loggerProvider),
|
|
230
|
+
() => batchLogProcessor.forceFlush()
|
|
231
|
+
);
|
|
232
|
+
if (config.captureLogs) {
|
|
233
|
+
installConsoleCapture(loggerProvider);
|
|
234
|
+
installNestLoggerCapture(loggerProvider);
|
|
235
|
+
installWinstonCapture(loggerProvider);
|
|
236
|
+
installPinoCapture(loggerProvider);
|
|
237
|
+
}
|
|
238
|
+
installSentryEventIdRecording();
|
|
239
|
+
let undiciInstrumentation;
|
|
240
|
+
if (!hasUserProvider) {
|
|
241
|
+
undiciInstrumentation = createUndiciInstrumentation(config.otlpEndpoint);
|
|
242
|
+
}
|
|
243
|
+
worker.start();
|
|
244
|
+
if (startupEventInfo) {
|
|
245
|
+
emitStartupEvent(loggerProvider, startupEventInfo);
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
spanPipeline,
|
|
249
|
+
tracerProvider,
|
|
250
|
+
loggerProvider,
|
|
251
|
+
metricsPipeline,
|
|
252
|
+
spool,
|
|
253
|
+
worker,
|
|
254
|
+
undiciInstrumentation
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
function createUndiciInstrumentation(otlpEndpoint) {
|
|
258
|
+
const endpointOrigin = new URL(otlpEndpoint).origin;
|
|
259
|
+
return new UndiciInstrumentation({
|
|
260
|
+
ignoreRequestHook: (request) => {
|
|
261
|
+
try {
|
|
262
|
+
return new URL(String(request.origin)).origin === endpointOrigin;
|
|
263
|
+
} catch {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
async function drainAndStop(handles) {
|
|
270
|
+
try {
|
|
271
|
+
await handles.spanPipeline.shutdown();
|
|
272
|
+
await handles.worker.finalDrain();
|
|
273
|
+
await handles.loggerProvider.shutdown();
|
|
274
|
+
await handles.worker.stop();
|
|
275
|
+
} catch (error) {
|
|
276
|
+
logWarning(`Error draining telemetry on shutdown: ${String(error)}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
function installSignalHooks(activationState) {
|
|
280
|
+
if (process.platform === "win32" || !isMainThread) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
let listeners;
|
|
284
|
+
listeners = {
|
|
285
|
+
SIGTERM: () => handleTerminationSignal(activationState, listeners, "SIGTERM"),
|
|
286
|
+
SIGINT: () => handleTerminationSignal(activationState, listeners, "SIGINT")
|
|
287
|
+
};
|
|
288
|
+
activationState.signalListeners = listeners;
|
|
289
|
+
try {
|
|
290
|
+
process.prependOnceListener("SIGTERM", listeners.SIGTERM);
|
|
291
|
+
process.prependOnceListener("SIGINT", listeners.SIGINT);
|
|
292
|
+
} catch (error) {
|
|
293
|
+
removeSignalHooks(activationState, listeners);
|
|
294
|
+
logWarning(`Unable to install Apitally signal handlers: ${String(error)}`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function handleTerminationSignal(activationState, listeners, signal) {
|
|
298
|
+
const hasApplicationListener = process.listeners(signal).some((listener) => listener !== listeners[signal]);
|
|
299
|
+
removeSignalHooks(activationState, listeners);
|
|
300
|
+
const drainPromise = flushAfterTerminationSignal(activationState, signal, hasApplicationListener);
|
|
301
|
+
activationState.signalDrainPromise = drainPromise;
|
|
302
|
+
void drainPromise.catch((error) => {
|
|
303
|
+
logDebug(`Error flushing telemetry on ${signal}: ${String(error)}`);
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
async function flushAfterTerminationSignal(activationState, signal, hasApplicationListener) {
|
|
307
|
+
const handles = activationState.handles;
|
|
308
|
+
if (!handles) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
try {
|
|
312
|
+
if (activationState.shutdownPromise) {
|
|
313
|
+
await waitForSignalDeadline(activationState.shutdownPromise);
|
|
314
|
+
} else {
|
|
315
|
+
await handles.worker.finalDrain(SIGNAL_FLUSH_TIMEOUT_MILLIS);
|
|
316
|
+
}
|
|
317
|
+
} catch (error) {
|
|
318
|
+
logDebug(`Error flushing telemetry on ${signal}: ${String(error)}`);
|
|
319
|
+
}
|
|
320
|
+
if (hasApplicationListener || process.listeners(signal).length > 0) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
const exitCode = signal === "SIGTERM" ? 143 : 130;
|
|
324
|
+
if (process.platform === "linux" && process.pid === 1) {
|
|
325
|
+
process.exit(exitCode);
|
|
326
|
+
}
|
|
327
|
+
try {
|
|
328
|
+
process.kill(process.pid, signal);
|
|
329
|
+
} catch {
|
|
330
|
+
process.exit(exitCode);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async function waitForSignalDeadline(promise) {
|
|
334
|
+
let deadlineTimer;
|
|
335
|
+
const deadlineReached = new Promise((resolve) => {
|
|
336
|
+
deadlineTimer = setTimeout(resolve, SIGNAL_FLUSH_TIMEOUT_MILLIS);
|
|
337
|
+
});
|
|
338
|
+
try {
|
|
339
|
+
await Promise.race([promise, deadlineReached]);
|
|
340
|
+
} finally {
|
|
341
|
+
if (deadlineTimer) {
|
|
342
|
+
clearTimeout(deadlineTimer);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
function removeSignalHooks(activationState, listeners = activationState.signalListeners) {
|
|
347
|
+
if (!listeners) {
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
process.removeListener("SIGTERM", listeners.SIGTERM);
|
|
351
|
+
process.removeListener("SIGINT", listeners.SIGINT);
|
|
352
|
+
if (activationState.signalListeners === listeners) {
|
|
353
|
+
activationState.signalListeners = void 0;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function removeLifecycleHooks(activationState) {
|
|
357
|
+
removeSignalHooks(activationState);
|
|
358
|
+
if (activationState.beforeExitListener) {
|
|
359
|
+
process.removeListener("beforeExit", activationState.beforeExitListener);
|
|
360
|
+
activationState.beforeExitListener = void 0;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
function installBeforeExitHook(activationState) {
|
|
364
|
+
const listener = () => {
|
|
365
|
+
void shutdown().catch((error) => {
|
|
366
|
+
logDebug(`Error draining telemetry on shutdown: ${String(error)}`);
|
|
367
|
+
});
|
|
368
|
+
};
|
|
369
|
+
activationState.beforeExitListener = listener;
|
|
370
|
+
process.on("beforeExit", listener);
|
|
371
|
+
}
|
|
372
|
+
export {
|
|
373
|
+
activate,
|
|
374
|
+
activationFactories,
|
|
375
|
+
configure,
|
|
376
|
+
flushTelemetry,
|
|
377
|
+
getActivationHandles,
|
|
378
|
+
isActivated,
|
|
379
|
+
registerStartupEventInfo,
|
|
380
|
+
resetActivation,
|
|
381
|
+
shutdown
|
|
382
|
+
};
|
|
383
|
+
//# sourceMappingURL=activation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/activation.ts"],"sourcesContent":["import { isMainThread } from \"node:worker_threads\";\nimport { ROOT_CONTEXT } from \"@opentelemetry/api\";\nimport type { AnyValueMap } from \"@opentelemetry/api-logs\";\nimport { UndiciInstrumentation } from \"@opentelemetry/instrumentation-undici\";\nimport { BatchLogRecordProcessor, type LoggerProvider } from \"@opentelemetry/sdk-logs\";\nimport { BatchSpanProcessor, type Span } from \"@opentelemetry/sdk-trace-base\";\nimport type { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport {\n type ApitallyConfig,\n type ApitallyOptions,\n getConfig,\n isApitallyDisabledViaEnv,\n setConfig,\n} from \"./config.js\";\nimport { ExportWorker, type ExportWorkerOptions } from \"./exportWorker.js\";\nimport {\n installConsoleCapture,\n installNestLoggerCapture,\n installPinoCapture,\n installWinstonCapture,\n} from \"./logCapture.js\";\nimport { logDebug, logError, logWarning } from \"./logger.js\";\nimport { ApitallyLogRecordExporter } from \"./logRecordExporter.js\";\nimport { ApitallyLogRecordProcessor } from \"./logRecordProcessor.js\";\nimport { MetricsPipeline } from \"./metrics.js\";\nimport { getDistroVersion } from \"./packageVersion.js\";\nimport {\n createLoggerProvider,\n resolveEnvAndCreateResource,\n setupTracerProvider,\n} from \"./providers.js\";\nimport { Redaction } from \"./redaction.js\";\nimport { installSentryEventIdRecording } from \"./sentry.js\";\nimport { drainServerErrors, resetServerErrors, SERVER_ERROR_EVENT_NAME } from \"./serverErrors.js\";\nimport { ApitallySpanExporter } from \"./spanExporter.js\";\nimport {\n isApitallySpanProcessorDeclared,\n SpanPipeline,\n setActiveSpanPipeline,\n setServerSpanActivationCallback,\n} from \"./spanProcessor.js\";\nimport { Spool } from \"./spool.js\";\nimport { emitStartupEvent, type StartupEventInfo } from \"./startup.js\";\nimport {\n drainValidationErrors,\n resetValidationErrors,\n VALIDATION_ERROR_EVENT_NAME,\n} from \"./validationErrors.js\";\n\n// The worker sends every 15 seconds, so batches only need to reach the spool\n// within that interval.\nconst BATCH_SCHEDULE_DELAY_MILLIS = 1_000;\nconst BATCH_EXPORT_TIMEOUT_MILLIS = 30_000;\nconst BATCH_MAX_QUEUE_SIZE = 2_048;\nconst BATCH_MAX_EXPORT_BATCH_SIZE = 512;\nconst BATCH_MAX_EXPORT_BATCH_SIZE_WITH_BODY_CAPTURE = 32;\nconst SIGNAL_FLUSH_TIMEOUT_MILLIS = 5_000;\n\ntype TerminationSignal = \"SIGTERM\" | \"SIGINT\";\ntype SignalListeners = Record<TerminationSignal, () => void>;\n\n// The ESM and CJS builds can load together, so a Symbol.for key gives both\n// copies the same activation state.\nconst ACTIVATION_STATE_KEY = Symbol.for(\"apitally.activation\");\n\ninterface ActivationState {\n sdkVersion: string;\n activationAttempted: boolean;\n startupEventInfo?: StartupEventInfo;\n handles?: ActivationHandles;\n runShutdown?: () => Promise<void>;\n shutdownPromise?: Promise<void>;\n beforeExitListener?: () => void;\n signalListeners?: SignalListeners;\n signalDrainPromise?: Promise<void>;\n}\n\ninterface ActivationHandles {\n spanPipeline: SpanPipeline;\n tracerProvider?: NodeTracerProvider;\n loggerProvider: LoggerProvider;\n metricsPipeline: MetricsPipeline;\n spool: Spool;\n worker: ExportWorker;\n undiciInstrumentation?: UndiciInstrumentation;\n}\n\n// Configuration stays synchronous; activate() defers timers and I/O.\nexport function configure(options: ApitallyOptions = {}): ApitallyConfig {\n const config = setConfig(options);\n // User instrumentations read this at initialization. `http/dup` adds stable\n // HTTP attributes alongside legacy ones; a user-set value takes precedence.\n if (!config.disabled && process.env.OTEL_SEMCONV_STABILITY_OPT_IN === undefined) {\n process.env.OTEL_SEMCONV_STABILITY_OPT_IN = \"http/dup\";\n }\n setServerSpanActivationCallback(activate);\n return config;\n}\n\n// The first integration registration wins so one process emits one startup event.\nexport function registerStartupEventInfo(info: StartupEventInfo): void {\n const activationState = getActivationState();\n activationState.startupEventInfo ??= info;\n}\n\n// Activation is synchronous and attempted once, so concurrent first requests\n// observe either no activation or completed activation.\nexport function activate(triggeringSpan?: Span): void {\n const activationState = getActivationState();\n if (activationState.activationAttempted) {\n return;\n }\n activationState.activationAttempted = true;\n if (shouldSkipActivation()) {\n return;\n }\n try {\n const handles = startPipelines(activationState.startupEventInfo, triggeringSpan);\n activationState.handles = handles;\n activationState.runShutdown = () => drainAndStop(handles);\n installBeforeExitHook(activationState);\n installSignalHooks(activationState);\n } catch (error) {\n logError(`Apitally activation failed: ${String(error)}`);\n }\n}\n\nexport function isActivated(): boolean {\n return getActivationState().handles !== undefined;\n}\n\nexport function getActivationHandles(): ActivationHandles | undefined {\n return getActivationState().handles;\n}\n\nexport async function flushTelemetry(): Promise<void> {\n try {\n await getActivationState().handles?.worker.runCycle();\n } catch (error) {\n logDebug(`Error flushing telemetry: ${String(error)}`);\n }\n}\n\n// Concurrent calls and lifecycle hooks share one final drain; calls before\n// activation are no-ops.\nexport function shutdown(): Promise<void> {\n const activationState = getActivationState();\n const handles = activationState.handles;\n const runShutdown = activationState.runShutdown;\n if (!handles || !runShutdown) {\n return Promise.resolve();\n }\n if (!activationState.shutdownPromise) {\n removeLifecycleHooks(activationState);\n const signalDrainPromise = activationState.signalDrainPromise;\n activationState.shutdownPromise = (\n signalDrainPromise\n ? signalDrainPromise.then(() => handles.worker.waitForIdle())\n : Promise.resolve()\n ).then(runShutdown);\n }\n return activationState.shutdownPromise;\n}\n\n// Tests replace these factories to isolate spool files and worker timing.\nexport const activationFactories = {\n createSpool: (): Spool => new Spool(),\n createExportWorker: (options: ExportWorkerOptions): ExportWorker => new ExportWorker(options),\n};\nconst defaultFactories = { ...activationFactories };\n\n// Tests reset process-global activation and its side effects between cases.\nexport async function resetActivation(): Promise<void> {\n Object.assign(activationFactories, defaultFactories);\n const holder = globalThis as Record<symbol, ActivationState | undefined>;\n const activationState = holder[ACTIVATION_STATE_KEY];\n delete holder[ACTIVATION_STATE_KEY];\n hasWarnedAboutVersionSkew = false;\n resetValidationErrors();\n resetServerErrors();\n if (!activationState) {\n return;\n }\n removeLifecycleHooks(activationState);\n const handles = activationState.handles;\n if (!handles) {\n return;\n }\n handles.undiciInstrumentation?.disable();\n await handles.worker.stop();\n await handles.spanPipeline.shutdown();\n await handles.loggerProvider.shutdown();\n await handles.spool.clear();\n}\n\nlet hasWarnedAboutVersionSkew = false;\n\n// One root-context record per aggregate group, drained right before the log\n// processor flush so the records leave with the same export cycle.\nfunction emitErrorEvents(loggerProvider: LoggerProvider): void {\n const logger = loggerProvider.getLogger(\"apitally\");\n const events: [string, AnyValueMap[]][] = [\n [VALIDATION_ERROR_EVENT_NAME, drainValidationErrors()],\n [SERVER_ERROR_EVENT_NAME, drainServerErrors()],\n ];\n for (const [eventName, bodies] of events) {\n for (const body of bodies) {\n logger.emit({ timestamp: Date.now(), context: ROOT_CONTEXT, eventName, body });\n }\n }\n}\n\nfunction getActivationState(): ActivationState {\n const holder = globalThis as Record<symbol, ActivationState | undefined>;\n const existing = holder[ACTIVATION_STATE_KEY];\n if (existing) {\n if (!hasWarnedAboutVersionSkew && existing.sdkVersion !== getDistroVersion()) {\n hasWarnedAboutVersionSkew = true;\n logWarning(\n `Two copies of the apitally package with different versions (${existing.sdkVersion} and ${getDistroVersion()}) are loaded in this process; version ${existing.sdkVersion} stays active. To resolve this, deduplicate the apitally installation.`,\n );\n }\n return existing;\n }\n const activationState: ActivationState = {\n sdkVersion: getDistroVersion(),\n activationAttempted: false,\n };\n holder[ACTIVATION_STATE_KEY] = activationState;\n return activationState;\n}\n\nfunction shouldSkipActivation(): boolean {\n return (\n Boolean(process.env.JEST_WORKER_ID) ||\n Boolean(process.env.VITEST) ||\n process.env.NODE_ENV === \"test\" ||\n // The emergency kill switch overrides an explicit disabled: false option.\n isApitallyDisabledViaEnv() ||\n getConfig().disabled\n );\n}\n\nfunction startPipelines(\n startupEventInfo: StartupEventInfo | undefined,\n triggeringSpan?: Span,\n): ActivationHandles {\n const config = getConfig();\n let hasUserProvider = isApitallySpanProcessorDeclared();\n const { env, resource } = resolveEnvAndCreateResource(hasUserProvider, triggeringSpan?.resource);\n const instanceId = resource.attributes[\"service.instance.id\"] as string;\n const spool = activationFactories.createSpool();\n const spanExporter = new ApitallySpanExporter({\n redaction: new Redaction(),\n env,\n instanceId,\n spool,\n maskRequestBody: config.maskRequestBody,\n maskResponseBody: config.maskResponseBody,\n });\n // Concrete options prevent OTel environment variables from changing batch\n // behavior. Each processor gets a fresh object because its config is mutated.\n const batchSpanProcessor = new BatchSpanProcessor(spanExporter, {\n scheduledDelayMillis: BATCH_SCHEDULE_DELAY_MILLIS,\n exportTimeoutMillis: BATCH_EXPORT_TIMEOUT_MILLIS,\n maxQueueSize: BATCH_MAX_QUEUE_SIZE,\n maxExportBatchSize:\n config.captureRequestBody || config.captureResponseBody\n ? BATCH_MAX_EXPORT_BATCH_SIZE_WITH_BODY_CAPTURE\n : BATCH_MAX_EXPORT_BATCH_SIZE,\n });\n const spanPipeline = new SpanPipeline(batchSpanProcessor);\n let tracerProvider: NodeTracerProvider | undefined;\n if (!hasUserProvider) {\n tracerProvider = setupTracerProvider(resource, [spanPipeline]);\n if (!tracerProvider) {\n hasUserProvider = true;\n logWarning(\n \"Apitally could not register its OpenTelemetry tracer provider because another provider is already registered. Only metrics and the startup event are sent to Apitally until you add ApitallySpanProcessor (exported by the apitally package) to your tracer provider's spanProcessors constructor option or the NodeSDK spanProcessors option.\",\n );\n }\n }\n setActiveSpanPipeline(spanPipeline);\n // BatchLogRecordProcessor requires its single-options-object form; positional\n // arguments create a broken processor.\n const batchLogProcessor = new BatchLogRecordProcessor({\n exporter: new ApitallyLogRecordExporter(spool),\n scheduledDelayMillis: BATCH_SCHEDULE_DELAY_MILLIS,\n exportTimeoutMillis: BATCH_EXPORT_TIMEOUT_MILLIS,\n maxQueueSize: BATCH_MAX_QUEUE_SIZE,\n maxExportBatchSize: BATCH_MAX_EXPORT_BATCH_SIZE,\n });\n const logRecordProcessor = new ApitallyLogRecordProcessor(\n batchLogProcessor,\n spanPipeline,\n config.maskLogRecord,\n );\n const loggerProvider = createLoggerProvider(resource, [logRecordProcessor]);\n const metricsPipeline = new MetricsPipeline(resource, spool);\n spanPipeline.metricsRecorder = (record) => metricsPipeline.recordFromRequest(record);\n const worker = activationFactories.createExportWorker({\n spool,\n otlpEndpoint: config.otlpEndpoint,\n writeToken: config.writeToken,\n env,\n });\n worker.flushCallbacks.push(\n () => metricsPipeline.collectAndExport(),\n () => batchSpanProcessor.forceFlush(),\n () => emitErrorEvents(loggerProvider),\n () => batchLogProcessor.forceFlush(),\n );\n if (config.captureLogs) {\n installConsoleCapture(loggerProvider);\n installNestLoggerCapture(loggerProvider);\n installWinstonCapture(loggerProvider);\n installPinoCapture(loggerProvider);\n }\n installSentryEventIdRecording();\n let undiciInstrumentation: UndiciInstrumentation | undefined;\n if (!hasUserProvider) {\n undiciInstrumentation = createUndiciInstrumentation(config.otlpEndpoint);\n }\n worker.start();\n if (startupEventInfo) {\n emitStartupEvent(loggerProvider, startupEventInfo);\n }\n return {\n spanPipeline,\n tracerProvider,\n loggerProvider,\n metricsPipeline,\n spool,\n worker,\n undiciInstrumentation,\n };\n}\n\n// ignoreRequestHook prevents telemetry for export POSTs. The request origin can\n// be a string or URL at runtime despite its string type.\nfunction createUndiciInstrumentation(otlpEndpoint: string): UndiciInstrumentation {\n const endpointOrigin = new URL(otlpEndpoint).origin;\n return new UndiciInstrumentation({\n ignoreRequestHook: (request) => {\n try {\n return new URL(String(request.origin)).origin === endpointOrigin;\n } catch {\n return false;\n }\n },\n });\n}\n\nasync function drainAndStop(handles: ActivationHandles): Promise<void> {\n try {\n await handles.spanPipeline.shutdown();\n await handles.worker.finalDrain();\n await handles.loggerProvider.shutdown();\n await handles.worker.stop();\n } catch (error) {\n logWarning(`Error draining telemetry on shutdown: ${String(error)}`);\n }\n}\n\nfunction installSignalHooks(activationState: ActivationState): void {\n if (process.platform === \"win32\" || !isMainThread) {\n return;\n }\n let listeners: SignalListeners;\n listeners = {\n SIGTERM: () => handleTerminationSignal(activationState, listeners, \"SIGTERM\"),\n SIGINT: () => handleTerminationSignal(activationState, listeners, \"SIGINT\"),\n };\n activationState.signalListeners = listeners;\n try {\n process.prependOnceListener(\"SIGTERM\", listeners.SIGTERM);\n process.prependOnceListener(\"SIGINT\", listeners.SIGINT);\n } catch (error) {\n removeSignalHooks(activationState, listeners);\n logWarning(`Unable to install Apitally signal handlers: ${String(error)}`);\n }\n}\n\nfunction handleTerminationSignal(\n activationState: ActivationState,\n listeners: SignalListeners,\n signal: TerminationSignal,\n): void {\n const hasApplicationListener = process\n .listeners(signal)\n .some((listener) => listener !== listeners[signal]);\n removeSignalHooks(activationState, listeners);\n const drainPromise = flushAfterTerminationSignal(activationState, signal, hasApplicationListener);\n activationState.signalDrainPromise = drainPromise;\n void drainPromise.catch((error: unknown) => {\n logDebug(`Error flushing telemetry on ${signal}: ${String(error)}`);\n });\n}\n\nasync function flushAfterTerminationSignal(\n activationState: ActivationState,\n signal: TerminationSignal,\n hasApplicationListener: boolean,\n): Promise<void> {\n const handles = activationState.handles;\n if (!handles) {\n return;\n }\n try {\n if (activationState.shutdownPromise) {\n await waitForSignalDeadline(activationState.shutdownPromise);\n } else {\n await handles.worker.finalDrain(SIGNAL_FLUSH_TIMEOUT_MILLIS);\n }\n } catch (error) {\n logDebug(`Error flushing telemetry on ${signal}: ${String(error)}`);\n }\n if (hasApplicationListener || process.listeners(signal).length > 0) {\n return;\n }\n const exitCode = signal === \"SIGTERM\" ? 143 : 130;\n if (process.platform === \"linux\" && process.pid === 1) {\n process.exit(exitCode);\n }\n try {\n process.kill(process.pid, signal);\n } catch {\n process.exit(exitCode);\n }\n}\n\nasync function waitForSignalDeadline(promise: Promise<void>): Promise<void> {\n let deadlineTimer: NodeJS.Timeout | undefined;\n const deadlineReached = new Promise<void>((resolve) => {\n deadlineTimer = setTimeout(resolve, SIGNAL_FLUSH_TIMEOUT_MILLIS);\n });\n try {\n await Promise.race([promise, deadlineReached]);\n } finally {\n if (deadlineTimer) {\n clearTimeout(deadlineTimer);\n }\n }\n}\n\nfunction removeSignalHooks(\n activationState: ActivationState,\n listeners = activationState.signalListeners,\n): void {\n if (!listeners) {\n return;\n }\n process.removeListener(\"SIGTERM\", listeners.SIGTERM);\n process.removeListener(\"SIGINT\", listeners.SIGINT);\n if (activationState.signalListeners === listeners) {\n activationState.signalListeners = undefined;\n }\n}\n\nfunction removeLifecycleHooks(activationState: ActivationState): void {\n removeSignalHooks(activationState);\n if (activationState.beforeExitListener) {\n process.removeListener(\"beforeExit\", activationState.beforeExitListener);\n activationState.beforeExitListener = undefined;\n }\n}\n\nfunction installBeforeExitHook(activationState: ActivationState): void {\n const listener = () => {\n // The drain keeps the event loop alive until shutdown settles.\n void shutdown().catch((error: unknown) => {\n logDebug(`Error draining telemetry on shutdown: ${String(error)}`);\n });\n };\n activationState.beforeExitListener = listener;\n process.on(\"beforeExit\", listener);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,6 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
6
|
var __export = (target, all) => {
|
|
8
7
|
for (var name in all)
|
|
9
8
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -22,56 +21,113 @@ __export(configure_exports, {
|
|
|
22
21
|
configure: () => configure
|
|
23
22
|
});
|
|
24
23
|
module.exports = __toCommonJS(configure_exports);
|
|
25
|
-
|
|
24
|
+
var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
|
|
25
|
+
var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
|
|
26
26
|
var import_node_url = require("node:url");
|
|
27
|
-
var
|
|
28
|
-
const STUBS_ROOT = (0, import_node_url.fileURLToPath)(new URL("./stubs/",
|
|
27
|
+
var import_config = require('../config.cjs');
|
|
28
|
+
const STUBS_ROOT = (0, import_node_url.fileURLToPath)(new URL("./stubs/", importMetaUrl));
|
|
29
|
+
const ENV_FORMAT = /^[a-z0-9-]{1,32}$/;
|
|
29
30
|
async function configure(command) {
|
|
30
|
-
const
|
|
31
|
-
result(value)
|
|
32
|
-
|
|
33
|
-
},
|
|
34
|
-
validate(value) {
|
|
35
|
-
return (0, import_paramValidation.isValidClientId)(value);
|
|
36
|
-
}
|
|
31
|
+
const writeToken = await command.prompt.ask("Apitally write token", {
|
|
32
|
+
result: (value) => value.trim(),
|
|
33
|
+
validate: (value) => (0, import_config.isValidWriteToken)(value.trim())
|
|
37
34
|
});
|
|
38
|
-
const env = await command.prompt.ask("Environment
|
|
39
|
-
default:
|
|
40
|
-
result
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
35
|
+
const env = await command.prompt.ask("Environment", {
|
|
36
|
+
default: import_config.DEFAULT_ENV,
|
|
37
|
+
result: normalizeEnv,
|
|
38
|
+
validate: (value) => ENV_FORMAT.test(normalizeEnv(value))
|
|
39
|
+
});
|
|
40
|
+
const captureRequestHeaders = await command.prompt.confirm("Capture request headers?", {
|
|
41
|
+
default: false
|
|
42
|
+
});
|
|
43
|
+
const captureRequestBody = await command.prompt.confirm("Capture request bodies?", {
|
|
44
|
+
default: false
|
|
46
45
|
});
|
|
47
|
-
const
|
|
46
|
+
const captureResponseBody = await command.prompt.confirm("Capture response bodies?", {
|
|
48
47
|
default: false
|
|
49
48
|
});
|
|
50
49
|
const codemods = await command.createCodemods();
|
|
51
50
|
await codemods.makeUsingStub(STUBS_ROOT, "config/apitally.stub", {
|
|
52
|
-
|
|
51
|
+
captureRequestHeaders,
|
|
52
|
+
captureRequestBody,
|
|
53
|
+
captureResponseBody
|
|
53
54
|
});
|
|
54
|
-
await codemods.registerMiddleware("router", [
|
|
55
|
-
{
|
|
56
|
-
path: "apitally/adonisjs/middleware"
|
|
57
|
-
}
|
|
58
|
-
]);
|
|
59
55
|
await codemods.updateRcFile((rcFile) => {
|
|
60
56
|
rcFile.addProvider("apitally/adonisjs/provider");
|
|
61
57
|
});
|
|
58
|
+
await codemods.registerMiddleware("server", [{ path: "apitally/adonisjs/middleware" }]);
|
|
62
59
|
await codemods.defineEnvVariables({
|
|
63
|
-
|
|
60
|
+
APITALLY_WRITE_TOKEN: writeToken,
|
|
64
61
|
APITALLY_ENV: env
|
|
65
62
|
});
|
|
66
63
|
await codemods.defineEnvValidations({
|
|
67
|
-
leadingComment: "Variables for configuring the apitally package",
|
|
68
64
|
variables: {
|
|
69
|
-
|
|
65
|
+
APITALLY_WRITE_TOKEN: "Env.schema.string.optional()",
|
|
70
66
|
APITALLY_ENV: "Env.schema.string.optional()"
|
|
71
67
|
}
|
|
72
68
|
});
|
|
69
|
+
await updateExceptionHandler(codemods, command);
|
|
70
|
+
}
|
|
71
|
+
function normalizeEnv(value) {
|
|
72
|
+
return value.trim().toLowerCase().replace(/[ _]/g, "-");
|
|
73
|
+
}
|
|
74
|
+
async function updateExceptionHandler(codemods, command) {
|
|
75
|
+
const project = await codemods.getTsMorphProject();
|
|
76
|
+
const handlerPath = command.app.makePath("app/exceptions/handler.ts");
|
|
77
|
+
const sourceFile = project?.getSourceFile(handlerPath) ?? project?.addSourceFileAtPathIfExists(handlerPath);
|
|
78
|
+
const handlerClass = sourceFile?.getClasses().find((candidate) => candidate.isDefaultExport());
|
|
79
|
+
const method = handlerClass?.getMethod("handle");
|
|
80
|
+
if (method) {
|
|
81
|
+
const alreadyConfigured = method.getDescendants().some((node) => {
|
|
82
|
+
if (node.getKindName() !== "CallExpression") {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const call = node;
|
|
86
|
+
return call.getExpression().getText() === "captureException" && call.getArguments().length === 2;
|
|
87
|
+
});
|
|
88
|
+
if (alreadyConfigured) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const parameters = method.getParameters();
|
|
92
|
+
const statements = method.getStatements();
|
|
93
|
+
const statement = statements[0];
|
|
94
|
+
if (method.isAsync() && parameters.length >= 2 && statements.length === 1 && statement?.getKindName() === "ReturnStatement") {
|
|
95
|
+
const returnExpression = statement.getExpression();
|
|
96
|
+
const errorName = parameters[0].getName();
|
|
97
|
+
const contextName = parameters[1].getName();
|
|
98
|
+
if (returnExpression?.getKindName() === "CallExpression" && returnExpression.getExpression().getText() === "super.handle" && returnExpression.getArguments().map((argument) => argument.getText()).join(",") === `${errorName},${contextName}`) {
|
|
99
|
+
const importDeclaration = sourceFile?.getImportDeclaration(
|
|
100
|
+
(candidate) => candidate.getModuleSpecifierValue() === "apitally/adonisjs"
|
|
101
|
+
);
|
|
102
|
+
if (importDeclaration) {
|
|
103
|
+
if (!importDeclaration.getNamedImports().some(
|
|
104
|
+
(namedImport) => namedImport.getName() === "captureException"
|
|
105
|
+
)) {
|
|
106
|
+
importDeclaration.addNamedImport("captureException");
|
|
107
|
+
}
|
|
108
|
+
} else {
|
|
109
|
+
sourceFile?.addImportDeclaration({
|
|
110
|
+
moduleSpecifier: "apitally/adonisjs",
|
|
111
|
+
namedImports: ["captureException"]
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
method.setBodyText(
|
|
115
|
+
`const result = await super.handle(${errorName}, ${contextName})
|
|
116
|
+
captureException(${errorName}, ${contextName})
|
|
117
|
+
return result`
|
|
118
|
+
);
|
|
119
|
+
await sourceFile?.save();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
command.logger.warning(
|
|
125
|
+
'Could not update "app/exceptions/handler.ts" automatically. Add the following import and method:'
|
|
126
|
+
);
|
|
127
|
+
command.logger.info(
|
|
128
|
+
'import { captureException } from "apitally/adonisjs"\n\nasync handle(error: unknown, ctx: HttpContext) {\n const result = await super.handle(error, ctx)\n captureException(error, ctx)\n return result\n}'
|
|
129
|
+
);
|
|
73
130
|
}
|
|
74
|
-
__name(configure, "configure");
|
|
75
131
|
// Annotate the CommonJS export names for ESM import in node:
|
|
76
132
|
0 && (module.exports = {
|
|
77
133
|
configure
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adonisjs/configure.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/adonisjs/configure.ts","../../node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\n\nimport type Configure from \"@adonisjs/core/commands/configure\";\n\nimport { DEFAULT_ENV, isValidWriteToken } from \"../config.js\";\n\nconst STUBS_ROOT = fileURLToPath(new URL(\"./stubs/\", import.meta.url));\nconst ENV_FORMAT = /^[a-z0-9-]{1,32}$/;\n\nexport async function configure(command: Configure): Promise<void> {\n const writeToken = await command.prompt.ask(\"Apitally write token\", {\n result: (value) => value.trim(),\n validate: (value) => isValidWriteToken(value.trim()),\n });\n const env = await command.prompt.ask(\"Environment\", {\n default: DEFAULT_ENV,\n result: normalizeEnv,\n validate: (value) => ENV_FORMAT.test(normalizeEnv(value)),\n });\n const captureRequestHeaders = await command.prompt.confirm(\"Capture request headers?\", {\n default: false,\n });\n const captureRequestBody = await command.prompt.confirm(\"Capture request bodies?\", {\n default: false,\n });\n const captureResponseBody = await command.prompt.confirm(\"Capture response bodies?\", {\n default: false,\n });\n\n const codemods = await command.createCodemods();\n await codemods.makeUsingStub(STUBS_ROOT, \"config/apitally.stub\", {\n captureRequestHeaders,\n captureRequestBody,\n captureResponseBody,\n });\n await codemods.updateRcFile((rcFile) => {\n rcFile.addProvider(\"apitally/adonisjs/provider\");\n });\n await codemods.registerMiddleware(\"server\", [{ path: \"apitally/adonisjs/middleware\" }]);\n await codemods.defineEnvVariables({\n APITALLY_WRITE_TOKEN: writeToken,\n APITALLY_ENV: env,\n });\n await codemods.defineEnvValidations({\n variables: {\n APITALLY_WRITE_TOKEN: \"Env.schema.string.optional()\",\n APITALLY_ENV: \"Env.schema.string.optional()\",\n },\n });\n await updateExceptionHandler(codemods, command);\n}\n\nfunction normalizeEnv(value: string): string {\n return value.trim().toLowerCase().replace(/[ _]/g, \"-\");\n}\n\nasync function updateExceptionHandler(\n codemods: Awaited<ReturnType<Configure[\"createCodemods\"]>>,\n command: Configure,\n): Promise<void> {\n const project = await codemods.getTsMorphProject();\n const handlerPath = command.app.makePath(\"app/exceptions/handler.ts\");\n const sourceFile =\n project?.getSourceFile(handlerPath) ?? project?.addSourceFileAtPathIfExists(handlerPath);\n const handlerClass = sourceFile\n ?.getClasses()\n .find((candidate: { isDefaultExport: () => boolean }) => candidate.isDefaultExport());\n const method = handlerClass?.getMethod(\"handle\");\n if (method) {\n const alreadyConfigured = method\n .getDescendants()\n .some((node: { getKindName: () => string }) => {\n if (node.getKindName() !== \"CallExpression\") {\n return false;\n }\n const call = node as typeof node & {\n getArguments: () => unknown[];\n getExpression: () => { getText: () => string };\n };\n return (\n call.getExpression().getText() === \"captureException\" && call.getArguments().length === 2\n );\n });\n if (alreadyConfigured) {\n return;\n }\n\n const parameters = method.getParameters();\n const statements = method.getStatements();\n const statement = statements[0];\n if (\n method.isAsync() &&\n parameters.length >= 2 &&\n statements.length === 1 &&\n statement?.getKindName() === \"ReturnStatement\"\n ) {\n const returnExpression = (\n statement as typeof statement & {\n getExpression: () =>\n | {\n getArguments: () => Array<{ getText: () => string }>;\n getExpression: () => { getText: () => string };\n getKindName: () => string;\n }\n | undefined;\n }\n ).getExpression();\n const errorName = parameters[0].getName();\n const contextName = parameters[1].getName();\n if (\n returnExpression?.getKindName() === \"CallExpression\" &&\n returnExpression.getExpression().getText() === \"super.handle\" &&\n returnExpression\n .getArguments()\n .map((argument: { getText: () => string }) => argument.getText())\n .join(\",\") === `${errorName},${contextName}`\n ) {\n const importDeclaration = sourceFile?.getImportDeclaration(\n (candidate: { getModuleSpecifierValue: () => string }) =>\n candidate.getModuleSpecifierValue() === \"apitally/adonisjs\",\n );\n if (importDeclaration) {\n if (\n !importDeclaration\n .getNamedImports()\n .some(\n (namedImport: { getName: () => string }) =>\n namedImport.getName() === \"captureException\",\n )\n ) {\n importDeclaration.addNamedImport(\"captureException\");\n }\n } else {\n sourceFile?.addImportDeclaration({\n moduleSpecifier: \"apitally/adonisjs\",\n namedImports: [\"captureException\"],\n });\n }\n method.setBodyText(\n `const result = await super.handle(${errorName}, ${contextName})\\n` +\n `captureException(${errorName}, ${contextName})\\n` +\n `return result`,\n );\n await sourceFile?.save();\n return;\n }\n }\n }\n\n command.logger.warning(\n 'Could not update \"app/exceptions/handler.ts\" automatically. Add the following import and method:',\n );\n command.logger.info(\n 'import { captureException } from \"apitally/adonisjs\"\\n\\n' +\n \"async handle(error: unknown, ctx: HttpContext) {\\n\" +\n \" const result = await super.handle(error, ctx)\\n\" +\n \" captureException(error, ctx)\\n\" +\n \" return result\\n\" +\n \"}\",\n );\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":"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","names":[]}
|