@brizz/sdk 0.1.0 → 0.1.2-rc.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 (88) hide show
  1. package/README.md +339 -19
  2. package/dist/index.cjs +2936 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +178 -0
  5. package/dist/index.d.ts +177 -12
  6. package/dist/index.js +2895 -9
  7. package/dist/index.js.map +1 -1
  8. package/dist/loader.mjs +72 -0
  9. package/dist/preload.cjs +2786 -0
  10. package/dist/preload.cjs.map +1 -0
  11. package/dist/preload.d.cts +2 -0
  12. package/dist/preload.d.ts +2 -0
  13. package/dist/preload.js +2777 -0
  14. package/dist/preload.js.map +1 -0
  15. package/package.json +35 -13
  16. package/dist/index.d.ts.map +0 -1
  17. package/dist/internal/config.d.ts +0 -17
  18. package/dist/internal/config.d.ts.map +0 -1
  19. package/dist/internal/config.js +0 -90
  20. package/dist/internal/config.js.map +0 -1
  21. package/dist/internal/instrumentation/auto-init.d.ts +0 -3
  22. package/dist/internal/instrumentation/auto-init.d.ts.map +0 -1
  23. package/dist/internal/instrumentation/auto-init.js +0 -82
  24. package/dist/internal/instrumentation/auto-init.js.map +0 -1
  25. package/dist/internal/instrumentation/index.d.ts +0 -2
  26. package/dist/internal/instrumentation/index.d.ts.map +0 -1
  27. package/dist/internal/instrumentation/index.js +0 -2
  28. package/dist/internal/instrumentation/index.js.map +0 -1
  29. package/dist/internal/instrumentation/registry.d.ts +0 -29
  30. package/dist/internal/instrumentation/registry.d.ts.map +0 -1
  31. package/dist/internal/instrumentation/registry.js +0 -88
  32. package/dist/internal/instrumentation/registry.js.map +0 -1
  33. package/dist/internal/log/index.d.ts +0 -2
  34. package/dist/internal/log/index.d.ts.map +0 -1
  35. package/dist/internal/log/index.js +0 -2
  36. package/dist/internal/log/index.js.map +0 -1
  37. package/dist/internal/log/logging.d.ts +0 -21
  38. package/dist/internal/log/logging.d.ts.map +0 -1
  39. package/dist/internal/log/logging.js +0 -149
  40. package/dist/internal/log/logging.js.map +0 -1
  41. package/dist/internal/logger.d.ts +0 -23
  42. package/dist/internal/logger.d.ts.map +0 -1
  43. package/dist/internal/logger.js +0 -155
  44. package/dist/internal/logger.js.map +0 -1
  45. package/dist/internal/masking/index.d.ts +0 -4
  46. package/dist/internal/masking/index.d.ts.map +0 -1
  47. package/dist/internal/masking/index.js +0 -3
  48. package/dist/internal/masking/index.js.map +0 -1
  49. package/dist/internal/masking/patterns.d.ts +0 -3
  50. package/dist/internal/masking/patterns.d.ts.map +0 -1
  51. package/dist/internal/masking/patterns.js +0 -375
  52. package/dist/internal/masking/patterns.js.map +0 -1
  53. package/dist/internal/masking/types.d.ts +0 -33
  54. package/dist/internal/masking/types.d.ts.map +0 -1
  55. package/dist/internal/masking/types.js +0 -2
  56. package/dist/internal/masking/types.js.map +0 -1
  57. package/dist/internal/masking/utils.d.ts +0 -6
  58. package/dist/internal/masking/utils.d.ts.map +0 -1
  59. package/dist/internal/masking/utils.js +0 -226
  60. package/dist/internal/masking/utils.js.map +0 -1
  61. package/dist/internal/metric/index.d.ts +0 -2
  62. package/dist/internal/metric/index.d.ts.map +0 -1
  63. package/dist/internal/metric/index.js +0 -2
  64. package/dist/internal/metric/index.js.map +0 -1
  65. package/dist/internal/metric/metrics.d.ts +0 -18
  66. package/dist/internal/metric/metrics.d.ts.map +0 -1
  67. package/dist/internal/metric/metrics.js +0 -82
  68. package/dist/internal/metric/metrics.js.map +0 -1
  69. package/dist/internal/sdk.d.ts +0 -36
  70. package/dist/internal/sdk.d.ts.map +0 -1
  71. package/dist/internal/sdk.js +0 -155
  72. package/dist/internal/sdk.js.map +0 -1
  73. package/dist/internal/trace/index.d.ts +0 -3
  74. package/dist/internal/trace/index.d.ts.map +0 -1
  75. package/dist/internal/trace/index.js +0 -3
  76. package/dist/internal/trace/index.js.map +0 -1
  77. package/dist/internal/trace/processors/log-masked.d.ts +0 -16
  78. package/dist/internal/trace/processors/log-masked.d.ts.map +0 -1
  79. package/dist/internal/trace/processors/log-masked.js +0 -75
  80. package/dist/internal/trace/processors/log-masked.js.map +0 -1
  81. package/dist/internal/trace/processors/span-masked.d.ts +0 -16
  82. package/dist/internal/trace/processors/span-masked.d.ts.map +0 -1
  83. package/dist/internal/trace/processors/span-masked.js +0 -81
  84. package/dist/internal/trace/processors/span-masked.js.map +0 -1
  85. package/dist/internal/trace/tracing.d.ts +0 -18
  86. package/dist/internal/trace/tracing.d.ts.map +0 -1
  87. package/dist/internal/trace/tracing.js +0 -97
  88. package/dist/internal/trace/tracing.js.map +0 -1
package/README.md CHANGED
@@ -4,7 +4,16 @@
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
5
  [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)
6
6
 
7
- Brizz observability SDK for AI applications.
7
+ OpenTelemetry-based observability SDK for AI applications. Automatically instruments popular AI libraries including OpenAI, Anthropic, Vercel AI SDK, and more.
8
+
9
+ ## Features
10
+
11
+ - 🔍 **Automatic Instrumentation** - Zero-code setup for popular AI libraries
12
+ - 📊 **OpenTelemetry Native** - Standards-compliant tracing, metrics, and logs
13
+ - 🛡️ **PII Protection** - Built-in masking for sensitive data
14
+ - 🔄 **Session Tracking** - Group related operations and traces
15
+ - 📦 **Dual Module Support** - Works with both ESM and CommonJS
16
+ - ⚡ **Multiple Initialization Methods** - Preload, ESM loader, or manual setup
8
17
 
9
18
  ## Installation
10
19
 
@@ -18,25 +27,147 @@ pnpm add @brizz/sdk
18
27
 
19
28
  ## Quick Start
20
29
 
30
+ ### Method 1: Preload (Recommended for Production)
31
+
32
+ The preload method automatically initializes the SDK and instruments libraries at startup using Node.js preload hooks.
33
+
34
+ **Environment Variables:**
35
+ ```bash
36
+ BRIZZ_API_KEY=your-api-key
37
+ BRIZZ_BASE_URL=https://telemetry.brizz.dev # Optional
38
+ BRIZZ_APP_NAME=my-app # Optional
39
+ BRIZZ_LOG_LEVEL=info # Optional: debug, info, warn, error, none
40
+ ```
41
+
42
+ **ESM Usage:**
43
+ ```bash
44
+ # Run with ESM preload
45
+ node --import @brizz/sdk/preload your-app.mjs
46
+ ```
47
+
48
+ **CommonJS Usage:**
49
+ ```bash
50
+ # Run with CJS preload
51
+ node --require @brizz/sdk/preload your-app.js
52
+ ```
53
+
54
+ **Package.json Scripts:**
55
+ ```json
56
+ {
57
+ "scripts": {
58
+ "start": "node --import @brizz/sdk/preload src/index.js",
59
+ "dev": "node --import @brizz/sdk/preload --watch src/index.js"
60
+ }
61
+ }
62
+ ```
63
+
64
+ Your application code remains clean:
21
65
  ```typescript
22
- import { Brizz, emitEvent } from '@brizz/sdk';
66
+ // your-app.js - No SDK setup needed!
67
+ import { generateText } from 'ai';
68
+ import { openai } from '@ai-sdk/openai';
23
69
 
24
- // Initialize
70
+ // Just use your AI libraries - they're automatically instrumented
71
+ const result = await generateText({
72
+ model: openai('gpt-3.5-turbo'),
73
+ prompt: 'Hello, world!',
74
+ });
75
+ ```
76
+
77
+ ### Method 2: ESM Loader Hook
78
+
79
+ For ESM projects, you can use the ESM loader for automatic instrumentation by using the `--import` flag:
80
+
81
+ ```bash
82
+ node --import @brizz/sdk/loader your-app.mjs
83
+ ```
84
+
85
+ ```typescript
86
+ // your-app.mjs
87
+ import { Brizz } from '@brizz/sdk';
88
+
89
+ // Initialize SDK
25
90
  Brizz.initialize({
26
- apiKey: 'your-brizzai-api-key',
91
+ apiKey: 'your-api-key',
27
92
  appName: 'my-app',
28
93
  });
94
+
95
+ // Import AI libraries - they'll be automatically instrumented
96
+ import { generateText } from 'ai';
97
+ import { openai } from '@ai-sdk/openai';
98
+
99
+ const result = await generateText({
100
+ model: openai('gpt-3.5-turbo'),
101
+ prompt: 'Hello, world!',
102
+ });
29
103
  ```
30
104
 
31
- > **Important**: Initialize Brizz before importing any libraries you want to instrument (e.g.,
32
- > OpenAI). If using `dotenv`, use `import "dotenv/config"` before importing `@brizz/sdk`.
105
+ ### Method 3: Manual Initialization
33
106
 
34
- ## PII Masking
107
+ For CommonJS or custom setups:
35
108
 
36
- Automatically protects sensitive data in traces:
109
+ ```typescript
110
+ import { Brizz } from '@brizz/sdk';
111
+
112
+ // Initialize before importing AI libraries
113
+ Brizz.initialize({
114
+ apiKey: 'your-api-key',
115
+ appName: 'my-app',
116
+ baseUrl: 'https://telemetry.brizz.dev', // Optional
117
+ logLevel: 'info', // Optional: debug, info, warn, error, none
118
+ });
119
+
120
+ // Import AI libraries after initialization
121
+ import { generateText } from 'ai';
122
+ import { openai } from '@ai-sdk/openai';
123
+ ```
124
+
125
+ > **Important**: Initialize Brizz before importing any libraries you want to instrument. If using `dotenv`, use `import "dotenv/config"` before importing `@brizz/sdk`.
126
+
127
+ ## Module System Support
128
+
129
+ ### ESM (ES Modules)
130
+ - **Preload**: `node --import @brizz/sdk/preload app.mjs` ⭐
131
+ - **Loader**: `node --import @brizz/sdk/loader app.mjs`
132
+ - **Manual**: Import and initialize manually
133
+
134
+ ### CommonJS
135
+ - **Preload**: `node --require @brizz/sdk/preload app.js` ⭐
136
+ - **Manual**: Require and initialize manually
137
+
138
+ For Next.js and Webpack environments that don't support automatic instrumentation, use manual instrumentation:
139
+
140
+ ```typescript
141
+ // For problematic bundlers
142
+ const aiModule = await import('ai');
143
+
144
+ Brizz.initialize({
145
+ apiKey: 'your-api-key',
146
+ instrumentModules: {
147
+ vercelAI: aiModule, // Manual instrumentation
148
+ },
149
+ });
150
+ ```
151
+
152
+ ## Supported Libraries
153
+
154
+ The SDK automatically instruments:
155
+
156
+ - **OpenAI** - `openai` package
157
+ - **Anthropic** - `@anthropic-ai/sdk` package
158
+ - **Vercel AI SDK** - `ai` package (generateText, streamText, etc.)
159
+ - **LangChain** - `langchain` and `@langchain/*` packages
160
+ - **LlamaIndex** - `llamaindex` package
161
+ - **AWS Bedrock** - `@aws-sdk/client-bedrock-runtime`
162
+ - **Google Vertex AI** - `@google-cloud/vertexai`
163
+ - **Vector Databases** - Pinecone, Qdrant, ChromaDB
164
+ - **HTTP/Fetch** - Automatic network request tracing
165
+
166
+ ## PII Protection & Data Masking
167
+
168
+ Automatically protects sensitive data in traces and logs:
37
169
 
38
170
  ```typescript
39
- // Configure masking rules
40
171
  Brizz.initialize({
41
172
  apiKey: 'your-api-key',
42
173
  masking: {
@@ -45,7 +176,16 @@ Brizz.initialize({
45
176
  {
46
177
  attributePattern: 'gen_ai\\.(prompt|completion)',
47
178
  mode: 'partial', // 'partial' or 'full'
48
- patterns: ['sk-[a-zA-Z0-9]{32}'], // Custom regex patterns
179
+ patterns: ['sk-[a-zA-Z0-9]{48}'], // Custom API key pattern
180
+ },
181
+ ],
182
+ },
183
+ logMasking: {
184
+ rules: [
185
+ {
186
+ attributePattern: 'message',
187
+ mode: 'full',
188
+ patterns: ['\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b'],
49
189
  },
50
190
  ],
51
191
  },
@@ -53,24 +193,204 @@ Brizz.initialize({
53
193
  });
54
194
  ```
55
195
 
56
- **Built-in patterns**: emails, phone numbers, SSNs, credit cards, API keys, crypto addresses, and
57
- more.
196
+ **Built-in PII patterns** automatically detect and mask:
197
+ - Email addresses
198
+ - Phone numbers
199
+ - Social Security Numbers
200
+ - Credit card numbers
201
+ - API keys (OpenAI, Anthropic, etc.)
202
+ - Cryptocurrency addresses
203
+ - IP addresses
204
+ - And more...
205
+
206
+ ## Session Tracking
207
+
208
+ Group related operations under a session context:
209
+
210
+ ```typescript
211
+ import { WithSessionId, emitEvent } from '@brizz/sdk';
212
+
213
+ async function processUserWorkflow(userId: string) {
214
+ // All traces within this function will include session-123
215
+ const result = await generateText({
216
+ model: openai('gpt-4'),
217
+ messages: [{ role: 'user', content: 'Hello' }],
218
+ });
219
+
220
+ emitEvent('workflow.completed', { userId, result: result.text });
221
+ return result;
222
+ }
223
+
224
+ // Wrap function with session context
225
+ await WithSessionId('session-123', processUserWorkflow, null, 'user-456');
226
+ ```
227
+
228
+ ## Custom Events & Logging
58
229
 
59
- ## Event Examples
230
+ Emit custom events and structured logs:
60
231
 
61
232
  ```typescript
62
- emitEvent('user.signup', { user_id: '123', plan: 'pro' });
63
- emitEvent('user.payment', { amount: 99, currency: 'USD' });
233
+ import { emitEvent, logger } from '@brizz/sdk';
234
+
235
+ // Emit custom events
236
+ emitEvent('user.signup', {
237
+ userId: '123',
238
+ plan: 'pro',
239
+ source: 'website'
240
+ });
241
+
242
+ emitEvent('ai.request.completed', {
243
+ model: 'gpt-4',
244
+ tokens: 150,
245
+ latency: 1200
246
+ });
247
+
248
+ // Structured logging
249
+ logger.info('Processing user request', { userId: '123', requestId: 'req-456' });
250
+ logger.error('AI request failed', { error: err.message, model: 'gpt-4' });
64
251
  ```
65
252
 
66
253
  ## Environment Variables
67
254
 
68
255
  ```bash
69
- BRIZZ_API_KEY=your-api-key # Required
70
- BRIZZ_BASE_URL=https://api.brizz.ai # Optional
71
- BRIZZ_APP_NAME=my-app # Optional
256
+ # Required
257
+ BRIZZ_API_KEY=your-api-key
258
+
259
+ # Optional Configuration
260
+ BRIZZ_BASE_URL=https://telemetry.brizz.dev # Default telemetry endpoint
261
+ BRIZZ_APP_NAME=my-app # Application name
262
+ BRIZZ_APP_VERSION=1.0.0 # Application version
263
+ BRIZZ_ENVIRONMENT=production # Environment (dev, staging, prod)
264
+ BRIZZ_LOG_LEVEL=info # SDK log level
265
+
266
+ # OpenTelemetry Standard Variables
267
+ OTEL_SERVICE_NAME=my-service # Service name
268
+ OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true # Capture AI content
72
269
  ```
73
270
 
271
+ ## Advanced Configuration
272
+
273
+ ```typescript
274
+ Brizz.initialize({
275
+ apiKey: 'your-api-key',
276
+ appName: 'my-app',
277
+ baseUrl: 'https://telemetry.brizz.dev',
278
+
279
+ // Custom headers for authentication
280
+ headers: {
281
+ 'X-API-Version': '2024-01',
282
+ 'X-Environment': 'production'
283
+ },
284
+
285
+ // Disable batching for immediate export (testing)
286
+ disableBatch: false,
287
+
288
+ // Custom exporters for testing
289
+ customSpanExporter: new InMemorySpanExporter(),
290
+ customLogExporter: new InMemoryLogExporter(),
291
+
292
+ // Disable internal NodeSDK (advanced usage)
293
+ disableNodeSdk: false,
294
+
295
+ // Log level for SDK diagnostics
296
+ logLevel: 'info' // debug, info, warn, error, none
297
+ });
298
+ ```
299
+
300
+ ## Testing & Development
301
+
302
+ For testing and development, you can use in-memory exporters:
303
+
304
+ ```typescript
305
+ import { InMemorySpanExporter } from '@opentelemetry/sdk-trace-base';
306
+
307
+ const spanExporter = new InMemorySpanExporter();
308
+
309
+ Brizz.initialize({
310
+ apiKey: 'test-key',
311
+ customSpanExporter: spanExporter,
312
+ logLevel: 'debug'
313
+ });
314
+
315
+ // Later in tests
316
+ const spans = spanExporter.getFinishedSpans();
317
+ expect(spans).toHaveLength(1);
318
+ expect(spans[0].name).toBe('openai.chat');
319
+ ```
320
+
321
+ ## Package.json Examples
322
+
323
+ **ESM with Preload (Recommended):**
324
+ ```json
325
+ {
326
+ "type": "module",
327
+ "scripts": {
328
+ "start": "node --import @brizz/sdk/preload src/index.js",
329
+ "dev": "node --import @brizz/sdk/preload --watch src/index.js",
330
+ "debug": "node --import @brizz/sdk/preload --inspect src/index.js"
331
+ }
332
+ }
333
+ ```
334
+
335
+ **CommonJS with Preload:**
336
+ ```json
337
+ {
338
+ "scripts": {
339
+ "start": "node --require @brizz/sdk/preload src/index.js",
340
+ "dev": "node --require @brizz/sdk/preload --watch src/index.js"
341
+ }
342
+ }
343
+ ```
344
+
345
+ **ESM with Loader:**
346
+ ```json
347
+ {
348
+ "type": "module",
349
+ "scripts": {
350
+ "start": "node --import @brizz/sdk/loader src/index.js"
351
+ }
352
+ }
353
+ ```
354
+
355
+ ## Examples
356
+
357
+ Check out the [examples](./examples/) directory for complete working examples:
358
+
359
+ - **Basic Usage** - Simple AI application setup
360
+ - **Vercel AI SDK** - Integration with Vercel's AI SDK
361
+ - **Session Tracking** - Grouping related operations
362
+ - **Custom Events** - Emitting business metrics
363
+ - **PII Masking** - Data protection configuration
364
+
365
+ ## Troubleshooting
366
+
367
+ ### Common Issues
368
+
369
+ **"Could not find declaration file"**
370
+ - Make sure to build the SDK: `pnpm build`
371
+ - Check that `dist/` contains `.d.ts` files
372
+
373
+ **Instrumentation not working**
374
+ - Ensure SDK is initialized before importing AI libraries
375
+ - For ESM, use preload or loader methods
376
+ - Check that `BRIZZ_API_KEY` is set
377
+
378
+ **CJS/ESM compatibility issues**
379
+ - Use dynamic imports in CommonJS: `const ai = await import('ai')`
380
+ - For bundlers, use manual instrumentation with `instrumentModules`
381
+
382
+ ### Debug Mode
383
+
384
+ Enable debug logging to troubleshoot issues:
385
+
386
+ ```bash
387
+ BRIZZ_LOG_LEVEL=debug node --import @brizz/sdk/preload your-app.js
388
+ ```
389
+
390
+ ## Contributing
391
+
392
+ See our [Contributing Guide](../../CONTRIBUTING.md) for development setup and guidelines.
393
+
74
394
  ## License
75
395
 
76
- MIT - see [LICENSE](LICENSE) file.
396
+ Apache-2.0 - see [LICENSE](LICENSE) file.