@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
@@ -0,0 +1,342 @@
1
+ import { ReadableSpan, Span, SpanProcessor } from "@opentelemetry/sdk-trace-base";
2
+ import { DomainRule, HeaderRedactionConfig } from "@pingops/core";
3
+ import { Attributes, Context, Span as Span$1, TracerProvider } from "@opentelemetry/api";
4
+ import "@opentelemetry/sdk-trace-node";
5
+ import { HttpInstrumentation, HttpInstrumentationConfig } from "@opentelemetry/instrumentation-http";
6
+ import { Instrumentation, InstrumentationBase, InstrumentationConfig } from "@opentelemetry/instrumentation";
7
+
8
+ //#region src/config.d.ts
9
+
10
+ /**
11
+ * Span export mode to use.
12
+ *
13
+ * - **batched**: Recommended for production environments with long-running processes.
14
+ * Spans are batched and exported in groups for optimal performance.
15
+ * - **immediate**: Recommended for short-lived environments such as serverless functions.
16
+ * Spans are exported immediately to prevent data loss when the process terminates / is frozen.
17
+ *
18
+ * @defaultValue "batched"
19
+ */
20
+ type PingopsExportMode = "immediate" | "batched";
21
+ /**
22
+ * Configuration parameters for the PingopsSpanProcessor.
23
+ */
24
+ interface PingopsProcessorConfig {
25
+ /**
26
+ * API key for authentication. Can also be set via PINGOPS_API_KEY environment variable.
27
+ */
28
+ apiKey?: string;
29
+ /**
30
+ * PingOps backend base URL (required).
31
+ */
32
+ baseUrl: string;
33
+ /**
34
+ * Enable debug logging.
35
+ * @defaultValue false
36
+ */
37
+ debug?: boolean;
38
+ /**
39
+ * Service name for resource identification (required).
40
+ */
41
+ serviceName: string;
42
+ /**
43
+ * List of headers to include (case-insensitive).
44
+ */
45
+ headersAllowList?: string[];
46
+ /**
47
+ * List of headers to exclude (case-insensitive, takes precedence over allow list).
48
+ */
49
+ headersDenyList?: string[];
50
+ /**
51
+ * Capture request body.
52
+ */
53
+ captureRequestBody?: boolean;
54
+ /**
55
+ * Capture response body.
56
+ */
57
+ captureResponseBody?: boolean;
58
+ /**
59
+ * Domain allow list rules.
60
+ */
61
+ domainAllowList?: DomainRule[];
62
+ /**
63
+ * Domain deny list rules.
64
+ */
65
+ domainDenyList?: DomainRule[];
66
+ /**
67
+ * Configuration for header value redaction.
68
+ * If not provided, default redaction is enabled for sensitive headers.
69
+ */
70
+ headerRedaction?: HeaderRedactionConfig;
71
+ /**
72
+ * Number of spans to batch before flushing (only used in batched mode).
73
+ * @defaultValue 50
74
+ */
75
+ batchSize?: number;
76
+ /**
77
+ * Flush interval in milliseconds (only used in batched mode).
78
+ * @defaultValue 5000
79
+ */
80
+ batchTimeout?: number;
81
+ /**
82
+ * Span export mode to use.
83
+ *
84
+ * - **batched**: Recommended for production environments with long-running processes.
85
+ * Spans are batched and exported in groups for optimal performance.
86
+ * - **immediate**: Recommended for short-lived environments such as serverless functions.
87
+ * Spans are exported immediately to prevent data loss when the process terminates / is frozen.
88
+ *
89
+ * @defaultValue "batched"
90
+ */
91
+ exportMode?: PingopsExportMode;
92
+ }
93
+ //#endregion
94
+ //#region src/span-processor.d.ts
95
+
96
+ /**
97
+ * OpenTelemetry span processor for sending spans to PingOps backend.
98
+ *
99
+ * This processor wraps OpenTelemetry's built-in processors (BatchSpanProcessor or SimpleSpanProcessor)
100
+ * and applies filtering before passing spans to the OTLP exporter.
101
+ */
102
+ declare class PingopsSpanProcessor implements SpanProcessor {
103
+ private processor;
104
+ private config;
105
+ /**
106
+ * Creates a new PingopsSpanProcessor instance.
107
+ *
108
+ * @param config - Configuration parameters for the processor
109
+ */
110
+ constructor(config: PingopsProcessorConfig);
111
+ /**
112
+ * Called when a span starts - extracts parent attributes from context and adds them to the span
113
+ */
114
+ onStart(span: Span, parentContext: Context): void;
115
+ /**
116
+ * Called when a span ends. Filters the span and passes it to the underlying processor if eligible.
117
+ *
118
+ * This method:
119
+ * 1. Checks if the span is eligible (CLIENT + HTTP/GenAI attributes)
120
+ * 2. Applies domain filtering (determines if span should be exported)
121
+ * 3. Applies header filtering via FilteredSpan wrapper (domain-specific and global rules)
122
+ * 4. If eligible, passes filtered span to underlying OTLP processor for export
123
+ */
124
+ onEnd(span: ReadableSpan): void;
125
+ /**
126
+ * Forces an immediate flush of all pending spans.
127
+ *
128
+ * @returns Promise that resolves when all pending operations are complete
129
+ */
130
+ forceFlush(): Promise<void>;
131
+ /**
132
+ * Gracefully shuts down the processor, ensuring all pending operations are completed.
133
+ *
134
+ * @returns Promise that resolves when shutdown is complete
135
+ */
136
+ shutdown(): Promise<void>;
137
+ }
138
+ //#endregion
139
+ //#region src/tracer-provider.d.ts
140
+ /**
141
+ * Sets an isolated TracerProvider for PingOps tracing operations.
142
+ *
143
+ * This allows PingOps to use its own TracerProvider instance, separate from
144
+ * the global OpenTelemetry TracerProvider. This is useful for avoiding conflicts
145
+ * with other OpenTelemetry instrumentation in the application.
146
+ *
147
+ * @param provider - The TracerProvider instance to use, or null to clear the isolated provider
148
+ * @public
149
+ */
150
+ declare function setPingopsTracerProvider(provider: TracerProvider | null): void;
151
+ /**
152
+ * Gets the TracerProvider for PingOps tracing operations.
153
+ *
154
+ * Returns the isolated TracerProvider if one has been set via setPingopsTracerProvider(),
155
+ * otherwise falls back to the global OpenTelemetry TracerProvider.
156
+ *
157
+ * @returns The TracerProvider instance to use for PingOps tracing
158
+ * @public
159
+ */
160
+ declare function getPingopsTracerProvider(): TracerProvider;
161
+ /**
162
+ * Shuts down the TracerProvider and flushes remaining spans
163
+ */
164
+ declare function shutdownTracerProvider(): Promise<void>;
165
+ //#endregion
166
+ //#region src/instrumentations/index.d.ts
167
+ /**
168
+ * Registers instrumentations for Node.js environment.
169
+ * This function is idempotent and can be called multiple times safely.
170
+ *
171
+ * Instrumentation behavior:
172
+ * - If global instrumentation is enabled: all HTTP requests are instrumented
173
+ * - If global instrumentation is NOT enabled: only requests within wrapHttp blocks are instrumented
174
+ *
175
+ * @param isGlobalInstrumentationEnabled - Function that checks if global instrumentation is enabled
176
+ * @returns Array of Instrumentation instances
177
+ */
178
+ declare function getInstrumentations(isGlobalInstrumentationEnabled: () => boolean): Instrumentation[];
179
+ //#endregion
180
+ //#region src/instrumentations/http/pingops-http.d.ts
181
+ declare const PingopsSemanticAttributes: {
182
+ HTTP_REQUEST_BODY: string;
183
+ HTTP_RESPONSE_BODY: string;
184
+ NETWORK_DNS_LOOKUP_DURATION: string;
185
+ NETWORK_TCP_CONNECT_DURATION: string;
186
+ NETWORK_TLS_HANDSHAKE_DURATION: string;
187
+ NETWORK_TTFB_DURATION: string;
188
+ NETWORK_CONTENT_TRANSFER_DURATION: string;
189
+ };
190
+ type NetworkTimings = {
191
+ startAt?: number;
192
+ dnsLookupAt?: number;
193
+ tcpConnectionAt?: number;
194
+ tlsHandshakeAt?: number;
195
+ firstByteAt?: number;
196
+ endAt?: number;
197
+ };
198
+ interface PingopsInstrumentationConfig {
199
+ /**
200
+ * Maximum size of request body to capture in bytes
201
+ * @defaultValue 4096 (4 KB)
202
+ */
203
+ maxRequestBodySize?: number;
204
+ /**
205
+ * Maximum size of response body to capture in bytes
206
+ * @defaultValue 4096 (4 KB)
207
+ */
208
+ maxResponseBodySize?: number;
209
+ }
210
+ declare const PingopsHttpSemanticAttributes: {
211
+ HTTP_REQUEST_BODY: string;
212
+ HTTP_RESPONSE_BODY: string;
213
+ NETWORK_DNS_LOOKUP_DURATION: string;
214
+ NETWORK_TCP_CONNECT_DURATION: string;
215
+ NETWORK_TLS_HANDSHAKE_DURATION: string;
216
+ NETWORK_TTFB_DURATION: string;
217
+ NETWORK_CONTENT_TRANSFER_DURATION: string;
218
+ };
219
+ interface PingopsHttpInstrumentationConfig extends HttpInstrumentationConfig, PingopsInstrumentationConfig {}
220
+ declare class PingopsHttpInstrumentation extends HttpInstrumentation {
221
+ constructor(config?: PingopsHttpInstrumentationConfig);
222
+ private _createConfig;
223
+ private _createRequestHook;
224
+ private _createResponseHook;
225
+ }
226
+ //#endregion
227
+ //#region src/instrumentations/http/http.d.ts
228
+ /**
229
+ * Creates an HTTP instrumentation instance
230
+ *
231
+ * @param isGlobalInstrumentationEnabled - Function that checks if global instrumentation is enabled
232
+ * @param config - Optional configuration for the instrumentation
233
+ * @returns PingopsHttpInstrumentation instance
234
+ */
235
+ declare function createHttpInstrumentation(isGlobalInstrumentationEnabled: () => boolean, config?: Partial<PingopsHttpInstrumentationConfig>): PingopsHttpInstrumentation;
236
+ //#endregion
237
+ //#region src/instrumentations/undici/types.d.ts
238
+ interface UndiciRequest {
239
+ origin: string;
240
+ method: string;
241
+ path: string;
242
+ /**
243
+ * Serialized string of headers in the form `name: value\r\n` for v5
244
+ * Array of strings `[key1, value1, key2, value2]`, where values are
245
+ * `string | string[]` for v6
246
+ */
247
+ headers: string | (string | string[])[];
248
+ /**
249
+ * Helper method to add headers (from v6)
250
+ */
251
+ addHeader: (name: string, value: string) => void;
252
+ throwOnError: boolean;
253
+ completed: boolean;
254
+ aborted: boolean;
255
+ idempotent: boolean;
256
+ contentLength: number | null;
257
+ contentType: string | null;
258
+ body: any;
259
+ }
260
+ interface UndiciResponse {
261
+ headers: Buffer[];
262
+ statusCode: number;
263
+ statusText: string;
264
+ }
265
+ interface IgnoreRequestFunction<T = UndiciRequest> {
266
+ (request: T): boolean;
267
+ }
268
+ interface RequestHookFunction<T = UndiciRequest> {
269
+ (span: Span$1, request: T): void;
270
+ }
271
+ interface ResponseHookFunction<RequestType = UndiciRequest, ResponseType = UndiciResponse> {
272
+ (span: Span$1, info: {
273
+ request: RequestType;
274
+ response: ResponseType;
275
+ }): void;
276
+ }
277
+ interface StartSpanHookFunction<T = UndiciRequest> {
278
+ (request: T): Attributes;
279
+ }
280
+ interface UndiciInstrumentationConfig<RequestType = UndiciRequest, ResponseType = UndiciResponse> extends InstrumentationConfig {
281
+ /** Not trace all outgoing requests that matched with custom function */
282
+ ignoreRequestHook?: IgnoreRequestFunction<RequestType>;
283
+ /** Function for adding custom attributes before request is handled */
284
+ requestHook?: RequestHookFunction<RequestType>;
285
+ /** Function called once response headers have been received */
286
+ responseHook?: ResponseHookFunction<RequestType, ResponseType>;
287
+ /** Function for adding custom attributes before a span is started */
288
+ startSpanHook?: StartSpanHookFunction<RequestType>;
289
+ /** Require parent to create span for outgoing requests */
290
+ requireParentforSpans?: boolean;
291
+ /** Map the following HTTP headers to span attributes. */
292
+ headersToSpanAttributes?: {
293
+ requestHeaders?: string[];
294
+ responseHeaders?: string[];
295
+ };
296
+ /**
297
+ * Maximum size of request body to capture in bytes
298
+ * @defaultValue 4096 (4 KB)
299
+ */
300
+ maxRequestBodySize?: number;
301
+ /**
302
+ * Maximum size of response body to capture in bytes
303
+ * @defaultValue 4096 (4 KB)
304
+ */
305
+ maxResponseBodySize?: number;
306
+ }
307
+ //#endregion
308
+ //#region src/instrumentations/undici/pingops-undici.d.ts
309
+ declare class UndiciInstrumentation extends InstrumentationBase<UndiciInstrumentationConfig> {
310
+ private _channelSubs;
311
+ private _recordFromReq;
312
+ private _httpClientDurationHistogram;
313
+ constructor(config?: UndiciInstrumentationConfig);
314
+ protected init(): undefined;
315
+ disable(): void;
316
+ enable(): void;
317
+ protected _updateMetricInstruments(): void;
318
+ private subscribeToChannel;
319
+ private parseRequestHeaders;
320
+ private onRequestCreated;
321
+ private onRequestHeaders;
322
+ private onResponseHeaders;
323
+ private onDone;
324
+ private onError;
325
+ private onBodyChunkSent;
326
+ private onBodySent;
327
+ private onBodyChunkReceived;
328
+ private recordRequestDuration;
329
+ private getRequestMethod;
330
+ }
331
+ //#endregion
332
+ //#region src/instrumentations/undici/undici.d.ts
333
+ /**
334
+ * Creates an Undici instrumentation instance
335
+ *
336
+ * @param isGlobalInstrumentationEnabled - Function that checks if global instrumentation is enabled
337
+ * @returns UndiciInstrumentation instance
338
+ */
339
+ declare function createUndiciInstrumentation(isGlobalInstrumentationEnabled: () => boolean): UndiciInstrumentation;
340
+ //#endregion
341
+ export { type NetworkTimings, PingopsHttpInstrumentation, type PingopsHttpInstrumentationConfig, PingopsHttpSemanticAttributes, type PingopsInstrumentationConfig, type PingopsProcessorConfig, PingopsSemanticAttributes, PingopsSpanProcessor, createHttpInstrumentation, createUndiciInstrumentation, getInstrumentations, getPingopsTracerProvider, setPingopsTracerProvider, shutdownTracerProvider };
342
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/config.ts","../src/span-processor.ts","../src/tracer-provider.ts","../src/instrumentations/index.ts","../src/instrumentations/http/pingops-http.ts","../src/instrumentations/http/http.ts","../src/instrumentations/undici/types.ts","../src/instrumentations/undici/pingops-undici.ts","../src/instrumentations/undici/undici.ts"],"sourcesContent":[],"mappings":"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"}