agentic-qe 1.9.3 → 1.9.4
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/CHANGELOG.md +54 -0
- package/README.md +30 -5
- package/config/.env.otel.example +25 -0
- package/config/OTEL-QUICK-REFERENCE.md +137 -0
- package/config/README-OTEL.md +222 -0
- package/config/alerting-rules.yml +518 -0
- package/config/docker-compose.otel.yml +187 -0
- package/config/grafana/dashboards/agentic-qe-overview.json +286 -0
- package/config/grafana/provisioning/dashboards/dashboards.yml +19 -0
- package/config/grafana/provisioning/datasources/datasources.yml +53 -0
- package/config/otel-collector-config.yaml.example +145 -0
- package/config/prometheus.yml.example +106 -0
- package/dist/alerting/AlertManager.d.ts +120 -0
- package/dist/alerting/AlertManager.d.ts.map +1 -0
- package/dist/alerting/AlertManager.js +345 -0
- package/dist/alerting/AlertManager.js.map +1 -0
- package/dist/alerting/FeedbackRouter.d.ts +98 -0
- package/dist/alerting/FeedbackRouter.d.ts.map +1 -0
- package/dist/alerting/FeedbackRouter.js +331 -0
- package/dist/alerting/FeedbackRouter.js.map +1 -0
- package/dist/alerting/StrategyApplicator.d.ts +120 -0
- package/dist/alerting/StrategyApplicator.d.ts.map +1 -0
- package/dist/alerting/StrategyApplicator.js +299 -0
- package/dist/alerting/StrategyApplicator.js.map +1 -0
- package/dist/alerting/index.d.ts +68 -0
- package/dist/alerting/index.d.ts.map +1 -0
- package/dist/alerting/index.js +112 -0
- package/dist/alerting/index.js.map +1 -0
- package/dist/alerting/types.d.ts +118 -0
- package/dist/alerting/types.d.ts.map +1 -0
- package/dist/alerting/types.js +11 -0
- package/dist/alerting/types.js.map +1 -0
- package/dist/cli/init/claude-config.d.ts.map +1 -1
- package/dist/cli/init/claude-config.js +12 -7
- package/dist/cli/init/claude-config.js.map +1 -1
- package/dist/core/memory/IPatternStore.d.ts +209 -0
- package/dist/core/memory/IPatternStore.d.ts.map +1 -0
- package/dist/core/memory/IPatternStore.js +15 -0
- package/dist/core/memory/IPatternStore.js.map +1 -0
- package/dist/core/memory/MigrationTools.d.ts +192 -0
- package/dist/core/memory/MigrationTools.d.ts.map +1 -0
- package/dist/core/memory/MigrationTools.js +615 -0
- package/dist/core/memory/MigrationTools.js.map +1 -0
- package/dist/core/memory/NeuralEnhancement.d.ts +154 -0
- package/dist/core/memory/NeuralEnhancement.d.ts.map +1 -0
- package/dist/core/memory/NeuralEnhancement.js +598 -0
- package/dist/core/memory/NeuralEnhancement.js.map +1 -0
- package/dist/core/memory/PatternStoreFactory.d.ts +143 -0
- package/dist/core/memory/PatternStoreFactory.d.ts.map +1 -0
- package/dist/core/memory/PatternStoreFactory.js +370 -0
- package/dist/core/memory/PatternStoreFactory.js.map +1 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts +1 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.js +28 -20
- package/dist/core/memory/RealAgentDBAdapter.js.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts +198 -0
- package/dist/core/memory/RuVectorPatternStore.d.ts.map +1 -0
- package/dist/core/memory/RuVectorPatternStore.js +605 -0
- package/dist/core/memory/RuVectorPatternStore.js.map +1 -0
- package/dist/core/memory/SelfHealingMonitor.d.ts +186 -0
- package/dist/core/memory/SelfHealingMonitor.d.ts.map +1 -0
- package/dist/core/memory/SelfHealingMonitor.js +451 -0
- package/dist/core/memory/SelfHealingMonitor.js.map +1 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts +62 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +97 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/index.d.ts +11 -0
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +36 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/reasoning/RuVectorReasoningAdapter.d.ts +232 -0
- package/dist/reasoning/RuVectorReasoningAdapter.d.ts.map +1 -0
- package/dist/reasoning/RuVectorReasoningAdapter.js +585 -0
- package/dist/reasoning/RuVectorReasoningAdapter.js.map +1 -0
- package/dist/reasoning/index.d.ts +2 -0
- package/dist/reasoning/index.d.ts.map +1 -1
- package/dist/reasoning/index.js +6 -1
- package/dist/reasoning/index.js.map +1 -1
- package/dist/reporting/ResultAggregator.d.ts +107 -0
- package/dist/reporting/ResultAggregator.d.ts.map +1 -0
- package/dist/reporting/ResultAggregator.js +435 -0
- package/dist/reporting/ResultAggregator.js.map +1 -0
- package/dist/reporting/index.d.ts +48 -0
- package/dist/reporting/index.d.ts.map +1 -0
- package/dist/reporting/index.js +154 -0
- package/dist/reporting/index.js.map +1 -0
- package/dist/reporting/reporters/ControlLoopReporter.d.ts +128 -0
- package/dist/reporting/reporters/ControlLoopReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/ControlLoopReporter.js +417 -0
- package/dist/reporting/reporters/ControlLoopReporter.js.map +1 -0
- package/dist/reporting/reporters/HumanReadableReporter.d.ts +140 -0
- package/dist/reporting/reporters/HumanReadableReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/HumanReadableReporter.js +524 -0
- package/dist/reporting/reporters/HumanReadableReporter.js.map +1 -0
- package/dist/reporting/reporters/JSONReporter.d.ts +193 -0
- package/dist/reporting/reporters/JSONReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/JSONReporter.js +324 -0
- package/dist/reporting/reporters/JSONReporter.js.map +1 -0
- package/dist/reporting/reporters/index.d.ts +14 -0
- package/dist/reporting/reporters/index.d.ts.map +1 -0
- package/dist/reporting/reporters/index.js +19 -0
- package/dist/reporting/reporters/index.js.map +1 -0
- package/dist/reporting/types.d.ts +427 -0
- package/dist/reporting/types.d.ts.map +1 -0
- package/dist/reporting/types.js +12 -0
- package/dist/reporting/types.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AlertManager - Core Alert Evaluation Engine
|
|
3
|
+
*
|
|
4
|
+
* Evaluates metrics against alert rules and manages alert lifecycle.
|
|
5
|
+
* This is the ACTUAL implementation, not documentation.
|
|
6
|
+
*
|
|
7
|
+
* @module alerting/AlertManager
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
import { EventEmitter } from 'events';
|
|
11
|
+
import { Alert, AlertRule, AlertEvaluation, AlertSeverity, AlertingConfig, MetricValue } from './types';
|
|
12
|
+
/**
|
|
13
|
+
* AlertManager handles alert evaluation, firing, and lifecycle management.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const manager = new AlertManager();
|
|
18
|
+
* manager.loadRules(rules);
|
|
19
|
+
* manager.on('alert:fired', (alert) => console.log('Alert!', alert));
|
|
20
|
+
* manager.evaluate(metrics);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare class AlertManager extends EventEmitter {
|
|
24
|
+
private rules;
|
|
25
|
+
private activeAlerts;
|
|
26
|
+
private alertHistory;
|
|
27
|
+
private cooldowns;
|
|
28
|
+
private config;
|
|
29
|
+
private evaluationTimer?;
|
|
30
|
+
private alertCountThisHour;
|
|
31
|
+
private hourlyResetTimer?;
|
|
32
|
+
constructor(config?: Partial<AlertingConfig>);
|
|
33
|
+
/**
|
|
34
|
+
* Load alert rules from configuration
|
|
35
|
+
*/
|
|
36
|
+
loadRules(rules: AlertRule[]): void;
|
|
37
|
+
/**
|
|
38
|
+
* Parse rules from YAML-style config object
|
|
39
|
+
*/
|
|
40
|
+
loadRulesFromConfig(config: {
|
|
41
|
+
groups: Array<{
|
|
42
|
+
name: string;
|
|
43
|
+
rules: unknown[];
|
|
44
|
+
}>;
|
|
45
|
+
}): void;
|
|
46
|
+
/**
|
|
47
|
+
* Evaluate metrics against all rules
|
|
48
|
+
*/
|
|
49
|
+
evaluate(metrics: MetricValue[]): AlertEvaluation[];
|
|
50
|
+
/**
|
|
51
|
+
* Evaluate a single rule against a metric
|
|
52
|
+
*/
|
|
53
|
+
private evaluateRule;
|
|
54
|
+
/**
|
|
55
|
+
* Extract threshold value from expression
|
|
56
|
+
*/
|
|
57
|
+
private extractThreshold;
|
|
58
|
+
/**
|
|
59
|
+
* Extract comparison operator from expression
|
|
60
|
+
*/
|
|
61
|
+
private extractComparison;
|
|
62
|
+
/**
|
|
63
|
+
* Compare values based on operator
|
|
64
|
+
*/
|
|
65
|
+
private compareValues;
|
|
66
|
+
/**
|
|
67
|
+
* Find metrics relevant to a rule
|
|
68
|
+
*/
|
|
69
|
+
private findRelevantMetrics;
|
|
70
|
+
/**
|
|
71
|
+
* Handle a firing alert
|
|
72
|
+
*/
|
|
73
|
+
private handleFiringAlert;
|
|
74
|
+
/**
|
|
75
|
+
* Handle alert resolution
|
|
76
|
+
*/
|
|
77
|
+
private handleResolvedAlert;
|
|
78
|
+
/**
|
|
79
|
+
* Generate unique fingerprint for alert deduplication
|
|
80
|
+
*/
|
|
81
|
+
private generateFingerprint;
|
|
82
|
+
/**
|
|
83
|
+
* Check if alert is on cooldown
|
|
84
|
+
*/
|
|
85
|
+
private isOnCooldown;
|
|
86
|
+
/**
|
|
87
|
+
* Start periodic evaluation
|
|
88
|
+
*/
|
|
89
|
+
startEvaluation(metricsProvider: () => MetricValue[]): void;
|
|
90
|
+
/**
|
|
91
|
+
* Stop periodic evaluation
|
|
92
|
+
*/
|
|
93
|
+
stopEvaluation(): void;
|
|
94
|
+
/**
|
|
95
|
+
* Start hourly counter reset
|
|
96
|
+
*/
|
|
97
|
+
private startHourlyReset;
|
|
98
|
+
/**
|
|
99
|
+
* Get all active alerts
|
|
100
|
+
*/
|
|
101
|
+
getActiveAlerts(): Alert[];
|
|
102
|
+
/**
|
|
103
|
+
* Get alert history
|
|
104
|
+
*/
|
|
105
|
+
getAlertHistory(limit?: number): Alert[];
|
|
106
|
+
/**
|
|
107
|
+
* Get alert statistics
|
|
108
|
+
*/
|
|
109
|
+
getStats(): {
|
|
110
|
+
activeCount: number;
|
|
111
|
+
totalFired: number;
|
|
112
|
+
bySeverity: Record<AlertSeverity, number>;
|
|
113
|
+
alertsThisHour: number;
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Cleanup resources
|
|
117
|
+
*/
|
|
118
|
+
destroy(): void;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=AlertManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertManager.d.ts","sourceRoot":"","sources":["../../src/alerting/AlertManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EACL,KAAK,EACL,SAAS,EACT,eAAe,EACf,aAAa,EAEb,cAAc,EACd,WAAW,EAEZ,MAAM,SAAS,CAAC;AAUjB;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,gBAAgB,CAAC,CAAiB;gBAE9B,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAMhD;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI;IAQnC;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,GAAG,IAAI;IAsCxF;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,eAAe,EAAE;IAqBnD;;OAEG;IACH,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuDzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,eAAe,CAAC,eAAe,EAAE,MAAM,WAAW,EAAE,GAAG,IAAI;IAQ3D;;OAEG;IACH,cAAc,IAAI,IAAI;IAOtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,eAAe,IAAI,KAAK,EAAE;IAI1B;;OAEG;IACH,eAAe,CAAC,KAAK,SAAM,GAAG,KAAK,EAAE;IAIrC;;OAEG;IACH,QAAQ,IAAI;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC1C,cAAc,EAAE,MAAM,CAAC;KACxB;IAoBD;;OAEG;IACH,OAAO,IAAI,IAAI;CAOhB"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AlertManager - Core Alert Evaluation Engine
|
|
4
|
+
*
|
|
5
|
+
* Evaluates metrics against alert rules and manages alert lifecycle.
|
|
6
|
+
* This is the ACTUAL implementation, not documentation.
|
|
7
|
+
*
|
|
8
|
+
* @module alerting/AlertManager
|
|
9
|
+
* @version 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.AlertManager = void 0;
|
|
46
|
+
const events_1 = require("events");
|
|
47
|
+
const crypto = __importStar(require("crypto"));
|
|
48
|
+
const DEFAULT_CONFIG = {
|
|
49
|
+
evaluationInterval: 15000, // 15 seconds
|
|
50
|
+
cooldownPeriod: 300000, // 5 minutes
|
|
51
|
+
maxAlertsPerHour: 100,
|
|
52
|
+
enableFeedbackLoop: true,
|
|
53
|
+
feedbackDelay: 1000
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* AlertManager handles alert evaluation, firing, and lifecycle management.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const manager = new AlertManager();
|
|
61
|
+
* manager.loadRules(rules);
|
|
62
|
+
* manager.on('alert:fired', (alert) => console.log('Alert!', alert));
|
|
63
|
+
* manager.evaluate(metrics);
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
class AlertManager extends events_1.EventEmitter {
|
|
67
|
+
constructor(config = {}) {
|
|
68
|
+
super();
|
|
69
|
+
this.rules = new Map();
|
|
70
|
+
this.activeAlerts = new Map();
|
|
71
|
+
this.alertHistory = [];
|
|
72
|
+
this.cooldowns = new Map();
|
|
73
|
+
this.alertCountThisHour = 0;
|
|
74
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
75
|
+
this.startHourlyReset();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Load alert rules from configuration
|
|
79
|
+
*/
|
|
80
|
+
loadRules(rules) {
|
|
81
|
+
this.rules.clear();
|
|
82
|
+
for (const rule of rules) {
|
|
83
|
+
this.rules.set(rule.name, rule);
|
|
84
|
+
}
|
|
85
|
+
this.emit('rules:loaded', rules.length);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Parse rules from YAML-style config object
|
|
89
|
+
*/
|
|
90
|
+
loadRulesFromConfig(config) {
|
|
91
|
+
const rules = [];
|
|
92
|
+
for (const group of config.groups) {
|
|
93
|
+
for (const rawRule of group.rules) {
|
|
94
|
+
const rule = rawRule;
|
|
95
|
+
rules.push({
|
|
96
|
+
name: rule.alert,
|
|
97
|
+
expr: rule.expr,
|
|
98
|
+
forDuration: rule.for || '0s',
|
|
99
|
+
labels: {
|
|
100
|
+
severity: rule.labels?.severity || 'warning',
|
|
101
|
+
component: rule.labels?.component || 'unknown',
|
|
102
|
+
alert_type: rule.labels?.alert_type || 'generic',
|
|
103
|
+
feedback_action: rule.labels?.feedback_action || 'adjust_strategy',
|
|
104
|
+
agent_scope: rule.labels?.agent_scope
|
|
105
|
+
},
|
|
106
|
+
annotations: {
|
|
107
|
+
summary: rule.annotations?.summary || '',
|
|
108
|
+
description: rule.annotations?.description || '',
|
|
109
|
+
feedback_strategy: rule.annotations?.feedback_strategy,
|
|
110
|
+
feedback_action: rule.annotations?.feedback_action,
|
|
111
|
+
runbook_url: rule.annotations?.runbook_url
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
this.loadRules(rules);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Evaluate metrics against all rules
|
|
120
|
+
*/
|
|
121
|
+
evaluate(metrics) {
|
|
122
|
+
const evaluations = [];
|
|
123
|
+
for (const rule of Array.from(this.rules.values())) {
|
|
124
|
+
const relevantMetrics = this.findRelevantMetrics(rule, metrics);
|
|
125
|
+
for (const metric of relevantMetrics) {
|
|
126
|
+
const evaluation = this.evaluateRule(rule, metric);
|
|
127
|
+
evaluations.push(evaluation);
|
|
128
|
+
if (evaluation.isFiring) {
|
|
129
|
+
this.handleFiringAlert(rule, metric, evaluation);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
this.handleResolvedAlert(rule, metric);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return evaluations;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Evaluate a single rule against a metric
|
|
140
|
+
*/
|
|
141
|
+
evaluateRule(rule, metric) {
|
|
142
|
+
const threshold = this.extractThreshold(rule.expr);
|
|
143
|
+
const comparison = this.extractComparison(rule.expr);
|
|
144
|
+
const isFiring = this.compareValues(metric.value, threshold, comparison);
|
|
145
|
+
return {
|
|
146
|
+
rule,
|
|
147
|
+
metric,
|
|
148
|
+
threshold,
|
|
149
|
+
actual: metric.value,
|
|
150
|
+
isFiring,
|
|
151
|
+
message: isFiring
|
|
152
|
+
? `${rule.name}: ${metric.value} ${comparison} ${threshold}`
|
|
153
|
+
: `${rule.name}: OK (${metric.value})`
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Extract threshold value from expression
|
|
158
|
+
*/
|
|
159
|
+
extractThreshold(expr) {
|
|
160
|
+
// Match patterns like "> 0.05", "< 80", ">= 5"
|
|
161
|
+
const match = expr.match(/[<>=]+\s*([\d.]+)\s*$/);
|
|
162
|
+
return match ? parseFloat(match[1]) : 0;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Extract comparison operator from expression
|
|
166
|
+
*/
|
|
167
|
+
extractComparison(expr) {
|
|
168
|
+
const match = expr.match(/([<>=]+)\s*[\d.]+\s*$/);
|
|
169
|
+
return match ? match[1] : '>';
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Compare values based on operator
|
|
173
|
+
*/
|
|
174
|
+
compareValues(actual, threshold, operator) {
|
|
175
|
+
switch (operator) {
|
|
176
|
+
case '>': return actual > threshold;
|
|
177
|
+
case '>=': return actual >= threshold;
|
|
178
|
+
case '<': return actual < threshold;
|
|
179
|
+
case '<=': return actual <= threshold;
|
|
180
|
+
case '==': return actual === threshold;
|
|
181
|
+
case '!=': return actual !== threshold;
|
|
182
|
+
default: return actual > threshold;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Find metrics relevant to a rule
|
|
187
|
+
*/
|
|
188
|
+
findRelevantMetrics(rule, metrics) {
|
|
189
|
+
// Extract metric name from expression (e.g., "aqe_quality_coverage_line" from expr)
|
|
190
|
+
const metricNameMatch = rule.expr.match(/([a-z_]+)/);
|
|
191
|
+
const metricName = metricNameMatch ? metricNameMatch[1] : '';
|
|
192
|
+
return metrics.filter(m => m.name.includes(metricName) ||
|
|
193
|
+
rule.expr.includes(m.name));
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Handle a firing alert
|
|
197
|
+
*/
|
|
198
|
+
handleFiringAlert(rule, metric, evaluation) {
|
|
199
|
+
const fingerprint = this.generateFingerprint(rule, metric);
|
|
200
|
+
// Check cooldown
|
|
201
|
+
if (this.isOnCooldown(fingerprint)) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// Check rate limiting
|
|
205
|
+
if (this.alertCountThisHour >= this.config.maxAlertsPerHour) {
|
|
206
|
+
this.emit('alert:suppressed', { reason: 'rate_limit', rule: rule.name });
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
// Check if already firing
|
|
210
|
+
if (this.activeAlerts.has(fingerprint)) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const alert = {
|
|
214
|
+
id: crypto.randomUUID(),
|
|
215
|
+
name: rule.name,
|
|
216
|
+
status: 'firing',
|
|
217
|
+
severity: rule.labels.severity,
|
|
218
|
+
labels: { ...rule.labels, ...metric.labels },
|
|
219
|
+
annotations: {
|
|
220
|
+
...rule.annotations,
|
|
221
|
+
actual_value: String(metric.value),
|
|
222
|
+
threshold: String(evaluation.threshold)
|
|
223
|
+
},
|
|
224
|
+
value: metric.value,
|
|
225
|
+
firedAt: new Date(),
|
|
226
|
+
fingerprint
|
|
227
|
+
};
|
|
228
|
+
this.activeAlerts.set(fingerprint, alert);
|
|
229
|
+
this.alertHistory.push(alert);
|
|
230
|
+
this.alertCountThisHour++;
|
|
231
|
+
this.cooldowns.set(fingerprint, new Date());
|
|
232
|
+
this.emit('alert:fired', alert);
|
|
233
|
+
// Trigger feedback loop if enabled
|
|
234
|
+
if (this.config.enableFeedbackLoop) {
|
|
235
|
+
setTimeout(() => {
|
|
236
|
+
this.emit('alert:feedback', {
|
|
237
|
+
alert,
|
|
238
|
+
feedbackAction: rule.labels.feedback_action,
|
|
239
|
+
strategy: rule.annotations.feedback_strategy,
|
|
240
|
+
targetAgent: rule.labels.agent_scope
|
|
241
|
+
});
|
|
242
|
+
}, this.config.feedbackDelay);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Handle alert resolution
|
|
247
|
+
*/
|
|
248
|
+
handleResolvedAlert(rule, metric) {
|
|
249
|
+
const fingerprint = this.generateFingerprint(rule, metric);
|
|
250
|
+
const existingAlert = this.activeAlerts.get(fingerprint);
|
|
251
|
+
if (existingAlert && existingAlert.status === 'firing') {
|
|
252
|
+
existingAlert.status = 'resolved';
|
|
253
|
+
existingAlert.resolvedAt = new Date();
|
|
254
|
+
this.activeAlerts.delete(fingerprint);
|
|
255
|
+
this.emit('alert:resolved', existingAlert);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Generate unique fingerprint for alert deduplication
|
|
260
|
+
*/
|
|
261
|
+
generateFingerprint(rule, metric) {
|
|
262
|
+
const data = `${rule.name}:${metric.name}:${JSON.stringify(metric.labels)}`;
|
|
263
|
+
return crypto.createHash('md5').update(data).digest('hex');
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Check if alert is on cooldown
|
|
267
|
+
*/
|
|
268
|
+
isOnCooldown(fingerprint) {
|
|
269
|
+
const lastFired = this.cooldowns.get(fingerprint);
|
|
270
|
+
if (!lastFired)
|
|
271
|
+
return false;
|
|
272
|
+
return Date.now() - lastFired.getTime() < this.config.cooldownPeriod;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Start periodic evaluation
|
|
276
|
+
*/
|
|
277
|
+
startEvaluation(metricsProvider) {
|
|
278
|
+
this.stopEvaluation();
|
|
279
|
+
this.evaluationTimer = setInterval(() => {
|
|
280
|
+
const metrics = metricsProvider();
|
|
281
|
+
this.evaluate(metrics);
|
|
282
|
+
}, this.config.evaluationInterval);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Stop periodic evaluation
|
|
286
|
+
*/
|
|
287
|
+
stopEvaluation() {
|
|
288
|
+
if (this.evaluationTimer) {
|
|
289
|
+
clearInterval(this.evaluationTimer);
|
|
290
|
+
this.evaluationTimer = undefined;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Start hourly counter reset
|
|
295
|
+
*/
|
|
296
|
+
startHourlyReset() {
|
|
297
|
+
this.hourlyResetTimer = setInterval(() => {
|
|
298
|
+
this.alertCountThisHour = 0;
|
|
299
|
+
}, 3600000); // 1 hour
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Get all active alerts
|
|
303
|
+
*/
|
|
304
|
+
getActiveAlerts() {
|
|
305
|
+
return Array.from(this.activeAlerts.values());
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get alert history
|
|
309
|
+
*/
|
|
310
|
+
getAlertHistory(limit = 100) {
|
|
311
|
+
return this.alertHistory.slice(-limit);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Get alert statistics
|
|
315
|
+
*/
|
|
316
|
+
getStats() {
|
|
317
|
+
const bySeverity = {
|
|
318
|
+
info: 0,
|
|
319
|
+
warning: 0,
|
|
320
|
+
error: 0,
|
|
321
|
+
critical: 0
|
|
322
|
+
};
|
|
323
|
+
for (const alert of Array.from(this.activeAlerts.values())) {
|
|
324
|
+
bySeverity[alert.severity]++;
|
|
325
|
+
}
|
|
326
|
+
return {
|
|
327
|
+
activeCount: this.activeAlerts.size,
|
|
328
|
+
totalFired: this.alertHistory.length,
|
|
329
|
+
bySeverity,
|
|
330
|
+
alertsThisHour: this.alertCountThisHour
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Cleanup resources
|
|
335
|
+
*/
|
|
336
|
+
destroy() {
|
|
337
|
+
this.stopEvaluation();
|
|
338
|
+
if (this.hourlyResetTimer) {
|
|
339
|
+
clearInterval(this.hourlyResetTimer);
|
|
340
|
+
}
|
|
341
|
+
this.removeAllListeners();
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
exports.AlertManager = AlertManager;
|
|
345
|
+
//# sourceMappingURL=AlertManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertManager.js","sourceRoot":"","sources":["../../src/alerting/AlertManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedbackRouter - Routes Alerts to Appropriate Actions
|
|
3
|
+
*
|
|
4
|
+
* Takes fired alerts and routes them to the appropriate feedback actions
|
|
5
|
+
* based on alert type, severity, and configured strategies.
|
|
6
|
+
*
|
|
7
|
+
* @module alerting/FeedbackRouter
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
import { EventEmitter } from 'events';
|
|
11
|
+
import { Alert, FeedbackEvent, Strategy } from './types';
|
|
12
|
+
/**
|
|
13
|
+
* Feedback routing configuration
|
|
14
|
+
*/
|
|
15
|
+
export interface FeedbackRouterConfig {
|
|
16
|
+
/** Default confidence threshold for auto-actions */
|
|
17
|
+
confidenceThreshold: number;
|
|
18
|
+
/** Enable automatic escalation for critical alerts */
|
|
19
|
+
autoEscalate: boolean;
|
|
20
|
+
/** Escalation delay in milliseconds */
|
|
21
|
+
escalationDelay: number;
|
|
22
|
+
/** Maximum retry attempts for failed actions */
|
|
23
|
+
maxRetries: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* FeedbackRouter routes alerts to feedback actions and strategies.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const router = new FeedbackRouter();
|
|
31
|
+
* router.on('feedback:generated', (event) => strategyApplicator.apply(event));
|
|
32
|
+
* router.route(alert);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class FeedbackRouter extends EventEmitter {
|
|
36
|
+
private config;
|
|
37
|
+
private strategies;
|
|
38
|
+
private feedbackHistory;
|
|
39
|
+
private pendingEscalations;
|
|
40
|
+
constructor(config?: Partial<FeedbackRouterConfig>);
|
|
41
|
+
/**
|
|
42
|
+
* Initialize default feedback strategies
|
|
43
|
+
*/
|
|
44
|
+
private initializeDefaultStrategies;
|
|
45
|
+
/**
|
|
46
|
+
* Register a custom strategy
|
|
47
|
+
*/
|
|
48
|
+
registerStrategy(strategy: Strategy): void;
|
|
49
|
+
/**
|
|
50
|
+
* Route an alert to appropriate feedback action
|
|
51
|
+
*/
|
|
52
|
+
route(alert: Alert): FeedbackEvent | null;
|
|
53
|
+
/**
|
|
54
|
+
* Determine feedback action based on alert labels
|
|
55
|
+
*/
|
|
56
|
+
private determineFeedbackAction;
|
|
57
|
+
/**
|
|
58
|
+
* Generate suggestions based on alert type
|
|
59
|
+
*/
|
|
60
|
+
private generateSuggestions;
|
|
61
|
+
/**
|
|
62
|
+
* Select best strategy for alert
|
|
63
|
+
*/
|
|
64
|
+
private selectStrategy;
|
|
65
|
+
/**
|
|
66
|
+
* Infer target agent from alert
|
|
67
|
+
*/
|
|
68
|
+
private inferTargetAgent;
|
|
69
|
+
/**
|
|
70
|
+
* Calculate overall confidence from suggestions
|
|
71
|
+
*/
|
|
72
|
+
private calculateConfidence;
|
|
73
|
+
/**
|
|
74
|
+
* Check if escalation is needed
|
|
75
|
+
*/
|
|
76
|
+
private shouldEscalate;
|
|
77
|
+
/**
|
|
78
|
+
* Schedule escalation for unresolved critical alerts
|
|
79
|
+
*/
|
|
80
|
+
private scheduleEscalation;
|
|
81
|
+
/**
|
|
82
|
+
* Cancel pending escalation (e.g., when alert resolves)
|
|
83
|
+
*/
|
|
84
|
+
cancelEscalation(alertId: string): void;
|
|
85
|
+
/**
|
|
86
|
+
* Get feedback history
|
|
87
|
+
*/
|
|
88
|
+
getFeedbackHistory(limit?: number): FeedbackEvent[];
|
|
89
|
+
/**
|
|
90
|
+
* Get all registered strategies
|
|
91
|
+
*/
|
|
92
|
+
getStrategies(): Strategy[];
|
|
93
|
+
/**
|
|
94
|
+
* Cleanup resources
|
|
95
|
+
*/
|
|
96
|
+
destroy(): void;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=FeedbackRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackRouter.d.ts","sourceRoot":"","sources":["../../src/alerting/FeedbackRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EACL,KAAK,EACL,aAAa,EAGb,QAAQ,EACT,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sDAAsD;IACtD,YAAY,EAAE,OAAO,CAAC;IACtB,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAkBD;;;;;;;;;GASG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,kBAAkB,CAA0C;gBAExD,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAMtD;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAgEnC;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAK1C;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,GAAG,IAAI;IAuCzC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuD3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQvC;;OAEG;IACH,kBAAkB,CAAC,KAAK,SAAM,GAAG,aAAa,EAAE;IAIhD;;OAEG;IACH,aAAa,IAAI,QAAQ,EAAE;IAI3B;;OAEG;IACH,OAAO,IAAI,IAAI;CAOhB"}
|