@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.
Files changed (221) hide show
  1. package/dist/advanced/playground/playground.js.map +1 -1
  2. package/dist/advanced/static/generateDirectoryListing.d.ts +1 -1
  3. package/dist/advanced/static/generateDirectoryListing.d.ts.map +1 -1
  4. package/dist/advanced/static/generateDirectoryListing.js +12 -6
  5. package/dist/advanced/static/generateDirectoryListing.js.map +1 -1
  6. package/dist/advanced/static/index.d.ts +2 -0
  7. package/dist/advanced/static/index.d.ts.map +1 -1
  8. package/dist/advanced/static/index.js +4 -1
  9. package/dist/advanced/static/index.js.map +1 -1
  10. package/dist/advanced/static/serveStatic.d.ts.map +1 -1
  11. package/dist/advanced/static/serveStatic.js +7 -1
  12. package/dist/advanced/static/serveStatic.js.map +1 -1
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +3 -1
  16. package/dist/index.js.map +1 -1
  17. package/package.json +1 -1
  18. package/BENCHMARK_REPORT.md +0 -343
  19. package/documentation/01-getting-started.md +0 -240
  20. package/documentation/02-context.md +0 -335
  21. package/documentation/03-routing.md +0 -397
  22. package/documentation/04-middleware.md +0 -483
  23. package/documentation/05-validation.md +0 -514
  24. package/documentation/06-error-handling.md +0 -465
  25. package/documentation/07-performance.md +0 -364
  26. package/documentation/08-adapters.md +0 -470
  27. package/documentation/09-api-reference.md +0 -548
  28. package/documentation/10-examples.md +0 -582
  29. package/documentation/11-deployment.md +0 -477
  30. package/documentation/12-sentry.md +0 -620
  31. package/documentation/13-sentry-data-storage.md +0 -996
  32. package/documentation/14-sentry-data-reference.md +0 -457
  33. package/documentation/15-sentry-summary.md +0 -409
  34. package/documentation/16-alerts-system.md +0 -745
  35. package/documentation/17-alert-adapters.md +0 -696
  36. package/documentation/18-alerts-implementation-summary.md +0 -385
  37. package/documentation/19-class-based-routing.md +0 -840
  38. package/documentation/20-websocket-realtime.md +0 -813
  39. package/documentation/21-cache-system.md +0 -510
  40. package/documentation/22-job-queue.md +0 -772
  41. package/documentation/23-sentry-plugin.md +0 -551
  42. package/documentation/24-testing-utilities.md +0 -1287
  43. package/documentation/25-api-versioning.md +0 -533
  44. package/documentation/26-context-store.md +0 -607
  45. package/documentation/27-dependency-injection.md +0 -329
  46. package/documentation/28-lifecycle-hooks.md +0 -521
  47. package/documentation/29-package-structure.md +0 -196
  48. package/documentation/30-plugin-system.md +0 -414
  49. package/documentation/31-jwt-authentication.md +0 -597
  50. package/documentation/32-cli.md +0 -268
  51. package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
  52. package/documentation/ALERTS-INDEX.md +0 -330
  53. package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
  54. package/documentation/README.md +0 -178
  55. package/documentation/index.html +0 -34
  56. package/modern_framework_paper.md +0 -1870
  57. package/public/css/style.css +0 -87
  58. package/public/index.html +0 -34
  59. package/public/js/app.js +0 -27
  60. package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
  61. package/src/advanced/cache/MultiTierCache.ts +0 -194
  62. package/src/advanced/cache/RedisCacheStore.ts +0 -341
  63. package/src/advanced/cache/index.ts +0 -5
  64. package/src/advanced/cache/types.ts +0 -40
  65. package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
  66. package/src/advanced/graphql/index.ts +0 -22
  67. package/src/advanced/graphql/server.ts +0 -252
  68. package/src/advanced/graphql/types.ts +0 -42
  69. package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
  70. package/src/advanced/jobs/JobQueue.ts +0 -556
  71. package/src/advanced/jobs/RedisQueueStore.ts +0 -367
  72. package/src/advanced/jobs/index.ts +0 -5
  73. package/src/advanced/jobs/types.ts +0 -70
  74. package/src/advanced/observability/APMManager.ts +0 -163
  75. package/src/advanced/observability/AlertManager.ts +0 -109
  76. package/src/advanced/observability/MetricRegistry.ts +0 -151
  77. package/src/advanced/observability/ObservabilityCenter.ts +0 -304
  78. package/src/advanced/observability/StructuredLogger.ts +0 -154
  79. package/src/advanced/observability/TracingManager.ts +0 -117
  80. package/src/advanced/observability/adapters.ts +0 -304
  81. package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
  82. package/src/advanced/observability/index.ts +0 -11
  83. package/src/advanced/observability/types.ts +0 -174
  84. package/src/advanced/playground/extractPathParams.ts +0 -6
  85. package/src/advanced/playground/generateFieldExample.ts +0 -31
  86. package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1956
  87. package/src/advanced/playground/generateSummary.ts +0 -19
  88. package/src/advanced/playground/getTagFromPath.ts +0 -9
  89. package/src/advanced/playground/index.ts +0 -8
  90. package/src/advanced/playground/playground.ts +0 -250
  91. package/src/advanced/playground/types.ts +0 -49
  92. package/src/advanced/playground/zodToExample.ts +0 -16
  93. package/src/advanced/playground/zodToParams.ts +0 -15
  94. package/src/advanced/postman/buildAuth.ts +0 -31
  95. package/src/advanced/postman/buildBody.ts +0 -15
  96. package/src/advanced/postman/buildQueryParams.ts +0 -27
  97. package/src/advanced/postman/buildRequestItem.ts +0 -36
  98. package/src/advanced/postman/buildResponses.ts +0 -11
  99. package/src/advanced/postman/buildUrl.ts +0 -33
  100. package/src/advanced/postman/capitalize.ts +0 -4
  101. package/src/advanced/postman/generateCollection.ts +0 -59
  102. package/src/advanced/postman/generateEnvironment.ts +0 -34
  103. package/src/advanced/postman/generateExampleFromZod.ts +0 -21
  104. package/src/advanced/postman/generateFieldExample.ts +0 -45
  105. package/src/advanced/postman/generateName.ts +0 -20
  106. package/src/advanced/postman/generateUUID.ts +0 -11
  107. package/src/advanced/postman/getTagFromPath.ts +0 -10
  108. package/src/advanced/postman/index.ts +0 -28
  109. package/src/advanced/postman/postman.ts +0 -156
  110. package/src/advanced/postman/slugify.ts +0 -7
  111. package/src/advanced/postman/types.ts +0 -140
  112. package/src/advanced/realtime/index.ts +0 -18
  113. package/src/advanced/realtime/websocket.ts +0 -231
  114. package/src/advanced/sentry/index.ts +0 -1236
  115. package/src/advanced/sentry/types.ts +0 -355
  116. package/src/advanced/static/generateDirectoryListing.ts +0 -47
  117. package/src/advanced/static/generateETag.ts +0 -7
  118. package/src/advanced/static/getMimeType.ts +0 -9
  119. package/src/advanced/static/index.ts +0 -32
  120. package/src/advanced/static/isSafePath.ts +0 -13
  121. package/src/advanced/static/publicDir.ts +0 -21
  122. package/src/advanced/static/serveStatic.ts +0 -225
  123. package/src/advanced/static/spa.ts +0 -24
  124. package/src/advanced/static/types.ts +0 -159
  125. package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
  126. package/src/advanced/swagger/buildOperation.ts +0 -61
  127. package/src/advanced/swagger/buildParameters.ts +0 -61
  128. package/src/advanced/swagger/buildRequestBody.ts +0 -21
  129. package/src/advanced/swagger/buildResponses.ts +0 -54
  130. package/src/advanced/swagger/capitalize.ts +0 -5
  131. package/src/advanced/swagger/convertPath.ts +0 -9
  132. package/src/advanced/swagger/createSwagger.ts +0 -12
  133. package/src/advanced/swagger/generateOperationId.ts +0 -21
  134. package/src/advanced/swagger/generateSpec.ts +0 -105
  135. package/src/advanced/swagger/generateSummary.ts +0 -24
  136. package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
  137. package/src/advanced/swagger/generateThemeCss.ts +0 -53
  138. package/src/advanced/swagger/index.ts +0 -25
  139. package/src/advanced/swagger/swagger.ts +0 -237
  140. package/src/advanced/swagger/types.ts +0 -206
  141. package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
  142. package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
  143. package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
  144. package/src/advanced/testing/factory.ts +0 -509
  145. package/src/advanced/testing/harness.ts +0 -612
  146. package/src/advanced/testing/index.ts +0 -430
  147. package/src/advanced/testing/load-test.ts +0 -618
  148. package/src/advanced/testing/mock-server.ts +0 -498
  149. package/src/advanced/testing/mock.ts +0 -670
  150. package/src/cli/bin.ts +0 -9
  151. package/src/cli/cli.ts +0 -158
  152. package/src/cli/commands/add.ts +0 -178
  153. package/src/cli/commands/build.ts +0 -73
  154. package/src/cli/commands/create.ts +0 -166
  155. package/src/cli/commands/dev.ts +0 -85
  156. package/src/cli/commands/generate.ts +0 -99
  157. package/src/cli/commands/help.ts +0 -95
  158. package/src/cli/commands/init.ts +0 -91
  159. package/src/cli/commands/version.ts +0 -38
  160. package/src/cli/index.ts +0 -6
  161. package/src/cli/templates/generators.ts +0 -359
  162. package/src/cli/templates/index.ts +0 -680
  163. package/src/cli/utils/exec.ts +0 -52
  164. package/src/cli/utils/file-system.ts +0 -78
  165. package/src/cli/utils/logger.ts +0 -111
  166. package/src/core/adapter.ts +0 -88
  167. package/src/core/application.ts +0 -1453
  168. package/src/core/context-pool.ts +0 -79
  169. package/src/core/context.ts +0 -856
  170. package/src/core/index.ts +0 -94
  171. package/src/core/middleware.ts +0 -272
  172. package/src/core/performance/buffer-pool.ts +0 -108
  173. package/src/core/performance/middleware-optimizer.ts +0 -162
  174. package/src/core/plugin/PluginManager.ts +0 -435
  175. package/src/core/plugin/builder.ts +0 -358
  176. package/src/core/plugin/index.ts +0 -50
  177. package/src/core/plugin/types.ts +0 -214
  178. package/src/core/router/file-router.ts +0 -623
  179. package/src/core/router/index.ts +0 -260
  180. package/src/core/router/radix-tree.ts +0 -242
  181. package/src/core/serializer.ts +0 -397
  182. package/src/core/store/index.ts +0 -30
  183. package/src/core/store/registry.ts +0 -178
  184. package/src/core/store/request-store.ts +0 -240
  185. package/src/core/store/types.ts +0 -233
  186. package/src/core/types.ts +0 -616
  187. package/src/database/adapter.ts +0 -35
  188. package/src/database/adapters/index.ts +0 -1
  189. package/src/database/adapters/mysql.ts +0 -669
  190. package/src/database/database.ts +0 -70
  191. package/src/database/dialect.ts +0 -388
  192. package/src/database/index.ts +0 -12
  193. package/src/database/migrations.ts +0 -86
  194. package/src/database/optimizer.ts +0 -125
  195. package/src/database/query-builder.ts +0 -404
  196. package/src/database/realtime.ts +0 -53
  197. package/src/database/schema.ts +0 -71
  198. package/src/database/transactions.ts +0 -56
  199. package/src/database/types.ts +0 -87
  200. package/src/deployment/cluster.ts +0 -471
  201. package/src/deployment/config.ts +0 -454
  202. package/src/deployment/docker.ts +0 -599
  203. package/src/deployment/graceful-shutdown.ts +0 -373
  204. package/src/deployment/index.ts +0 -56
  205. package/src/index.ts +0 -281
  206. package/src/security/adapter.ts +0 -318
  207. package/src/security/auth/JWTPlugin.ts +0 -234
  208. package/src/security/auth/JWTProvider.ts +0 -316
  209. package/src/security/auth/adapter.ts +0 -12
  210. package/src/security/auth/jwt.ts +0 -234
  211. package/src/security/auth/middleware.ts +0 -188
  212. package/src/security/csrf.ts +0 -220
  213. package/src/security/headers.ts +0 -108
  214. package/src/security/index.ts +0 -60
  215. package/src/security/rate-limit/adapter.ts +0 -7
  216. package/src/security/rate-limit/memory.ts +0 -108
  217. package/src/security/rate-limit/middleware.ts +0 -181
  218. package/src/security/sanitization.ts +0 -75
  219. package/src/security/types.ts +0 -240
  220. package/src/security/utils.ts +0 -52
  221. 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
-