@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
@@ -0,0 +1,248 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ /*
4
+ * Generated with npm run generate-postgres-migration. SLO label rules and SLO
5
+ * owner rules: the two rule tables plus their label, owner user and owner team
6
+ * join tables. New, empty tables only - nothing existing is touched.
7
+ */
8
+ export class AddSloLabelAndOwnerRules1794100000000
9
+ implements MigrationInterface
10
+ {
11
+ public name: string = "AddSloLabelAndOwnerRules1794100000000";
12
+
13
+ public async up(queryRunner: QueryRunner): Promise<void> {
14
+ await queryRunner.query(
15
+ `CREATE TABLE "ServiceLevelObjectiveOwnerRule" ("_id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "version" integer NOT NULL, "criteria" jsonb, "projectId" uuid NOT NULL, "name" character varying(100) NOT NULL, "description" character varying(500), "isEnabled" boolean NOT NULL DEFAULT true, "notifyOwners" boolean NOT NULL DEFAULT true, "serviceLevelObjectiveNamePattern" character varying(500), "serviceLevelObjectiveDescriptionPattern" character varying(500), "createdByUserId" uuid, "deletedByUserId" uuid, CONSTRAINT "PK_fcca76effc951a34efbbac08262" PRIMARY KEY ("_id"))`,
16
+ );
17
+ await queryRunner.query(
18
+ `CREATE INDEX "IDX_52a12c08da9cfed82a6d55ee2a" ON "ServiceLevelObjectiveOwnerRule" ("projectId") `,
19
+ );
20
+ await queryRunner.query(
21
+ `CREATE INDEX "IDX_675d55cd050bae45ead9bc5a76" ON "ServiceLevelObjectiveOwnerRule" ("name") `,
22
+ );
23
+ await queryRunner.query(
24
+ `CREATE INDEX "IDX_887a6293429f3079055ca2f593" ON "ServiceLevelObjectiveOwnerRule" ("isEnabled") `,
25
+ );
26
+ await queryRunner.query(
27
+ `CREATE TABLE "ServiceLevelObjectiveLabelRule" ("_id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "version" integer NOT NULL, "criteria" jsonb, "projectId" uuid NOT NULL, "name" character varying(100) NOT NULL, "description" character varying(500), "isEnabled" boolean NOT NULL DEFAULT true, "serviceLevelObjectiveNamePattern" character varying(500), "serviceLevelObjectiveDescriptionPattern" character varying(500), "createdByUserId" uuid, "deletedByUserId" uuid, CONSTRAINT "PK_243e193d772af6b2268c50bc546" PRIMARY KEY ("_id"))`,
28
+ );
29
+ await queryRunner.query(
30
+ `CREATE INDEX "IDX_7bf2cb71d4eadd777dca39d2e5" ON "ServiceLevelObjectiveLabelRule" ("projectId") `,
31
+ );
32
+ await queryRunner.query(
33
+ `CREATE INDEX "IDX_f590d00d3ce34582a752bd8dca" ON "ServiceLevelObjectiveLabelRule" ("name") `,
34
+ );
35
+ await queryRunner.query(
36
+ `CREATE INDEX "IDX_bc184754b090db18209d325dc3" ON "ServiceLevelObjectiveLabelRule" ("isEnabled") `,
37
+ );
38
+ await queryRunner.query(
39
+ `CREATE TABLE "ServiceLevelObjectiveOwnerRuleServiceLevelObjectiveLabel" ("serviceLevelObjectiveOwnerRuleId" uuid NOT NULL, "labelId" uuid NOT NULL, CONSTRAINT "PK_abc4ed3e95319b9eddda678fbf2" PRIMARY KEY ("serviceLevelObjectiveOwnerRuleId", "labelId"))`,
40
+ );
41
+ await queryRunner.query(
42
+ `CREATE INDEX "IDX_8f61365ab62fb2cda9cabfba6a" ON "ServiceLevelObjectiveOwnerRuleServiceLevelObjectiveLabel" ("serviceLevelObjectiveOwnerRuleId") `,
43
+ );
44
+ await queryRunner.query(
45
+ `CREATE INDEX "IDX_a53d5afa239072fbbcd830ee1e" ON "ServiceLevelObjectiveOwnerRuleServiceLevelObjectiveLabel" ("labelId") `,
46
+ );
47
+ await queryRunner.query(
48
+ `CREATE TABLE "ServiceLevelObjectiveOwnerRuleOwnerUser" ("serviceLevelObjectiveOwnerRuleId" uuid NOT NULL, "userId" uuid NOT NULL, CONSTRAINT "PK_815cbebe01771c4cb5391e6c746" PRIMARY KEY ("serviceLevelObjectiveOwnerRuleId", "userId"))`,
49
+ );
50
+ await queryRunner.query(
51
+ `CREATE INDEX "IDX_bb2984cb07f49c10c2b43a2a71" ON "ServiceLevelObjectiveOwnerRuleOwnerUser" ("serviceLevelObjectiveOwnerRuleId") `,
52
+ );
53
+ await queryRunner.query(
54
+ `CREATE INDEX "IDX_0151b4abffe8e16c9ebdd3b4cf" ON "ServiceLevelObjectiveOwnerRuleOwnerUser" ("userId") `,
55
+ );
56
+ await queryRunner.query(
57
+ `CREATE TABLE "ServiceLevelObjectiveOwnerRuleOwnerTeam" ("serviceLevelObjectiveOwnerRuleId" uuid NOT NULL, "teamId" uuid NOT NULL, CONSTRAINT "PK_beb34d84842d0daf68f77cfa1ae" PRIMARY KEY ("serviceLevelObjectiveOwnerRuleId", "teamId"))`,
58
+ );
59
+ await queryRunner.query(
60
+ `CREATE INDEX "IDX_12919a82600bbabd2ed7554526" ON "ServiceLevelObjectiveOwnerRuleOwnerTeam" ("serviceLevelObjectiveOwnerRuleId") `,
61
+ );
62
+ await queryRunner.query(
63
+ `CREATE INDEX "IDX_6082f2cc1e7d70c21314f8571b" ON "ServiceLevelObjectiveOwnerRuleOwnerTeam" ("teamId") `,
64
+ );
65
+ await queryRunner.query(
66
+ `CREATE TABLE "ServiceLevelObjectiveLabelRuleServiceLevelObjectiveLabel" ("serviceLevelObjectiveLabelRuleId" uuid NOT NULL, "labelId" uuid NOT NULL, CONSTRAINT "PK_7118b5b1431e0c11443c93b7ee0" PRIMARY KEY ("serviceLevelObjectiveLabelRuleId", "labelId"))`,
67
+ );
68
+ await queryRunner.query(
69
+ `CREATE INDEX "IDX_5a4fed4da4bd53243128e78ced" ON "ServiceLevelObjectiveLabelRuleServiceLevelObjectiveLabel" ("serviceLevelObjectiveLabelRuleId") `,
70
+ );
71
+ await queryRunner.query(
72
+ `CREATE INDEX "IDX_f97e9f9b0f0f138be034ecefe7" ON "ServiceLevelObjectiveLabelRuleServiceLevelObjectiveLabel" ("labelId") `,
73
+ );
74
+ await queryRunner.query(
75
+ `CREATE TABLE "ServiceLevelObjectiveLabelRuleLabelToAdd" ("serviceLevelObjectiveLabelRuleId" uuid NOT NULL, "labelId" uuid NOT NULL, CONSTRAINT "PK_8ed516417c4aabb76de7f4082f6" PRIMARY KEY ("serviceLevelObjectiveLabelRuleId", "labelId"))`,
76
+ );
77
+ await queryRunner.query(
78
+ `CREATE INDEX "IDX_6511777681392a31b0d8e3ad1d" ON "ServiceLevelObjectiveLabelRuleLabelToAdd" ("serviceLevelObjectiveLabelRuleId") `,
79
+ );
80
+ await queryRunner.query(
81
+ `CREATE INDEX "IDX_b41fe48b6a5df099dfe513717d" ON "ServiceLevelObjectiveLabelRuleLabelToAdd" ("labelId") `,
82
+ );
83
+ await queryRunner.query(
84
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRule" ADD CONSTRAINT "FK_52a12c08da9cfed82a6d55ee2a6" FOREIGN KEY ("projectId") REFERENCES "Project"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`,
85
+ );
86
+ await queryRunner.query(
87
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRule" ADD CONSTRAINT "FK_60f95ff7a6d32473e16dd7a9d96" FOREIGN KEY ("createdByUserId") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`,
88
+ );
89
+ await queryRunner.query(
90
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRule" ADD CONSTRAINT "FK_7a1bb4246c7029fb5eec8dfbc1c" FOREIGN KEY ("deletedByUserId") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`,
91
+ );
92
+ await queryRunner.query(
93
+ `ALTER TABLE "ServiceLevelObjectiveLabelRule" ADD CONSTRAINT "FK_7bf2cb71d4eadd777dca39d2e55" FOREIGN KEY ("projectId") REFERENCES "Project"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`,
94
+ );
95
+ await queryRunner.query(
96
+ `ALTER TABLE "ServiceLevelObjectiveLabelRule" ADD CONSTRAINT "FK_1de61bef2e13d1e25394360ba2e" FOREIGN KEY ("createdByUserId") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`,
97
+ );
98
+ await queryRunner.query(
99
+ `ALTER TABLE "ServiceLevelObjectiveLabelRule" ADD CONSTRAINT "FK_72ab545b8be48bcae655b1c83d2" FOREIGN KEY ("deletedByUserId") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`,
100
+ );
101
+ await queryRunner.query(
102
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleServiceLevelObjectiveLabel" ADD CONSTRAINT "FK_8f61365ab62fb2cda9cabfba6a9" FOREIGN KEY ("serviceLevelObjectiveOwnerRuleId") REFERENCES "ServiceLevelObjectiveOwnerRule"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
103
+ );
104
+ await queryRunner.query(
105
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleServiceLevelObjectiveLabel" ADD CONSTRAINT "FK_a53d5afa239072fbbcd830ee1eb" FOREIGN KEY ("labelId") REFERENCES "Label"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
106
+ );
107
+ await queryRunner.query(
108
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleOwnerUser" ADD CONSTRAINT "FK_bb2984cb07f49c10c2b43a2a716" FOREIGN KEY ("serviceLevelObjectiveOwnerRuleId") REFERENCES "ServiceLevelObjectiveOwnerRule"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
109
+ );
110
+ await queryRunner.query(
111
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleOwnerUser" ADD CONSTRAINT "FK_0151b4abffe8e16c9ebdd3b4cf6" FOREIGN KEY ("userId") REFERENCES "User"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
112
+ );
113
+ await queryRunner.query(
114
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleOwnerTeam" ADD CONSTRAINT "FK_12919a82600bbabd2ed7554526e" FOREIGN KEY ("serviceLevelObjectiveOwnerRuleId") REFERENCES "ServiceLevelObjectiveOwnerRule"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
115
+ );
116
+ await queryRunner.query(
117
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleOwnerTeam" ADD CONSTRAINT "FK_6082f2cc1e7d70c21314f8571b9" FOREIGN KEY ("teamId") REFERENCES "Team"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
118
+ );
119
+ await queryRunner.query(
120
+ `ALTER TABLE "ServiceLevelObjectiveLabelRuleServiceLevelObjectiveLabel" ADD CONSTRAINT "FK_5a4fed4da4bd53243128e78ced0" FOREIGN KEY ("serviceLevelObjectiveLabelRuleId") REFERENCES "ServiceLevelObjectiveLabelRule"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
121
+ );
122
+ await queryRunner.query(
123
+ `ALTER TABLE "ServiceLevelObjectiveLabelRuleServiceLevelObjectiveLabel" ADD CONSTRAINT "FK_f97e9f9b0f0f138be034ecefe7c" FOREIGN KEY ("labelId") REFERENCES "Label"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
124
+ );
125
+ await queryRunner.query(
126
+ `ALTER TABLE "ServiceLevelObjectiveLabelRuleLabelToAdd" ADD CONSTRAINT "FK_6511777681392a31b0d8e3ad1de" FOREIGN KEY ("serviceLevelObjectiveLabelRuleId") REFERENCES "ServiceLevelObjectiveLabelRule"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
127
+ );
128
+ await queryRunner.query(
129
+ `ALTER TABLE "ServiceLevelObjectiveLabelRuleLabelToAdd" ADD CONSTRAINT "FK_b41fe48b6a5df099dfe513717d8" FOREIGN KEY ("labelId") REFERENCES "Label"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
130
+ );
131
+ }
132
+
133
+ public async down(queryRunner: QueryRunner): Promise<void> {
134
+ await queryRunner.query(
135
+ `ALTER TABLE "ServiceLevelObjectiveLabelRuleLabelToAdd" DROP CONSTRAINT "FK_b41fe48b6a5df099dfe513717d8"`,
136
+ );
137
+ await queryRunner.query(
138
+ `ALTER TABLE "ServiceLevelObjectiveLabelRuleLabelToAdd" DROP CONSTRAINT "FK_6511777681392a31b0d8e3ad1de"`,
139
+ );
140
+ await queryRunner.query(
141
+ `ALTER TABLE "ServiceLevelObjectiveLabelRuleServiceLevelObjectiveLabel" DROP CONSTRAINT "FK_f97e9f9b0f0f138be034ecefe7c"`,
142
+ );
143
+ await queryRunner.query(
144
+ `ALTER TABLE "ServiceLevelObjectiveLabelRuleServiceLevelObjectiveLabel" DROP CONSTRAINT "FK_5a4fed4da4bd53243128e78ced0"`,
145
+ );
146
+ await queryRunner.query(
147
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleOwnerTeam" DROP CONSTRAINT "FK_6082f2cc1e7d70c21314f8571b9"`,
148
+ );
149
+ await queryRunner.query(
150
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleOwnerTeam" DROP CONSTRAINT "FK_12919a82600bbabd2ed7554526e"`,
151
+ );
152
+ await queryRunner.query(
153
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleOwnerUser" DROP CONSTRAINT "FK_0151b4abffe8e16c9ebdd3b4cf6"`,
154
+ );
155
+ await queryRunner.query(
156
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleOwnerUser" DROP CONSTRAINT "FK_bb2984cb07f49c10c2b43a2a716"`,
157
+ );
158
+ await queryRunner.query(
159
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleServiceLevelObjectiveLabel" DROP CONSTRAINT "FK_a53d5afa239072fbbcd830ee1eb"`,
160
+ );
161
+ await queryRunner.query(
162
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRuleServiceLevelObjectiveLabel" DROP CONSTRAINT "FK_8f61365ab62fb2cda9cabfba6a9"`,
163
+ );
164
+ await queryRunner.query(
165
+ `ALTER TABLE "ServiceLevelObjectiveLabelRule" DROP CONSTRAINT "FK_72ab545b8be48bcae655b1c83d2"`,
166
+ );
167
+ await queryRunner.query(
168
+ `ALTER TABLE "ServiceLevelObjectiveLabelRule" DROP CONSTRAINT "FK_1de61bef2e13d1e25394360ba2e"`,
169
+ );
170
+ await queryRunner.query(
171
+ `ALTER TABLE "ServiceLevelObjectiveLabelRule" DROP CONSTRAINT "FK_7bf2cb71d4eadd777dca39d2e55"`,
172
+ );
173
+ await queryRunner.query(
174
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRule" DROP CONSTRAINT "FK_7a1bb4246c7029fb5eec8dfbc1c"`,
175
+ );
176
+ await queryRunner.query(
177
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRule" DROP CONSTRAINT "FK_60f95ff7a6d32473e16dd7a9d96"`,
178
+ );
179
+ await queryRunner.query(
180
+ `ALTER TABLE "ServiceLevelObjectiveOwnerRule" DROP CONSTRAINT "FK_52a12c08da9cfed82a6d55ee2a6"`,
181
+ );
182
+ await queryRunner.query(
183
+ `DROP INDEX "public"."IDX_b41fe48b6a5df099dfe513717d"`,
184
+ );
185
+ await queryRunner.query(
186
+ `DROP INDEX "public"."IDX_6511777681392a31b0d8e3ad1d"`,
187
+ );
188
+ await queryRunner.query(
189
+ `DROP TABLE "ServiceLevelObjectiveLabelRuleLabelToAdd"`,
190
+ );
191
+ await queryRunner.query(
192
+ `DROP INDEX "public"."IDX_f97e9f9b0f0f138be034ecefe7"`,
193
+ );
194
+ await queryRunner.query(
195
+ `DROP INDEX "public"."IDX_5a4fed4da4bd53243128e78ced"`,
196
+ );
197
+ await queryRunner.query(
198
+ `DROP TABLE "ServiceLevelObjectiveLabelRuleServiceLevelObjectiveLabel"`,
199
+ );
200
+ await queryRunner.query(
201
+ `DROP INDEX "public"."IDX_6082f2cc1e7d70c21314f8571b"`,
202
+ );
203
+ await queryRunner.query(
204
+ `DROP INDEX "public"."IDX_12919a82600bbabd2ed7554526"`,
205
+ );
206
+ await queryRunner.query(
207
+ `DROP TABLE "ServiceLevelObjectiveOwnerRuleOwnerTeam"`,
208
+ );
209
+ await queryRunner.query(
210
+ `DROP INDEX "public"."IDX_0151b4abffe8e16c9ebdd3b4cf"`,
211
+ );
212
+ await queryRunner.query(
213
+ `DROP INDEX "public"."IDX_bb2984cb07f49c10c2b43a2a71"`,
214
+ );
215
+ await queryRunner.query(
216
+ `DROP TABLE "ServiceLevelObjectiveOwnerRuleOwnerUser"`,
217
+ );
218
+ await queryRunner.query(
219
+ `DROP INDEX "public"."IDX_a53d5afa239072fbbcd830ee1e"`,
220
+ );
221
+ await queryRunner.query(
222
+ `DROP INDEX "public"."IDX_8f61365ab62fb2cda9cabfba6a"`,
223
+ );
224
+ await queryRunner.query(
225
+ `DROP TABLE "ServiceLevelObjectiveOwnerRuleServiceLevelObjectiveLabel"`,
226
+ );
227
+ await queryRunner.query(
228
+ `DROP INDEX "public"."IDX_bc184754b090db18209d325dc3"`,
229
+ );
230
+ await queryRunner.query(
231
+ `DROP INDEX "public"."IDX_f590d00d3ce34582a752bd8dca"`,
232
+ );
233
+ await queryRunner.query(
234
+ `DROP INDEX "public"."IDX_7bf2cb71d4eadd777dca39d2e5"`,
235
+ );
236
+ await queryRunner.query(`DROP TABLE "ServiceLevelObjectiveLabelRule"`);
237
+ await queryRunner.query(
238
+ `DROP INDEX "public"."IDX_887a6293429f3079055ca2f593"`,
239
+ );
240
+ await queryRunner.query(
241
+ `DROP INDEX "public"."IDX_675d55cd050bae45ead9bc5a76"`,
242
+ );
243
+ await queryRunner.query(
244
+ `DROP INDEX "public"."IDX_52a12c08da9cfed82a6d55ee2a"`,
245
+ );
246
+ await queryRunner.query(`DROP TABLE "ServiceLevelObjectiveOwnerRule"`);
247
+ }
248
+ }
@@ -0,0 +1,19 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ export class AddSloMonitorRuleMonitorType1794200000000
4
+ implements MigrationInterface
5
+ {
6
+ public name: string = "AddSloMonitorRuleMonitorType1794200000000";
7
+
8
+ public async up(queryRunner: QueryRunner): Promise<void> {
9
+ await queryRunner.query(
10
+ `ALTER TABLE "ServiceLevelObjectiveMonitorRule" ADD "monitorType" character varying(100)`,
11
+ );
12
+ }
13
+
14
+ public async down(queryRunner: QueryRunner): Promise<void> {
15
+ await queryRunner.query(
16
+ `ALTER TABLE "ServiceLevelObjectiveMonitorRule" DROP COLUMN "monitorType"`,
17
+ );
18
+ }
19
+ }
@@ -1,6 +1,8 @@
1
1
  import { AddAIInvestigationDecision1793700000000 } from "./1793700000000-AddAIInvestigationDecision";
2
2
  import { RemoveMonitorDescriptionLengthLimit1793800000000 } from "./1793800000000-RemoveMonitorDescriptionLengthLimit";
3
3
  import { AddEnterpriseEditionFirstSeenAt1793900000000 } from "./1793900000000-AddEnterpriseEditionFirstSeenAt";
4
+ import { AddSloLabelAndOwnerRules1794100000000 } from "./1794100000000-AddSloLabelAndOwnerRules";
5
+ import { AddSloMonitorRuleMonitorType1794200000000 } from "./1794200000000-AddSloMonitorRuleMonitorType";
4
6
  import { AddConfigurableRuleCriteria1792500000000 } from "./1792500000000-AddConfigurableRuleCriteria";
5
7
  import { AddGoogleSecOpsDiagnostics1792300000000 } from "./1792300000000-AddGoogleSecOpsDiagnostics";
6
8
  import { AddIncomingCallPolicyPhoneNumbers1792600000000 } from "./1792600000000-AddIncomingCallPolicyPhoneNumbers";
@@ -1202,4 +1204,6 @@ export default [
1202
1204
  AddAIInvestigationDecision1793700000000,
1203
1205
  RemoveMonitorDescriptionLengthLimit1793800000000,
1204
1206
  AddEnterpriseEditionFirstSeenAt1793900000000,
1207
+ AddSloLabelAndOwnerRules1794100000000,
1208
+ AddSloMonitorRuleMonitorType1794200000000,
1205
1209
  ];
@@ -76,6 +76,7 @@ import Typeof from "../../Types/Typeof";
76
76
  import API from "../../Utils/API";
77
77
  import Slug from "../../Utils/Slug";
78
78
  import { getRuleCriteriaValidationError } from "../../Utils/Rules/RuleCriteriaMatcher";
79
+ import { getMonitorTypeCriteriaValidationError } from "../../Utils/Rules/MonitorTypeRuleCriteria";
79
80
  import RuleCriteria, {
80
81
  RULE_CRITERIA_LEGACY_NEVER_MATCH_PATTERN,
81
82
  RuleCriteriaOperator,
@@ -852,6 +853,15 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
852
853
  );
853
854
  }
854
855
 
856
+ if (metadata.type === TableColumnType.MonitorType) {
857
+ const validationError: string | null =
858
+ getMonitorTypeCriteriaValidationError(filter);
859
+
860
+ if (validationError) {
861
+ throw new BadDataException(validationError);
862
+ }
863
+ }
864
+
855
865
  const isRelationField: boolean =
856
866
  metadata.type === TableColumnType.EntityArray;
857
867
  const isRelationOperator: boolean = RULE_CRITERIA_RELATION_OPERATORS.has(
@@ -384,6 +384,8 @@ import ServiceLevelObjectiveOwnerUserService from "./ServiceLevelObjectiveOwnerU
384
384
  import ServiceLevelObjectiveOwnerTeamService from "./ServiceLevelObjectiveOwnerTeamService";
385
385
  import ServiceLevelObjectiveMonitorRuleService from "./ServiceLevelObjectiveMonitorRuleService";
386
386
  import ServiceLevelObjectiveFeedService from "./ServiceLevelObjectiveFeedService";
387
+ import ServiceLevelObjectiveOwnerRuleService from "./ServiceLevelObjectiveOwnerRuleService";
388
+ import ServiceLevelObjectiveLabelRuleService from "./ServiceLevelObjectiveLabelRuleService";
387
389
  import SloHistoryService from "./SloHistoryService";
388
390
  import IncidentReminderRuleService from "./IncidentReminderRuleService";
389
391
  import AlertReminderRuleService from "./AlertReminderRuleService";
@@ -818,6 +820,8 @@ const services: Array<BaseService> = [
818
820
  ServiceLevelObjectiveOwnerTeamService,
819
821
  ServiceLevelObjectiveMonitorRuleService,
820
822
  ServiceLevelObjectiveFeedService,
823
+ ServiceLevelObjectiveOwnerRuleService,
824
+ ServiceLevelObjectiveLabelRuleService,
821
825
  IncidentReminderRuleService,
822
826
  AlertReminderRuleService,
823
827
  ScheduledMaintenanceReminderRuleService,
@@ -1301,14 +1301,15 @@ export class Service extends DatabaseService<Model> {
1301
1301
  }
1302
1302
 
1303
1303
  /*
1304
- * SLO monitor rules match on labels, name and description, so an edit to
1305
- * any of the three can pull this monitor into an SLO's error budget or
1304
+ * SLO monitor rules match on labels, type, name and description, so an edit to
1305
+ * any of those fields can pull this monitor into an SLO's error budget or
1306
1306
  * push it out of one. Keyed on `!== undefined` rather than on a non-empty
1307
1307
  * value: clearing every label arrives as `[]`, and that is precisely the
1308
1308
  * edit that should detach the monitor from every rule-driven SLO.
1309
1309
  */
1310
1310
  if (
1311
1311
  (onUpdate.updateBy.data.labels !== undefined ||
1312
+ onUpdate.updateBy.data.monitorType !== undefined ||
1312
1313
  onUpdate.updateBy.data.name !== undefined ||
1313
1314
  onUpdate.updateBy.data.description !== undefined) &&
1314
1315
  updatedItemIds.length > 0