@engjts/nexus 0.1.7 → 0.1.9
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/generatePlaygroundHTML.d.ts.map +1 -1
- package/dist/advanced/playground/generatePlaygroundHTML.js +107 -0
- package/dist/advanced/playground/generatePlaygroundHTML.js.map +1 -1
- package/dist/advanced/playground/playground.d.ts +19 -0
- package/dist/advanced/playground/playground.d.ts.map +1 -1
- package/dist/advanced/playground/playground.js +70 -0
- package/dist/advanced/playground/playground.js.map +1 -1
- package/dist/advanced/playground/types.d.ts +20 -0
- package/dist/advanced/playground/types.d.ts.map +1 -1
- package/dist/core/application.d.ts +14 -0
- package/dist/core/application.d.ts.map +1 -1
- package/dist/core/application.js +173 -71
- package/dist/core/application.js.map +1 -1
- package/dist/core/context-pool.d.ts +2 -13
- package/dist/core/context-pool.d.ts.map +1 -1
- package/dist/core/context-pool.js +7 -45
- package/dist/core/context-pool.js.map +1 -1
- package/dist/core/context.d.ts +108 -5
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +449 -53
- package/dist/core/context.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +9 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/middleware.d.ts +6 -0
- package/dist/core/middleware.d.ts.map +1 -1
- package/dist/core/middleware.js +83 -84
- package/dist/core/middleware.js.map +1 -1
- package/dist/core/performance/fast-json.d.ts +149 -0
- package/dist/core/performance/fast-json.d.ts.map +1 -0
- package/dist/core/performance/fast-json.js +473 -0
- package/dist/core/performance/fast-json.js.map +1 -0
- package/dist/core/router/file-router.d.ts +20 -7
- package/dist/core/router/file-router.d.ts.map +1 -1
- package/dist/core/router/file-router.js +41 -13
- package/dist/core/router/file-router.js.map +1 -1
- package/dist/core/router/index.d.ts +6 -0
- package/dist/core/router/index.d.ts.map +1 -1
- package/dist/core/router/index.js +33 -6
- package/dist/core/router/index.js.map +1 -1
- package/dist/core/router/radix-tree.d.ts +4 -1
- package/dist/core/router/radix-tree.d.ts.map +1 -1
- package/dist/core/router/radix-tree.js +7 -3
- package/dist/core/router/radix-tree.js.map +1 -1
- package/dist/core/serializer.d.ts +251 -0
- package/dist/core/serializer.d.ts.map +1 -0
- package/dist/core/serializer.js +290 -0
- package/dist/core/serializer.js.map +1 -0
- package/dist/core/types.d.ts +39 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
- 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 -1849
- 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 -170
- package/src/advanced/playground/types.ts +0 -20
- 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 -1335
- package/src/core/context-pool.ts +0 -127
- package/src/core/context.ts +0 -412
- package/src/core/index.ts +0 -80
- package/src/core/middleware.ts +0 -262
- 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 -594
- package/src/core/router/index.ts +0 -227
- package/src/core/router/radix-tree.ts +0 -226
- 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 -574
- 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 -264
- 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,551 +0,0 @@
|
|
|
1
|
-
# Sentry Plugin
|
|
2
|
-
|
|
3
|
-
Nexus Framework menyediakan integrasi Sentry sebagai plugin untuk error tracking, performance monitoring, dan session management.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
Sentry plugin sudah built-in di Nexus Framework, tidak perlu install package tambahan.
|
|
8
|
-
|
|
9
|
-
## Quick Start
|
|
10
|
-
|
|
11
|
-
```typescript
|
|
12
|
-
import { createApp } from './src';
|
|
13
|
-
import { sentry } from './src/advanced/sentry';
|
|
14
|
-
|
|
15
|
-
const app = createApp();
|
|
16
|
-
|
|
17
|
-
app.plugin(sentry({
|
|
18
|
-
dsn: process.env.SENTRY_DSN,
|
|
19
|
-
environment: 'production'
|
|
20
|
-
}));
|
|
21
|
-
|
|
22
|
-
app.listen(3000);
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Configuration
|
|
26
|
-
|
|
27
|
-
### Basic Options
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
app.plugin(sentry({
|
|
31
|
-
// Required: Sentry DSN
|
|
32
|
-
dsn: 'https://xxx@xxx.ingest.sentry.io/xxx',
|
|
33
|
-
|
|
34
|
-
// Environment name
|
|
35
|
-
environment: 'production', // default: process.env.NODE_ENV
|
|
36
|
-
|
|
37
|
-
// Release version
|
|
38
|
-
release: '1.0.0', // default: process.env.npm_package_version
|
|
39
|
-
|
|
40
|
-
// Server name for identification
|
|
41
|
-
serverName: 'api-server-1',
|
|
42
|
-
|
|
43
|
-
// Debug mode - logs Sentry operations
|
|
44
|
-
debug: false
|
|
45
|
-
}));
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Sampling Options
|
|
49
|
-
|
|
50
|
-
```typescript
|
|
51
|
-
app.plugin(sentry({
|
|
52
|
-
dsn: '...',
|
|
53
|
-
|
|
54
|
-
// Sample rate for error events (0.0 to 1.0)
|
|
55
|
-
sampleRate: 1.0, // 100% - capture all errors
|
|
56
|
-
|
|
57
|
-
// Sample rate for performance/transaction events
|
|
58
|
-
tracesSampleRate: 0.1, // 10% - for production
|
|
59
|
-
|
|
60
|
-
// Enable/disable performance monitoring
|
|
61
|
-
enableTracing: true
|
|
62
|
-
}));
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### Integration Options
|
|
66
|
-
|
|
67
|
-
```typescript
|
|
68
|
-
app.plugin(sentry({
|
|
69
|
-
dsn: '...',
|
|
70
|
-
|
|
71
|
-
integrations: {
|
|
72
|
-
// Capture HTTP request errors
|
|
73
|
-
http: true,
|
|
74
|
-
|
|
75
|
-
// Capture console.error calls
|
|
76
|
-
console: false,
|
|
77
|
-
|
|
78
|
-
// Capture unhandled Promise rejections
|
|
79
|
-
unhandledRejection: true,
|
|
80
|
-
|
|
81
|
-
// Capture uncaught exceptions
|
|
82
|
-
uncaughtException: true
|
|
83
|
-
}
|
|
84
|
-
}));
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### Middleware Options
|
|
88
|
-
|
|
89
|
-
```typescript
|
|
90
|
-
app.plugin(sentry({
|
|
91
|
-
dsn: '...',
|
|
92
|
-
|
|
93
|
-
middleware: {
|
|
94
|
-
// Include request body in error reports
|
|
95
|
-
includeRequestBody: true,
|
|
96
|
-
|
|
97
|
-
// Include request headers
|
|
98
|
-
includeHeaders: true,
|
|
99
|
-
|
|
100
|
-
// Headers to exclude (sensitive data)
|
|
101
|
-
excludeHeaders: ['authorization', 'cookie', 'x-api-key'],
|
|
102
|
-
|
|
103
|
-
// Paths to ignore (no tracking)
|
|
104
|
-
ignorePaths: ['/health', '/metrics', '/__nexus'],
|
|
105
|
-
|
|
106
|
-
// Extract user from context
|
|
107
|
-
extractUser: (ctx) => {
|
|
108
|
-
const token = ctx.headers['authorization'];
|
|
109
|
-
if (token) {
|
|
110
|
-
const user = decodeToken(token);
|
|
111
|
-
return { id: user.id, email: user.email };
|
|
112
|
-
}
|
|
113
|
-
return null;
|
|
114
|
-
},
|
|
115
|
-
|
|
116
|
-
// Custom transaction naming
|
|
117
|
-
getTransactionName: (ctx) => `${ctx.method} ${ctx.path}`
|
|
118
|
-
}
|
|
119
|
-
}));
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### Advanced Options
|
|
123
|
-
|
|
124
|
-
```typescript
|
|
125
|
-
app.plugin(sentry({
|
|
126
|
-
dsn: '...',
|
|
127
|
-
|
|
128
|
-
// Global tags for all events
|
|
129
|
-
tags: {
|
|
130
|
-
service: 'api-gateway',
|
|
131
|
-
version: '1.0.0',
|
|
132
|
-
region: 'us-east-1'
|
|
133
|
-
},
|
|
134
|
-
|
|
135
|
-
// Extra context for all events
|
|
136
|
-
extra: {
|
|
137
|
-
nodeVersion: process.version
|
|
138
|
-
},
|
|
139
|
-
|
|
140
|
-
// Error patterns to ignore
|
|
141
|
-
ignoreErrors: [
|
|
142
|
-
'NotFoundError',
|
|
143
|
-
/^ValidationError/,
|
|
144
|
-
'ECONNRESET'
|
|
145
|
-
],
|
|
146
|
-
|
|
147
|
-
// Paths to ignore
|
|
148
|
-
ignorePaths: ['/health', '/ping'],
|
|
149
|
-
|
|
150
|
-
// Request timeout
|
|
151
|
-
timeout: 5000,
|
|
152
|
-
|
|
153
|
-
// Max breadcrumbs to store
|
|
154
|
-
maxBreadcrumbs: 100,
|
|
155
|
-
|
|
156
|
-
// Before send hook - modify or drop events
|
|
157
|
-
beforeSend: (event, hint) => {
|
|
158
|
-
// Filter out specific errors
|
|
159
|
-
if (event.exception?.values?.[0]?.type === 'IgnoredError') {
|
|
160
|
-
return null; // Drop event
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Modify event
|
|
164
|
-
event.tags = { ...event.tags, processed: 'true' };
|
|
165
|
-
return event;
|
|
166
|
-
},
|
|
167
|
-
|
|
168
|
-
// Before send transaction hook
|
|
169
|
-
beforeSendTransaction: (transaction) => {
|
|
170
|
-
// Filter out health check transactions
|
|
171
|
-
if (transaction.name.includes('/health')) {
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
return transaction;
|
|
175
|
-
}
|
|
176
|
-
}));
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
## Full Example
|
|
180
|
-
|
|
181
|
-
```typescript
|
|
182
|
-
app.plugin(sentry({
|
|
183
|
-
dsn: process.env.SENTRY_DSN,
|
|
184
|
-
environment: process.env.NODE_ENV || 'development',
|
|
185
|
-
release: '1.0.0',
|
|
186
|
-
debug: process.env.NODE_ENV === 'development',
|
|
187
|
-
|
|
188
|
-
sampleRate: 0.9,
|
|
189
|
-
tracesSampleRate: 0.5,
|
|
190
|
-
|
|
191
|
-
integrations: {
|
|
192
|
-
unhandledRejection: true,
|
|
193
|
-
uncaughtException: true,
|
|
194
|
-
http: true,
|
|
195
|
-
console: false
|
|
196
|
-
},
|
|
197
|
-
|
|
198
|
-
tags: {
|
|
199
|
-
service: 'nexus-api',
|
|
200
|
-
version: '1.0.0'
|
|
201
|
-
},
|
|
202
|
-
|
|
203
|
-
middleware: {
|
|
204
|
-
includeRequestBody: true,
|
|
205
|
-
includeHeaders: true,
|
|
206
|
-
excludeHeaders: ['authorization', 'cookie', 'x-api-key'],
|
|
207
|
-
ignorePaths: ['/health', '/metrics'],
|
|
208
|
-
extractUser: (ctx) => {
|
|
209
|
-
const userId = ctx.headers['x-user-id'] as string;
|
|
210
|
-
return userId ? { id: userId } : null;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}));
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
## Helper Functions
|
|
217
|
-
|
|
218
|
-
### Capture Exception
|
|
219
|
-
|
|
220
|
-
Manually capture an error:
|
|
221
|
-
|
|
222
|
-
```typescript
|
|
223
|
-
import { captureException } from './src/advanced/sentry';
|
|
224
|
-
|
|
225
|
-
app.post('/api/users', {
|
|
226
|
-
handler: async (ctx) => {
|
|
227
|
-
try {
|
|
228
|
-
await createUser(ctx.body);
|
|
229
|
-
} catch (error) {
|
|
230
|
-
captureException(error, {
|
|
231
|
-
level: 'error',
|
|
232
|
-
tags: { action: 'create_user' },
|
|
233
|
-
extra: { userId: ctx.body.email }
|
|
234
|
-
});
|
|
235
|
-
throw error;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
### Capture Message
|
|
242
|
-
|
|
243
|
-
Send a message to Sentry:
|
|
244
|
-
|
|
245
|
-
```typescript
|
|
246
|
-
import { captureMessage } from './src/advanced/sentry';
|
|
247
|
-
|
|
248
|
-
// Warning message
|
|
249
|
-
captureMessage('User attempted invalid action', {
|
|
250
|
-
level: 'warning',
|
|
251
|
-
tags: { userId: '123' }
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
// Info message
|
|
255
|
-
captureMessage('Feature flag enabled', {
|
|
256
|
-
level: 'info',
|
|
257
|
-
extra: { flag: 'new_dashboard' }
|
|
258
|
-
});
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
### Add Breadcrumb
|
|
262
|
-
|
|
263
|
-
Add navigation/action trail:
|
|
264
|
-
|
|
265
|
-
```typescript
|
|
266
|
-
import { addBreadcrumb } from './src/advanced/sentry';
|
|
267
|
-
|
|
268
|
-
app.post('/api/checkout', {
|
|
269
|
-
handler: async (ctx) => {
|
|
270
|
-
addBreadcrumb({
|
|
271
|
-
type: 'http',
|
|
272
|
-
category: 'checkout',
|
|
273
|
-
message: 'User initiated checkout',
|
|
274
|
-
data: { cartId: ctx.body.cartId },
|
|
275
|
-
level: 'info'
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
// Process checkout...
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
### Set User Context
|
|
284
|
-
|
|
285
|
-
Associate errors with a user:
|
|
286
|
-
|
|
287
|
-
```typescript
|
|
288
|
-
import { setUser } from './src/advanced/sentry';
|
|
289
|
-
|
|
290
|
-
// After login
|
|
291
|
-
setUser({
|
|
292
|
-
id: user.id,
|
|
293
|
-
email: user.email,
|
|
294
|
-
username: user.name,
|
|
295
|
-
ip_address: ctx.headers['x-forwarded-for']
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
// On logout
|
|
299
|
-
setUser(null);
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
### Set Tags
|
|
303
|
-
|
|
304
|
-
Add global tags:
|
|
305
|
-
|
|
306
|
-
```typescript
|
|
307
|
-
import { setTag } from './src/advanced/sentry';
|
|
308
|
-
|
|
309
|
-
// Single tag
|
|
310
|
-
setTag('feature', 'checkout_v2');
|
|
311
|
-
|
|
312
|
-
// Multiple tags
|
|
313
|
-
setTags({
|
|
314
|
-
region: 'us-east-1',
|
|
315
|
-
tier: 'premium'
|
|
316
|
-
});
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
### Set Extra Context
|
|
320
|
-
|
|
321
|
-
Add extra debugging info:
|
|
322
|
-
|
|
323
|
-
```typescript
|
|
324
|
-
import { setExtra } from './src/advanced/sentry';
|
|
325
|
-
|
|
326
|
-
setExtra('lastAction', 'checkout');
|
|
327
|
-
setExtra('cartItems', cartItems.length);
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
## Performance Monitoring
|
|
331
|
-
|
|
332
|
-
### Using withSpan
|
|
333
|
-
|
|
334
|
-
Track performance of specific operations:
|
|
335
|
-
|
|
336
|
-
```typescript
|
|
337
|
-
import { withSpan } from './src/advanced/sentry';
|
|
338
|
-
|
|
339
|
-
app.get('/api/users/:id', {
|
|
340
|
-
handler: async (ctx) => {
|
|
341
|
-
// Track database query
|
|
342
|
-
const user = await withSpan(ctx,
|
|
343
|
-
{ op: 'db.query', description: 'Fetch user by ID' },
|
|
344
|
-
async () => {
|
|
345
|
-
return await db.users.findById(ctx.params.id);
|
|
346
|
-
}
|
|
347
|
-
);
|
|
348
|
-
|
|
349
|
-
// Track external API call
|
|
350
|
-
const profile = await withSpan(ctx,
|
|
351
|
-
{ op: 'http.client', description: 'Fetch user profile from CRM' },
|
|
352
|
-
async () => {
|
|
353
|
-
return await fetch(`https://crm.api/users/${user.id}`);
|
|
354
|
-
}
|
|
355
|
-
);
|
|
356
|
-
|
|
357
|
-
return { user, profile };
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
### Manual Transaction Control
|
|
363
|
-
|
|
364
|
-
```typescript
|
|
365
|
-
import { getSentry } from './src/advanced/sentry';
|
|
366
|
-
|
|
367
|
-
const client = getSentry();
|
|
368
|
-
|
|
369
|
-
// Start a transaction
|
|
370
|
-
const transaction = client.startTransaction({
|
|
371
|
-
name: 'process-batch-job',
|
|
372
|
-
op: 'job',
|
|
373
|
-
tags: { jobType: 'email' }
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
// Create child spans
|
|
377
|
-
const span1 = client.startSpan(transaction, {
|
|
378
|
-
op: 'db.query',
|
|
379
|
-
description: 'Fetch pending emails'
|
|
380
|
-
});
|
|
381
|
-
// ... do work
|
|
382
|
-
client.finishSpan(span1);
|
|
383
|
-
|
|
384
|
-
const span2 = client.startSpan(transaction, {
|
|
385
|
-
op: 'email.send',
|
|
386
|
-
description: 'Send batch emails'
|
|
387
|
-
});
|
|
388
|
-
// ... do work
|
|
389
|
-
client.finishSpan(span2);
|
|
390
|
-
|
|
391
|
-
// Finish transaction
|
|
392
|
-
client.finishTransaction(transaction, 'ok');
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
## Graceful Shutdown
|
|
396
|
-
|
|
397
|
-
Flush pending events before shutdown:
|
|
398
|
-
|
|
399
|
-
```typescript
|
|
400
|
-
import { getSentry } from './src/advanced/sentry';
|
|
401
|
-
|
|
402
|
-
process.on('SIGTERM', async () => {
|
|
403
|
-
const client = getSentry();
|
|
404
|
-
if (client) {
|
|
405
|
-
await client.flush(5000); // Wait max 5 seconds
|
|
406
|
-
}
|
|
407
|
-
process.exit(0);
|
|
408
|
-
});
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
> **Note:** When using `app.gracefulShutdown()`, Sentry events are automatically flushed.
|
|
412
|
-
|
|
413
|
-
## Best Practices
|
|
414
|
-
|
|
415
|
-
### 1. Environment-Based Configuration
|
|
416
|
-
|
|
417
|
-
```typescript
|
|
418
|
-
const isDev = process.env.NODE_ENV === 'development';
|
|
419
|
-
|
|
420
|
-
app.plugin(sentry({
|
|
421
|
-
dsn: process.env.SENTRY_DSN,
|
|
422
|
-
environment: process.env.NODE_ENV,
|
|
423
|
-
debug: isDev,
|
|
424
|
-
sampleRate: isDev ? 1.0 : 0.9,
|
|
425
|
-
tracesSampleRate: isDev ? 1.0 : 0.1
|
|
426
|
-
}));
|
|
427
|
-
```
|
|
428
|
-
|
|
429
|
-
### 2. Sensitive Data Filtering
|
|
430
|
-
|
|
431
|
-
```typescript
|
|
432
|
-
app.plugin(sentry({
|
|
433
|
-
dsn: '...',
|
|
434
|
-
|
|
435
|
-
middleware: {
|
|
436
|
-
excludeHeaders: ['authorization', 'cookie', 'x-api-key', 'x-auth-token'],
|
|
437
|
-
includeRequestBody: false // Disable in production if contains sensitive data
|
|
438
|
-
},
|
|
439
|
-
|
|
440
|
-
beforeSend: (event) => {
|
|
441
|
-
// Remove sensitive data from extras
|
|
442
|
-
if (event.extra?.password) {
|
|
443
|
-
delete event.extra.password;
|
|
444
|
-
}
|
|
445
|
-
return event;
|
|
446
|
-
}
|
|
447
|
-
}));
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
### 3. Ignore Noise
|
|
451
|
-
|
|
452
|
-
```typescript
|
|
453
|
-
app.plugin(sentry({
|
|
454
|
-
dsn: '...',
|
|
455
|
-
|
|
456
|
-
ignoreErrors: [
|
|
457
|
-
'NotFoundError',
|
|
458
|
-
'ValidationError',
|
|
459
|
-
'AbortError',
|
|
460
|
-
/^Network request failed/
|
|
461
|
-
],
|
|
462
|
-
|
|
463
|
-
middleware: {
|
|
464
|
-
ignorePaths: ['/health', '/metrics', '/favicon.ico']
|
|
465
|
-
}
|
|
466
|
-
}));
|
|
467
|
-
```
|
|
468
|
-
|
|
469
|
-
### 4. Meaningful Context
|
|
470
|
-
|
|
471
|
-
```typescript
|
|
472
|
-
app.post('/api/orders', {
|
|
473
|
-
handler: async (ctx) => {
|
|
474
|
-
// Add context before potential errors
|
|
475
|
-
addBreadcrumb({
|
|
476
|
-
category: 'order',
|
|
477
|
-
message: 'Processing order',
|
|
478
|
-
data: {
|
|
479
|
-
orderId: ctx.body.orderId,
|
|
480
|
-
items: ctx.body.items.length
|
|
481
|
-
}
|
|
482
|
-
});
|
|
483
|
-
|
|
484
|
-
setTag('order_type', ctx.body.type);
|
|
485
|
-
|
|
486
|
-
// Process order...
|
|
487
|
-
}
|
|
488
|
-
});
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
## API Reference
|
|
492
|
-
|
|
493
|
-
### sentry(options)
|
|
494
|
-
|
|
495
|
-
Creates a Sentry plugin.
|
|
496
|
-
|
|
497
|
-
| Option | Type | Default | Description |
|
|
498
|
-
|--------|------|---------|-------------|
|
|
499
|
-
| `dsn` | `string` | required | Sentry DSN |
|
|
500
|
-
| `environment` | `string` | `process.env.NODE_ENV` | Environment name |
|
|
501
|
-
| `release` | `string` | `package.version` | Release version |
|
|
502
|
-
| `serverName` | `string` | hostname | Server identifier |
|
|
503
|
-
| `sampleRate` | `number` | `1.0` | Error sample rate (0-1) |
|
|
504
|
-
| `tracesSampleRate` | `number` | `0.1` | Transaction sample rate (0-1) |
|
|
505
|
-
| `enableTracing` | `boolean` | `true` | Enable performance monitoring |
|
|
506
|
-
| `maxBreadcrumbs` | `number` | `100` | Max breadcrumbs to store |
|
|
507
|
-
| `debug` | `boolean` | `false` | Enable debug logging |
|
|
508
|
-
| `timeout` | `number` | `5000` | Request timeout (ms) |
|
|
509
|
-
| `tags` | `Record<string, string>` | `{}` | Global tags |
|
|
510
|
-
| `extra` | `Record<string, any>` | `{}` | Global extra context |
|
|
511
|
-
| `ignoreErrors` | `(string \| RegExp)[]` | `[]` | Errors to ignore |
|
|
512
|
-
| `ignorePaths` | `string[]` | `[]` | Paths to ignore |
|
|
513
|
-
| `integrations` | `object` | see below | Integration settings |
|
|
514
|
-
| `middleware` | `object` | see below | Middleware settings |
|
|
515
|
-
| `beforeSend` | `function` | - | Event filter hook |
|
|
516
|
-
| `beforeSendTransaction` | `function` | - | Transaction filter hook |
|
|
517
|
-
|
|
518
|
-
### Helper Functions
|
|
519
|
-
|
|
520
|
-
| Function | Description |
|
|
521
|
-
|----------|-------------|
|
|
522
|
-
| `captureException(error, options?)` | Capture an exception |
|
|
523
|
-
| `captureMessage(message, options?)` | Capture a message |
|
|
524
|
-
| `addBreadcrumb(breadcrumb)` | Add a breadcrumb |
|
|
525
|
-
| `setUser(user)` | Set user context |
|
|
526
|
-
| `setTag(key, value)` | Set a tag |
|
|
527
|
-
| `setTags(tags)` | Set multiple tags |
|
|
528
|
-
| `setExtra(key, value)` | Set extra context |
|
|
529
|
-
| `getSentry()` | Get the Sentry client instance |
|
|
530
|
-
| `withSpan(ctx, options, fn)` | Execute function with span tracking |
|
|
531
|
-
|
|
532
|
-
## Troubleshooting
|
|
533
|
-
|
|
534
|
-
### Events Not Appearing
|
|
535
|
-
|
|
536
|
-
1. Check DSN is correct
|
|
537
|
-
2. Enable `debug: true` to see logs
|
|
538
|
-
3. Check `sampleRate` is not 0
|
|
539
|
-
4. Verify network connectivity to Sentry
|
|
540
|
-
|
|
541
|
-
### Performance Impact
|
|
542
|
-
|
|
543
|
-
1. Reduce `tracesSampleRate` in production
|
|
544
|
-
2. Use `ignorePaths` for high-traffic endpoints
|
|
545
|
-
3. Disable `includeRequestBody` if not needed
|
|
546
|
-
|
|
547
|
-
### Missing Context
|
|
548
|
-
|
|
549
|
-
1. Ensure `extractUser` returns user data
|
|
550
|
-
2. Add breadcrumbs before potential errors
|
|
551
|
-
3. Use `setTag` and `setExtra` for debugging info
|