@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.
- package/README.md +93 -0
- package/dist/config.d.ts +75 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/instrumentations/body-extractor.d.ts +48 -0
- package/dist/instrumentations/body-extractor.d.ts.map +1 -0
- package/dist/instrumentations/body-extractor.js +361 -0
- package/dist/instrumentations/body-extractor.js.map +1 -0
- package/dist/instrumentations/http.d.ts +12 -0
- package/dist/instrumentations/http.d.ts.map +1 -0
- package/dist/instrumentations/http.js +38 -0
- package/dist/instrumentations/http.js.map +1 -0
- package/dist/instrumentations/index.d.ts +17 -0
- package/dist/instrumentations/index.d.ts.map +1 -0
- package/dist/instrumentations/index.js +32 -0
- package/dist/instrumentations/index.js.map +1 -0
- package/dist/instrumentations/undici.d.ts +12 -0
- package/dist/instrumentations/undici.d.ts.map +1 -0
- package/dist/instrumentations/undici.js +38 -0
- package/dist/instrumentations/undici.js.map +1 -0
- package/dist/processor.d.ts +82 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +264 -0
- package/dist/processor.js.map +1 -0
- package/dist/span-processor.d.ts +78 -0
- package/dist/span-processor.d.ts.map +1 -0
- package/dist/span-processor.js +272 -0
- package/dist/span-processor.js.map +1 -0
- package/dist/span-wrapper.d.ts +60 -0
- package/dist/span-wrapper.d.ts.map +1 -0
- package/dist/span-wrapper.js +118 -0
- package/dist/span-wrapper.js.map +1 -0
- package/dist/tracer-provider.d.ts +57 -0
- package/dist/tracer-provider.d.ts.map +1 -0
- package/dist/tracer-provider.js +182 -0
- package/dist/tracer-provider.js.map +1 -0
- 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.
|
package/dist/config.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|