@oneuptime/common 14.0.0 → 14.0.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/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Services/DatabaseService.ts +10 -0
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/MonitorService.ts +3 -2
- package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
- package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
- package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
- package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
- package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
- package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
- package/Server/Utils/Monitor/AffectedResourceList.ts +31 -73
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +181 -136
- package/Server/Utils/Monitor/RootCauseList.ts +139 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
- package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
- package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
- package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
- package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
- package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
- package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
- package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
- package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
- package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
- package/Tests/Server/Types/Markdown.test.ts +2 -1
- package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
- package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +405 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
- package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
- package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
- package/Tests/Types/API/Route.test.ts +56 -0
- package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
- package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
- package/Tests/UI/Components/Icon.test.tsx +26 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
- package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
- package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
- package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
- package/Types/API/Route.ts +19 -2
- package/Types/API/URL.ts +26 -2
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
- package/Types/Permission.ts +90 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
- package/Types/Rules/RuleRun.ts +4 -0
- package/UI/Components/Feed/FeedOptions.ts +427 -0
- package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
- package/UI/Components/Feed/useFeedItems.ts +28 -9
- package/UI/Components/Feed/useFeedOptions.ts +225 -0
- package/UI/Components/Icon/Icon.tsx +1 -1
- package/Utils/LabelRuleImportExport.ts +27 -9
- package/Utils/Monitor/MetricValueFormatter.ts +2 -2
- package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
- package/Utils/Slo/SloDuration.ts +22 -6
- package/Utils/Slo/SloHealth.ts +8 -7
- package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
- package/Utils/Slo/SloOverviewText.ts +33 -0
- package/Utils/Slo/SloProjection.ts +4 -3
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +7 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +3 -2
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +22 -51
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +139 -109
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
- package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
- package/build/dist/Types/API/Route.js +18 -2
- package/build/dist/Types/API/Route.js.map +1 -1
- package/build/dist/Types/API/URL.js +23 -2
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/Permission.js +84 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
- package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
- package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
- package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
- package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
- package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Icon/Icon.js +1 -1
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +22 -6
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
- package/build/dist/Utils/Slo/SloDuration.js +13 -5
- package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
- package/build/dist/Utils/Slo/SloHealth.js +8 -7
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
- package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The numbered list a root cause uses for a per-item breakdown.
|
|
3
|
+
*
|
|
4
|
+
* Two blocks of an incident / alert root cause break a breach down item by
|
|
5
|
+
* item: a platform monitor's "Affected Resources" (see AffectedResourceList)
|
|
6
|
+
* and a metric monitor's "Breaching Samples". Both used to be
|
|
7
|
+
* GitHub-flavoured tables, and a table reads badly everywhere a root cause
|
|
8
|
+
* is shown — it wraps into fragments in the ~416px email card, reaches Slack
|
|
9
|
+
* as raw pipe rows (mrkdwn has no tables), and lets its widest column
|
|
10
|
+
* squeeze the rest on the dashboard. So each item is a numbered list item
|
|
11
|
+
* instead: a title and a value on its first line, and everything else
|
|
12
|
+
* about it as labelled bullets nested underneath.
|
|
13
|
+
*
|
|
14
|
+
* 1. **Pod** `checkout-7d9f` — **3**
|
|
15
|
+
* - Namespace: `payments`
|
|
16
|
+
*
|
|
17
|
+
* 1. `2026-08-14T10:30:00.000Z` — **1.07 GB**
|
|
18
|
+
* - `a`: 537 MB
|
|
19
|
+
* - `k8s.pod.name`: `web-1`
|
|
20
|
+
*
|
|
21
|
+
* A detail with no value is simply left out, where a table had to print
|
|
22
|
+
* "-" in its cell.
|
|
23
|
+
*
|
|
24
|
+
* Plain markdown, deliberately: marked (email), react-markdown (dashboard),
|
|
25
|
+
* slackify-markdown (Slack), the dashboard editor's WYSIWYG converters and
|
|
26
|
+
* Markdown.convertToPlainText all understand a nested list, so nothing
|
|
27
|
+
* downstream needs to know these blocks exist.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
export interface RootCauseListDetail {
|
|
31
|
+
/*
|
|
32
|
+
* Markdown, rendered as-is — escape plain text, or wrap an identifier
|
|
33
|
+
* with RootCauseList.code(). An empty label leaves just the value.
|
|
34
|
+
*/
|
|
35
|
+
label: string;
|
|
36
|
+
// Markdown, rendered as-is. An empty value drops the whole detail.
|
|
37
|
+
value: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface RootCauseListItem {
|
|
41
|
+
// Markdown, rendered as-is: what the item is.
|
|
42
|
+
title: string;
|
|
43
|
+
// Markdown, rendered as-is: how bad it is, normally a bold value.
|
|
44
|
+
value: string;
|
|
45
|
+
details: Array<RootCauseListDetail>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export default class RootCauseList {
|
|
49
|
+
/*
|
|
50
|
+
* The items as one ordered list, numbered from 1 in the order given. The
|
|
51
|
+
* result is just the list: the caller puts its heading above it and any
|
|
52
|
+
* summary below it, each separated from the list by a blank line.
|
|
53
|
+
*/
|
|
54
|
+
public static render(items: Array<RootCauseListItem>): string {
|
|
55
|
+
const lines: Array<string> = [];
|
|
56
|
+
|
|
57
|
+
items.forEach((item: RootCauseListItem, index: number): void => {
|
|
58
|
+
const marker: string = `${index + 1}.`;
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
* A nested bullet belongs to its item only when it is indented to
|
|
62
|
+
* the item's content column, which is one past the marker — three
|
|
63
|
+
* spaces under "1.", four under "10.". A fixed three-space indent
|
|
64
|
+
* would push item 10's details out into a separate top-level list.
|
|
65
|
+
*/
|
|
66
|
+
const indent: string = " ".repeat(marker.length + 1);
|
|
67
|
+
|
|
68
|
+
const head: string = [item.title.trim(), item.value.trim()]
|
|
69
|
+
.filter((part: string): boolean => {
|
|
70
|
+
return part.length > 0;
|
|
71
|
+
})
|
|
72
|
+
.join(" — ");
|
|
73
|
+
|
|
74
|
+
lines.push(`${marker} ${head}`);
|
|
75
|
+
|
|
76
|
+
for (const detail of item.details) {
|
|
77
|
+
const value: string = detail.value ? detail.value.trim() : "";
|
|
78
|
+
|
|
79
|
+
if (value.length === 0) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const label: string = detail.label ? detail.label.trim() : "";
|
|
84
|
+
|
|
85
|
+
lines.push(`${indent}- ${label ? `${label}: ${value}` : value}`);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
return lines.join("\n");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/*
|
|
93
|
+
* A value as an inline code span.
|
|
94
|
+
*
|
|
95
|
+
* What goes in here comes from telemetry — resource names, attribute keys
|
|
96
|
+
* and values — and can contain anything. Wrapping a value that contains a
|
|
97
|
+
* backtick in single backticks closes the span early and spills the rest
|
|
98
|
+
* of it — and whatever markdown it contains — into the list. So the fence
|
|
99
|
+
* is always one backtick longer than the longest run inside the value,
|
|
100
|
+
* and padded with a space on each side when the value has any backticks
|
|
101
|
+
* at all (CommonMark strips exactly one from each side, so the padding
|
|
102
|
+
* never shows). Line breaks become spaces: a newline inside a list item
|
|
103
|
+
* would end the item.
|
|
104
|
+
*
|
|
105
|
+
* A value without backticks is a plain single-backtick span, so an ISO
|
|
106
|
+
* timestamp still reaches the dashboard as the bare inline code the
|
|
107
|
+
* MarkdownViewer re-renders in the viewer's timezone.
|
|
108
|
+
*/
|
|
109
|
+
public static code(value: string | undefined | null): string {
|
|
110
|
+
if (value === undefined || value === null) {
|
|
111
|
+
return "";
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const text: string = String(value)
|
|
115
|
+
.replace(/\s*[\r\n]+\s*/g, " ")
|
|
116
|
+
.trim();
|
|
117
|
+
|
|
118
|
+
if (text.length === 0) {
|
|
119
|
+
return "";
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const backtickRuns: Array<string> = text.match(/`+/g) || [];
|
|
123
|
+
|
|
124
|
+
const longestRun: number = backtickRuns.reduce(
|
|
125
|
+
(longest: number, run: string): number => {
|
|
126
|
+
return Math.max(longest, run.length);
|
|
127
|
+
},
|
|
128
|
+
0,
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
if (longestRun === 0) {
|
|
132
|
+
return `\`${text}\``;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const fence: string = "`".repeat(longestRun + 1);
|
|
136
|
+
|
|
137
|
+
return `${fence} ${text} ${fence}`;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -122,6 +122,11 @@ import ServerlessFunctionOwnerTeam from "../../../../Models/DatabaseModels/Serve
|
|
|
122
122
|
import ServerlessFunctionOwnerUser from "../../../../Models/DatabaseModels/ServerlessFunctionOwnerUser";
|
|
123
123
|
import Service from "../../../../Models/DatabaseModels/Service";
|
|
124
124
|
import ServiceLabelRule from "../../../../Models/DatabaseModels/ServiceLabelRule";
|
|
125
|
+
import ServiceLevelObjective from "../../../../Models/DatabaseModels/ServiceLevelObjective";
|
|
126
|
+
import ServiceLevelObjectiveLabelRule from "../../../../Models/DatabaseModels/ServiceLevelObjectiveLabelRule";
|
|
127
|
+
import ServiceLevelObjectiveOwnerRule from "../../../../Models/DatabaseModels/ServiceLevelObjectiveOwnerRule";
|
|
128
|
+
import ServiceLevelObjectiveOwnerTeam from "../../../../Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam";
|
|
129
|
+
import ServiceLevelObjectiveOwnerUser from "../../../../Models/DatabaseModels/ServiceLevelObjectiveOwnerUser";
|
|
125
130
|
import ServiceOwnerRule from "../../../../Models/DatabaseModels/ServiceOwnerRule";
|
|
126
131
|
import ServiceOwnerTeam from "../../../../Models/DatabaseModels/ServiceOwnerTeam";
|
|
127
132
|
import ServiceOwnerUser from "../../../../Models/DatabaseModels/ServiceOwnerUser";
|
|
@@ -265,6 +270,11 @@ import ServerlessFunctionLabelRuleService from "../../../Services/ServerlessFunc
|
|
|
265
270
|
import ServerlessFunctionOwnerRuleEngineService from "../../../Services/ServerlessFunctionOwnerRuleEngineService";
|
|
266
271
|
import ServerlessFunctionOwnerRuleService from "../../../Services/ServerlessFunctionOwnerRuleService";
|
|
267
272
|
import ServerlessFunctionService from "../../../Services/ServerlessFunctionService";
|
|
273
|
+
import ServiceLevelObjectiveLabelRuleEngineService from "../../../Services/ServiceLevelObjectiveLabelRuleEngineService";
|
|
274
|
+
import ServiceLevelObjectiveLabelRuleService from "../../../Services/ServiceLevelObjectiveLabelRuleService";
|
|
275
|
+
import ServiceLevelObjectiveOwnerRuleEngineService from "../../../Services/ServiceLevelObjectiveOwnerRuleEngineService";
|
|
276
|
+
import ServiceLevelObjectiveOwnerRuleService from "../../../Services/ServiceLevelObjectiveOwnerRuleService";
|
|
277
|
+
import ServiceLevelObjectiveService from "../../../Services/ServiceLevelObjectiveService";
|
|
268
278
|
import ServiceLabelRuleEngineService from "../../../Services/ServiceLabelRuleEngineService";
|
|
269
279
|
import ServiceLabelRuleService from "../../../Services/ServiceLabelRuleService";
|
|
270
280
|
import ServiceOwnerRuleEngineService from "../../../Services/ServiceOwnerRuleEngineService";
|
|
@@ -727,6 +737,24 @@ const RULE_RUN_DEFINITIONS: Record<ResourceRuleRunType, RuleRunDefinition> = {
|
|
|
727
737
|
resourceService: ServiceService,
|
|
728
738
|
engine: ServiceLabelRuleEngineService,
|
|
729
739
|
}),
|
|
740
|
+
[RuleRunType.ServiceLevelObjectiveLabelRule]: defineRuleRun({
|
|
741
|
+
ruleModelType: ServiceLevelObjectiveLabelRule,
|
|
742
|
+
resourceModelType: ServiceLevelObjective,
|
|
743
|
+
ruleService: ServiceLevelObjectiveLabelRuleService,
|
|
744
|
+
resourceService: ServiceLevelObjectiveService,
|
|
745
|
+
engine: ServiceLevelObjectiveLabelRuleEngineService,
|
|
746
|
+
}),
|
|
747
|
+
[RuleRunType.ServiceLevelObjectiveOwnerRule]: defineRuleRun({
|
|
748
|
+
ruleModelType: ServiceLevelObjectiveOwnerRule,
|
|
749
|
+
resourceModelType: ServiceLevelObjective,
|
|
750
|
+
ruleService: ServiceLevelObjectiveOwnerRuleService,
|
|
751
|
+
resourceService: ServiceLevelObjectiveService,
|
|
752
|
+
engine: ServiceLevelObjectiveOwnerRuleEngineService,
|
|
753
|
+
ownerModelTypes: [
|
|
754
|
+
ServiceLevelObjectiveOwnerUser,
|
|
755
|
+
ServiceLevelObjectiveOwnerTeam,
|
|
756
|
+
],
|
|
757
|
+
}),
|
|
730
758
|
[RuleRunType.ServiceOwnerRule]: defineRuleRun({
|
|
731
759
|
ruleModelType: ServiceOwnerRule,
|
|
732
760
|
resourceModelType: Service,
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
2
|
+
import RulePatternMatchUtil from "../../../Utils/Rules/RulePatternMatchUtil";
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Write-time validation for the SLO name / description patterns on SLO label
|
|
6
|
+
* and owner rules.
|
|
7
|
+
*
|
|
8
|
+
* The rule engines accept a case-insensitive regex or a '*' wildcard glob, the
|
|
9
|
+
* same two syntaxes the SLO monitor rules take. Anything else - `api-(01`,
|
|
10
|
+
* `[unclosed` - compiles to nothing and matches nothing, and the engine can
|
|
11
|
+
* only log about it long after the user left the form. Reject it at the write
|
|
12
|
+
* instead, as NetworkDeviceRulePatternValidator does (OneUptime/oneuptime#2940).
|
|
13
|
+
*/
|
|
14
|
+
export default class SloRulePatternValidator {
|
|
15
|
+
public static validate(data: {
|
|
16
|
+
namePattern?: string | null | undefined;
|
|
17
|
+
descriptionPattern?: string | null | undefined;
|
|
18
|
+
}): void {
|
|
19
|
+
SloRulePatternValidator.validateOne("SLO Name Pattern", data.namePattern);
|
|
20
|
+
SloRulePatternValidator.validateOne(
|
|
21
|
+
"SLO Description Pattern",
|
|
22
|
+
data.descriptionPattern,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
private static validateOne(
|
|
27
|
+
title: string,
|
|
28
|
+
pattern: string | null | undefined,
|
|
29
|
+
): void {
|
|
30
|
+
if (!pattern) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (RulePatternMatchUtil.isSupportedPattern(pattern)) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
throw new BadDataException(
|
|
39
|
+
`${title} "${pattern}" is not a valid regular expression, and contains no '*' wildcard to fall back on, so it would never match an SLO. Use a regex such as checkout-.* or a wildcard such as *checkout*.`,
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
}
|