@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
|
@@ -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
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
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,
|