@nahisaho/musubix-core 1.0.21 → 1.1.1
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/design/component-inference.d.ts +70 -0
- package/dist/design/component-inference.d.ts.map +1 -0
- package/dist/design/component-inference.js +205 -0
- package/dist/design/component-inference.js.map +1 -0
- package/dist/design/domain-detector.d.ts +65 -0
- package/dist/design/domain-detector.d.ts.map +1 -0
- package/dist/design/domain-detector.js +210 -0
- package/dist/design/domain-detector.js.map +1 -0
- package/dist/design/index.d.ts +2 -0
- package/dist/design/index.d.ts.map +1 -1
- package/dist/design/index.js +2 -0
- package/dist/design/index.js.map +1 -1
- package/dist/utils/__tests__/threshold-alert.test.d.ts +5 -0
- package/dist/utils/__tests__/threshold-alert.test.d.ts.map +1 -0
- package/dist/utils/__tests__/threshold-alert.test.js +275 -0
- package/dist/utils/__tests__/threshold-alert.test.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/threshold-alert.d.ts +240 -0
- package/dist/utils/threshold-alert.d.ts.map +1 -0
- package/dist/utils/threshold-alert.js +416 -0
- package/dist/utils/threshold-alert.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ThresholdAlert - 閾値ベースのアラート・監視ユーティリティ
|
|
3
|
+
*
|
|
4
|
+
* @description
|
|
5
|
+
* 値が閾値を超えた/下回った際のアラート判定を行うサービスクラス。
|
|
6
|
+
* 在庫管理、リソース監視、容量管理、SLA監視などで使用。
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const alert = new ThresholdAlert({
|
|
11
|
+
* warningThreshold: 80,
|
|
12
|
+
* criticalThreshold: 95,
|
|
13
|
+
* direction: 'above', // 閾値を超えたらアラート
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* // アラートレベルをチェック
|
|
17
|
+
* const level = alert.check(85); // 'warning'
|
|
18
|
+
* const level2 = alert.check(98); // 'critical'
|
|
19
|
+
*
|
|
20
|
+
* // 詳細な結果を取得
|
|
21
|
+
* const result = alert.evaluate(85);
|
|
22
|
+
* // { level: 'warning', value: 85, threshold: 80, exceeded: true, ... }
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @since 1.1.0
|
|
26
|
+
* @see REQ-LEARN-003 - 繰り返しパターンの抽出
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* 閾値ベースのアラート評価サービス
|
|
30
|
+
*/
|
|
31
|
+
export class ThresholdAlert {
|
|
32
|
+
warningThreshold;
|
|
33
|
+
criticalThreshold;
|
|
34
|
+
direction;
|
|
35
|
+
hysteresis;
|
|
36
|
+
name;
|
|
37
|
+
unit;
|
|
38
|
+
lastLevel = 'normal';
|
|
39
|
+
constructor(config) {
|
|
40
|
+
this.warningThreshold = config.warningThreshold;
|
|
41
|
+
this.criticalThreshold = config.criticalThreshold;
|
|
42
|
+
this.direction = config.direction ?? 'above';
|
|
43
|
+
this.hysteresis = config.hysteresis ?? 0;
|
|
44
|
+
this.name = config.name ?? 'value';
|
|
45
|
+
this.unit = config.unit ?? '';
|
|
46
|
+
// 閾値の妥当性チェック
|
|
47
|
+
if (this.direction === 'above') {
|
|
48
|
+
if (this.warningThreshold > this.criticalThreshold) {
|
|
49
|
+
throw new Error('For "above" direction, warningThreshold must be <= criticalThreshold');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
if (this.warningThreshold < this.criticalThreshold) {
|
|
54
|
+
throw new Error('For "below" direction, warningThreshold must be >= criticalThreshold');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 値のアラートレベルをチェック
|
|
60
|
+
*
|
|
61
|
+
* @param value - チェックする値
|
|
62
|
+
* @returns アラートレベル
|
|
63
|
+
*/
|
|
64
|
+
check(value) {
|
|
65
|
+
return this.evaluate(value).level;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 値を詳細に評価
|
|
69
|
+
*
|
|
70
|
+
* @param value - 評価する値
|
|
71
|
+
* @returns 詳細な評価結果
|
|
72
|
+
*/
|
|
73
|
+
evaluate(value) {
|
|
74
|
+
let level;
|
|
75
|
+
let exceeded = false;
|
|
76
|
+
let threshold;
|
|
77
|
+
if (this.direction === 'above') {
|
|
78
|
+
// 超過でアラート(リソース使用率など)
|
|
79
|
+
if (value >= this.criticalThreshold) {
|
|
80
|
+
level = 'critical';
|
|
81
|
+
exceeded = true;
|
|
82
|
+
threshold = this.criticalThreshold;
|
|
83
|
+
}
|
|
84
|
+
else if (value >= this.warningThreshold) {
|
|
85
|
+
level = 'warning';
|
|
86
|
+
exceeded = true;
|
|
87
|
+
threshold = this.warningThreshold;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
level = 'normal';
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// 下回りでアラート(在庫数など)
|
|
95
|
+
if (value <= this.criticalThreshold) {
|
|
96
|
+
level = 'critical';
|
|
97
|
+
exceeded = true;
|
|
98
|
+
threshold = this.criticalThreshold;
|
|
99
|
+
}
|
|
100
|
+
else if (value <= this.warningThreshold) {
|
|
101
|
+
level = 'warning';
|
|
102
|
+
exceeded = true;
|
|
103
|
+
threshold = this.warningThreshold;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
level = 'normal';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// ヒステリシスを適用(チャタリング防止)
|
|
110
|
+
if (this.hysteresis > 0) {
|
|
111
|
+
level = this.applyHysteresis(value, level);
|
|
112
|
+
}
|
|
113
|
+
this.lastLevel = level;
|
|
114
|
+
const marginToWarning = this.calculateMargin(value, this.warningThreshold);
|
|
115
|
+
const marginToCritical = this.calculateMargin(value, this.criticalThreshold);
|
|
116
|
+
const percentage = this.calculatePercentage(value);
|
|
117
|
+
return {
|
|
118
|
+
level,
|
|
119
|
+
value,
|
|
120
|
+
threshold,
|
|
121
|
+
exceeded,
|
|
122
|
+
direction: this.direction,
|
|
123
|
+
marginToWarning,
|
|
124
|
+
marginToCritical,
|
|
125
|
+
percentage,
|
|
126
|
+
message: this.generateMessage(level, value),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 閾値を超過しているかチェック
|
|
131
|
+
*
|
|
132
|
+
* @param value - チェックする値
|
|
133
|
+
* @returns 超過している場合true
|
|
134
|
+
*/
|
|
135
|
+
isExceeded(value) {
|
|
136
|
+
return this.evaluate(value).exceeded;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 警告レベル以上かチェック
|
|
140
|
+
*
|
|
141
|
+
* @param value - チェックする値
|
|
142
|
+
* @returns 警告以上の場合true
|
|
143
|
+
*/
|
|
144
|
+
isWarningOrAbove(value) {
|
|
145
|
+
const level = this.check(value);
|
|
146
|
+
return level === 'warning' || level === 'critical';
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* 危険レベルかチェック
|
|
150
|
+
*
|
|
151
|
+
* @param value - チェックする値
|
|
152
|
+
* @returns 危険レベルの場合true
|
|
153
|
+
*/
|
|
154
|
+
isCritical(value) {
|
|
155
|
+
return this.check(value) === 'critical';
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 閾値までの残り値を計算
|
|
159
|
+
*
|
|
160
|
+
* @param value - 現在値
|
|
161
|
+
* @param threshold - 閾値
|
|
162
|
+
* @returns 残り値(負の場合は超過)
|
|
163
|
+
*/
|
|
164
|
+
calculateMargin(value, threshold) {
|
|
165
|
+
if (this.direction === 'above') {
|
|
166
|
+
return threshold - value;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
return value - threshold;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* 使用率/消費率を計算(パーセンテージ)
|
|
174
|
+
*
|
|
175
|
+
* @param value - 現在値
|
|
176
|
+
* @returns パーセンテージ(0-100+)
|
|
177
|
+
*/
|
|
178
|
+
calculatePercentage(value) {
|
|
179
|
+
if (this.direction === 'above') {
|
|
180
|
+
// 0からcriticalThresholdの範囲で計算
|
|
181
|
+
if (this.criticalThreshold === 0)
|
|
182
|
+
return 0;
|
|
183
|
+
return Math.round((value / this.criticalThreshold) * 100);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
// warningThresholdから0の範囲で計算
|
|
187
|
+
if (this.warningThreshold === 0)
|
|
188
|
+
return 100;
|
|
189
|
+
const consumed = this.warningThreshold - value;
|
|
190
|
+
return Math.round((consumed / this.warningThreshold) * 100);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* ヒステリシスを適用してチャタリングを防止
|
|
195
|
+
*
|
|
196
|
+
* @param value - 現在値
|
|
197
|
+
* @param newLevel - 新しいレベル
|
|
198
|
+
* @returns 調整後のレベル
|
|
199
|
+
*/
|
|
200
|
+
applyHysteresis(value, newLevel) {
|
|
201
|
+
// レベルが下がる場合のみヒステリシスを適用
|
|
202
|
+
if (this.isLevelHigher(this.lastLevel, newLevel)) {
|
|
203
|
+
// 前回のレベルが高かった場合、ヒステリシス分の余裕を持たせる
|
|
204
|
+
if (this.direction === 'above') {
|
|
205
|
+
if (this.lastLevel === 'critical' &&
|
|
206
|
+
value > this.criticalThreshold - this.hysteresis) {
|
|
207
|
+
return 'critical';
|
|
208
|
+
}
|
|
209
|
+
if (this.lastLevel === 'warning' &&
|
|
210
|
+
value > this.warningThreshold - this.hysteresis) {
|
|
211
|
+
return 'warning';
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
if (this.lastLevel === 'critical' &&
|
|
216
|
+
value < this.criticalThreshold + this.hysteresis) {
|
|
217
|
+
return 'critical';
|
|
218
|
+
}
|
|
219
|
+
if (this.lastLevel === 'warning' &&
|
|
220
|
+
value < this.warningThreshold + this.hysteresis) {
|
|
221
|
+
return 'warning';
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return newLevel;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* レベルの高低を比較
|
|
229
|
+
*/
|
|
230
|
+
isLevelHigher(level1, level2) {
|
|
231
|
+
const order = {
|
|
232
|
+
normal: 0,
|
|
233
|
+
warning: 1,
|
|
234
|
+
critical: 2,
|
|
235
|
+
};
|
|
236
|
+
return order[level1] > order[level2];
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* アラートメッセージを生成
|
|
240
|
+
*/
|
|
241
|
+
generateMessage(level, value) {
|
|
242
|
+
const valueStr = this.unit ? `${value}${this.unit}` : String(value);
|
|
243
|
+
switch (level) {
|
|
244
|
+
case 'critical':
|
|
245
|
+
return `[CRITICAL] ${this.name} is at ${valueStr} (threshold: ${this.criticalThreshold}${this.unit})`;
|
|
246
|
+
case 'warning':
|
|
247
|
+
return `[WARNING] ${this.name} is at ${valueStr} (threshold: ${this.warningThreshold}${this.unit})`;
|
|
248
|
+
default:
|
|
249
|
+
return `[OK] ${this.name} is at ${valueStr}`;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* 現在の設定を取得
|
|
254
|
+
*/
|
|
255
|
+
getConfig() {
|
|
256
|
+
return {
|
|
257
|
+
warningThreshold: this.warningThreshold,
|
|
258
|
+
criticalThreshold: this.criticalThreshold,
|
|
259
|
+
direction: this.direction,
|
|
260
|
+
hysteresis: this.hysteresis,
|
|
261
|
+
name: this.name,
|
|
262
|
+
unit: this.unit,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* 複数の閾値を一括管理するサービス
|
|
268
|
+
*/
|
|
269
|
+
export class MultiThresholdAlert {
|
|
270
|
+
alerts = new Map();
|
|
271
|
+
/**
|
|
272
|
+
* 閾値アラートを登録
|
|
273
|
+
*
|
|
274
|
+
* @param name - 識別名
|
|
275
|
+
* @param config - 閾値設定
|
|
276
|
+
*/
|
|
277
|
+
register(name, config) {
|
|
278
|
+
this.alerts.set(name, new ThresholdAlert({ ...config, name }));
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 閾値アラートを削除
|
|
282
|
+
*
|
|
283
|
+
* @param name - 識別名
|
|
284
|
+
*/
|
|
285
|
+
unregister(name) {
|
|
286
|
+
this.alerts.delete(name);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* 単一の値をチェック
|
|
290
|
+
*
|
|
291
|
+
* @param name - 識別名
|
|
292
|
+
* @param value - チェックする値
|
|
293
|
+
* @returns アラートレベル
|
|
294
|
+
*/
|
|
295
|
+
check(name, value) {
|
|
296
|
+
const alert = this.alerts.get(name);
|
|
297
|
+
if (!alert) {
|
|
298
|
+
throw new Error(`Alert "${name}" not registered`);
|
|
299
|
+
}
|
|
300
|
+
return alert.check(value);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* 複数の値を一括評価
|
|
304
|
+
*
|
|
305
|
+
* @param values - 名前と値のマップ
|
|
306
|
+
* @returns 一括評価結果
|
|
307
|
+
*/
|
|
308
|
+
evaluateAll(values) {
|
|
309
|
+
const details = new Map();
|
|
310
|
+
let overallLevel = 'normal';
|
|
311
|
+
let warningCount = 0;
|
|
312
|
+
let criticalCount = 0;
|
|
313
|
+
const entries = values instanceof Map ? values.entries() : Object.entries(values);
|
|
314
|
+
for (const [name, value] of entries) {
|
|
315
|
+
const alert = this.alerts.get(name);
|
|
316
|
+
if (!alert)
|
|
317
|
+
continue;
|
|
318
|
+
const result = alert.evaluate(value);
|
|
319
|
+
details.set(name, result);
|
|
320
|
+
if (result.level === 'critical') {
|
|
321
|
+
overallLevel = 'critical';
|
|
322
|
+
criticalCount++;
|
|
323
|
+
}
|
|
324
|
+
else if (result.level === 'warning') {
|
|
325
|
+
if (overallLevel !== 'critical') {
|
|
326
|
+
overallLevel = 'warning';
|
|
327
|
+
}
|
|
328
|
+
warningCount++;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
const summary = this.generateSummary(overallLevel, warningCount, criticalCount);
|
|
332
|
+
return {
|
|
333
|
+
overallLevel,
|
|
334
|
+
details,
|
|
335
|
+
warningCount,
|
|
336
|
+
criticalCount,
|
|
337
|
+
summary,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* 全アラートの名前を取得
|
|
342
|
+
*/
|
|
343
|
+
getRegisteredNames() {
|
|
344
|
+
return Array.from(this.alerts.keys());
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* サマリーメッセージを生成
|
|
348
|
+
*/
|
|
349
|
+
generateSummary(level, warningCount, criticalCount) {
|
|
350
|
+
if (level === 'critical') {
|
|
351
|
+
return `${criticalCount} critical alert(s), ${warningCount} warning(s)`;
|
|
352
|
+
}
|
|
353
|
+
else if (level === 'warning') {
|
|
354
|
+
return `${warningCount} warning(s)`;
|
|
355
|
+
}
|
|
356
|
+
return 'All systems normal';
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// ========================================
|
|
360
|
+
// プリセット閾値設定
|
|
361
|
+
// ========================================
|
|
362
|
+
/**
|
|
363
|
+
* リソース使用率用の閾値設定(CPU、メモリ、ディスクなど)
|
|
364
|
+
*/
|
|
365
|
+
export const resourceUsageThreshold = {
|
|
366
|
+
warningThreshold: 80,
|
|
367
|
+
criticalThreshold: 95,
|
|
368
|
+
direction: 'above',
|
|
369
|
+
unit: '%',
|
|
370
|
+
};
|
|
371
|
+
/**
|
|
372
|
+
* 在庫数用の閾値設定
|
|
373
|
+
*/
|
|
374
|
+
export const inventoryThreshold = {
|
|
375
|
+
warningThreshold: 10,
|
|
376
|
+
criticalThreshold: 5,
|
|
377
|
+
direction: 'below',
|
|
378
|
+
unit: '個',
|
|
379
|
+
};
|
|
380
|
+
/**
|
|
381
|
+
* レスポンスタイム用の閾値設定(ミリ秒)
|
|
382
|
+
*/
|
|
383
|
+
export const responseTimeThreshold = {
|
|
384
|
+
warningThreshold: 1000,
|
|
385
|
+
criticalThreshold: 3000,
|
|
386
|
+
direction: 'above',
|
|
387
|
+
unit: 'ms',
|
|
388
|
+
};
|
|
389
|
+
/**
|
|
390
|
+
* エラー率用の閾値設定(%)
|
|
391
|
+
*/
|
|
392
|
+
export const errorRateThreshold = {
|
|
393
|
+
warningThreshold: 1,
|
|
394
|
+
criticalThreshold: 5,
|
|
395
|
+
direction: 'above',
|
|
396
|
+
unit: '%',
|
|
397
|
+
};
|
|
398
|
+
/**
|
|
399
|
+
* 容量使用率用の閾値設定(予約数、座席数など)
|
|
400
|
+
*/
|
|
401
|
+
export const capacityThreshold = {
|
|
402
|
+
warningThreshold: 80,
|
|
403
|
+
criticalThreshold: 95,
|
|
404
|
+
direction: 'above',
|
|
405
|
+
unit: '%',
|
|
406
|
+
};
|
|
407
|
+
/**
|
|
408
|
+
* バッテリー残量用の閾値設定
|
|
409
|
+
*/
|
|
410
|
+
export const batteryThreshold = {
|
|
411
|
+
warningThreshold: 20,
|
|
412
|
+
criticalThreshold: 5,
|
|
413
|
+
direction: 'below',
|
|
414
|
+
unit: '%',
|
|
415
|
+
};
|
|
416
|
+
//# sourceMappingURL=threshold-alert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threshold-alert.js","sourceRoot":"","sources":["../../src/utils/threshold-alert.ts"],"names":[],"mappings":"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"}
|