@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.
Files changed (196) hide show
  1. package/Models/DatabaseModels/Index.ts +4 -0
  2. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
  3. package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
  4. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
  5. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
  6. package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
  7. package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
  8. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  9. package/Server/Services/DatabaseService.ts +10 -0
  10. package/Server/Services/Index.ts +4 -0
  11. package/Server/Services/MonitorService.ts +3 -2
  12. package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
  13. package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
  14. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
  15. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
  16. package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
  17. package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
  18. package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
  19. package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
  20. package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
  21. package/Server/Utils/Monitor/AffectedResourceList.ts +31 -73
  22. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
  23. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
  24. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +181 -136
  25. package/Server/Utils/Monitor/RootCauseList.ts +139 -0
  26. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
  27. package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
  28. package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
  29. package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
  30. package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
  31. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
  32. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
  33. package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
  34. package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
  35. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
  36. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
  37. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
  38. package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
  39. package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
  40. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
  41. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
  42. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
  43. package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
  44. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
  45. package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
  46. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
  47. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  48. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  49. package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
  50. package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
  51. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
  52. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
  53. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
  54. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
  55. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
  56. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
  57. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
  58. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
  59. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
  60. package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
  61. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
  62. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
  63. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
  64. package/Tests/Server/Types/Markdown.test.ts +2 -1
  65. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
  66. package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
  67. package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
  68. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
  69. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +405 -0
  70. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
  71. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
  72. package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
  73. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
  74. package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
  75. package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
  76. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
  77. package/Tests/Types/API/Route.test.ts +56 -0
  78. package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
  79. package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
  80. package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
  81. package/Tests/UI/Components/Icon.test.tsx +26 -0
  82. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  83. package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
  84. package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
  85. package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
  86. package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
  87. package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
  88. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
  89. package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
  90. package/Types/API/Route.ts +19 -2
  91. package/Types/API/URL.ts +26 -2
  92. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
  93. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
  94. package/Types/Permission.ts +90 -0
  95. package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
  96. package/Types/Rules/RuleRun.ts +4 -0
  97. package/UI/Components/Feed/FeedOptions.ts +427 -0
  98. package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
  99. package/UI/Components/Feed/useFeedItems.ts +28 -9
  100. package/UI/Components/Feed/useFeedOptions.ts +225 -0
  101. package/UI/Components/Icon/Icon.tsx +1 -1
  102. package/Utils/LabelRuleImportExport.ts +27 -9
  103. package/Utils/Monitor/MetricValueFormatter.ts +2 -2
  104. package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
  105. package/Utils/Slo/SloDuration.ts +22 -6
  106. package/Utils/Slo/SloHealth.ts +8 -7
  107. package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
  108. package/Utils/Slo/SloOverviewText.ts +33 -0
  109. package/Utils/Slo/SloProjection.ts +4 -3
  110. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  111. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  112. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
  113. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
  114. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
  115. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
  116. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
  117. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
  118. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
  119. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
  120. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
  121. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
  122. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
  123. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
  124. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  125. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  126. package/build/dist/Server/Services/DatabaseService.js +7 -0
  127. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  128. package/build/dist/Server/Services/Index.js +4 -0
  129. package/build/dist/Server/Services/Index.js.map +1 -1
  130. package/build/dist/Server/Services/MonitorService.js +3 -2
  131. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  132. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
  133. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
  134. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
  135. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
  136. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
  137. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  138. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
  139. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
  140. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
  141. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
  142. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
  143. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
  144. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
  145. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  146. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
  147. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
  148. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
  149. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  150. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +22 -51
  151. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -1
  152. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
  153. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
  154. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +139 -109
  155. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  156. package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
  157. package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
  158. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
  159. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  160. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
  161. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
  162. package/build/dist/Types/API/Route.js +18 -2
  163. package/build/dist/Types/API/Route.js.map +1 -1
  164. package/build/dist/Types/API/URL.js +23 -2
  165. package/build/dist/Types/API/URL.js.map +1 -1
  166. package/build/dist/Types/Permission.js +84 -0
  167. package/build/dist/Types/Permission.js.map +1 -1
  168. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
  169. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  170. package/build/dist/Types/Rules/RuleRun.js +4 -0
  171. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  172. package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
  173. package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
  174. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
  175. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
  176. package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
  177. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
  178. package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
  179. package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
  180. package/build/dist/UI/Components/Icon/Icon.js +1 -1
  181. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  182. package/build/dist/Utils/LabelRuleImportExport.js +22 -6
  183. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  184. package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
  185. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
  186. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
  187. package/build/dist/Utils/Slo/SloDuration.js +13 -5
  188. package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
  189. package/build/dist/Utils/Slo/SloHealth.js +8 -7
  190. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  191. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
  192. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
  193. package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
  194. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
  195. package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
  196. package/package.json +1 -1
@@ -408,6 +408,8 @@ import ServiceLevelObjectiveOwnerUser from "./ServiceLevelObjectiveOwnerUser";
408
408
  import ServiceLevelObjectiveOwnerTeam from "./ServiceLevelObjectiveOwnerTeam";
409
409
  import ServiceLevelObjectiveMonitorRule from "./ServiceLevelObjectiveMonitorRule";
410
410
  import ServiceLevelObjectiveFeed from "./ServiceLevelObjectiveFeed";
411
+ import ServiceLevelObjectiveOwnerRule from "./ServiceLevelObjectiveOwnerRule";
412
+ import ServiceLevelObjectiveLabelRule from "./ServiceLevelObjectiveLabelRule";
411
413
  import IncidentReminderRule from "./IncidentReminderRule";
412
414
  import AlertReminderRule from "./AlertReminderRule";
413
415
  import ScheduledMaintenanceReminderRule from "./ScheduledMaintenanceReminderRule";
@@ -622,6 +624,8 @@ const AllModelTypes: Array<{
622
624
  ServiceLevelObjectiveOwnerTeam,
623
625
  ServiceLevelObjectiveMonitorRule,
624
626
  ServiceLevelObjectiveFeed,
627
+ ServiceLevelObjectiveOwnerRule,
628
+ ServiceLevelObjectiveLabelRule,
625
629
  IncidentReminderRule,
626
630
  AlertReminderRule,
627
631
  ScheduledMaintenanceReminderRule,
@@ -62,6 +62,8 @@ export enum ServiceLevelObjectiveFeedEventType {
62
62
  OwnerUserRemoved = "OwnerUserRemoved",
63
63
  OwnerTeamAdded = "OwnerTeamAdded",
64
64
  OwnerTeamRemoved = "OwnerTeamRemoved",
65
+ LabelRuleExecuted = "LabelRuleExecuted",
66
+ OwnerRuleExecuted = "OwnerRuleExecuted",
65
67
  }
66
68
 
67
69
  @EnableDocumentation()
@@ -0,0 +1,522 @@
1
+ import Label from "./Label";
2
+ import Project from "./Project";
3
+ import User from "./User";
4
+ import RuleBaseModel from "./DatabaseBaseModel/RuleBaseModel";
5
+ import Route from "../../Types/API/Route";
6
+ import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
7
+ import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
8
+ import ColumnLength from "../../Types/Database/ColumnLength";
9
+ import ColumnType from "../../Types/Database/ColumnType";
10
+ import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
11
+ import EnableDocumentation from "../../Types/Database/EnableDocumentation";
12
+ import EnableWorkflow from "../../Types/Database/EnableWorkflow";
13
+ import TableColumn from "../../Types/Database/TableColumn";
14
+ import TableColumnType from "../../Types/Database/TableColumnType";
15
+ import TableMetadata from "../../Types/Database/TableMetadata";
16
+ import TenantColumn from "../../Types/Database/TenantColumn";
17
+ import IconProp from "../../Types/Icon/IconProp";
18
+ import ObjectID from "../../Types/ObjectID";
19
+ import Permission from "../../Types/Permission";
20
+ import {
21
+ Column,
22
+ Entity,
23
+ Index,
24
+ JoinColumn,
25
+ JoinTable,
26
+ ManyToMany,
27
+ ManyToOne,
28
+ } from "typeorm";
29
+
30
+ /*
31
+ * Attaches labels to SLOs that match it - the SLO counterpart of
32
+ * DashboardLabelRule. Evaluated by ServiceLevelObjectiveLabelRuleEngineService
33
+ * when an SLO is created, and against existing SLOs by "Run now".
34
+ *
35
+ * Project-level, unlike ServiceLevelObjectiveMonitorRule: a label rule decides
36
+ * which SLOs it reaches, so it cannot belong to one of them.
37
+ */
38
+ @EnableDocumentation()
39
+ @TenantColumn("projectId")
40
+ @TableAccessControl({
41
+ create: [
42
+ Permission.ProjectOwner,
43
+ Permission.ProjectAdmin,
44
+ Permission.CreateServiceLevelObjectiveLabelRule,
45
+ ],
46
+ read: [
47
+ Permission.ProjectOwner,
48
+ Permission.ProjectAdmin,
49
+ Permission.ProjectMember,
50
+ Permission.Viewer,
51
+ Permission.ReadServiceLevelObjectiveLabelRule,
52
+ ],
53
+ delete: [
54
+ Permission.ProjectOwner,
55
+ Permission.ProjectAdmin,
56
+ Permission.DeleteServiceLevelObjectiveLabelRule,
57
+ ],
58
+ update: [
59
+ Permission.ProjectOwner,
60
+ Permission.ProjectAdmin,
61
+ Permission.EditServiceLevelObjectiveLabelRule,
62
+ ],
63
+ })
64
+ @CrudApiEndpoint(new Route("/service-level-objective-label-rule"))
65
+ @Entity({
66
+ name: "ServiceLevelObjectiveLabelRule",
67
+ })
68
+ @EnableWorkflow({
69
+ create: true,
70
+ delete: true,
71
+ update: true,
72
+ read: true,
73
+ })
74
+ @TableMetadata({
75
+ tableName: "ServiceLevelObjectiveLabelRule",
76
+ singularName: "SLO Label Rule",
77
+ pluralName: "SLO Label Rules",
78
+ icon: IconProp.Tag,
79
+ tableDescription:
80
+ "Configure rules for automatically attaching labels to SLOs when matching SLOs are created",
81
+ })
82
+ export default class ServiceLevelObjectiveLabelRule extends RuleBaseModel {
83
+ @ColumnAccessControl({
84
+ create: [
85
+ Permission.ProjectOwner,
86
+ Permission.ProjectAdmin,
87
+ Permission.CreateServiceLevelObjectiveLabelRule,
88
+ ],
89
+ read: [
90
+ Permission.ProjectOwner,
91
+ Permission.ProjectAdmin,
92
+ Permission.ProjectMember,
93
+ Permission.Viewer,
94
+ Permission.ReadServiceLevelObjectiveLabelRule,
95
+ ],
96
+ update: [],
97
+ })
98
+ @TableColumn({
99
+ manyToOneRelationColumn: "projectId",
100
+ type: TableColumnType.Entity,
101
+ modelType: Project,
102
+ title: "Project",
103
+ description: "Relation to Project Resource in which this object belongs",
104
+ })
105
+ @ManyToOne(
106
+ () => {
107
+ return Project;
108
+ },
109
+ {
110
+ eager: false,
111
+ nullable: true,
112
+ onDelete: "CASCADE",
113
+ orphanedRowAction: "nullify",
114
+ },
115
+ )
116
+ @JoinColumn({ name: "projectId" })
117
+ public project?: Project = undefined;
118
+
119
+ @ColumnAccessControl({
120
+ create: [
121
+ Permission.ProjectOwner,
122
+ Permission.ProjectAdmin,
123
+ Permission.CreateServiceLevelObjectiveLabelRule,
124
+ ],
125
+ read: [
126
+ Permission.ProjectOwner,
127
+ Permission.ProjectAdmin,
128
+ Permission.ProjectMember,
129
+ Permission.Viewer,
130
+ Permission.ReadServiceLevelObjectiveLabelRule,
131
+ ],
132
+ update: [],
133
+ })
134
+ @Index()
135
+ @TableColumn({
136
+ type: TableColumnType.ObjectID,
137
+ required: true,
138
+ canReadOnRelationQuery: true,
139
+ title: "Project ID",
140
+ description: "ID of your OneUptime Project in which this object belongs",
141
+ })
142
+ @Column({
143
+ type: ColumnType.ObjectID,
144
+ nullable: false,
145
+ transformer: ObjectID.getDatabaseTransformer(),
146
+ })
147
+ public projectId?: ObjectID = undefined;
148
+
149
+ @ColumnAccessControl({
150
+ create: [
151
+ Permission.ProjectOwner,
152
+ Permission.ProjectAdmin,
153
+ Permission.CreateServiceLevelObjectiveLabelRule,
154
+ ],
155
+ read: [
156
+ Permission.ProjectOwner,
157
+ Permission.ProjectAdmin,
158
+ Permission.ProjectMember,
159
+ Permission.Viewer,
160
+ Permission.ReadServiceLevelObjectiveLabelRule,
161
+ ],
162
+ update: [
163
+ Permission.ProjectOwner,
164
+ Permission.ProjectAdmin,
165
+ Permission.EditServiceLevelObjectiveLabelRule,
166
+ ],
167
+ })
168
+ @Index()
169
+ @TableColumn({
170
+ required: true,
171
+ type: TableColumnType.ShortText,
172
+ canReadOnRelationQuery: true,
173
+ title: "Name",
174
+ description: "Name of this SLO label rule",
175
+ })
176
+ @Column({
177
+ nullable: false,
178
+ type: ColumnType.ShortText,
179
+ length: ColumnLength.ShortText,
180
+ })
181
+ public name?: string = undefined;
182
+
183
+ @ColumnAccessControl({
184
+ create: [
185
+ Permission.ProjectOwner,
186
+ Permission.ProjectAdmin,
187
+ Permission.CreateServiceLevelObjectiveLabelRule,
188
+ ],
189
+ read: [
190
+ Permission.ProjectOwner,
191
+ Permission.ProjectAdmin,
192
+ Permission.ProjectMember,
193
+ Permission.Viewer,
194
+ Permission.ReadServiceLevelObjectiveLabelRule,
195
+ ],
196
+ update: [
197
+ Permission.ProjectOwner,
198
+ Permission.ProjectAdmin,
199
+ Permission.EditServiceLevelObjectiveLabelRule,
200
+ ],
201
+ })
202
+ @TableColumn({
203
+ required: false,
204
+ type: TableColumnType.LongText,
205
+ title: "Description",
206
+ description: "Description of this SLO label rule",
207
+ })
208
+ @Column({
209
+ nullable: true,
210
+ type: ColumnType.LongText,
211
+ length: ColumnLength.LongText,
212
+ })
213
+ public description?: string = undefined;
214
+
215
+ @ColumnAccessControl({
216
+ create: [
217
+ Permission.ProjectOwner,
218
+ Permission.ProjectAdmin,
219
+ Permission.CreateServiceLevelObjectiveLabelRule,
220
+ ],
221
+ read: [
222
+ Permission.ProjectOwner,
223
+ Permission.ProjectAdmin,
224
+ Permission.ProjectMember,
225
+ Permission.Viewer,
226
+ Permission.ReadServiceLevelObjectiveLabelRule,
227
+ ],
228
+ update: [
229
+ Permission.ProjectOwner,
230
+ Permission.ProjectAdmin,
231
+ Permission.EditServiceLevelObjectiveLabelRule,
232
+ ],
233
+ })
234
+ @Index()
235
+ @TableColumn({
236
+ required: true,
237
+ type: TableColumnType.Boolean,
238
+ title: "Is Enabled",
239
+ description: "Whether this rule is enabled",
240
+ defaultValue: true,
241
+ isDefaultValueColumn: true,
242
+ })
243
+ @Column({
244
+ type: ColumnType.Boolean,
245
+ nullable: false,
246
+ default: true,
247
+ })
248
+ public isEnabled?: boolean = undefined;
249
+
250
+ // Match Criteria
251
+
252
+ @ColumnAccessControl({
253
+ create: [
254
+ Permission.ProjectOwner,
255
+ Permission.ProjectAdmin,
256
+ Permission.CreateServiceLevelObjectiveLabelRule,
257
+ ],
258
+ read: [
259
+ Permission.ProjectOwner,
260
+ Permission.ProjectAdmin,
261
+ Permission.ProjectMember,
262
+ Permission.Viewer,
263
+ Permission.ReadServiceLevelObjectiveLabelRule,
264
+ ],
265
+ update: [
266
+ Permission.ProjectOwner,
267
+ Permission.ProjectAdmin,
268
+ Permission.EditServiceLevelObjectiveLabelRule,
269
+ ],
270
+ })
271
+ @TableColumn({
272
+ required: false,
273
+ type: TableColumnType.EntityArray,
274
+ modelType: Label,
275
+ title: "SLO Labels",
276
+ description:
277
+ "Only trigger for SLOs that already have at least one of these labels. Leave empty to match regardless of labels.",
278
+ })
279
+ @ManyToMany(
280
+ () => {
281
+ return Label;
282
+ },
283
+ { eager: false },
284
+ )
285
+ @JoinTable({
286
+ name: "ServiceLevelObjectiveLabelRuleServiceLevelObjectiveLabel",
287
+ inverseJoinColumn: {
288
+ name: "labelId",
289
+ referencedColumnName: "_id",
290
+ },
291
+ joinColumn: {
292
+ name: "serviceLevelObjectiveLabelRuleId",
293
+ referencedColumnName: "_id",
294
+ },
295
+ })
296
+ public serviceLevelObjectiveLabels?: Array<Label> = undefined;
297
+
298
+ @ColumnAccessControl({
299
+ create: [
300
+ Permission.ProjectOwner,
301
+ Permission.ProjectAdmin,
302
+ Permission.CreateServiceLevelObjectiveLabelRule,
303
+ ],
304
+ read: [
305
+ Permission.ProjectOwner,
306
+ Permission.ProjectAdmin,
307
+ Permission.ProjectMember,
308
+ Permission.Viewer,
309
+ Permission.ReadServiceLevelObjectiveLabelRule,
310
+ ],
311
+ update: [
312
+ Permission.ProjectOwner,
313
+ Permission.ProjectAdmin,
314
+ Permission.EditServiceLevelObjectiveLabelRule,
315
+ ],
316
+ })
317
+ @TableColumn({
318
+ required: false,
319
+ type: TableColumnType.LongText,
320
+ title: "SLO Name Pattern",
321
+ description:
322
+ "Regex (case-insensitive) matched against the SLO name. Leave empty to match any name.",
323
+ })
324
+ @Column({
325
+ type: ColumnType.LongText,
326
+ nullable: true,
327
+ length: ColumnLength.LongText,
328
+ })
329
+ public serviceLevelObjectiveNamePattern?: string = undefined;
330
+
331
+ @ColumnAccessControl({
332
+ create: [
333
+ Permission.ProjectOwner,
334
+ Permission.ProjectAdmin,
335
+ Permission.CreateServiceLevelObjectiveLabelRule,
336
+ ],
337
+ read: [
338
+ Permission.ProjectOwner,
339
+ Permission.ProjectAdmin,
340
+ Permission.ProjectMember,
341
+ Permission.Viewer,
342
+ Permission.ReadServiceLevelObjectiveLabelRule,
343
+ ],
344
+ update: [
345
+ Permission.ProjectOwner,
346
+ Permission.ProjectAdmin,
347
+ Permission.EditServiceLevelObjectiveLabelRule,
348
+ ],
349
+ })
350
+ @TableColumn({
351
+ required: false,
352
+ type: TableColumnType.LongText,
353
+ title: "SLO Description Pattern",
354
+ description:
355
+ "Regex (case-insensitive) matched against the SLO description. Leave empty to match any description.",
356
+ })
357
+ @Column({
358
+ type: ColumnType.LongText,
359
+ nullable: true,
360
+ length: ColumnLength.LongText,
361
+ })
362
+ public serviceLevelObjectiveDescriptionPattern?: string = undefined;
363
+
364
+ // Action: Labels to add
365
+
366
+ @ColumnAccessControl({
367
+ create: [
368
+ Permission.ProjectOwner,
369
+ Permission.ProjectAdmin,
370
+ Permission.CreateServiceLevelObjectiveLabelRule,
371
+ ],
372
+ read: [
373
+ Permission.ProjectOwner,
374
+ Permission.ProjectAdmin,
375
+ Permission.ProjectMember,
376
+ Permission.Viewer,
377
+ Permission.ReadServiceLevelObjectiveLabelRule,
378
+ ],
379
+ update: [
380
+ Permission.ProjectOwner,
381
+ Permission.ProjectAdmin,
382
+ Permission.EditServiceLevelObjectiveLabelRule,
383
+ ],
384
+ })
385
+ @TableColumn({
386
+ required: false,
387
+ type: TableColumnType.EntityArray,
388
+ modelType: Label,
389
+ title: "Labels to Add",
390
+ description:
391
+ "Labels to attach to the SLO when this rule matches. Already-attached labels are not duplicated.",
392
+ })
393
+ @ManyToMany(
394
+ () => {
395
+ return Label;
396
+ },
397
+ { eager: false },
398
+ )
399
+ @JoinTable({
400
+ name: "ServiceLevelObjectiveLabelRuleLabelToAdd",
401
+ inverseJoinColumn: {
402
+ name: "labelId",
403
+ referencedColumnName: "_id",
404
+ },
405
+ joinColumn: {
406
+ name: "serviceLevelObjectiveLabelRuleId",
407
+ referencedColumnName: "_id",
408
+ },
409
+ })
410
+ public labelsToAdd?: Array<Label> = undefined;
411
+
412
+ @ColumnAccessControl({
413
+ create: [
414
+ Permission.ProjectOwner,
415
+ Permission.ProjectAdmin,
416
+ Permission.CreateServiceLevelObjectiveLabelRule,
417
+ ],
418
+ read: [
419
+ Permission.ProjectOwner,
420
+ Permission.ProjectAdmin,
421
+ Permission.ProjectMember,
422
+ Permission.Viewer,
423
+ Permission.ReadServiceLevelObjectiveLabelRule,
424
+ ],
425
+ update: [],
426
+ })
427
+ @TableColumn({
428
+ manyToOneRelationColumn: "createdByUserId",
429
+ type: TableColumnType.Entity,
430
+ modelType: User,
431
+ title: "Created by User",
432
+ description:
433
+ "Relation to User who created this object (if this object was created by a User)",
434
+ })
435
+ @ManyToOne(
436
+ () => {
437
+ return User;
438
+ },
439
+ {
440
+ eager: false,
441
+ nullable: true,
442
+ onDelete: "SET NULL",
443
+ orphanedRowAction: "nullify",
444
+ },
445
+ )
446
+ @JoinColumn({ name: "createdByUserId" })
447
+ public createdByUser?: User = undefined;
448
+
449
+ @ColumnAccessControl({
450
+ create: [
451
+ Permission.ProjectOwner,
452
+ Permission.ProjectAdmin,
453
+ Permission.CreateServiceLevelObjectiveLabelRule,
454
+ ],
455
+ read: [
456
+ Permission.ProjectOwner,
457
+ Permission.ProjectAdmin,
458
+ Permission.ProjectMember,
459
+ Permission.Viewer,
460
+ Permission.ReadServiceLevelObjectiveLabelRule,
461
+ ],
462
+ update: [],
463
+ })
464
+ @TableColumn({
465
+ type: TableColumnType.ObjectID,
466
+ title: "Created by User ID",
467
+ description:
468
+ "User ID who created this object (if this object was created by a User)",
469
+ })
470
+ @Column({
471
+ type: ColumnType.ObjectID,
472
+ nullable: true,
473
+ transformer: ObjectID.getDatabaseTransformer(),
474
+ })
475
+ public createdByUserId?: ObjectID = undefined;
476
+
477
+ @ColumnAccessControl({
478
+ create: [],
479
+ read: [],
480
+ update: [],
481
+ })
482
+ @TableColumn({
483
+ manyToOneRelationColumn: "deletedByUserId",
484
+ type: TableColumnType.Entity,
485
+ title: "Deleted by User",
486
+ modelType: User,
487
+ description:
488
+ "Relation to User who deleted this object (if this object was deleted by a User)",
489
+ })
490
+ @ManyToOne(
491
+ () => {
492
+ return User;
493
+ },
494
+ {
495
+ cascade: false,
496
+ eager: false,
497
+ nullable: true,
498
+ onDelete: "SET NULL",
499
+ orphanedRowAction: "nullify",
500
+ },
501
+ )
502
+ @JoinColumn({ name: "deletedByUserId" })
503
+ public deletedByUser?: User = undefined;
504
+
505
+ @ColumnAccessControl({
506
+ create: [],
507
+ read: [],
508
+ update: [],
509
+ })
510
+ @TableColumn({
511
+ type: TableColumnType.ObjectID,
512
+ title: "Deleted by User ID",
513
+ description:
514
+ "User ID who deleted this object (if this object was deleted by a User)",
515
+ })
516
+ @Column({
517
+ type: ColumnType.ObjectID,
518
+ nullable: true,
519
+ transformer: ObjectID.getDatabaseTransformer(),
520
+ })
521
+ public deletedByUserId?: ObjectID = undefined;
522
+ }
@@ -20,6 +20,7 @@ import TableMetadata from "../../Types/Database/TableMetadata";
20
20
  import TenantColumn from "../../Types/Database/TenantColumn";
21
21
  import IconProp from "../../Types/Icon/IconProp";
22
22
  import ObjectID from "../../Types/ObjectID";
23
+ import MonitorType from "../../Types/Monitor/MonitorType";
23
24
  import Permission from "../../Types/Permission";
24
25
  import {
25
26
  Column,
@@ -44,10 +45,10 @@ import {
44
45
  * monitor stays attached while at least one enabled rule of the SLO still
45
46
  * matches it, so there is nothing to re-home when one rule is disabled.
46
47
  *
47
- * Extends RuleBaseModel for the versioned `criteria` JSON. The three legacy
48
- * match columns below are still required: the condition builder derives its
49
- * field list from them, DatabaseService validates criteria fields against real
50
- * columns, and the engine evaluates criteria through the legacy matcher.
48
+ * Extends RuleBaseModel for the versioned `criteria` JSON. The match columns
49
+ * remain available to older API clients and provide metadata for the condition
50
+ * builder and criteria validation. Text and label criteria keep the legacy
51
+ * matcher semantics; monitor types use exact enum equality.
51
52
  *
52
53
  * Read access follows the SLO (CanAccessIfCanReadOn) and Owned-scope grants
53
54
  * follow SLO ownership (OwnedThrough), exactly like the burn rate rules beside
@@ -401,6 +402,39 @@ export default class ServiceLevelObjectiveMonitorRule extends RuleBaseModel {
401
402
  })
402
403
  public monitorLabels?: Array<Label> = undefined;
403
404
 
405
+ @ColumnAccessControl({
406
+ create: [
407
+ Permission.ProjectOwner,
408
+ Permission.ProjectAdmin,
409
+ Permission.CreateServiceLevelObjectiveMonitorRule,
410
+ ],
411
+ read: [
412
+ Permission.ProjectOwner,
413
+ Permission.ProjectAdmin,
414
+ Permission.ProjectMember,
415
+ Permission.Viewer,
416
+ Permission.ReadServiceLevelObjectiveMonitorRule,
417
+ ],
418
+ update: [
419
+ Permission.ProjectOwner,
420
+ Permission.ProjectAdmin,
421
+ Permission.EditServiceLevelObjectiveMonitorRule,
422
+ ],
423
+ })
424
+ @TableColumn({
425
+ required: false,
426
+ type: TableColumnType.MonitorType,
427
+ title: "Monitor Type",
428
+ description:
429
+ "Only match monitors of this type. Leave empty to skip the type filter.",
430
+ })
431
+ @Column({
432
+ type: ColumnType.ShortText,
433
+ nullable: true,
434
+ length: ColumnLength.ShortText,
435
+ })
436
+ public monitorType?: MonitorType = undefined;
437
+
404
438
  @ColumnAccessControl({
405
439
  create: [
406
440
  Permission.ProjectOwner,