@uptime.link/statuspage 1.0.73 → 1.1.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.
- package/dist_bundle/bundle.js +4096 -504
- package/dist_bundle/bundle.js.map +4 -4
- package/dist_ts_web/00_commitinfo_data.js +2 -2
- package/dist_ts_web/elements/index.d.ts +3 -0
- package/dist_ts_web/elements/index.js +6 -1
- package/dist_ts_web/elements/internal/uplinternal-miniheading.d.ts +1 -0
- package/dist_ts_web/elements/internal/uplinternal-miniheading.js +78 -28
- package/dist_ts_web/elements/upl-statuspage-assetsselector.d.ts +14 -0
- package/dist_ts_web/elements/upl-statuspage-assetsselector.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-assetsselector.demo.js +575 -0
- package/dist_ts_web/elements/upl-statuspage-assetsselector.js +605 -43
- package/dist_ts_web/elements/upl-statuspage-footer.d.ts +46 -2
- package/dist_ts_web/elements/upl-statuspage-footer.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-footer.demo.js +679 -0
- package/dist_ts_web/elements/upl-statuspage-footer.js +792 -61
- package/dist_ts_web/elements/upl-statuspage-header.d.ts +5 -1
- package/dist_ts_web/elements/upl-statuspage-header.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-header.demo.js +220 -0
- package/dist_ts_web/elements/upl-statuspage-header.js +313 -86
- package/dist_ts_web/elements/upl-statuspage-incidents.d.ts +22 -4
- package/dist_ts_web/elements/upl-statuspage-incidents.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-incidents.demo.js +1147 -0
- package/dist_ts_web/elements/upl-statuspage-incidents.js +750 -74
- package/dist_ts_web/elements/upl-statuspage-pagetitle.d.ts +15 -0
- package/dist_ts_web/elements/upl-statuspage-pagetitle.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-pagetitle.demo.js +25 -0
- package/dist_ts_web/elements/upl-statuspage-pagetitle.js +148 -0
- package/dist_ts_web/elements/upl-statuspage-statsgrid.d.ts +23 -0
- package/dist_ts_web/elements/upl-statuspage-statsgrid.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-statsgrid.demo.js +295 -0
- package/dist_ts_web/elements/upl-statuspage-statsgrid.js +374 -0
- package/dist_ts_web/elements/upl-statuspage-statusbar.d.ts +4 -0
- package/dist_ts_web/elements/upl-statuspage-statusbar.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-statusbar.demo.js +365 -0
- package/dist_ts_web/elements/upl-statuspage-statusbar.js +357 -44
- package/dist_ts_web/elements/upl-statuspage-statusdetails.d.ts +14 -0
- package/dist_ts_web/elements/upl-statuspage-statusdetails.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-statusdetails.demo.js +706 -0
- package/dist_ts_web/elements/upl-statuspage-statusdetails.js +373 -63
- package/dist_ts_web/elements/upl-statuspage-statusmonth.d.ts +15 -0
- package/dist_ts_web/elements/upl-statuspage-statusmonth.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-statusmonth.demo.js +798 -0
- package/dist_ts_web/elements/upl-statuspage-statusmonth.js +474 -100
- package/dist_ts_web/interfaces/index.d.ts +84 -0
- package/dist_ts_web/interfaces/index.js +4 -0
- package/dist_ts_web/pages/index.d.ts +4 -1
- package/dist_ts_web/pages/index.js +5 -2
- package/dist_ts_web/pages/statuspage-allgreen.d.ts +1 -0
- package/dist_ts_web/pages/statuspage-allgreen.js +386 -0
- package/dist_ts_web/pages/statuspage-demo.d.ts +1 -0
- package/dist_ts_web/pages/statuspage-demo.js +616 -0
- package/dist_ts_web/pages/statuspage-maintenance.d.ts +1 -0
- package/dist_ts_web/pages/statuspage-maintenance.js +544 -0
- package/dist_ts_web/pages/statuspage-outage.d.ts +1 -0
- package/dist_ts_web/pages/statuspage-outage.js +543 -0
- package/dist_ts_web/styles/shared.styles.d.ts +80 -0
- package/dist_ts_web/styles/shared.styles.js +351 -0
- package/dist_watch/bundle.js +54534 -26433
- package/dist_watch/bundle.js.map +4 -4
- package/dist_watch/index.html +3 -10
- package/npmextra.json +9 -3
- package/package.json +19 -19
- package/readme.hints.md +292 -0
- package/readme.md +326 -149
- package/readme.plan.md +261 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/index.ts +6 -0
- package/ts_web/elements/internal/uplinternal-miniheading.ts +24 -17
- package/ts_web/elements/upl-statuspage-assetsselector.demo.ts +607 -0
- package/ts_web/elements/upl-statuspage-assetsselector.ts +526 -18
- package/ts_web/elements/upl-statuspage-footer.demo.ts +744 -0
- package/ts_web/elements/upl-statuspage-footer.ts +608 -30
- package/ts_web/elements/upl-statuspage-header.demo.ts +241 -0
- package/ts_web/elements/upl-statuspage-header.ts +220 -52
- package/ts_web/elements/upl-statuspage-incidents.demo.ts +1216 -0
- package/ts_web/elements/upl-statuspage-incidents.ts +649 -26
- package/ts_web/elements/upl-statuspage-pagetitle.demo.ts +25 -0
- package/ts_web/elements/upl-statuspage-pagetitle.ts +89 -0
- package/ts_web/elements/upl-statuspage-statsgrid.demo.ts +315 -0
- package/ts_web/elements/upl-statuspage-statsgrid.ts +306 -0
- package/ts_web/elements/upl-statuspage-statusbar.demo.ts +393 -0
- package/ts_web/elements/upl-statuspage-statusbar.ts +281 -20
- package/ts_web/elements/upl-statuspage-statusdetails.demo.ts +754 -0
- package/ts_web/elements/upl-statuspage-statusdetails.ts +297 -38
- package/ts_web/elements/upl-statuspage-statusmonth.demo.ts +876 -0
- package/ts_web/elements/upl-statuspage-statusmonth.ts +397 -76
- package/ts_web/interfaces/index.ts +95 -0
- package/ts_web/pages/index.ts +4 -1
- package/ts_web/pages/statuspage-allgreen.ts +412 -0
- package/ts_web/pages/statuspage-demo.ts +653 -0
- package/ts_web/pages/statuspage-maintenance.ts +570 -0
- package/ts_web/pages/statuspage-outage.ts +568 -0
- package/ts_web/styles/shared.styles.ts +367 -0
- package/dist_ts_web/pages/page1.d.ts +0 -1
- package/dist_ts_web/pages/page1.js +0 -11
- package/ts_web/pages/page1.ts +0 -11
|
@@ -0,0 +1,568 @@
|
|
|
1
|
+
import { html, cssManager } from "@design.estate/dees-element";
|
|
2
|
+
import type { IServiceStatus, IOverallStatus, IIncidentDetails, IStatusHistoryPoint, IMonthlyUptime } from '../interfaces/index.js';
|
|
3
|
+
|
|
4
|
+
export const statuspageOutage = () => html`
|
|
5
|
+
<style>
|
|
6
|
+
.demo-page-wrapper {
|
|
7
|
+
min-height: 100vh;
|
|
8
|
+
background: ${cssManager.bdTheme('#fafafa', '#0a0a0a')};
|
|
9
|
+
}
|
|
10
|
+
.demo-page-wrapper > dees-demowrapper {
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
gap: 24px;
|
|
14
|
+
}
|
|
15
|
+
</style>
|
|
16
|
+
|
|
17
|
+
<div class="demo-page-wrapper">
|
|
18
|
+
|
|
19
|
+
<dees-demowrapper
|
|
20
|
+
.runAfterRender=${async (wrapperElement: any) => {
|
|
21
|
+
const header = wrapperElement.querySelector('upl-statuspage-header') as any;
|
|
22
|
+
const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar') as any;
|
|
23
|
+
const statsGrid = wrapperElement.querySelector('upl-statuspage-statsgrid') as any;
|
|
24
|
+
const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector') as any;
|
|
25
|
+
const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails') as any;
|
|
26
|
+
const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth') as any;
|
|
27
|
+
const incidents = wrapperElement.querySelector('upl-statuspage-incidents') as any;
|
|
28
|
+
const footer = wrapperElement.querySelector('upl-statuspage-footer') as any;
|
|
29
|
+
|
|
30
|
+
// Configure Header
|
|
31
|
+
header.pageTitle = 'DataStream';
|
|
32
|
+
header.showReportButton = true;
|
|
33
|
+
header.showSubscribeButton = true;
|
|
34
|
+
header.logoUrl = 'https://via.placeholder.com/150x50/F44336/ffffff?text=DS';
|
|
35
|
+
|
|
36
|
+
// Configure Overall Status - Major Outage
|
|
37
|
+
statusBar.overallStatus = {
|
|
38
|
+
status: 'major_outage',
|
|
39
|
+
message: 'Major service disruption affecting multiple regions',
|
|
40
|
+
lastUpdated: Date.now(),
|
|
41
|
+
affectedServices: 8,
|
|
42
|
+
totalServices: 15
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Configure Services - Multiple Outages
|
|
46
|
+
const services: IServiceStatus[] = [
|
|
47
|
+
// Core Services - Major Outage
|
|
48
|
+
{
|
|
49
|
+
id: 'api-gateway',
|
|
50
|
+
name: 'api-gateway',
|
|
51
|
+
displayName: 'API Gateway',
|
|
52
|
+
description: 'Main API endpoint',
|
|
53
|
+
currentStatus: 'major_outage',
|
|
54
|
+
lastChecked: Date.now(),
|
|
55
|
+
uptime30d: 85.2,
|
|
56
|
+
uptime90d: 92.5,
|
|
57
|
+
responseTime: 2500,
|
|
58
|
+
category: 'Core Infrastructure',
|
|
59
|
+
selected: true
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'auth-service',
|
|
63
|
+
name: 'auth-service',
|
|
64
|
+
displayName: 'Authentication',
|
|
65
|
+
description: 'Login and authorization',
|
|
66
|
+
currentStatus: 'major_outage',
|
|
67
|
+
lastChecked: Date.now(),
|
|
68
|
+
uptime30d: 84.8,
|
|
69
|
+
uptime90d: 91.2,
|
|
70
|
+
responseTime: 3200,
|
|
71
|
+
category: 'Core Infrastructure',
|
|
72
|
+
selected: true
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: 'web-portal',
|
|
76
|
+
name: 'web-portal',
|
|
77
|
+
displayName: 'Web Portal',
|
|
78
|
+
description: 'Customer web interface',
|
|
79
|
+
currentStatus: 'partial_outage',
|
|
80
|
+
lastChecked: Date.now(),
|
|
81
|
+
uptime30d: 88.5,
|
|
82
|
+
uptime90d: 94.2,
|
|
83
|
+
responseTime: 1800,
|
|
84
|
+
category: 'Frontend',
|
|
85
|
+
selected: true
|
|
86
|
+
},
|
|
87
|
+
// Database Services - Critical
|
|
88
|
+
{
|
|
89
|
+
id: 'primary-db',
|
|
90
|
+
name: 'primary-db',
|
|
91
|
+
displayName: 'Primary Database',
|
|
92
|
+
description: 'Main data storage',
|
|
93
|
+
currentStatus: 'major_outage',
|
|
94
|
+
lastChecked: Date.now(),
|
|
95
|
+
uptime30d: 82.1,
|
|
96
|
+
uptime90d: 90.5,
|
|
97
|
+
responseTime: 5000,
|
|
98
|
+
category: 'Data Layer',
|
|
99
|
+
selected: true
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: 'replica-db',
|
|
103
|
+
name: 'replica-db',
|
|
104
|
+
displayName: 'Database Replicas',
|
|
105
|
+
description: 'Read replicas',
|
|
106
|
+
currentStatus: 'partial_outage',
|
|
107
|
+
lastChecked: Date.now(),
|
|
108
|
+
uptime30d: 86.7,
|
|
109
|
+
uptime90d: 93.1,
|
|
110
|
+
responseTime: 2200,
|
|
111
|
+
category: 'Data Layer',
|
|
112
|
+
selected: true
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
id: 'cache-layer',
|
|
116
|
+
name: 'cache-layer',
|
|
117
|
+
displayName: 'Cache Layer',
|
|
118
|
+
description: 'Redis cache',
|
|
119
|
+
currentStatus: 'degraded',
|
|
120
|
+
lastChecked: Date.now(),
|
|
121
|
+
uptime30d: 92.3,
|
|
122
|
+
uptime90d: 95.8,
|
|
123
|
+
responseTime: 450,
|
|
124
|
+
category: 'Data Layer',
|
|
125
|
+
selected: true
|
|
126
|
+
},
|
|
127
|
+
// Regional Services
|
|
128
|
+
{
|
|
129
|
+
id: 'us-east',
|
|
130
|
+
name: 'us-east',
|
|
131
|
+
displayName: 'US East Region',
|
|
132
|
+
description: 'Primary US datacenter',
|
|
133
|
+
currentStatus: 'major_outage',
|
|
134
|
+
lastChecked: Date.now(),
|
|
135
|
+
uptime30d: 81.5,
|
|
136
|
+
uptime90d: 89.2,
|
|
137
|
+
responseTime: 4500,
|
|
138
|
+
category: 'Regional',
|
|
139
|
+
selected: true
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
id: 'us-west',
|
|
143
|
+
name: 'us-west',
|
|
144
|
+
displayName: 'US West Region',
|
|
145
|
+
description: 'Secondary US datacenter',
|
|
146
|
+
currentStatus: 'degraded',
|
|
147
|
+
lastChecked: Date.now(),
|
|
148
|
+
uptime30d: 94.2,
|
|
149
|
+
uptime90d: 96.8,
|
|
150
|
+
responseTime: 180,
|
|
151
|
+
category: 'Regional',
|
|
152
|
+
selected: true
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
id: 'eu-central',
|
|
156
|
+
name: 'eu-central',
|
|
157
|
+
displayName: 'EU Central Region',
|
|
158
|
+
description: 'European datacenter',
|
|
159
|
+
currentStatus: 'major_outage',
|
|
160
|
+
lastChecked: Date.now(),
|
|
161
|
+
uptime30d: 83.7,
|
|
162
|
+
uptime90d: 91.2,
|
|
163
|
+
responseTime: 3800,
|
|
164
|
+
category: 'Regional',
|
|
165
|
+
selected: true
|
|
166
|
+
},
|
|
167
|
+
// Some operational services
|
|
168
|
+
{
|
|
169
|
+
id: 'status-page',
|
|
170
|
+
name: 'status-page',
|
|
171
|
+
displayName: 'Status Page',
|
|
172
|
+
description: 'This status page',
|
|
173
|
+
currentStatus: 'operational',
|
|
174
|
+
lastChecked: Date.now(),
|
|
175
|
+
uptime30d: 99.9,
|
|
176
|
+
uptime90d: 99.8,
|
|
177
|
+
responseTime: 45,
|
|
178
|
+
category: 'Support',
|
|
179
|
+
selected: false
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
id: 'support-portal',
|
|
183
|
+
name: 'support-portal',
|
|
184
|
+
displayName: 'Support Portal',
|
|
185
|
+
description: 'Customer support system',
|
|
186
|
+
currentStatus: 'operational',
|
|
187
|
+
lastChecked: Date.now(),
|
|
188
|
+
uptime30d: 98.5,
|
|
189
|
+
uptime90d: 99.1,
|
|
190
|
+
responseTime: 120,
|
|
191
|
+
category: 'Support',
|
|
192
|
+
selected: false
|
|
193
|
+
},
|
|
194
|
+
// Degraded services
|
|
195
|
+
{
|
|
196
|
+
id: 'email-service',
|
|
197
|
+
name: 'email-service',
|
|
198
|
+
displayName: 'Email Notifications',
|
|
199
|
+
description: 'Automated emails',
|
|
200
|
+
currentStatus: 'degraded',
|
|
201
|
+
lastChecked: Date.now(),
|
|
202
|
+
uptime30d: 91.2,
|
|
203
|
+
uptime90d: 94.5,
|
|
204
|
+
responseTime: 850,
|
|
205
|
+
category: 'Communication',
|
|
206
|
+
selected: true
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
id: 'analytics',
|
|
210
|
+
name: 'analytics',
|
|
211
|
+
displayName: 'Analytics Platform',
|
|
212
|
+
description: 'Usage analytics',
|
|
213
|
+
currentStatus: 'partial_outage',
|
|
214
|
+
lastChecked: Date.now(),
|
|
215
|
+
uptime30d: 87.3,
|
|
216
|
+
uptime90d: 92.8,
|
|
217
|
+
responseTime: 1200,
|
|
218
|
+
category: 'Services',
|
|
219
|
+
selected: false
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
id: 'backup-system',
|
|
223
|
+
name: 'backup-system',
|
|
224
|
+
displayName: 'Backup System',
|
|
225
|
+
description: 'Data backups',
|
|
226
|
+
currentStatus: 'degraded',
|
|
227
|
+
lastChecked: Date.now(),
|
|
228
|
+
uptime30d: 95.2,
|
|
229
|
+
uptime90d: 97.1,
|
|
230
|
+
responseTime: 320,
|
|
231
|
+
category: 'Services',
|
|
232
|
+
selected: false
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
id: 'monitoring',
|
|
236
|
+
name: 'monitoring',
|
|
237
|
+
displayName: 'Monitoring System',
|
|
238
|
+
description: 'Infrastructure monitoring',
|
|
239
|
+
currentStatus: 'operational',
|
|
240
|
+
lastChecked: Date.now(),
|
|
241
|
+
uptime30d: 98.7,
|
|
242
|
+
uptime90d: 99.2,
|
|
243
|
+
responseTime: 65,
|
|
244
|
+
category: 'Services',
|
|
245
|
+
selected: true
|
|
246
|
+
}
|
|
247
|
+
];
|
|
248
|
+
|
|
249
|
+
assetsSelector.services = services;
|
|
250
|
+
|
|
251
|
+
// Configure Stats Grid - Major outage metrics
|
|
252
|
+
const operationalCount = services.filter(s => s.currentStatus === 'operational').length;
|
|
253
|
+
const avgResponseTime = services.reduce((sum, s) => sum + (s.responseTime || 0), 0) / services.length;
|
|
254
|
+
const avgUptime = services.reduce((sum, s) => sum + (s.uptime30d || 0), 0) / services.length;
|
|
255
|
+
|
|
256
|
+
statsGrid.currentStatus = 'major_outage';
|
|
257
|
+
statsGrid.uptime = avgUptime;
|
|
258
|
+
statsGrid.avgResponseTime = Math.round(avgResponseTime);
|
|
259
|
+
statsGrid.totalIncidents = 15; // High number of incidents
|
|
260
|
+
statsGrid.affectedServices = services.filter(s => s.currentStatus !== 'operational').length;
|
|
261
|
+
statsGrid.totalServices = services.length;
|
|
262
|
+
statsGrid.timePeriod = '30 days';
|
|
263
|
+
|
|
264
|
+
// Configure Status Details - Showing the outage timeline
|
|
265
|
+
const generateStatusDetails = (): IStatusHistoryPoint[] => {
|
|
266
|
+
const details: IStatusHistoryPoint[] = [];
|
|
267
|
+
const now = new Date();
|
|
268
|
+
|
|
269
|
+
for (let i = 47; i >= 0; i--) {
|
|
270
|
+
const date = new Date(now);
|
|
271
|
+
date.setMinutes(0, 0, 0);
|
|
272
|
+
date.setHours(date.getHours() - i);
|
|
273
|
+
|
|
274
|
+
let status: 'operational' | 'degraded' | 'major_outage' = 'operational';
|
|
275
|
+
let value = 100;
|
|
276
|
+
let responseTime = 30;
|
|
277
|
+
|
|
278
|
+
// Outage started 8 hours ago
|
|
279
|
+
if (i <= 8) {
|
|
280
|
+
status = 'major_outage';
|
|
281
|
+
value = 15 + Math.random() * 20;
|
|
282
|
+
responseTime = 2000 + Math.random() * 3000;
|
|
283
|
+
} else if (i <= 12) {
|
|
284
|
+
// Degradation before the outage
|
|
285
|
+
status = 'degraded';
|
|
286
|
+
value = 70 + Math.random() * 20;
|
|
287
|
+
responseTime = 200 + Math.random() * 800;
|
|
288
|
+
} else if (i <= 24) {
|
|
289
|
+
// Some issues yesterday
|
|
290
|
+
if (Math.random() > 0.7) {
|
|
291
|
+
status = 'degraded';
|
|
292
|
+
value = 85 + Math.random() * 10;
|
|
293
|
+
responseTime = 100 + Math.random() * 200;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
details.push({
|
|
298
|
+
timestamp: date.getTime(),
|
|
299
|
+
status,
|
|
300
|
+
responseTime
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return details;
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
statusDetails.dataPoints = generateStatusDetails();
|
|
308
|
+
statusDetails.serviceId = 'primary-db';
|
|
309
|
+
statusDetails.serviceName = 'Primary Database';
|
|
310
|
+
|
|
311
|
+
// Configure Monthly Status - Poor performance
|
|
312
|
+
const generateMonthlyData = (): IMonthlyUptime[] => {
|
|
313
|
+
const months: IMonthlyUptime[] = [];
|
|
314
|
+
const now = new Date();
|
|
315
|
+
|
|
316
|
+
for (let m = 4; m >= 0; m--) {
|
|
317
|
+
const monthDate = new Date(now.getFullYear(), now.getMonth() - m, 1);
|
|
318
|
+
const daysInMonth = new Date(monthDate.getFullYear(), monthDate.getMonth() + 1, 0).getDate();
|
|
319
|
+
const monthKey = monthDate.toISOString().slice(0, 7);
|
|
320
|
+
|
|
321
|
+
const days = [];
|
|
322
|
+
let totalUptime = 0;
|
|
323
|
+
let incidents = 0;
|
|
324
|
+
|
|
325
|
+
for (let d = 1; d <= daysInMonth; d++) {
|
|
326
|
+
const dayDate = new Date(monthDate.getFullYear(), monthDate.getMonth(), d);
|
|
327
|
+
const isToday = dayDate.toDateString() === now.toDateString();
|
|
328
|
+
const isFuture = dayDate > now;
|
|
329
|
+
|
|
330
|
+
if (isFuture) continue;
|
|
331
|
+
|
|
332
|
+
let status: 'operational' | 'degraded' | 'partial_outage' | 'major_outage' = 'operational';
|
|
333
|
+
let uptime = 100;
|
|
334
|
+
let dayIncidents = 0;
|
|
335
|
+
|
|
336
|
+
// Today - major outage
|
|
337
|
+
if (isToday) {
|
|
338
|
+
status = 'major_outage';
|
|
339
|
+
uptime = 45;
|
|
340
|
+
dayIncidents = 3;
|
|
341
|
+
} else if (Math.random() > 0.7) {
|
|
342
|
+
// Frequent issues
|
|
343
|
+
if (Math.random() > 0.5) {
|
|
344
|
+
status = 'partial_outage';
|
|
345
|
+
uptime = 75 + Math.random() * 15;
|
|
346
|
+
dayIncidents = 2;
|
|
347
|
+
} else {
|
|
348
|
+
status = 'degraded';
|
|
349
|
+
uptime = 85 + Math.random() * 10;
|
|
350
|
+
dayIncidents = 1;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
days.push({
|
|
355
|
+
date: dayDate.toISOString().slice(0, 10),
|
|
356
|
+
status,
|
|
357
|
+
uptime,
|
|
358
|
+
incidents: dayIncidents,
|
|
359
|
+
totalDowntime: Math.round((100 - uptime) * 14.4)
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
totalUptime += uptime;
|
|
363
|
+
incidents += dayIncidents;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
months.push({
|
|
367
|
+
month: monthKey,
|
|
368
|
+
days,
|
|
369
|
+
overallUptime: totalUptime / days.length,
|
|
370
|
+
totalIncidents: incidents
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
return months;
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
statusMonth.monthlyData = generateMonthlyData();
|
|
378
|
+
statusMonth.serviceId = 'all-services';
|
|
379
|
+
statusMonth.serviceName = 'All Services';
|
|
380
|
+
|
|
381
|
+
// Configure Incidents - Multiple current incidents
|
|
382
|
+
const currentIncidents: IIncidentDetails[] = [
|
|
383
|
+
{
|
|
384
|
+
id: 'inc-2024-crit-001',
|
|
385
|
+
title: 'Complete Database Failure in Multiple Regions',
|
|
386
|
+
impact: 'Users unable to access any services. Complete system outage.',
|
|
387
|
+
severity: 'critical',
|
|
388
|
+
status: 'investigating',
|
|
389
|
+
startTime: Date.now() - 8 * 60 * 60 * 1000,
|
|
390
|
+
affectedServices: ['Primary Database', 'Database Replicas', 'API Gateway', 'Authentication', 'US East Region', 'EU Central Region'],
|
|
391
|
+
updates: [
|
|
392
|
+
{
|
|
393
|
+
id: 'update-1',
|
|
394
|
+
timestamp: Date.now() - 8 * 60 * 60 * 1000,
|
|
395
|
+
status: 'investigating',
|
|
396
|
+
message: 'Multiple alerts triggered. Complete service failure detected across regions.',
|
|
397
|
+
author: 'Automated Monitoring'
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
id: 'update-2',
|
|
401
|
+
timestamp: Date.now() - 7.5 * 60 * 60 * 1000,
|
|
402
|
+
status: 'investigating',
|
|
403
|
+
message: 'All hands on deck. Engineering teams mobilized. Initial investigation points to cascading database failure.',
|
|
404
|
+
author: 'Incident Commander'
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
id: 'update-3',
|
|
408
|
+
timestamp: Date.now() - 6 * 60 * 60 * 1000,
|
|
409
|
+
status: 'identified',
|
|
410
|
+
message: 'Root cause identified: Corrupted replication logs causing database cluster failures. Working on recovery.',
|
|
411
|
+
author: 'Database Team'
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
id: 'update-4',
|
|
415
|
+
timestamp: Date.now() - 4 * 60 * 60 * 1000,
|
|
416
|
+
status: 'monitoring',
|
|
417
|
+
message: 'Attempting to restore from backups. This is a complex operation and will take time.',
|
|
418
|
+
author: 'Infrastructure Team'
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
id: 'update-5',
|
|
422
|
+
timestamp: Date.now() - 2 * 60 * 60 * 1000,
|
|
423
|
+
status: 'monitoring',
|
|
424
|
+
message: 'Partial recovery in progress. Some read-only operations may become available soon.',
|
|
425
|
+
author: 'Database Team'
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
id: 'update-6',
|
|
429
|
+
timestamp: Date.now() - 30 * 60 * 1000,
|
|
430
|
+
status: 'monitoring',
|
|
431
|
+
message: 'Critical update: Recovery is taking longer than expected. We are exploring all options including failover to disaster recovery site.',
|
|
432
|
+
author: 'CTO'
|
|
433
|
+
}
|
|
434
|
+
]
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
id: 'inc-2024-maj-002',
|
|
438
|
+
title: 'API Gateway Overload',
|
|
439
|
+
impact: 'API requests failing or timing out',
|
|
440
|
+
severity: 'major',
|
|
441
|
+
status: 'monitoring',
|
|
442
|
+
startTime: Date.now() - 6 * 60 * 60 * 1000,
|
|
443
|
+
affectedServices: ['API Gateway', 'Web Portal'],
|
|
444
|
+
updates: [
|
|
445
|
+
{
|
|
446
|
+
id: 'update-7',
|
|
447
|
+
timestamp: Date.now() - 6 * 60 * 60 * 1000,
|
|
448
|
+
status: 'investigating',
|
|
449
|
+
message: 'API Gateway experiencing extreme load due to retry storms from database failures.',
|
|
450
|
+
author: 'API Team'
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
id: 'update-8',
|
|
454
|
+
timestamp: Date.now() - 5 * 60 * 60 * 1000,
|
|
455
|
+
status: 'identified',
|
|
456
|
+
message: 'Implementing rate limiting and circuit breakers to prevent cascade failures.',
|
|
457
|
+
author: 'API Team'
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
id: 'update-9',
|
|
461
|
+
timestamp: Date.now() - 3 * 60 * 60 * 1000,
|
|
462
|
+
status: 'monitoring',
|
|
463
|
+
message: 'Rate limiting in place. Load is stabilizing but service remains degraded.',
|
|
464
|
+
author: 'API Team'
|
|
465
|
+
}
|
|
466
|
+
]
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
id: 'inc-2024-maj-003',
|
|
470
|
+
title: 'Email Service Delays',
|
|
471
|
+
impact: 'Notification emails delayed by up to 2 hours',
|
|
472
|
+
severity: 'major',
|
|
473
|
+
status: 'monitoring',
|
|
474
|
+
startTime: Date.now() - 5 * 60 * 60 * 1000,
|
|
475
|
+
affectedServices: ['Email Notifications'],
|
|
476
|
+
updates: [
|
|
477
|
+
{
|
|
478
|
+
id: 'update-10',
|
|
479
|
+
timestamp: Date.now() - 5 * 60 * 60 * 1000,
|
|
480
|
+
status: 'investigating',
|
|
481
|
+
message: 'Email queue backing up due to system outages.',
|
|
482
|
+
author: 'Communications Team'
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
id: 'update-11',
|
|
486
|
+
timestamp: Date.now() - 3 * 60 * 60 * 1000,
|
|
487
|
+
status: 'monitoring',
|
|
488
|
+
message: 'Processing backlog slowly. Prioritizing critical notifications.',
|
|
489
|
+
author: 'Communications Team'
|
|
490
|
+
}
|
|
491
|
+
]
|
|
492
|
+
}
|
|
493
|
+
];
|
|
494
|
+
|
|
495
|
+
const pastIncidents: IIncidentDetails[] = [
|
|
496
|
+
{
|
|
497
|
+
id: 'inc-2024-prev-001',
|
|
498
|
+
title: 'Previous Major Outage',
|
|
499
|
+
impact: 'Services unavailable for 4 hours',
|
|
500
|
+
severity: 'critical',
|
|
501
|
+
status: 'resolved',
|
|
502
|
+
startTime: Date.now() - 30 * 24 * 60 * 60 * 1000,
|
|
503
|
+
endTime: Date.now() - 30 * 24 * 60 * 60 * 1000 + 4 * 60 * 60 * 1000,
|
|
504
|
+
affectedServices: ['All Services'],
|
|
505
|
+
rootCause: 'Power failure at primary datacenter with UPS failure.',
|
|
506
|
+
resolution: 'Power restored. UPS systems replaced and tested.',
|
|
507
|
+
updates: [
|
|
508
|
+
{
|
|
509
|
+
id: 'update-12',
|
|
510
|
+
timestamp: Date.now() - 30 * 24 * 60 * 60 * 1000,
|
|
511
|
+
status: 'investigating',
|
|
512
|
+
message: 'Complete datacenter power loss.',
|
|
513
|
+
author: 'Operations'
|
|
514
|
+
},
|
|
515
|
+
{
|
|
516
|
+
id: 'update-13',
|
|
517
|
+
timestamp: Date.now() - 30 * 24 * 60 * 60 * 1000 + 4 * 60 * 60 * 1000,
|
|
518
|
+
status: 'resolved',
|
|
519
|
+
message: 'Power restored. Services coming back online.',
|
|
520
|
+
author: 'Operations'
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
id: 'update-14',
|
|
524
|
+
timestamp: Date.now() - 29 * 24 * 60 * 60 * 1000,
|
|
525
|
+
status: 'postmortem',
|
|
526
|
+
message: 'Postmortem published. Multiple redundancy improvements implemented.',
|
|
527
|
+
author: 'Engineering'
|
|
528
|
+
}
|
|
529
|
+
]
|
|
530
|
+
}
|
|
531
|
+
];
|
|
532
|
+
|
|
533
|
+
incidents.currentIncidents = currentIncidents;
|
|
534
|
+
incidents.pastIncidents = pastIncidents;
|
|
535
|
+
|
|
536
|
+
// Configure Footer
|
|
537
|
+
footer.companyName = 'DataStream Platform';
|
|
538
|
+
footer.legalUrl = 'https://datastream.example.com/legal';
|
|
539
|
+
footer.supportEmail = 'emergency@datastream.example.com';
|
|
540
|
+
footer.statusPageUrl = 'https://status.datastream.example.com';
|
|
541
|
+
footer.lastUpdated = Date.now();
|
|
542
|
+
footer.currentYear = new Date().getFullYear();
|
|
543
|
+
footer.socialLinks = [
|
|
544
|
+
{ platform: 'twitter', url: 'https://twitter.com/datastream' }
|
|
545
|
+
];
|
|
546
|
+
footer.rssFeedUrl = 'https://status.datastream.example.com/rss';
|
|
547
|
+
footer.apiStatusUrl = 'https://api.datastream.example.com/v1/status';
|
|
548
|
+
footer.enableSubscribe = true;
|
|
549
|
+
footer.enableReportIssue = true;
|
|
550
|
+
footer.subscriberCount = 15234;
|
|
551
|
+
footer.errorMessage = 'Critical: Multiple services experiencing major outages';
|
|
552
|
+
footer.additionalLinks = [
|
|
553
|
+
{ label: 'Emergency Support', url: 'tel:+1-800-HELP-NOW' },
|
|
554
|
+
{ label: 'Incident Updates', url: 'https://datastream.example.com/incidents' }
|
|
555
|
+
];
|
|
556
|
+
}}
|
|
557
|
+
>
|
|
558
|
+
<upl-statuspage-header></upl-statuspage-header>
|
|
559
|
+
<upl-statuspage-statusbar></upl-statuspage-statusbar>
|
|
560
|
+
<upl-statuspage-statsgrid></upl-statuspage-statsgrid>
|
|
561
|
+
<upl-statuspage-assetsselector></upl-statuspage-assetsselector>
|
|
562
|
+
<upl-statuspage-statusdetails></upl-statuspage-statusdetails>
|
|
563
|
+
<upl-statuspage-statusmonth></upl-statuspage-statusmonth>
|
|
564
|
+
<upl-statuspage-incidents></upl-statuspage-incidents>
|
|
565
|
+
<upl-statuspage-footer></upl-statuspage-footer>
|
|
566
|
+
</dees-demowrapper>
|
|
567
|
+
</div>
|
|
568
|
+
`;
|