@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.
- package/README.md +339 -19
- package/dist/index.cjs +2936 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +178 -0
- package/dist/index.d.ts +177 -12
- package/dist/index.js +2895 -9
- package/dist/index.js.map +1 -1
- package/dist/loader.mjs +72 -0
- package/dist/preload.cjs +2786 -0
- package/dist/preload.cjs.map +1 -0
- package/dist/preload.d.cts +2 -0
- package/dist/preload.d.ts +2 -0
- package/dist/preload.js +2777 -0
- package/dist/preload.js.map +1 -0
- package/package.json +35 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/internal/config.d.ts +0 -17
- package/dist/internal/config.d.ts.map +0 -1
- package/dist/internal/config.js +0 -90
- package/dist/internal/config.js.map +0 -1
- package/dist/internal/instrumentation/auto-init.d.ts +0 -3
- package/dist/internal/instrumentation/auto-init.d.ts.map +0 -1
- package/dist/internal/instrumentation/auto-init.js +0 -82
- package/dist/internal/instrumentation/auto-init.js.map +0 -1
- package/dist/internal/instrumentation/index.d.ts +0 -2
- package/dist/internal/instrumentation/index.d.ts.map +0 -1
- package/dist/internal/instrumentation/index.js +0 -2
- package/dist/internal/instrumentation/index.js.map +0 -1
- package/dist/internal/instrumentation/registry.d.ts +0 -29
- package/dist/internal/instrumentation/registry.d.ts.map +0 -1
- package/dist/internal/instrumentation/registry.js +0 -88
- package/dist/internal/instrumentation/registry.js.map +0 -1
- package/dist/internal/log/index.d.ts +0 -2
- package/dist/internal/log/index.d.ts.map +0 -1
- package/dist/internal/log/index.js +0 -2
- package/dist/internal/log/index.js.map +0 -1
- package/dist/internal/log/logging.d.ts +0 -21
- package/dist/internal/log/logging.d.ts.map +0 -1
- package/dist/internal/log/logging.js +0 -149
- package/dist/internal/log/logging.js.map +0 -1
- package/dist/internal/logger.d.ts +0 -23
- package/dist/internal/logger.d.ts.map +0 -1
- package/dist/internal/logger.js +0 -155
- package/dist/internal/logger.js.map +0 -1
- package/dist/internal/masking/index.d.ts +0 -4
- package/dist/internal/masking/index.d.ts.map +0 -1
- package/dist/internal/masking/index.js +0 -3
- package/dist/internal/masking/index.js.map +0 -1
- package/dist/internal/masking/patterns.d.ts +0 -3
- package/dist/internal/masking/patterns.d.ts.map +0 -1
- package/dist/internal/masking/patterns.js +0 -375
- package/dist/internal/masking/patterns.js.map +0 -1
- package/dist/internal/masking/types.d.ts +0 -33
- package/dist/internal/masking/types.d.ts.map +0 -1
- package/dist/internal/masking/types.js +0 -2
- package/dist/internal/masking/types.js.map +0 -1
- package/dist/internal/masking/utils.d.ts +0 -6
- package/dist/internal/masking/utils.d.ts.map +0 -1
- package/dist/internal/masking/utils.js +0 -226
- package/dist/internal/masking/utils.js.map +0 -1
- package/dist/internal/metric/index.d.ts +0 -2
- package/dist/internal/metric/index.d.ts.map +0 -1
- package/dist/internal/metric/index.js +0 -2
- package/dist/internal/metric/index.js.map +0 -1
- package/dist/internal/metric/metrics.d.ts +0 -18
- package/dist/internal/metric/metrics.d.ts.map +0 -1
- package/dist/internal/metric/metrics.js +0 -82
- package/dist/internal/metric/metrics.js.map +0 -1
- package/dist/internal/sdk.d.ts +0 -36
- package/dist/internal/sdk.d.ts.map +0 -1
- package/dist/internal/sdk.js +0 -155
- package/dist/internal/sdk.js.map +0 -1
- package/dist/internal/trace/index.d.ts +0 -3
- package/dist/internal/trace/index.d.ts.map +0 -1
- package/dist/internal/trace/index.js +0 -3
- package/dist/internal/trace/index.js.map +0 -1
- package/dist/internal/trace/processors/log-masked.d.ts +0 -16
- package/dist/internal/trace/processors/log-masked.d.ts.map +0 -1
- package/dist/internal/trace/processors/log-masked.js +0 -75
- package/dist/internal/trace/processors/log-masked.js.map +0 -1
- package/dist/internal/trace/processors/span-masked.d.ts +0 -16
- package/dist/internal/trace/processors/span-masked.d.ts.map +0 -1
- package/dist/internal/trace/processors/span-masked.js +0 -81
- package/dist/internal/trace/processors/span-masked.js.map +0 -1
- package/dist/internal/trace/tracing.d.ts +0 -18
- package/dist/internal/trace/tracing.d.ts.map +0 -1
- package/dist/internal/trace/tracing.js +0 -97
- package/dist/internal/trace/tracing.js.map +0 -1
package/README.md
CHANGED
|
@@ -4,7 +4,16 @@
|
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
[](https://www.typescriptlang.org/)
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
66
|
+
// your-app.js - No SDK setup needed!
|
|
67
|
+
import { generateText } from 'ai';
|
|
68
|
+
import { openai } from '@ai-sdk/openai';
|
|
23
69
|
|
|
24
|
-
//
|
|
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-
|
|
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
|
-
|
|
32
|
-
> OpenAI). If using `dotenv`, use `import "dotenv/config"` before importing `@brizz/sdk`.
|
|
105
|
+
### Method 3: Manual Initialization
|
|
33
106
|
|
|
34
|
-
|
|
107
|
+
For CommonJS or custom setups:
|
|
35
108
|
|
|
36
|
-
|
|
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]{
|
|
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
|
|
57
|
-
|
|
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
|
-
|
|
230
|
+
Emit custom events and structured logs:
|
|
60
231
|
|
|
61
232
|
```typescript
|
|
62
|
-
emitEvent
|
|
63
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
396
|
+
Apache-2.0 - see [LICENSE](LICENSE) file.
|