@oneuptime/common 10.4.17 → 10.5.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/AnalyticsModels/ExceptionInstance.ts +24 -0
- package/Models/AnalyticsModels/Log.ts +16 -0
- package/Models/AnalyticsModels/Metric.ts +31 -0
- package/Models/AnalyticsModels/MonitorLog.ts +5 -0
- package/Models/AnalyticsModels/Profile.ts +25 -0
- package/Models/AnalyticsModels/ProfileSample.ts +20 -0
- package/Models/AnalyticsModels/Span.ts +23 -0
- package/Models/DatabaseModels/AlertEpisodeMember.ts +2 -0
- package/Models/DatabaseModels/AlertGroupingRule.ts +0 -38
- package/Models/DatabaseModels/AlertLabelRule.ts +152 -0
- package/Models/DatabaseModels/AlertOwnerRule.ts +114 -0
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +7 -0
- package/Models/DatabaseModels/IncidentEpisodeMember.ts +2 -0
- package/Models/DatabaseModels/IncidentGroupingRule.ts +0 -38
- package/Models/DatabaseModels/IncidentLabelRule.ts +114 -0
- package/Models/DatabaseModels/IncidentMember.ts +2 -0
- package/Models/DatabaseModels/IncidentOwnerRule.ts +114 -0
- package/Models/DatabaseModels/IncidentSla.ts +2 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +224 -0
- package/Models/DatabaseModels/Index.ts +2 -2
- package/Models/DatabaseModels/MetricPipelineRule.ts +2 -0
- package/Models/DatabaseModels/MonitorProbe.ts +2 -0
- package/Models/DatabaseModels/MonitorTest.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyTimeLog.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +2 -0
- package/Models/DatabaseModels/ProjectOidc.ts +4 -0
- package/Models/DatabaseModels/ProjectSCIM.ts +4 -0
- package/Models/DatabaseModels/ProjectSso.ts +4 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +220 -0
- package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +152 -0
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +152 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +224 -0
- package/Models/DatabaseModels/StatusPageOidc.ts +6 -0
- package/Models/DatabaseModels/StatusPageSCIM.ts +4 -0
- package/Models/DatabaseModels/StatusPageSCIMLog.ts +2 -0
- package/Models/DatabaseModels/StatusPageSso.ts +6 -0
- package/Models/DatabaseModels/Team.ts +41 -0
- package/Models/DatabaseModels/TeamComplianceSetting.ts +4 -0
- package/Models/DatabaseModels/{ServiceMonitor.ts → TeamCustomField.ts} +95 -200
- package/Models/DatabaseModels/TelemetryException.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
- package/Models/DatabaseModels/WorkflowLog.ts +2 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +2 -0
- package/Server/EnvironmentConfig.ts +3 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779392865146-AddAgentVersionToKubernetesDockerHost.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.ts +160 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.ts +197 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.ts +36 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.ts +128 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.ts +53 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.ts +73 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.ts +62 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Middleware/TelemetryIngestionDisabled.ts +32 -0
- package/Server/Services/AlertGroupingEngineService.ts +0 -29
- package/Server/Services/AlertLabelRuleEngineService.ts +129 -0
- package/Server/Services/AlertOwnerRuleEngineService.ts +205 -1
- package/Server/Services/IncidentGroupingEngineService.ts +0 -37
- package/Server/Services/IncidentLabelRuleEngineService.ts +83 -0
- package/Server/Services/IncidentOwnerRuleEngineService.ts +208 -10
- package/Server/Services/IncidentService.ts +139 -1
- package/Server/Services/Index.ts +0 -2
- package/Server/Services/MonitorProbeService.ts +56 -0
- package/Server/Services/MonitorService.ts +55 -0
- package/Server/Services/ProjectService.ts +17 -8
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +129 -0
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +289 -7
- package/Server/Services/StatusPageService.ts +30 -0
- package/Server/Services/TeamCustomFieldService.ts +9 -0
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +226 -28
- package/Server/Types/Database/Permissions/EditionPermission.ts +46 -0
- package/Server/Types/Database/Permissions/TablePermission.ts +8 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +35 -0
- package/Server/Utils/Monitor/MonitorIncident.ts +244 -34
- package/Tests/Server/Middleware/UserAuthorization.test.ts +11 -19
- package/Tests/Types/Permission.test.ts +129 -1
- package/Types/Accounts/AccountsLanguage.ts +10 -1
- package/Types/AdminDashboard/AdminDashboardLanguage.ts +10 -1
- package/Types/BaseDatabase/TableEditionAccessControl.ts +3 -0
- package/Types/Dashboard/DashboardLanguage.ts +10 -1
- package/Types/Database/AccessControl/TableEditionAccessControl.ts +8 -0
- package/Types/Date.ts +1 -1
- package/Types/Docs/DocsLanguage.ts +10 -1
- package/Types/Permission.ts +87 -54
- package/Types/StatusPage/StatusPageLanguage.ts +10 -1
- package/UI/Components/Charts/Area/AreaChart.tsx +1 -1
- package/UI/Components/Charts/Bar/BarChart.tsx +1 -1
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +5 -1
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +1 -1
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +11 -1
- package/UI/Components/Charts/Line/LineChart.tsx +1 -1
- package/UI/Components/Charts/Utils/XAxis.ts +21 -48
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +1808 -0
- package/UI/Components/Forms/Fields/FormField.tsx +69 -29
- package/UI/Components/Link/Link.tsx +13 -1
- package/UI/Components/ModelDetail/ModelDetail.tsx +20 -19
- package/UI/Components/ModelTable/BaseModelTable.tsx +5 -0
- package/UI/Utils/User.ts +16 -0
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +39 -2
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Log.js +16 -0
- package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Metric.js +31 -0
- package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MonitorLog.js +5 -0
- package/build/dist/Models/AnalyticsModels/MonitorLog.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Profile.js +40 -2
- package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ProfileSample.js +35 -2
- package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Span.js +23 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +2 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +0 -39
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js +156 -0
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +117 -0
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +2 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +0 -39
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +117 -0
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentMember.js +2 -0
- package/build/dist/Models/DatabaseModels/IncidentMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +117 -0
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSla.js +2 -0
- package/build/dist/Models/DatabaseModels/IncidentSla.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +216 -0
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -2
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricPipelineRule.js +2 -0
- package/build/dist/Models/DatabaseModels/MetricPipelineRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorProbe.js +2 -0
- package/build/dist/Models/DatabaseModels/MonitorProbe.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTest.js +2 -0
- package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOidc.js +4 -0
- package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectSCIM.js +4 -0
- package/build/dist/Models/DatabaseModels/ProjectSCIM.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectSso.js +4 -0
- package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +216 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +156 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +156 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +216 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js +6 -0
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSCIM.js +4 -0
- package/build/dist/Models/DatabaseModels/StatusPageSCIM.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js +2 -0
- package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSso.js +6 -0
- package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Team.js +42 -0
- package/build/dist/Models/DatabaseModels/Team.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +4 -0
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/{ServiceMonitor.js → TeamCustomField.js} +108 -209
- package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLog.js +2 -0
- package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +2 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779392865146-AddAgentVersionToKubernetesDockerHost.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.js +74 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngestionDisabled.js +22 -0
- package/build/dist/Server/Middleware/TelemetryIngestionDisabled.js.map +1 -0
- package/build/dist/Server/Services/AlertGroupingEngineService.js +0 -25
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +117 -3
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +175 -5
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +0 -31
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +76 -3
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +176 -14
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +104 -1
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +0 -2
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +46 -0
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +40 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +17 -8
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +117 -3
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +245 -10
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +24 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamCustomFieldService.js +9 -0
- package/build/dist/Server/Services/TeamCustomFieldService.js.map +1 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +166 -26
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +45 -0
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -0
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +7 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +200 -31
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +8 -15
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +1 -1
- package/build/dist/Tests/Types/Permission.test.js +90 -1
- package/build/dist/Tests/Types/Permission.test.js.map +1 -1
- package/build/dist/Types/Accounts/AccountsLanguage.js +10 -1
- package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +10 -1
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
- package/build/dist/Types/BaseDatabase/TableEditionAccessControl.js +2 -0
- package/build/dist/Types/BaseDatabase/TableEditionAccessControl.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js +10 -1
- package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/TableEditionAccessControl.js +6 -0
- package/build/dist/Types/Database/AccessControl/TableEditionAccessControl.js.map +1 -0
- package/build/dist/Types/Date.js +1 -1
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Docs/DocsLanguage.js +10 -1
- package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
- package/build/dist/Types/Permission.js +80 -44
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/StatusPage/StatusPageLanguage.js +10 -1
- package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +5 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +11 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +21 -47
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +1125 -0
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +28 -10
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Link/Link.js +11 -2
- package/build/dist/UI/Components/Link/Link.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js +20 -18
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Utils/User.js +13 -0
- package/build/dist/UI/Utils/User.js.map +1 -1
- package/package.json +1 -1
- package/Server/Services/ServiceMonitorService.ts +0 -57
- package/build/dist/Models/DatabaseModels/ServiceMonitor.js.map +0 -1
- package/build/dist/Server/Services/ServiceMonitorService.js +0 -56
- package/build/dist/Server/Services/ServiceMonitorService.js.map +0 -1
|
@@ -11,7 +11,6 @@ import IncidentEpisodeRoleMember from "../../Models/DatabaseModels/IncidentEpiso
|
|
|
11
11
|
import Label from "../../Models/DatabaseModels/Label";
|
|
12
12
|
import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
13
13
|
import IncidentSeverity from "../../Models/DatabaseModels/IncidentSeverity";
|
|
14
|
-
import ServiceMonitor from "../../Models/DatabaseModels/ServiceMonitor";
|
|
15
14
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
16
15
|
import logger, { LogAttributes } from "../Utils/Logger";
|
|
17
16
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
@@ -24,7 +23,6 @@ import IncidentEpisodeOwnerUserService from "./IncidentEpisodeOwnerUserService";
|
|
|
24
23
|
import IncidentEpisodeOwnerTeamService from "./IncidentEpisodeOwnerTeamService";
|
|
25
24
|
import IncidentEpisodeRoleMemberService from "./IncidentEpisodeRoleMemberService";
|
|
26
25
|
import MonitorService from "./MonitorService";
|
|
27
|
-
import ServiceMonitorService from "./ServiceMonitorService";
|
|
28
26
|
import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
|
|
29
27
|
import IncidentEpisodeFeedService from "./IncidentEpisodeFeedService";
|
|
30
28
|
import { IncidentEpisodeFeedEventType } from "../../Models/DatabaseModels/IncidentEpisodeFeed";
|
|
@@ -95,7 +93,6 @@ class IncidentGroupingEngineServiceClass {
|
|
|
95
93
|
groupByMonitor: true,
|
|
96
94
|
groupBySeverity: true,
|
|
97
95
|
groupByIncidentTitle: true,
|
|
98
|
-
groupByService: true,
|
|
99
96
|
// Time settings
|
|
100
97
|
enableTimeWindow: true,
|
|
101
98
|
timeWindowMinutes: true,
|
|
@@ -589,37 +586,6 @@ class IncidentGroupingEngineServiceClass {
|
|
|
589
586
|
): Promise<string> {
|
|
590
587
|
const parts: Array<string> = [];
|
|
591
588
|
|
|
592
|
-
/*
|
|
593
|
-
* Group by service - only if explicitly enabled
|
|
594
|
-
* Must be checked before monitor since service contains multiple monitors
|
|
595
|
-
*/
|
|
596
|
-
if (
|
|
597
|
-
rule.groupByService &&
|
|
598
|
-
incident.monitors &&
|
|
599
|
-
incident.monitors.length > 0
|
|
600
|
-
) {
|
|
601
|
-
// Use the first monitor's service for grouping
|
|
602
|
-
const firstMonitor: Monitor | undefined = incident.monitors[0];
|
|
603
|
-
if (firstMonitor && firstMonitor.id) {
|
|
604
|
-
const serviceMonitor: ServiceMonitor | null =
|
|
605
|
-
await ServiceMonitorService.findOneBy({
|
|
606
|
-
query: {
|
|
607
|
-
monitorId: firstMonitor.id,
|
|
608
|
-
},
|
|
609
|
-
select: {
|
|
610
|
-
serviceId: true,
|
|
611
|
-
},
|
|
612
|
-
props: {
|
|
613
|
-
isRoot: true,
|
|
614
|
-
},
|
|
615
|
-
});
|
|
616
|
-
|
|
617
|
-
if (serviceMonitor?.serviceId) {
|
|
618
|
-
parts.push(`service:${serviceMonitor.serviceId.toString()}`);
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
|
|
623
589
|
// Group by monitor - only if explicitly enabled
|
|
624
590
|
if (
|
|
625
591
|
rule.groupByMonitor &&
|
|
@@ -921,9 +887,6 @@ class IncidentGroupingEngineServiceClass {
|
|
|
921
887
|
if (rule.groupByIncidentTitle) {
|
|
922
888
|
groupByParts.push("Incident Title");
|
|
923
889
|
}
|
|
924
|
-
if (rule.groupByService) {
|
|
925
|
-
groupByParts.push("Service");
|
|
926
|
-
}
|
|
927
890
|
|
|
928
891
|
const groupByDescription: string =
|
|
929
892
|
groupByParts.length > 0
|
|
@@ -1,15 +1,21 @@
|
|
|
1
|
+
import DockerHost from "../../Models/DatabaseModels/DockerHost";
|
|
1
2
|
import Host from "../../Models/DatabaseModels/Host";
|
|
2
3
|
import Incident from "../../Models/DatabaseModels/Incident";
|
|
3
4
|
import IncidentLabelRule from "../../Models/DatabaseModels/IncidentLabelRule";
|
|
4
5
|
import IncidentSeverity from "../../Models/DatabaseModels/IncidentSeverity";
|
|
6
|
+
import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
|
|
5
7
|
import Label from "../../Models/DatabaseModels/Label";
|
|
6
8
|
import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
9
|
+
import Service from "../../Models/DatabaseModels/Service";
|
|
10
|
+
import DockerHostService from "./DockerHostService";
|
|
7
11
|
import HostService from "./HostService";
|
|
8
12
|
import IncidentFeedService from "./IncidentFeedService";
|
|
9
13
|
import IncidentLabelRuleService from "./IncidentLabelRuleService";
|
|
10
14
|
import IncidentService from "./IncidentService";
|
|
15
|
+
import KubernetesClusterService from "./KubernetesClusterService";
|
|
11
16
|
import LabelService from "./LabelService";
|
|
12
17
|
import MonitorService from "./MonitorService";
|
|
18
|
+
import ServiceService from "./ServiceService";
|
|
13
19
|
import { IncidentFeedEventType } from "../../Models/DatabaseModels/IncidentFeed";
|
|
14
20
|
import { Indigo500 } from "../../Types/BrandColors";
|
|
15
21
|
import ObjectID from "../../Types/ObjectID";
|
|
@@ -25,6 +31,9 @@ class IncidentLabelRuleEngineServiceClass {
|
|
|
25
31
|
* - labels listed on `labelsToAdd`
|
|
26
32
|
* - all labels of the incident's monitors when `inheritLabelsFromMonitors`
|
|
27
33
|
* - all labels of the incident's hosts when `inheritLabelsFromHosts`
|
|
34
|
+
* - all labels of the incident's Kubernetes clusters when `inheritLabelsFromKubernetesClusters`
|
|
35
|
+
* - all labels of the incident's Docker hosts when `inheritLabelsFromDockerHosts`
|
|
36
|
+
* - all labels of the incident's services when `inheritLabelsFromServices`
|
|
28
37
|
* The union is deduped against labels already on the incident before insert
|
|
29
38
|
* to avoid PK conflicts on the IncidentLabel join table.
|
|
30
39
|
*/
|
|
@@ -56,6 +65,9 @@ class IncidentLabelRuleEngineServiceClass {
|
|
|
56
65
|
labelsToAdd: { _id: true },
|
|
57
66
|
inheritLabelsFromMonitors: true,
|
|
58
67
|
inheritLabelsFromHosts: true,
|
|
68
|
+
inheritLabelsFromKubernetesClusters: true,
|
|
69
|
+
inheritLabelsFromDockerHosts: true,
|
|
70
|
+
inheritLabelsFromServices: true,
|
|
59
71
|
},
|
|
60
72
|
limit: 100,
|
|
61
73
|
skip: 0,
|
|
@@ -68,6 +80,9 @@ class IncidentLabelRuleEngineServiceClass {
|
|
|
68
80
|
const labelIdsToAdd: Set<string> = new Set();
|
|
69
81
|
let inheritFromMonitors: boolean = false;
|
|
70
82
|
let inheritFromHosts: boolean = false;
|
|
83
|
+
let inheritFromKubernetesClusters: boolean = false;
|
|
84
|
+
let inheritFromDockerHosts: boolean = false;
|
|
85
|
+
let inheritFromServices: boolean = false;
|
|
71
86
|
const matchedRules: Array<IncidentLabelRule> = [];
|
|
72
87
|
|
|
73
88
|
for (const rule of rules) {
|
|
@@ -90,6 +105,15 @@ class IncidentLabelRuleEngineServiceClass {
|
|
|
90
105
|
if (rule.inheritLabelsFromHosts) {
|
|
91
106
|
inheritFromHosts = true;
|
|
92
107
|
}
|
|
108
|
+
if (rule.inheritLabelsFromKubernetesClusters) {
|
|
109
|
+
inheritFromKubernetesClusters = true;
|
|
110
|
+
}
|
|
111
|
+
if (rule.inheritLabelsFromDockerHosts) {
|
|
112
|
+
inheritFromDockerHosts = true;
|
|
113
|
+
}
|
|
114
|
+
if (rule.inheritLabelsFromServices) {
|
|
115
|
+
inheritFromServices = true;
|
|
116
|
+
}
|
|
93
117
|
}
|
|
94
118
|
|
|
95
119
|
if (inheritFromMonitors && incident.monitors?.length) {
|
|
@@ -128,6 +152,65 @@ class IncidentLabelRuleEngineServiceClass {
|
|
|
128
152
|
}
|
|
129
153
|
}
|
|
130
154
|
|
|
155
|
+
if (
|
|
156
|
+
inheritFromKubernetesClusters &&
|
|
157
|
+
incident.kubernetesClusters?.length
|
|
158
|
+
) {
|
|
159
|
+
for (const incidentCluster of incident.kubernetesClusters) {
|
|
160
|
+
if (!incidentCluster.id) {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const cluster: KubernetesCluster | null =
|
|
164
|
+
await KubernetesClusterService.findOneById({
|
|
165
|
+
id: incidentCluster.id,
|
|
166
|
+
select: { labels: { _id: true } },
|
|
167
|
+
props: { isRoot: true },
|
|
168
|
+
});
|
|
169
|
+
for (const label of cluster?.labels || []) {
|
|
170
|
+
if (label.id) {
|
|
171
|
+
labelIdsToAdd.add(label.id.toString());
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (inheritFromDockerHosts && incident.dockerHosts?.length) {
|
|
178
|
+
for (const incidentDockerHost of incident.dockerHosts) {
|
|
179
|
+
if (!incidentDockerHost.id) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const dockerHost: DockerHost | null =
|
|
183
|
+
await DockerHostService.findOneById({
|
|
184
|
+
id: incidentDockerHost.id,
|
|
185
|
+
select: { labels: { _id: true } },
|
|
186
|
+
props: { isRoot: true },
|
|
187
|
+
});
|
|
188
|
+
for (const label of dockerHost?.labels || []) {
|
|
189
|
+
if (label.id) {
|
|
190
|
+
labelIdsToAdd.add(label.id.toString());
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (inheritFromServices && incident.services?.length) {
|
|
197
|
+
for (const incidentService of incident.services) {
|
|
198
|
+
if (!incidentService.id) {
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
const service: Service | null = await ServiceService.findOneById({
|
|
202
|
+
id: incidentService.id,
|
|
203
|
+
select: { labels: { _id: true } },
|
|
204
|
+
props: { isRoot: true },
|
|
205
|
+
});
|
|
206
|
+
for (const label of service?.labels || []) {
|
|
207
|
+
if (label.id) {
|
|
208
|
+
labelIdsToAdd.add(label.id.toString());
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
131
214
|
if (labelIdsToAdd.size === 0) {
|
|
132
215
|
return;
|
|
133
216
|
}
|
|
@@ -1,23 +1,38 @@
|
|
|
1
|
+
import DockerHost from "../../Models/DatabaseModels/DockerHost";
|
|
2
|
+
import DockerHostOwnerTeam from "../../Models/DatabaseModels/DockerHostOwnerTeam";
|
|
3
|
+
import DockerHostOwnerUser from "../../Models/DatabaseModels/DockerHostOwnerUser";
|
|
1
4
|
import Host from "../../Models/DatabaseModels/Host";
|
|
2
5
|
import HostOwnerTeam from "../../Models/DatabaseModels/HostOwnerTeam";
|
|
3
6
|
import HostOwnerUser from "../../Models/DatabaseModels/HostOwnerUser";
|
|
4
7
|
import Incident from "../../Models/DatabaseModels/Incident";
|
|
5
8
|
import IncidentOwnerRule from "../../Models/DatabaseModels/IncidentOwnerRule";
|
|
6
9
|
import IncidentSeverity from "../../Models/DatabaseModels/IncidentSeverity";
|
|
10
|
+
import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
|
|
11
|
+
import KubernetesClusterOwnerTeam from "../../Models/DatabaseModels/KubernetesClusterOwnerTeam";
|
|
12
|
+
import KubernetesClusterOwnerUser from "../../Models/DatabaseModels/KubernetesClusterOwnerUser";
|
|
7
13
|
import Label from "../../Models/DatabaseModels/Label";
|
|
8
14
|
import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
9
15
|
import MonitorOwnerTeam from "../../Models/DatabaseModels/MonitorOwnerTeam";
|
|
10
16
|
import MonitorOwnerUser from "../../Models/DatabaseModels/MonitorOwnerUser";
|
|
17
|
+
import Service from "../../Models/DatabaseModels/Service";
|
|
18
|
+
import ServiceOwnerTeam from "../../Models/DatabaseModels/ServiceOwnerTeam";
|
|
19
|
+
import ServiceOwnerUser from "../../Models/DatabaseModels/ServiceOwnerUser";
|
|
11
20
|
import Team from "../../Models/DatabaseModels/Team";
|
|
12
21
|
import User from "../../Models/DatabaseModels/User";
|
|
22
|
+
import DockerHostOwnerTeamService from "./DockerHostOwnerTeamService";
|
|
23
|
+
import DockerHostOwnerUserService from "./DockerHostOwnerUserService";
|
|
13
24
|
import HostOwnerTeamService from "./HostOwnerTeamService";
|
|
14
25
|
import HostOwnerUserService from "./HostOwnerUserService";
|
|
15
26
|
import IncidentFeedService from "./IncidentFeedService";
|
|
16
27
|
import IncidentOwnerRuleService from "./IncidentOwnerRuleService";
|
|
17
28
|
import IncidentService from "./IncidentService";
|
|
29
|
+
import KubernetesClusterOwnerTeamService from "./KubernetesClusterOwnerTeamService";
|
|
30
|
+
import KubernetesClusterOwnerUserService from "./KubernetesClusterOwnerUserService";
|
|
18
31
|
import MonitorOwnerTeamService from "./MonitorOwnerTeamService";
|
|
19
32
|
import MonitorOwnerUserService from "./MonitorOwnerUserService";
|
|
20
33
|
import MonitorService from "./MonitorService";
|
|
34
|
+
import ServiceOwnerTeamService from "./ServiceOwnerTeamService";
|
|
35
|
+
import ServiceOwnerUserService from "./ServiceOwnerUserService";
|
|
21
36
|
import TeamService from "./TeamService";
|
|
22
37
|
import UserService from "./UserService";
|
|
23
38
|
import { IncidentFeedEventType } from "../../Models/DatabaseModels/IncidentFeed";
|
|
@@ -64,6 +79,9 @@ class IncidentOwnerRuleEngineServiceClass {
|
|
|
64
79
|
ownerTeams: { _id: true },
|
|
65
80
|
inheritOwnersFromMonitors: true,
|
|
66
81
|
inheritOwnersFromHosts: true,
|
|
82
|
+
inheritOwnersFromKubernetesClusters: true,
|
|
83
|
+
inheritOwnersFromDockerHosts: true,
|
|
84
|
+
inheritOwnersFromServices: true,
|
|
67
85
|
},
|
|
68
86
|
limit: 100,
|
|
69
87
|
skip: 0,
|
|
@@ -73,10 +91,6 @@ class IncidentOwnerRuleEngineServiceClass {
|
|
|
73
91
|
return;
|
|
74
92
|
}
|
|
75
93
|
|
|
76
|
-
/*
|
|
77
|
-
* Collect owners by notify-mode so we can call addOwners with the
|
|
78
|
-
* correct notification flag.
|
|
79
|
-
*/
|
|
80
94
|
const usersByNotify: Map<boolean, Set<string>> = new Map([
|
|
81
95
|
[true, new Set()],
|
|
82
96
|
[false, new Set()],
|
|
@@ -91,6 +105,9 @@ class IncidentOwnerRuleEngineServiceClass {
|
|
|
91
105
|
const allTeamIds: Set<string> = new Set();
|
|
92
106
|
let inheritFromMonitors: boolean = false;
|
|
93
107
|
let inheritFromHosts: boolean = false;
|
|
108
|
+
let inheritFromKubernetesClusters: boolean = false;
|
|
109
|
+
let inheritFromDockerHosts: boolean = false;
|
|
110
|
+
let inheritFromServices: boolean = false;
|
|
94
111
|
const inheritNotifyMode: { value: boolean | null } = { value: null };
|
|
95
112
|
|
|
96
113
|
for (const rule of rules) {
|
|
@@ -120,11 +137,6 @@ class IncidentOwnerRuleEngineServiceClass {
|
|
|
120
137
|
if (rule.inheritOwnersFromMonitors) {
|
|
121
138
|
inheritFromMonitors = true;
|
|
122
139
|
ruleAddedAny = true;
|
|
123
|
-
/*
|
|
124
|
-
* If multiple matching rules ask to inherit, prefer notify=true so
|
|
125
|
-
* any rule that wants to notify wins. This matches the spirit of
|
|
126
|
-
* notifyOwners — once any rule has opted in, owners are notified.
|
|
127
|
-
*/
|
|
128
140
|
inheritNotifyMode.value =
|
|
129
141
|
inheritNotifyMode.value === true ? true : notify;
|
|
130
142
|
}
|
|
@@ -134,6 +146,24 @@ class IncidentOwnerRuleEngineServiceClass {
|
|
|
134
146
|
inheritNotifyMode.value =
|
|
135
147
|
inheritNotifyMode.value === true ? true : notify;
|
|
136
148
|
}
|
|
149
|
+
if (rule.inheritOwnersFromKubernetesClusters) {
|
|
150
|
+
inheritFromKubernetesClusters = true;
|
|
151
|
+
ruleAddedAny = true;
|
|
152
|
+
inheritNotifyMode.value =
|
|
153
|
+
inheritNotifyMode.value === true ? true : notify;
|
|
154
|
+
}
|
|
155
|
+
if (rule.inheritOwnersFromDockerHosts) {
|
|
156
|
+
inheritFromDockerHosts = true;
|
|
157
|
+
ruleAddedAny = true;
|
|
158
|
+
inheritNotifyMode.value =
|
|
159
|
+
inheritNotifyMode.value === true ? true : notify;
|
|
160
|
+
}
|
|
161
|
+
if (rule.inheritOwnersFromServices) {
|
|
162
|
+
inheritFromServices = true;
|
|
163
|
+
ruleAddedAny = true;
|
|
164
|
+
inheritNotifyMode.value =
|
|
165
|
+
inheritNotifyMode.value === true ? true : notify;
|
|
166
|
+
}
|
|
137
167
|
if (ruleAddedAny) {
|
|
138
168
|
matchedRules.push(rule);
|
|
139
169
|
}
|
|
@@ -143,6 +173,12 @@ class IncidentOwnerRuleEngineServiceClass {
|
|
|
143
173
|
const inheritedFromMonitorTeamIds: Set<string> = new Set();
|
|
144
174
|
const inheritedFromHostUserIds: Set<string> = new Set();
|
|
145
175
|
const inheritedFromHostTeamIds: Set<string> = new Set();
|
|
176
|
+
const inheritedFromKubernetesClusterUserIds: Set<string> = new Set();
|
|
177
|
+
const inheritedFromKubernetesClusterTeamIds: Set<string> = new Set();
|
|
178
|
+
const inheritedFromDockerHostUserIds: Set<string> = new Set();
|
|
179
|
+
const inheritedFromDockerHostTeamIds: Set<string> = new Set();
|
|
180
|
+
const inheritedFromServiceUserIds: Set<string> = new Set();
|
|
181
|
+
const inheritedFromServiceTeamIds: Set<string> = new Set();
|
|
146
182
|
|
|
147
183
|
if (inheritFromMonitors && incident.monitors?.length) {
|
|
148
184
|
const monitorIds: Array<ObjectID> = incident.monitors
|
|
@@ -226,13 +262,149 @@ class IncidentOwnerRuleEngineServiceClass {
|
|
|
226
262
|
}
|
|
227
263
|
}
|
|
228
264
|
|
|
265
|
+
if (
|
|
266
|
+
inheritFromKubernetesClusters &&
|
|
267
|
+
incident.kubernetesClusters?.length
|
|
268
|
+
) {
|
|
269
|
+
const clusterIds: Array<ObjectID> = incident.kubernetesClusters
|
|
270
|
+
.map((c: KubernetesCluster) => {
|
|
271
|
+
return c.id;
|
|
272
|
+
})
|
|
273
|
+
.filter((id: ObjectID | null | undefined): id is ObjectID => {
|
|
274
|
+
return Boolean(id);
|
|
275
|
+
});
|
|
276
|
+
if (clusterIds.length > 0) {
|
|
277
|
+
const [clusterOwnerUsers, clusterOwnerTeams]: [
|
|
278
|
+
Array<KubernetesClusterOwnerUser>,
|
|
279
|
+
Array<KubernetesClusterOwnerTeam>,
|
|
280
|
+
] = await Promise.all([
|
|
281
|
+
KubernetesClusterOwnerUserService.findBy({
|
|
282
|
+
query: { kubernetesClusterId: QueryHelper.any(clusterIds) },
|
|
283
|
+
select: { userId: true },
|
|
284
|
+
props: { isRoot: true },
|
|
285
|
+
limit: LIMIT_MAX,
|
|
286
|
+
skip: 0,
|
|
287
|
+
}),
|
|
288
|
+
KubernetesClusterOwnerTeamService.findBy({
|
|
289
|
+
query: { kubernetesClusterId: QueryHelper.any(clusterIds) },
|
|
290
|
+
select: { teamId: true },
|
|
291
|
+
props: { isRoot: true },
|
|
292
|
+
limit: LIMIT_MAX,
|
|
293
|
+
skip: 0,
|
|
294
|
+
}),
|
|
295
|
+
]);
|
|
296
|
+
for (const ownerUser of clusterOwnerUsers) {
|
|
297
|
+
if (ownerUser.userId) {
|
|
298
|
+
inheritedFromKubernetesClusterUserIds.add(
|
|
299
|
+
ownerUser.userId.toString(),
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
for (const ownerTeam of clusterOwnerTeams) {
|
|
304
|
+
if (ownerTeam.teamId) {
|
|
305
|
+
inheritedFromKubernetesClusterTeamIds.add(
|
|
306
|
+
ownerTeam.teamId.toString(),
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (inheritFromDockerHosts && incident.dockerHosts?.length) {
|
|
314
|
+
const dockerHostIds: Array<ObjectID> = incident.dockerHosts
|
|
315
|
+
.map((d: DockerHost) => {
|
|
316
|
+
return d.id;
|
|
317
|
+
})
|
|
318
|
+
.filter((id: ObjectID | null | undefined): id is ObjectID => {
|
|
319
|
+
return Boolean(id);
|
|
320
|
+
});
|
|
321
|
+
if (dockerHostIds.length > 0) {
|
|
322
|
+
const [dockerHostOwnerUsers, dockerHostOwnerTeams]: [
|
|
323
|
+
Array<DockerHostOwnerUser>,
|
|
324
|
+
Array<DockerHostOwnerTeam>,
|
|
325
|
+
] = await Promise.all([
|
|
326
|
+
DockerHostOwnerUserService.findBy({
|
|
327
|
+
query: { dockerHostId: QueryHelper.any(dockerHostIds) },
|
|
328
|
+
select: { userId: true },
|
|
329
|
+
props: { isRoot: true },
|
|
330
|
+
limit: LIMIT_MAX,
|
|
331
|
+
skip: 0,
|
|
332
|
+
}),
|
|
333
|
+
DockerHostOwnerTeamService.findBy({
|
|
334
|
+
query: { dockerHostId: QueryHelper.any(dockerHostIds) },
|
|
335
|
+
select: { teamId: true },
|
|
336
|
+
props: { isRoot: true },
|
|
337
|
+
limit: LIMIT_MAX,
|
|
338
|
+
skip: 0,
|
|
339
|
+
}),
|
|
340
|
+
]);
|
|
341
|
+
for (const ownerUser of dockerHostOwnerUsers) {
|
|
342
|
+
if (ownerUser.userId) {
|
|
343
|
+
inheritedFromDockerHostUserIds.add(ownerUser.userId.toString());
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
for (const ownerTeam of dockerHostOwnerTeams) {
|
|
347
|
+
if (ownerTeam.teamId) {
|
|
348
|
+
inheritedFromDockerHostTeamIds.add(ownerTeam.teamId.toString());
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (inheritFromServices && incident.services?.length) {
|
|
355
|
+
const serviceIds: Array<ObjectID> = incident.services
|
|
356
|
+
.map((s: Service) => {
|
|
357
|
+
return s.id;
|
|
358
|
+
})
|
|
359
|
+
.filter((id: ObjectID | null | undefined): id is ObjectID => {
|
|
360
|
+
return Boolean(id);
|
|
361
|
+
});
|
|
362
|
+
if (serviceIds.length > 0) {
|
|
363
|
+
const [serviceOwnerUsers, serviceOwnerTeams]: [
|
|
364
|
+
Array<ServiceOwnerUser>,
|
|
365
|
+
Array<ServiceOwnerTeam>,
|
|
366
|
+
] = await Promise.all([
|
|
367
|
+
ServiceOwnerUserService.findBy({
|
|
368
|
+
query: { serviceId: QueryHelper.any(serviceIds) },
|
|
369
|
+
select: { userId: true },
|
|
370
|
+
props: { isRoot: true },
|
|
371
|
+
limit: LIMIT_MAX,
|
|
372
|
+
skip: 0,
|
|
373
|
+
}),
|
|
374
|
+
ServiceOwnerTeamService.findBy({
|
|
375
|
+
query: { serviceId: QueryHelper.any(serviceIds) },
|
|
376
|
+
select: { teamId: true },
|
|
377
|
+
props: { isRoot: true },
|
|
378
|
+
limit: LIMIT_MAX,
|
|
379
|
+
skip: 0,
|
|
380
|
+
}),
|
|
381
|
+
]);
|
|
382
|
+
for (const ownerUser of serviceOwnerUsers) {
|
|
383
|
+
if (ownerUser.userId) {
|
|
384
|
+
inheritedFromServiceUserIds.add(ownerUser.userId.toString());
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
for (const ownerTeam of serviceOwnerTeams) {
|
|
388
|
+
if (ownerTeam.teamId) {
|
|
389
|
+
inheritedFromServiceTeamIds.add(ownerTeam.teamId.toString());
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
229
395
|
const inheritedUserIds: Set<string> = new Set([
|
|
230
396
|
...inheritedFromMonitorUserIds,
|
|
231
397
|
...inheritedFromHostUserIds,
|
|
398
|
+
...inheritedFromKubernetesClusterUserIds,
|
|
399
|
+
...inheritedFromDockerHostUserIds,
|
|
400
|
+
...inheritedFromServiceUserIds,
|
|
232
401
|
]);
|
|
233
402
|
const inheritedTeamIds: Set<string> = new Set([
|
|
234
403
|
...inheritedFromMonitorTeamIds,
|
|
235
404
|
...inheritedFromHostTeamIds,
|
|
405
|
+
...inheritedFromKubernetesClusterTeamIds,
|
|
406
|
+
...inheritedFromDockerHostTeamIds,
|
|
407
|
+
...inheritedFromServiceTeamIds,
|
|
236
408
|
]);
|
|
237
409
|
|
|
238
410
|
if (inheritedUserIds.size > 0 || inheritedTeamIds.size > 0) {
|
|
@@ -296,6 +468,17 @@ class IncidentOwnerRuleEngineServiceClass {
|
|
|
296
468
|
0,
|
|
297
469
|
inheritedFromHosts:
|
|
298
470
|
inheritedFromHostUserIds.size + inheritedFromHostTeamIds.size > 0,
|
|
471
|
+
inheritedFromKubernetesClusters:
|
|
472
|
+
inheritedFromKubernetesClusterUserIds.size +
|
|
473
|
+
inheritedFromKubernetesClusterTeamIds.size >
|
|
474
|
+
0,
|
|
475
|
+
inheritedFromDockerHosts:
|
|
476
|
+
inheritedFromDockerHostUserIds.size +
|
|
477
|
+
inheritedFromDockerHostTeamIds.size >
|
|
478
|
+
0,
|
|
479
|
+
inheritedFromServices:
|
|
480
|
+
inheritedFromServiceUserIds.size + inheritedFromServiceTeamIds.size >
|
|
481
|
+
0,
|
|
299
482
|
});
|
|
300
483
|
} catch (error) {
|
|
301
484
|
logger.error(`Error applying incident owner rules: ${error}`, {
|
|
@@ -313,6 +496,9 @@ class IncidentOwnerRuleEngineServiceClass {
|
|
|
313
496
|
teamIds: Array<string>;
|
|
314
497
|
inheritedFromMonitors: boolean;
|
|
315
498
|
inheritedFromHosts: boolean;
|
|
499
|
+
inheritedFromKubernetesClusters: boolean;
|
|
500
|
+
inheritedFromDockerHosts: boolean;
|
|
501
|
+
inheritedFromServices: boolean;
|
|
316
502
|
}): Promise<void> {
|
|
317
503
|
const {
|
|
318
504
|
incident,
|
|
@@ -321,6 +507,9 @@ class IncidentOwnerRuleEngineServiceClass {
|
|
|
321
507
|
teamIds,
|
|
322
508
|
inheritedFromMonitors,
|
|
323
509
|
inheritedFromHosts,
|
|
510
|
+
inheritedFromKubernetesClusters,
|
|
511
|
+
inheritedFromDockerHosts,
|
|
512
|
+
inheritedFromServices,
|
|
324
513
|
} = data;
|
|
325
514
|
if (
|
|
326
515
|
!incident.id ||
|
|
@@ -398,9 +587,18 @@ class IncidentOwnerRuleEngineServiceClass {
|
|
|
398
587
|
if (inheritedFromHosts) {
|
|
399
588
|
inheritedSources.push("hosts");
|
|
400
589
|
}
|
|
590
|
+
if (inheritedFromKubernetesClusters) {
|
|
591
|
+
inheritedSources.push("Kubernetes clusters");
|
|
592
|
+
}
|
|
593
|
+
if (inheritedFromDockerHosts) {
|
|
594
|
+
inheritedSources.push("Docker hosts");
|
|
595
|
+
}
|
|
596
|
+
if (inheritedFromServices) {
|
|
597
|
+
inheritedSources.push("services");
|
|
598
|
+
}
|
|
401
599
|
const inheritedNote: string =
|
|
402
600
|
inheritedSources.length > 0
|
|
403
|
-
? `\n\n_Some owners were inherited from the incident's ${inheritedSources.join("
|
|
601
|
+
? `\n\n_Some owners were inherited from the incident's ${inheritedSources.join(", ")}._`
|
|
404
602
|
: "";
|
|
405
603
|
|
|
406
604
|
const feedInfoInMarkdown: string = `🛡️ **Incident Owner Rule${
|
|
@@ -28,6 +28,10 @@ import Typeof from "../../Types/Typeof";
|
|
|
28
28
|
import { applyIncidentSelfPrivacyFilter } from "../Utils/Incident/IncidentPrivacyFilter";
|
|
29
29
|
import UserNotificationEventType from "../../Types/UserNotification/UserNotificationEventType";
|
|
30
30
|
import StatusPageSubscriberNotificationStatus from "../../Types/StatusPage/StatusPageSubscriberNotificationStatus";
|
|
31
|
+
import DockerHost from "../../Models/DatabaseModels/DockerHost";
|
|
32
|
+
import Host from "../../Models/DatabaseModels/Host";
|
|
33
|
+
import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
|
|
34
|
+
import ServiceModel from "../../Models/DatabaseModels/Service";
|
|
31
35
|
import Model from "../../Models/DatabaseModels/Incident";
|
|
32
36
|
import IncidentOwnerTeam from "../../Models/DatabaseModels/IncidentOwnerTeam";
|
|
33
37
|
import IncidentOwnerUser from "../../Models/DatabaseModels/IncidentOwnerUser";
|
|
@@ -541,7 +545,16 @@ export class Service extends DatabaseService<Model> {
|
|
|
541
545
|
);
|
|
542
546
|
}
|
|
543
547
|
} else if (createBy.data.createdIncidentTemplateId) {
|
|
544
|
-
|
|
548
|
+
/*
|
|
549
|
+
* Created from a template — pull every field we may want to
|
|
550
|
+
* inherit and apply each one only if the caller didn't already
|
|
551
|
+
* provide it. The dashboard pre-fills these on the client, so in
|
|
552
|
+
* the UI flow this is a no-op; the gain is for API consumers
|
|
553
|
+
* that just send `createdIncidentTemplateId` and expect the
|
|
554
|
+
* server to materialize the rest. `undefined` means "not set by
|
|
555
|
+
* the caller" — an explicit empty array or empty string is
|
|
556
|
+
* treated as an intentional override and we leave it alone.
|
|
557
|
+
*/
|
|
545
558
|
const incidentTemplate: IncidentTemplate | null =
|
|
546
559
|
await IncidentTemplateService.findOneBy({
|
|
547
560
|
query: {
|
|
@@ -550,6 +563,17 @@ export class Service extends DatabaseService<Model> {
|
|
|
550
563
|
},
|
|
551
564
|
select: {
|
|
552
565
|
initialIncidentStateId: true,
|
|
566
|
+
incidentSeverityId: true,
|
|
567
|
+
changeMonitorStatusToId: true,
|
|
568
|
+
title: true,
|
|
569
|
+
description: true,
|
|
570
|
+
monitors: { _id: true },
|
|
571
|
+
hosts: { _id: true },
|
|
572
|
+
kubernetesClusters: { _id: true },
|
|
573
|
+
dockerHosts: { _id: true },
|
|
574
|
+
services: { _id: true },
|
|
575
|
+
onCallDutyPolicies: { _id: true },
|
|
576
|
+
labels: { _id: true },
|
|
553
577
|
},
|
|
554
578
|
props: {
|
|
555
579
|
isRoot: true,
|
|
@@ -579,6 +603,120 @@ export class Service extends DatabaseService<Model> {
|
|
|
579
603
|
initialIncidentStateId = undefined;
|
|
580
604
|
}
|
|
581
605
|
}
|
|
606
|
+
|
|
607
|
+
if (incidentTemplate) {
|
|
608
|
+
if (
|
|
609
|
+
createBy.data.incidentSeverityId === undefined &&
|
|
610
|
+
incidentTemplate.incidentSeverityId
|
|
611
|
+
) {
|
|
612
|
+
createBy.data.incidentSeverityId =
|
|
613
|
+
incidentTemplate.incidentSeverityId;
|
|
614
|
+
}
|
|
615
|
+
if (
|
|
616
|
+
createBy.data.changeMonitorStatusToId === undefined &&
|
|
617
|
+
incidentTemplate.changeMonitorStatusToId
|
|
618
|
+
) {
|
|
619
|
+
createBy.data.changeMonitorStatusToId =
|
|
620
|
+
incidentTemplate.changeMonitorStatusToId;
|
|
621
|
+
}
|
|
622
|
+
if (
|
|
623
|
+
createBy.data.title === undefined &&
|
|
624
|
+
typeof incidentTemplate.title === "string"
|
|
625
|
+
) {
|
|
626
|
+
createBy.data.title = incidentTemplate.title;
|
|
627
|
+
}
|
|
628
|
+
if (
|
|
629
|
+
createBy.data.description === undefined &&
|
|
630
|
+
typeof incidentTemplate.description === "string"
|
|
631
|
+
) {
|
|
632
|
+
createBy.data.description = incidentTemplate.description;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
const stubBy: <T extends { _id?: string | undefined }>(
|
|
636
|
+
ctor: new () => T,
|
|
637
|
+
rows: Array<{ _id?: string | undefined }> | undefined,
|
|
638
|
+
) => Array<T> | undefined = <T extends { _id?: string | undefined }>(
|
|
639
|
+
ctor: new () => T,
|
|
640
|
+
rows: Array<{ _id?: string | undefined }> | undefined,
|
|
641
|
+
): Array<T> | undefined => {
|
|
642
|
+
if (!rows) {
|
|
643
|
+
return undefined;
|
|
644
|
+
}
|
|
645
|
+
return rows
|
|
646
|
+
.filter((row: { _id?: string | undefined }): boolean => {
|
|
647
|
+
return Boolean(row._id);
|
|
648
|
+
})
|
|
649
|
+
.map((row: { _id?: string | undefined }): T => {
|
|
650
|
+
const stub: T = new ctor();
|
|
651
|
+
stub._id = String(row._id);
|
|
652
|
+
return stub;
|
|
653
|
+
});
|
|
654
|
+
};
|
|
655
|
+
|
|
656
|
+
if (createBy.data.monitors === undefined) {
|
|
657
|
+
const stubs: Array<Monitor> | undefined = stubBy(
|
|
658
|
+
Monitor,
|
|
659
|
+
incidentTemplate.monitors,
|
|
660
|
+
);
|
|
661
|
+
if (stubs && stubs.length > 0) {
|
|
662
|
+
createBy.data.monitors = stubs;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
if (createBy.data.hosts === undefined) {
|
|
666
|
+
const stubs: Array<Host> | undefined = stubBy(
|
|
667
|
+
Host,
|
|
668
|
+
incidentTemplate.hosts,
|
|
669
|
+
);
|
|
670
|
+
if (stubs && stubs.length > 0) {
|
|
671
|
+
createBy.data.hosts = stubs;
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
if (createBy.data.kubernetesClusters === undefined) {
|
|
675
|
+
const stubs: Array<KubernetesCluster> | undefined = stubBy(
|
|
676
|
+
KubernetesCluster,
|
|
677
|
+
incidentTemplate.kubernetesClusters,
|
|
678
|
+
);
|
|
679
|
+
if (stubs && stubs.length > 0) {
|
|
680
|
+
createBy.data.kubernetesClusters = stubs;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
if (createBy.data.dockerHosts === undefined) {
|
|
684
|
+
const stubs: Array<DockerHost> | undefined = stubBy(
|
|
685
|
+
DockerHost,
|
|
686
|
+
incidentTemplate.dockerHosts,
|
|
687
|
+
);
|
|
688
|
+
if (stubs && stubs.length > 0) {
|
|
689
|
+
createBy.data.dockerHosts = stubs;
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
if (createBy.data.services === undefined) {
|
|
693
|
+
const stubs: Array<ServiceModel> | undefined = stubBy(
|
|
694
|
+
ServiceModel,
|
|
695
|
+
incidentTemplate.services,
|
|
696
|
+
);
|
|
697
|
+
if (stubs && stubs.length > 0) {
|
|
698
|
+
createBy.data.services = stubs;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
if (createBy.data.onCallDutyPolicies === undefined) {
|
|
702
|
+
const stubs: Array<OnCallDutyPolicy> | undefined = stubBy(
|
|
703
|
+
OnCallDutyPolicy,
|
|
704
|
+
incidentTemplate.onCallDutyPolicies,
|
|
705
|
+
);
|
|
706
|
+
if (stubs && stubs.length > 0) {
|
|
707
|
+
createBy.data.onCallDutyPolicies = stubs;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
if (createBy.data.labels === undefined) {
|
|
711
|
+
const stubs: Array<Label> | undefined = stubBy(
|
|
712
|
+
Label,
|
|
713
|
+
incidentTemplate.labels,
|
|
714
|
+
);
|
|
715
|
+
if (stubs && stubs.length > 0) {
|
|
716
|
+
createBy.data.labels = stubs;
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
}
|
|
582
720
|
}
|
|
583
721
|
|
|
584
722
|
// If no custom state is provided or found, fall back to default created state
|