@tracekit/node-apm 1.1.1 → 1.2.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 +183 -2
- package/dist/client.d.ts +4 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +231 -0
- package/dist/client.js.map +1 -1
- package/dist/middleware/express.d.ts.map +1 -1
- package/dist/middleware/express.js +52 -6
- package/dist/middleware/express.js.map +1 -1
- package/package.json +11 -8
package/README.md
CHANGED
|
@@ -96,6 +96,74 @@ export class AppModule {}
|
|
|
96
96
|
|
|
97
97
|
That's it! Your app is now automatically traced.
|
|
98
98
|
|
|
99
|
+
## Local Development
|
|
100
|
+
|
|
101
|
+
Debug your application locally without creating a cloud account using TraceKit Local UI.
|
|
102
|
+
|
|
103
|
+
### Quick Start
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Install Local UI globally
|
|
107
|
+
npm install -g @tracekit/local-ui
|
|
108
|
+
|
|
109
|
+
# Start it
|
|
110
|
+
tracekit-local
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
The Local UI will start at `http://localhost:9999` and automatically open in your browser.
|
|
114
|
+
|
|
115
|
+
### How It Works
|
|
116
|
+
|
|
117
|
+
When running in development mode (`NODE_ENV=development`), the SDK automatically:
|
|
118
|
+
|
|
119
|
+
1. Detects if Local UI is running at `http://localhost:9999`
|
|
120
|
+
2. Sends traces to both Local UI and cloud (if API key is present)
|
|
121
|
+
3. Falls back gracefully if Local UI is not available
|
|
122
|
+
|
|
123
|
+
**No code changes needed!** Just set `NODE_ENV=development`:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
export NODE_ENV=development
|
|
127
|
+
export TRACEKIT_API_KEY=your-key # Optional - works without it!
|
|
128
|
+
node app.js
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
You'll see traces appear in real-time at `http://localhost:9999`.
|
|
132
|
+
|
|
133
|
+
### Features
|
|
134
|
+
|
|
135
|
+
- Real-time trace viewing in your browser
|
|
136
|
+
- Works completely offline
|
|
137
|
+
- No cloud account required
|
|
138
|
+
- Zero configuration
|
|
139
|
+
- Automatic cleanup (1000 traces max, 1 hour retention)
|
|
140
|
+
|
|
141
|
+
### Local-Only Development
|
|
142
|
+
|
|
143
|
+
To use Local UI without cloud sending:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# Don't set TRACEKIT_API_KEY
|
|
147
|
+
export NODE_ENV=development
|
|
148
|
+
node app.js
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Traces will only go to Local UI.
|
|
152
|
+
|
|
153
|
+
### Disabling Local UI
|
|
154
|
+
|
|
155
|
+
To disable automatic Local UI detection:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
export NODE_ENV=production
|
|
159
|
+
# or don't run Local UI
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Learn More
|
|
163
|
+
|
|
164
|
+
- GitHub: [https://github.com/Tracekit-Dev/local-debug-ui](https://github.com/Tracekit-Dev/local-debug-ui)
|
|
165
|
+
- npm: [@tracekit/local-ui](https://www.npmjs.com/package/@tracekit/local-ui)
|
|
166
|
+
|
|
99
167
|
## Code Monitoring (Live Debugging)
|
|
100
168
|
|
|
101
169
|
TraceKit includes production-safe code monitoring for live debugging without redeployment.
|
|
@@ -211,6 +279,12 @@ tracekit.init({
|
|
|
211
279
|
|
|
212
280
|
// Optional: Enable live code debugging (default: false)
|
|
213
281
|
enableCodeMonitoring: true, // Enable breakpoints and snapshots
|
|
282
|
+
|
|
283
|
+
// Optional: Map hostnames to service names for service graph
|
|
284
|
+
serviceNameMappings: {
|
|
285
|
+
'localhost:8082': 'payment-service',
|
|
286
|
+
'localhost:8083': 'user-service',
|
|
287
|
+
},
|
|
214
288
|
});
|
|
215
289
|
```
|
|
216
290
|
|
|
@@ -238,11 +312,109 @@ import { TracekitModule } from '@tracekit/node-apm/nestjs';
|
|
|
238
312
|
export class AppModule {}
|
|
239
313
|
```
|
|
240
314
|
|
|
315
|
+
## Automatic Service Discovery
|
|
316
|
+
|
|
317
|
+
TraceKit automatically instruments **outgoing HTTP calls** to create service dependency graphs. This enables you to see which services talk to each other in your distributed system.
|
|
318
|
+
|
|
319
|
+
### How It Works
|
|
320
|
+
|
|
321
|
+
When your service makes an HTTP request to another service:
|
|
322
|
+
|
|
323
|
+
1. ✅ TraceKit creates a **CLIENT span** for the outgoing request
|
|
324
|
+
2. ✅ Trace context is automatically injected into request headers (`traceparent`)
|
|
325
|
+
3. ✅ The receiving service creates a **SERVER span** linked to your CLIENT span
|
|
326
|
+
4. ✅ TraceKit maps the dependency: **YourService → TargetService**
|
|
327
|
+
|
|
328
|
+
### Supported HTTP Clients
|
|
329
|
+
|
|
330
|
+
TraceKit automatically instruments these HTTP libraries:
|
|
331
|
+
|
|
332
|
+
- ✅ **`http`** / **`https`** (Node.js built-in modules)
|
|
333
|
+
- ✅ **`fetch`** (Node 18+ native fetch API)
|
|
334
|
+
- ✅ **`axios`** (works via http module)
|
|
335
|
+
- ✅ **`node-fetch`** (works via http module)
|
|
336
|
+
- ✅ **`got`**, **`superagent`**, etc. (work via http module)
|
|
337
|
+
|
|
338
|
+
**Zero configuration required!** Just make HTTP calls as normal:
|
|
339
|
+
|
|
340
|
+
```typescript
|
|
341
|
+
import axios from 'axios';
|
|
342
|
+
import fetch from 'node-fetch';
|
|
343
|
+
|
|
344
|
+
// All of these automatically create CLIENT spans:
|
|
345
|
+
await fetch('http://payment-service/charge');
|
|
346
|
+
await axios.get('http://inventory-service/check');
|
|
347
|
+
http.get('http://user-service/profile/123', callback);
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### Service Name Detection
|
|
351
|
+
|
|
352
|
+
TraceKit intelligently extracts service names from URLs:
|
|
353
|
+
|
|
354
|
+
| URL | Extracted Service Name |
|
|
355
|
+
|-----|------------------------|
|
|
356
|
+
| `http://payment-service:3000` | `payment-service` |
|
|
357
|
+
| `http://payment.internal` | `payment` |
|
|
358
|
+
| `http://payment.svc.cluster.local` | `payment` |
|
|
359
|
+
| `https://api.example.com` | `api.example.com` |
|
|
360
|
+
|
|
361
|
+
This works seamlessly with:
|
|
362
|
+
- Kubernetes service names
|
|
363
|
+
- Internal DNS names
|
|
364
|
+
- Docker Compose service names
|
|
365
|
+
- External APIs
|
|
366
|
+
|
|
367
|
+
### Custom Service Name Mappings
|
|
368
|
+
|
|
369
|
+
For local development or when service names can't be inferred from hostnames, use `serviceNameMappings`:
|
|
370
|
+
|
|
371
|
+
```typescript
|
|
372
|
+
tracekit.init({
|
|
373
|
+
apiKey: process.env.TRACEKIT_API_KEY,
|
|
374
|
+
serviceName: 'my-service',
|
|
375
|
+
// Map localhost URLs to actual service names
|
|
376
|
+
serviceNameMappings: {
|
|
377
|
+
'localhost:8082': 'payment-service',
|
|
378
|
+
'localhost:8083': 'user-service',
|
|
379
|
+
'localhost:8084': 'inventory-service',
|
|
380
|
+
'localhost:5001': 'analytics-service',
|
|
381
|
+
},
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
// Now requests to localhost:8082 will show as "payment-service" in the service graph
|
|
385
|
+
const response = await fetch('http://localhost:8082/charge');
|
|
386
|
+
// -> Creates CLIENT span with peer.service = "payment-service"
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
This is especially useful when:
|
|
390
|
+
- Running microservices locally on different ports
|
|
391
|
+
- Using Docker Compose with localhost networking
|
|
392
|
+
- Testing distributed tracing in development
|
|
393
|
+
|
|
394
|
+
### Viewing Service Dependencies
|
|
395
|
+
|
|
396
|
+
Visit your TraceKit dashboard to see:
|
|
397
|
+
|
|
398
|
+
- **Service Map**: Visual graph showing which services call which
|
|
399
|
+
- **Service List**: Table of all services with health metrics
|
|
400
|
+
- **Service Detail**: Deep dive on individual services with upstream/downstream dependencies
|
|
401
|
+
|
|
402
|
+
### Disabling Auto-Instrumentation
|
|
403
|
+
|
|
404
|
+
If you need to disable automatic HTTP client instrumentation:
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
tracekit.init({
|
|
408
|
+
apiKey: process.env.TRACEKIT_API_KEY,
|
|
409
|
+
autoInstrumentHttpClient: false, // Disable auto-instrumentation
|
|
410
|
+
});
|
|
411
|
+
```
|
|
412
|
+
|
|
241
413
|
## What Gets Traced?
|
|
242
414
|
|
|
243
|
-
### HTTP Requests
|
|
415
|
+
### Incoming HTTP Requests (SERVER spans)
|
|
244
416
|
|
|
245
|
-
Every HTTP request is automatically traced with:
|
|
417
|
+
Every HTTP request to your service is automatically traced with:
|
|
246
418
|
|
|
247
419
|
- Route path and HTTP method
|
|
248
420
|
- Request URL and query parameters
|
|
@@ -251,6 +423,15 @@ Every HTTP request is automatically traced with:
|
|
|
251
423
|
- User agent and client IP
|
|
252
424
|
- Controller and handler names (NestJS)
|
|
253
425
|
|
|
426
|
+
### Outgoing HTTP Requests (CLIENT spans)
|
|
427
|
+
|
|
428
|
+
Every HTTP request from your service is automatically traced with:
|
|
429
|
+
|
|
430
|
+
- Target URL and HTTP method
|
|
431
|
+
- HTTP status code
|
|
432
|
+
- Request duration
|
|
433
|
+
- `peer.service` attribute for service dependency mapping
|
|
434
|
+
|
|
254
435
|
### Errors and Exceptions
|
|
255
436
|
|
|
256
437
|
All exceptions are automatically captured with:
|
package/dist/client.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export interface TracekitConfig {
|
|
|
7
7
|
enabled?: boolean;
|
|
8
8
|
sampleRate?: number;
|
|
9
9
|
enableCodeMonitoring?: boolean;
|
|
10
|
+
autoInstrumentHttpClient?: boolean;
|
|
11
|
+
serviceNameMappings?: Record<string, string>;
|
|
10
12
|
}
|
|
11
13
|
export declare class TracekitClient {
|
|
12
14
|
private provider;
|
|
@@ -15,6 +17,7 @@ export declare class TracekitClient {
|
|
|
15
17
|
private snapshotClient?;
|
|
16
18
|
constructor(config: TracekitConfig);
|
|
17
19
|
startTrace(operationName: string, attributes?: Record<string, any>): api.Span;
|
|
20
|
+
startServerSpan(operationName: string, attributes?: Record<string, any>): api.Span;
|
|
18
21
|
startSpan(operationName: string, parentSpan?: api.Span | null, attributes?: Record<string, any>): api.Span;
|
|
19
22
|
endSpan(span: api.Span, finalAttributes?: Record<string, any>, status?: string): void;
|
|
20
23
|
addEvent(span: api.Span, name: string, attributes?: Record<string, any>): void;
|
|
@@ -27,6 +30,7 @@ export declare class TracekitClient {
|
|
|
27
30
|
getTracer(): api.Tracer;
|
|
28
31
|
getSnapshotClient(): SnapshotClient | undefined;
|
|
29
32
|
captureSnapshot(label: string, variables?: Record<string, any>): Promise<void>;
|
|
33
|
+
private extractServiceName;
|
|
30
34
|
private normalizeAttributes;
|
|
31
35
|
}
|
|
32
36
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAI1C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA2OnD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAMnC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9C;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAE5B,MAAM,EAAE,cAAc;IAmFlC,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,GAAG,CAAC,IAAI;IAWjF,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,GAAG,CAAC,IAAI;IAWtF,SAAS,CACP,aAAa,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,EAC5B,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GACnC,GAAG,CAAC,IAAI;IAcX,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,eAAe,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAgBzF,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,IAAI;IAIlF,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAwBnD,OAAO,CAAC,gBAAgB;IAgClB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAU/B,SAAS,IAAI,OAAO;IAIpB,YAAY,IAAI,OAAO;IAIvB,SAAS,IAAI,GAAG,CAAC,MAAM;IAKvB,iBAAiB,IAAI,cAAc,GAAG,SAAS;IAKzC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxF,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,mBAAmB;CAiB5B"}
|
package/dist/client.js
CHANGED
|
@@ -40,7 +40,190 @@ const resources_1 = require("@opentelemetry/resources");
|
|
|
40
40
|
const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
41
41
|
const sdk_trace_node_2 = require("@opentelemetry/sdk-trace-node");
|
|
42
42
|
const api = __importStar(require("@opentelemetry/api"));
|
|
43
|
+
const instrumentation_1 = require("@opentelemetry/instrumentation");
|
|
44
|
+
const instrumentation_http_1 = require("@opentelemetry/instrumentation-http");
|
|
45
|
+
const instrumentation_fetch_1 = require("@opentelemetry/instrumentation-fetch");
|
|
43
46
|
const snapshot_client_1 = require("./snapshot-client");
|
|
47
|
+
const http = __importStar(require("http"));
|
|
48
|
+
class LocalUISpanProcessor {
|
|
49
|
+
constructor() {
|
|
50
|
+
this.localUIAvailable = false;
|
|
51
|
+
this.checkedHealth = false;
|
|
52
|
+
this.batchedSpans = [];
|
|
53
|
+
this.batchTimer = null;
|
|
54
|
+
this.LOCAL_UI_URL = 'http://localhost:9999';
|
|
55
|
+
this.BATCH_TIMEOUT_MS = 1000;
|
|
56
|
+
this.MAX_BATCH_SIZE = 100;
|
|
57
|
+
}
|
|
58
|
+
async detectLocalUI() {
|
|
59
|
+
if (this.checkedHealth) {
|
|
60
|
+
return this.localUIAvailable;
|
|
61
|
+
}
|
|
62
|
+
return new Promise((resolve) => {
|
|
63
|
+
const req = http.request(`${this.LOCAL_UI_URL}/api/health`, {
|
|
64
|
+
method: 'GET',
|
|
65
|
+
timeout: 500,
|
|
66
|
+
}, (res) => {
|
|
67
|
+
this.localUIAvailable = res.statusCode === 200;
|
|
68
|
+
this.checkedHealth = true;
|
|
69
|
+
if (this.localUIAvailable) {
|
|
70
|
+
console.log('🔍 Local UI detected at http://localhost:9999');
|
|
71
|
+
}
|
|
72
|
+
resolve(this.localUIAvailable);
|
|
73
|
+
});
|
|
74
|
+
req.on('error', () => {
|
|
75
|
+
this.localUIAvailable = false;
|
|
76
|
+
this.checkedHealth = true;
|
|
77
|
+
resolve(false);
|
|
78
|
+
});
|
|
79
|
+
req.on('timeout', () => {
|
|
80
|
+
req.destroy();
|
|
81
|
+
this.localUIAvailable = false;
|
|
82
|
+
this.checkedHealth = true;
|
|
83
|
+
resolve(false);
|
|
84
|
+
});
|
|
85
|
+
req.end();
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
onStart(span) {
|
|
89
|
+
}
|
|
90
|
+
onEnd(span) {
|
|
91
|
+
if (process.env.NODE_ENV !== 'development') {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
this.batchedSpans.push(span);
|
|
95
|
+
if (this.batchedSpans.length >= this.MAX_BATCH_SIZE) {
|
|
96
|
+
this.flushBatch();
|
|
97
|
+
}
|
|
98
|
+
else if (!this.batchTimer) {
|
|
99
|
+
this.batchTimer = setTimeout(() => {
|
|
100
|
+
this.flushBatch();
|
|
101
|
+
}, this.BATCH_TIMEOUT_MS);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async flushBatch() {
|
|
105
|
+
if (this.batchTimer) {
|
|
106
|
+
clearTimeout(this.batchTimer);
|
|
107
|
+
this.batchTimer = null;
|
|
108
|
+
}
|
|
109
|
+
if (this.batchedSpans.length === 0) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const isAvailable = await this.detectLocalUI();
|
|
113
|
+
if (!isAvailable) {
|
|
114
|
+
this.batchedSpans = [];
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const resourceSpans = this.convertSpansToOTLP(this.batchedSpans);
|
|
118
|
+
const payload = JSON.stringify(resourceSpans);
|
|
119
|
+
this.batchedSpans = [];
|
|
120
|
+
this.sendToLocalUI(payload);
|
|
121
|
+
}
|
|
122
|
+
sendToLocalUI(payload) {
|
|
123
|
+
const req = http.request(`${this.LOCAL_UI_URL}/v1/traces`, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
headers: {
|
|
126
|
+
'Content-Type': 'application/json',
|
|
127
|
+
'Content-Length': Buffer.byteLength(payload),
|
|
128
|
+
},
|
|
129
|
+
timeout: 1000,
|
|
130
|
+
}, (res) => {
|
|
131
|
+
res.resume();
|
|
132
|
+
});
|
|
133
|
+
req.on('error', () => {
|
|
134
|
+
});
|
|
135
|
+
req.on('timeout', () => {
|
|
136
|
+
req.destroy();
|
|
137
|
+
});
|
|
138
|
+
req.write(payload);
|
|
139
|
+
req.end();
|
|
140
|
+
}
|
|
141
|
+
convertSpansToOTLP(spans) {
|
|
142
|
+
const resourceSpansMap = new Map();
|
|
143
|
+
for (const span of spans) {
|
|
144
|
+
const resourceKey = JSON.stringify(span.resource.attributes);
|
|
145
|
+
if (!resourceSpansMap.has(resourceKey)) {
|
|
146
|
+
resourceSpansMap.set(resourceKey, {
|
|
147
|
+
resource: {
|
|
148
|
+
attributes: this.convertAttributes(span.resource.attributes),
|
|
149
|
+
},
|
|
150
|
+
scopeSpans: [],
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
const resourceSpans = resourceSpansMap.get(resourceKey);
|
|
154
|
+
let scopeSpan = resourceSpans.scopeSpans.find((ss) => ss.scope?.name === span.instrumentationLibrary.name);
|
|
155
|
+
if (!scopeSpan) {
|
|
156
|
+
scopeSpan = {
|
|
157
|
+
scope: {
|
|
158
|
+
name: span.instrumentationLibrary.name,
|
|
159
|
+
version: span.instrumentationLibrary.version,
|
|
160
|
+
},
|
|
161
|
+
spans: [],
|
|
162
|
+
};
|
|
163
|
+
resourceSpans.scopeSpans.push(scopeSpan);
|
|
164
|
+
}
|
|
165
|
+
scopeSpan.spans.push(this.convertSpan(span));
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
resourceSpans: Array.from(resourceSpansMap.values()),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
convertSpan(span) {
|
|
172
|
+
return {
|
|
173
|
+
traceId: span.spanContext().traceId,
|
|
174
|
+
spanId: span.spanContext().spanId,
|
|
175
|
+
parentSpanId: span.parentSpanId,
|
|
176
|
+
name: span.name,
|
|
177
|
+
kind: span.kind,
|
|
178
|
+
startTimeUnixNano: String(span.startTime[0] * 1e9 + span.startTime[1]),
|
|
179
|
+
endTimeUnixNano: String(span.endTime[0] * 1e9 + span.endTime[1]),
|
|
180
|
+
attributes: this.convertAttributes(span.attributes),
|
|
181
|
+
events: span.events.map((event) => ({
|
|
182
|
+
timeUnixNano: String(event.time[0] * 1e9 + event.time[1]),
|
|
183
|
+
name: event.name,
|
|
184
|
+
attributes: this.convertAttributes(event.attributes || {}),
|
|
185
|
+
})),
|
|
186
|
+
status: {
|
|
187
|
+
code: span.status.code,
|
|
188
|
+
message: span.status.message,
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
convertAttributes(attributes) {
|
|
193
|
+
return Object.entries(attributes).map(([key, value]) => ({
|
|
194
|
+
key,
|
|
195
|
+
value: this.convertValue(value),
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
convertValue(value) {
|
|
199
|
+
if (typeof value === 'string') {
|
|
200
|
+
return { stringValue: value };
|
|
201
|
+
}
|
|
202
|
+
else if (typeof value === 'number') {
|
|
203
|
+
if (Number.isInteger(value)) {
|
|
204
|
+
return { intValue: String(value) };
|
|
205
|
+
}
|
|
206
|
+
return { doubleValue: value };
|
|
207
|
+
}
|
|
208
|
+
else if (typeof value === 'boolean') {
|
|
209
|
+
return { boolValue: value };
|
|
210
|
+
}
|
|
211
|
+
else if (Array.isArray(value)) {
|
|
212
|
+
return {
|
|
213
|
+
arrayValue: {
|
|
214
|
+
values: value.map((v) => this.convertValue(v)),
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return { stringValue: String(value) };
|
|
219
|
+
}
|
|
220
|
+
async forceFlush() {
|
|
221
|
+
await this.flushBatch();
|
|
222
|
+
}
|
|
223
|
+
async shutdown() {
|
|
224
|
+
await this.flushBatch();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
44
227
|
class TracekitClient {
|
|
45
228
|
constructor(config) {
|
|
46
229
|
this.config = {
|
|
@@ -49,7 +232,9 @@ class TracekitClient {
|
|
|
49
232
|
enabled: config.enabled ?? true,
|
|
50
233
|
sampleRate: config.sampleRate ?? 1.0,
|
|
51
234
|
enableCodeMonitoring: config.enableCodeMonitoring ?? false,
|
|
235
|
+
autoInstrumentHttpClient: config.autoInstrumentHttpClient ?? true,
|
|
52
236
|
apiKey: config.apiKey,
|
|
237
|
+
serviceNameMappings: config.serviceNameMappings ?? {},
|
|
53
238
|
};
|
|
54
239
|
const resource = new resources_1.Resource({
|
|
55
240
|
[semantic_conventions_1.SemanticResourceAttributes.SERVICE_NAME]: this.config.serviceName,
|
|
@@ -65,7 +250,31 @@ class TracekitClient {
|
|
|
65
250
|
},
|
|
66
251
|
});
|
|
67
252
|
this.provider.addSpanProcessor(new sdk_trace_node_2.BatchSpanProcessor(exporter));
|
|
253
|
+
if (process.env.NODE_ENV === 'development') {
|
|
254
|
+
this.provider.addSpanProcessor(new LocalUISpanProcessor());
|
|
255
|
+
}
|
|
68
256
|
this.provider.register();
|
|
257
|
+
if (this.config.autoInstrumentHttpClient) {
|
|
258
|
+
(0, instrumentation_1.registerInstrumentations)({
|
|
259
|
+
tracerProvider: this.provider,
|
|
260
|
+
instrumentations: [
|
|
261
|
+
new instrumentation_http_1.HttpInstrumentation({
|
|
262
|
+
requireParentforOutgoingSpans: true,
|
|
263
|
+
requireParentforIncomingSpans: false,
|
|
264
|
+
requestHook: (span, request) => {
|
|
265
|
+
if ('hostname' in request || 'host' in request) {
|
|
266
|
+
const hostname = request.hostname || request.host;
|
|
267
|
+
if (hostname) {
|
|
268
|
+
const serviceName = this.extractServiceName(hostname);
|
|
269
|
+
span.setAttribute('peer.service', serviceName);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
}),
|
|
274
|
+
new instrumentation_fetch_1.FetchInstrumentation({}),
|
|
275
|
+
],
|
|
276
|
+
});
|
|
277
|
+
}
|
|
69
278
|
}
|
|
70
279
|
this.tracer = api.trace.getTracer('@tracekit/node-apm', '1.0.0');
|
|
71
280
|
if (this.config.enableCodeMonitoring) {
|
|
@@ -79,6 +288,12 @@ class TracekitClient {
|
|
|
79
288
|
attributes: this.normalizeAttributes(attributes),
|
|
80
289
|
});
|
|
81
290
|
}
|
|
291
|
+
startServerSpan(operationName, attributes = {}) {
|
|
292
|
+
return this.tracer.startSpan(operationName, {
|
|
293
|
+
kind: api.SpanKind.SERVER,
|
|
294
|
+
attributes: this.normalizeAttributes(attributes),
|
|
295
|
+
}, api.context.active());
|
|
296
|
+
}
|
|
82
297
|
startSpan(operationName, parentSpan, attributes = {}) {
|
|
83
298
|
const options = {
|
|
84
299
|
kind: api.SpanKind.INTERNAL,
|
|
@@ -170,6 +385,22 @@ class TracekitClient {
|
|
|
170
385
|
await this.snapshotClient.checkAndCaptureWithContext(label, variables);
|
|
171
386
|
}
|
|
172
387
|
}
|
|
388
|
+
extractServiceName(hostname) {
|
|
389
|
+
if (this.config.serviceNameMappings[hostname]) {
|
|
390
|
+
return this.config.serviceNameMappings[hostname];
|
|
391
|
+
}
|
|
392
|
+
const hostWithoutPort = hostname.split(':')[0];
|
|
393
|
+
if (this.config.serviceNameMappings[hostWithoutPort]) {
|
|
394
|
+
return this.config.serviceNameMappings[hostWithoutPort];
|
|
395
|
+
}
|
|
396
|
+
if (hostname.includes('.svc.cluster.local')) {
|
|
397
|
+
return hostname.split('.')[0];
|
|
398
|
+
}
|
|
399
|
+
if (hostname.includes('.internal')) {
|
|
400
|
+
return hostname.split('.')[0];
|
|
401
|
+
}
|
|
402
|
+
return hostWithoutPort;
|
|
403
|
+
}
|
|
173
404
|
normalizeAttributes(attributes) {
|
|
174
405
|
const normalized = {};
|
|
175
406
|
for (const [key, value] of Object.entries(attributes)) {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAS1C,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,cAAc,IAC/E,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,mBAwF9D;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAE5D;AAGD,wBAAgB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAEnE"}
|
|
@@ -1,10 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.createExpressMiddleware = createExpressMiddleware;
|
|
4
37
|
exports.getCurrentSpan = getCurrentSpan;
|
|
5
38
|
exports.getRequestContext = getRequestContext;
|
|
6
39
|
const async_hooks_1 = require("async_hooks");
|
|
40
|
+
const api = __importStar(require("@opentelemetry/api"));
|
|
41
|
+
const core_1 = require("@opentelemetry/core");
|
|
7
42
|
const requestContextStorage = new async_hooks_1.AsyncLocalStorage();
|
|
43
|
+
const propagator = new core_1.W3CTraceContextPropagator();
|
|
8
44
|
function createExpressMiddleware(client, snapshotClient) {
|
|
9
45
|
return async (req, res, next) => {
|
|
10
46
|
if (!client.isEnabled() || !client.shouldSample()) {
|
|
@@ -12,12 +48,22 @@ function createExpressMiddleware(client, snapshotClient) {
|
|
|
12
48
|
}
|
|
13
49
|
const startTime = Date.now();
|
|
14
50
|
const operationName = getOperationName(req);
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
51
|
+
const parentContext = propagator.extract(api.context.active(), req.headers, {
|
|
52
|
+
get(carrier, key) {
|
|
53
|
+
return carrier[key.toLowerCase()];
|
|
54
|
+
},
|
|
55
|
+
keys(carrier) {
|
|
56
|
+
return Object.keys(carrier);
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
const span = api.context.with(parentContext, () => {
|
|
60
|
+
return client.startServerSpan(operationName, {
|
|
61
|
+
'http.method': req.method,
|
|
62
|
+
'http.url': req.originalUrl || req.url,
|
|
63
|
+
'http.route': req.route?.path || req.path,
|
|
64
|
+
'http.user_agent': req.get('user-agent') || '',
|
|
65
|
+
'http.client_ip': getClientIp(req),
|
|
66
|
+
});
|
|
21
67
|
});
|
|
22
68
|
req.__tracekitSpan = span;
|
|
23
69
|
const requestContext = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tracekit/node-apm",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "TraceKit APM for Node.js - Zero-config distributed tracing and code monitoring for Express and NestJS",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -38,15 +38,18 @@
|
|
|
38
38
|
"homepage": "https://tracekit.dev",
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@opentelemetry/api": "^1.7.0",
|
|
41
|
-
"@opentelemetry/sdk-trace-node": "^1.19.0",
|
|
42
41
|
"@opentelemetry/exporter-trace-otlp-http": "^0.46.0",
|
|
42
|
+
"@opentelemetry/instrumentation": "^0.56.0",
|
|
43
|
+
"@opentelemetry/instrumentation-fetch": "^0.56.0",
|
|
44
|
+
"@opentelemetry/instrumentation-http": "^0.56.0",
|
|
43
45
|
"@opentelemetry/resources": "^1.19.0",
|
|
46
|
+
"@opentelemetry/sdk-trace-node": "^1.19.0",
|
|
44
47
|
"@opentelemetry/semantic-conventions": "^1.19.0"
|
|
45
48
|
},
|
|
46
49
|
"peerDependencies": {
|
|
47
|
-
"express": "^4.18.0 || ^5.0.0",
|
|
48
50
|
"@nestjs/common": "^10.0.0",
|
|
49
|
-
"@nestjs/core": "^10.0.0"
|
|
51
|
+
"@nestjs/core": "^10.0.0",
|
|
52
|
+
"express": "^4.18.0 || ^5.0.0"
|
|
50
53
|
},
|
|
51
54
|
"peerDependenciesMeta": {
|
|
52
55
|
"express": {
|
|
@@ -60,12 +63,12 @@
|
|
|
60
63
|
}
|
|
61
64
|
},
|
|
62
65
|
"devDependencies": {
|
|
63
|
-
"@types/express": "^4.17.21",
|
|
64
|
-
"@types/node": "^20.10.0",
|
|
65
66
|
"@nestjs/common": "^10.0.0",
|
|
66
67
|
"@nestjs/core": "^10.0.0",
|
|
67
|
-
"
|
|
68
|
-
"
|
|
68
|
+
"@types/express": "^4.17.21",
|
|
69
|
+
"@types/node": "^20.10.0",
|
|
70
|
+
"express": "^4.18.0",
|
|
71
|
+
"typescript": "^5.3.0"
|
|
69
72
|
},
|
|
70
73
|
"engines": {
|
|
71
74
|
"node": ">=16.0.0"
|