@pingops/otel 0.1.0

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.
Files changed (42) hide show
  1. package/README.md +93 -0
  2. package/dist/config.d.ts +75 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +5 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/index.d.ts +10 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +9 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/instrumentations/body-extractor.d.ts +48 -0
  11. package/dist/instrumentations/body-extractor.d.ts.map +1 -0
  12. package/dist/instrumentations/body-extractor.js +361 -0
  13. package/dist/instrumentations/body-extractor.js.map +1 -0
  14. package/dist/instrumentations/http.d.ts +12 -0
  15. package/dist/instrumentations/http.d.ts.map +1 -0
  16. package/dist/instrumentations/http.js +38 -0
  17. package/dist/instrumentations/http.js.map +1 -0
  18. package/dist/instrumentations/index.d.ts +17 -0
  19. package/dist/instrumentations/index.d.ts.map +1 -0
  20. package/dist/instrumentations/index.js +32 -0
  21. package/dist/instrumentations/index.js.map +1 -0
  22. package/dist/instrumentations/undici.d.ts +12 -0
  23. package/dist/instrumentations/undici.d.ts.map +1 -0
  24. package/dist/instrumentations/undici.js +38 -0
  25. package/dist/instrumentations/undici.js.map +1 -0
  26. package/dist/processor.d.ts +82 -0
  27. package/dist/processor.d.ts.map +1 -0
  28. package/dist/processor.js +264 -0
  29. package/dist/processor.js.map +1 -0
  30. package/dist/span-processor.d.ts +78 -0
  31. package/dist/span-processor.d.ts.map +1 -0
  32. package/dist/span-processor.js +272 -0
  33. package/dist/span-processor.js.map +1 -0
  34. package/dist/span-wrapper.d.ts +60 -0
  35. package/dist/span-wrapper.d.ts.map +1 -0
  36. package/dist/span-wrapper.js +118 -0
  37. package/dist/span-wrapper.js.map +1 -0
  38. package/dist/tracer-provider.d.ts +57 -0
  39. package/dist/tracer-provider.d.ts.map +1 -0
  40. package/dist/tracer-provider.js +182 -0
  41. package/dist/tracer-provider.js.map +1 -0
  42. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # @pingops/otel
2
+
3
+ OpenTelemetry `SpanProcessor` implementation for PingOps. This package provides the `PingopsSpanProcessor` that observes finished spans and sends eligible ones to the PingOps backend.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @pingops/otel
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Basic Usage (Batched Mode)
14
+
15
+ ```typescript
16
+ import { PingopsSpanProcessor } from "@pingops/otel";
17
+ import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
18
+
19
+ const processor = new PingopsSpanProcessor({
20
+ apiKey: "your-api-key", // or set PINGOPS_API_KEY env var
21
+ baseUrl: "https://api.pingops.com",
22
+ serviceName: "my-service",
23
+ exportMode: "batched", // default
24
+ batchSize: 50,
25
+ batchTimeout: 5000,
26
+ });
27
+
28
+ const tracerProvider = new NodeTracerProvider();
29
+ tracerProvider.addSpanProcessor(processor);
30
+ tracerProvider.register();
31
+ ```
32
+
33
+ ### Immediate Mode (for Serverless)
34
+
35
+ ```typescript
36
+ const processor = new PingopsSpanProcessor({
37
+ apiKey: "your-api-key",
38
+ baseUrl: "https://api.pingops.com",
39
+ serviceName: "my-service",
40
+ exportMode: "immediate", // Spans are sent immediately
41
+ });
42
+ ```
43
+
44
+ ## Configuration
45
+
46
+ ### PingopsProcessorConfig
47
+
48
+ - `apiKey?: string` - API key for authentication (defaults to `PINGOPS_API_KEY` env var)
49
+ - `baseUrl: string` - PingOps backend URL (required)
50
+ - `debug?: boolean` - Enable debug logging (default: `false`)
51
+ - `serviceName: string` - Service name for resource identification (required)
52
+ - `headersAllowList?: string[]` - List of headers to include (case-insensitive)
53
+ - `headersDenyList?: string[]` - List of headers to exclude (case-insensitive, takes precedence)
54
+ - `domainAllowList?: DomainRule[]` - Domain allow list rules
55
+ - `domainDenyList?: DomainRule[]` - Domain deny list rules
56
+ - `batchSize?: number` - Batch size for sending spans, only used in batched mode (default: `50`)
57
+ - `batchTimeout?: number` - Batch timeout in milliseconds, only used in batched mode (default: `5000`)
58
+ - `exportMode?: 'immediate' | 'batched'` - Span export mode:
59
+ - **batched**: Recommended for production environments with long-running processes. Spans are batched and exported in groups for optimal performance (default)
60
+ - **immediate**: Recommended for short-lived environments such as serverless functions. Spans are exported immediately to prevent data loss when the process terminates
61
+
62
+ ### Domain Rules
63
+
64
+ ```typescript
65
+ interface DomainRule {
66
+ domain: string; // Exact or suffix match (e.g., '.github.com')
67
+ paths?: string[]; // Path prefix matches
68
+ headersAllowList?: string[];
69
+ headersDenyList?: string[];
70
+ }
71
+ ```
72
+
73
+ ## Span Filtering
74
+
75
+ The processor only captures spans that meet these criteria:
76
+
77
+ 1. `span.kind === SpanKind.CLIENT` (outgoing requests only)
78
+ 2. Has HTTP attributes (`http.method`, `http.url`, or `server.address`)
79
+ OR has GenAI attributes (`gen_ai.system`, `gen_ai.operation.name`)
80
+
81
+ ## How It Works
82
+
83
+ 1. **Observation Only**: The processor implements `SpanProcessor` and only observes finished spans
84
+ 2. **Filtering**: Filters spans based on kind, attributes, and domain rules
85
+ 3. **Extraction**: Extracts structured data from eligible spans
86
+ 4. **Export Modes**:
87
+ - **Batched** (default): Batches spans before sending to reduce network overhead. Ideal for long-running processes.
88
+ - **Immediate**: Sends spans immediately. Ideal for serverless functions or short-lived processes.
89
+ 5. **Fire-and-Forget**: Sends spans asynchronously without blocking the application
90
+
91
+ ## Integration with Existing OpenTelemetry
92
+
93
+ This processor is designed to work alongside existing OpenTelemetry exporters. It does not interfere with your existing telemetry pipeline.
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Configuration types for PingopsSpanProcessor
3
+ */
4
+ import type { DomainRule } from "@pingops/core";
5
+ /**
6
+ * Span export mode to use.
7
+ *
8
+ * - **batched**: Recommended for production environments with long-running processes.
9
+ * Spans are batched and exported in groups for optimal performance.
10
+ * - **immediate**: Recommended for short-lived environments such as serverless functions.
11
+ * Spans are exported immediately to prevent data loss when the process terminates / is frozen.
12
+ *
13
+ * @defaultValue "batched"
14
+ */
15
+ export type PingopsExportMode = "immediate" | "batched";
16
+ /**
17
+ * Configuration parameters for the PingopsSpanProcessor.
18
+ */
19
+ export interface PingopsProcessorConfig {
20
+ /**
21
+ * API key for authentication. Can also be set via PINGOPS_API_KEY environment variable.
22
+ */
23
+ apiKey?: string;
24
+ /**
25
+ * PingOps backend base URL (required).
26
+ */
27
+ baseUrl: string;
28
+ /**
29
+ * Enable debug logging.
30
+ * @defaultValue false
31
+ */
32
+ debug?: boolean;
33
+ /**
34
+ * Service name for resource identification (required).
35
+ */
36
+ serviceName: string;
37
+ /**
38
+ * List of headers to include (case-insensitive).
39
+ */
40
+ headersAllowList?: string[];
41
+ /**
42
+ * List of headers to exclude (case-insensitive, takes precedence over allow list).
43
+ */
44
+ headersDenyList?: string[];
45
+ /**
46
+ * Domain allow list rules.
47
+ */
48
+ domainAllowList?: DomainRule[];
49
+ /**
50
+ * Domain deny list rules.
51
+ */
52
+ domainDenyList?: DomainRule[];
53
+ /**
54
+ * Number of spans to batch before flushing (only used in batched mode).
55
+ * @defaultValue 50
56
+ */
57
+ batchSize?: number;
58
+ /**
59
+ * Flush interval in milliseconds (only used in batched mode).
60
+ * @defaultValue 5000
61
+ */
62
+ batchTimeout?: number;
63
+ /**
64
+ * Span export mode to use.
65
+ *
66
+ * - **batched**: Recommended for production environments with long-running processes.
67
+ * Spans are batched and exported in groups for optimal performance.
68
+ * - **immediate**: Recommended for short-lived environments such as serverless functions.
69
+ * Spans are exported immediately to prevent data loss when the process terminates / is frozen.
70
+ *
71
+ * @defaultValue "batched"
72
+ */
73
+ exportMode?: PingopsExportMode;
74
+ }
75
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,SAAS,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B;;OAEG;IACH,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC;IAE/B;;OAEG;IACH,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC;IAE9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC"}
package/dist/config.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Configuration types for PingopsSpanProcessor
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @pingops/otel - OpenTelemetry SpanProcessor for PingOps
3
+ */
4
+ export { PingopsSpanProcessor } from "./span-processor";
5
+ export type { PingopsProcessorConfig } from "./config";
6
+ export { setPingopsTracerProvider, getPingopsTracerProvider, shutdownTracerProvider, } from "./tracer-provider";
7
+ export { getInstrumentations } from "./instrumentations";
8
+ export { createHttpInstrumentation } from "./instrumentations/http";
9
+ export { createUndiciInstrumentation } from "./instrumentations/undici";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @pingops/otel - OpenTelemetry SpanProcessor for PingOps
3
+ */
4
+ export { PingopsSpanProcessor } from "./span-processor";
5
+ export { setPingopsTracerProvider, getPingopsTracerProvider, shutdownTracerProvider, } from "./tracer-provider";
6
+ export { getInstrumentations } from "./instrumentations";
7
+ export { createHttpInstrumentation } from "./instrumentations/http";
8
+ export { createUndiciInstrumentation } from "./instrumentations/undici";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Utilities for extracting HTTP request and response bodies
3
+ *
4
+ * Handles streaming bodies by buffering data from streams
5
+ */
6
+ import type { IncomingMessage, ClientRequest } from 'http';
7
+ import type { Span } from '@opentelemetry/api';
8
+ /**
9
+ * Captures HTTP request body using event handlers
10
+ *
11
+ * Uses a PassThrough stream to capture data via events, while still needing to
12
+ * intercept write()/end() to feed data into the stream
13
+ */
14
+ export declare function captureHttpRequestBody(span: Span, request: ClientRequest): void;
15
+ /**
16
+ * Extracts request body from HTTP ClientRequest (legacy function, kept for compatibility)
17
+ */
18
+ export declare function extractHttpRequestBody(_request: ClientRequest | IncomingMessage): string | null;
19
+ /**
20
+ * Captures HTTP response body by listening to stream events
21
+ */
22
+ export declare function captureHttpResponseBody(span: Span, response: IncomingMessage): void;
23
+ /**
24
+ * Extracts response body from HTTP IncomingMessage (legacy function, kept for compatibility)
25
+ */
26
+ export declare function extractHttpResponseBody(_response: IncomingMessage): string | null;
27
+ /**
28
+ * Extracts request body from Undici request
29
+ */
30
+ export declare function extractUndiciRequestBody(request: {
31
+ body?: unknown;
32
+ contentType?: string | null;
33
+ }): string | null;
34
+ /**
35
+ * Captures Undici response body by reading from the body stream
36
+ */
37
+ export declare function captureUndiciResponseBody(span: Span, response: {
38
+ body?: any;
39
+ headers?: Buffer[] | Record<string, string | string[]>;
40
+ }): void;
41
+ /**
42
+ * Extracts response body from Undici response (legacy function, kept for compatibility)
43
+ */
44
+ export declare function extractUndiciResponseBody(response: {
45
+ body?: unknown;
46
+ headers?: Buffer[] | Record<string, string | string[]>;
47
+ }): string | null;
48
+ //# sourceMappingURL=body-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-extractor.d.ts","sourceRoot":"","sources":["../../src/instrumentations/body-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC3D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAiF/C;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,aAAa,GACrB,IAAI,CAwEN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,aAAa,GAAG,eAAe,GACxC,MAAM,GAAG,IAAI,CAGf;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,eAAe,GACxB,IAAI,CAiDN;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,eAAe,GACzB,MAAM,GAAG,IAAI,CAGf;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACvD,MAAM,GAAG,IAAI,CASf;AAgCD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE;IAAE,IAAI,CAAC,EAAE,GAAG,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAA;CAAE,GAC/E,IAAI,CAiGN;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAA;CAAE,GACnF,MAAM,GAAG,IAAI,CAUf"}
@@ -0,0 +1,361 @@
1
+ /**
2
+ * Utilities for extracting HTTP request and response bodies
3
+ *
4
+ * Handles streaming bodies by buffering data from streams
5
+ */
6
+ import { PassThrough } from 'stream';
7
+ // Maximum body size to capture (1MB)
8
+ const MAX_BODY_SIZE = 1024 * 1024;
9
+ // Content types to skip (binary data)
10
+ const BINARY_CONTENT_TYPES = [
11
+ 'application/octet-stream',
12
+ 'image/',
13
+ 'video/',
14
+ 'audio/',
15
+ 'application/pdf',
16
+ 'application/zip',
17
+ 'application/gzip',
18
+ ];
19
+ /**
20
+ * Checks if a content type should be skipped (binary data)
21
+ */
22
+ function shouldSkipContentType(contentType) {
23
+ if (!contentType) {
24
+ return false;
25
+ }
26
+ const normalized = contentType.toLowerCase().split(';')[0].trim();
27
+ return BINARY_CONTENT_TYPES.some((skipType) => normalized.startsWith(skipType));
28
+ }
29
+ /**
30
+ * Converts a body value to a string representation
31
+ */
32
+ function bodyToString(body) {
33
+ if (body === null || body === undefined) {
34
+ return null;
35
+ }
36
+ // Already a string
37
+ if (typeof body === 'string') {
38
+ return body.length > MAX_BODY_SIZE ? body.substring(0, MAX_BODY_SIZE) : body;
39
+ }
40
+ // Buffer
41
+ if (Buffer.isBuffer(body)) {
42
+ if (body.length > MAX_BODY_SIZE) {
43
+ return body.subarray(0, MAX_BODY_SIZE).toString('utf8');
44
+ }
45
+ return body.toString('utf8');
46
+ }
47
+ // ArrayBuffer or ArrayBufferView
48
+ if (body instanceof ArrayBuffer) {
49
+ const buffer = Buffer.from(body);
50
+ if (buffer.length > MAX_BODY_SIZE) {
51
+ return buffer.subarray(0, MAX_BODY_SIZE).toString('utf8');
52
+ }
53
+ return buffer.toString('utf8');
54
+ }
55
+ // Uint8Array or similar
56
+ if (body instanceof Uint8Array) {
57
+ const buffer = Buffer.from(body);
58
+ if (buffer.length > MAX_BODY_SIZE) {
59
+ return buffer.subarray(0, MAX_BODY_SIZE).toString('utf8');
60
+ }
61
+ return buffer.toString('utf8');
62
+ }
63
+ // Try to convert to string via JSON or toString
64
+ try {
65
+ if (typeof body === 'object') {
66
+ const json = JSON.stringify(body);
67
+ return json.length > MAX_BODY_SIZE ? json.substring(0, MAX_BODY_SIZE) : json;
68
+ }
69
+ const str = String(body);
70
+ return str.length > MAX_BODY_SIZE ? str.substring(0, MAX_BODY_SIZE) : str;
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ }
76
+ /**
77
+ * Captures HTTP request body using event handlers
78
+ *
79
+ * Uses a PassThrough stream to capture data via events, while still needing to
80
+ * intercept write()/end() to feed data into the stream
81
+ */
82
+ export function captureHttpRequestBody(span, request) {
83
+ // Check content-type to see if we should skip
84
+ const contentType = request.getHeader('content-type');
85
+ console.log('captureHttpRequestBody contentType', contentType);
86
+ if (shouldSkipContentType(typeof contentType === 'string' ? contentType : null)) {
87
+ return;
88
+ }
89
+ const chunks = [];
90
+ let totalSize = 0;
91
+ // Create a PassThrough stream to capture data via events
92
+ const captureStream = new PassThrough();
93
+ // Listen to data events on the capture stream
94
+ captureStream.on('data', (chunk) => {
95
+ if (totalSize < MAX_BODY_SIZE) {
96
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
97
+ const remaining = MAX_BODY_SIZE - totalSize;
98
+ if (buffer.length <= remaining) {
99
+ chunks.push(buffer);
100
+ totalSize += buffer.length;
101
+ }
102
+ else {
103
+ chunks.push(buffer.subarray(0, remaining));
104
+ totalSize = MAX_BODY_SIZE;
105
+ }
106
+ }
107
+ });
108
+ // Listen to end event to set the body attribute
109
+ captureStream.once('end', () => {
110
+ console.log('captureStream.once end', chunks);
111
+ if (chunks.length > 0 && span.isRecording()) {
112
+ try {
113
+ const body = Buffer.concat(chunks).toString('utf8');
114
+ span.setAttribute('http.request.body', body);
115
+ }
116
+ catch (error) {
117
+ // Silently fail if we can't convert to string
118
+ }
119
+ }
120
+ });
121
+ // Handle errors gracefully
122
+ captureStream.once('error', () => {
123
+ // Don't set body on error
124
+ });
125
+ // Store original methods
126
+ const originalWrite = request.write.bind(request);
127
+ const originalEnd = request.end.bind(request);
128
+ // Intercept write() to feed data into our event-based capture stream
129
+ request.write = function (chunk, encoding, callback) {
130
+ // Write to capture stream to trigger 'data' events
131
+ if (chunk) {
132
+ captureStream.write(chunk, encoding);
133
+ }
134
+ return originalWrite(chunk, encoding, callback);
135
+ };
136
+ // Intercept end() to finalize capture
137
+ request.end = function (chunk, encoding, callback) {
138
+ // Write final chunk to capture stream if present
139
+ if (chunk) {
140
+ captureStream.write(chunk, encoding);
141
+ }
142
+ // End the capture stream to trigger 'end' event
143
+ captureStream.end();
144
+ return originalEnd(chunk, encoding, callback);
145
+ };
146
+ }
147
+ /**
148
+ * Extracts request body from HTTP ClientRequest (legacy function, kept for compatibility)
149
+ */
150
+ export function extractHttpRequestBody(_request) {
151
+ // This function is kept for compatibility but captureHttpRequestBody should be used instead
152
+ return null;
153
+ }
154
+ /**
155
+ * Captures HTTP response body by listening to stream events
156
+ */
157
+ export function captureHttpResponseBody(span, response) {
158
+ // Check content-type to see if we should skip
159
+ const contentType = response.headers['content-type'];
160
+ console.log('captureHttpResponseBody contentType', contentType);
161
+ if (shouldSkipContentType(typeof contentType === 'string' ? contentType : Array.isArray(contentType) ? contentType[0] : null)) {
162
+ return;
163
+ }
164
+ // Check if stream is already consumed or destroyed
165
+ if (response.readableEnded || response.destroyed) {
166
+ return;
167
+ }
168
+ const chunks = [];
169
+ let totalSize = 0;
170
+ // Listen to data events to capture chunks
171
+ response.on('data', (chunk) => {
172
+ if (totalSize < MAX_BODY_SIZE) {
173
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
174
+ const remaining = MAX_BODY_SIZE - totalSize;
175
+ if (buffer.length <= remaining) {
176
+ chunks.push(buffer);
177
+ totalSize += buffer.length;
178
+ }
179
+ else {
180
+ chunks.push(buffer.subarray(0, remaining));
181
+ totalSize = MAX_BODY_SIZE;
182
+ }
183
+ }
184
+ });
185
+ // When stream ends, set the body attribute
186
+ response.once('end', () => {
187
+ console.log('captureHttpResponseBody.once end', chunks);
188
+ if (chunks.length > 0 && span.isRecording()) {
189
+ try {
190
+ const body = Buffer.concat(chunks).toString('utf8');
191
+ span.setAttribute('http.response.body', body);
192
+ }
193
+ catch (error) {
194
+ // Silently fail if we can't convert to string
195
+ }
196
+ }
197
+ });
198
+ // Handle errors gracefully
199
+ response.once('error', () => {
200
+ // Don't set body on error
201
+ });
202
+ }
203
+ /**
204
+ * Extracts response body from HTTP IncomingMessage (legacy function, kept for compatibility)
205
+ */
206
+ export function extractHttpResponseBody(_response) {
207
+ // This function is kept for compatibility but captureHttpResponseBody should be used instead
208
+ return null;
209
+ }
210
+ /**
211
+ * Extracts request body from Undici request
212
+ */
213
+ export function extractUndiciRequestBody(request) {
214
+ const { body, contentType } = request;
215
+ // Skip if content type indicates binary data
216
+ if (shouldSkipContentType(contentType)) {
217
+ return null;
218
+ }
219
+ return bodyToString(body);
220
+ }
221
+ /**
222
+ * Gets content-type from Undici response headers
223
+ */
224
+ function getUndiciContentType(headers) {
225
+ if (!headers) {
226
+ return null;
227
+ }
228
+ if (Array.isArray(headers)) {
229
+ // Headers are in format [key1, value1, key2, value2, ...]
230
+ for (let i = 0; i < headers.length; i += 2) {
231
+ const key = headers[i]?.toString().toLowerCase();
232
+ if (key === 'content-type') {
233
+ return headers[i + 1]?.toString() || null;
234
+ }
235
+ }
236
+ }
237
+ else if (typeof headers === 'object') {
238
+ const contentTypeHeader = headers['content-type'] || headers['Content-Type'];
239
+ if (typeof contentTypeHeader === 'string') {
240
+ return contentTypeHeader;
241
+ }
242
+ else if (Array.isArray(contentTypeHeader) && contentTypeHeader.length > 0) {
243
+ return contentTypeHeader[0];
244
+ }
245
+ }
246
+ return null;
247
+ }
248
+ /**
249
+ * Captures Undici response body by reading from the body stream
250
+ */
251
+ export function captureUndiciResponseBody(span, response) {
252
+ // Get content-type
253
+ const contentType = getUndiciContentType(response.headers);
254
+ if (shouldSkipContentType(contentType)) {
255
+ return;
256
+ }
257
+ // Check if body is a stream or readable
258
+ const body = response.body;
259
+ if (!body) {
260
+ return;
261
+ }
262
+ // If body is directly available (not a stream), extract it
263
+ if (body && typeof body !== 'object' || !('on' in body) && !('pipe' in body)) {
264
+ const bodyStr = bodyToString(body);
265
+ if (bodyStr !== null && span.isRecording()) {
266
+ span.setAttribute('http.response.body', bodyStr);
267
+ }
268
+ return;
269
+ }
270
+ // Handle stream-like body (Readable, Body, etc.)
271
+ if (body && typeof body === 'object' && ('on' in body || 'pipe' in body || 'read' in body)) {
272
+ const chunks = [];
273
+ let totalSize = 0;
274
+ let captured = false;
275
+ // Try to read from stream
276
+ const captureChunk = (chunk) => {
277
+ if (captured || totalSize >= MAX_BODY_SIZE) {
278
+ return;
279
+ }
280
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
281
+ const remaining = MAX_BODY_SIZE - totalSize;
282
+ if (buffer.length <= remaining) {
283
+ chunks.push(buffer);
284
+ totalSize += buffer.length;
285
+ }
286
+ else {
287
+ chunks.push(buffer.subarray(0, remaining));
288
+ totalSize = MAX_BODY_SIZE;
289
+ }
290
+ };
291
+ // Try different stream interfaces
292
+ if (typeof body.on === 'function') {
293
+ // Node.js stream interface
294
+ body.on('data', captureChunk);
295
+ body.once('end', () => {
296
+ if (!captured && chunks.length > 0 && span.isRecording()) {
297
+ captured = true;
298
+ try {
299
+ const bodyStr = Buffer.concat(chunks).toString('utf8');
300
+ span.setAttribute('http.response.body', bodyStr);
301
+ }
302
+ catch {
303
+ // Silently fail
304
+ }
305
+ }
306
+ });
307
+ body.once('error', () => {
308
+ // Don't capture on error
309
+ });
310
+ }
311
+ else if (typeof body.text === 'function') {
312
+ // Fetch Body interface
313
+ body.text().then((text) => {
314
+ if (!captured && span.isRecording()) {
315
+ captured = true;
316
+ const bodyStr = text.length > MAX_BODY_SIZE
317
+ ? text.substring(0, MAX_BODY_SIZE)
318
+ : text;
319
+ span.setAttribute('http.response.body', bodyStr);
320
+ }
321
+ }).catch(() => {
322
+ // Silently fail
323
+ });
324
+ }
325
+ else if (typeof body.json === 'function') {
326
+ // Fetch Body interface with JSON
327
+ body.json().then((json) => {
328
+ if (!captured && span.isRecording()) {
329
+ captured = true;
330
+ try {
331
+ const jsonStr = JSON.stringify(json);
332
+ const bodyStr = jsonStr.length > MAX_BODY_SIZE
333
+ ? jsonStr.substring(0, MAX_BODY_SIZE)
334
+ : jsonStr;
335
+ span.setAttribute('http.response.body', bodyStr);
336
+ }
337
+ catch {
338
+ // Silently fail
339
+ }
340
+ }
341
+ }).catch(() => {
342
+ // Silently fail
343
+ });
344
+ }
345
+ }
346
+ }
347
+ /**
348
+ * Extracts response body from Undici response (legacy function, kept for compatibility)
349
+ */
350
+ export function extractUndiciResponseBody(response) {
351
+ // Check if body is directly available (not a stream)
352
+ if (response.body !== undefined) {
353
+ const contentType = getUndiciContentType(response.headers);
354
+ if (shouldSkipContentType(contentType)) {
355
+ return null;
356
+ }
357
+ return bodyToString(response.body);
358
+ }
359
+ return null;
360
+ }
361
+ //# sourceMappingURL=body-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-extractor.js","sourceRoot":"","sources":["../../src/instrumentations/body-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * HTTP instrumentation for OpenTelemetry
3
+ */
4
+ import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
5
+ /**
6
+ * Creates an HTTP instrumentation instance
7
+ *
8
+ * @param isGlobalInstrumentationEnabled - Function that checks if global instrumentation is enabled
9
+ * @returns HttpInstrumentation instance
10
+ */
11
+ export declare function createHttpInstrumentation(isGlobalInstrumentationEnabled: () => boolean): HttpInstrumentation;
12
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/instrumentations/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAM1E;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,8BAA8B,EAAE,MAAM,OAAO,GAC5C,mBAAmB,CA+BrB"}