@marinoscar/platform-web 0.1.0-next.19 → 0.1.0-next.21
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 +21 -0
- package/README.md +5 -3
- package/dist/alerts/headless/client.d.ts +134 -0
- package/dist/alerts/headless/client.d.ts.map +1 -0
- package/dist/alerts/headless/client.js +105 -0
- package/dist/alerts/headless/client.js.map +1 -0
- package/dist/alerts/headless/format.d.ts +95 -0
- package/dist/alerts/headless/format.d.ts.map +1 -0
- package/dist/alerts/headless/format.js +164 -0
- package/dist/alerts/headless/format.js.map +1 -0
- package/dist/alerts/headless/hooks.d.ts +245 -0
- package/dist/alerts/headless/hooks.d.ts.map +1 -0
- package/dist/alerts/headless/hooks.js +315 -0
- package/dist/alerts/headless/hooks.js.map +1 -0
- package/dist/alerts/headless/index.d.ts +9 -0
- package/dist/alerts/headless/index.d.ts.map +1 -0
- package/dist/alerts/headless/index.js +9 -0
- package/dist/alerts/headless/index.js.map +1 -0
- package/dist/alerts/headless/rule-draft.d.ts +175 -0
- package/dist/alerts/headless/rule-draft.d.ts.map +1 -0
- package/dist/alerts/headless/rule-draft.js +261 -0
- package/dist/alerts/headless/rule-draft.js.map +1 -0
- package/dist/alerts/ui/AlertIncidentDrawer.d.ts +30 -0
- package/dist/alerts/ui/AlertIncidentDrawer.d.ts.map +1 -0
- package/dist/alerts/ui/AlertIncidentDrawer.js +33 -0
- package/dist/alerts/ui/AlertIncidentDrawer.js.map +1 -0
- package/dist/alerts/ui/AlertRuleDialog.d.ts +47 -0
- package/dist/alerts/ui/AlertRuleDialog.d.ts.map +1 -0
- package/dist/alerts/ui/AlertRuleDialog.js +124 -0
- package/dist/alerts/ui/AlertRuleDialog.js.map +1 -0
- package/dist/alerts/ui/AlertRuleTestResult.d.ts +23 -0
- package/dist/alerts/ui/AlertRuleTestResult.d.ts.map +1 -0
- package/dist/alerts/ui/AlertRuleTestResult.js +30 -0
- package/dist/alerts/ui/AlertRuleTestResult.js.map +1 -0
- package/dist/alerts/ui/AlertsPage.d.ts +41 -0
- package/dist/alerts/ui/AlertsPage.d.ts.map +1 -0
- package/dist/alerts/ui/AlertsPage.js +238 -0
- package/dist/alerts/ui/AlertsPage.js.map +1 -0
- package/dist/alerts/ui/FiringAlertsBanner.d.ts +28 -0
- package/dist/alerts/ui/FiringAlertsBanner.d.ts.map +1 -0
- package/dist/alerts/ui/FiringAlertsBanner.js +45 -0
- package/dist/alerts/ui/FiringAlertsBanner.js.map +1 -0
- package/dist/alerts/ui/copy.d.ts +15 -0
- package/dist/alerts/ui/copy.d.ts.map +1 -0
- package/dist/alerts/ui/copy.js +14 -0
- package/dist/alerts/ui/copy.js.map +1 -0
- package/dist/alerts/ui/index.d.ts +14 -0
- package/dist/alerts/ui/index.d.ts.map +1 -0
- package/dist/alerts/ui/index.js +12 -0
- package/dist/alerts/ui/index.js.map +1 -0
- package/dist/alerts/ui/parts.d.ts +26 -0
- package/dist/alerts/ui/parts.d.ts.map +1 -0
- package/dist/alerts/ui/parts.js +27 -0
- package/dist/alerts/ui/parts.js.map +1 -0
- package/dist/alerts/ui/settings.d.ts +27 -0
- package/dist/alerts/ui/settings.d.ts.map +1 -0
- package/dist/alerts/ui/settings.js +37 -0
- package/dist/alerts/ui/settings.js.map +1 -0
- package/dist/nodes/headless/api.d.ts +3 -1
- package/dist/nodes/headless/api.d.ts.map +1 -1
- package/dist/nodes/headless/api.js +22 -0
- package/dist/nodes/headless/api.js.map +1 -1
- package/dist/nodes/headless/index.d.ts +7 -2
- package/dist/nodes/headless/index.d.ts.map +1 -1
- package/dist/nodes/headless/index.js +4 -1
- package/dist/nodes/headless/index.js.map +1 -1
- package/dist/nodes/headless/node-events.d.ts +43 -0
- package/dist/nodes/headless/node-events.d.ts.map +1 -0
- package/dist/nodes/headless/node-events.js +150 -0
- package/dist/nodes/headless/node-events.js.map +1 -0
- package/dist/nodes/headless/power.d.ts +43 -0
- package/dist/nodes/headless/power.d.ts.map +1 -0
- package/dist/nodes/headless/power.js +74 -0
- package/dist/nodes/headless/power.js.map +1 -0
- package/dist/nodes/headless/types.d.ts +40 -3
- package/dist/nodes/headless/types.d.ts.map +1 -1
- package/dist/nodes/headless/types.js +1 -1
- package/dist/nodes/headless/types.js.map +1 -1
- package/dist/nodes/headless/use-node-events.d.ts +59 -0
- package/dist/nodes/headless/use-node-events.d.ts.map +1 -0
- package/dist/nodes/headless/use-node-events.js +159 -0
- package/dist/nodes/headless/use-node-events.js.map +1 -0
- package/dist/nodes/ui/NodeEventsTimeline.d.ts +39 -0
- package/dist/nodes/ui/NodeEventsTimeline.d.ts.map +1 -0
- package/dist/nodes/ui/NodeEventsTimeline.js +63 -0
- package/dist/nodes/ui/NodeEventsTimeline.js.map +1 -0
- package/dist/nodes/ui/NodePowerBadge.d.ts +27 -0
- package/dist/nodes/ui/NodePowerBadge.d.ts.map +1 -0
- package/dist/nodes/ui/NodePowerBadge.js +48 -0
- package/dist/nodes/ui/NodePowerBadge.js.map +1 -0
- package/dist/nodes/ui/NodeVitalsDialog.d.ts +11 -1
- package/dist/nodes/ui/NodeVitalsDialog.d.ts.map +1 -1
- package/dist/nodes/ui/NodeVitalsDialog.js +14 -5
- package/dist/nodes/ui/NodeVitalsDialog.js.map +1 -1
- package/dist/nodes/ui/WorkersPage.d.ts.map +1 -1
- package/dist/nodes/ui/WorkersPage.js +2 -1
- package/dist/nodes/ui/WorkersPage.js.map +1 -1
- package/dist/nodes/ui/workerVitals.d.ts +17 -1
- package/dist/nodes/ui/workerVitals.d.ts.map +1 -1
- package/dist/nodes/ui/workerVitals.js +43 -0
- package/dist/nodes/ui/workerVitals.js.map +1 -1
- package/dist/nodes/ui/workersTable.d.ts.map +1 -1
- package/dist/nodes/ui/workersTable.js +2 -1
- package/dist/nodes/ui/workersTable.js.map +1 -1
- package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts +1 -1
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts +11 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts.map +1 -1
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js +17 -2
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js.map +1 -1
- package/dist/webhooks/headless/client.d.ts +101 -0
- package/dist/webhooks/headless/client.d.ts.map +1 -0
- package/dist/webhooks/headless/client.js +105 -0
- package/dist/webhooks/headless/client.js.map +1 -0
- package/dist/webhooks/headless/event-selection.d.ts +119 -0
- package/dist/webhooks/headless/event-selection.d.ts.map +1 -0
- package/dist/webhooks/headless/event-selection.js +225 -0
- package/dist/webhooks/headless/event-selection.js.map +1 -0
- package/dist/webhooks/headless/format.d.ts +84 -0
- package/dist/webhooks/headless/format.d.ts.map +1 -0
- package/dist/webhooks/headless/format.js +142 -0
- package/dist/webhooks/headless/format.js.map +1 -0
- package/dist/webhooks/headless/hooks.d.ts +199 -0
- package/dist/webhooks/headless/hooks.d.ts.map +1 -0
- package/dist/webhooks/headless/hooks.js +249 -0
- package/dist/webhooks/headless/hooks.js.map +1 -0
- package/dist/webhooks/headless/index.d.ts +9 -0
- package/dist/webhooks/headless/index.d.ts.map +1 -0
- package/dist/webhooks/headless/index.js +9 -0
- package/dist/webhooks/headless/index.js.map +1 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.d.ts +32 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.js +64 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.js.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.d.ts +21 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.js +96 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.js.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.d.ts +39 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.js +79 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.js.map +1 -0
- package/dist/webhooks/ui/WebhookEventPicker.d.ts +30 -0
- package/dist/webhooks/ui/WebhookEventPicker.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookEventPicker.js +33 -0
- package/dist/webhooks/ui/WebhookEventPicker.js.map +1 -0
- package/dist/webhooks/ui/WebhookSecretDialog.d.ts +27 -0
- package/dist/webhooks/ui/WebhookSecretDialog.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookSecretDialog.js +52 -0
- package/dist/webhooks/ui/WebhookSecretDialog.js.map +1 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.d.ts +18 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.js +40 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.js.map +1 -0
- package/dist/webhooks/ui/WebhooksPage.d.ts +47 -0
- package/dist/webhooks/ui/WebhooksPage.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhooksPage.js +172 -0
- package/dist/webhooks/ui/WebhooksPage.js.map +1 -0
- package/dist/webhooks/ui/copy.d.ts +24 -0
- package/dist/webhooks/ui/copy.d.ts.map +1 -0
- package/dist/webhooks/ui/copy.js +34 -0
- package/dist/webhooks/ui/copy.js.map +1 -0
- package/dist/webhooks/ui/index.d.ts +15 -0
- package/dist/webhooks/ui/index.d.ts.map +1 -0
- package/dist/webhooks/ui/index.js +12 -0
- package/dist/webhooks/ui/index.js.map +1 -0
- package/dist/webhooks/ui/parts.d.ts +25 -0
- package/dist/webhooks/ui/parts.d.ts.map +1 -0
- package/dist/webhooks/ui/parts.js +28 -0
- package/dist/webhooks/ui/parts.js.map +1 -0
- package/dist/webhooks/ui/settings.d.ts +58 -0
- package/dist/webhooks/ui/settings.d.ts.map +1 -0
- package/dist/webhooks/ui/settings.js +79 -0
- package/dist/webhooks/ui/settings.js.map +1 -0
- package/package.json +18 -2
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import type { AlertAggregation, AlertComparator, AlertFilterOp, AlertRule, AlertSeverity, CreateAlertRule, UpdateAlertRule } from '@marinoscar/platform-contract/alerts';
|
|
2
|
+
/**
|
|
3
|
+
* One key and value pair of the editor (event attributes).
|
|
4
|
+
*
|
|
5
|
+
* @stability experimental
|
|
6
|
+
*/
|
|
7
|
+
export interface AlertAttrDraft {
|
|
8
|
+
/** The attribute name. */
|
|
9
|
+
key: string;
|
|
10
|
+
/** The value, compared as text by the API. */
|
|
11
|
+
value: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The `metric_threshold` part of a draft.
|
|
15
|
+
*
|
|
16
|
+
* @stability experimental
|
|
17
|
+
*/
|
|
18
|
+
export interface MetricThresholdDraft {
|
|
19
|
+
/** The metric or table name. */
|
|
20
|
+
metric: string;
|
|
21
|
+
/** How the window's points are reduced. */
|
|
22
|
+
aggregation: AlertAggregation;
|
|
23
|
+
/** The window, in seconds. */
|
|
24
|
+
windowSeconds: number;
|
|
25
|
+
/** How the value is compared. */
|
|
26
|
+
comparator: AlertComparator;
|
|
27
|
+
/** The threshold as typed (parsed when the payload is built). */
|
|
28
|
+
threshold: string;
|
|
29
|
+
/** Attribute columns to group by. */
|
|
30
|
+
groupBy: string[];
|
|
31
|
+
/** Attribute filters. */
|
|
32
|
+
filters: Array<{
|
|
33
|
+
/** The attribute (column) to compare. */
|
|
34
|
+
attr: string;
|
|
35
|
+
/** `eq` or `neq`. */
|
|
36
|
+
op: AlertFilterOp;
|
|
37
|
+
/** The value, compared as text. */
|
|
38
|
+
value: string;
|
|
39
|
+
}>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The `node_event` part of a draft.
|
|
43
|
+
*
|
|
44
|
+
* @stability experimental
|
|
45
|
+
*/
|
|
46
|
+
export interface NodeEventDraft {
|
|
47
|
+
/** Event types (or a `prefix.*`). */
|
|
48
|
+
eventTypes: string[];
|
|
49
|
+
/** The least severity that counts; `''` for any. */
|
|
50
|
+
minSeverity: AlertSeverity | '';
|
|
51
|
+
/** Only these node ids; empty for every node. */
|
|
52
|
+
nodeIds: string[];
|
|
53
|
+
/** Attributes the event must carry. */
|
|
54
|
+
attrs: AlertAttrDraft[];
|
|
55
|
+
/** Event types that resolve the incident; empty for none. */
|
|
56
|
+
recoveryEventTypes: string[];
|
|
57
|
+
/** Attributes the recovery event must carry. */
|
|
58
|
+
recoveryAttrs: AlertAttrDraft[];
|
|
59
|
+
/** Seconds until an incident resolves on its own. */
|
|
60
|
+
resolveAfterSeconds: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The editor's state for one rule.
|
|
64
|
+
*
|
|
65
|
+
* @stability experimental
|
|
66
|
+
*/
|
|
67
|
+
export interface AlertRuleDraft {
|
|
68
|
+
/** The rule name. */
|
|
69
|
+
name: string;
|
|
70
|
+
/** The description; `''` for none. */
|
|
71
|
+
description: string;
|
|
72
|
+
/** Whether the rule is evaluated. */
|
|
73
|
+
enabled: boolean;
|
|
74
|
+
/** The kind id (fixed once the rule exists). */
|
|
75
|
+
kind: string;
|
|
76
|
+
/** The severity of its incidents. */
|
|
77
|
+
severity: AlertSeverity;
|
|
78
|
+
/** Seconds the condition must hold before firing. */
|
|
79
|
+
forSeconds: number;
|
|
80
|
+
/** Minimum seconds between two fires of the same labels. */
|
|
81
|
+
cooldownSeconds: number;
|
|
82
|
+
/** Notification channel ids; empty for every channel. */
|
|
83
|
+
notifyChannels: string[];
|
|
84
|
+
/** Whether webhooks are also emitted. */
|
|
85
|
+
webhook: boolean;
|
|
86
|
+
/** The `metric_threshold` config. */
|
|
87
|
+
metric: MetricThresholdDraft;
|
|
88
|
+
/** The `node_event` config. */
|
|
89
|
+
nodeEvent: NodeEventDraft;
|
|
90
|
+
/** The `verdict` config. */
|
|
91
|
+
verdict: {
|
|
92
|
+
/** The least verdict level that fires. */
|
|
93
|
+
minLevel: 'degraded' | 'critical';
|
|
94
|
+
};
|
|
95
|
+
/** The config of a kind the editor has no form for, as JSON text. */
|
|
96
|
+
rawConfig: string;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* The result of {@link buildAlertRulePayload}: the body, or the field errors.
|
|
100
|
+
*
|
|
101
|
+
* @stability experimental
|
|
102
|
+
*/
|
|
103
|
+
export type AlertRulePayloadResult<T> = {
|
|
104
|
+
/** The draft is valid. */
|
|
105
|
+
ok: true;
|
|
106
|
+
/** The request body. */
|
|
107
|
+
value: T;
|
|
108
|
+
} | {
|
|
109
|
+
/** The draft is not valid. */
|
|
110
|
+
ok: false;
|
|
111
|
+
/** One sentence per field (`name`, `metric`, `threshold`, `eventTypes`, `config`, ...). */
|
|
112
|
+
errors: Record<string, string>;
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* The kinds the editor has a dedicated form for. Any other kind (an app's
|
|
116
|
+
* own, registered with `registerAlertRuleKind`) is edited as JSON.
|
|
117
|
+
*
|
|
118
|
+
* @stability experimental
|
|
119
|
+
*/
|
|
120
|
+
export declare const ALERT_FORM_KINDS: readonly string[];
|
|
121
|
+
/**
|
|
122
|
+
* Whether a kind takes no configuration (`node_offline`, `telemetry_unavailable`).
|
|
123
|
+
*
|
|
124
|
+
* @param kind - the kind id.
|
|
125
|
+
* @returns `true` when the config is always `{}`.
|
|
126
|
+
*
|
|
127
|
+
* @stability experimental
|
|
128
|
+
*/
|
|
129
|
+
export declare function alertKindHasNoConfig(kind: string): boolean;
|
|
130
|
+
/**
|
|
131
|
+
* A blank draft of a kind, with the API's defaults.
|
|
132
|
+
*
|
|
133
|
+
* @param kind - the kind id; default `metric_threshold`.
|
|
134
|
+
* @returns the draft.
|
|
135
|
+
*
|
|
136
|
+
* @stability experimental
|
|
137
|
+
*/
|
|
138
|
+
export declare function emptyAlertRuleDraft(kind?: string): AlertRuleDraft;
|
|
139
|
+
/**
|
|
140
|
+
* The draft of an existing rule, its config spread into the kind's form.
|
|
141
|
+
*
|
|
142
|
+
* @param rule - the rule as the API returned it.
|
|
143
|
+
* @returns the draft.
|
|
144
|
+
*
|
|
145
|
+
* @stability experimental
|
|
146
|
+
*/
|
|
147
|
+
export declare function alertRuleDraftFromRule(rule: AlertRule): AlertRuleDraft;
|
|
148
|
+
/**
|
|
149
|
+
* The config of a draft's kind, checked against the contract's schema.
|
|
150
|
+
*
|
|
151
|
+
* @param draft - the editor state.
|
|
152
|
+
* @returns the config, or the field errors.
|
|
153
|
+
*
|
|
154
|
+
* @stability experimental
|
|
155
|
+
*/
|
|
156
|
+
export declare function buildAlertRuleConfig(draft: AlertRuleDraft): AlertRulePayloadResult<Record<string, unknown>>;
|
|
157
|
+
/**
|
|
158
|
+
* The request body of a draft: `create` for a new rule (with the kind),
|
|
159
|
+
* `update` for an existing one (every editable field, never the kind).
|
|
160
|
+
*
|
|
161
|
+
* @param draft - the editor state.
|
|
162
|
+
* @param mode - `create` or `update`.
|
|
163
|
+
* @returns the body, or the field errors.
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```ts
|
|
167
|
+
* const result = buildAlertRulePayload(draft, 'create');
|
|
168
|
+
* if (result.ok) await alerts.createRule(result.value);
|
|
169
|
+
* ```
|
|
170
|
+
*
|
|
171
|
+
* @stability experimental
|
|
172
|
+
*/
|
|
173
|
+
export declare function buildAlertRulePayload(draft: AlertRuleDraft, mode: 'create'): AlertRulePayloadResult<CreateAlertRule>;
|
|
174
|
+
export declare function buildAlertRulePayload(draft: AlertRuleDraft, mode: 'update'): AlertRulePayloadResult<UpdateAlertRule>;
|
|
175
|
+
//# sourceMappingURL=rule-draft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-draft.d.ts","sourceRoot":"","sources":["../../../src/alerts/headless/rule-draft.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// The rule editor's model (issue #1047): a form draft and the payload it builds
|
|
3
|
+
// =============================================================================
|
|
4
|
+
//
|
|
5
|
+
// The editor edits a flat, string-friendly DRAFT; `buildAlertRulePayload`
|
|
6
|
+
// turns it into the wire body (`CreateAlertRule` / `UpdateAlertRule`) with the
|
|
7
|
+
// kind's config, checked against the contract's schemas so a field error is
|
|
8
|
+
// shown before the request. The API validates again and decides: this check
|
|
9
|
+
// only spares a round trip.
|
|
10
|
+
// =============================================================================
|
|
11
|
+
import { ALERT_COOLDOWN_SECONDS_DEFAULT, ALERT_KIND_IDS, ALERT_NODE_EVENT_RESOLVE_AFTER_DEFAULT, createAlertRuleSchema, emptyAlertConfigSchema, metricThresholdConfigSchema, nodeEventConfigSchema, verdictConfigSchema, } from '@marinoscar/platform-contract/alerts';
|
|
12
|
+
/**
|
|
13
|
+
* The kinds the editor has a dedicated form for. Any other kind (an app's
|
|
14
|
+
* own, registered with `registerAlertRuleKind`) is edited as JSON.
|
|
15
|
+
*
|
|
16
|
+
* @stability experimental
|
|
17
|
+
*/
|
|
18
|
+
export const ALERT_FORM_KINDS = Object.freeze([
|
|
19
|
+
ALERT_KIND_IDS.METRIC_THRESHOLD,
|
|
20
|
+
ALERT_KIND_IDS.NODE_EVENT,
|
|
21
|
+
ALERT_KIND_IDS.VERDICT,
|
|
22
|
+
ALERT_KIND_IDS.NODE_OFFLINE,
|
|
23
|
+
ALERT_KIND_IDS.TELEMETRY_UNAVAILABLE,
|
|
24
|
+
]);
|
|
25
|
+
/** Kinds whose config is always `{}`. */
|
|
26
|
+
const EMPTY_CONFIG_KINDS = new Set([ALERT_KIND_IDS.NODE_OFFLINE, ALERT_KIND_IDS.TELEMETRY_UNAVAILABLE]);
|
|
27
|
+
/**
|
|
28
|
+
* Whether a kind takes no configuration (`node_offline`, `telemetry_unavailable`).
|
|
29
|
+
*
|
|
30
|
+
* @param kind - the kind id.
|
|
31
|
+
* @returns `true` when the config is always `{}`.
|
|
32
|
+
*
|
|
33
|
+
* @stability experimental
|
|
34
|
+
*/
|
|
35
|
+
export function alertKindHasNoConfig(kind) {
|
|
36
|
+
return EMPTY_CONFIG_KINDS.has(kind);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A blank draft of a kind, with the API's defaults.
|
|
40
|
+
*
|
|
41
|
+
* @param kind - the kind id; default `metric_threshold`.
|
|
42
|
+
* @returns the draft.
|
|
43
|
+
*
|
|
44
|
+
* @stability experimental
|
|
45
|
+
*/
|
|
46
|
+
export function emptyAlertRuleDraft(kind = ALERT_KIND_IDS.METRIC_THRESHOLD) {
|
|
47
|
+
return {
|
|
48
|
+
name: '',
|
|
49
|
+
description: '',
|
|
50
|
+
enabled: false,
|
|
51
|
+
kind,
|
|
52
|
+
severity: 'warning',
|
|
53
|
+
forSeconds: 0,
|
|
54
|
+
cooldownSeconds: ALERT_COOLDOWN_SECONDS_DEFAULT,
|
|
55
|
+
notifyChannels: [],
|
|
56
|
+
webhook: true,
|
|
57
|
+
metric: {
|
|
58
|
+
metric: '',
|
|
59
|
+
aggregation: 'avg',
|
|
60
|
+
windowSeconds: 300,
|
|
61
|
+
comparator: 'gt',
|
|
62
|
+
threshold: '',
|
|
63
|
+
groupBy: [],
|
|
64
|
+
filters: [],
|
|
65
|
+
},
|
|
66
|
+
nodeEvent: {
|
|
67
|
+
eventTypes: [],
|
|
68
|
+
minSeverity: '',
|
|
69
|
+
nodeIds: [],
|
|
70
|
+
attrs: [],
|
|
71
|
+
recoveryEventTypes: [],
|
|
72
|
+
recoveryAttrs: [],
|
|
73
|
+
resolveAfterSeconds: ALERT_NODE_EVENT_RESOLVE_AFTER_DEFAULT,
|
|
74
|
+
},
|
|
75
|
+
verdict: { minLevel: 'critical' },
|
|
76
|
+
rawConfig: '{}',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function strings(value) {
|
|
80
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
|
|
81
|
+
}
|
|
82
|
+
function attrsOf(value) {
|
|
83
|
+
if (!value || typeof value !== 'object')
|
|
84
|
+
return [];
|
|
85
|
+
return Object.entries(value).map(([key, raw]) => ({ key, value: String(raw) }));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* The draft of an existing rule, its config spread into the kind's form.
|
|
89
|
+
*
|
|
90
|
+
* @param rule - the rule as the API returned it.
|
|
91
|
+
* @returns the draft.
|
|
92
|
+
*
|
|
93
|
+
* @stability experimental
|
|
94
|
+
*/
|
|
95
|
+
export function alertRuleDraftFromRule(rule) {
|
|
96
|
+
const draft = emptyAlertRuleDraft(rule.kind);
|
|
97
|
+
const config = rule.config;
|
|
98
|
+
draft.name = rule.name;
|
|
99
|
+
draft.description = rule.description ?? '';
|
|
100
|
+
draft.enabled = rule.enabled;
|
|
101
|
+
draft.severity = rule.severity;
|
|
102
|
+
draft.forSeconds = rule.forSeconds;
|
|
103
|
+
draft.cooldownSeconds = rule.cooldownSeconds;
|
|
104
|
+
draft.notifyChannels = [...rule.notifyChannels];
|
|
105
|
+
draft.webhook = rule.webhook;
|
|
106
|
+
draft.rawConfig = JSON.stringify(config, null, 2);
|
|
107
|
+
if (rule.kind === ALERT_KIND_IDS.METRIC_THRESHOLD) {
|
|
108
|
+
const filters = Array.isArray(config['filters']) ? config['filters'] : [];
|
|
109
|
+
draft.metric = {
|
|
110
|
+
metric: typeof config['metric'] === 'string' ? config['metric'] : '',
|
|
111
|
+
aggregation: config['aggregation'] ?? 'avg',
|
|
112
|
+
windowSeconds: typeof config['windowSeconds'] === 'number' ? config['windowSeconds'] : 300,
|
|
113
|
+
comparator: config['comparator'] ?? 'gt',
|
|
114
|
+
threshold: typeof config['threshold'] === 'number' ? String(config['threshold']) : '',
|
|
115
|
+
groupBy: strings(config['groupBy']),
|
|
116
|
+
filters: filters.map((filter) => ({
|
|
117
|
+
attr: String(filter['attr'] ?? ''),
|
|
118
|
+
op: filter['op'] === 'neq' ? 'neq' : 'eq',
|
|
119
|
+
value: String(filter['value'] ?? ''),
|
|
120
|
+
})),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
else if (rule.kind === ALERT_KIND_IDS.NODE_EVENT) {
|
|
124
|
+
const recovery = (config['recovery'] ?? null);
|
|
125
|
+
draft.nodeEvent = {
|
|
126
|
+
eventTypes: strings(config['eventTypes']),
|
|
127
|
+
minSeverity: config['minSeverity'] ?? '',
|
|
128
|
+
nodeIds: strings(config['nodeIds']),
|
|
129
|
+
attrs: attrsOf(config['attrs']),
|
|
130
|
+
recoveryEventTypes: recovery ? strings(recovery['eventTypes']) : [],
|
|
131
|
+
recoveryAttrs: recovery ? attrsOf(recovery['attrs']) : [],
|
|
132
|
+
resolveAfterSeconds: typeof config['resolveAfterSeconds'] === 'number' ? config['resolveAfterSeconds'] : ALERT_NODE_EVENT_RESOLVE_AFTER_DEFAULT,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
else if (rule.kind === ALERT_KIND_IDS.VERDICT) {
|
|
136
|
+
draft.verdict = { minLevel: config['minLevel'] === 'degraded' ? 'degraded' : 'critical' };
|
|
137
|
+
}
|
|
138
|
+
return draft;
|
|
139
|
+
}
|
|
140
|
+
function attrsRecord(attrs) {
|
|
141
|
+
const entries = attrs.filter((attr) => attr.key.trim() !== '').map((attr) => [attr.key.trim(), attr.value]);
|
|
142
|
+
return entries.length === 0 ? undefined : Object.fromEntries(entries);
|
|
143
|
+
}
|
|
144
|
+
/** Field names the config's zod issues map onto, by their first path segment. */
|
|
145
|
+
function issueErrors(issues) {
|
|
146
|
+
const errors = {};
|
|
147
|
+
for (const issue of issues) {
|
|
148
|
+
const field = issue.path.length > 0 ? String(issue.path[0]) : 'config';
|
|
149
|
+
errors[field] ??= issue.message;
|
|
150
|
+
}
|
|
151
|
+
return errors;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* The config of a draft's kind, checked against the contract's schema.
|
|
155
|
+
*
|
|
156
|
+
* @param draft - the editor state.
|
|
157
|
+
* @returns the config, or the field errors.
|
|
158
|
+
*
|
|
159
|
+
* @stability experimental
|
|
160
|
+
*/
|
|
161
|
+
export function buildAlertRuleConfig(draft) {
|
|
162
|
+
if (draft.kind === ALERT_KIND_IDS.METRIC_THRESHOLD) {
|
|
163
|
+
const m = draft.metric;
|
|
164
|
+
const thresholdText = m.threshold.trim();
|
|
165
|
+
const threshold = thresholdText === '' ? Number.NaN : Number(thresholdText);
|
|
166
|
+
const filters = m.filters.filter((filter) => filter.attr.trim() !== '');
|
|
167
|
+
const config = {
|
|
168
|
+
metric: m.metric.trim(),
|
|
169
|
+
aggregation: m.aggregation,
|
|
170
|
+
windowSeconds: m.windowSeconds,
|
|
171
|
+
comparator: m.comparator,
|
|
172
|
+
threshold,
|
|
173
|
+
...(m.groupBy.length > 0 ? { groupBy: m.groupBy } : {}),
|
|
174
|
+
...(filters.length > 0 ? { filters: filters.map((f) => ({ attr: f.attr.trim(), op: f.op, value: f.value })) } : {}),
|
|
175
|
+
};
|
|
176
|
+
const errors = {};
|
|
177
|
+
if (config.metric === '')
|
|
178
|
+
errors['metric'] = 'Choose a metric.';
|
|
179
|
+
if (!Number.isFinite(threshold))
|
|
180
|
+
errors['threshold'] = 'Enter a number.';
|
|
181
|
+
const parsed = metricThresholdConfigSchema.safeParse(config);
|
|
182
|
+
if (!parsed.success)
|
|
183
|
+
Object.assign(errors, { ...issueErrors(parsed.error.issues), ...errors });
|
|
184
|
+
return Object.keys(errors).length > 0 ? { ok: false, errors } : { ok: true, value: config };
|
|
185
|
+
}
|
|
186
|
+
if (draft.kind === ALERT_KIND_IDS.NODE_EVENT) {
|
|
187
|
+
const n = draft.nodeEvent;
|
|
188
|
+
const attrs = attrsRecord(n.attrs);
|
|
189
|
+
const recoveryAttrs = attrsRecord(n.recoveryAttrs);
|
|
190
|
+
const config = {
|
|
191
|
+
eventTypes: n.eventTypes,
|
|
192
|
+
...(n.minSeverity ? { minSeverity: n.minSeverity } : {}),
|
|
193
|
+
...(n.nodeIds.length > 0 ? { nodeIds: n.nodeIds } : {}),
|
|
194
|
+
...(attrs ? { attrs } : {}),
|
|
195
|
+
...(n.recoveryEventTypes.length > 0
|
|
196
|
+
? { recovery: { eventTypes: n.recoveryEventTypes, ...(recoveryAttrs ? { attrs: recoveryAttrs } : {}) } }
|
|
197
|
+
: {}),
|
|
198
|
+
resolveAfterSeconds: n.resolveAfterSeconds,
|
|
199
|
+
};
|
|
200
|
+
const errors = {};
|
|
201
|
+
if (n.eventTypes.length === 0)
|
|
202
|
+
errors['eventTypes'] = 'Choose at least one event type.';
|
|
203
|
+
const parsed = nodeEventConfigSchema.safeParse(config);
|
|
204
|
+
if (!parsed.success)
|
|
205
|
+
Object.assign(errors, { ...issueErrors(parsed.error.issues), ...errors });
|
|
206
|
+
return Object.keys(errors).length > 0 ? { ok: false, errors } : { ok: true, value: config };
|
|
207
|
+
}
|
|
208
|
+
if (draft.kind === ALERT_KIND_IDS.VERDICT) {
|
|
209
|
+
const config = { minLevel: draft.verdict.minLevel };
|
|
210
|
+
const parsed = verdictConfigSchema.safeParse(config);
|
|
211
|
+
return parsed.success ? { ok: true, value: config } : { ok: false, errors: issueErrors(parsed.error.issues) };
|
|
212
|
+
}
|
|
213
|
+
if (alertKindHasNoConfig(draft.kind)) {
|
|
214
|
+
const parsed = emptyAlertConfigSchema.safeParse({});
|
|
215
|
+
return parsed.success ? { ok: true, value: {} } : { ok: false, errors: { config: 'Invalid configuration.' } };
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const value = JSON.parse(draft.rawConfig === '' ? '{}' : draft.rawConfig);
|
|
219
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
220
|
+
return { ok: false, errors: { config: 'The configuration must be a JSON object.' } };
|
|
221
|
+
}
|
|
222
|
+
return { ok: true, value: value };
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return { ok: false, errors: { config: 'The configuration is not valid JSON.' } };
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
export function buildAlertRulePayload(draft, mode) {
|
|
229
|
+
const errors = {};
|
|
230
|
+
const config = buildAlertRuleConfig(draft);
|
|
231
|
+
if (!config.ok)
|
|
232
|
+
Object.assign(errors, config.errors);
|
|
233
|
+
const name = draft.name.trim();
|
|
234
|
+
if (name === '')
|
|
235
|
+
errors['name'] = 'Enter a name.';
|
|
236
|
+
if (!Number.isInteger(draft.forSeconds) || draft.forSeconds < 0)
|
|
237
|
+
errors['forSeconds'] = 'Enter whole seconds, 0 or more.';
|
|
238
|
+
if (!Number.isInteger(draft.cooldownSeconds) || draft.cooldownSeconds < 0) {
|
|
239
|
+
errors['cooldownSeconds'] = 'Enter whole seconds, 0 or more.';
|
|
240
|
+
}
|
|
241
|
+
const common = {
|
|
242
|
+
name,
|
|
243
|
+
description: draft.description.trim() === '' ? null : draft.description.trim(),
|
|
244
|
+
enabled: draft.enabled,
|
|
245
|
+
severity: draft.severity,
|
|
246
|
+
config: config.ok ? config.value : {},
|
|
247
|
+
forSeconds: draft.forSeconds,
|
|
248
|
+
cooldownSeconds: draft.cooldownSeconds,
|
|
249
|
+
notifyChannels: draft.notifyChannels,
|
|
250
|
+
webhook: draft.webhook,
|
|
251
|
+
};
|
|
252
|
+
if (Object.keys(errors).length === 0) {
|
|
253
|
+
const parsed = createAlertRuleSchema.safeParse({ ...common, kind: draft.kind });
|
|
254
|
+
if (!parsed.success)
|
|
255
|
+
Object.assign(errors, issueErrors(parsed.error.issues));
|
|
256
|
+
}
|
|
257
|
+
if (Object.keys(errors).length > 0)
|
|
258
|
+
return { ok: false, errors };
|
|
259
|
+
return { ok: true, value: mode === 'create' ? { ...common, kind: draft.kind } : common };
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=rule-draft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-draft.js","sourceRoot":"","sources":["../../../src/alerts/headless/rule-draft.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { AlertIncident } from '@marinoscar/platform-contract/alerts';
|
|
3
|
+
/**
|
|
4
|
+
* Props of {@link AlertIncidentDrawer}.
|
|
5
|
+
*
|
|
6
|
+
* @stability experimental
|
|
7
|
+
*/
|
|
8
|
+
export interface AlertIncidentDrawerProps {
|
|
9
|
+
/** The incident to show; `null` closes the drawer. */
|
|
10
|
+
incidentId: string | null;
|
|
11
|
+
/** Whether the viewer holds `alerts:write` (draws Acknowledge). */
|
|
12
|
+
canWrite: boolean;
|
|
13
|
+
/** Acknowledges the incident; resolves with the updated incident, or `null` when refused. */
|
|
14
|
+
onAcknowledge: (incident: AlertIncident) => Promise<AlertIncident | null>;
|
|
15
|
+
/** Whether an acknowledge is in flight. */
|
|
16
|
+
acknowledging?: boolean;
|
|
17
|
+
/** Closes the drawer. */
|
|
18
|
+
onClose: () => void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The incident detail drawer.
|
|
22
|
+
*
|
|
23
|
+
* @param props - see {@link AlertIncidentDrawerProps}.
|
|
24
|
+
* @returns the drawer.
|
|
25
|
+
*
|
|
26
|
+
* @extensionPoint component
|
|
27
|
+
* @stability experimental
|
|
28
|
+
*/
|
|
29
|
+
export declare function AlertIncidentDrawer({ incidentId, canWrite, onAcknowledge, acknowledging, onClose }: AlertIncidentDrawerProps): ReactElement;
|
|
30
|
+
//# sourceMappingURL=AlertIncidentDrawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertIncidentDrawer.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/AlertIncidentDrawer.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,OAAO,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAK1E;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,sDAAsD;IACtD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC1E,2CAA2C;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yBAAyB;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAeD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAqB,EAAE,OAAO,EAAE,EAAE,wBAAwB,GAAG,YAAY,CAiDnJ"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// The detail of one incident (issue #1047): what fired, on which labels, when
|
|
3
|
+
// it went pending, fired and resolved, the last value and summary, and who
|
|
4
|
+
// acknowledged it. "Acknowledge" is drawn only for a viewer who may write; the
|
|
5
|
+
// API enforces `alerts:write` either way.
|
|
6
|
+
import CloseIcon from '@mui/icons-material/Close';
|
|
7
|
+
import { Alert, Box, Button, Divider, Drawer, IconButton, Stack, Typography } from '@mui/material';
|
|
8
|
+
import { formatAlertLabels, useAlertIncident } from '../headless/index.js';
|
|
9
|
+
import { SeverityChip, StateChip, when } from './parts.js';
|
|
10
|
+
function Row({ label, children }) {
|
|
11
|
+
return (_jsxs(Box, { sx: { display: 'grid', gridTemplateColumns: { xs: '1fr', sm: '10rem 1fr' }, gap: 0.5, py: 0.75 }, children: [_jsx(Typography, { variant: "body2", color: "text.secondary", children: label }), _jsx(Typography, { variant: "body2", component: "div", sx: { wordBreak: 'break-word' }, children: children })] }));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The incident detail drawer.
|
|
15
|
+
*
|
|
16
|
+
* @param props - see {@link AlertIncidentDrawerProps}.
|
|
17
|
+
* @returns the drawer.
|
|
18
|
+
*
|
|
19
|
+
* @extensionPoint component
|
|
20
|
+
* @stability experimental
|
|
21
|
+
*/
|
|
22
|
+
export function AlertIncidentDrawer({ incidentId, canWrite, onAcknowledge, acknowledging = false, onClose }) {
|
|
23
|
+
const { incident, isLoading, error, refresh } = useAlertIncident(incidentId);
|
|
24
|
+
const acknowledge = async () => {
|
|
25
|
+
if (!incident)
|
|
26
|
+
return;
|
|
27
|
+
const updated = await onAcknowledge(incident);
|
|
28
|
+
if (updated)
|
|
29
|
+
await refresh();
|
|
30
|
+
};
|
|
31
|
+
return (_jsx(Drawer, { anchor: "right", open: incidentId !== null, onClose: onClose, slotProps: { paper: { sx: { width: { xs: '100%', sm: 480 } } } }, children: _jsxs(Box, { sx: { p: 2 }, role: "region", "aria-label": "Incident detail", children: [_jsxs(Stack, { direction: "row", sx: { mb: 1, alignItems: 'center', justifyContent: 'space-between' }, children: [_jsx(Typography, { variant: "h6", component: "h2", children: incident ? incident.ruleName : 'Incident' }), _jsx(IconButton, { "aria-label": "Close", onClick: onClose, children: _jsx(CloseIcon, {}) })] }), error ? _jsx(Alert, { severity: "error", children: error }) : null, !incident && isLoading ? _jsx(Typography, { color: "text.secondary", children: "Loading the incident\u2026" }) : null, incident ? (_jsxs(_Fragment, { children: [_jsxs(Stack, { direction: "row", spacing: 1, sx: { mb: 2 }, children: [_jsx(StateChip, { state: incident.state }), _jsx(SeverityChip, { severity: incident.severity })] }), _jsx(Typography, { variant: "body1", sx: { mb: 2 }, children: incident.summary }), _jsx(Divider, {}), _jsx(Row, { label: "Labels", children: formatAlertLabels(incident.labels) || 'None' }), _jsx(Row, { label: "Last value", children: incident.lastValue === null ? '—' : String(incident.lastValue) }), _jsx(Row, { label: "Pending since", children: when(incident.pendingSince) }), _jsx(Row, { label: "Fired", children: when(incident.firedAt) }), _jsx(Row, { label: "Resolved", children: when(incident.resolvedAt) }), _jsx(Row, { label: "Last seen", children: when(incident.lastSeenAt) }), _jsx(Row, { label: "Acknowledged", children: incident.acknowledgedAt ? when(incident.acknowledgedAt) : 'Not yet' }), canWrite && !incident.acknowledgedAt && incident.state !== 'resolved' ? (_jsx(Box, { sx: { mt: 2 }, children: _jsx(Button, { variant: "contained", onClick: () => void acknowledge(), disabled: acknowledging, sx: { minHeight: 44 }, children: "Acknowledge" }) })) : null] })) : null] }) }));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=AlertIncidentDrawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertIncidentDrawer.js","sourceRoot":"","sources":["../../../src/alerts/ui/AlertIncidentDrawer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type ReactElement } from 'react';
|
|
2
|
+
import type { AlertKind, AlertRule, AlertRuleTestResponse, CreateAlertRule, UpdateAlertRule } from '@marinoscar/platform-contract/alerts';
|
|
3
|
+
import { type AlertMetricCatalogEntry } from '../headless/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Props of {@link AlertRuleDialog}.
|
|
6
|
+
*
|
|
7
|
+
* @stability experimental
|
|
8
|
+
*/
|
|
9
|
+
export interface AlertRuleDialogProps {
|
|
10
|
+
/** Whether the dialog is open. */
|
|
11
|
+
open: boolean;
|
|
12
|
+
/** The rule to edit or view; `null` creates one. */
|
|
13
|
+
rule: AlertRule | null;
|
|
14
|
+
/** The registered kinds (`useAlertKinds`); empty falls back to the built-in ones. */
|
|
15
|
+
kinds: readonly AlertKind[];
|
|
16
|
+
/** The metric picker's options (`useAlertMetricCatalog`). */
|
|
17
|
+
metrics?: readonly AlertMetricCatalogEntry[];
|
|
18
|
+
/** Why the metric list is unavailable; the picker still takes a typed name. */
|
|
19
|
+
metricsError?: string | null;
|
|
20
|
+
/** The notification channel ids offered; default `email`, `browser`, `push`. */
|
|
21
|
+
channels?: readonly string[];
|
|
22
|
+
/** Draw every field disabled and no Save (a viewer without `alerts:write`). */
|
|
23
|
+
readOnly?: boolean;
|
|
24
|
+
/** Whether a save is in flight. */
|
|
25
|
+
saving?: boolean;
|
|
26
|
+
/** The API's refusal of the last save, in words. */
|
|
27
|
+
error?: string | null;
|
|
28
|
+
/** Called with the body: a `CreateAlertRule` when `rule` is null, else an `UpdateAlertRule`. */
|
|
29
|
+
onSubmit: (body: CreateAlertRule | UpdateAlertRule) => void;
|
|
30
|
+
/** Runs the saved rule's dry run; omitted, no Test button. */
|
|
31
|
+
onTest?: () => Promise<AlertRuleTestResponse | null>;
|
|
32
|
+
/** Asks to delete the rule; omitted (a new or built-in rule, or a read-only viewer), no Delete button. */
|
|
33
|
+
onDelete?: () => void;
|
|
34
|
+
/** Closes the dialog. */
|
|
35
|
+
onClose: () => void;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The create, edit and view dialog of one alert rule.
|
|
39
|
+
*
|
|
40
|
+
* @param props - see {@link AlertRuleDialogProps}.
|
|
41
|
+
* @returns the dialog.
|
|
42
|
+
*
|
|
43
|
+
* @extensionPoint component
|
|
44
|
+
* @stability experimental
|
|
45
|
+
*/
|
|
46
|
+
export declare function AlertRuleDialog({ open, rule, kinds, metrics, metricsError, channels, readOnly, saving, error, onSubmit, onTest, onDelete, onClose, }: AlertRuleDialogProps): ReactElement;
|
|
47
|
+
//# sourceMappingURL=AlertRuleDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertRuleDialog.d.ts","sourceRoot":"","sources":["../../../src/alerts/ui/AlertRuleDialog.tsx"],"names":[],"mappings":"AA+CA,OAAO,EAAgC,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAUxE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAI1I,OAAO,EAYL,KAAK,uBAAuB,EAI7B,MAAM,sBAAsB,CAAC;AAQ9B;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,oDAAoD;IACpD,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,qFAAqF;IACrF,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC7C,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gGAAgG;IAChG,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,KAAK,IAAI,CAAC;IAC5D,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;IACrD,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,yBAAyB;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAiYD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,OAAY,EACZ,YAAmB,EACnB,QAA4C,EAC5C,QAAgB,EAChB,MAAc,EACd,KAAY,EACZ,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,OAAO,GACR,EAAE,oBAAoB,GAAG,YAAY,CAyPrC"}
|