pms_md 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +93 -0
  2. package/node-monitor/ARCHITECTURE.md +341 -0
  3. package/node-monitor/CHANGELOG.md +105 -0
  4. package/node-monitor/CONTRIBUTING.md +96 -0
  5. package/node-monitor/DESIGN_IMPROVEMENTS.md +286 -0
  6. package/node-monitor/FILTER_BUTTONS_FIX.md +303 -0
  7. package/node-monitor/GETTING_STARTED.md +416 -0
  8. package/node-monitor/INSTALLATION.md +470 -0
  9. package/node-monitor/LICENSE +22 -0
  10. package/node-monitor/PUBLISHING_GUIDE.md +331 -0
  11. package/node-monitor/QUICK_REFERENCE.md +252 -0
  12. package/node-monitor/README.md +458 -0
  13. package/node-monitor/READY_TO_PUBLISH.md +272 -0
  14. package/node-monitor/SETUP_GUIDE.md +479 -0
  15. package/node-monitor/examples/EMAIL_SETUP_GUIDE.md +282 -0
  16. package/node-monitor/examples/ERROR_LOGGING_GUIDE.md +405 -0
  17. package/node-monitor/examples/GET_APP_PASSWORD.md +145 -0
  18. package/node-monitor/examples/LOG_FILES_REFERENCE.md +336 -0
  19. package/node-monitor/examples/QUICK_START_EMAIL.md +126 -0
  20. package/node-monitor/examples/express-app.js +499 -0
  21. package/node-monitor/examples/package-lock.json +1295 -0
  22. package/node-monitor/examples/package.json +18 -0
  23. package/node-monitor/examples/public/css/style.css +718 -0
  24. package/node-monitor/examples/public/js/dashboard.js +207 -0
  25. package/node-monitor/examples/public/js/health.js +114 -0
  26. package/node-monitor/examples/public/js/main.js +89 -0
  27. package/node-monitor/examples/public/js/metrics.js +225 -0
  28. package/node-monitor/examples/public/js/theme.js +138 -0
  29. package/node-monitor/examples/views/dashboard.ejs +20 -0
  30. package/node-monitor/examples/views/error-logs.ejs +1129 -0
  31. package/node-monitor/examples/views/health.ejs +21 -0
  32. package/node-monitor/examples/views/home.ejs +341 -0
  33. package/node-monitor/examples/views/layout.ejs +50 -0
  34. package/node-monitor/examples/views/metrics.ejs +16 -0
  35. package/node-monitor/examples/views/partials/footer.ejs +16 -0
  36. package/node-monitor/examples/views/partials/header.ejs +35 -0
  37. package/node-monitor/examples/views/partials/nav.ejs +23 -0
  38. package/node-monitor/examples/views/status.ejs +390 -0
  39. package/node-monitor/package-lock.json +4300 -0
  40. package/node-monitor/package.json +76 -0
  41. package/node-monitor/pre-publish-check.js +200 -0
  42. package/node-monitor/src/config/monitoringConfig.js +255 -0
  43. package/node-monitor/src/index.js +300 -0
  44. package/node-monitor/src/logger/errorLogger.js +297 -0
  45. package/node-monitor/src/monitors/apiErrorMonitor.js +156 -0
  46. package/node-monitor/src/monitors/dbConnectionMonitor.js +389 -0
  47. package/node-monitor/src/monitors/serverHealthMonitor.js +320 -0
  48. package/node-monitor/src/monitors/systemResourceMonitor.js +357 -0
  49. package/node-monitor/src/notifiers/emailNotifier.js +248 -0
  50. package/node-monitor/src/notifiers/notificationManager.js +96 -0
  51. package/node-monitor/src/notifiers/slackNotifier.js +209 -0
  52. package/node-monitor/src/views/dashboard.html +530 -0
  53. package/node-monitor/src/views/health.html +399 -0
  54. package/node-monitor/src/views/metrics.html +406 -0
  55. package/package.json +22 -0
@@ -0,0 +1,390 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title><%= title %> - Node Monitor</title>
7
+ <link rel="stylesheet" href="/css/style.css">
8
+ <script src="/js/theme.js"></script>
9
+ <style>
10
+ .status-page {
11
+ max-width: 1200px;
12
+ margin: 0 auto;
13
+ padding: 20px;
14
+ }
15
+
16
+ .status-section {
17
+ background: var(--card-bg);
18
+ border-radius: 12px;
19
+ padding: 25px;
20
+ margin-bottom: 20px;
21
+ box-shadow: 0 2px 8px var(--card-shadow);
22
+ transition: background 0.3s ease;
23
+ }
24
+
25
+ .status-section h2 {
26
+ margin: 0 0 20px 0;
27
+ color: var(--text-primary);
28
+ font-size: 1.5em;
29
+ display: flex;
30
+ align-items: center;
31
+ gap: 10px;
32
+ }
33
+
34
+ .status-grid {
35
+ display: grid;
36
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
37
+ gap: 15px;
38
+ }
39
+
40
+ .status-item {
41
+ padding: 15px;
42
+ background: var(--nav-bg);
43
+ border-radius: 8px;
44
+ border-left: 4px solid #3b82f6;
45
+ transition: background 0.3s ease;
46
+ }
47
+
48
+ .status-item.success {
49
+ border-left-color: #10b981;
50
+ }
51
+
52
+ .status-item.warning {
53
+ border-left-color: #f59e0b;
54
+ }
55
+
56
+ .status-item.error {
57
+ border-left-color: #ef4444;
58
+ }
59
+
60
+ .status-label {
61
+ font-size: 0.875em;
62
+ color: var(--text-secondary);
63
+ margin-bottom: 5px;
64
+ font-weight: 600;
65
+ text-transform: uppercase;
66
+ letter-spacing: 0.5px;
67
+ }
68
+
69
+ .status-value {
70
+ font-size: 1.5em;
71
+ font-weight: bold;
72
+ color: var(--text-primary);
73
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
74
+ }
75
+
76
+ .json-viewer {
77
+ background: #1f2937;
78
+ color: #e5e7eb;
79
+ padding: 20px;
80
+ border-radius: 8px;
81
+ overflow-x: auto;
82
+ font-family: 'Courier New', monospace;
83
+ font-size: 0.9em;
84
+ line-height: 1.6;
85
+ max-height: 600px;
86
+ overflow-y: auto;
87
+ }
88
+
89
+ .json-key {
90
+ color: #60a5fa;
91
+ }
92
+
93
+ .json-string {
94
+ color: #34d399;
95
+ }
96
+
97
+ .json-number {
98
+ color: #fbbf24;
99
+ }
100
+
101
+ .json-boolean {
102
+ color: #f472b6;
103
+ }
104
+
105
+ .json-null {
106
+ color: #9ca3af;
107
+ }
108
+
109
+ .copy-button {
110
+ background: #3b82f6;
111
+ color: white;
112
+ border: none;
113
+ padding: 10px 20px;
114
+ border-radius: 6px;
115
+ cursor: pointer;
116
+ font-size: 0.9em;
117
+ margin-bottom: 10px;
118
+ transition: background 0.2s;
119
+ }
120
+
121
+ .copy-button:hover {
122
+ background: #2563eb;
123
+ }
124
+
125
+ .copy-button.copied {
126
+ background: #10b981;
127
+ }
128
+
129
+ .badge {
130
+ display: inline-block;
131
+ padding: 4px 12px;
132
+ border-radius: 12px;
133
+ font-size: 0.875em;
134
+ font-weight: 600;
135
+ }
136
+
137
+ .badge.healthy {
138
+ background: #d1fae5;
139
+ color: #065f46;
140
+ }
141
+
142
+ .badge.unhealthy {
143
+ background: #fee2e2;
144
+ color: #991b1b;
145
+ }
146
+
147
+ .progress-bar {
148
+ width: 100%;
149
+ height: 8px;
150
+ background: #e5e7eb;
151
+ border-radius: 4px;
152
+ overflow: hidden;
153
+ margin-top: 8px;
154
+ }
155
+
156
+ .progress-fill {
157
+ height: 100%;
158
+ background: #3b82f6;
159
+ transition: width 0.3s ease;
160
+ }
161
+
162
+ .progress-fill.success {
163
+ background: #10b981;
164
+ }
165
+
166
+ .progress-fill.warning {
167
+ background: #f59e0b;
168
+ }
169
+
170
+ .progress-fill.danger {
171
+ background: #ef4444;
172
+ }
173
+ </style>
174
+ </head>
175
+ <body>
176
+ <%- include('partials/nav') %>
177
+
178
+ <div class="status-page">
179
+ <!-- Application Status -->
180
+ <div class="status-section">
181
+ <h2>🚀 Application Status</h2>
182
+ <div class="status-grid">
183
+ <div class="status-item success">
184
+ <div class="status-label">Running</div>
185
+ <div class="status-value" id="isRunning">-</div>
186
+ </div>
187
+ <div class="status-item" id="healthItem">
188
+ <div class="status-label">Health Status</div>
189
+ <div class="status-value" id="healthStatus">-</div>
190
+ </div>
191
+ <div class="status-item">
192
+ <div class="status-label">Uptime</div>
193
+ <div class="status-value" id="uptime">-</div>
194
+ </div>
195
+ <div class="status-item">
196
+ <div class="status-label">Environment</div>
197
+ <div class="status-value" id="environment">-</div>
198
+ </div>
199
+ </div>
200
+ </div>
201
+
202
+ <!-- System Resources -->
203
+ <div class="status-section">
204
+ <h2>💻 System Resources</h2>
205
+ <div class="status-grid">
206
+ <div class="status-item">
207
+ <div class="status-label">CPU Usage (System)</div>
208
+ <div class="status-value" id="cpuSystem">-</div>
209
+ <div class="progress-bar">
210
+ <div class="progress-fill" id="cpuSystemBar" style="width: 0%"></div>
211
+ </div>
212
+ </div>
213
+ <div class="status-item">
214
+ <div class="status-label">CPU Cores</div>
215
+ <div class="status-value" id="cpuCores">-</div>
216
+ </div>
217
+ <div class="status-item">
218
+ <div class="status-label">Memory Usage (System)</div>
219
+ <div class="status-value" id="memorySystem">-</div>
220
+ <div class="progress-bar">
221
+ <div class="progress-fill" id="memorySystemBar" style="width: 0%"></div>
222
+ </div>
223
+ </div>
224
+ <div class="status-item">
225
+ <div class="status-label">Process Memory</div>
226
+ <div class="status-value" id="processMemory">-</div>
227
+ </div>
228
+ </div>
229
+ </div>
230
+
231
+ <!-- Health Checks -->
232
+ <div class="status-section">
233
+ <h2>💚 Health Checks</h2>
234
+ <div class="status-grid">
235
+ <div class="status-item">
236
+ <div class="status-label">Registered Checks</div>
237
+ <div class="status-value" id="registeredChecks">-</div>
238
+ </div>
239
+ <div class="status-item">
240
+ <div class="status-label">Consecutive Failures</div>
241
+ <div class="status-value" id="consecutiveFailures">-</div>
242
+ </div>
243
+ </div>
244
+ </div>
245
+
246
+ <!-- Error Tracking -->
247
+ <div class="status-section">
248
+ <h2>⚠️ Error Tracking</h2>
249
+ <div class="status-grid">
250
+ <div class="status-item">
251
+ <div class="status-label">Current Error Rate</div>
252
+ <div class="status-value" id="errorRate">-</div>
253
+ </div>
254
+ <div class="status-item">
255
+ <div class="status-label">Threshold</div>
256
+ <div class="status-value" id="errorThreshold">-</div>
257
+ </div>
258
+ <div class="status-item">
259
+ <div class="status-label">API Error Rate</div>
260
+ <div class="status-value" id="apiErrorRate">-</div>
261
+ </div>
262
+ </div>
263
+ </div>
264
+
265
+ <!-- Raw JSON Data -->
266
+ <div class="status-section">
267
+ <h2>📋 Raw JSON Data</h2>
268
+ <button class="copy-button" onclick="copyJson()">📋 Copy JSON</button>
269
+ <pre class="json-viewer" id="jsonViewer"></pre>
270
+ </div>
271
+ </div>
272
+
273
+ <script>
274
+ let rawData = null;
275
+
276
+ async function loadStatus() {
277
+ try {
278
+ const response = await fetch('/monitor/status?format=json');
279
+ rawData = await response.json();
280
+ updateUI(rawData);
281
+ } catch (error) {
282
+ console.error('Failed to load status:', error);
283
+ }
284
+ }
285
+
286
+ function updateUI(data) {
287
+ // Application Status
288
+ document.getElementById('isRunning').textContent = data.isRunning ? '✅ Yes' : '❌ No';
289
+
290
+ const healthItem = document.getElementById('healthItem');
291
+ const healthStatus = document.getElementById('healthStatus');
292
+ if (data.health?.isHealthy) {
293
+ healthStatus.innerHTML = '<span class="badge healthy">✅ Healthy</span>';
294
+ healthItem.classList.add('success');
295
+ } else {
296
+ healthStatus.innerHTML = '<span class="badge unhealthy">❌ Unhealthy</span>';
297
+ healthItem.classList.add('error');
298
+ }
299
+
300
+ document.getElementById('uptime').textContent = data.health?.uptimeFormatted || '-';
301
+ document.getElementById('environment').textContent = data.environment || 'development';
302
+
303
+ // System Resources
304
+ const cpuSystem = data.system?.cpu?.system || 0;
305
+ document.getElementById('cpuSystem').textContent = cpuSystem.toFixed(1) + '%';
306
+ const cpuBar = document.getElementById('cpuSystemBar');
307
+ cpuBar.style.width = cpuSystem + '%';
308
+ cpuBar.className = 'progress-fill ' + getPercentClass(cpuSystem);
309
+
310
+ document.getElementById('cpuCores').textContent = data.system?.cpu?.cores || '-';
311
+
312
+ const memoryPercent = data.system?.memory?.system?.usagePercent || 0;
313
+ document.getElementById('memorySystem').textContent = memoryPercent.toFixed(1) + '%';
314
+ const memoryBar = document.getElementById('memorySystemBar');
315
+ memoryBar.style.width = memoryPercent + '%';
316
+ memoryBar.className = 'progress-fill ' + getPercentClass(memoryPercent);
317
+
318
+ document.getElementById('processMemory').textContent = data.system?.memory?.process?.rss || '-';
319
+
320
+ // Health Checks
321
+ document.getElementById('registeredChecks').textContent = data.health?.registeredChecks || 0;
322
+ document.getElementById('consecutiveFailures').textContent = data.health?.consecutiveFailures || 0;
323
+
324
+ // Error Tracking
325
+ document.getElementById('errorRate').textContent = (data.errors?.currentErrorRate || 0) + '/min';
326
+ document.getElementById('errorThreshold').textContent = (data.errors?.threshold || 0) + '/min';
327
+ document.getElementById('apiErrorRate').textContent = (data.errors?.apiErrorRate || 0) + '/min';
328
+
329
+ // Raw JSON
330
+ document.getElementById('jsonViewer').innerHTML = syntaxHighlight(JSON.stringify(data, null, 2));
331
+ }
332
+
333
+ function getPercentClass(percent) {
334
+ if (percent < 50) return 'success';
335
+ if (percent < 80) return 'warning';
336
+ return 'danger';
337
+ }
338
+
339
+ function syntaxHighlight(json) {
340
+ json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
341
+ return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
342
+ let cls = 'json-number';
343
+ if (/^"/.test(match)) {
344
+ if (/:$/.test(match)) {
345
+ cls = 'json-key';
346
+ } else {
347
+ cls = 'json-string';
348
+ }
349
+ } else if (/true|false/.test(match)) {
350
+ cls = 'json-boolean';
351
+ } else if (/null/.test(match)) {
352
+ cls = 'json-null';
353
+ }
354
+ return '<span class="' + cls + '">' + match + '</span>';
355
+ });
356
+ }
357
+
358
+ function copyJson() {
359
+ const jsonText = JSON.stringify(rawData, null, 2);
360
+ navigator.clipboard.writeText(jsonText).then(() => {
361
+ const button = document.querySelector('.copy-button');
362
+ button.textContent = '✅ Copied!';
363
+ button.classList.add('copied');
364
+ setTimeout(() => {
365
+ button.textContent = '📋 Copy JSON';
366
+ button.classList.remove('copied');
367
+ }, 2000);
368
+ });
369
+ }
370
+
371
+ // Load status on page load
372
+ loadStatus();
373
+
374
+ // Auto-refresh every 5 seconds
375
+ setInterval(loadStatus, 5000);
376
+ </script>
377
+
378
+ </div> <!-- Close mainContent -->
379
+ </div> <!-- Close container -->
380
+
381
+ <!-- Footer -->
382
+ <div class="footer">
383
+ <p>Node Monitor v1.0.0 | Built with ❤️ By Manish Desai</p>
384
+ <p class="timestamp" id="lastUpdate"></p>
385
+ </div>
386
+
387
+ <script src="/js/main.js"></script>
388
+ </body>
389
+ </html>
390
+