{"_id":"@apdev/nestjs-otel-observability","_rev":"2-30130f946aeb44851779b653979cbbbf","name":"@apdev/nestjs-otel-observability","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.3":{"name":"@apdev/nestjs-otel-observability","version":"1.0.3","keywords":["nestjs","opentelemetry","otel","observability","tracing","metrics","logging","distributed-tracing","rabbitmq","websocket","loki","tempo","prometheus","grafana","apm","monitoring"],"author":{"name":"Anfitrião Prime"},"license":"MIT","_id":"@apdev/nestjs-otel-observability@1.0.3","maintainers":[{"name":"apdev","email":"cereso.rodrigues@anfitriaoprime.com.br"}],"homepage":"https://github.com/pafrtds/nestjs-otel-observability#readme","bugs":{"url":"https://github.com/pafrtds/nestjs-otel-observability/issues"},"dist":{"shasum":"09ea98d3705901ff1a239f8d14f0138818af2e73","tarball":"https://registry.npmjs.org/@apdev/nestjs-otel-observability/-/nestjs-otel-observability-1.0.3.tgz","fileCount":65,"integrity":"sha512-B3wdxZiA3HlJF675iXNLLV9qTVtbFYziVdyCXvbHtTjxx+lxLpzmSUJ1YUDxbMlYG0CGp/0cYiuwVYQfOHc2mg==","signatures":[{"sig":"MEQCIAPaP9GtPvHmvYGoZ3k8COR0K0K82h+Bhi9QcfOrVIvZAiBZTbtHwZCoh0t93cPZyrm64Qur5zcQdaBCxjPgR9TEyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183181},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"2fee78e05505bd3dfe4f6c337d7ac8ce951dd078","scripts":{"lint":"eslint \"src/**/*.ts\"","test":"jest","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","prepack":"npm run clean && npm run build","lint:fix":"eslint \"src/**/*.ts\" --fix","test:cov":"jest --coverage","test:watch":"jest --watch","build:watch":"tsc -p tsconfig.build.json --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"apdev","email":"cereso.rodrigues@anfitriaoprime.com.br"},"repository":{"url":"git+https://github.com/pafrtds/nestjs-otel-observability.git","type":"git"},"_npmVersion":"10.8.2","description":"A comprehensive OpenTelemetry observability module for NestJS applications with automatic tracing, structured logging, metrics, and error handling","directories":{},"_nodeVersion":"20.18.0","dependencies":{"@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-node":"^0.211.0","@opentelemetry/resources":"^2.5.0","@opentelemetry/sdk-metrics":"^2.5.0","@opentelemetry/sdk-trace-base":"^2.5.0","@opentelemetry/sdk-trace-node":"^2.5.0","@opentelemetry/context-async-hooks":"^2.5.0","@opentelemetry/instrumentation-http":"^0.211.0","@opentelemetry/semantic-conventions":"^1.39.0","@opentelemetry/exporter-logs-otlp-http":"^0.211.0","@opentelemetry/instrumentation-express":"^0.59.0","@opentelemetry/exporter-trace-otlp-http":"^0.211.0","@opentelemetry/auto-instrumentations-node":"^0.69.0","@opentelemetry/exporter-metrics-otlp-http":"^0.211.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","rxjs":"^7.8.1","eslint":"^8.56.0","ts-jest":"^29.1.0","socket.io":"^4.7.0","typescript":"^5.1.3","@types/jest":"^29.5.2","@types/node":"^20.3.1","@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0","@types/express":"^4.17.17","@nestjs/testing":"^10.0.0","reflect-metadata":"^0.2.0","@nestjs/websockets":"^10.3.10","@nestjs/platform-express":"^10.0.0","@typescript-eslint/parser":"^7.8.0","@golevelup/nestjs-rabbitmq":"^5.3.0","@nestjs/platform-socket.io":"^10.3.10","@typescript-eslint/eslint-plugin":"^7.8.0"},"peerDependencies":{"rxjs":">=7.0.0","@nestjs/core":">=10.0.0","@nestjs/common":">=10.0.0","reflect-metadata":">=0.1.0"},"peerDependenciesMeta":{"socket.io":{"optional":true},"@nestjs/websockets":{"optional":true},"@golevelup/nestjs-rabbitmq":{"optional":true},"@nestjs/platform-socket.io":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestjs-otel-observability_1.0.3_1770314041249_0.500638835063643","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@apdev/nestjs-otel-observability","version":"1.0.4","description":"A comprehensive OpenTelemetry observability module for NestJS applications with automatic tracing, structured logging, metrics, and error handling","author":{"name":"Anfitrião Prime"},"license":"MIT","main":"dist/index.js","types":"dist/index.d.ts","keywords":["nestjs","opentelemetry","otel","observability","tracing","metrics","logging","distributed-tracing","rabbitmq","websocket","loki","tempo","prometheus","grafana","apm","monitoring"],"repository":{"type":"git","url":"git+https://github.com/pafrtds/nestjs-otel-observability.git"},"bugs":{"url":"https://github.com/pafrtds/nestjs-otel-observability/issues"},"homepage":"https://github.com/pafrtds/nestjs-otel-observability#readme","scripts":{"build":"tsc -p tsconfig.build.json","build:watch":"tsc -p tsconfig.build.json --watch","clean":"rm -rf dist *.tsbuildinfo","prepack":"npm run clean && npm run build","prepublishOnly":"npm run build","lint":"eslint \"src/**/*.ts\"","lint:fix":"eslint \"src/**/*.ts\" --fix","test":"jest","test:watch":"jest --watch","test:cov":"jest --coverage"},"peerDependencies":{"@nestjs/common":">=10.0.0","@nestjs/core":">=10.0.0","reflect-metadata":">=0.1.0","rxjs":">=7.0.0"},"peerDependenciesMeta":{"@golevelup/nestjs-rabbitmq":{"optional":true},"@nestjs/websockets":{"optional":true},"@nestjs/platform-socket.io":{"optional":true},"socket.io":{"optional":true}},"dependencies":{"@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/auto-instrumentations-node":"^0.69.0","@opentelemetry/context-async-hooks":"^2.5.0","@opentelemetry/exporter-logs-otlp-http":"^0.211.0","@opentelemetry/exporter-metrics-otlp-http":"^0.211.0","@opentelemetry/exporter-trace-otlp-http":"^0.211.0","@opentelemetry/instrumentation-express":"^0.59.0","@opentelemetry/instrumentation-http":"^0.211.0","@opentelemetry/resources":"^2.5.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.5.0","@opentelemetry/sdk-node":"^0.211.0","@opentelemetry/sdk-trace-base":"^2.5.0","@opentelemetry/sdk-trace-node":"^2.5.0","@opentelemetry/semantic-conventions":"^1.39.0"},"devDependencies":{"@golevelup/nestjs-rabbitmq":"^5.3.0","@nestjs/common":"^10.0.0","@nestjs/core":"^10.0.0","@nestjs/platform-express":"^10.0.0","@nestjs/platform-socket.io":"^10.3.10","@nestjs/testing":"^10.0.0","@nestjs/websockets":"^10.3.10","@types/express":"^4.17.17","@types/jest":"^29.5.2","@types/node":"^20.3.1","@typescript-eslint/eslint-plugin":"^7.8.0","@typescript-eslint/parser":"^7.8.0","eslint":"^8.56.0","jest":"^29.7.0","reflect-metadata":"^0.2.0","rxjs":"^7.8.1","socket.io":"^4.7.0","ts-jest":"^29.1.0","typescript":"^5.1.3"},"engines":{"node":">=18.0.0"},"_id":"@apdev/nestjs-otel-observability@1.0.4","gitHead":"2fee78e05505bd3dfe4f6c337d7ac8ce951dd078","_nodeVersion":"20.18.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-q5L/7pz3aXfSJGO7YG5qVIjgLvnhhC+YFlqPaGEFXk8NGIY/mf/0ISIQWe9Ffzt2wsIitbt5o2kJvobfsSia/A==","shasum":"d6e932bfe0c09a4f5445136929379b5bc3190f68","tarball":"https://registry.npmjs.org/@apdev/nestjs-otel-observability/-/nestjs-otel-observability-1.0.4.tgz","fileCount":65,"unpackedSize":187097,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCZw9P+ZQPNAHq/AlDZeEHOjQGCAgU7722FGsSN/jpPQwIgfAzfNtupN3aoaBvNm7KrUk6xICNVDFLLr9Dwv2MCWhc="}]},"_npmUser":{"name":"apdev","email":"cereso.rodrigues@anfitriaoprime.com.br"},"directories":{},"maintainers":[{"name":"apdev","email":"cereso.rodrigues@anfitriaoprime.com.br"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestjs-otel-observability_1.0.4_1784049163590_0.3068838425247482"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-05T17:54:01.187Z","modified":"2026-07-14T17:12:43.842Z","1.0.3":"2026-02-05T17:54:01.483Z","1.0.4":"2026-07-14T17:12:43.737Z"},"bugs":{"url":"https://github.com/pafrtds/nestjs-otel-observability/issues"},"author":{"name":"Anfitrião Prime"},"license":"MIT","homepage":"https://github.com/pafrtds/nestjs-otel-observability#readme","keywords":["nestjs","opentelemetry","otel","observability","tracing","metrics","logging","distributed-tracing","rabbitmq","websocket","loki","tempo","prometheus","grafana","apm","monitoring"],"repository":{"type":"git","url":"git+https://github.com/pafrtds/nestjs-otel-observability.git"},"description":"A comprehensive OpenTelemetry observability module for NestJS applications with automatic tracing, structured logging, metrics, and error handling","maintainers":[{"name":"apdev","email":"cereso.rodrigues@anfitriaoprime.com.br"}],"readme":"# @pafrtds/nestjs-otel-observability\n\nA comprehensive OpenTelemetry observability module for NestJS applications. Provides automatic distributed tracing, structured logging, and metrics collection with minimal configuration.\n\n## Features\n\n- **Distributed Tracing**: Automatic trace propagation across HTTP, RabbitMQ, and WebSocket\n- **Structured Logging**: JSON logs with automatic trace context enrichment (trace_id, span_id)\n- **Metrics Collection**: HTTP request duration, error counts, RabbitMQ processing, WebSocket events\n- **Global Error Handling**: Automatic error classification (Axios, Prisma, generic) with detailed logging\n- **RabbitMQ Integration**: Transparent trace context injection/extraction for @golevelup/nestjs-rabbitmq\n- **WebSocket Support**: Full tracing for Socket.IO events\n- **OTLP Export**: Send telemetry to OpenTelemetry Collector (compatible with Grafana, Jaeger, etc.)\n- **Resilience**: Graceful degradation if OTLP endpoint is unavailable\n\n## Requirements\n\n- Node.js >= 18.0.0\n- NestJS >= 10.0.0\n\n## Installation\n\n```bash\nnpm install @pafrtds/nestjs-otel-observability\n```\n\n### Peer Dependencies\n\nThe following packages are required as peer dependencies:\n\n```bash\nnpm install @nestjs/common @nestjs/core reflect-metadata rxjs\n```\n\n### Optional Dependencies\n\nFor RabbitMQ tracing:\n```bash\nnpm install @golevelup/nestjs-rabbitmq\n```\n\nFor WebSocket tracing:\n```bash\nnpm install @nestjs/websockets @nestjs/platform-socket.io socket.io\n```\n\n## Quick Start\n\n### 1. Create the tracing bootstrap file\n\nCreate `src/tracing.bootstrap.ts`:\n\n```typescript\nimport { initTracing } from '@pafrtds/nestjs-otel-observability';\n\ninitTracing({\n  serviceName: process.env.SERVICE_NAME || 'my-service',\n  serviceVersion: process.env.SERVICE_VERSION || '1.0.0',\n  environment: process.env.NODE_ENV || 'development',\n  \n  // OTLP endpoints (optional, defaults to localhost:4318)\n  otlpTraceEndpoint: process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,\n  otlpMetricsEndpoint: process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT,\n  otlpLogsEndpoint: process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT,\n  \n  // Feature toggles\n  enableMetrics: true,\n  enableOtlpLogs: true,\n  enableConsoleLogs: true,\n});\n```\n\n### 2. Import tracing bootstrap FIRST in main.ts\n\n```typescript\nimport './tracing.bootstrap'; // MUST be the first import!\n\nimport { NestFactory } from '@nestjs/core';\nimport { AppModule } from './app.module';\nimport { StructuredLoggerService } from '@pafrtds/nestjs-otel-observability';\n\nasync function bootstrap() {\n  const app = await NestFactory.create(AppModule);\n  \n  // Optionally use the structured logger\n  const logger = app.get(StructuredLoggerService);\n  app.useLogger(logger);\n  \n  await app.listen(3000);\n}\n\nbootstrap();\n```\n\n### 3. Import the module in AppModule\n\n```typescript\nimport { Module } from '@nestjs/common';\nimport { ConfigModule, ConfigService } from '@nestjs/config';\nimport { ObservabilityModule } from '@pafrtds/nestjs-otel-observability';\n\n@Module({\n  imports: [\n    ConfigModule.forRoot(),\n    \n    ObservabilityModule.forRootAsync({\n      imports: [ConfigModule],\n      useFactory: (configService: ConfigService) => ({\n        serviceName: configService.get('SERVICE_NAME', 'my-service'),\n        environment: configService.get('NODE_ENV', 'development'),\n        enableHttp: true,\n        enableRabbit: true,\n        enableWebSocket: true,\n      }),\n      inject: [ConfigService],\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n## Configuration Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `serviceName` | `string` | **required** | Name of the service |\n| `serviceVersion` | `string` | `'1.0.0'` | Version of the service |\n| `environment` | `string` | `'development'` | Deployment environment |\n| `otlpTraceEndpoint` | `string` | `http://localhost:4318/v1/traces` | OTLP traces endpoint |\n| `otlpMetricsEndpoint` | `string` | `http://localhost:4318/v1/metrics` | OTLP metrics endpoint |\n| `otlpLogsEndpoint` | `string` | `http://localhost:4318/v1/logs` | OTLP logs endpoint |\n| `enableHttp` | `boolean` | `true` | Enable HTTP instrumentation |\n| `enableRabbit` | `boolean` | `true` | Enable RabbitMQ instrumentation |\n| `enableWebSocket` | `boolean` | `true` | Enable WebSocket instrumentation |\n| `enableMetrics` | `boolean` | `true` | Enable metrics collection |\n| `enableOtlpLogs` | `boolean` | `true` | Send logs to OTLP endpoint |\n| `enableConsoleLogs` | `boolean` | `true` | Output logs to console |\n| `logLevel` | `'debug' \\| 'info' \\| 'warn' \\| 'error'` | `'info'` | Minimum log level |\n| `sensitiveFields` | `string[]` | `['password', 'token', ...]` | Fields to mask in logs |\n| `maxBodyLogSize` | `number` | `10000` | Maximum body size to log (bytes) |\n| `metricsExportIntervalMs` | `number` | `15000` | Metrics export interval |\n| `debug` | `boolean` | `false` | Enable verbose OTel logging |\n\n## Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `SERVICE_NAME` | Service name for telemetry |\n| `SERVICE_VERSION` | Service version |\n| `NODE_ENV` | Environment (development/production) |\n| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | OTLP traces endpoint |\n| `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` | OTLP metrics endpoint |\n| `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | OTLP logs endpoint |\n| `OTEL_LOGS_ENABLED` | Enable OTLP logs (`'true'`/`'false'`) |\n| `OTEL_CONSOLE_LOGS_ENABLED` | Enable console logs (`'true'`/`'false'`) |\n| `OTEL_METRICS_ENABLED` | Enable metrics (`'true'`/`'false'`) |\n| `OTEL_METRICS_EXPORT_INTERVAL_MS` | Metrics export interval |\n| `OTEL_DEBUG` | Enable debug mode (`'true'`/`'false'`) |\n\n## Usage\n\n### Using the Structured Logger\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { StructuredLoggerService } from '@pafrtds/nestjs-otel-observability';\n\n@Injectable()\nexport class MyService {\n  constructor(private readonly logger: StructuredLoggerService) {\n    this.logger.setContext('MyService');\n  }\n\n  doSomething() {\n    // Basic logging\n    this.logger.log('Operation started');\n    this.logger.debug('Debug information', { userId: 123 });\n    this.logger.warn('Warning message');\n    this.logger.error('Error occurred', errorStack);\n\n    // With metadata\n    this.logger.log('User action', {\n      action: 'purchase',\n      amount: 99.99,\n      productId: 'ABC123',\n    });\n  }\n}\n```\n\n### Using Metrics\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { MetricsService } from '@pafrtds/nestjs-otel-observability';\n\n@Injectable()\nexport class MyService {\n  constructor(private readonly metrics: MetricsService) {}\n\n  // Create custom metrics\n  private orderCounter = this.metrics.createCounter(\n    'orders_total',\n    'Total number of orders processed',\n  );\n\n  processOrder(order: Order) {\n    // Record custom metric\n    this.orderCounter.add(1, {\n      status: order.status,\n      payment_method: order.paymentMethod,\n    });\n  }\n}\n```\n\n### Getting Trace Context\n\n```typescript\nimport {\n  getCurrentTraceId,\n  getCurrentSpanId,\n  getTraceContextInfo,\n} from '@pafrtds/nestjs-otel-observability';\n\n// Get current trace ID (useful for logging or correlation)\nconst traceId = getCurrentTraceId();\n\n// Get all trace context info\nconst { traceId, spanId, traceFlags } = getTraceContextInfo();\n```\n\n### WebSocket Trace Context Injection\n\n```typescript\nimport { SubscribeMessage, MessageBody } from '@nestjs/websockets';\nimport { injectTraceContext } from '@pafrtds/nestjs-otel-observability';\n\n@SubscribeMessage('getData')\nasync handleGetData(@MessageBody() data: any) {\n  const result = await this.service.getData(data);\n  \n  // Include trace context in response for client-side correlation\n  return injectTraceContext(result);\n}\n```\n\n## OpenTelemetry Collector Configuration\n\nExample `otel-collector-config.yaml`:\n\n```yaml\nreceivers:\n  otlp:\n    protocols:\n      http:\n        endpoint: 0.0.0.0:4318\n\nprocessors:\n  batch:\n    timeout: 5s\n    send_batch_size: 1000\n\nexporters:\n  otlp/tempo:\n    endpoint: tempo:4317\n    tls:\n      insecure: true\n\n  prometheusremotewrite:\n    endpoint: http://prometheus:9090/api/v1/write\n    resource_to_telemetry_conversion:\n      enabled: true\n\n  loki:\n    endpoint: http://loki:3100/loki/api/v1/push\n    labels:\n      resource:\n        service.name: \"service_name\"\n        deployment.environment: \"environment\"\n\nservice:\n  pipelines:\n    traces:\n      receivers: [otlp]\n      processors: [batch]\n      exporters: [otlp/tempo]\n    \n    metrics:\n      receivers: [otlp]\n      processors: [batch]\n      exporters: [prometheusremotewrite]\n    \n    logs:\n      receivers: [otlp]\n      processors: [batch]\n      exporters: [loki]\n```\n\n## Collected Metrics\n\n### HTTP Metrics\n\n| Metric | Type | Description | Labels |\n|--------|------|-------------|--------|\n| `http_requests_total` | Counter | Total HTTP requests | `method`, `route`, `status_code` |\n| `http_errors_total` | Counter | Total HTTP errors (4xx/5xx) | `method`, `route`, `status_code` |\n| `http_request_duration_seconds` | Histogram | Request duration | `method`, `route`, `status_code` |\n\n### RabbitMQ Metrics\n\n| Metric | Type | Description | Labels |\n|--------|------|-------------|--------|\n| `rabbitmq_messages_total` | Counter | Total messages processed | `exchange`, `routing_key`, `queue`, `operation` |\n| `rabbitmq_errors_total` | Counter | Total processing errors | `exchange`, `routing_key`, `queue`, `operation` |\n| `rabbitmq_processing_duration_seconds` | Histogram | Processing duration | `exchange`, `routing_key`, `queue`, `operation` |\n\n### WebSocket Metrics\n\n| Metric | Type | Description | Labels |\n|--------|------|-------------|--------|\n| `websocket_events_total` | Counter | Total events processed | `event` |\n| `websocket_errors_total` | Counter | Total event errors | `event` |\n| `websocket_event_duration_seconds` | Histogram | Event processing duration | `event` |\n\n### Error Metrics\n\n| Metric | Type | Description | Labels |\n|--------|------|-------------|--------|\n| `errors_total` | Counter | Total errors by type | `error_type`, `context`, `error_code` |\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│                     NestJS Application                          │\n│                                                                 │\n│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────────┐  │\n│  │    HTTP     │  │  RabbitMQ   │  │      WebSocket          │  │\n│  │  Requests   │  │  Messages   │  │       Events            │  │\n│  └──────┬──────┘  └──────┬──────┘  └───────────┬─────────────┘  │\n│         │                │                      │                │\n│         ▼                ▼                      ▼                │\n│  ┌──────────────────────────────────────────────────────────┐   │\n│  │              ObservabilityModule                          │   │\n│  │  ┌────────────────────────────────────────────────────┐  │   │\n│  │  │                 Interceptors                        │  │   │\n│  │  │  • HttpMetricsInterceptor                          │  │   │\n│  │  │  • RabbitMQTraceInterceptor                        │  │   │\n│  │  │  • RabbitMQPublishInterceptor (monkey-patch)       │  │   │\n│  │  │  • WebSocketTraceInterceptor                       │  │   │\n│  │  │  • ObservabilityErrorInterceptor                   │  │   │\n│  │  └────────────────────────────────────────────────────┘  │   │\n│  │  ┌────────────────────────────────────────────────────┐  │   │\n│  │  │                   Services                          │  │   │\n│  │  │  • StructuredLoggerService                         │  │   │\n│  │  │  • MetricsService                                  │  │   │\n│  │  └────────────────────────────────────────────────────┘  │   │\n│  └──────────────────────────────────────────────────────────┘   │\n│                              │                                   │\n└──────────────────────────────┼───────────────────────────────────┘\n                               │\n                               ▼\n                ┌──────────────────────────┐\n                │   OpenTelemetry Collector │\n                │   (OTLP HTTP :4318)       │\n                └────────────┬─────────────┘\n                             │\n          ┌──────────────────┼──────────────────┐\n          │                  │                  │\n          ▼                  ▼                  ▼\n     ┌─────────┐       ┌─────────┐       ┌─────────┐\n     │  Tempo  │       │Prometheus│       │  Loki   │\n     │ Traces  │       │ Metrics │       │  Logs   │\n     └─────────┘       └─────────┘       └─────────┘\n          │                  │                  │\n          └──────────────────┼──────────────────┘\n                             │\n                             ▼\n                      ┌─────────────┐\n                      │   Grafana   │\n                      └─────────────┘\n```\n\n## Error Classification\n\nThe module automatically classifies errors into the following types:\n\n| Type | Description | Additional Info |\n|------|-------------|-----------------|\n| `AxiosError` | HTTP client errors | URL, status code, method, headers |\n| `PrismaClientKnownRequestError` | Prisma constraint violations | Error code, model, field |\n| `PrismaClientUnknownRequestError` | Prisma unknown errors | Sanitized message |\n| `PrismaClientValidationError` | Prisma validation errors | Sanitized message |\n| `Error` | Generic JavaScript errors | Name, message, stack trace |\n\n## Security\n\nThe module includes built-in security features:\n\n- **Sensitive field masking**: Passwords, tokens, and other sensitive fields are automatically redacted in logs\n- **Body truncation**: Large request/response bodies are truncated to prevent excessive logging\n- **Prisma message sanitization**: Values in Prisma error messages are sanitized to prevent data leakage\n\nDefault sensitive fields:\n- `password`, `token`, `authorization`, `secret`, `key`, `apikey`\n- `api_key`, `api-key`, `bearer`, `credential`, `private`\n- `cpf`, `cnpj`, `ssn`, `credit_card`, `card_number`\n\n## License\n\nMIT\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n","readmeFilename":"README.md"}