@pingops/otel 0.1.0 → 0.1.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.
Files changed (49) hide show
  1. package/dist/index.cjs +1018 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.cts +342 -0
  4. package/dist/index.d.cts.map +1 -0
  5. package/dist/index.d.mts +342 -0
  6. package/dist/index.d.mts.map +1 -0
  7. package/dist/index.mjs +981 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/package.json +23 -11
  10. package/dist/config.d.ts +0 -75
  11. package/dist/config.d.ts.map +0 -1
  12. package/dist/config.js +0 -5
  13. package/dist/config.js.map +0 -1
  14. package/dist/index.d.ts +0 -10
  15. package/dist/index.d.ts.map +0 -1
  16. package/dist/index.js +0 -9
  17. package/dist/index.js.map +0 -1
  18. package/dist/instrumentations/body-extractor.d.ts +0 -48
  19. package/dist/instrumentations/body-extractor.d.ts.map +0 -1
  20. package/dist/instrumentations/body-extractor.js +0 -361
  21. package/dist/instrumentations/body-extractor.js.map +0 -1
  22. package/dist/instrumentations/http.d.ts +0 -12
  23. package/dist/instrumentations/http.d.ts.map +0 -1
  24. package/dist/instrumentations/http.js +0 -38
  25. package/dist/instrumentations/http.js.map +0 -1
  26. package/dist/instrumentations/index.d.ts +0 -17
  27. package/dist/instrumentations/index.d.ts.map +0 -1
  28. package/dist/instrumentations/index.js +0 -32
  29. package/dist/instrumentations/index.js.map +0 -1
  30. package/dist/instrumentations/undici.d.ts +0 -12
  31. package/dist/instrumentations/undici.d.ts.map +0 -1
  32. package/dist/instrumentations/undici.js +0 -38
  33. package/dist/instrumentations/undici.js.map +0 -1
  34. package/dist/processor.d.ts +0 -82
  35. package/dist/processor.d.ts.map +0 -1
  36. package/dist/processor.js +0 -264
  37. package/dist/processor.js.map +0 -1
  38. package/dist/span-processor.d.ts +0 -78
  39. package/dist/span-processor.d.ts.map +0 -1
  40. package/dist/span-processor.js +0 -272
  41. package/dist/span-processor.js.map +0 -1
  42. package/dist/span-wrapper.d.ts +0 -60
  43. package/dist/span-wrapper.d.ts.map +0 -1
  44. package/dist/span-wrapper.js +0 -118
  45. package/dist/span-wrapper.js.map +0 -1
  46. package/dist/tracer-provider.d.ts +0 -57
  47. package/dist/tracer-provider.d.ts.map +0 -1
  48. package/dist/tracer-provider.js +0 -182
  49. package/dist/tracer-provider.js.map +0 -1
@@ -1,361 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"body-extractor.js","sourceRoot":"","sources":["../../src/instrumentations/body-extractor.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,38 +0,0 @@
1
- /**
2
- * HTTP instrumentation for OpenTelemetry
3
- */
4
- import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
5
- import { context } from "@opentelemetry/api";
6
- import { PINGOPS_HTTP_ENABLED } from "@pingops/core";
7
- /**
8
- * Creates an HTTP instrumentation instance
9
- *
10
- * @param isGlobalInstrumentationEnabled - Function that checks if global instrumentation is enabled
11
- * @returns HttpInstrumentation instance
12
- */
13
- export function createHttpInstrumentation(isGlobalInstrumentationEnabled) {
14
- return new HttpInstrumentation({
15
- ignoreIncomingRequestHook: () => true, // Only instrument outgoing requests
16
- ignoreOutgoingRequestHook: () => {
17
- // If global instrumentation is enabled, instrument all outgoing requests
18
- if (isGlobalInstrumentationEnabled()) {
19
- return false;
20
- }
21
- // If global instrumentation is NOT enabled, only instrument when PINGOPS_HTTP_ENABLED is true
22
- return context.active().getValue(PINGOPS_HTTP_ENABLED) !== true;
23
- },
24
- requestHook: (span, request) => {
25
- const headers = request.headers;
26
- for (const [key, value] of Object.entries(headers)) {
27
- span.setAttribute(`http.request.header.${key.toLowerCase()}`, Array.isArray(value) ? value.join(",") : String(value));
28
- }
29
- },
30
- responseHook: (span, response) => {
31
- const headers = response.headers;
32
- for (const [key, value] of Object.entries(headers)) {
33
- span.setAttribute(`http.response.header.${key.toLowerCase()}`, Array.isArray(value) ? value.join(",") : String(value));
34
- }
35
- },
36
- });
37
- }
38
- //# sourceMappingURL=http.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/instrumentations/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAIrD;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,8BAA6C;IAE7C,OAAO,IAAI,mBAAmB,CAAC;QAC7B,yBAAyB,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,oCAAoC;QAC3E,yBAAyB,EAAE,GAAG,EAAE;YAC9B,yEAAyE;YACzE,IAAI,8BAA8B,EAAE,EAAE,CAAC;gBACrC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,8FAA8F;YAC9F,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;QAClE,CAAC;QACD,WAAW,EAAE,CAAC,IAAU,EAAE,OAAwC,EAAE,EAAE;YACpE,MAAM,OAAO,GAAI,OAA2B,CAAC,OAAO,CAAC;YAErD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,YAAY,CACf,uBAAuB,GAAG,CAAC,WAAW,EAAE,EAAE,EAC1C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,YAAY,EAAE,CAAC,IAAU,EAAE,QAA0C,EAAE,EAAE;YACvE,MAAM,OAAO,GAAI,QAA4B,CAAC,OAAO,CAAC;YACtD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,YAAY,CACf,wBAAwB,GAAG,CAAC,WAAW,EAAE,EAAE,EAC3C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Instrumentation setup for HTTP, fetch, undici, and GenAI
3
- */
4
- import type { Instrumentation } from "@opentelemetry/instrumentation";
5
- /**
6
- * Registers instrumentations for Node.js environment.
7
- * This function is idempotent and can be called multiple times safely.
8
- *
9
- * Instrumentation behavior:
10
- * - If global instrumentation is enabled: all HTTP requests are instrumented
11
- * - If global instrumentation is NOT enabled: only requests within wrapHttp blocks are instrumented
12
- *
13
- * @param isGlobalInstrumentationEnabled - Function that checks if global instrumentation is enabled
14
- * @returns Array of Instrumentation instances
15
- */
16
- export declare function getInstrumentations(isGlobalInstrumentationEnabled: () => boolean): Instrumentation[];
17
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/instrumentations/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAMtE;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,8BAA8B,EAAE,MAAM,OAAO,GAC5C,eAAe,EAAE,CAcnB"}
@@ -1,32 +0,0 @@
1
- /**
2
- * Instrumentation setup for HTTP, fetch, undici, and GenAI
3
- */
4
- import { registerInstrumentations } from "@opentelemetry/instrumentation";
5
- import { createHttpInstrumentation } from "./http";
6
- import { createUndiciInstrumentation } from "./undici";
7
- let installed = false;
8
- /**
9
- * Registers instrumentations for Node.js environment.
10
- * This function is idempotent and can be called multiple times safely.
11
- *
12
- * Instrumentation behavior:
13
- * - If global instrumentation is enabled: all HTTP requests are instrumented
14
- * - If global instrumentation is NOT enabled: only requests within wrapHttp blocks are instrumented
15
- *
16
- * @param isGlobalInstrumentationEnabled - Function that checks if global instrumentation is enabled
17
- * @returns Array of Instrumentation instances
18
- */
19
- export function getInstrumentations(isGlobalInstrumentationEnabled) {
20
- if (installed) {
21
- return [];
22
- }
23
- registerInstrumentations({
24
- instrumentations: [
25
- createHttpInstrumentation(isGlobalInstrumentationEnabled),
26
- createUndiciInstrumentation(isGlobalInstrumentationEnabled),
27
- ],
28
- });
29
- installed = true;
30
- return [];
31
- }
32
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/instrumentations/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAEvD,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,8BAA6C;IAE7C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,wBAAwB,CAAC;QACvB,gBAAgB,EAAE;YAChB,yBAAyB,CAAC,8BAA8B,CAAC;YACzD,2BAA2B,CAAC,8BAA8B,CAAC;SAC5D;KACF,CAAC,CAAC;IAEH,SAAS,GAAG,IAAI,CAAC;IACjB,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Undici instrumentation for OpenTelemetry
3
- */
4
- import { UndiciInstrumentation } from "@opentelemetry/instrumentation-undici";
5
- /**
6
- * Creates an Undici instrumentation instance
7
- *
8
- * @param isGlobalInstrumentationEnabled - Function that checks if global instrumentation is enabled
9
- * @returns UndiciInstrumentation instance
10
- */
11
- export declare function createUndiciInstrumentation(isGlobalInstrumentationEnabled: () => boolean): UndiciInstrumentation;
12
- //# sourceMappingURL=undici.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"undici.d.ts","sourceRoot":"","sources":["../../src/instrumentations/undici.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAK9E;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,8BAA8B,EAAE,MAAM,OAAO,GAC5C,qBAAqB,CA+BvB"}
@@ -1,38 +0,0 @@
1
- /**
2
- * Undici instrumentation for OpenTelemetry
3
- */
4
- import { UndiciInstrumentation } from "@opentelemetry/instrumentation-undici";
5
- import { context } from "@opentelemetry/api";
6
- import { PINGOPS_HTTP_ENABLED } from "@pingops/core";
7
- /**
8
- * Creates an Undici instrumentation instance
9
- *
10
- * @param isGlobalInstrumentationEnabled - Function that checks if global instrumentation is enabled
11
- * @returns UndiciInstrumentation instance
12
- */
13
- export function createUndiciInstrumentation(isGlobalInstrumentationEnabled) {
14
- return new UndiciInstrumentation({
15
- enabled: true,
16
- ignoreRequestHook: () => {
17
- // If global instrumentation is enabled, instrument all requests
18
- if (isGlobalInstrumentationEnabled()) {
19
- return false;
20
- }
21
- // If global instrumentation is NOT enabled, only instrument when PINGOPS_HTTP_ENABLED is true
22
- return context.active().getValue(PINGOPS_HTTP_ENABLED) !== true;
23
- },
24
- requestHook: (span, request) => {
25
- const headers = request.headers;
26
- for (const [key, value] of Object.entries(headers)) {
27
- span.setAttribute(`http.request.header.${key.toLowerCase()}`, Array.isArray(value) ? value.join(",") : String(value));
28
- }
29
- },
30
- responseHook: (span, { response }) => {
31
- const headers = response.headers;
32
- for (const [key, value] of Object.entries(headers)) {
33
- span.setAttribute(`http.response.header.${key.toLowerCase()}`, Array.isArray(value) ? value.join(",") : String(value));
34
- }
35
- },
36
- });
37
- }
38
- //# sourceMappingURL=undici.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"undici.js","sourceRoot":"","sources":["../../src/instrumentations/undici.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,8BAA6C;IAE7C,OAAO,IAAI,qBAAqB,CAAC;QAC/B,OAAO,EAAE,IAAI;QACb,iBAAiB,EAAE,GAAG,EAAE;YACtB,gEAAgE;YAChE,IAAI,8BAA8B,EAAE,EAAE,CAAC;gBACrC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,8FAA8F;YAC9F,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;QAClE,CAAC;QACD,WAAW,EAAE,CAAC,IAAU,EAAE,OAAO,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAEhC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,YAAY,CACf,uBAAuB,GAAG,CAAC,WAAW,EAAE,EAAE,EAC1C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,YAAY,EAAE,CAAC,IAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YACjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,YAAY,CACf,wBAAwB,GAAG,CAAC,WAAW,EAAE,EAAE,EAC3C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1,82 +0,0 @@
1
- /**
2
- * PingopsSpanProcessor - OpenTelemetry SpanProcessor implementation
3
- * Observes finished spans and sends eligible ones to PingOps backend
4
- *
5
- * This processor provides:
6
- * - Automatic filtering of spans (CLIENT spans with HTTP/GenAI attributes only)
7
- * - Domain and header filtering based on configuration
8
- * - Batched or immediate export modes using OTLP exporters
9
- * - Fire-and-forget transport (never blocks application)
10
- *
11
- * @example
12
- * ```typescript
13
- * import { NodeSDK } from '@opentelemetry/sdk-node';
14
- * import { PingopsSpanProcessor } from '@pingops/otel';
15
- *
16
- * const sdk = new NodeSDK({
17
- * spanProcessors: [
18
- * new PingopsSpanProcessor({
19
- * apiKey: 'your-api-key',
20
- * baseUrl: 'https://api.pingops.com',
21
- * serviceName: 'my-service',
22
- * exportMode: 'batched', // or 'immediate'
23
- * domainAllowList: [
24
- * { domain: 'api.example.com' }
25
- * ]
26
- * })
27
- * ]
28
- * });
29
- *
30
- * sdk.start();
31
- * ```
32
- */
33
- import type { SpanProcessor, ReadableSpan, Span } from '@opentelemetry/sdk-trace-base';
34
- import type { Context } from '@opentelemetry/api';
35
- import type { PingopsProcessorConfig } from './config';
36
- /**
37
- * OpenTelemetry span processor for sending spans to PingOps backend.
38
- *
39
- * This processor wraps OpenTelemetry's built-in processors (BatchSpanProcessor or SimpleSpanProcessor)
40
- * and applies filtering before passing spans to the OTLP exporter.
41
- */
42
- export declare class PingopsSpanProcessor implements SpanProcessor {
43
- private processor;
44
- private config;
45
- /**
46
- * Creates a new PingopsSpanProcessor instance.
47
- *
48
- * @param config - Configuration parameters for the processor
49
- */
50
- constructor(config: PingopsProcessorConfig);
51
- /**
52
- * Called when a span starts - extracts parent attributes from context and adds them to the span
53
- */
54
- onStart(span: Span, parentContext: Context): void;
55
- /**
56
- * Extracts custom attributes (non-HTTP, non-GenAI) from attributes.
57
- * These are attributes that were added manually via updateActiveSpan.
58
- */
59
- private extractCustomAttributes;
60
- /**
61
- * Called when a span ends. Filters the span and passes it to the underlying processor if eligible.
62
- *
63
- * This method:
64
- * 1. Checks if the span is eligible (CLIENT + HTTP/GenAI attributes)
65
- * 2. Applies domain filtering
66
- * 3. If eligible, passes span to underlying OTLP processor for export
67
- */
68
- onEnd(span: ReadableSpan): void;
69
- /**
70
- * Forces an immediate flush of all pending spans.
71
- *
72
- * @returns Promise that resolves when all pending operations are complete
73
- */
74
- forceFlush(): Promise<void>;
75
- /**
76
- * Gracefully shuts down the processor, ensuring all pending operations are completed.
77
- *
78
- * @returns Promise that resolves when shutdown is complete
79
- */
80
- shutdown(): Promise<void>;
81
- }
82
- //# sourceMappingURL=processor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAGvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAOlD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAKvD;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,MAAM,CAMZ;IAEF;;;;OAIG;gBACS,MAAM,EAAE,sBAAsB;IA8C1C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI;IA0CjD;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAqB/B;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IA4E/B;;;;OAIG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAaxC;;;;OAIG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAYvC"}