@oneuptime/common 13.0.1 → 13.0.3
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/RumSession.ts +34 -0
- package/Models/DatabaseModels/AlertEpisodeLabelRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodeOnCallRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodeOwnerRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodePrivacyRule.ts +2 -2
- package/Models/DatabaseModels/AlertGroupingRule.ts +2 -2
- package/Models/DatabaseModels/AlertLabelRule.ts +2 -2
- package/Models/DatabaseModels/AlertOnCallRule.ts +2 -2
- package/Models/DatabaseModels/AlertOwnerRule.ts +2 -2
- package/Models/DatabaseModels/AlertPrivacyRule.ts +2 -2
- package/Models/DatabaseModels/AlertReminderRule.ts +6 -4
- package/Models/DatabaseModels/AutoRemediationRule.ts +2 -2
- package/Models/DatabaseModels/CephClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/CephClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/CloudResourceLabelRule.ts +2 -2
- package/Models/DatabaseModels/CloudResourceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DashboardLabelRule.ts +2 -2
- package/Models/DatabaseModels/DashboardOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.ts +11 -0
- package/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.ts +44 -0
- package/Models/DatabaseModels/DockerHostLabelRule.ts +2 -2
- package/Models/DatabaseModels/DockerHostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/HostLabelRule.ts +2 -2
- package/Models/DatabaseModels/HostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeOnCallRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodePrivacyRule.ts +2 -2
- package/Models/DatabaseModels/IncidentGroupingRule.ts +2 -2
- package/Models/DatabaseModels/IncidentLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncidentOnCallRule.ts +2 -2
- package/Models/DatabaseModels/IncidentOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentPrivacyRule.ts +2 -2
- package/Models/DatabaseModels/IncidentReminderRule.ts +6 -4
- package/Models/DatabaseModels/IncidentSlaRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicy.ts +3 -4
- package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.ts +254 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/IoTFleetLabelRule.ts +2 -2
- package/Models/DatabaseModels/IoTFleetOwnerRule.ts +2 -2
- package/Models/DatabaseModels/KubernetesClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/KubernetesClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/MonitorLabelRule.ts +2 -2
- package/Models/DatabaseModels/MonitorOwnerRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceLabelRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +2 -2
- package/Models/DatabaseModels/PodmanHostLabelRule.ts +2 -2
- package/Models/DatabaseModels/PodmanHostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ProxmoxClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/ProxmoxClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RumApplicationLabelRule.ts +2 -2
- package/Models/DatabaseModels/RumApplicationOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RunbookLabelRule.ts +2 -2
- package/Models/DatabaseModels/RunbookOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RunbookRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceReminderRule.ts +6 -4
- package/Models/DatabaseModels/ServerlessFunctionLabelRule.ts +2 -2
- package/Models/DatabaseModels/ServerlessFunctionOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ServiceLabelRule.ts +2 -2
- package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +283 -4
- package/Models/DatabaseModels/ServiceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageLabelRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageMonitorRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageOwnerRule.ts +2 -2
- package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +2 -2
- package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/WorkflowLabelRule.ts +2 -2
- package/Models/DatabaseModels/WorkflowOwnerRule.ts +2 -2
- package/Server/API/TelemetryAPI.ts +323 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.ts +111 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.ts +644 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/MultipartFormData.ts +46 -21
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +21 -0
- package/Server/Services/AlertGroupingEngineService.ts +27 -0
- package/Server/Services/AlertLabelRuleEngineService.ts +27 -0
- package/Server/Services/AlertOnCallRuleEngineService.ts +27 -0
- package/Server/Services/AlertOwnerRuleEngineService.ts +27 -0
- package/Server/Services/AlertPrivacyRuleEngineService.ts +27 -0
- package/Server/Services/AlertReminderRuleService.ts +65 -33
- package/Server/Services/AutoRemediationRuleEngineService.ts +90 -8
- package/Server/Services/CephClusterLabelRuleEngineService.ts +20 -0
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +20 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +20 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DashboardLabelRuleEngineService.ts +20 -0
- package/Server/Services/DashboardOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DatabaseService.ts +409 -6
- package/Server/Services/DockerHostLabelRuleEngineService.ts +20 -0
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +23 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/HostLabelRuleEngineService.ts +13 -0
- package/Server/Services/HostOwnerRuleEngineService.ts +13 -0
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +21 -0
- package/Server/Services/IncidentGroupingEngineService.ts +64 -13
- package/Server/Services/IncidentLabelRuleEngineService.ts +64 -9
- package/Server/Services/IncidentOnCallRuleEngineService.ts +64 -10
- package/Server/Services/IncidentOwnerRuleEngineService.ts +64 -10
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +64 -10
- package/Server/Services/IncidentReminderRuleService.ts +66 -34
- package/Server/Services/IncidentSlaRuleService.ts +55 -12
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +20 -0
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +20 -0
- package/Server/Services/IncomingCallPolicyPhoneNumberService.ts +184 -0
- package/Server/Services/IncomingCallPolicyService.ts +276 -5
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +20 -0
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +20 -0
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +23 -0
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/LabelService.ts +50 -7
- package/Server/Services/MonitorLabelRuleEngineService.ts +20 -0
- package/Server/Services/MonitorOwnerRuleEngineService.ts +20 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +2 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +93 -1
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +26 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +25 -0
- package/Server/Services/NetworkDeviceService.ts +2 -0
- package/Server/Services/NetworkSiteAssignmentRuleService.ts +90 -1
- package/Server/Services/NetworkSiteService.ts +242 -29
- package/Server/Services/NetworkSiteTypeService.ts +177 -77
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +20 -0
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +20 -0
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +22 -0
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +22 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +20 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +20 -0
- package/Server/Services/ProjectCallSMSConfigService.ts +156 -7
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +25 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +25 -0
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +22 -0
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +22 -0
- package/Server/Services/RunbookLabelRuleEngineService.ts +20 -0
- package/Server/Services/RunbookOwnerRuleEngineService.ts +20 -0
- package/Server/Services/RunbookRuleEngineService.ts +18 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +62 -10
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +62 -11
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +48 -18
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +25 -0
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +25 -0
- package/Server/Services/ServiceLabelRuleEngineService.ts +20 -0
- package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +675 -12
- package/Server/Services/ServiceLevelObjectiveService.ts +55 -13
- package/Server/Services/ServiceOwnerRuleEngineService.ts +20 -0
- package/Server/Services/StatusPageLabelRuleEngineService.ts +20 -0
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +31 -2
- package/Server/Services/StatusPageMonitorRuleService.ts +34 -1
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +20 -0
- package/Server/Services/UserService.ts +23 -50
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +25 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +25 -0
- package/Server/Services/WorkflowLabelRuleEngineService.ts +20 -0
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +20 -0
- package/Server/Static/Brand/README.md +10 -5
- package/Server/Static/Brand/favicons/oneuptime-up-v1.svg +8 -0
- package/Server/Types/Database/QueryHelper.ts +88 -0
- package/Server/Utils/AI/Toolbox/SloTools.ts +19 -2
- package/Server/Utils/IncomingCallPhoneNumber.ts +29 -16
- package/Server/Utils/Profiling.ts +13 -1
- package/Server/Utils/Rules/MonitorRuleCriteriaCache.ts +38 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +498 -0
- package/Server/Utils/Telemetry.ts +3 -1
- package/Server/Utils/VendorAssets.ts +3 -0
- package/Tests/App/Dashboard/AIInsightViewTriage.test.tsx +348 -0
- package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +476 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +25 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +449 -24
- package/Tests/App/Dashboard/DashboardPersistentSideMenuLayouts.test.tsx +702 -0
- package/Tests/App/Dashboard/ExceptionsLandingRedirect.test.tsx +63 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +150 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +279 -100
- package/Tests/App/Dashboard/InventoryItemSideMenu.test.tsx +155 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +11 -0
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +215 -71
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +347 -0
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +263 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +413 -17
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +138 -0
- package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +940 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +378 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +735 -0
- package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +275 -108
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +13 -3
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +127 -4
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -4
- package/Tests/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.test.ts +362 -0
- package/Tests/Models/DatabaseModels/RuleBaseModel.test.ts +69 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +181 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +1303 -145
- package/Tests/Server/API/UserTwoFactorSelfService.test.ts +407 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +611 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +61 -3
- package/Tests/Server/Middleware/TelemetryIngestionDisabled.test.ts +211 -0
- package/Tests/Server/Services/AlertIncidentRuleCriteriaEngineServices.test.ts +651 -0
- package/Tests/Server/Services/AutoRemediationRuleEngineService.test.ts +79 -0
- package/Tests/Server/Services/DatabaseServiceRelationOnlyRuleRollout.test.ts +330 -0
- package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +522 -0
- package/Tests/Server/Services/IncidentSlaRuleCriteriaCorrelation.test.ts +99 -0
- package/Tests/Server/Services/IncomingCallPolicyPhoneNumberService.test.ts +1540 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +179 -2
- package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +170 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +559 -53
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +122 -55
- package/Tests/Server/Services/ReminderRuleCriteria.test.ts +173 -0
- package/Tests/Server/Services/ResourceRuleCriteriaEngineServices.test.ts +170 -0
- package/Tests/Server/Services/ScheduledMaintenanceRuleCriteriaCorrelation.test.ts +154 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +2450 -470
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +464 -121
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +281 -0
- package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +132 -0
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +159 -14
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +6 -8
- package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +203 -34
- package/Tests/Server/Types/Database/QueryHelperJsonArrayObjects.test.ts +128 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +190 -1
- package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +461 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +25 -0
- package/Tests/Server/Utils/Billing/BillingFailureNoticeThrottle.test.ts +359 -0
- package/Tests/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.test.ts +318 -0
- package/Tests/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.test.ts +220 -0
- package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +1043 -0
- package/Tests/Server/Utils/Execute.test.ts +302 -0
- package/Tests/Server/Utils/GracefulShutdown.test.ts +565 -0
- package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +36 -20
- package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +750 -0
- package/Tests/Server/Utils/ProductAnalytics.test.ts +404 -0
- package/Tests/Server/Utils/Profiling.test.ts +366 -0
- package/Tests/Server/Utils/Rules/MonitorRuleCriteriaCache.test.ts +99 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +558 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +17 -0
- package/Tests/Types/Dashboard/DashboardTemplateEditorialInvariants.test.ts +659 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +97 -0
- package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +1179 -0
- package/Tests/Types/Database/AccessControl/OwnedThrough.test.ts +136 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +180 -1
- package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +13 -6
- package/Tests/UI/Components/Alert.test.tsx +532 -93
- package/Tests/UI/Components/Feed.test.tsx +241 -0
- package/Tests/UI/Components/Forms/BasicFormStepNavigation.test.tsx +368 -0
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +454 -0
- package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +290 -0
- package/Tests/UI/Components/Forms/ModelFormRuleCriteria.test.tsx +331 -0
- package/Tests/UI/Components/IconOpticalSize.test.tsx +79 -31
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +6 -6
- package/Tests/UI/Components/NavBar.test.tsx +91 -2
- package/Tests/UI/Components/PencilButton.test.tsx +211 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaBuilder.test.tsx +510 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +350 -0
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +50 -0
- package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +329 -0
- package/Tests/UI/Components/useFeedItems.test.tsx +107 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +401 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +1 -1
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +7 -1
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +2 -0
- package/Tests/UI/Rum/ReplayEngine.test.ts +1069 -5
- package/Tests/UI/Rum/ReplayHeader.test.tsx +579 -2
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +23 -5
- package/Tests/UI/Rum/ReplayRail.test.tsx +143 -1
- package/Tests/UI/Rum/ReplayRenderBudget.test.tsx +338 -0
- package/Tests/UI/Rum/ReplaySignals.test.ts +179 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +210 -3
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +180 -1
- package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +405 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +13 -16
- package/Tests/UI/Rum/SessionReplayFacets.test.tsx +199 -0
- package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +58 -21
- package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +2 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +717 -4
- package/Tests/UI/Rum/SessionReplayUsersPage.test.tsx +435 -0
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +577 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +1 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -1
- package/Tests/UI/Utils/LabelRuleImportExport.test.ts +192 -0
- package/Tests/UI/Utils/Navigation.test.ts +30 -0
- package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +880 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +158 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +93 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +138 -0
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +174 -0
- package/Tests/Utils/Rules/RuleCriteriaMatcher.test.ts +1424 -0
- package/Tests/Utils/Rum/SessionIdentity.test.ts +72 -0
- package/Tests/Utils/Slo/SloBurnRateRuleState.test.ts +374 -28
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +118 -0
- package/Types/Dashboard/DashboardTemplates.ts +465 -0
- package/Types/Rules/RuleCriteria.ts +51 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +437 -0
- package/Types/Rum/SessionReplay.ts +75 -0
- package/Types/Rum/SessionReplayApi.ts +93 -0
- package/UI/Components/Alerts/Alert.tsx +102 -72
- package/UI/Components/Button/Button.tsx +4 -1
- package/UI/Components/Dropdown/Dropdown.tsx +2 -0
- package/UI/Components/Feed/Feed.tsx +15 -0
- package/UI/Components/Feed/useFeedItems.ts +227 -0
- package/UI/Components/Forms/BasicForm.tsx +42 -21
- package/UI/Components/Forms/ModelForm.tsx +80 -1
- package/UI/Components/Icon/Icon.tsx +3 -35
- package/UI/Components/ModelTable/ModelTable.tsx +19 -0
- package/UI/Components/Navbar/NavBar.tsx +1 -0
- package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +735 -0
- package/UI/Components/RuleCriteria/RuleCriteriaModelForm.tsx +209 -0
- package/UI/Components/RuleCriteria/RuleCriteriaModelTable.tsx +205 -0
- package/UI/Components/RuleCriteria/RuleCriteriaSummary.tsx +123 -0
- package/UI/Components/Table/Table.tsx +3 -0
- package/UI/Components/Table/TableBody.tsx +3 -0
- package/UI/Components/Table/TableRow.tsx +8 -2
- package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +14 -2
- package/UI/Styles/Theme.css +1 -0
- package/UI/Utils/LabelRuleImportExport.ts +114 -6
- package/UI/Utils/Navigation.ts +1 -2
- package/UI/esbuild-config.js +46 -0
- package/Utils/Faker.ts +93 -6
- package/Utils/LabelRuleImportExport.ts +295 -2
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +108 -8
- package/Utils/NetworkSite/CidrMatchUtil.ts +102 -0
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +152 -2
- package/Utils/Rules/RuleCriteriaMatcher.ts +931 -0
- package/Utils/Rum/SessionIdentity.ts +16 -0
- package/Utils/Slo/SloBurnRateRuleState.ts +87 -33
- package/Utils/Telemetry/OriginAllowList.ts +74 -0
- package/build/dist/Models/AnalyticsModels/RumSession.js +32 -0
- package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/AlertReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AutoRemediationRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AutoRemediationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DashboardLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js +12 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js +50 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/HostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/HostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/IncidentReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSlaRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentSlaRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js +3 -4
- package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js +277 -0
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/MonitorLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServiceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +281 -4
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +211 -4
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js +301 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +38 -21
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +21 -0
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +44 -26
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +54 -11
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +235 -10
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +12 -0
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -0
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +39 -13
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +39 -9
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +44 -26
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +33 -12
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js +127 -0
- package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js.map +1 -0
- package/build/dist/Server/Services/IncomingCallPolicyService.js +187 -4
- package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +39 -7
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +2 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +57 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +2 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +56 -1
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +187 -22
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +126 -51
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js +115 -6
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js +12 -0
- package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +38 -9
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +38 -10
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +32 -14
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +554 -12
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +50 -14
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +25 -2
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js +19 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +14 -49
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +67 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +21 -4
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/IncomingCallPhoneNumber.js +9 -3
- package/build/dist/Server/Utils/IncomingCallPhoneNumber.js.map +1 -1
- package/build/dist/Server/Utils/Profiling.js +10 -1
- package/build/dist/Server/Utils/Profiling.js.map +1 -1
- package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js +30 -0
- package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +344 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +1 -1
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +2 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +425 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteria.js +18 -0
- package/build/dist/Types/Rules/RuleCriteria.js.map +1 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +426 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +64 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/UI/Components/Alerts/Alert.js +63 -41
- package/build/dist/UI/Components/Alerts/Alert.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +3 -1
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/Feed.js +4 -1
- package/build/dist/UI/Components/Feed/Feed.js.map +1 -1
- package/build/dist/UI/Components/Feed/useFeedItems.js +137 -0
- package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -0
- package/build/dist/UI/Components/Forms/BasicForm.js +38 -19
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +65 -1
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +3 -35
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +12 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +1 -0
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +383 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js +124 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js +126 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js +63 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +1 -1
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableBody.js +4 -2
- package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +3 -2
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +14 -2
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +1 -1
- package/build/dist/UI/Utils/LabelRuleImportExport.js +81 -5
- package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/Utils/Faker.js +76 -6
- package/build/dist/Utils/Faker.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +157 -3
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +81 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +77 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +109 -2
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -1
- package/build/dist/Utils/Rules/RuleCriteriaMatcher.js +526 -0
- package/build/dist/Utils/Rules/RuleCriteriaMatcher.js.map +1 -0
- package/build/dist/Utils/Rum/SessionIdentity.js +13 -1
- package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
- package/build/dist/Utils/Slo/SloBurnRateRuleState.js +28 -15
- package/build/dist/Utils/Slo/SloBurnRateRuleState.js.map +1 -1
- package/build/dist/Utils/Telemetry/OriginAllowList.js +61 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
- package/package.json +20 -20
|
@@ -8,28 +8,47 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
10
|
import AlertStateTimeline from "../../Models/DatabaseModels/AlertStateTimeline";
|
|
11
|
+
import IncidentStateTimeline from "../../Models/DatabaseModels/IncidentStateTimeline";
|
|
11
12
|
import Model from "../../Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule";
|
|
12
13
|
import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
13
14
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
15
|
+
import ProjectScopedReferenceValidator from "../Utils/Database/ProjectScopedReferenceValidator";
|
|
14
16
|
import logger from "../Utils/Logger";
|
|
15
17
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
16
18
|
import AlertService from "./AlertService";
|
|
19
|
+
import AlertSeverityService from "./AlertSeverityService";
|
|
17
20
|
import AlertStateTimelineService from "./AlertStateTimelineService";
|
|
18
21
|
import DatabaseService from "./DatabaseService";
|
|
22
|
+
import IncidentService from "./IncidentService";
|
|
23
|
+
import IncidentSeverityService from "./IncidentSeverityService";
|
|
24
|
+
import IncidentStateTimelineService from "./IncidentStateTimelineService";
|
|
19
25
|
const THRESHOLD_ERROR_MESSAGE = "Burn rate threshold must be greater than 0.";
|
|
20
26
|
const WINDOWS_REQUIRED_ERROR_MESSAGE = "Long window and short window are required for a burn rate rule.";
|
|
21
27
|
const WINDOWS_NOT_NUMERIC_ERROR_MESSAGE = "Long window and short window must be a number of minutes.";
|
|
28
|
+
export const NO_OUTPUT_ERROR_MESSAGE = "A burn rate rule must create an alert, declare an incident, or both.";
|
|
29
|
+
/*
|
|
30
|
+
* Mirrors the column defaults on the model. Every rule that predates incident
|
|
31
|
+
* support raised an alert and declared nothing, so that is what an unset
|
|
32
|
+
* payload still means.
|
|
33
|
+
*/
|
|
34
|
+
const DEFAULT_SHOULD_CREATE_ALERT = true;
|
|
35
|
+
const DEFAULT_SHOULD_CREATE_INCIDENT = false;
|
|
22
36
|
export class Service extends DatabaseService {
|
|
23
37
|
constructor() {
|
|
24
38
|
super(Model);
|
|
25
39
|
}
|
|
26
40
|
/*
|
|
27
|
-
* Deterministic fingerprint carried on
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
41
|
+
* Deterministic fingerprint carried on everything a burn rate rule
|
|
42
|
+
* declares — the Alert it raises, the Incident it declares, or both. The
|
|
43
|
+
* evaluation worker sets it as `seriesFingerprint` when the rule fires, and
|
|
44
|
+
* lifecycle hooks use it to find (and resolve) those records when the rule
|
|
45
|
+
* or its SLO goes away.
|
|
46
|
+
*
|
|
47
|
+
* One fingerprint serves both because Alert and Incident are separate
|
|
48
|
+
* tables: a rule can have at most one open Alert and one open Incident, and
|
|
49
|
+
* each dedupe query is already scoped to its own table.
|
|
31
50
|
*/
|
|
32
|
-
|
|
51
|
+
getBurnRateFingerprint(data) {
|
|
33
52
|
return `slo:${data.serviceLevelObjectiveId.toString()}:burn-rule:${data.burnRateRuleId.toString()}`;
|
|
34
53
|
}
|
|
35
54
|
async onBeforeCreate(createBy) {
|
|
@@ -63,6 +82,24 @@ export class Service extends DatabaseService {
|
|
|
63
82
|
createBy.data.refireSuppressionMinutes =
|
|
64
83
|
this.validateRefireSuppressionMinutes(createBy.data.refireSuppressionMinutes);
|
|
65
84
|
}
|
|
85
|
+
/*
|
|
86
|
+
* What the rule declares. Both are written back explicitly — leaving them
|
|
87
|
+
* off would let Postgres apply the column default, which is right for a
|
|
88
|
+
* fresh create but hides the decision from the row that the update hook
|
|
89
|
+
* later reads back.
|
|
90
|
+
*/
|
|
91
|
+
const shouldCreateAlert = this.normalizeBooleanInput(createBy.data.shouldCreateAlert, DEFAULT_SHOULD_CREATE_ALERT);
|
|
92
|
+
const shouldCreateIncident = this.normalizeBooleanInput(createBy.data.shouldCreateIncident, DEFAULT_SHOULD_CREATE_INCIDENT);
|
|
93
|
+
if (!shouldCreateAlert && !shouldCreateIncident) {
|
|
94
|
+
throw new BadDataException(NO_OUTPUT_ERROR_MESSAGE);
|
|
95
|
+
}
|
|
96
|
+
createBy.data.shouldCreateAlert = shouldCreateAlert;
|
|
97
|
+
createBy.data.shouldCreateIncident = shouldCreateIncident;
|
|
98
|
+
await this.validateSeverityReferences({
|
|
99
|
+
projectId: createBy.data.projectId || createBy.props.tenantId,
|
|
100
|
+
alertSeverityId: createBy.data.alertSeverityId,
|
|
101
|
+
incidentSeverityId: createBy.data.incidentSeverityId,
|
|
102
|
+
});
|
|
66
103
|
return {
|
|
67
104
|
createBy,
|
|
68
105
|
carryForward: null,
|
|
@@ -84,6 +121,8 @@ export class Service extends DatabaseService {
|
|
|
84
121
|
updateBy.data.refireSuppressionMinutes =
|
|
85
122
|
this.validateRefireSuppressionMinutes(updateBy.data.refireSuppressionMinutes);
|
|
86
123
|
}
|
|
124
|
+
await this.validateOutputsOnUpdate(updateBy);
|
|
125
|
+
await this.validateSeverityReferencesOnUpdate(updateBy);
|
|
87
126
|
const newLongWindow = updateBy.data.longWindowInMinutes;
|
|
88
127
|
const newShortWindow = updateBy.data
|
|
89
128
|
.shortWindowInMinutes;
|
|
@@ -153,9 +192,9 @@ export class Service extends DatabaseService {
|
|
|
153
192
|
async onBeforeDelete(deleteBy) {
|
|
154
193
|
var _a, _b;
|
|
155
194
|
/*
|
|
156
|
-
* Resolve
|
|
157
|
-
*
|
|
158
|
-
* evaluation worker only resolves
|
|
195
|
+
* Resolve anything the rules being deleted left open — otherwise the alert
|
|
196
|
+
* or incident (and its on-call escalations) stays open forever, because the
|
|
197
|
+
* evaluation worker only resolves records for rules that still exist.
|
|
159
198
|
*/
|
|
160
199
|
const itemsToDelete = await this.findBy({
|
|
161
200
|
query: deleteBy.query,
|
|
@@ -175,15 +214,15 @@ export class Service extends DatabaseService {
|
|
|
175
214
|
continue;
|
|
176
215
|
}
|
|
177
216
|
try {
|
|
178
|
-
await this.
|
|
217
|
+
await this.resolveOpenAlertsAndIncidentsForRule({
|
|
179
218
|
serviceLevelObjectiveId: item.serviceLevelObjectiveId,
|
|
180
219
|
burnRateRuleId: item.id,
|
|
181
220
|
projectId: item.projectId,
|
|
182
|
-
rootCause: "
|
|
221
|
+
rootCause: "Auto-resolved because the SLO burn rate rule that created it was deleted.",
|
|
183
222
|
});
|
|
184
223
|
}
|
|
185
224
|
catch (err) {
|
|
186
|
-
logger.error(`Error resolving open alerts for SLO burn rate rule ${(_a = item.id) === null || _a === void 0 ? void 0 : _a.toString()} before delete: ${err}`, { projectId: (_b = item.projectId) === null || _b === void 0 ? void 0 : _b.toString() });
|
|
225
|
+
logger.error(`Error resolving open alerts and incidents for SLO burn rate rule ${(_a = item.id) === null || _a === void 0 ? void 0 : _a.toString()} before delete: ${err}`, { projectId: (_b = item.projectId) === null || _b === void 0 ? void 0 : _b.toString() });
|
|
187
226
|
}
|
|
188
227
|
}
|
|
189
228
|
return {
|
|
@@ -193,6 +232,182 @@ export class Service extends DatabaseService {
|
|
|
193
232
|
},
|
|
194
233
|
};
|
|
195
234
|
}
|
|
235
|
+
/*
|
|
236
|
+
* A rule stops declaring something — it is disabled, or one of its two
|
|
237
|
+
* outputs is switched off — and whatever it already has open is now an
|
|
238
|
+
* orphan. The evaluation worker cannot clean it up: it only loads rules
|
|
239
|
+
* where `isEnabled` is true, and for an enabled rule it only resolves the
|
|
240
|
+
* output it is still allowed to create. So the alert (or incident) and its
|
|
241
|
+
* on-call escalation would page someone about a rule that can no longer
|
|
242
|
+
* justify the page.
|
|
243
|
+
*
|
|
244
|
+
* Runs after the write commits, so an update that was rejected leaves the
|
|
245
|
+
* open records exactly where they were.
|
|
246
|
+
*/
|
|
247
|
+
async onUpdateSuccess(onUpdate, updatedItemIds) {
|
|
248
|
+
/*
|
|
249
|
+
* These three reads are strict `=== false`, and that is only sound because
|
|
250
|
+
* onBeforeUpdate ran first: validateOutputsOnUpdate coerces both output
|
|
251
|
+
* flags, so the string `"false"` a form or a raw API call can send has
|
|
252
|
+
* already become a real boolean by the time it reaches here. If a path
|
|
253
|
+
* ever reaches onUpdateSuccess without that coercion, `"false" === false`
|
|
254
|
+
* is false and the orphaned record silently stays open — so the coercion
|
|
255
|
+
* is load-bearing, not tidiness.
|
|
256
|
+
*
|
|
257
|
+
* `isEnabled` is a plain Boolean column with no coercion hook, so a
|
|
258
|
+
* literal "false" string would slip past this check. That is pre-existing
|
|
259
|
+
* across every model in the codebase and is not worked around here; the
|
|
260
|
+
* dashboard's toggle sends a real boolean.
|
|
261
|
+
*/
|
|
262
|
+
const isRuleDisabled = onUpdate.updateBy.data.isEnabled === false;
|
|
263
|
+
const areAlertsTurnedOff = onUpdate.updateBy.data.shouldCreateAlert ===
|
|
264
|
+
false;
|
|
265
|
+
const areIncidentsTurnedOff = onUpdate.updateBy.data.shouldCreateIncident ===
|
|
266
|
+
false;
|
|
267
|
+
if (!isRuleDisabled && !areAlertsTurnedOff && !areIncidentsTurnedOff) {
|
|
268
|
+
return onUpdate;
|
|
269
|
+
}
|
|
270
|
+
for (const updatedItemId of updatedItemIds) {
|
|
271
|
+
try {
|
|
272
|
+
const rule = await this.findOneById({
|
|
273
|
+
id: updatedItemId,
|
|
274
|
+
select: {
|
|
275
|
+
_id: true,
|
|
276
|
+
projectId: true,
|
|
277
|
+
serviceLevelObjectiveId: true,
|
|
278
|
+
},
|
|
279
|
+
props: {
|
|
280
|
+
isRoot: true,
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
if (!rule || !rule.projectId || !rule.serviceLevelObjectiveId) {
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
/*
|
|
287
|
+
* The two outputs get their own try: they are independent lifecycles,
|
|
288
|
+
* and an alert that fails to resolve must not take the incident's
|
|
289
|
+
* resolve down with it — that is exactly how a live incident ends up
|
|
290
|
+
* escalating for a rule that no longer declares incidents.
|
|
291
|
+
*/
|
|
292
|
+
let clearAlert = false;
|
|
293
|
+
let clearIncident = false;
|
|
294
|
+
if (isRuleDisabled || areAlertsTurnedOff) {
|
|
295
|
+
try {
|
|
296
|
+
await this.resolveOpenAlertsForRule({
|
|
297
|
+
serviceLevelObjectiveId: rule.serviceLevelObjectiveId,
|
|
298
|
+
burnRateRuleId: updatedItemId,
|
|
299
|
+
projectId: rule.projectId,
|
|
300
|
+
rootCause: isRuleDisabled
|
|
301
|
+
? "Alert auto-resolved because the SLO burn rate rule that created it was disabled."
|
|
302
|
+
: "Alert auto-resolved because the SLO burn rate rule that created it no longer raises alerts.",
|
|
303
|
+
});
|
|
304
|
+
clearAlert = true;
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
logger.error(`Error resolving open alerts for SLO burn rate rule ${updatedItemId.toString()} after update: ${err}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (isRuleDisabled || areIncidentsTurnedOff) {
|
|
311
|
+
try {
|
|
312
|
+
await this.resolveOpenIncidentsForRule({
|
|
313
|
+
serviceLevelObjectiveId: rule.serviceLevelObjectiveId,
|
|
314
|
+
burnRateRuleId: updatedItemId,
|
|
315
|
+
projectId: rule.projectId,
|
|
316
|
+
rootCause: isRuleDisabled
|
|
317
|
+
? "Incident auto-resolved because the SLO burn rate rule that declared it was disabled."
|
|
318
|
+
: "Incident auto-resolved because the SLO burn rate rule that declared it no longer declares incidents.",
|
|
319
|
+
});
|
|
320
|
+
clearIncident = true;
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
logger.error(`Error resolving open incidents for SLO burn rate rule ${updatedItemId.toString()} after update: ${err}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/*
|
|
327
|
+
* Only forget the outputs that actually closed. A side that threw
|
|
328
|
+
* still has its record open, and clearing its column would tell the
|
|
329
|
+
* worker to declare a second one on top.
|
|
330
|
+
*/
|
|
331
|
+
await this.clearOpenOutputStateForRule({
|
|
332
|
+
burnRateRuleId: updatedItemId,
|
|
333
|
+
clearAlert: clearAlert,
|
|
334
|
+
clearIncident: clearIncident,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
catch (err) {
|
|
338
|
+
logger.error(`Error resolving open alerts and incidents for SLO burn rate rule ${updatedItemId.toString()} after update: ${err}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return onUpdate;
|
|
342
|
+
}
|
|
343
|
+
/*
|
|
344
|
+
* "A rule must declare something", enforced against the row that will
|
|
345
|
+
* EXIST after the update rather than against the payload alone.
|
|
346
|
+
*
|
|
347
|
+
* A form that only sends the field the user touched is the common case, so
|
|
348
|
+
* turning alerts off on a rule that already declares incidents has to be
|
|
349
|
+
* allowed while turning them off on a rule that declares nothing else must
|
|
350
|
+
* not be. Same shape as the single-window update path below: coerce the
|
|
351
|
+
* incoming value, then check it against each affected row's persisted
|
|
352
|
+
* sibling.
|
|
353
|
+
*/
|
|
354
|
+
async validateOutputsOnUpdate(updateBy) {
|
|
355
|
+
const newShouldCreateAlert = updateBy.data
|
|
356
|
+
.shouldCreateAlert;
|
|
357
|
+
const newShouldCreateIncident = updateBy.data
|
|
358
|
+
.shouldCreateIncident;
|
|
359
|
+
const isShouldCreateAlertUpdated = newShouldCreateAlert !== undefined && newShouldCreateAlert !== null;
|
|
360
|
+
const isShouldCreateIncidentUpdated = newShouldCreateIncident !== undefined && newShouldCreateIncident !== null;
|
|
361
|
+
if (!isShouldCreateAlertUpdated && !isShouldCreateIncidentUpdated) {
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
if (isShouldCreateAlertUpdated) {
|
|
365
|
+
updateBy.data.shouldCreateAlert = this.normalizeBooleanInput(newShouldCreateAlert, DEFAULT_SHOULD_CREATE_ALERT);
|
|
366
|
+
}
|
|
367
|
+
if (isShouldCreateIncidentUpdated) {
|
|
368
|
+
updateBy.data.shouldCreateIncident = this.normalizeBooleanInput(newShouldCreateIncident, DEFAULT_SHOULD_CREATE_INCIDENT);
|
|
369
|
+
}
|
|
370
|
+
const updatedShouldCreateAlert = Boolean(updateBy.data.shouldCreateAlert);
|
|
371
|
+
const updatedShouldCreateIncident = Boolean(updateBy.data.shouldCreateIncident);
|
|
372
|
+
if (isShouldCreateAlertUpdated && isShouldCreateIncidentUpdated) {
|
|
373
|
+
if (!updatedShouldCreateAlert && !updatedShouldCreateIncident) {
|
|
374
|
+
throw new BadDataException(NO_OUTPUT_ERROR_MESSAGE);
|
|
375
|
+
}
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
/*
|
|
379
|
+
* Only one flag is being written. Switching one ON can never leave a rule
|
|
380
|
+
* with nothing, so there is nothing to read back for it.
|
|
381
|
+
*/
|
|
382
|
+
if ((isShouldCreateAlertUpdated && updatedShouldCreateAlert) ||
|
|
383
|
+
(isShouldCreateIncidentUpdated && updatedShouldCreateIncident)) {
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
const rulesToUpdate = await this.findBy({
|
|
387
|
+
query: updateBy.query,
|
|
388
|
+
select: {
|
|
389
|
+
_id: true,
|
|
390
|
+
shouldCreateAlert: true,
|
|
391
|
+
shouldCreateIncident: true,
|
|
392
|
+
},
|
|
393
|
+
limit: LIMIT_PER_PROJECT,
|
|
394
|
+
skip: 0,
|
|
395
|
+
props: {
|
|
396
|
+
isRoot: true,
|
|
397
|
+
},
|
|
398
|
+
});
|
|
399
|
+
for (const rule of rulesToUpdate) {
|
|
400
|
+
const resultingShouldCreateAlert = isShouldCreateAlertUpdated
|
|
401
|
+
? updatedShouldCreateAlert
|
|
402
|
+
: this.normalizeBooleanInput(rule.shouldCreateAlert, DEFAULT_SHOULD_CREATE_ALERT);
|
|
403
|
+
const resultingShouldCreateIncident = isShouldCreateIncidentUpdated
|
|
404
|
+
? updatedShouldCreateIncident
|
|
405
|
+
: this.normalizeBooleanInput(rule.shouldCreateIncident, DEFAULT_SHOULD_CREATE_INCIDENT);
|
|
406
|
+
if (!resultingShouldCreateAlert && !resultingShouldCreateIncident) {
|
|
407
|
+
throw new BadDataException(NO_OUTPUT_ERROR_MESSAGE);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
196
411
|
/*
|
|
197
412
|
* Resolve all open Alerts carrying this rule's fingerprint by appending a
|
|
198
413
|
* resolved AlertStateTimeline row. Mirrors
|
|
@@ -201,7 +416,7 @@ export class Service extends DatabaseService {
|
|
|
201
416
|
*/
|
|
202
417
|
async resolveOpenAlertsForRule(data) {
|
|
203
418
|
var _a, _b, _c, _d;
|
|
204
|
-
const fingerprint = this.
|
|
419
|
+
const fingerprint = this.getBurnRateFingerprint({
|
|
205
420
|
serviceLevelObjectiveId: data.serviceLevelObjectiveId,
|
|
206
421
|
burnRateRuleId: data.burnRateRuleId,
|
|
207
422
|
});
|
|
@@ -227,6 +442,19 @@ export class Service extends DatabaseService {
|
|
|
227
442
|
return;
|
|
228
443
|
}
|
|
229
444
|
const resolvedStateId = await AlertStateTimelineService.getResolvedStateIdForProject(data.projectId);
|
|
445
|
+
/*
|
|
446
|
+
* Per-record isolation, but NOT per-record silence: one record that fails
|
|
447
|
+
* to resolve must not stop the others, and must still reach the caller.
|
|
448
|
+
* Every caller above this treats a clean return as "there is nothing left
|
|
449
|
+
* open" — the worker stamps the rule resolved, and its Paused /
|
|
450
|
+
* Misconfigured guard commits a status change that makes the whole attempt
|
|
451
|
+
* one-shot. Swallowing a single failed state-timeline write therefore
|
|
452
|
+
* strands that record, and its on-call escalation, permanently.
|
|
453
|
+
*
|
|
454
|
+
* The idempotent same-state race below is not a failure and is
|
|
455
|
+
* deliberately not counted.
|
|
456
|
+
*/
|
|
457
|
+
let firstError = null;
|
|
230
458
|
for (const openAlert of openAlerts) {
|
|
231
459
|
try {
|
|
232
460
|
const alertStateTimeline = new AlertStateTimeline();
|
|
@@ -263,8 +491,298 @@ export class Service extends DatabaseService {
|
|
|
263
491
|
}
|
|
264
492
|
catch (err) {
|
|
265
493
|
logger.error(`Error resolving open alert ${(_b = openAlert.id) === null || _b === void 0 ? void 0 : _b.toString()} for SLO burn rate rule ${(_c = data.burnRateRuleId) === null || _c === void 0 ? void 0 : _c.toString()}: ${err}`, { projectId: (_d = data.projectId) === null || _d === void 0 ? void 0 : _d.toString() });
|
|
494
|
+
if (firstError === null) {
|
|
495
|
+
firstError = err;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
if (firstError !== null) {
|
|
500
|
+
throw firstError;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/*
|
|
504
|
+
* Both severity columns are plain foreign keys with no project scoping of
|
|
505
|
+
* their own, so the public CRUD API will happily persist a severity that
|
|
506
|
+
* belongs to a different project. Nothing notices until the worker fires:
|
|
507
|
+
* IncidentService.onBeforeCreate rejects the cross-project reference on
|
|
508
|
+
* EVERY tick, the evaluation loop swallows the throw into a log line, and
|
|
509
|
+
* the rule looks configured while declaring nothing forever.
|
|
510
|
+
*
|
|
511
|
+
* The validator also rejects an id that matches no row at all, which is the
|
|
512
|
+
* other way a hand-written API call produces a rule that can never fire.
|
|
513
|
+
*/
|
|
514
|
+
async validateSeverityReferences(data) {
|
|
515
|
+
if (!data.projectId) {
|
|
516
|
+
/*
|
|
517
|
+
* No project to validate against. The tenant column is required, so the
|
|
518
|
+
* write is going to fail anyway — and failing here would turn a clear
|
|
519
|
+
* "projectId is required" into a confusing severity error.
|
|
520
|
+
*/
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
if (!data.alertSeverityId && !data.incidentSeverityId) {
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
await ProjectScopedReferenceValidator.validateReferencesBelongToProject({
|
|
527
|
+
projectId: data.projectId,
|
|
528
|
+
subject: "SLO burn rate rule",
|
|
529
|
+
references: [
|
|
530
|
+
{
|
|
531
|
+
modelName: "Alert Severity",
|
|
532
|
+
id: data.alertSeverityId,
|
|
533
|
+
service: AlertSeverityService,
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
modelName: "Incident Severity",
|
|
537
|
+
id: data.incidentSeverityId,
|
|
538
|
+
service: IncidentSeverityService,
|
|
539
|
+
},
|
|
540
|
+
],
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
/*
|
|
544
|
+
* The update twin. A root or API update does not always carry a tenantId, so
|
|
545
|
+
* fall back to the projects of the rows the query actually matches — the
|
|
546
|
+
* shape ScheduledMaintenanceService uses for the same problem.
|
|
547
|
+
*/
|
|
548
|
+
async validateSeverityReferencesOnUpdate(updateBy) {
|
|
549
|
+
const alertSeverityId = updateBy.data
|
|
550
|
+
.alertSeverityId;
|
|
551
|
+
const incidentSeverityId = updateBy.data
|
|
552
|
+
.incidentSeverityId;
|
|
553
|
+
if (!alertSeverityId && !incidentSeverityId) {
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
const projectIds = updateBy.props.tenantId
|
|
557
|
+
? [updateBy.props.tenantId]
|
|
558
|
+
: await this.getProjectIdsForUpdateQuery(updateBy);
|
|
559
|
+
for (const projectId of projectIds) {
|
|
560
|
+
await this.validateSeverityReferences({
|
|
561
|
+
projectId: projectId,
|
|
562
|
+
alertSeverityId: alertSeverityId,
|
|
563
|
+
incidentSeverityId: incidentSeverityId,
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
async getProjectIdsForUpdateQuery(updateBy) {
|
|
568
|
+
const rules = await this.findBy({
|
|
569
|
+
query: updateBy.query,
|
|
570
|
+
select: {
|
|
571
|
+
projectId: true,
|
|
572
|
+
},
|
|
573
|
+
limit: LIMIT_PER_PROJECT,
|
|
574
|
+
skip: 0,
|
|
575
|
+
props: {
|
|
576
|
+
isRoot: true,
|
|
577
|
+
},
|
|
578
|
+
});
|
|
579
|
+
const projectIds = {};
|
|
580
|
+
for (const rule of rules) {
|
|
581
|
+
if (rule.projectId) {
|
|
582
|
+
projectIds[rule.projectId.toString()] = rule.projectId;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
return Object.values(projectIds);
|
|
586
|
+
}
|
|
587
|
+
/*
|
|
588
|
+
* Forget that the rule has an output open, WITHOUT stamping a resolve.
|
|
589
|
+
*
|
|
590
|
+
* The rule's four lifecycle columns are what the evaluation worker reads to
|
|
591
|
+
* decide whether an output is already open, so a path that closes the record
|
|
592
|
+
* but leaves `lastAlertCreatedAt` / `lastIncidentCreatedAt` set tells the
|
|
593
|
+
* next tick "there is already an alert open" when there is not — and the
|
|
594
|
+
* worker then refuses to declare anything for the rest of the burn. That is
|
|
595
|
+
* how "turn Create Alert off to stop the noise, then turn it back on" used
|
|
596
|
+
* to silence a live 14.4x fast burn.
|
|
597
|
+
*
|
|
598
|
+
* Clearing the CREATED column rather than stamping the RESOLVED one is the
|
|
599
|
+
* whole point. Stamping a resolve would open a re-fire suppression window of
|
|
600
|
+
* up to the rule's long window (six hours for the seeded Slow burn), so
|
|
601
|
+
* re-enabling a rule mid-outage would go quiet anyway. Nothing about the
|
|
602
|
+
* burn rate recovered here; an administrator ended the lifecycle, and the
|
|
603
|
+
* honest record of that is "nothing is open", not "it just resolved".
|
|
604
|
+
*
|
|
605
|
+
* The cost is the rule's "last fired" history: a rule whose SLO was disabled
|
|
606
|
+
* once reads as never having fired. That is the right trade against silently
|
|
607
|
+
* losing a page, and it is the same reset an administrator just performed.
|
|
608
|
+
*
|
|
609
|
+
* Hookless on purpose. These are worker-owned columns that no workflow can
|
|
610
|
+
* meaningfully trigger on, and the caller is often onUpdateSuccess — a
|
|
611
|
+
* hooked write from inside an update hook re-enters the whole pipeline to
|
|
612
|
+
* write two nullable timestamps.
|
|
613
|
+
*/
|
|
614
|
+
async clearOpenOutputStateForRule(data) {
|
|
615
|
+
const columns = {};
|
|
616
|
+
if (data.clearAlert) {
|
|
617
|
+
columns.lastAlertCreatedAt = null;
|
|
618
|
+
}
|
|
619
|
+
if (data.clearIncident) {
|
|
620
|
+
columns.lastIncidentCreatedAt = null;
|
|
621
|
+
}
|
|
622
|
+
if (Object.keys(columns).length === 0) {
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
await this.updateColumnsByIdWithoutHooks({
|
|
626
|
+
id: data.burnRateRuleId,
|
|
627
|
+
data: columns,
|
|
628
|
+
});
|
|
629
|
+
}
|
|
630
|
+
/*
|
|
631
|
+
* The Incident twin of resolveOpenAlertsForRule. Same shape, different
|
|
632
|
+
* table: find every open Incident carrying this rule's fingerprint and
|
|
633
|
+
* append a resolved IncidentStateTimeline row.
|
|
634
|
+
*
|
|
635
|
+
* Kept as its own method rather than folded into the alert path because the
|
|
636
|
+
* two are resolved independently — turning `shouldCreateIncident` off must close
|
|
637
|
+
* the incident and leave the alert alone, and vice versa.
|
|
638
|
+
*/
|
|
639
|
+
async resolveOpenIncidentsForRule(data) {
|
|
640
|
+
var _a, _b, _c, _d;
|
|
641
|
+
const fingerprint = this.getBurnRateFingerprint({
|
|
642
|
+
serviceLevelObjectiveId: data.serviceLevelObjectiveId,
|
|
643
|
+
burnRateRuleId: data.burnRateRuleId,
|
|
644
|
+
});
|
|
645
|
+
const openIncidents = await IncidentService.findBy({
|
|
646
|
+
query: {
|
|
647
|
+
projectId: data.projectId,
|
|
648
|
+
seriesFingerprint: fingerprint,
|
|
649
|
+
currentIncidentState: {
|
|
650
|
+
isResolvedState: false,
|
|
651
|
+
},
|
|
652
|
+
},
|
|
653
|
+
select: {
|
|
654
|
+
_id: true,
|
|
655
|
+
projectId: true,
|
|
656
|
+
},
|
|
657
|
+
skip: 0,
|
|
658
|
+
limit: LIMIT_PER_PROJECT,
|
|
659
|
+
props: {
|
|
660
|
+
isRoot: true,
|
|
661
|
+
},
|
|
662
|
+
});
|
|
663
|
+
if (openIncidents.length === 0) {
|
|
664
|
+
return;
|
|
665
|
+
}
|
|
666
|
+
/*
|
|
667
|
+
* Looked up once for the batch, and only once there is something to
|
|
668
|
+
* resolve: it throws when the project has no resolved incident state, and
|
|
669
|
+
* a project with nothing open must not be failed for a state it never
|
|
670
|
+
* needed.
|
|
671
|
+
*/
|
|
672
|
+
const resolvedStateId = await IncidentStateTimelineService.getResolvedStateIdForProject(data.projectId);
|
|
673
|
+
/*
|
|
674
|
+
* Per-record isolation, but NOT per-record silence: one record that fails
|
|
675
|
+
* to resolve must not stop the others, and must still reach the caller.
|
|
676
|
+
* Every caller above this treats a clean return as "there is nothing left
|
|
677
|
+
* open" — the worker stamps the rule resolved, and its Paused /
|
|
678
|
+
* Misconfigured guard commits a status change that makes the whole attempt
|
|
679
|
+
* one-shot. Swallowing a single failed state-timeline write therefore
|
|
680
|
+
* strands that record, and its on-call escalation, permanently.
|
|
681
|
+
*
|
|
682
|
+
* The idempotent same-state race below is not a failure and is
|
|
683
|
+
* deliberately not counted.
|
|
684
|
+
*/
|
|
685
|
+
let firstError = null;
|
|
686
|
+
for (const openIncident of openIncidents) {
|
|
687
|
+
try {
|
|
688
|
+
const incidentStateTimeline = new IncidentStateTimeline();
|
|
689
|
+
incidentStateTimeline.incidentId = openIncident.id;
|
|
690
|
+
incidentStateTimeline.incidentStateId = resolvedStateId;
|
|
691
|
+
incidentStateTimeline.projectId = openIncident.projectId;
|
|
692
|
+
incidentStateTimeline.rootCause =
|
|
693
|
+
data.rootCause ||
|
|
694
|
+
"Incident auto-resolved because the SLO burn rate rule that declared it is no longer active.";
|
|
695
|
+
try {
|
|
696
|
+
await IncidentStateTimelineService.create({
|
|
697
|
+
data: incidentStateTimeline,
|
|
698
|
+
props: {
|
|
699
|
+
isRoot: true,
|
|
700
|
+
},
|
|
701
|
+
});
|
|
702
|
+
}
|
|
703
|
+
catch (err) {
|
|
704
|
+
/*
|
|
705
|
+
* Idempotent concurrency race, exactly as on the alert path: the
|
|
706
|
+
* evaluation worker and a lifecycle hook can both decide to resolve
|
|
707
|
+
* the same open incident. The loser's onBeforeCreate dedupe throws
|
|
708
|
+
* this exact BadDataException. Match the message so unrelated
|
|
709
|
+
* BadDataExceptions (state ordering, for instance) still propagate.
|
|
710
|
+
*/
|
|
711
|
+
if (err instanceof BadDataException &&
|
|
712
|
+
err.message === "Incident state cannot be same as previous state.") {
|
|
713
|
+
logger.debug(`${(_a = openIncident.id) === null || _a === void 0 ? void 0 : _a.toString()} - Incident already in resolved state; skipping duplicate state timeline (concurrent race).`);
|
|
714
|
+
}
|
|
715
|
+
else {
|
|
716
|
+
throw err;
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
catch (err) {
|
|
721
|
+
logger.error(`Error resolving open incident ${(_b = openIncident.id) === null || _b === void 0 ? void 0 : _b.toString()} for SLO burn rate rule ${(_c = data.burnRateRuleId) === null || _c === void 0 ? void 0 : _c.toString()}: ${err}`, { projectId: (_d = data.projectId) === null || _d === void 0 ? void 0 : _d.toString() });
|
|
722
|
+
if (firstError === null) {
|
|
723
|
+
firstError = err;
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
if (firstError !== null) {
|
|
728
|
+
throw firstError;
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
/*
|
|
732
|
+
* Close everything a rule has open, whichever of the two outputs produced
|
|
733
|
+
* it. This is what every "the rule can no longer justify what it opened"
|
|
734
|
+
* caller wants — the worker's recovery branch, the delete hook, and the
|
|
735
|
+
* SLO-level disable/delete path — because a rule's configuration can have
|
|
736
|
+
* changed since the record was opened, so "it declares incidents now" is not
|
|
737
|
+
* a safe proxy for "it has no open alert".
|
|
738
|
+
*
|
|
739
|
+
* A failure on one side must not strand the other, so the incident pass runs
|
|
740
|
+
* even when the alert pass throws, and the first error is rethrown after
|
|
741
|
+
* both have run.
|
|
742
|
+
*/
|
|
743
|
+
async resolveOpenAlertsAndIncidentsForRule(data) {
|
|
744
|
+
let firstError = null;
|
|
745
|
+
try {
|
|
746
|
+
await this.resolveOpenAlertsForRule(data);
|
|
747
|
+
}
|
|
748
|
+
catch (err) {
|
|
749
|
+
firstError = err;
|
|
750
|
+
}
|
|
751
|
+
try {
|
|
752
|
+
await this.resolveOpenIncidentsForRule(data);
|
|
753
|
+
}
|
|
754
|
+
catch (err) {
|
|
755
|
+
if (firstError === null) {
|
|
756
|
+
firstError = err;
|
|
266
757
|
}
|
|
267
758
|
}
|
|
759
|
+
if (firstError !== null) {
|
|
760
|
+
throw firstError;
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
/*
|
|
764
|
+
* Coerce an API-supplied boolean column. Toggles in the dashboard send real
|
|
765
|
+
* booleans, but the CRUD API is public and BaseModel.fromJSON does not
|
|
766
|
+
* coerce Boolean columns, so `"false"` arrives as a non-empty string — which
|
|
767
|
+
* is truthy, and would quietly turn a rule that declares nothing into a rule
|
|
768
|
+
* that declares both. An absent value means "leave it at the default", which
|
|
769
|
+
* is what a create payload that never mentions the field intends.
|
|
770
|
+
*/
|
|
771
|
+
normalizeBooleanInput(value, defaultValue) {
|
|
772
|
+
if (value === undefined || value === null) {
|
|
773
|
+
return defaultValue;
|
|
774
|
+
}
|
|
775
|
+
if (typeof value === "boolean") {
|
|
776
|
+
return value;
|
|
777
|
+
}
|
|
778
|
+
if (typeof value === "string") {
|
|
779
|
+
const normalized = value.trim().toLowerCase();
|
|
780
|
+
if (normalized === "") {
|
|
781
|
+
return defaultValue;
|
|
782
|
+
}
|
|
783
|
+
return normalized !== "false" && normalized !== "0";
|
|
784
|
+
}
|
|
785
|
+
return Boolean(value);
|
|
268
786
|
}
|
|
269
787
|
/*
|
|
270
788
|
* Coerce an API-supplied numeric column to a number. HTML number inputs hand
|
|
@@ -348,11 +866,35 @@ __decorate([
|
|
|
348
866
|
__metadata("design:paramtypes", [Object]),
|
|
349
867
|
__metadata("design:returntype", Promise)
|
|
350
868
|
], Service.prototype, "onBeforeDelete", null);
|
|
869
|
+
__decorate([
|
|
870
|
+
CaptureSpan(),
|
|
871
|
+
__metadata("design:type", Function),
|
|
872
|
+
__metadata("design:paramtypes", [Object, Array]),
|
|
873
|
+
__metadata("design:returntype", Promise)
|
|
874
|
+
], Service.prototype, "onUpdateSuccess", null);
|
|
351
875
|
__decorate([
|
|
352
876
|
CaptureSpan(),
|
|
353
877
|
__metadata("design:type", Function),
|
|
354
878
|
__metadata("design:paramtypes", [Object]),
|
|
355
879
|
__metadata("design:returntype", Promise)
|
|
356
880
|
], Service.prototype, "resolveOpenAlertsForRule", null);
|
|
881
|
+
__decorate([
|
|
882
|
+
CaptureSpan(),
|
|
883
|
+
__metadata("design:type", Function),
|
|
884
|
+
__metadata("design:paramtypes", [Object]),
|
|
885
|
+
__metadata("design:returntype", Promise)
|
|
886
|
+
], Service.prototype, "clearOpenOutputStateForRule", null);
|
|
887
|
+
__decorate([
|
|
888
|
+
CaptureSpan(),
|
|
889
|
+
__metadata("design:type", Function),
|
|
890
|
+
__metadata("design:paramtypes", [Object]),
|
|
891
|
+
__metadata("design:returntype", Promise)
|
|
892
|
+
], Service.prototype, "resolveOpenIncidentsForRule", null);
|
|
893
|
+
__decorate([
|
|
894
|
+
CaptureSpan(),
|
|
895
|
+
__metadata("design:type", Function),
|
|
896
|
+
__metadata("design:paramtypes", [Object]),
|
|
897
|
+
__metadata("design:returntype", Promise)
|
|
898
|
+
], Service.prototype, "resolveOpenAlertsAndIncidentsForRule", null);
|
|
357
899
|
export default new Service();
|
|
358
900
|
//# sourceMappingURL=ServiceLevelObjectiveBurnRateRuleService.js.map
|