@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,745 +0,0 @@
|
|
|
1
|
-
# Alert System (Event-Driven Monitoring)
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
Nexus memiliki sistem alerting yang powerful dan fleksibel untuk memantau kondisi aplikasi secara real-time. Sistem ini terintegrasi dengan **ObservabilityCenter** dan memungkinkan kamu mengirim notifikasi melalui berbagai channel seperti Slack, Email, Webhook, dan PagerDuty.
|
|
6
|
-
|
|
7
|
-
### Fitur Utama
|
|
8
|
-
|
|
9
|
-
- ✅ **Alert Rules yang Fleksibel** - Define kondisi kapan alert harus trigger
|
|
10
|
-
- ✅ **Multiple Notification Channels** - Slack, Email, Webhook, PagerDuty
|
|
11
|
-
- ✅ **Alert State Management** - Prevent alert flooding dengan cooldown period
|
|
12
|
-
- ✅ **Alert History** - Track semua alert yang telah trigger
|
|
13
|
-
- ✅ **User Control** - Enable/disable alerting sesuai kebutuhan
|
|
14
|
-
- ✅ **Real-time Monitoring** - Monitoring metrics dan system health secara real-time
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Quick Start
|
|
19
|
-
|
|
20
|
-
### 1. Basic Setup
|
|
21
|
-
|
|
22
|
-
```typescript
|
|
23
|
-
import { createApp } from './nexus';
|
|
24
|
-
import { ObservabilityCenter } from './nexus/advanced/observability';
|
|
25
|
-
|
|
26
|
-
const observability = new ObservabilityCenter({
|
|
27
|
-
alerting: {
|
|
28
|
-
enabled: true,
|
|
29
|
-
channels: {
|
|
30
|
-
slack: {
|
|
31
|
-
webhookUrl: process.env.SLACK_WEBHOOK_URL!
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
alerts: [
|
|
35
|
-
{
|
|
36
|
-
name: 'High Error Rate',
|
|
37
|
-
condition: 'error_rate > 0.05',
|
|
38
|
-
window: '5m',
|
|
39
|
-
threshold: 0.05,
|
|
40
|
-
channels: ['slack']
|
|
41
|
-
}
|
|
42
|
-
]
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
const app = createApp({
|
|
47
|
-
observability
|
|
48
|
-
});
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### 2. Trigger Alert Manually
|
|
52
|
-
|
|
53
|
-
```typescript
|
|
54
|
-
// Check dan trigger alert
|
|
55
|
-
await observability.alertManager?.checkAndTrigger('High Error Rate', 0.08);
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### 3. View Alert History
|
|
59
|
-
|
|
60
|
-
```typescript
|
|
61
|
-
// Get semua alert yang sudah trigger
|
|
62
|
-
const history = observability.getAlertHistory();
|
|
63
|
-
console.log(history);
|
|
64
|
-
// [
|
|
65
|
-
// {
|
|
66
|
-
// alert: 'High Error Rate',
|
|
67
|
-
// timestamp: 1701619200000,
|
|
68
|
-
// value: 0.08
|
|
69
|
-
// }
|
|
70
|
-
// ]
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## Configuration
|
|
76
|
-
|
|
77
|
-
### AlertingOptions
|
|
78
|
-
|
|
79
|
-
```typescript
|
|
80
|
-
interface AlertingOptions {
|
|
81
|
-
enabled?: boolean; // Enable/disable alerting
|
|
82
|
-
alerts?: AlertDefinition[]; // Daftar alert rules
|
|
83
|
-
channels?: {
|
|
84
|
-
slack?: { webhookUrl: string };
|
|
85
|
-
email?: { recipients: string[] };
|
|
86
|
-
pagerduty?: { routingKey: string };
|
|
87
|
-
webhook?: { url: string };
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### AlertDefinition
|
|
93
|
-
|
|
94
|
-
```typescript
|
|
95
|
-
interface AlertDefinition {
|
|
96
|
-
name: string; // Nama unik untuk alert
|
|
97
|
-
condition: string; // Kondisi trigger (misal: "error_rate > 0.05")
|
|
98
|
-
window: string; // Time window (misal: "5m", "1h")
|
|
99
|
-
channels: string[]; // Channel mana yang digunakan
|
|
100
|
-
threshold?: number; // Threshold value untuk evaluasi kondisi
|
|
101
|
-
}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## Alert Channels
|
|
107
|
-
|
|
108
|
-
### 1. Slack
|
|
109
|
-
|
|
110
|
-
Mengirim alert ke Slack channel melalui Webhook.
|
|
111
|
-
|
|
112
|
-
**Setup:**
|
|
113
|
-
|
|
114
|
-
```typescript
|
|
115
|
-
const observability = new ObservabilityCenter({
|
|
116
|
-
alerting: {
|
|
117
|
-
enabled: true,
|
|
118
|
-
channels: {
|
|
119
|
-
slack: {
|
|
120
|
-
webhookUrl: 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
alerts: [
|
|
124
|
-
{
|
|
125
|
-
name: 'Server Error',
|
|
126
|
-
condition: 'error_rate > 0.1',
|
|
127
|
-
window: '5m',
|
|
128
|
-
threshold: 0.1,
|
|
129
|
-
channels: ['slack']
|
|
130
|
-
}
|
|
131
|
-
]
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
**Format Pesan:**
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
🚨 Alert: Server Error
|
|
140
|
-
━━━━━━━━━━━━━━━━━━━━━
|
|
141
|
-
Condition: error_rate > 0.1
|
|
142
|
-
Current Value: 0.15
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
**Get Slack Webhook URL:**
|
|
146
|
-
1. Go to Slack Workspace Settings
|
|
147
|
-
2. Create Incoming Webhook
|
|
148
|
-
3. Copy Webhook URL ke env variable
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
### 2. Email
|
|
153
|
-
|
|
154
|
-
Mengirim alert via Email.
|
|
155
|
-
|
|
156
|
-
**Setup:**
|
|
157
|
-
|
|
158
|
-
```typescript
|
|
159
|
-
const observability = new ObservabilityCenter({
|
|
160
|
-
alerting: {
|
|
161
|
-
enabled: true,
|
|
162
|
-
channels: {
|
|
163
|
-
email: {
|
|
164
|
-
recipients: ['admin@example.com', 'ops@example.com']
|
|
165
|
-
}
|
|
166
|
-
},
|
|
167
|
-
alerts: [
|
|
168
|
-
{
|
|
169
|
-
name: 'Critical Error',
|
|
170
|
-
condition: 'error_rate > 0.5',
|
|
171
|
-
window: '1m',
|
|
172
|
-
threshold: 0.5,
|
|
173
|
-
channels: ['email']
|
|
174
|
-
}
|
|
175
|
-
]
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
**Note:** Implementasi email memerlukan external service (sendgrid, mailgun, etc). Saat ini alert akan di-log ke console.
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
### 3. Webhook
|
|
185
|
-
|
|
186
|
-
Mengirim alert ke custom endpoint via HTTP POST.
|
|
187
|
-
|
|
188
|
-
**Setup:**
|
|
189
|
-
|
|
190
|
-
```typescript
|
|
191
|
-
const observability = new ObservabilityCenter({
|
|
192
|
-
alerting: {
|
|
193
|
-
enabled: true,
|
|
194
|
-
channels: {
|
|
195
|
-
webhook: {
|
|
196
|
-
url: 'https://your-service.com/alerts'
|
|
197
|
-
}
|
|
198
|
-
},
|
|
199
|
-
alerts: [
|
|
200
|
-
{
|
|
201
|
-
name: 'High Memory Usage',
|
|
202
|
-
condition: 'memory_usage > 0.9',
|
|
203
|
-
window: '1m',
|
|
204
|
-
threshold: 0.9,
|
|
205
|
-
channels: ['webhook']
|
|
206
|
-
}
|
|
207
|
-
]
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
**Payload yang dikirim:**
|
|
213
|
-
|
|
214
|
-
```json
|
|
215
|
-
{
|
|
216
|
-
"alert": "High Memory Usage",
|
|
217
|
-
"condition": "memory_usage > 0.9",
|
|
218
|
-
"value": 0.92,
|
|
219
|
-
"timestamp": 1701619200000
|
|
220
|
-
}
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
---
|
|
224
|
-
|
|
225
|
-
### 4. PagerDuty
|
|
226
|
-
|
|
227
|
-
Mengirim alert ke PagerDuty untuk incident management.
|
|
228
|
-
|
|
229
|
-
**Setup:**
|
|
230
|
-
|
|
231
|
-
```typescript
|
|
232
|
-
const observability = new ObservabilityCenter({
|
|
233
|
-
alerting: {
|
|
234
|
-
enabled: true,
|
|
235
|
-
channels: {
|
|
236
|
-
pagerduty: {
|
|
237
|
-
routingKey: 'your-pagerduty-routing-key'
|
|
238
|
-
}
|
|
239
|
-
},
|
|
240
|
-
alerts: [
|
|
241
|
-
{
|
|
242
|
-
name: 'Service Down',
|
|
243
|
-
condition: 'uptime < 1',
|
|
244
|
-
window: '1m',
|
|
245
|
-
threshold: 1,
|
|
246
|
-
channels: ['pagerduty']
|
|
247
|
-
}
|
|
248
|
-
]
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
**Note:** Implementasi PagerDuty memerlukan API integration. Saat ini alert akan di-log ke console.
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
## Alert Conditions
|
|
258
|
-
|
|
259
|
-
Alert conditions menggunakan format sederhana dengan comparison operators:
|
|
260
|
-
|
|
261
|
-
### Supported Operators
|
|
262
|
-
|
|
263
|
-
- `>` : Greater than
|
|
264
|
-
- `<` : Less than
|
|
265
|
-
- `>=` : Greater than or equal
|
|
266
|
-
- `<=` : Less than or equal
|
|
267
|
-
|
|
268
|
-
### Contoh Conditions
|
|
269
|
-
|
|
270
|
-
```typescript
|
|
271
|
-
// Error rate alerts
|
|
272
|
-
'error_rate > 0.05' // 5% error rate
|
|
273
|
-
'error_rate > 0.1' // 10% error rate
|
|
274
|
-
|
|
275
|
-
// Response time alerts
|
|
276
|
-
'p95_duration > 1000' // P95 response time > 1000ms
|
|
277
|
-
'avg_duration > 500' // Average response time > 500ms
|
|
278
|
-
|
|
279
|
-
// Memory alerts
|
|
280
|
-
'memory_usage > 0.8' // Memory usage > 80%
|
|
281
|
-
'memory_growth > 0.5' // Memory growth > 50%
|
|
282
|
-
|
|
283
|
-
// Database alerts
|
|
284
|
-
'query_duration > 5000' // Query duration > 5 seconds
|
|
285
|
-
'slow_query_count > 10' // More than 10 slow queries
|
|
286
|
-
|
|
287
|
-
// Uptime alerts
|
|
288
|
-
'uptime < 0.99' // Uptime < 99%
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
---
|
|
292
|
-
|
|
293
|
-
## Using with Observability Middleware
|
|
294
|
-
|
|
295
|
-
### Setup Complete Monitoring Pipeline
|
|
296
|
-
|
|
297
|
-
```typescript
|
|
298
|
-
import { createApp } from './nexus';
|
|
299
|
-
import { ObservabilityCenter, createObservabilityMiddleware } from './nexus/advanced/observability';
|
|
300
|
-
|
|
301
|
-
const observability = new ObservabilityCenter({
|
|
302
|
-
metrics: {
|
|
303
|
-
enabled: true,
|
|
304
|
-
format: 'prometheus'
|
|
305
|
-
},
|
|
306
|
-
logging: {
|
|
307
|
-
level: 'info',
|
|
308
|
-
format: 'json'
|
|
309
|
-
},
|
|
310
|
-
tracing: {
|
|
311
|
-
enabled: true,
|
|
312
|
-
exporter: 'console'
|
|
313
|
-
},
|
|
314
|
-
apm: {
|
|
315
|
-
enabled: true,
|
|
316
|
-
slowQueryThreshold: 1000
|
|
317
|
-
},
|
|
318
|
-
alerting: {
|
|
319
|
-
enabled: true,
|
|
320
|
-
channels: {
|
|
321
|
-
slack: {
|
|
322
|
-
webhookUrl: process.env.SLACK_WEBHOOK_URL!
|
|
323
|
-
}
|
|
324
|
-
},
|
|
325
|
-
alerts: [
|
|
326
|
-
{
|
|
327
|
-
name: 'High Response Time',
|
|
328
|
-
condition: 'response_time > 2000',
|
|
329
|
-
window: '5m',
|
|
330
|
-
threshold: 2000,
|
|
331
|
-
channels: ['slack']
|
|
332
|
-
}
|
|
333
|
-
]
|
|
334
|
-
}
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
const app = createApp();
|
|
338
|
-
|
|
339
|
-
// Register observability middleware
|
|
340
|
-
app.use(createObservabilityMiddleware(observability, observability.options));
|
|
341
|
-
|
|
342
|
-
// Register observability routes
|
|
343
|
-
app.get('/metrics', observability.metricsHandler());
|
|
344
|
-
app.get('/health', observability.healthHandler());
|
|
345
|
-
|
|
346
|
-
// Your routes
|
|
347
|
-
app.get('/api/users', async (ctx) => {
|
|
348
|
-
// Your logic
|
|
349
|
-
return ctx.json({ users: [] });
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
export default app;
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
---
|
|
356
|
-
|
|
357
|
-
## Accessing Alert Data
|
|
358
|
-
|
|
359
|
-
### Get Alert History
|
|
360
|
-
|
|
361
|
-
```typescript
|
|
362
|
-
const history = observability.getAlertHistory();
|
|
363
|
-
|
|
364
|
-
// Filter by alert name
|
|
365
|
-
const errorAlerts = history.filter(a => a.alert === 'High Error Rate');
|
|
366
|
-
|
|
367
|
-
// Filter by time range
|
|
368
|
-
const recentAlerts = history.filter(
|
|
369
|
-
a => a.timestamp > Date.now() - 1000 * 60 * 5 // Last 5 minutes
|
|
370
|
-
);
|
|
371
|
-
|
|
372
|
-
console.log(history);
|
|
373
|
-
// Output:
|
|
374
|
-
// [
|
|
375
|
-
// {
|
|
376
|
-
// alert: 'High Error Rate',
|
|
377
|
-
// timestamp: 1701619200000,
|
|
378
|
-
// value: 0.08
|
|
379
|
-
// },
|
|
380
|
-
// {
|
|
381
|
-
// alert: 'High Response Time',
|
|
382
|
-
// timestamp: 1701619205000,
|
|
383
|
-
// value: 2500
|
|
384
|
-
// }
|
|
385
|
-
// ]
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
### Get Memory Statistics
|
|
389
|
-
|
|
390
|
-
```typescript
|
|
391
|
-
const memoryStats = observability.getMemoryStats();
|
|
392
|
-
|
|
393
|
-
console.log(memoryStats);
|
|
394
|
-
// Output:
|
|
395
|
-
// {
|
|
396
|
-
// current: {
|
|
397
|
-
// heapUsed: 25000000, // Bytes
|
|
398
|
-
// heapTotal: 50000000,
|
|
399
|
-
// external: 1000000,
|
|
400
|
-
// rss: 60000000
|
|
401
|
-
// },
|
|
402
|
-
// history: [
|
|
403
|
-
// { timestamp: 1701619200000, heapUsed: 24000000, heapTotal: 50000000 },
|
|
404
|
-
// { timestamp: 1701619260000, heapUsed: 25000000, heapTotal: 50000000 }
|
|
405
|
-
// ]
|
|
406
|
-
// }
|
|
407
|
-
```
|
|
408
|
-
|
|
409
|
-
### Get Slow Queries
|
|
410
|
-
|
|
411
|
-
```typescript
|
|
412
|
-
const slowQueries = observability.getSlowQueries();
|
|
413
|
-
|
|
414
|
-
console.log(slowQueries);
|
|
415
|
-
// Output:
|
|
416
|
-
// [
|
|
417
|
-
// {
|
|
418
|
-
// query: 'SELECT * FROM users WHERE ...',
|
|
419
|
-
// duration: 2500,
|
|
420
|
-
// timestamp: 1701619200000
|
|
421
|
-
// }
|
|
422
|
-
// ]
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
---
|
|
426
|
-
|
|
427
|
-
## Alert Prevention (Cooldown)
|
|
428
|
-
|
|
429
|
-
Sistem otomatis mencegah alert flooding dengan cooldown period **1 menit** antara alert dengan nama yang sama.
|
|
430
|
-
|
|
431
|
-
```typescript
|
|
432
|
-
// Alert pertama - TRIGGERED ✅
|
|
433
|
-
await observability.alertManager?.checkAndTrigger('High Error Rate', 0.08);
|
|
434
|
-
|
|
435
|
-
// Alert kedua dalam 1 menit - IGNORED (cooldown)
|
|
436
|
-
await observability.alertManager?.checkAndTrigger('High Error Rate', 0.09);
|
|
437
|
-
|
|
438
|
-
// Alert setelah 1 menit - TRIGGERED ✅
|
|
439
|
-
// (wait 60 seconds)
|
|
440
|
-
await observability.alertManager?.checkAndTrigger('High Error Rate', 0.10);
|
|
441
|
-
```
|
|
442
|
-
|
|
443
|
-
---
|
|
444
|
-
|
|
445
|
-
## Multiple Channels
|
|
446
|
-
|
|
447
|
-
Kamu bisa mengirim satu alert ke multiple channels sekaligus.
|
|
448
|
-
|
|
449
|
-
```typescript
|
|
450
|
-
const observability = new ObservabilityCenter({
|
|
451
|
-
alerting: {
|
|
452
|
-
enabled: true,
|
|
453
|
-
channels: {
|
|
454
|
-
slack: {
|
|
455
|
-
webhookUrl: 'https://hooks.slack.com/...'
|
|
456
|
-
},
|
|
457
|
-
email: {
|
|
458
|
-
recipients: ['admin@example.com']
|
|
459
|
-
},
|
|
460
|
-
webhook: {
|
|
461
|
-
url: 'https://your-service.com/alerts'
|
|
462
|
-
}
|
|
463
|
-
},
|
|
464
|
-
alerts: [
|
|
465
|
-
{
|
|
466
|
-
name: 'Critical System Error',
|
|
467
|
-
condition: 'error_rate > 0.5',
|
|
468
|
-
window: '1m',
|
|
469
|
-
threshold: 0.5,
|
|
470
|
-
channels: ['slack', 'email', 'webhook'] // Multiple channels!
|
|
471
|
-
}
|
|
472
|
-
]
|
|
473
|
-
}
|
|
474
|
-
});
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
---
|
|
478
|
-
|
|
479
|
-
## Enable/Disable Alerts
|
|
480
|
-
|
|
481
|
-
### Disable All Alerts
|
|
482
|
-
|
|
483
|
-
```typescript
|
|
484
|
-
const observability = new ObservabilityCenter({
|
|
485
|
-
alerting: {
|
|
486
|
-
enabled: false // All alerts disabled
|
|
487
|
-
}
|
|
488
|
-
});
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
### Disable Specific Channel
|
|
492
|
-
|
|
493
|
-
Ubah konfigurasi channels untuk tidak include channel tertentu:
|
|
494
|
-
|
|
495
|
-
```typescript
|
|
496
|
-
const observability = new ObservabilityCenter({
|
|
497
|
-
alerting: {
|
|
498
|
-
enabled: true,
|
|
499
|
-
channels: {
|
|
500
|
-
slack: {
|
|
501
|
-
webhookUrl: process.env.SLACK_WEBHOOK_URL!
|
|
502
|
-
}
|
|
503
|
-
// Email channel tidak ada = alert tidak bisa kirim email
|
|
504
|
-
},
|
|
505
|
-
alerts: [
|
|
506
|
-
{
|
|
507
|
-
name: 'Critical Error',
|
|
508
|
-
condition: 'error_rate > 0.5',
|
|
509
|
-
window: '1m',
|
|
510
|
-
threshold: 0.5,
|
|
511
|
-
channels: ['slack'] // Hanya Slack, tidak ada email
|
|
512
|
-
}
|
|
513
|
-
]
|
|
514
|
-
}
|
|
515
|
-
});
|
|
516
|
-
```
|
|
517
|
-
|
|
518
|
-
---
|
|
519
|
-
|
|
520
|
-
## Common Patterns
|
|
521
|
-
|
|
522
|
-
### Pattern 1: Production Alert Only
|
|
523
|
-
|
|
524
|
-
```typescript
|
|
525
|
-
const alerting = process.env.NODE_ENV === 'production' ? {
|
|
526
|
-
enabled: true,
|
|
527
|
-
channels: {
|
|
528
|
-
slack: { webhookUrl: process.env.SLACK_WEBHOOK_URL! }
|
|
529
|
-
},
|
|
530
|
-
alerts: [/* ... */]
|
|
531
|
-
} : {
|
|
532
|
-
enabled: false
|
|
533
|
-
};
|
|
534
|
-
|
|
535
|
-
const observability = new ObservabilityCenter({ alerting });
|
|
536
|
-
```
|
|
537
|
-
|
|
538
|
-
### Pattern 2: Different Alerts for Different Severity
|
|
539
|
-
|
|
540
|
-
```typescript
|
|
541
|
-
const observability = new ObservabilityCenter({
|
|
542
|
-
alerting: {
|
|
543
|
-
enabled: true,
|
|
544
|
-
channels: {
|
|
545
|
-
slack: { webhookUrl: process.env.SLACK_WEBHOOK_URL! },
|
|
546
|
-
email: { recipients: ['critical@example.com'] }
|
|
547
|
-
},
|
|
548
|
-
alerts: [
|
|
549
|
-
// WARNING level - Slack only
|
|
550
|
-
{
|
|
551
|
-
name: 'Warning: High Memory',
|
|
552
|
-
condition: 'memory_usage > 0.7',
|
|
553
|
-
window: '5m',
|
|
554
|
-
threshold: 0.7,
|
|
555
|
-
channels: ['slack']
|
|
556
|
-
},
|
|
557
|
-
// CRITICAL level - Slack + Email
|
|
558
|
-
{
|
|
559
|
-
name: 'Critical: Server Down',
|
|
560
|
-
condition: 'uptime < 1',
|
|
561
|
-
window: '1m',
|
|
562
|
-
threshold: 1,
|
|
563
|
-
channels: ['slack', 'email']
|
|
564
|
-
}
|
|
565
|
-
]
|
|
566
|
-
}
|
|
567
|
-
});
|
|
568
|
-
```
|
|
569
|
-
|
|
570
|
-
### Pattern 3: Environment-based Thresholds
|
|
571
|
-
|
|
572
|
-
```typescript
|
|
573
|
-
const isDev = process.env.NODE_ENV === 'development';
|
|
574
|
-
|
|
575
|
-
const observability = new ObservabilityCenter({
|
|
576
|
-
alerting: {
|
|
577
|
-
enabled: !isDev,
|
|
578
|
-
channels: { slack: { webhookUrl: process.env.SLACK_WEBHOOK_URL! } },
|
|
579
|
-
alerts: [
|
|
580
|
-
{
|
|
581
|
-
name: 'High Error Rate',
|
|
582
|
-
condition: 'error_rate > ' + (isDev ? '0.5' : '0.05'),
|
|
583
|
-
window: '5m',
|
|
584
|
-
threshold: isDev ? 0.5 : 0.05,
|
|
585
|
-
channels: ['slack']
|
|
586
|
-
}
|
|
587
|
-
]
|
|
588
|
-
}
|
|
589
|
-
});
|
|
590
|
-
```
|
|
591
|
-
|
|
592
|
-
---
|
|
593
|
-
|
|
594
|
-
## Alert History API
|
|
595
|
-
|
|
596
|
-
Kamu bisa query alert history untuk:
|
|
597
|
-
- Dashboard/UI
|
|
598
|
-
- Statistics/Analytics
|
|
599
|
-
- Debugging
|
|
600
|
-
- Audit trail
|
|
601
|
-
|
|
602
|
-
```typescript
|
|
603
|
-
// Get semua alert
|
|
604
|
-
const all = observability.getAlertHistory();
|
|
605
|
-
|
|
606
|
-
// Get alert dalam 1 jam terakhir
|
|
607
|
-
const oneHourAgo = Date.now() - 1000 * 60 * 60;
|
|
608
|
-
const recent = all.filter(a => a.timestamp > oneHourAgo);
|
|
609
|
-
|
|
610
|
-
// Group by alert name
|
|
611
|
-
const grouped = all.reduce((acc, alert) => {
|
|
612
|
-
if (!acc[alert.alert]) acc[alert.alert] = [];
|
|
613
|
-
acc[alert.alert].push(alert);
|
|
614
|
-
return acc;
|
|
615
|
-
}, {} as Record<string, typeof all>);
|
|
616
|
-
|
|
617
|
-
// Count alerts by type
|
|
618
|
-
const counts = Object.entries(grouped).map(([name, alerts]) => ({
|
|
619
|
-
name,
|
|
620
|
-
count: alerts.length,
|
|
621
|
-
lastTriggered: Math.max(...alerts.map(a => a.timestamp))
|
|
622
|
-
}));
|
|
623
|
-
|
|
624
|
-
console.log(counts);
|
|
625
|
-
```
|
|
626
|
-
|
|
627
|
-
---
|
|
628
|
-
|
|
629
|
-
## Best Practices
|
|
630
|
-
|
|
631
|
-
### 1. Set Reasonable Thresholds
|
|
632
|
-
|
|
633
|
-
```typescript
|
|
634
|
-
// ❌ BAD - Alert terlalu sering
|
|
635
|
-
{
|
|
636
|
-
name: 'High Error Rate',
|
|
637
|
-
threshold: 0.001, // 0.1% error rate
|
|
638
|
-
channels: ['slack']
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
// ✅ GOOD - Reasonable threshold
|
|
642
|
-
{
|
|
643
|
-
name: 'High Error Rate',
|
|
644
|
-
threshold: 0.05, // 5% error rate
|
|
645
|
-
channels: ['slack']
|
|
646
|
-
}
|
|
647
|
-
```
|
|
648
|
-
|
|
649
|
-
### 2. Use Meaningful Alert Names
|
|
650
|
-
|
|
651
|
-
```typescript
|
|
652
|
-
// ❌ BAD - Tidak jelas
|
|
653
|
-
{ name: 'Alert 1' }
|
|
654
|
-
{ name: 'Threshold exceeded' }
|
|
655
|
-
|
|
656
|
-
// ✅ GOOD - Deskriptif
|
|
657
|
-
{ name: 'Critical: Database Connection Failed' }
|
|
658
|
-
{ name: 'Warning: High Memory Usage (>80%)' }
|
|
659
|
-
{ name: 'Error Rate Spike Detected' }
|
|
660
|
-
```
|
|
661
|
-
|
|
662
|
-
### 3. Include Context in Webhook Payload
|
|
663
|
-
|
|
664
|
-
```typescript
|
|
665
|
-
// Custom implementation bisa extend AlertManager
|
|
666
|
-
// untuk include context lebih detail
|
|
667
|
-
const payload = {
|
|
668
|
-
alert: 'High Error Rate',
|
|
669
|
-
severity: 'critical',
|
|
670
|
-
affected_services: ['api', 'worker'],
|
|
671
|
-
current_value: 0.08,
|
|
672
|
-
threshold: 0.05,
|
|
673
|
-
timestamp: new Date().toISOString(),
|
|
674
|
-
runbook: 'https://docs.example.com/runbooks/high-error-rate'
|
|
675
|
-
};
|
|
676
|
-
```
|
|
677
|
-
|
|
678
|
-
### 4. Monitor Alert System Itself
|
|
679
|
-
|
|
680
|
-
```typescript
|
|
681
|
-
// Set alert untuk warning jika alerting disabled
|
|
682
|
-
if (!observability.options.alerting?.enabled) {
|
|
683
|
-
console.warn('⚠️ Alerting system is DISABLED');
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
// Monitor alert delivery failures
|
|
687
|
-
const history = observability.getAlertHistory();
|
|
688
|
-
console.log(`Total alerts triggered: ${history.length}`);
|
|
689
|
-
```
|
|
690
|
-
|
|
691
|
-
---
|
|
692
|
-
|
|
693
|
-
## Troubleshooting
|
|
694
|
-
|
|
695
|
-
### Alert tidak trigger?
|
|
696
|
-
|
|
697
|
-
```typescript
|
|
698
|
-
// 1. Check apakah alerting enabled
|
|
699
|
-
console.log(observability.options.alerting?.enabled);
|
|
700
|
-
|
|
701
|
-
// 2. Check apakah alert definition ada
|
|
702
|
-
console.log(observability.options.alerting?.alerts);
|
|
703
|
-
|
|
704
|
-
// 3. Check cooldown - alert perlu wait 1 minute sebelum trigger lagi
|
|
705
|
-
const history = observability.getAlertHistory();
|
|
706
|
-
const lastAlert = history.find(a => a.alert === 'Your Alert Name');
|
|
707
|
-
console.log('Last triggered:', lastAlert?.timestamp);
|
|
708
|
-
```
|
|
709
|
-
|
|
710
|
-
### Alert terus spam?
|
|
711
|
-
|
|
712
|
-
```typescript
|
|
713
|
-
// Cooldown sudah built-in (1 minute)
|
|
714
|
-
// Tapi kamu bisa adjust logic di AlertManager jika perlu
|
|
715
|
-
|
|
716
|
-
// Or disable alert sementara
|
|
717
|
-
const observability = new ObservabilityCenter({
|
|
718
|
-
alerting: { enabled: false }
|
|
719
|
-
});
|
|
720
|
-
```
|
|
721
|
-
|
|
722
|
-
### Webhook tidak terima alert?
|
|
723
|
-
|
|
724
|
-
```typescript
|
|
725
|
-
// 1. Check webhook URL
|
|
726
|
-
console.log(observability.options.alerting?.channels?.webhook?.url);
|
|
727
|
-
|
|
728
|
-
// 2. Test manual trigger
|
|
729
|
-
await observability.alertManager?.checkAndTrigger('Test Alert', 100);
|
|
730
|
-
|
|
731
|
-
// 3. Check browser console untuk error
|
|
732
|
-
```
|
|
733
|
-
|
|
734
|
-
---
|
|
735
|
-
|
|
736
|
-
## Next Steps
|
|
737
|
-
|
|
738
|
-
1. **Implement Telegram Channel** - Add support untuk Telegram notifications
|
|
739
|
-
2. **System Metrics Monitoring** - Monitor CPU, memory, disk automatically
|
|
740
|
-
3. **Server Crash Detection** - Detect dan alert ketika server crash
|
|
741
|
-
4. **Custom Webhooks** - Implement custom alert handlers
|
|
742
|
-
5. **Alert Dashboard** - Build UI untuk view/manage alerts
|
|
743
|
-
|
|
744
|
-
Lihat file-file lain di documentation untuk fitur yang related! 📚
|
|
745
|
-
|