@engjts/nexus 0.1.8 → 0.1.10
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/dist/advanced/playground/playground.js.map +1 -1
- package/dist/advanced/static/generateDirectoryListing.d.ts +1 -1
- package/dist/advanced/static/generateDirectoryListing.d.ts.map +1 -1
- package/dist/advanced/static/generateDirectoryListing.js +12 -6
- package/dist/advanced/static/generateDirectoryListing.js.map +1 -1
- package/dist/advanced/static/index.d.ts +2 -0
- package/dist/advanced/static/index.d.ts.map +1 -1
- package/dist/advanced/static/index.js +4 -1
- package/dist/advanced/static/index.js.map +1 -1
- package/dist/advanced/static/serveStatic.d.ts.map +1 -1
- package/dist/advanced/static/serveStatic.js +7 -1
- package/dist/advanced/static/serveStatic.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/BENCHMARK_REPORT.md +0 -343
- package/documentation/01-getting-started.md +0 -240
- package/documentation/02-context.md +0 -335
- package/documentation/03-routing.md +0 -397
- package/documentation/04-middleware.md +0 -483
- package/documentation/05-validation.md +0 -514
- package/documentation/06-error-handling.md +0 -465
- package/documentation/07-performance.md +0 -364
- package/documentation/08-adapters.md +0 -470
- package/documentation/09-api-reference.md +0 -548
- package/documentation/10-examples.md +0 -582
- package/documentation/11-deployment.md +0 -477
- package/documentation/12-sentry.md +0 -620
- package/documentation/13-sentry-data-storage.md +0 -996
- package/documentation/14-sentry-data-reference.md +0 -457
- package/documentation/15-sentry-summary.md +0 -409
- package/documentation/16-alerts-system.md +0 -745
- package/documentation/17-alert-adapters.md +0 -696
- package/documentation/18-alerts-implementation-summary.md +0 -385
- package/documentation/19-class-based-routing.md +0 -840
- package/documentation/20-websocket-realtime.md +0 -813
- package/documentation/21-cache-system.md +0 -510
- package/documentation/22-job-queue.md +0 -772
- package/documentation/23-sentry-plugin.md +0 -551
- package/documentation/24-testing-utilities.md +0 -1287
- package/documentation/25-api-versioning.md +0 -533
- package/documentation/26-context-store.md +0 -607
- package/documentation/27-dependency-injection.md +0 -329
- package/documentation/28-lifecycle-hooks.md +0 -521
- package/documentation/29-package-structure.md +0 -196
- package/documentation/30-plugin-system.md +0 -414
- package/documentation/31-jwt-authentication.md +0 -597
- package/documentation/32-cli.md +0 -268
- package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
- package/documentation/ALERTS-INDEX.md +0 -330
- package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
- package/documentation/README.md +0 -178
- package/documentation/index.html +0 -34
- package/modern_framework_paper.md +0 -1870
- package/public/css/style.css +0 -87
- package/public/index.html +0 -34
- package/public/js/app.js +0 -27
- package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
- package/src/advanced/cache/MultiTierCache.ts +0 -194
- package/src/advanced/cache/RedisCacheStore.ts +0 -341
- package/src/advanced/cache/index.ts +0 -5
- package/src/advanced/cache/types.ts +0 -40
- package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
- package/src/advanced/graphql/index.ts +0 -22
- package/src/advanced/graphql/server.ts +0 -252
- package/src/advanced/graphql/types.ts +0 -42
- package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
- package/src/advanced/jobs/JobQueue.ts +0 -556
- package/src/advanced/jobs/RedisQueueStore.ts +0 -367
- package/src/advanced/jobs/index.ts +0 -5
- package/src/advanced/jobs/types.ts +0 -70
- package/src/advanced/observability/APMManager.ts +0 -163
- package/src/advanced/observability/AlertManager.ts +0 -109
- package/src/advanced/observability/MetricRegistry.ts +0 -151
- package/src/advanced/observability/ObservabilityCenter.ts +0 -304
- package/src/advanced/observability/StructuredLogger.ts +0 -154
- package/src/advanced/observability/TracingManager.ts +0 -117
- package/src/advanced/observability/adapters.ts +0 -304
- package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
- package/src/advanced/observability/index.ts +0 -11
- package/src/advanced/observability/types.ts +0 -174
- package/src/advanced/playground/extractPathParams.ts +0 -6
- package/src/advanced/playground/generateFieldExample.ts +0 -31
- package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1956
- package/src/advanced/playground/generateSummary.ts +0 -19
- package/src/advanced/playground/getTagFromPath.ts +0 -9
- package/src/advanced/playground/index.ts +0 -8
- package/src/advanced/playground/playground.ts +0 -250
- package/src/advanced/playground/types.ts +0 -49
- package/src/advanced/playground/zodToExample.ts +0 -16
- package/src/advanced/playground/zodToParams.ts +0 -15
- package/src/advanced/postman/buildAuth.ts +0 -31
- package/src/advanced/postman/buildBody.ts +0 -15
- package/src/advanced/postman/buildQueryParams.ts +0 -27
- package/src/advanced/postman/buildRequestItem.ts +0 -36
- package/src/advanced/postman/buildResponses.ts +0 -11
- package/src/advanced/postman/buildUrl.ts +0 -33
- package/src/advanced/postman/capitalize.ts +0 -4
- package/src/advanced/postman/generateCollection.ts +0 -59
- package/src/advanced/postman/generateEnvironment.ts +0 -34
- package/src/advanced/postman/generateExampleFromZod.ts +0 -21
- package/src/advanced/postman/generateFieldExample.ts +0 -45
- package/src/advanced/postman/generateName.ts +0 -20
- package/src/advanced/postman/generateUUID.ts +0 -11
- package/src/advanced/postman/getTagFromPath.ts +0 -10
- package/src/advanced/postman/index.ts +0 -28
- package/src/advanced/postman/postman.ts +0 -156
- package/src/advanced/postman/slugify.ts +0 -7
- package/src/advanced/postman/types.ts +0 -140
- package/src/advanced/realtime/index.ts +0 -18
- package/src/advanced/realtime/websocket.ts +0 -231
- package/src/advanced/sentry/index.ts +0 -1236
- package/src/advanced/sentry/types.ts +0 -355
- package/src/advanced/static/generateDirectoryListing.ts +0 -47
- package/src/advanced/static/generateETag.ts +0 -7
- package/src/advanced/static/getMimeType.ts +0 -9
- package/src/advanced/static/index.ts +0 -32
- package/src/advanced/static/isSafePath.ts +0 -13
- package/src/advanced/static/publicDir.ts +0 -21
- package/src/advanced/static/serveStatic.ts +0 -225
- package/src/advanced/static/spa.ts +0 -24
- package/src/advanced/static/types.ts +0 -159
- package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
- package/src/advanced/swagger/buildOperation.ts +0 -61
- package/src/advanced/swagger/buildParameters.ts +0 -61
- package/src/advanced/swagger/buildRequestBody.ts +0 -21
- package/src/advanced/swagger/buildResponses.ts +0 -54
- package/src/advanced/swagger/capitalize.ts +0 -5
- package/src/advanced/swagger/convertPath.ts +0 -9
- package/src/advanced/swagger/createSwagger.ts +0 -12
- package/src/advanced/swagger/generateOperationId.ts +0 -21
- package/src/advanced/swagger/generateSpec.ts +0 -105
- package/src/advanced/swagger/generateSummary.ts +0 -24
- package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
- package/src/advanced/swagger/generateThemeCss.ts +0 -53
- package/src/advanced/swagger/index.ts +0 -25
- package/src/advanced/swagger/swagger.ts +0 -237
- package/src/advanced/swagger/types.ts +0 -206
- package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
- package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
- package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
- package/src/advanced/testing/factory.ts +0 -509
- package/src/advanced/testing/harness.ts +0 -612
- package/src/advanced/testing/index.ts +0 -430
- package/src/advanced/testing/load-test.ts +0 -618
- package/src/advanced/testing/mock-server.ts +0 -498
- package/src/advanced/testing/mock.ts +0 -670
- package/src/cli/bin.ts +0 -9
- package/src/cli/cli.ts +0 -158
- package/src/cli/commands/add.ts +0 -178
- package/src/cli/commands/build.ts +0 -73
- package/src/cli/commands/create.ts +0 -166
- package/src/cli/commands/dev.ts +0 -85
- package/src/cli/commands/generate.ts +0 -99
- package/src/cli/commands/help.ts +0 -95
- package/src/cli/commands/init.ts +0 -91
- package/src/cli/commands/version.ts +0 -38
- package/src/cli/index.ts +0 -6
- package/src/cli/templates/generators.ts +0 -359
- package/src/cli/templates/index.ts +0 -680
- package/src/cli/utils/exec.ts +0 -52
- package/src/cli/utils/file-system.ts +0 -78
- package/src/cli/utils/logger.ts +0 -111
- package/src/core/adapter.ts +0 -88
- package/src/core/application.ts +0 -1453
- package/src/core/context-pool.ts +0 -79
- package/src/core/context.ts +0 -856
- package/src/core/index.ts +0 -94
- package/src/core/middleware.ts +0 -272
- package/src/core/performance/buffer-pool.ts +0 -108
- package/src/core/performance/middleware-optimizer.ts +0 -162
- package/src/core/plugin/PluginManager.ts +0 -435
- package/src/core/plugin/builder.ts +0 -358
- package/src/core/plugin/index.ts +0 -50
- package/src/core/plugin/types.ts +0 -214
- package/src/core/router/file-router.ts +0 -623
- package/src/core/router/index.ts +0 -260
- package/src/core/router/radix-tree.ts +0 -242
- package/src/core/serializer.ts +0 -397
- package/src/core/store/index.ts +0 -30
- package/src/core/store/registry.ts +0 -178
- package/src/core/store/request-store.ts +0 -240
- package/src/core/store/types.ts +0 -233
- package/src/core/types.ts +0 -616
- package/src/database/adapter.ts +0 -35
- package/src/database/adapters/index.ts +0 -1
- package/src/database/adapters/mysql.ts +0 -669
- package/src/database/database.ts +0 -70
- package/src/database/dialect.ts +0 -388
- package/src/database/index.ts +0 -12
- package/src/database/migrations.ts +0 -86
- package/src/database/optimizer.ts +0 -125
- package/src/database/query-builder.ts +0 -404
- package/src/database/realtime.ts +0 -53
- package/src/database/schema.ts +0 -71
- package/src/database/transactions.ts +0 -56
- package/src/database/types.ts +0 -87
- package/src/deployment/cluster.ts +0 -471
- package/src/deployment/config.ts +0 -454
- package/src/deployment/docker.ts +0 -599
- package/src/deployment/graceful-shutdown.ts +0 -373
- package/src/deployment/index.ts +0 -56
- package/src/index.ts +0 -281
- package/src/security/adapter.ts +0 -318
- package/src/security/auth/JWTPlugin.ts +0 -234
- package/src/security/auth/JWTProvider.ts +0 -316
- package/src/security/auth/adapter.ts +0 -12
- package/src/security/auth/jwt.ts +0 -234
- package/src/security/auth/middleware.ts +0 -188
- package/src/security/csrf.ts +0 -220
- package/src/security/headers.ts +0 -108
- package/src/security/index.ts +0 -60
- package/src/security/rate-limit/adapter.ts +0 -7
- package/src/security/rate-limit/memory.ts +0 -108
- package/src/security/rate-limit/middleware.ts +0 -181
- package/src/security/sanitization.ts +0 -75
- package/src/security/types.ts +0 -240
- package/src/security/utils.ts +0 -52
- package/tsconfig.json +0 -39
|
@@ -1,457 +0,0 @@
|
|
|
1
|
-
# Sentry Data Storage - Quick Reference
|
|
2
|
-
|
|
3
|
-
Referensi cepat tentang data yang dikirim ke Sentry dalam Nexus Framework.
|
|
4
|
-
|
|
5
|
-
## 1. Event Metadata (SELALU DIKIRIM)
|
|
6
|
-
|
|
7
|
-
| Data | Nilai Contoh | Scope | Sensitivitas |
|
|
8
|
-
|------|-------------|-------|-------------|
|
|
9
|
-
| `event_id` | `a1b2c3d4` | Unique per event | ❌ Non-sensitive |
|
|
10
|
-
| `timestamp` | `1701619200` | Time of error | ❌ Non-sensitive |
|
|
11
|
-
| `platform` | `node` | Always Node.js | ❌ Non-sensitive |
|
|
12
|
-
| `level` | `error`, `warning`, `info` | Set by dev | ❌ Non-sensitive |
|
|
13
|
-
| `environment` | `production`, `staging` | Configuration | ❌ Non-sensitive |
|
|
14
|
-
| `release` | `1.0.0` | App version | ❌ Non-sensitive |
|
|
15
|
-
|
|
16
|
-
**Kesimpulan**: ✅ Aman untuk dikirim
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## 2. Exception/Error Data (JIKA ADA ERROR)
|
|
21
|
-
|
|
22
|
-
| Data | Nilai Contoh | Scope | Sensitivitas |
|
|
23
|
-
|------|-------------|-------|-------------|
|
|
24
|
-
| `exception.type` | `ValidationError` | Error class name | ❌ Non-sensitive |
|
|
25
|
-
| `exception.message` | `Email is invalid` | Error message | ⚠️ Bisa sensitive |
|
|
26
|
-
| `stacktrace.filename` | `/app/src/handlers/user.ts` | File path | ❌ Non-sensitive |
|
|
27
|
-
| `stacktrace.function` | `createUser` | Function name | ❌ Non-sensitive |
|
|
28
|
-
| `stacktrace.lineno` | `42` | Line number | ❌ Non-sensitive |
|
|
29
|
-
| `stacktrace.context_line` | `const user = await db.find(id);` | Actual code | ⚠️ Bisa reveal logic |
|
|
30
|
-
|
|
31
|
-
**Kesimpulan**: ⚠️ Perlu difilter jika ada data sensitif dalam error message
|
|
32
|
-
|
|
33
|
-
**Contoh Filtering**:
|
|
34
|
-
```typescript
|
|
35
|
-
beforeSend: (event) => {
|
|
36
|
-
if (event.exception?.values?.[0]?.value?.includes('password')) {
|
|
37
|
-
event.exception.values[0].value = '[REDACTED]';
|
|
38
|
-
}
|
|
39
|
-
return event;
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
## 3. Server Context (SELALU DIKIRIM)
|
|
46
|
-
|
|
47
|
-
| Data | Nilai Contoh | Scope | Sensitivitas |
|
|
48
|
-
|------|-------------|-------|-------------|
|
|
49
|
-
| `server_name` | `api-server-1` | Hostname | ⚠️ Bisa reveal infrastructure |
|
|
50
|
-
| `contexts.runtime.name` | `node` | Node.js | ❌ Non-sensitive |
|
|
51
|
-
| `contexts.runtime.version` | `v20.10.0` | Node version | ❌ Non-sensitive |
|
|
52
|
-
| `contexts.os.name` | `linux` | Operating system | ⚠️ Infrastructure info |
|
|
53
|
-
| `contexts.os.version` | `x64` | Architecture | ⚠️ Infrastructure info |
|
|
54
|
-
|
|
55
|
-
**Kesimpulan**: ⚠️ Reveal infrastructure, tapi biasanya aman untuk production
|
|
56
|
-
|
|
57
|
-
**Trik**: Gunakan generic name untuk `server_name`:
|
|
58
|
-
```typescript
|
|
59
|
-
app.sentry({
|
|
60
|
-
serverName: `api-server-${process.env.REGION || 'unknown'}`
|
|
61
|
-
});
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## 4. User Context (CONDITIONAL - Dari `extractUser`)
|
|
67
|
-
|
|
68
|
-
| Data | Nilai Contoh | Scope | Sensitivitas |
|
|
69
|
-
|------|-------------|-------|-------------|
|
|
70
|
-
| `user.id` | `user-12345` | User identifier | ✅ Safe for PII |
|
|
71
|
-
| `user.email` | `john@example.com` | Email address | ⚠️ PII (Personal Identifiable Info) |
|
|
72
|
-
| `user.username` | `john_doe` | Username | ⚠️ PII |
|
|
73
|
-
| `user.ip_address` | `192.168.1.1` | IP address | ⚠️ PII |
|
|
74
|
-
| `user.custom_field` | Any custom data | Custom context | ⚠️ Tergantung data |
|
|
75
|
-
|
|
76
|
-
**Kesimpulan**: ⚠️ SENSITIVE - Hanya kirim jika perlu & user setuju
|
|
77
|
-
|
|
78
|
-
**Kontrol Data**:
|
|
79
|
-
```typescript
|
|
80
|
-
app.sentry({
|
|
81
|
-
sendDefaultPii: false // Default
|
|
82
|
-
}, {
|
|
83
|
-
extractUser: (ctx) => {
|
|
84
|
-
if (!ctx.user) return null;
|
|
85
|
-
|
|
86
|
-
return {
|
|
87
|
-
id: ctx.user.id,
|
|
88
|
-
// email: ctx.user.email, // Jangan kirim tanpa persetujuan
|
|
89
|
-
// username: ctx.user.name, // Jangan kirim tanpa persetujuan
|
|
90
|
-
subscription_tier: ctx.user.plan // Non-PII, safe
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**GDPR Compliance**:
|
|
97
|
-
- Email/username adalah PII
|
|
98
|
-
- Perlu user consent
|
|
99
|
-
- User bisa request deletion
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## 5. HTTP Request Context (DARI MIDDLEWARE)
|
|
104
|
-
|
|
105
|
-
| Data | Nilai Contoh | Scope | Sensitivitas |
|
|
106
|
-
|------|-------------|-------|-------------|
|
|
107
|
-
| `request.url` | `https://api.example.com/api/users` | Full URL | ✅ Safe |
|
|
108
|
-
| `request.method` | `POST` | HTTP method | ✅ Safe |
|
|
109
|
-
| `request.query_string` | `sort=name&limit=10` | Query params | ⚠️ Bisa contain tokens |
|
|
110
|
-
| `request.headers.user-agent` | `Mozilla/5.0...` | Browser info | ✅ Safe |
|
|
111
|
-
| `request.headers.authorization` | `Bearer token123` | Auth token | 🔴 SENSITIVE |
|
|
112
|
-
| `request.data` | `{name: "John", email: "..."}` | Request body | ⚠️ Bisa contain sensitive |
|
|
113
|
-
|
|
114
|
-
**Kesimpulan**: 🔴 SENSITIVE - Perlu exclude headers & filter body
|
|
115
|
-
|
|
116
|
-
**Kontrol Data**:
|
|
117
|
-
```typescript
|
|
118
|
-
app.sentry({}, {
|
|
119
|
-
// Include request body?
|
|
120
|
-
includeRequestBody: false, // Default
|
|
121
|
-
|
|
122
|
-
// Include headers?
|
|
123
|
-
includeHeaders: true,
|
|
124
|
-
|
|
125
|
-
// Exclude sensitive headers
|
|
126
|
-
excludeHeaders: [
|
|
127
|
-
'authorization',
|
|
128
|
-
'cookie',
|
|
129
|
-
'x-api-key',
|
|
130
|
-
'x-auth-token',
|
|
131
|
-
'x-csrf-token',
|
|
132
|
-
'password'
|
|
133
|
-
]
|
|
134
|
-
});
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
**Contoh Safe**:
|
|
138
|
-
```json
|
|
139
|
-
{
|
|
140
|
-
"request": {
|
|
141
|
-
"url": "https://api.example.com/api/checkout",
|
|
142
|
-
"method": "POST",
|
|
143
|
-
"headers": {
|
|
144
|
-
"user-agent": "Mozilla/5.0...",
|
|
145
|
-
"content-type": "application/json"
|
|
146
|
-
}
|
|
147
|
-
// authorization DIHAPUS
|
|
148
|
-
// data DIHAPUS
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
**Contoh NOT Safe**:
|
|
154
|
-
```json
|
|
155
|
-
{
|
|
156
|
-
"request": {
|
|
157
|
-
"headers": {
|
|
158
|
-
"authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." // 🔴
|
|
159
|
-
},
|
|
160
|
-
"data": {
|
|
161
|
-
"credit_card": "4111-1111-1111-1111", // 🔴
|
|
162
|
-
"password": "super_secret_123" // 🔴
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
---
|
|
169
|
-
|
|
170
|
-
## 6. Tags (GLOBAL + PER-EVENT)
|
|
171
|
-
|
|
172
|
-
| Data | Nilai Contoh | Scope | Sensitivitas |
|
|
173
|
-
|------|-------------|-------|-------------|
|
|
174
|
-
| `tags.http.method` | `POST` | Auto-added | ✅ Safe |
|
|
175
|
-
| `tags.http.status_code` | `500` | Auto-added | ✅ Safe |
|
|
176
|
-
| `tags.environment` | `production` | Configuration | ✅ Safe |
|
|
177
|
-
| `tags.team` | `backend` | Custom | ✅ Safe |
|
|
178
|
-
| `tags.feature` | `payments` | Custom | ✅ Safe |
|
|
179
|
-
| `tags.user_id` | `user-123` | Custom | ✅ Safe |
|
|
180
|
-
|
|
181
|
-
**Kesimpulan**: ✅ Tags safe untuk dikirim, berguna untuk filtering
|
|
182
|
-
|
|
183
|
-
**Penggunaan**:
|
|
184
|
-
```typescript
|
|
185
|
-
// Global tags
|
|
186
|
-
app.sentry({
|
|
187
|
-
tags: {
|
|
188
|
-
app: 'my-api',
|
|
189
|
-
version: '1.0.0',
|
|
190
|
-
team: 'backend',
|
|
191
|
-
region: 'us-east-1'
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
// Per-event tags
|
|
196
|
-
captureException(error, {
|
|
197
|
-
tags: {
|
|
198
|
-
module: 'payments',
|
|
199
|
-
operation: 'charge',
|
|
200
|
-
priority: 'high'
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
|
-
## 7. Extra Context (GLOBAL + PER-EVENT)
|
|
208
|
-
|
|
209
|
-
| Data | Nilai Contoh | Scope | Sensitivitas |
|
|
210
|
-
|------|-------------|-------|-------------|
|
|
211
|
-
| `extra.order_id` | `order-456` | Custom ID | ✅ Safe |
|
|
212
|
-
| `extra.user_id` | `user-123` | Custom ID | ✅ Safe |
|
|
213
|
-
| `extra.amount` | `99.99` | Amount | ✅ Safe |
|
|
214
|
-
| `extra.payment_method` | `credit_card` | Type | ✅ Safe |
|
|
215
|
-
| `extra.db_query_time_ms` | `245` | Performance | ✅ Safe |
|
|
216
|
-
| `extra.raw_request_body` | Full body object | Custom | 🔴 SENSITIVE |
|
|
217
|
-
|
|
218
|
-
**Kesimpulan**: ⚠️ Extra useful tapi careful dengan sensitive data
|
|
219
|
-
|
|
220
|
-
**Safe Extra**:
|
|
221
|
-
```typescript
|
|
222
|
-
setExtra('checkout_context', {
|
|
223
|
-
order_id: 'order-456',
|
|
224
|
-
user_tier: 'premium',
|
|
225
|
-
cart_items: 3,
|
|
226
|
-
total: 99.99,
|
|
227
|
-
payment_method: 'credit_card', // Type only, not details
|
|
228
|
-
processing_time_ms: 245
|
|
229
|
-
});
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
**NOT Safe Extra**:
|
|
233
|
-
```typescript
|
|
234
|
-
setExtra('raw_request', {
|
|
235
|
-
password: 'user_password', // 🔴
|
|
236
|
-
credit_card: '4111-1111-1111-1111', // 🔴
|
|
237
|
-
full_body: req.body // 🔴 Might contain sensitive data
|
|
238
|
-
});
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
---
|
|
242
|
-
|
|
243
|
-
## 8. Breadcrumbs (PER-REQUEST, MAX 100)
|
|
244
|
-
|
|
245
|
-
| Data | Nilai Contoh | Scope | Sensitivitas |
|
|
246
|
-
|------|-------------|-------|-------------|
|
|
247
|
-
| `type` | `http`, `database`, `error` | Event type | ✅ Safe |
|
|
248
|
-
| `category` | `http.request`, `db.query` | Category | ✅ Safe |
|
|
249
|
-
| `message` | `GET /api/users` | Short message | ✅ Safe |
|
|
250
|
-
| `level` | `info`, `warning`, `error` | Severity | ✅ Safe |
|
|
251
|
-
| `data.url` | `/api/users` | URL | ✅ Safe |
|
|
252
|
-
| `data.status_code` | `200` | HTTP status | ✅ Safe |
|
|
253
|
-
| `data.duration_ms` | `45` | Duration | ✅ Safe |
|
|
254
|
-
| `data.query` | Full SQL query | SQL statement | ⚠️ Bisa reveal schema |
|
|
255
|
-
|
|
256
|
-
**Kesimpulan**: ✅ Breadcrumbs mostly safe, tapi careful dengan SQL queries
|
|
257
|
-
|
|
258
|
-
**Safe Breadcrumbs**:
|
|
259
|
-
```typescript
|
|
260
|
-
addBreadcrumb({
|
|
261
|
-
type: 'http',
|
|
262
|
-
category: 'api.call',
|
|
263
|
-
message: 'Fetching user',
|
|
264
|
-
data: {
|
|
265
|
-
method: 'GET',
|
|
266
|
-
url: '/api/users/123',
|
|
267
|
-
status_code: 200,
|
|
268
|
-
duration_ms: 45
|
|
269
|
-
}
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
addBreadcrumb({
|
|
273
|
-
type: 'query',
|
|
274
|
-
category: 'database',
|
|
275
|
-
message: 'Find user by ID',
|
|
276
|
-
data: {
|
|
277
|
-
operation: 'SELECT',
|
|
278
|
-
table: 'users',
|
|
279
|
-
duration_ms: 15
|
|
280
|
-
// Jangan: full_query: 'SELECT * FROM users WHERE...'
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
---
|
|
286
|
-
|
|
287
|
-
## 9. Performance Tracing (CONDITIONAL)
|
|
288
|
-
|
|
289
|
-
| Data | Nilai Contoh | Scope | Sensitivitas |
|
|
290
|
-
|------|-------------|-------|-------------|
|
|
291
|
-
| `trace_id` | `a1b2c3d4e5f6` | Unique trace | ✅ Safe |
|
|
292
|
-
| `span_id` | `k1l2m3n4` | Unique span | ✅ Safe |
|
|
293
|
-
| `op` | `http.server`, `db.query` | Operation | ✅ Safe |
|
|
294
|
-
| `status` | `ok`, `error` | Status | ✅ Safe |
|
|
295
|
-
| `duration` | `245ms` | Duration | ✅ Safe |
|
|
296
|
-
| `tags` | Various | Custom tags | ✅ Safe if no PII |
|
|
297
|
-
| `data` | Various | Performance data | ✅ Safe if no sensitive |
|
|
298
|
-
|
|
299
|
-
**Kesimpulan**: ✅ Performance data safe, berguna untuk optimization
|
|
300
|
-
|
|
301
|
-
---
|
|
302
|
-
|
|
303
|
-
## Quick Checklist: Apa Boleh/Tidak Boleh
|
|
304
|
-
|
|
305
|
-
### ✅ AMAN untuk dikirim:
|
|
306
|
-
- [x] Error messages (non-sensitive)
|
|
307
|
-
- [x] Stack traces
|
|
308
|
-
- [x] HTTP method & status codes
|
|
309
|
-
- [x] URLs (tanpa sensitive query params)
|
|
310
|
-
- [x] Timestamps
|
|
311
|
-
- [x] Performance metrics (duration, latency)
|
|
312
|
-
- [x] Feature flags
|
|
313
|
-
- [x] User IDs (anonymous identifiers)
|
|
314
|
-
- [x] Error codes
|
|
315
|
-
- [x] Tags & breadcrumbs
|
|
316
|
-
|
|
317
|
-
### 🔴 JANGAN dikirim:
|
|
318
|
-
- [ ] Passwords
|
|
319
|
-
- [ ] API keys & tokens
|
|
320
|
-
- [ ] Credit card numbers
|
|
321
|
-
- [ ] Full request bodies (tanpa filtering)
|
|
322
|
-
- [ ] Authorization headers (kecuali di-sanitize)
|
|
323
|
-
- [ ] Database connection strings
|
|
324
|
-
- [ ] Private keys
|
|
325
|
-
- [ ] Full SQL queries (bisa reveal schema)
|
|
326
|
-
- [ ] PII tanpa consent (email, username, IP)
|
|
327
|
-
|
|
328
|
-
### ⚠️ CAREFUL (Filter dulu):
|
|
329
|
-
- [ ] Email addresses
|
|
330
|
-
- [ ] Phone numbers
|
|
331
|
-
- [ ] URLs dengan sensitive query params
|
|
332
|
-
- [ ] Custom user data
|
|
333
|
-
- [ ] Full error messages (bisa contain sensitive data)
|
|
334
|
-
|
|
335
|
-
---
|
|
336
|
-
|
|
337
|
-
## Contoh Implementasi Aman
|
|
338
|
-
|
|
339
|
-
```typescript
|
|
340
|
-
import { createApp } from 'nexus';
|
|
341
|
-
|
|
342
|
-
const app = createApp();
|
|
343
|
-
|
|
344
|
-
app.sentry({
|
|
345
|
-
dsn: process.env.SENTRY_DSN!,
|
|
346
|
-
environment: process.env.NODE_ENV,
|
|
347
|
-
release: process.env.npm_package_version,
|
|
348
|
-
|
|
349
|
-
// Global tags - safe data only
|
|
350
|
-
tags: {
|
|
351
|
-
app: 'my-api',
|
|
352
|
-
team: 'backend',
|
|
353
|
-
region: process.env.AWS_REGION
|
|
354
|
-
},
|
|
355
|
-
|
|
356
|
-
// Global extra - safe data only
|
|
357
|
-
extra: {
|
|
358
|
-
database: 'postgres',
|
|
359
|
-
cache: 'redis',
|
|
360
|
-
version: '1.0.0'
|
|
361
|
-
},
|
|
362
|
-
|
|
363
|
-
// Send default PII? No!
|
|
364
|
-
sendDefaultPii: false,
|
|
365
|
-
|
|
366
|
-
// Filter events before sending
|
|
367
|
-
beforeSend: (event, hint) => {
|
|
368
|
-
const error = hint?.originalException;
|
|
369
|
-
|
|
370
|
-
// Remove sensitive from error message
|
|
371
|
-
if (error?.message) {
|
|
372
|
-
event.exception?.values?.forEach(exc => {
|
|
373
|
-
exc.value = exc.value
|
|
374
|
-
.replace(/token[:=]\s*\S+/gi, 'token=[REDACTED]')
|
|
375
|
-
.replace(/password[:=]\s*\S+/gi, 'password=[REDACTED]')
|
|
376
|
-
.replace(/apikey[:=]\s*\S+/gi, 'apikey=[REDACTED]');
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// Remove request body
|
|
381
|
-
if (event.request?.data) {
|
|
382
|
-
delete event.request.data;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
return event;
|
|
386
|
-
}
|
|
387
|
-
}, {
|
|
388
|
-
// Middleware config
|
|
389
|
-
includeRequestBody: false,
|
|
390
|
-
includeHeaders: true,
|
|
391
|
-
|
|
392
|
-
// Exclude sensitive headers
|
|
393
|
-
excludeHeaders: [
|
|
394
|
-
'authorization',
|
|
395
|
-
'cookie',
|
|
396
|
-
'x-api-key',
|
|
397
|
-
'x-auth-token',
|
|
398
|
-
'x-csrf-token',
|
|
399
|
-
'proxy-authorization'
|
|
400
|
-
],
|
|
401
|
-
|
|
402
|
-
// Ignore health check paths
|
|
403
|
-
ignorePaths: ['/health', '/metrics', '/__nexus/health'],
|
|
404
|
-
|
|
405
|
-
// Extract only safe user data
|
|
406
|
-
extractUser: (ctx) => {
|
|
407
|
-
if (!ctx.user) return null;
|
|
408
|
-
|
|
409
|
-
return {
|
|
410
|
-
id: ctx.user.id, // Safe: user ID
|
|
411
|
-
subscription_tier: ctx.user.plan, // Safe: subscription tier
|
|
412
|
-
// email: ctx.user.email, // NOT included without consent
|
|
413
|
-
// phone: ctx.user.phone // NOT included without consent
|
|
414
|
-
};
|
|
415
|
-
}
|
|
416
|
-
});
|
|
417
|
-
|
|
418
|
-
app.listen(3000);
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
---
|
|
422
|
-
|
|
423
|
-
## Troubleshooting
|
|
424
|
-
|
|
425
|
-
### "Terlalu banyak data dikirim"
|
|
426
|
-
```typescript
|
|
427
|
-
// Reduce trace sample rate
|
|
428
|
-
app.sentry({
|
|
429
|
-
tracesSampleRate: 0.05 // 5% instead of 10%
|
|
430
|
-
});
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
### "Data sensitif terlihat di Sentry"
|
|
434
|
-
```typescript
|
|
435
|
-
// Use beforeSend to filter
|
|
436
|
-
beforeSend: (event) => {
|
|
437
|
-
// Scrub sensitive data
|
|
438
|
-
return event;
|
|
439
|
-
}
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
### "Quota Sentry penuh"
|
|
443
|
-
```typescript
|
|
444
|
-
// Reduce error sample rate
|
|
445
|
-
app.sentry({
|
|
446
|
-
sampleRate: 0.5 // 50% instead of 100%
|
|
447
|
-
});
|
|
448
|
-
|
|
449
|
-
// Or ignore certain errors
|
|
450
|
-
app.sentry({
|
|
451
|
-
ignoreErrors: [
|
|
452
|
-
'NetworkError',
|
|
453
|
-
'404',
|
|
454
|
-
'timeout'
|
|
455
|
-
]
|
|
456
|
-
});
|
|
457
|
-
```
|