@tracewayapp/nestjs 1.0.0 → 1.0.2

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 CHANGED
@@ -121,6 +121,17 @@ export class UsersService {
121
121
  throw error;
122
122
  }
123
123
  }
124
+
125
+ async recordMetrics() {
126
+ // Capture a simple metric
127
+ this.traceway.captureMetric("request.duration", 150);
128
+
129
+ // Capture a metric with tags
130
+ this.traceway.captureMetricWithTags("request.duration", 150, {
131
+ region: "us-east",
132
+ service: "users",
133
+ });
134
+ }
124
135
  }
125
136
  ```
126
137
 
package/dist/index.d.mts CHANGED
@@ -32,6 +32,8 @@ declare class TracewayService {
32
32
  captureException(error: Error): void;
33
33
  captureExceptionWithAttributes(error: Error, attributes?: Record<string, string>, traceId?: string): void;
34
34
  captureMessage(msg: string, attributes?: Record<string, string>): void;
35
+ captureMetric(name: string, value: number): void;
36
+ captureMetricWithTags(name: string, value: number, tags: Record<string, string>): void;
35
37
  startSpan(name: string): SpanHandle;
36
38
  endSpan(span: SpanHandle, addToContext?: boolean): void;
37
39
  measureTask(title: string, fn: () => void | Promise<void>): void;
package/dist/index.d.ts CHANGED
@@ -32,6 +32,8 @@ declare class TracewayService {
32
32
  captureException(error: Error): void;
33
33
  captureExceptionWithAttributes(error: Error, attributes?: Record<string, string>, traceId?: string): void;
34
34
  captureMessage(msg: string, attributes?: Record<string, string>): void;
35
+ captureMetric(name: string, value: number): void;
36
+ captureMetricWithTags(name: string, value: number, tags: Record<string, string>): void;
35
37
  startSpan(name: string): SpanHandle;
36
38
  endSpan(span: SpanHandle, addToContext?: boolean): void;
37
39
  measureTask(title: string, fn: () => void | Promise<void>): void;
package/dist/index.js CHANGED
@@ -72,6 +72,12 @@ var TracewayService = class {
72
72
  captureMessage(msg, attributes) {
73
73
  (0, import_backend.captureMessage)(msg, attributes);
74
74
  }
75
+ captureMetric(name, value) {
76
+ (0, import_backend.captureMetric)(name, value);
77
+ }
78
+ captureMetricWithTags(name, value, tags) {
79
+ (0, import_backend.captureMetricWithTags)(name, value, tags);
80
+ }
75
81
  startSpan(name) {
76
82
  return (0, import_backend.startSpan)(name);
77
83
  }
@@ -209,7 +215,11 @@ var TracewayMiddleware = class {
209
215
  return next();
210
216
  }
211
217
  const clientIP = this.getClientIP(req);
212
- (0, import_backend2.withTraceContext)({ endpoint: "", clientIP }, () => {
218
+ const distributedTraceId = req.headers["traceway-trace-id"];
219
+ if (distributedTraceId) {
220
+ res.setHeader("traceway-trace-id", distributedTraceId);
221
+ }
222
+ (0, import_backend2.withTraceContext)({ endpoint: "", clientIP, distributedTraceId }, () => {
213
223
  res.on("finish", () => {
214
224
  const routePath2 = req.route?.path || req.path;
215
225
  const ctx = (0, import_backend2.getTraceContext)();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/traceway.module.ts","../src/traceway.constants.ts","../src/traceway.service.ts","../src/traceway.middleware.ts","../src/traceway.filter.ts","../src/traceway.decorators.ts"],"sourcesContent":["export { TracewayModule } from \"./traceway.module.js\";\nexport { TracewayService } from \"./traceway.service.js\";\nexport { TracewayMiddleware } from \"./traceway.middleware.js\";\nexport { TracewayExceptionFilter } from \"./traceway.filter.js\";\nexport { Span } from \"./traceway.decorators.js\";\nexport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nexport type {\n TracewayModuleOptions,\n TracewayModuleAsyncOptions,\n TracewayOptionsFactory,\n ErrorRecordingField,\n} from \"./traceway.interfaces.js\";\n","import {\n DynamicModule,\n Global,\n Module,\n OnModuleDestroy,\n Provider,\n} from \"@nestjs/common\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type {\n TracewayModuleOptions,\n TracewayModuleAsyncOptions,\n TracewayOptionsFactory,\n} from \"./traceway.interfaces.js\";\nimport { TracewayService } from \"./traceway.service.js\";\n\n@Global()\n@Module({})\nexport class TracewayModule implements OnModuleDestroy {\n constructor(private readonly tracewayService: TracewayService) {}\n\n static forRoot(options: TracewayModuleOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: TRACEWAY_MODULE_OPTIONS,\n useValue: options,\n };\n\n return {\n module: TracewayModule,\n providers: [\n optionsProvider,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n static forRootAsync(options: TracewayModuleAsyncOptions): DynamicModule {\n const asyncProviders = this.createAsyncProviders(options);\n\n return {\n module: TracewayModule,\n imports: options.imports || [],\n providers: [\n ...asyncProviders,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n private static createAsyncProviders(\n options: TracewayModuleAsyncOptions,\n ): Provider[] {\n if (options.useExisting || options.useFactory) {\n return [this.createAsyncOptionsProvider(options)];\n }\n\n if (options.useClass) {\n return [\n this.createAsyncOptionsProvider(options),\n {\n provide: options.useClass,\n useClass: options.useClass,\n },\n ];\n }\n\n return [];\n }\n\n private static createAsyncOptionsProvider(\n options: TracewayModuleAsyncOptions,\n ): Provider {\n if (options.useFactory) {\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n }\n\n const inject = options.useExisting || options.useClass;\n if (!inject) {\n throw new Error(\n \"TracewayModule: useExisting, useClass, or useFactory must be provided\",\n );\n }\n\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: async (optionsFactory: TracewayOptionsFactory) =>\n optionsFactory.createTracewayOptions(),\n inject: [inject],\n };\n }\n\n async onModuleDestroy(): Promise<void> {\n await this.tracewayService.shutdownAsync();\n }\n}\n","export const TRACEWAY_MODULE_OPTIONS = \"TRACEWAY_MODULE_OPTIONS\";\n","import { Inject, Injectable } from \"@nestjs/common\";\nimport {\n init,\n shutdown,\n captureException,\n captureExceptionWithAttributes,\n captureMessage,\n startSpan,\n endSpan,\n measureTask,\n setTraceAttribute,\n setTraceAttributes,\n getTraceId,\n getTraceContext,\n withTraceContext,\n type SpanHandle,\n type TraceContextOptions,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayService {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n initialize(): void {\n init(this.options.connectionString, {\n debug: this.options.debug,\n version: this.options.version,\n serverName: this.options.serverName,\n sampleRate: this.options.sampleRate,\n errorSampleRate: this.options.errorSampleRate,\n });\n }\n\n async shutdownAsync(): Promise<void> {\n await shutdown();\n }\n\n captureException(error: Error): void {\n captureException(error);\n }\n\n captureExceptionWithAttributes(\n error: Error,\n attributes?: Record<string, string>,\n traceId?: string,\n ): void {\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n\n captureMessage(msg: string, attributes?: Record<string, string>): void {\n captureMessage(msg, attributes);\n }\n\n startSpan(name: string): SpanHandle {\n return startSpan(name);\n }\n\n endSpan(span: SpanHandle, addToContext: boolean = true): void {\n endSpan(span, addToContext);\n }\n\n measureTask(title: string, fn: () => void | Promise<void>): void {\n measureTask(title, fn);\n }\n\n setTraceAttribute(key: string, value: string): void {\n setTraceAttribute(key, value);\n }\n\n setTraceAttributes(attributes: Record<string, string>): void {\n setTraceAttributes(attributes);\n }\n\n getTraceId(): string | undefined {\n return getTraceId();\n }\n\n getTraceContext() {\n return getTraceContext();\n }\n\n withTraceContext<T>(options: TraceContextOptions, fn: () => T): T {\n return withTraceContext(options, fn);\n }\n\n getOptions(): TracewayModuleOptions {\n return this.options;\n }\n}\n","import { Inject, Injectable, NestMiddleware } from \"@nestjs/common\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport {\n withTraceContext,\n getTraceContext,\n setTraceResponseInfo,\n captureCurrentTrace,\n hasTraceContext,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayMiddleware implements NestMiddleware {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n use(req: Request, res: Response, next: NextFunction): void {\n const routePath = req.route?.path || req.path;\n\n if (this.options.ignoredRoutes?.includes(routePath) || hasTraceContext()) {\n return next();\n }\n\n const clientIP = this.getClientIP(req);\n\n withTraceContext({ endpoint: \"\", clientIP }, () => {\n res.on(\"finish\", () => {\n const routePath = req.route?.path || req.path;\n const ctx = getTraceContext();\n if (ctx) {\n ctx.endpoint = `${req.method} ${routePath}`;\n }\n const bodySize = parseInt(res.get(\"content-length\") || \"0\", 10);\n setTraceResponseInfo(res.statusCode, bodySize);\n captureCurrentTrace();\n });\n\n next();\n });\n }\n\n private getClientIP(req: Request): string {\n const forwarded = req.headers[\"x-forwarded-for\"];\n if (typeof forwarded === \"string\") {\n return forwarded.split(\",\")[0].trim();\n }\n if (Array.isArray(forwarded)) {\n return forwarded[0];\n }\n return req.ip || req.socket.remoteAddress || \"\";\n }\n}\n","import {\n Catch,\n ArgumentsHost,\n HttpException,\n HttpStatus,\n Inject,\n ExceptionFilter,\n} from \"@nestjs/common\";\nimport type { Request, Response } from \"express\";\nimport {\n captureExceptionWithAttributes,\n getTraceId,\n getTraceContext,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\nconst BODY_LIMIT = 64 * 1024;\n\n@Catch()\nexport class TracewayExceptionFilter implements ExceptionFilter {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n catch(exception: unknown, host: ArgumentsHost): void {\n const ctx = host.switchToHttp();\n const request = ctx.getRequest<Request>();\n const response = ctx.getResponse<Response>();\n\n const httpException = this.asHttpException(exception);\n const status = httpException\n ? httpException.getStatus()\n : HttpStatus.INTERNAL_SERVER_ERROR;\n\n if (status >= 500 || !httpException) {\n this.captureError(exception, request);\n }\n\n if (!response.headersSent) {\n if (httpException) {\n const body = httpException.getResponse();\n response.status(status).json(\n typeof body === \"string\" ? { statusCode: status, message: body } : body,\n );\n } else {\n response.status(status).json({\n statusCode: status,\n message: \"Internal server error\",\n });\n }\n }\n }\n\n private asHttpException(exception: unknown): HttpException | null {\n if (exception instanceof HttpException) {\n return exception;\n }\n if (\n exception !== null &&\n typeof exception === \"object\" &&\n typeof (exception as HttpException).getStatus === \"function\" &&\n typeof (exception as HttpException).getResponse === \"function\"\n ) {\n return exception as HttpException;\n }\n return null;\n }\n\n private captureError(exception: unknown, request: Request): void {\n const error =\n exception instanceof Error ? exception : new Error(String(exception));\n\n const attributes: Record<string, string> = {};\n const traceCtx = getTraceContext();\n\n if (traceCtx?.attributes) {\n Object.assign(attributes, traceCtx.attributes);\n }\n\n attributes[\"user agent\"] = request.get(\"user-agent\") || \"\";\n\n const recordingFields = this.options.onErrorRecording || [];\n\n if (recordingFields.includes(\"url\")) {\n attributes[\"url\"] = request.path;\n }\n\n if (recordingFields.includes(\"query\")) {\n const query = request.query;\n if (Object.keys(query).length > 0) {\n attributes[\"query\"] = JSON.stringify(query);\n }\n }\n\n if (recordingFields.includes(\"body\")) {\n const contentType = request.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\") && request.body) {\n const bodyStr = JSON.stringify(request.body);\n attributes[\"body\"] = bodyStr.slice(0, BODY_LIMIT);\n }\n }\n\n if (recordingFields.includes(\"headers\")) {\n const headers = { ...request.headers };\n delete headers[\"authorization\"];\n delete headers[\"cookie\"];\n attributes[\"headers\"] = JSON.stringify(headers);\n }\n\n const traceId = getTraceId();\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n}\n","import { startSpan, endSpan } from \"@tracewayapp/backend\";\n\nexport function Span(name?: string): MethodDecorator {\n return function (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ) {\n const originalMethod = descriptor.value;\n const spanName = name || String(propertyKey);\n\n descriptor.value = function (...args: unknown[]) {\n const span = startSpan(spanName);\n\n try {\n const result = originalMethod.apply(this, args);\n\n if (result && typeof result.then === \"function\") {\n return result\n .then((value: unknown) => {\n endSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n endSpan(span);\n throw error;\n });\n }\n\n endSpan(span);\n return result;\n } catch (error) {\n endSpan(span);\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n"],"mappings":"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","names":["import_common","import_common","import_backend","routePath","import_common","import_backend","import_backend"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/traceway.module.ts","../src/traceway.constants.ts","../src/traceway.service.ts","../src/traceway.middleware.ts","../src/traceway.filter.ts","../src/traceway.decorators.ts"],"sourcesContent":["export { TracewayModule } from \"./traceway.module.js\";\nexport { TracewayService } from \"./traceway.service.js\";\nexport { TracewayMiddleware } from \"./traceway.middleware.js\";\nexport { TracewayExceptionFilter } from \"./traceway.filter.js\";\nexport { Span } from \"./traceway.decorators.js\";\nexport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nexport type {\n TracewayModuleOptions,\n TracewayModuleAsyncOptions,\n TracewayOptionsFactory,\n ErrorRecordingField,\n} from \"./traceway.interfaces.js\";\n","import {\n DynamicModule,\n Global,\n Module,\n OnModuleDestroy,\n Provider,\n} from \"@nestjs/common\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type {\n TracewayModuleOptions,\n TracewayModuleAsyncOptions,\n TracewayOptionsFactory,\n} from \"./traceway.interfaces.js\";\nimport { TracewayService } from \"./traceway.service.js\";\n\n@Global()\n@Module({})\nexport class TracewayModule implements OnModuleDestroy {\n constructor(private readonly tracewayService: TracewayService) {}\n\n static forRoot(options: TracewayModuleOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: TRACEWAY_MODULE_OPTIONS,\n useValue: options,\n };\n\n return {\n module: TracewayModule,\n providers: [\n optionsProvider,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n static forRootAsync(options: TracewayModuleAsyncOptions): DynamicModule {\n const asyncProviders = this.createAsyncProviders(options);\n\n return {\n module: TracewayModule,\n imports: options.imports || [],\n providers: [\n ...asyncProviders,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n private static createAsyncProviders(\n options: TracewayModuleAsyncOptions,\n ): Provider[] {\n if (options.useExisting || options.useFactory) {\n return [this.createAsyncOptionsProvider(options)];\n }\n\n if (options.useClass) {\n return [\n this.createAsyncOptionsProvider(options),\n {\n provide: options.useClass,\n useClass: options.useClass,\n },\n ];\n }\n\n return [];\n }\n\n private static createAsyncOptionsProvider(\n options: TracewayModuleAsyncOptions,\n ): Provider {\n if (options.useFactory) {\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n }\n\n const inject = options.useExisting || options.useClass;\n if (!inject) {\n throw new Error(\n \"TracewayModule: useExisting, useClass, or useFactory must be provided\",\n );\n }\n\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: async (optionsFactory: TracewayOptionsFactory) =>\n optionsFactory.createTracewayOptions(),\n inject: [inject],\n };\n }\n\n async onModuleDestroy(): Promise<void> {\n await this.tracewayService.shutdownAsync();\n }\n}\n","export const TRACEWAY_MODULE_OPTIONS = \"TRACEWAY_MODULE_OPTIONS\";\n","import { Inject, Injectable } from \"@nestjs/common\";\nimport {\n init,\n shutdown,\n captureException,\n captureExceptionWithAttributes,\n captureMessage,\n captureMetric,\n captureMetricWithTags,\n startSpan,\n endSpan,\n measureTask,\n setTraceAttribute,\n setTraceAttributes,\n getTraceId,\n getTraceContext,\n withTraceContext,\n type SpanHandle,\n type TraceContextOptions,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayService {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n initialize(): void {\n init(this.options.connectionString, {\n debug: this.options.debug,\n version: this.options.version,\n serverName: this.options.serverName,\n sampleRate: this.options.sampleRate,\n errorSampleRate: this.options.errorSampleRate,\n });\n }\n\n async shutdownAsync(): Promise<void> {\n await shutdown();\n }\n\n captureException(error: Error): void {\n captureException(error);\n }\n\n captureExceptionWithAttributes(\n error: Error,\n attributes?: Record<string, string>,\n traceId?: string,\n ): void {\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n\n captureMessage(msg: string, attributes?: Record<string, string>): void {\n captureMessage(msg, attributes);\n }\n\n captureMetric(name: string, value: number): void {\n captureMetric(name, value);\n }\n\n captureMetricWithTags(\n name: string,\n value: number,\n tags: Record<string, string>,\n ): void {\n captureMetricWithTags(name, value, tags);\n }\n\n startSpan(name: string): SpanHandle {\n return startSpan(name);\n }\n\n endSpan(span: SpanHandle, addToContext: boolean = true): void {\n endSpan(span, addToContext);\n }\n\n measureTask(title: string, fn: () => void | Promise<void>): void {\n measureTask(title, fn);\n }\n\n setTraceAttribute(key: string, value: string): void {\n setTraceAttribute(key, value);\n }\n\n setTraceAttributes(attributes: Record<string, string>): void {\n setTraceAttributes(attributes);\n }\n\n getTraceId(): string | undefined {\n return getTraceId();\n }\n\n getTraceContext() {\n return getTraceContext();\n }\n\n withTraceContext<T>(options: TraceContextOptions, fn: () => T): T {\n return withTraceContext(options, fn);\n }\n\n getOptions(): TracewayModuleOptions {\n return this.options;\n }\n}\n","import { Inject, Injectable, NestMiddleware } from \"@nestjs/common\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport {\n withTraceContext,\n getTraceContext,\n setTraceResponseInfo,\n captureCurrentTrace,\n hasTraceContext,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayMiddleware implements NestMiddleware {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n use(req: Request, res: Response, next: NextFunction): void {\n const routePath = req.route?.path || req.path;\n\n if (this.options.ignoredRoutes?.includes(routePath) || hasTraceContext()) {\n return next();\n }\n\n const clientIP = this.getClientIP(req);\n const distributedTraceId = req.headers[\"traceway-trace-id\"] as string | undefined;\n\n if (distributedTraceId) {\n res.setHeader(\"traceway-trace-id\", distributedTraceId);\n }\n\n withTraceContext({ endpoint: \"\", clientIP, distributedTraceId }, () => {\n res.on(\"finish\", () => {\n const routePath = req.route?.path || req.path;\n const ctx = getTraceContext();\n if (ctx) {\n ctx.endpoint = `${req.method} ${routePath}`;\n }\n const bodySize = parseInt(res.get(\"content-length\") || \"0\", 10);\n setTraceResponseInfo(res.statusCode, bodySize);\n captureCurrentTrace();\n });\n\n next();\n });\n }\n\n private getClientIP(req: Request): string {\n const forwarded = req.headers[\"x-forwarded-for\"];\n if (typeof forwarded === \"string\") {\n return forwarded.split(\",\")[0].trim();\n }\n if (Array.isArray(forwarded)) {\n return forwarded[0];\n }\n return req.ip || req.socket.remoteAddress || \"\";\n }\n}\n","import {\n Catch,\n ArgumentsHost,\n HttpException,\n HttpStatus,\n Inject,\n ExceptionFilter,\n} from \"@nestjs/common\";\nimport type { Request, Response } from \"express\";\nimport {\n captureExceptionWithAttributes,\n getTraceId,\n getTraceContext,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\nconst BODY_LIMIT = 64 * 1024;\n\n@Catch()\nexport class TracewayExceptionFilter implements ExceptionFilter {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n catch(exception: unknown, host: ArgumentsHost): void {\n const ctx = host.switchToHttp();\n const request = ctx.getRequest<Request>();\n const response = ctx.getResponse<Response>();\n\n const httpException = this.asHttpException(exception);\n const status = httpException\n ? httpException.getStatus()\n : HttpStatus.INTERNAL_SERVER_ERROR;\n\n if (status >= 500 || !httpException) {\n this.captureError(exception, request);\n }\n\n if (!response.headersSent) {\n if (httpException) {\n const body = httpException.getResponse();\n response.status(status).json(\n typeof body === \"string\" ? { statusCode: status, message: body } : body,\n );\n } else {\n response.status(status).json({\n statusCode: status,\n message: \"Internal server error\",\n });\n }\n }\n }\n\n private asHttpException(exception: unknown): HttpException | null {\n if (exception instanceof HttpException) {\n return exception;\n }\n if (\n exception !== null &&\n typeof exception === \"object\" &&\n typeof (exception as HttpException).getStatus === \"function\" &&\n typeof (exception as HttpException).getResponse === \"function\"\n ) {\n return exception as HttpException;\n }\n return null;\n }\n\n private captureError(exception: unknown, request: Request): void {\n const error =\n exception instanceof Error ? exception : new Error(String(exception));\n\n const attributes: Record<string, string> = {};\n const traceCtx = getTraceContext();\n\n if (traceCtx?.attributes) {\n Object.assign(attributes, traceCtx.attributes);\n }\n\n attributes[\"user agent\"] = request.get(\"user-agent\") || \"\";\n\n const recordingFields = this.options.onErrorRecording || [];\n\n if (recordingFields.includes(\"url\")) {\n attributes[\"url\"] = request.path;\n }\n\n if (recordingFields.includes(\"query\")) {\n const query = request.query;\n if (Object.keys(query).length > 0) {\n attributes[\"query\"] = JSON.stringify(query);\n }\n }\n\n if (recordingFields.includes(\"body\")) {\n const contentType = request.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\") && request.body) {\n const bodyStr = JSON.stringify(request.body);\n attributes[\"body\"] = bodyStr.slice(0, BODY_LIMIT);\n }\n }\n\n if (recordingFields.includes(\"headers\")) {\n const headers = { ...request.headers };\n delete headers[\"authorization\"];\n delete headers[\"cookie\"];\n attributes[\"headers\"] = JSON.stringify(headers);\n }\n\n const traceId = getTraceId();\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n}\n","import { startSpan, endSpan } from \"@tracewayapp/backend\";\n\nexport function Span(name?: string): MethodDecorator {\n return function (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ) {\n const originalMethod = descriptor.value;\n const spanName = name || String(propertyKey);\n\n descriptor.value = function (...args: unknown[]) {\n const span = startSpan(spanName);\n\n try {\n const result = originalMethod.apply(this, args);\n\n if (result && typeof result.then === \"function\") {\n return result\n .then((value: unknown) => {\n endSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n endSpan(span);\n throw error;\n });\n }\n\n endSpan(span);\n return result;\n } catch (error) {\n endSpan(span);\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n"],"mappings":"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","names":["import_common","import_common","import_backend","routePath","import_common","import_backend","import_backend"]}
package/dist/index.mjs CHANGED
@@ -27,6 +27,8 @@ import {
27
27
  captureException,
28
28
  captureExceptionWithAttributes,
29
29
  captureMessage,
30
+ captureMetric,
31
+ captureMetricWithTags,
30
32
  startSpan,
31
33
  endSpan,
32
34
  measureTask,
@@ -61,6 +63,12 @@ var TracewayService = class {
61
63
  captureMessage(msg, attributes) {
62
64
  captureMessage(msg, attributes);
63
65
  }
66
+ captureMetric(name, value) {
67
+ captureMetric(name, value);
68
+ }
69
+ captureMetricWithTags(name, value, tags) {
70
+ captureMetricWithTags(name, value, tags);
71
+ }
64
72
  startSpan(name) {
65
73
  return startSpan(name);
66
74
  }
@@ -204,7 +212,11 @@ var TracewayMiddleware = class {
204
212
  return next();
205
213
  }
206
214
  const clientIP = this.getClientIP(req);
207
- withTraceContext2({ endpoint: "", clientIP }, () => {
215
+ const distributedTraceId = req.headers["traceway-trace-id"];
216
+ if (distributedTraceId) {
217
+ res.setHeader("traceway-trace-id", distributedTraceId);
218
+ }
219
+ withTraceContext2({ endpoint: "", clientIP, distributedTraceId }, () => {
208
220
  res.on("finish", () => {
209
221
  const routePath2 = req.route?.path || req.path;
210
222
  const ctx = getTraceContext2();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/traceway.module.ts","../src/traceway.constants.ts","../src/traceway.service.ts","../src/traceway.middleware.ts","../src/traceway.filter.ts","../src/traceway.decorators.ts"],"sourcesContent":["import {\n DynamicModule,\n Global,\n Module,\n OnModuleDestroy,\n Provider,\n} from \"@nestjs/common\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type {\n TracewayModuleOptions,\n TracewayModuleAsyncOptions,\n TracewayOptionsFactory,\n} from \"./traceway.interfaces.js\";\nimport { TracewayService } from \"./traceway.service.js\";\n\n@Global()\n@Module({})\nexport class TracewayModule implements OnModuleDestroy {\n constructor(private readonly tracewayService: TracewayService) {}\n\n static forRoot(options: TracewayModuleOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: TRACEWAY_MODULE_OPTIONS,\n useValue: options,\n };\n\n return {\n module: TracewayModule,\n providers: [\n optionsProvider,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n static forRootAsync(options: TracewayModuleAsyncOptions): DynamicModule {\n const asyncProviders = this.createAsyncProviders(options);\n\n return {\n module: TracewayModule,\n imports: options.imports || [],\n providers: [\n ...asyncProviders,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n private static createAsyncProviders(\n options: TracewayModuleAsyncOptions,\n ): Provider[] {\n if (options.useExisting || options.useFactory) {\n return [this.createAsyncOptionsProvider(options)];\n }\n\n if (options.useClass) {\n return [\n this.createAsyncOptionsProvider(options),\n {\n provide: options.useClass,\n useClass: options.useClass,\n },\n ];\n }\n\n return [];\n }\n\n private static createAsyncOptionsProvider(\n options: TracewayModuleAsyncOptions,\n ): Provider {\n if (options.useFactory) {\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n }\n\n const inject = options.useExisting || options.useClass;\n if (!inject) {\n throw new Error(\n \"TracewayModule: useExisting, useClass, or useFactory must be provided\",\n );\n }\n\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: async (optionsFactory: TracewayOptionsFactory) =>\n optionsFactory.createTracewayOptions(),\n inject: [inject],\n };\n }\n\n async onModuleDestroy(): Promise<void> {\n await this.tracewayService.shutdownAsync();\n }\n}\n","export const TRACEWAY_MODULE_OPTIONS = \"TRACEWAY_MODULE_OPTIONS\";\n","import { Inject, Injectable } from \"@nestjs/common\";\nimport {\n init,\n shutdown,\n captureException,\n captureExceptionWithAttributes,\n captureMessage,\n startSpan,\n endSpan,\n measureTask,\n setTraceAttribute,\n setTraceAttributes,\n getTraceId,\n getTraceContext,\n withTraceContext,\n type SpanHandle,\n type TraceContextOptions,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayService {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n initialize(): void {\n init(this.options.connectionString, {\n debug: this.options.debug,\n version: this.options.version,\n serverName: this.options.serverName,\n sampleRate: this.options.sampleRate,\n errorSampleRate: this.options.errorSampleRate,\n });\n }\n\n async shutdownAsync(): Promise<void> {\n await shutdown();\n }\n\n captureException(error: Error): void {\n captureException(error);\n }\n\n captureExceptionWithAttributes(\n error: Error,\n attributes?: Record<string, string>,\n traceId?: string,\n ): void {\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n\n captureMessage(msg: string, attributes?: Record<string, string>): void {\n captureMessage(msg, attributes);\n }\n\n startSpan(name: string): SpanHandle {\n return startSpan(name);\n }\n\n endSpan(span: SpanHandle, addToContext: boolean = true): void {\n endSpan(span, addToContext);\n }\n\n measureTask(title: string, fn: () => void | Promise<void>): void {\n measureTask(title, fn);\n }\n\n setTraceAttribute(key: string, value: string): void {\n setTraceAttribute(key, value);\n }\n\n setTraceAttributes(attributes: Record<string, string>): void {\n setTraceAttributes(attributes);\n }\n\n getTraceId(): string | undefined {\n return getTraceId();\n }\n\n getTraceContext() {\n return getTraceContext();\n }\n\n withTraceContext<T>(options: TraceContextOptions, fn: () => T): T {\n return withTraceContext(options, fn);\n }\n\n getOptions(): TracewayModuleOptions {\n return this.options;\n }\n}\n","import { Inject, Injectable, NestMiddleware } from \"@nestjs/common\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport {\n withTraceContext,\n getTraceContext,\n setTraceResponseInfo,\n captureCurrentTrace,\n hasTraceContext,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayMiddleware implements NestMiddleware {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n use(req: Request, res: Response, next: NextFunction): void {\n const routePath = req.route?.path || req.path;\n\n if (this.options.ignoredRoutes?.includes(routePath) || hasTraceContext()) {\n return next();\n }\n\n const clientIP = this.getClientIP(req);\n\n withTraceContext({ endpoint: \"\", clientIP }, () => {\n res.on(\"finish\", () => {\n const routePath = req.route?.path || req.path;\n const ctx = getTraceContext();\n if (ctx) {\n ctx.endpoint = `${req.method} ${routePath}`;\n }\n const bodySize = parseInt(res.get(\"content-length\") || \"0\", 10);\n setTraceResponseInfo(res.statusCode, bodySize);\n captureCurrentTrace();\n });\n\n next();\n });\n }\n\n private getClientIP(req: Request): string {\n const forwarded = req.headers[\"x-forwarded-for\"];\n if (typeof forwarded === \"string\") {\n return forwarded.split(\",\")[0].trim();\n }\n if (Array.isArray(forwarded)) {\n return forwarded[0];\n }\n return req.ip || req.socket.remoteAddress || \"\";\n }\n}\n","import {\n Catch,\n ArgumentsHost,\n HttpException,\n HttpStatus,\n Inject,\n ExceptionFilter,\n} from \"@nestjs/common\";\nimport type { Request, Response } from \"express\";\nimport {\n captureExceptionWithAttributes,\n getTraceId,\n getTraceContext,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\nconst BODY_LIMIT = 64 * 1024;\n\n@Catch()\nexport class TracewayExceptionFilter implements ExceptionFilter {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n catch(exception: unknown, host: ArgumentsHost): void {\n const ctx = host.switchToHttp();\n const request = ctx.getRequest<Request>();\n const response = ctx.getResponse<Response>();\n\n const httpException = this.asHttpException(exception);\n const status = httpException\n ? httpException.getStatus()\n : HttpStatus.INTERNAL_SERVER_ERROR;\n\n if (status >= 500 || !httpException) {\n this.captureError(exception, request);\n }\n\n if (!response.headersSent) {\n if (httpException) {\n const body = httpException.getResponse();\n response.status(status).json(\n typeof body === \"string\" ? { statusCode: status, message: body } : body,\n );\n } else {\n response.status(status).json({\n statusCode: status,\n message: \"Internal server error\",\n });\n }\n }\n }\n\n private asHttpException(exception: unknown): HttpException | null {\n if (exception instanceof HttpException) {\n return exception;\n }\n if (\n exception !== null &&\n typeof exception === \"object\" &&\n typeof (exception as HttpException).getStatus === \"function\" &&\n typeof (exception as HttpException).getResponse === \"function\"\n ) {\n return exception as HttpException;\n }\n return null;\n }\n\n private captureError(exception: unknown, request: Request): void {\n const error =\n exception instanceof Error ? exception : new Error(String(exception));\n\n const attributes: Record<string, string> = {};\n const traceCtx = getTraceContext();\n\n if (traceCtx?.attributes) {\n Object.assign(attributes, traceCtx.attributes);\n }\n\n attributes[\"user agent\"] = request.get(\"user-agent\") || \"\";\n\n const recordingFields = this.options.onErrorRecording || [];\n\n if (recordingFields.includes(\"url\")) {\n attributes[\"url\"] = request.path;\n }\n\n if (recordingFields.includes(\"query\")) {\n const query = request.query;\n if (Object.keys(query).length > 0) {\n attributes[\"query\"] = JSON.stringify(query);\n }\n }\n\n if (recordingFields.includes(\"body\")) {\n const contentType = request.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\") && request.body) {\n const bodyStr = JSON.stringify(request.body);\n attributes[\"body\"] = bodyStr.slice(0, BODY_LIMIT);\n }\n }\n\n if (recordingFields.includes(\"headers\")) {\n const headers = { ...request.headers };\n delete headers[\"authorization\"];\n delete headers[\"cookie\"];\n attributes[\"headers\"] = JSON.stringify(headers);\n }\n\n const traceId = getTraceId();\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n}\n","import { startSpan, endSpan } from \"@tracewayapp/backend\";\n\nexport function Span(name?: string): MethodDecorator {\n return function (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ) {\n const originalMethod = descriptor.value;\n const spanName = name || String(propertyKey);\n\n descriptor.value = function (...args: unknown[]) {\n const span = startSpan(spanName);\n\n try {\n const result = originalMethod.apply(this, args);\n\n if (result && typeof result.then === \"function\") {\n return result\n .then((value: unknown) => {\n endSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n endSpan(span);\n throw error;\n });\n }\n\n endSpan(span);\n return result;\n } catch (error) {\n endSpan(span);\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n"],"mappings":"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","names":["Inject","Injectable","withTraceContext","getTraceContext","withTraceContext","routePath","getTraceContext","Injectable","Inject","Inject","captureExceptionWithAttributes","getTraceId","getTraceContext","getTraceContext","getTraceId","captureExceptionWithAttributes","Inject","startSpan","endSpan"]}
1
+ {"version":3,"sources":["../src/traceway.module.ts","../src/traceway.constants.ts","../src/traceway.service.ts","../src/traceway.middleware.ts","../src/traceway.filter.ts","../src/traceway.decorators.ts"],"sourcesContent":["import {\n DynamicModule,\n Global,\n Module,\n OnModuleDestroy,\n Provider,\n} from \"@nestjs/common\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type {\n TracewayModuleOptions,\n TracewayModuleAsyncOptions,\n TracewayOptionsFactory,\n} from \"./traceway.interfaces.js\";\nimport { TracewayService } from \"./traceway.service.js\";\n\n@Global()\n@Module({})\nexport class TracewayModule implements OnModuleDestroy {\n constructor(private readonly tracewayService: TracewayService) {}\n\n static forRoot(options: TracewayModuleOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: TRACEWAY_MODULE_OPTIONS,\n useValue: options,\n };\n\n return {\n module: TracewayModule,\n providers: [\n optionsProvider,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n static forRootAsync(options: TracewayModuleAsyncOptions): DynamicModule {\n const asyncProviders = this.createAsyncProviders(options);\n\n return {\n module: TracewayModule,\n imports: options.imports || [],\n providers: [\n ...asyncProviders,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n private static createAsyncProviders(\n options: TracewayModuleAsyncOptions,\n ): Provider[] {\n if (options.useExisting || options.useFactory) {\n return [this.createAsyncOptionsProvider(options)];\n }\n\n if (options.useClass) {\n return [\n this.createAsyncOptionsProvider(options),\n {\n provide: options.useClass,\n useClass: options.useClass,\n },\n ];\n }\n\n return [];\n }\n\n private static createAsyncOptionsProvider(\n options: TracewayModuleAsyncOptions,\n ): Provider {\n if (options.useFactory) {\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n }\n\n const inject = options.useExisting || options.useClass;\n if (!inject) {\n throw new Error(\n \"TracewayModule: useExisting, useClass, or useFactory must be provided\",\n );\n }\n\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: async (optionsFactory: TracewayOptionsFactory) =>\n optionsFactory.createTracewayOptions(),\n inject: [inject],\n };\n }\n\n async onModuleDestroy(): Promise<void> {\n await this.tracewayService.shutdownAsync();\n }\n}\n","export const TRACEWAY_MODULE_OPTIONS = \"TRACEWAY_MODULE_OPTIONS\";\n","import { Inject, Injectable } from \"@nestjs/common\";\nimport {\n init,\n shutdown,\n captureException,\n captureExceptionWithAttributes,\n captureMessage,\n captureMetric,\n captureMetricWithTags,\n startSpan,\n endSpan,\n measureTask,\n setTraceAttribute,\n setTraceAttributes,\n getTraceId,\n getTraceContext,\n withTraceContext,\n type SpanHandle,\n type TraceContextOptions,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayService {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n initialize(): void {\n init(this.options.connectionString, {\n debug: this.options.debug,\n version: this.options.version,\n serverName: this.options.serverName,\n sampleRate: this.options.sampleRate,\n errorSampleRate: this.options.errorSampleRate,\n });\n }\n\n async shutdownAsync(): Promise<void> {\n await shutdown();\n }\n\n captureException(error: Error): void {\n captureException(error);\n }\n\n captureExceptionWithAttributes(\n error: Error,\n attributes?: Record<string, string>,\n traceId?: string,\n ): void {\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n\n captureMessage(msg: string, attributes?: Record<string, string>): void {\n captureMessage(msg, attributes);\n }\n\n captureMetric(name: string, value: number): void {\n captureMetric(name, value);\n }\n\n captureMetricWithTags(\n name: string,\n value: number,\n tags: Record<string, string>,\n ): void {\n captureMetricWithTags(name, value, tags);\n }\n\n startSpan(name: string): SpanHandle {\n return startSpan(name);\n }\n\n endSpan(span: SpanHandle, addToContext: boolean = true): void {\n endSpan(span, addToContext);\n }\n\n measureTask(title: string, fn: () => void | Promise<void>): void {\n measureTask(title, fn);\n }\n\n setTraceAttribute(key: string, value: string): void {\n setTraceAttribute(key, value);\n }\n\n setTraceAttributes(attributes: Record<string, string>): void {\n setTraceAttributes(attributes);\n }\n\n getTraceId(): string | undefined {\n return getTraceId();\n }\n\n getTraceContext() {\n return getTraceContext();\n }\n\n withTraceContext<T>(options: TraceContextOptions, fn: () => T): T {\n return withTraceContext(options, fn);\n }\n\n getOptions(): TracewayModuleOptions {\n return this.options;\n }\n}\n","import { Inject, Injectable, NestMiddleware } from \"@nestjs/common\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport {\n withTraceContext,\n getTraceContext,\n setTraceResponseInfo,\n captureCurrentTrace,\n hasTraceContext,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayMiddleware implements NestMiddleware {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n use(req: Request, res: Response, next: NextFunction): void {\n const routePath = req.route?.path || req.path;\n\n if (this.options.ignoredRoutes?.includes(routePath) || hasTraceContext()) {\n return next();\n }\n\n const clientIP = this.getClientIP(req);\n const distributedTraceId = req.headers[\"traceway-trace-id\"] as string | undefined;\n\n if (distributedTraceId) {\n res.setHeader(\"traceway-trace-id\", distributedTraceId);\n }\n\n withTraceContext({ endpoint: \"\", clientIP, distributedTraceId }, () => {\n res.on(\"finish\", () => {\n const routePath = req.route?.path || req.path;\n const ctx = getTraceContext();\n if (ctx) {\n ctx.endpoint = `${req.method} ${routePath}`;\n }\n const bodySize = parseInt(res.get(\"content-length\") || \"0\", 10);\n setTraceResponseInfo(res.statusCode, bodySize);\n captureCurrentTrace();\n });\n\n next();\n });\n }\n\n private getClientIP(req: Request): string {\n const forwarded = req.headers[\"x-forwarded-for\"];\n if (typeof forwarded === \"string\") {\n return forwarded.split(\",\")[0].trim();\n }\n if (Array.isArray(forwarded)) {\n return forwarded[0];\n }\n return req.ip || req.socket.remoteAddress || \"\";\n }\n}\n","import {\n Catch,\n ArgumentsHost,\n HttpException,\n HttpStatus,\n Inject,\n ExceptionFilter,\n} from \"@nestjs/common\";\nimport type { Request, Response } from \"express\";\nimport {\n captureExceptionWithAttributes,\n getTraceId,\n getTraceContext,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\nconst BODY_LIMIT = 64 * 1024;\n\n@Catch()\nexport class TracewayExceptionFilter implements ExceptionFilter {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n catch(exception: unknown, host: ArgumentsHost): void {\n const ctx = host.switchToHttp();\n const request = ctx.getRequest<Request>();\n const response = ctx.getResponse<Response>();\n\n const httpException = this.asHttpException(exception);\n const status = httpException\n ? httpException.getStatus()\n : HttpStatus.INTERNAL_SERVER_ERROR;\n\n if (status >= 500 || !httpException) {\n this.captureError(exception, request);\n }\n\n if (!response.headersSent) {\n if (httpException) {\n const body = httpException.getResponse();\n response.status(status).json(\n typeof body === \"string\" ? { statusCode: status, message: body } : body,\n );\n } else {\n response.status(status).json({\n statusCode: status,\n message: \"Internal server error\",\n });\n }\n }\n }\n\n private asHttpException(exception: unknown): HttpException | null {\n if (exception instanceof HttpException) {\n return exception;\n }\n if (\n exception !== null &&\n typeof exception === \"object\" &&\n typeof (exception as HttpException).getStatus === \"function\" &&\n typeof (exception as HttpException).getResponse === \"function\"\n ) {\n return exception as HttpException;\n }\n return null;\n }\n\n private captureError(exception: unknown, request: Request): void {\n const error =\n exception instanceof Error ? exception : new Error(String(exception));\n\n const attributes: Record<string, string> = {};\n const traceCtx = getTraceContext();\n\n if (traceCtx?.attributes) {\n Object.assign(attributes, traceCtx.attributes);\n }\n\n attributes[\"user agent\"] = request.get(\"user-agent\") || \"\";\n\n const recordingFields = this.options.onErrorRecording || [];\n\n if (recordingFields.includes(\"url\")) {\n attributes[\"url\"] = request.path;\n }\n\n if (recordingFields.includes(\"query\")) {\n const query = request.query;\n if (Object.keys(query).length > 0) {\n attributes[\"query\"] = JSON.stringify(query);\n }\n }\n\n if (recordingFields.includes(\"body\")) {\n const contentType = request.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\") && request.body) {\n const bodyStr = JSON.stringify(request.body);\n attributes[\"body\"] = bodyStr.slice(0, BODY_LIMIT);\n }\n }\n\n if (recordingFields.includes(\"headers\")) {\n const headers = { ...request.headers };\n delete headers[\"authorization\"];\n delete headers[\"cookie\"];\n attributes[\"headers\"] = JSON.stringify(headers);\n }\n\n const traceId = getTraceId();\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n}\n","import { startSpan, endSpan } from \"@tracewayapp/backend\";\n\nexport function Span(name?: string): MethodDecorator {\n return function (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ) {\n const originalMethod = descriptor.value;\n const spanName = name || String(propertyKey);\n\n descriptor.value = function (...args: unknown[]) {\n const span = startSpan(spanName);\n\n try {\n const result = originalMethod.apply(this, args);\n\n if (result && typeof result.then === \"function\") {\n return result\n .then((value: unknown) => {\n endSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n endSpan(span);\n throw error;\n });\n }\n\n endSpan(span);\n return result;\n } catch (error) {\n endSpan(span);\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n"],"mappings":"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","names":["Inject","Injectable","withTraceContext","getTraceContext","withTraceContext","routePath","getTraceContext","Injectable","Inject","Inject","captureExceptionWithAttributes","getTraceId","getTraceContext","getTraceContext","getTraceId","captureExceptionWithAttributes","Inject","startSpan","endSpan"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tracewayapp/nestjs",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Traceway NestJS integration with module, middleware, and decorators",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -23,7 +23,7 @@
23
23
  "dev": "tsup --watch"
24
24
  },
25
25
  "dependencies": {
26
- "@tracewayapp/backend": "1.0.0"
26
+ "@tracewayapp/backend": "1.0.2"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@nestjs/common": "^10.0.0",