@eqxjs/nest-opentelemetry 3.0.9-beta.1 → 3.0.9-beta.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 ADDED
@@ -0,0 +1,226 @@
1
+ # @eqxjs/nest-opentelemetry
2
+
3
+ OpenTelemetry auto-instrumentation for NestJS applications. Wraps `@opentelemetry/sdk-node` with a pre-configured set of instrumentations, exporters, and resource detectors — all driven by environment variables.
4
+
5
+ ## Features
6
+
7
+ - **Zero-code instrumentation** — register once and all supported libraries are auto-instrumented
8
+ - **Multiple exporters** — OTLP (traces, metrics, logs) and Azure Monitor Application Insights
9
+ - **Custom Kafka span enrichment** — supports KafkaJS, `eqxjs-kafkajs`, and Confluent Kafka with M1/M2/M3 message protocol parsing
10
+ - **Custom Socket.IO span enrichment** — captures socket ID, key, and M1 protocol attributes
11
+ - **Cloud resource detection** — automatic detection for AWS, Azure, GCP, Alibaba, container, and more
12
+ - **Graceful shutdown** — listens for `SIGTERM` and flushes telemetry before exit
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install @eqxjs/nest-opentelemetry
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ Register the SDK **before** your application loads by passing `--require` to Node.js:
23
+
24
+ ```bash
25
+ node --require ./node_modules/@eqxjs/nest-opentelemetry/dist/register.js dist/main.js
26
+ ```
27
+
28
+ Or in your `package.json` start script:
29
+
30
+ ```json
31
+ {
32
+ "scripts": {
33
+ "start": "node --require ./node_modules/@eqxjs/nest-opentelemetry/dist/register.js dist/main.js"
34
+ }
35
+ }
36
+ ```
37
+
38
+ ### Programmatic Usage
39
+
40
+ You can also import individual helpers from the package:
41
+
42
+ ```typescript
43
+ import {
44
+ getNodeAutoInstrumentations,
45
+ getResourceDetectors,
46
+ InstrumentationConfigMap,
47
+ } from '@eqxjs/nest-opentelemetry';
48
+ ```
49
+
50
+ Use `getNodeAutoInstrumentations(config?)` to build the instrumentation list with your own `NodeSDK` setup, and `getResourceDetectors()` to apply the environment-driven resource detector list.
51
+
52
+ ## Environment Variables
53
+
54
+ ### Exporters
55
+
56
+ | Variable | Description |
57
+ |---|---|
58
+ | `TRACES_URL` | OTLP endpoint for traces (default: `http://localhost:4318/v1/traces`) |
59
+ | `METRICS_URL` | OTLP endpoint for metrics (default: `http://localhost:4318/v1/metrics`) |
60
+ | `LOGGER_URL` | OTLP endpoint for logs (default: `http://localhost:4318/v1/logs`) |
61
+ | `APPLICATIONINSIGHTS_CONNECTION_STRING_TRACE` | Azure Monitor connection string for traces (takes priority over `TRACES_URL`) |
62
+ | `APPLICATIONINSIGHTS_CONNECTION_STRING_METRIC` | Azure Monitor connection string for metrics (takes priority over `METRICS_URL`) |
63
+ | `APPLICATIONINSIGHTS_CONNECTION_STRING_LOG` | Azure Monitor connection string for logs (takes priority over `LOGGER_URL`) |
64
+ | `METRIC_EXPORT_INTERVAL` | Metrics export interval in milliseconds (default: `60000`) |
65
+
66
+ ### Instrumentation
67
+
68
+ | Variable | Description |
69
+ |---|---|
70
+ | `OTEL_HTTP_HEADER` | Comma-separated list of HTTP header names to capture as span attributes on both request and response |
71
+ | `OTEL_NODE_ENABLED_INSTRUMENTATIONS` | Comma-separated list of instrumentation suffixes to enable. When unset, all instrumentations are enabled. Example: `http,grpc,pg` |
72
+
73
+ ### Resource Detectors
74
+
75
+ | Variable | Description |
76
+ |---|---|
77
+ | `OTEL_NODE_RESOURCE_DETECTORS` | Comma-separated list of resource detectors. Defaults to `all`. Use `none` to disable all. |
78
+
79
+ Available detector values:
80
+
81
+ | Value | Detects |
82
+ |---|---|
83
+ | `all` | Enables every detector below |
84
+ | `none` | Disables all detectors |
85
+ | `container` | Container ID |
86
+ | `env` | `OTEL_RESOURCE_ATTRIBUTES` environment variable |
87
+ | `host` | Hostname |
88
+ | `os` | OS name and version |
89
+ | `process` | Process PID, runtime name, and version |
90
+ | `serviceinstance` | Random service instance ID |
91
+ | `alibaba` | Alibaba Cloud ECS metadata |
92
+ | `aws` | AWS EC2 / ECS / EKS / Beanstalk / Lambda metadata |
93
+ | `azure` | Azure App Service / Functions / VM metadata |
94
+ | `gcp` | Google Cloud Platform metadata |
95
+
96
+ ### Deployment Attributes (applied to Kafka / Socket.IO spans)
97
+
98
+ | Variable | Span attribute set |
99
+ |---|---|
100
+ | `CLOUD_ZONE` | `cloud.zone` |
101
+ | `DEPLOYMENT_ENV` | `deployment.environment` |
102
+ | `DEPLOYMENT_NAMESPACE` | `k8s.namespace.name` |
103
+
104
+ ## Supported Instrumentations
105
+
106
+ | Library | Package |
107
+ |---|---|
108
+ | HTTP / HTTPS | `@opentelemetry/instrumentation-http` |
109
+ | gRPC | `@opentelemetry/instrumentation-grpc` |
110
+ | Express | `@opentelemetry/instrumentation-express` |
111
+ | Fastify | `@fastify/otel` |
112
+ | Koa | `@opentelemetry/instrumentation-koa` |
113
+ | Hapi | `@opentelemetry/instrumentation-hapi` |
114
+ | NestJS core | `@opentelemetry/instrumentation-nestjs-core` |
115
+ | Socket.IO | `@opentelemetry/instrumentation-socket.io` |
116
+ | GraphQL | `@opentelemetry/instrumentation-graphql` |
117
+ | KafkaJS | `opentelemetry-instrumentation-kafkajs` |
118
+ | EqxJS KafkaJS | `opentelemetry-instrumentation-eqxjs-kafkajs` |
119
+ | Confluent Kafka | `opentelemetry-instrumentation-confluent-kafka` |
120
+ | AMQP (RabbitMQ) | `@opentelemetry/instrumentation-amqplib` |
121
+ | MongoDB | `@opentelemetry/instrumentation-mongodb` + `opentelemetry-instrumentation-mongodb2` |
122
+ | Mongoose | `@opentelemetry/instrumentation-mongoose` |
123
+ | PostgreSQL | `@opentelemetry/instrumentation-pg` |
124
+ | MySQL / MySQL2 | `@opentelemetry/instrumentation-mysql`, `@opentelemetry/instrumentation-mysql2` |
125
+ | Redis v2 / v4 | `@opentelemetry/instrumentation-redis`, `@opentelemetry/instrumentation-redis-4` |
126
+ | IORedis | `@opentelemetry/instrumentation-ioredis`, `opentelemetry-instrumentation-eqxjs-ioredis` |
127
+ | Cassandra | `@opentelemetry/instrumentation-cassandra-driver` |
128
+ | Memcached | `@opentelemetry/instrumentation-memcached` |
129
+ | Knex | `@opentelemetry/instrumentation-knex` |
130
+ | AWS SDK | `@opentelemetry/instrumentation-aws-sdk` |
131
+ | AWS Lambda | `@opentelemetry/instrumentation-aws-lambda` |
132
+ | DNS | `@opentelemetry/instrumentation-dns` |
133
+ | Net | `@opentelemetry/instrumentation-net` |
134
+ | FS | `@opentelemetry/instrumentation-fs` |
135
+ | Pino | `@opentelemetry/instrumentation-pino` |
136
+ | Winston | `@opentelemetry/instrumentation-winston` |
137
+ | Bunyan | `@opentelemetry/instrumentation-bunyan` |
138
+ | DataLoader | `@opentelemetry/instrumentation-dataloader` |
139
+ | Generic Pool | `@opentelemetry/instrumentation-generic-pool` |
140
+ | LRU Memoizer | `@opentelemetry/instrumentation-lru-memoizer` |
141
+ | Connect | `@opentelemetry/instrumentation-connect` |
142
+ | Restify | `@opentelemetry/instrumentation-restify` |
143
+ | Router | `@opentelemetry/instrumentation-router` |
144
+ | Tedious (MSSQL) | `@opentelemetry/instrumentation-tedious` |
145
+ | Cucumber | `@opentelemetry/instrumentation-cucumber` |
146
+
147
+ ## Message Protocol Span Enrichment
148
+
149
+ Kafka producer/consumer hooks and Socket.IO hooks parse message payloads and add structured span attributes based on the detected message format.
150
+
151
+ ### M1 Protocol
152
+
153
+ Messages with a `protocol` field are parsed as M1 and produce the following attributes in addition to all M2 attributes:
154
+
155
+ | Attribute | Source field |
156
+ |---|---|
157
+ | `M1.protocol.version` | `protocol.version` |
158
+ | `M1.protocol.command` | `protocol.command` |
159
+ | `M1.protocol.sub_command` | `protocol.subCommand` |
160
+ | `M1.protocol.invoke` | `protocol.invoke` |
161
+ | `M1.protocol.topic` | `protocol.topic` |
162
+
163
+ ### M2 Protocol
164
+
165
+ Messages with a `header` field are parsed as M2:
166
+
167
+ | Attribute | Source field |
168
+ |---|---|
169
+ | `enduser.id` | `header.identity.user` |
170
+ | `M2.header.version` | `header.version` |
171
+ | `M2.header.org_service` | `header.orgService` |
172
+ | `M2.header.from` | `header.from` |
173
+ | `M2.header.channel` | `header.channel` |
174
+ | `M2.header.broker` | `header.broker` |
175
+ | `M2.header.agent` | `header.agent` |
176
+ | `M2.header.useCase` | `header.useCase` |
177
+ | `M2.header.use_case_step` | `header.useCaseStep` |
178
+ | `M2.header.use_case_age` | `header.useCaseAge` |
179
+ | `M2.header.function_name` | `header.functionName` |
180
+ | `M2.header.session` | `header.session` |
181
+ | `M2.header.transaction` | `header.transaction` |
182
+
183
+ ### M3 Protocol
184
+
185
+ Messages with a `service` field are parsed as M3:
186
+
187
+ | Attribute | Source field |
188
+ |---|---|
189
+ | `enduser.id` | `service.identity.user` |
190
+ | `M3.service.version` | `service.version` |
191
+ | `M3.service.org_service` | `service.orgService` |
192
+ | `M3.service.from` | `service.from` |
193
+ | `M3.service.channel` | `service.channel` |
194
+ | `M3.service.broker` | `service.broker` |
195
+ | `M3.service.agent` | `service.agent` |
196
+ | `M3.service.useCase` | `service.useCase` |
197
+ | `M3.service.use_case_step` | `service.useCaseStep` |
198
+ | `M3.service.use_case_age` | `service.useCaseAge` |
199
+ | `M3.service.function_name` | `service.functionName` |
200
+ | `M3.service.session` | `service.session` |
201
+ | `M3.service.transaction` | `service.transaction` |
202
+
203
+ ### Kafka Span Attributes
204
+
205
+ All Kafka spans (producer and consumer) include:
206
+
207
+ | Attribute | Description |
208
+ |---|---|
209
+ | `kafka.direction` | `produce` or `consume` |
210
+ | `kafka.topic` | Topic name |
211
+ | `kafka.key` | Message key |
212
+ | `kafka.partition` | Message partition |
213
+ | `kafka.offset` | Message offset |
214
+ | `kafka.header.<name>` | Each message header value |
215
+
216
+ ## Build
217
+
218
+ ```bash
219
+ npm run build
220
+ ```
221
+
222
+ Output is emitted to `./dist`.
223
+
224
+ ## License
225
+
226
+ ISC
@@ -5,7 +5,7 @@ exports.socketEmitHook = socketEmitHook;
5
5
  const m1_common_1 = require("./common/m1.common");
6
6
  function socketOnHook(span, hookInfo) {
7
7
  var _a, _b, _c, _d;
8
- if (!hookInfo && ((_a = hookInfo.payload) === null || _a === void 0 ? void 0 : _a.length) <= 0) {
8
+ if (!hookInfo || ((_a = hookInfo.payload) === null || _a === void 0 ? void 0 : _a.length) <= 0) {
9
9
  return;
10
10
  }
11
11
  if (typeof hookInfo.payload[0] === "object") {
@@ -25,7 +25,7 @@ function socketOnHook(span, hookInfo) {
25
25
  }
26
26
  function socketEmitHook(span, hookInfo) {
27
27
  var _a, _b, _c, _d;
28
- if (!hookInfo && ((_a = hookInfo.payload) === null || _a === void 0 ? void 0 : _a.length) <= 0) {
28
+ if (!hookInfo || ((_a = hookInfo.payload) === null || _a === void 0 ? void 0 : _a.length) <= 0) {
29
29
  return;
30
30
  }
31
31
  if (typeof hookInfo.payload[0] === "object") {
package/dist/register.js CHANGED
@@ -91,6 +91,14 @@ const sdk = new opentelemetry.NodeSDK({
91
91
  producerHook: kafka_span_1.producerHook,
92
92
  consumerHook: kafka_span_1.consumerHook,
93
93
  },
94
+ "@opentelemetry/instrumentation-eqxjs-kafkajs": {
95
+ producerHook: kafka_span_1.producerHook,
96
+ consumerHook: kafka_span_1.consumerHook,
97
+ },
98
+ "@opentelemetry/instrumentation-confluent-kafka": {
99
+ producerHook: kafka_span_1.producerHook,
100
+ consumerHook: kafka_span_1.consumerHook,
101
+ },
94
102
  "@opentelemetry/instrumentation-mongodb": {
95
103
  enhancedDatabaseReporting: true,
96
104
  },
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"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"}