@oneuptime/common 13.0.5 → 13.0.6
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/AuditLog.ts +81 -1
- package/Models/AnalyticsModels/SecurityEvent.ts +4 -4
- package/Models/DatabaseModels/Alert.ts +62 -0
- package/Models/DatabaseModels/GlobalConfig.ts +1 -1
- package/Models/DatabaseModels/Incident.ts +66 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +74 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +74 -0
- package/Models/DatabaseModels/Index.ts +6 -4
- package/Models/DatabaseModels/NetworkDevice.ts +67 -0
- package/Models/DatabaseModels/NetworkDeviceDiagnostic.ts +746 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +151 -0
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +1 -1
- package/Models/DatabaseModels/Project.ts +41 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +74 -0
- package/Models/DatabaseModels/SecurityEventConnection.ts +11 -11
- package/Models/DatabaseModels/ServiceLevelObjective.ts +185 -8
- package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +746 -43
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +575 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +582 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +16 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +16 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +75 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +1 -1
- package/Server/API/BaseAPI.ts +17 -0
- package/Server/API/BillingInvoiceAPI.ts +343 -30
- package/Server/API/BillingPaymentMethodAPI.ts +126 -5
- package/Server/API/DashboardAPI.ts +96 -2
- package/Server/API/SecurityEventConnectionAPI.ts +141 -11
- package/Server/API/StatusPageAPI.ts +308 -199
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.ts +36 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.ts +516 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.ts +98 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +138 -67
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +213 -84
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +112 -35
- package/Server/Services/AlertLabelRuleEngineService.ts +299 -217
- package/Server/Services/AlertOwnerRuleEngineService.ts +572 -396
- package/Server/Services/AlertPrivacyRuleEngineService.ts +116 -40
- package/Server/Services/AlertService.ts +111 -4
- package/Server/Services/AuditLogService.ts +612 -59
- package/Server/Services/BillingInvoiceService.ts +112 -102
- package/Server/Services/BillingService.ts +539 -11
- package/Server/Services/CephClusterLabelRuleEngineService.ts +170 -109
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +233 -115
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +163 -100
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +236 -115
- package/Server/Services/DashboardLabelRuleEngineService.ts +145 -84
- package/Server/Services/DashboardOwnerRuleEngineService.ts +213 -95
- package/Server/Services/DatabaseService.ts +171 -21
- package/Server/Services/DockerHostLabelRuleEngineService.ts +171 -110
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +233 -115
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +181 -112
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +243 -118
- package/Server/Services/HostLabelRuleEngineService.ts +167 -106
- package/Server/Services/HostOwnerRuleEngineService.ts +229 -111
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +141 -67
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +272 -72
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +112 -35
- package/Server/Services/IncidentEpisodePublicNoteService.ts +24 -0
- package/Server/Services/IncidentLabelRuleEngineService.ts +279 -204
- package/Server/Services/IncidentOwnerRuleEngineService.ts +595 -425
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +117 -44
- package/Server/Services/IncidentPublicNoteService.ts +24 -0
- package/Server/Services/IncidentService.ts +114 -3
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +147 -83
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +221 -100
- package/Server/Services/Index.ts +6 -4
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +145 -84
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +213 -95
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +181 -112
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +243 -118
- package/Server/Services/LabelService.ts +23 -28
- package/Server/Services/MonitorLabelRuleEngineService.ts +152 -92
- package/Server/Services/MonitorOwnerRuleEngineService.ts +220 -104
- package/Server/Services/MonitorProbeService.ts +20 -2
- package/Server/Services/MonitorService.ts +11 -9
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +376 -5
- package/Server/Services/NetworkDeviceDiagnosticService.ts +417 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +147 -83
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +218 -97
- package/Server/Services/NetworkDeviceService.ts +39 -2
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +151 -80
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +222 -97
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +154 -83
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +225 -100
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +171 -110
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +235 -115
- package/Server/Services/ProjectService.ts +111 -10
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +174 -110
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +239 -116
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +137 -73
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +200 -83
- package/Server/Services/RunbookLabelRuleEngineService.ts +146 -84
- package/Server/Services/RunbookOwnerRuleEngineService.ts +216 -95
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +324 -230
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +613 -428
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +24 -0
- package/Server/Services/ScheduledMaintenanceService.ts +43 -14
- package/Server/Services/SecurityEventConnectionService.ts +56 -4
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +143 -74
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +206 -85
- package/Server/Services/ServiceLabelRuleEngineService.ts +172 -110
- package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +1057 -18
- package/Server/Services/ServiceLevelObjectiveFeedService.ts +108 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +793 -97
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +1069 -0
- package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +240 -1
- package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +257 -1
- package/Server/Services/ServiceLevelObjectiveService.ts +1356 -56
- package/Server/Services/ServiceOwnerRuleEngineService.ts +238 -116
- package/Server/Services/StatusPageAnnouncementService.ts +13 -0
- package/Server/Services/StatusPageLabelRuleEngineService.ts +146 -85
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +210 -99
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +28 -232
- package/Server/Services/StatusPageSubscriberService.ts +6 -0
- package/Server/Services/TelemetryUsageBillingService.ts +38 -7
- package/Server/Services/ThreatIntelFeedService.ts +1 -1
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +173 -110
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +238 -116
- package/Server/Services/WorkflowLabelRuleEngineService.ts +145 -84
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +215 -95
- package/Server/Types/Database/UpdateByID.ts +3 -0
- package/Server/Types/Database/UpdateOneBy.ts +7 -0
- package/Server/Utils/AI/AlertAIContextBuilder.ts +19 -0
- package/Server/Utils/AI/IncidentAIContextBuilder.ts +39 -0
- package/Server/Utils/AI/Toolbox/AlertTools.ts +37 -1
- package/Server/Utils/AI/Toolbox/IncidentTools.ts +22 -1
- package/Server/Utils/AI/Toolbox/SloTools.ts +416 -51
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +151 -13
- package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +17 -4
- package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +155 -8
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +16 -0
- package/Server/Utils/Database/RelationValueUtil.ts +106 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +6 -1
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +22 -27
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +3 -1
- package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +50 -20
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +13 -1
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +6 -11
- package/Server/Utils/Rules/MonitorRulePatternValidator.ts +51 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +110 -0
- package/Server/Utils/Rules/RuleRun/RuleApplication.ts +81 -0
- package/Server/Utils/Rules/RuleRun/RuleRunPermission.ts +188 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +803 -0
- package/Server/Utils/Rules/RuleRun/RuleRunner.ts +341 -0
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +3 -2
- package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +6 -4
- package/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.ts +263 -16
- package/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.ts +2101 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +194 -14
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +1 -2
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +38 -7
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +2 -0
- package/Server/Utils/SecurityEvent/Connectors/Types.ts +242 -2
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +1 -1
- package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +3 -3
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +2 -2
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +217 -56
- package/Server/Utils/Slo/SloFeedUtil.ts +200 -0
- package/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.ts +173 -0
- package/Server/Utils/Slo/SloMetricUtil.ts +327 -0
- package/Server/Utils/Slo/SloOwnerReferenceValidator.ts +208 -0
- package/Server/Utils/Slo/SloRecordReferenceValidator.ts +169 -0
- package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +6 -43
- package/Server/Utils/StatusPageResource.ts +50 -5
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +664 -15
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +4 -1
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +307 -0
- package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +289 -0
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +598 -0
- package/Tests/App/Dashboard/BillingDefaultPaymentMethod.test.tsx +1046 -0
- package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +3 -0
- package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +201 -7
- package/Tests/App/Dashboard/BooleanSeriesCriteriaFilterText.test.ts +82 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +16 -1
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +116 -8
- package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +168 -1
- package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +1 -1
- package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +20 -3
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +1095 -1
- package/Tests/App/Dashboard/CorrelateFilterChips.test.tsx +910 -0
- package/Tests/App/Dashboard/CorrelateGraph.test.tsx +3747 -25
- package/Tests/App/Dashboard/CorrelateGraphHelpers.test.ts +1085 -0
- package/Tests/App/Dashboard/CorrelateInspector.test.tsx +1534 -0
- package/Tests/App/Dashboard/CorrelateNodeCard.test.tsx +965 -0
- package/Tests/App/Dashboard/CorrelateResultSummary.test.tsx +1525 -0
- package/Tests/App/Dashboard/CorrelationGraph.test.ts +1030 -0
- package/Tests/App/Dashboard/CorrelationGraphLayout.test.ts +526 -0
- package/Tests/App/Dashboard/DeviceDiagnostics.test.tsx +787 -0
- package/Tests/App/Dashboard/DeviceLatencyTrend.test.tsx +278 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +279 -0
- package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +87 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +443 -8
- package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +340 -0
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +98 -2
- package/Tests/App/Dashboard/ExceptionSegmentedControl.test.tsx +1020 -0
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +268 -47
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1114 -76
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +124 -2
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +279 -176
- package/Tests/App/Dashboard/InvestigationRunDetails.test.tsx +1166 -0
- package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +437 -0
- package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +65 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +5 -0
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +74 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +125 -5
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +1764 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1000 -64
- package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +448 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +739 -189
- package/Tests/App/Dashboard/SecurityEventSeverityPill.test.tsx +233 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +282 -0
- package/Tests/App/Dashboard/SloActiveBurnEventsCard.test.tsx +538 -0
- package/Tests/App/Dashboard/SloBulkActionsArchive.test.tsx +252 -0
- package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +322 -518
- package/Tests/App/Dashboard/SloElement.test.tsx +194 -0
- package/Tests/App/Dashboard/SloFeed.test.tsx +289 -0
- package/Tests/App/Dashboard/SloHistoryCharts.test.tsx +471 -0
- package/Tests/App/Dashboard/SloHistorySeries.test.tsx +607 -0
- package/Tests/App/Dashboard/SloListWidget.test.tsx +783 -0
- package/Tests/App/Dashboard/SloMetricsPage.test.tsx +346 -0
- package/Tests/App/Dashboard/SloMonitorsPage.test.tsx +661 -0
- package/Tests/App/Dashboard/SloMonitorsSummaryCard.test.tsx +489 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +437 -0
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +305 -0
- package/Tests/App/Dashboard/SloOverviewData.test.tsx +563 -0
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +311 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +426 -0
- package/Tests/App/Dashboard/SloOverviewSidebarCards.test.tsx +493 -0
- package/Tests/App/Dashboard/SloSettings.test.tsx +633 -0
- package/Tests/App/Dashboard/SloStatusSummaryCards.test.tsx +403 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +373 -0
- package/Tests/App/Dashboard/SloWidgetVariableBinding.test.tsx +689 -0
- package/Tests/App/Dashboard/TopologyConnectivitySection.test.tsx +206 -0
- package/Tests/App/Dashboard/TracesEntityNames.test.tsx +47 -15
- package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +1312 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +9 -1
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +14 -16
- package/Tests/Models/DatabaseModels/AuditLogModelConfiguration.test.ts +442 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +9 -10
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +48 -1
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +835 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +3 -2
- package/Tests/Models/DiscoveryScanNetbiosLookupColumn.test.ts +328 -0
- package/Tests/Models/DiscoveryScanShortDeviceNamesColumn.test.ts +335 -0
- package/Tests/Models/NetworkDeviceDiagnosticContract.test.ts +194 -0
- package/Tests/Models/NetworkDeviceDnsNameColumn.test.ts +321 -0
- package/Tests/Models/ProjectDataResidencyColumn.test.ts +154 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +181 -50
- package/Tests/Server/API/BaseAPI.test.ts +6 -0
- package/Tests/Server/API/BaseAPIUpdateMiscDataProps.test.ts +217 -0
- package/Tests/Server/API/BillingInvoiceAPI.test.ts +7 -0
- package/Tests/Server/API/BillingInvoiceAPIPaymentStates.test.ts +990 -0
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +498 -0
- package/Tests/Server/API/DashboardPublicSloAPI.test.ts +405 -0
- package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +901 -7
- package/Tests/Server/API/SessionReplayAPI.test.ts +116 -0
- package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +857 -0
- package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +1084 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +33 -3
- package/Tests/Server/Infrastructure/Postgres/AddDataResidencyToProjectMigration.test.ts +202 -0
- package/Tests/Server/Infrastructure/Postgres/AddNetbiosLookupToNetworkDeviceDiscoveryScanMigration.test.ts +330 -0
- package/Tests/Server/Infrastructure/Postgres/AddNetworkDeviceDnsNameAndShortDeviceNamesMigration.test.ts +340 -0
- package/Tests/Server/Infrastructure/Postgres/BackfillSloMonitorRulesAndAffectedResourcesMigration.test.ts +343 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +801 -0
- package/Tests/Server/Services/AddSubscriberUpdateNotificationStatusMigration.test.ts +307 -0
- package/Tests/Server/Services/AuditLogService.test.ts +1124 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +200 -1
- package/Tests/Server/Services/BillingInvoiceServiceMutexRelease.test.ts +254 -0
- package/Tests/Server/Services/BillingService.test.ts +70 -0
- package/Tests/Server/Services/BillingServicePayInvoiceStates.test.ts +723 -0
- package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +14 -2
- package/Tests/Server/Services/BillingServiceSubscriptionPaymentMethodSync.test.ts +1634 -0
- package/Tests/Server/Services/DatabaseServiceAuditRelationDiff.test.ts +492 -0
- package/Tests/Server/Services/DatabaseServicePasswordFieldSecrets.test.ts +629 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +431 -0
- package/Tests/Server/Services/IncidentAlertSloReferenceGuard.test.ts +358 -0
- package/Tests/Server/Services/MonitorProbeServicePastDueMonitoring.test.ts +362 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1460 -1
- package/Tests/Server/Services/NetworkDeviceDiagnosticService.test.ts +962 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +106 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +10 -1
- package/Tests/Server/Services/NetworkDeviceServicePastDueMonitoring.test.ts +335 -0
- package/Tests/Server/Services/NetworkDeviceSiteRuleDnsName.test.ts +568 -0
- package/Tests/Server/Services/ProjectDataResidencyPostgres.test.ts +344 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +187 -0
- package/Tests/Server/Services/ProjectServiceDataResidency.test.ts +369 -0
- package/Tests/Server/Services/ProjectServiceDataResidencySelfHosted.test.ts +176 -0
- package/Tests/Server/Services/ProjectServicePastDueMonitoring.test.ts +289 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +24 -8
- package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +1396 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupARun.test.ts +917 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +1262 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +902 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +1163 -0
- package/Tests/Server/Services/RuleRun/PrivacyRuleEnginesRun.test.ts +843 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +465 -0
- package/Tests/Server/Services/SecurityEventConnectionService.test.ts +525 -4
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +77 -23
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleFeedWrites.test.ts +777 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleOptions.test.ts +1399 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +67 -74
- package/Tests/Server/Services/ServiceLevelObjectiveChildRowTenancy.test.ts +906 -0
- package/Tests/Server/Services/ServiceLevelObjectiveDeleteTenancy.test.ts +1029 -0
- package/Tests/Server/Services/ServiceLevelObjectiveFeedService.test.ts +313 -0
- package/Tests/Server/Services/ServiceLevelObjectiveFeedWrites.test.ts +1214 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMarkdownLink.test.ts +289 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +1455 -430
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleLegacyLabelAdoption.test.ts +634 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +1193 -0
- package/Tests/Server/Services/{SloMonitorLabelRuleHooks.test.ts → ServiceLevelObjectiveMonitorRuleTriggers.test.ts} +135 -41
- package/Tests/Server/Services/ServiceLevelObjectiveOwnerFeedWrites.test.ts +671 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +180 -85
- package/Tests/Server/Services/ServiceLevelObjectiveServiceArchive.test.ts +537 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceLegacyMonitorLabelWrite.test.ts +870 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceMonitorRuleGuard.test.ts +343 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceReEvaluation.test.ts +246 -0
- package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +501 -0
- package/Tests/Server/Services/SloAffectedResourceLinkContract.test.ts +86 -0
- package/Tests/Server/Services/SloAffectedResourceMetricAttributes.test.ts +547 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +10 -4
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +7 -2
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +174 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateServiceVariables.test.ts +40 -0
- package/Tests/Server/Services/SubscriberUpdateNotificationHooks.test.ts +541 -0
- package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +288 -0
- package/Tests/Server/TestingUtils/PastDueMonitoringClaimSql.ts +177 -0
- package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +51 -10
- package/Tests/Server/TestingUtils/__mocks__/Stripe.mock.ts +16 -1
- package/Tests/Server/Types/Database/Permissions/ProjectDataResidencyColumn.test.ts +386 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +26 -36
- package/Tests/Server/Utils/AI/SloAffectedResourceAIContext.test.ts +445 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +423 -1
- package/Tests/Server/Utils/AI/SloToolsArchive.test.ts +294 -0
- package/Tests/Server/Utils/AI/SloToolsRuleReadPermissions.test.ts +297 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +255 -10
- package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +404 -750
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +45 -0
- package/Tests/Server/Utils/Database/RelationValueUtil.test.ts +157 -0
- package/Tests/Server/Utils/Monitor/Criteria/BooleanSeriesEvaluateOverTime.test.ts +260 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +181 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +147 -30
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.test.ts +17 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +136 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidatorLoadOrder.test.ts +472 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +48 -2
- package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +435 -475
- package/Tests/Server/Utils/Rules/MonitorRulePatternValidator.test.ts +77 -0
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +177 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +365 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunRegistry.test.ts +173 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunner.test.ts +675 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +8 -8
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorFetchSummary.test.ts +261 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +68 -13
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsAuth.test.ts → Connectors/GoogleSecOps/GoogleSecOpsAuth.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClient.test.ts → Connectors/GoogleSecOps/GoogleSecOpsClient.test.ts} +4 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.test.ts +483 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorCuratedAndLateAlerts.test.ts +676 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFetchEvents.test.ts +1994 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFixtures.ts +332 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorHttpIntegration.test.ts +680 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorRequestContract.test.ts +1206 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorTestConnection.test.ts +1136 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsCuratedRuleCounts.test.ts +407 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsErrorHandling.test.ts → Connectors/GoogleSecOps/GoogleSecOpsErrorHandling.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingAdaptiveCatchUp.test.ts +730 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClickhouseIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts} +130 -35
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFailureTaxonomy.test.ts +772 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFixtures.ts +648 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsHttpIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingHttpIntegration.test.ts} +230 -225
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingIntegration.test.ts +1390 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingLoop.test.ts +981 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingNothingImportedRegression.test.ts +290 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsRequestContract.test.ts → Connectors/GoogleSecOps/GoogleSecOpsRequestContract.test.ts} +2 -2
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsResponseParsing.test.ts → Connectors/GoogleSecOps/GoogleSecOpsResponseParsing.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsSearchDetections.test.ts → Connectors/GoogleSecOps/GoogleSecOpsSearchDetections.test.ts} +38 -5
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsTesterIntegration.test.ts +421 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +1445 -3
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +14 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +313 -4
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +352 -0
- package/Tests/Server/Utils/Slo/SloFeedUtil.test.ts +326 -0
- package/Tests/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.test.ts +260 -0
- package/Tests/Server/Utils/Slo/SloMetricUtil.test.ts +592 -0
- package/Tests/Server/Utils/Slo/SloRecordReferenceValidator.test.ts +311 -0
- package/Tests/Server/Utils/StatusPageResource.test.ts +91 -3
- package/Tests/Types/Billing/SubscriptionStatus.test.ts +176 -0
- package/Tests/Types/Billing/SubscriptionStatusPastDueMonitoring.test.ts +187 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +53 -7
- package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +816 -792
- package/Tests/Types/Monitor/CriteriaFilter.test.ts +216 -24
- package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepRetriesParsing.test.ts +201 -0
- package/Tests/Types/Rules/RuleRun.test.ts +315 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +60 -0
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +29 -4
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +217 -0
- package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +200 -0
- package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +141 -87
- package/Tests/UI/Components/AlertBanner.test.tsx +319 -0
- package/Tests/UI/Components/BulkArchiveActionsCopy.test.tsx +310 -0
- package/Tests/UI/Components/Detail/DetailIdIsUnique.test.tsx +87 -0
- package/Tests/UI/Components/Dropdown/DropdownClearable.test.tsx +393 -0
- package/Tests/UI/Components/Dropdown/DropdownMultiSelectChipAccessibleName.test.tsx +64 -0
- package/Tests/UI/Components/EmptyState/EmptyState.test.tsx +335 -4
- package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +337 -0
- package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +21 -20
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +15 -2
- package/Tests/UI/Components/LockedFilterChip.test.tsx +281 -144
- package/Tests/UI/Components/MoreMenu.test.tsx +133 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +84 -3
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/RuleRun/RuleDetailFields.test.tsx +336 -0
- package/Tests/UI/Components/RuleRun/RuleTable.test.tsx +304 -0
- package/Tests/UI/Components/RuleRun/RunRuleNowModal.test.tsx +231 -0
- package/Tests/UI/Components/RuleRun/RunRulesBulkAction.test.ts +213 -0
- package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +124 -61
- package/Tests/UI/Rum/ReplayEngine.test.ts +154 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +234 -123
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +122 -0
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +245 -0
- package/Tests/UI/Rum/ReplayRail.test.tsx +294 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +213 -1
- package/Tests/UI/Rum/ReplayStage.test.tsx +565 -172
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +260 -3
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +1391 -0
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +222 -0
- package/Tests/UI/Utils/DashboardStackingLayers.test.ts +8 -1
- package/Tests/UI/Utils/RuleRunClient.test.ts +303 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +1 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +2 -0
- package/Tests/Utils/Dashboard/Components/DashboardSloListComponent.test.ts +206 -0
- package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +36 -2
- package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +409 -588
- package/Tests/Utils/Dashboard/SloWidgetSource.test.ts +351 -0
- package/Tests/Utils/Markdown/MarkdownEscape.test.ts +361 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +1425 -118
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +188 -3
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +661 -13
- package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +349 -0
- package/Tests/Utils/NetworkDiscovery/RunImportedDeviceNaming.test.ts +656 -0
- package/Tests/Utils/NetworkDiscovery/ShortDeviceNamePlanner.test.ts +1020 -0
- package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +619 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +317 -0
- package/Tests/Utils/Project/DataResidency.test.ts +198 -0
- package/Tests/Utils/Rules/RuleRunSummary.test.ts +394 -0
- package/Tests/Utils/Slo/SloAffectedResourceMarkdown.test.ts +302 -0
- package/Tests/Utils/Slo/SloBurnRateTemplate.test.ts +468 -0
- package/Tests/Utils/Slo/SloEvaluation.test.ts +20 -4
- package/Tests/Utils/Slo/SloFeedMarkdown.test.ts +1185 -0
- package/Tests/Utils/Slo/SloHealth.test.ts +262 -0
- package/Tests/Utils/Slo/SloHistoryMetricName.test.ts +102 -0
- package/Tests/Utils/Slo/SloListWidgetFormat.test.ts +522 -0
- package/Tests/Utils/Slo/SloMetricType.test.ts +355 -0
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +387 -0
- package/Tests/Utils/Slo/SloMonitorStatusSummary.test.ts +210 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +226 -0
- package/Tests/Utils/Slo/SloProjection.test.ts +1039 -0
- package/Tests/Utils/Slo/SloWidgetFormat.test.ts +47 -0
- package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +1 -80
- package/Types/BaseDatabase/EnableAuditLogOn.ts +41 -0
- package/Types/Billing/SubscriptionStatus.ts +39 -4
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +5 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +10 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloListComponent.ts +29 -0
- package/Types/Dashboard/DashboardTemplates.ts +290 -297
- package/Types/Database/EnableAuditLog.ts +23 -1
- package/Types/Email/EmailTemplateType.ts +4 -0
- package/Types/Monitor/CriteriaFilter.ts +55 -8
- package/Types/Monitor/MonitorStep.ts +5 -2
- package/Types/Monitor/MonitorStepDnsMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepDnssecMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepDomainMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepExternalStatusPageMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepRetries.ts +59 -0
- package/Types/Monitor/MonitorStepSnmpMonitor.ts +9 -2
- package/Types/NetworkDevice/NetworkDeviceDiagnosticResult.ts +104 -0
- package/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.ts +47 -0
- package/Types/NetworkDevice/NetworkDeviceDiagnosticType.ts +47 -0
- package/Types/NetworkDevice/NetworkDevicePingMetricNames.ts +20 -0
- package/Types/Permission.ts +127 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +5 -0
- package/Types/Rules/RuleRun.ts +518 -0
- package/Types/Rum/SessionReplayApi.ts +18 -0
- package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +6 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +30 -4
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +108 -1
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +6 -2
- package/Types/ServiceLevelObjective/SloHistoryMetricName.ts +25 -0
- package/Types/ServiceLevelObjective/SloMetricType.ts +49 -0
- package/Types/StatusPage/StatusPageSubscriberNotificationEventType.ts +4 -0
- package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +331 -0
- package/Types/StatusPage/SubscriberNotificationTrigger.ts +12 -0
- package/Types/StatusPage/SubscriberUpdateNotification.ts +89 -0
- package/Types/Telemetry/LockedFilterDetail.ts +7 -28
- package/Types/Telemetry/ServiceType.ts +7 -0
- package/Typings/Index.d.ts +53 -3
- package/UI/Components/AlertBanner/AlertBanner.tsx +85 -27
- package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +21 -2
- package/UI/Components/Detail/Detail.tsx +9 -2
- package/UI/Components/Dropdown/Dropdown.tsx +64 -1
- package/UI/Components/EmptyState/EmptyState.tsx +27 -3
- package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +124 -0
- package/UI/Components/Forms/ModelForm.tsx +6 -5
- package/UI/Components/LabelRule/LabelRuleTable.tsx +8 -2
- package/UI/Components/LogsViewer/LogsViewer.tsx +2 -6
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +2 -13
- package/UI/Components/LogsViewer/types.ts +2 -2
- package/UI/Components/MoreMenu/MoreMenu.tsx +14 -3
- package/UI/Components/RuleRun/RuleDetailFields.tsx +359 -0
- package/UI/Components/RuleRun/RuleTable.tsx +183 -0
- package/UI/Components/RuleRun/RuleView.tsx +170 -0
- package/UI/Components/RuleRun/RunRuleNowModal.tsx +147 -0
- package/UI/Components/RuleRun/RunRulesBulkAction.ts +103 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +2 -6
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +38 -104
- package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +2 -18
- package/UI/Components/TelemetryViewer/types.ts +2 -2
- package/UI/Utils/Rules/RuleRunClient.ts +178 -0
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +8 -0
- package/Utils/Dashboard/Components/DashboardSloComponent.ts +19 -2
- package/Utils/Dashboard/Components/DashboardSloListComponent.ts +126 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/Dashboard/SloWidgetSource.ts +188 -0
- package/Utils/Markdown/MarkdownEscape.ts +63 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +161 -36
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +25 -0
- package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +146 -0
- package/Utils/NetworkDiscovery/RunImportedDeviceNaming.ts +390 -0
- package/Utils/NetworkDiscovery/ShortDeviceNamePlanner.ts +291 -0
- package/Utils/NetworkDiscovery/ShortHostnameUtil.ts +91 -0
- package/Utils/NetworkSite/CidrMatchUtil.ts +37 -12
- package/Utils/Project/DataResidency.ts +63 -0
- package/Utils/Rules/RuleRunSummary.ts +323 -0
- package/Utils/Slo/SloAffectedResourceMarkdown.ts +123 -0
- package/Utils/Slo/SloBurnRateTemplate.ts +373 -0
- package/Utils/Slo/SloFeedMarkdown.ts +1507 -0
- package/Utils/Slo/SloHealth.ts +96 -9
- package/Utils/Slo/SloListWidgetFormat.ts +370 -0
- package/Utils/Slo/SloMetricType.ts +237 -0
- package/Utils/Slo/SloMonitorRuleCriteria.ts +364 -0
- package/Utils/Slo/SloMonitorStatusSummary.ts +210 -0
- package/Utils/Slo/SloOverviewText.ts +265 -0
- package/Utils/Slo/SloProjection.ts +967 -0
- package/Utils/Slo/SloWidgetFormat.ts +12 -2
- package/Utils/Telemetry/LockedFilterSearch.ts +3 -49
- package/build/dist/Models/AnalyticsModels/AuditLog.js +70 -1
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +4 -4
- package/build/dist/Models/DatabaseModels/Alert.js +60 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +64 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +6 -4
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +68 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js +772 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +140 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +42 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +11 -11
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +192 -10
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +798 -96
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +596 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +590 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +16 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +16 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +75 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +1 -1
- package/build/dist/Server/API/BaseAPI.js +14 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +233 -19
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +86 -5
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +72 -2
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/SecurityEventConnectionAPI.js +102 -10
- package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +236 -154
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js +21 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js +207 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js +72 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.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/Services/AlertEpisodeLabelRuleEngineService.js +112 -56
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +167 -68
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +87 -26
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +270 -203
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +498 -354
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +97 -34
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +91 -8
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AuditLogService.js +408 -44
- package/build/dist/Server/Services/AuditLogService.js.map +1 -1
- package/build/dist/Server/Services/BillingInvoiceService.js +94 -85
- package/build/dist/Server/Services/BillingInvoiceService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +406 -14
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +135 -86
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +189 -100
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +125 -18
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +145 -91
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +191 -101
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +190 -102
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +112 -56
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +220 -63
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +87 -26
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +258 -192
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +519 -376
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +95 -32
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +90 -5
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +113 -65
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +6 -4
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +145 -91
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +191 -101
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +20 -25
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +123 -77
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +167 -82
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +18 -2
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +11 -9
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +287 -5
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js +333 -0
- package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +36 -2
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +117 -64
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +173 -83
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +116 -65
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +82 -10
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +111 -63
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +161 -77
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +280 -209
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +521 -376
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +24 -0
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +24 -8
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventConnectionService.js +43 -3
- package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +115 -62
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +163 -77
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +769 -18
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js +96 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +614 -87
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +844 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +207 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +221 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +997 -50
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +191 -102
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageAnnouncementService.js +12 -0
- package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +118 -70
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +158 -76
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +19 -215
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +6 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +27 -5
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +1 -1
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +17 -0
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +31 -0
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +24 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +21 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +337 -53
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +108 -15
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +2 -2
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +115 -6
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +13 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/Database/RelationValueUtil.js +82 -0
- package/build/dist/Server/Utils/Database/RelationValueUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +10 -6
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +17 -21
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +5 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +50 -10
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +13 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +6 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js +34 -0
- package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +69 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js +128 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +746 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js +221 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +6 -4
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.js +174 -14
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js +1417 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +138 -18
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +1 -2
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +23 -18
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +2 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +95 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +3 -3
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +2 -2
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +118 -40
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/Slo/SloFeedUtil.js +150 -0
- package/build/dist/Server/Utils/Slo/SloFeedUtil.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js +136 -0
- package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloMetricUtil.js +269 -0
- package/build/dist/Server/Utils/Slo/SloMetricUtil.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js +134 -0
- package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js +137 -0
- package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +6 -26
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageResource.js +31 -5
- package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
- package/build/dist/Types/Billing/SubscriptionStatus.js +37 -3
- package/build/dist/Types/Billing/SubscriptionStatus.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +5 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +275 -286
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Database/EnableAuditLog.js +19 -1
- package/build/dist/Types/Database/EnableAuditLog.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +4 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -6
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +2 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepRetries.js +47 -0
- package/build/dist/Types/Monitor/MonitorStepRetries.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js.map +1 -1
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js +29 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js +37 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js +42 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js +20 -0
- package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js.map +1 -0
- package/build/dist/Types/Permission.js +114 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +5 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +267 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +16 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +65 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +6 -2
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -1
- package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js +26 -0
- package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloMetricType.js +45 -0
- package/build/dist/Types/ServiceLevelObjective/SloMetricType.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js +4 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js.map +1 -1
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +295 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js +13 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +67 -0
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js +7 -7
- package/build/dist/Types/Telemetry/ServiceType.js +7 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/AlertBanner/AlertBanner.js +48 -19
- package/build/dist/UI/Components/AlertBanner/AlertBanner.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +10 -2
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +12 -3
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -5
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js +3 -3
- package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +47 -0
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +1 -0
- package/build/dist/UI/Components/Forms/ModelForm.js +6 -5
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +6 -2
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +0 -2
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +3 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/RuleRun/RuleDetailFields.js +226 -0
- package/build/dist/UI/Components/RuleRun/RuleDetailFields.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RuleTable.js +97 -0
- package/build/dist/UI/Components/RuleRun/RuleTable.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RuleView.js +83 -0
- package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js +74 -0
- package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js +78 -0
- package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +24 -50
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +0 -4
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Utils/Rules/RuleRunClient.js +98 -0
- package/build/dist/UI/Utils/Rules/RuleRunClient.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +8 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +16 -2
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js +94 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Dashboard/SloWidgetSource.js +125 -0
- package/build/dist/Utils/Dashboard/SloWidgetSource.js.map +1 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js +49 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +112 -34
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +22 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +129 -0
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js +255 -0
- package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js +184 -0
- package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js +79 -0
- package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +21 -12
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
- package/build/dist/Utils/Project/DataResidency.js +51 -0
- package/build/dist/Utils/Project/DataResidency.js.map +1 -0
- package/build/dist/Utils/Rules/RuleRunSummary.js +197 -0
- package/build/dist/Utils/Rules/RuleRunSummary.js.map +1 -0
- package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js +51 -0
- package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js.map +1 -0
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +228 -0
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js.map +1 -0
- package/build/dist/Utils/Slo/SloFeedMarkdown.js +934 -0
- package/build/dist/Utils/Slo/SloFeedMarkdown.js.map +1 -0
- package/build/dist/Utils/Slo/SloHealth.js +75 -9
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloListWidgetFormat.js +217 -0
- package/build/dist/Utils/Slo/SloListWidgetFormat.js.map +1 -0
- package/build/dist/Utils/Slo/SloMetricType.js +212 -0
- package/build/dist/Utils/Slo/SloMetricType.js.map +1 -0
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +216 -0
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -0
- package/build/dist/Utils/Slo/SloMonitorStatusSummary.js +129 -0
- package/build/dist/Utils/Slo/SloMonitorStatusSummary.js.map +1 -0
- package/build/dist/Utils/Slo/SloOverviewText.js +110 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -0
- package/build/dist/Utils/Slo/SloProjection.js +448 -0
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -0
- package/build/dist/Utils/Slo/SloWidgetFormat.js +4 -2
- package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -1
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js +1 -26
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -1
- package/package.json +1 -1
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +0 -447
- package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +0 -263
- package/Server/API/GoogleSecOpsConnectionAPI.ts +0 -320
- package/Server/Services/GoogleSecOpsConnectionRunService.ts +0 -10
- package/Server/Services/GoogleSecOpsConnectionService.ts +0 -116
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +0 -777
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +0 -1373
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +0 -512
- package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +0 -838
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +0 -441
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +0 -1001
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +0 -657
- package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +0 -153
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +0 -784
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +0 -823
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +0 -918
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +0 -738
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +0 -874
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +0 -1297
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +0 -1577
- package/Tests/UI/Components/LockedFilterActions.test.tsx +0 -396
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +0 -111
- package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +0 -205
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +0 -478
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +0 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +0 -287
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +0 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +0 -231
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +0 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +0 -9
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +0 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +0 -70
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +0 -537
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +0 -1034
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +0 -410
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +0 -1
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +0 -2
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +0 -1
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +0 -88
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +0 -1
|
@@ -3,7 +3,13 @@ import AlertStateTimeline from "../../Models/DatabaseModels/AlertStateTimeline";
|
|
|
3
3
|
import Incident from "../../Models/DatabaseModels/Incident";
|
|
4
4
|
import IncidentStateTimeline from "../../Models/DatabaseModels/IncidentStateTimeline";
|
|
5
5
|
import Model from "../../Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule";
|
|
6
|
+
import DatabaseBaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
7
|
+
import TeamMember from "../../Models/DatabaseModels/TeamMember";
|
|
6
8
|
import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
9
|
+
import {
|
|
10
|
+
SLO_BURN_RATE_MARKDOWN_TEMPLATE_MAX_LENGTH,
|
|
11
|
+
SLO_BURN_RATE_TITLE_TEMPLATE_MAX_LENGTH,
|
|
12
|
+
} from "../../Utils/Slo/SloBurnRateTemplate";
|
|
7
13
|
import PartialEntity from "../../Types/Database/PartialEntity";
|
|
8
14
|
import Dictionary from "../../Types/Dictionary";
|
|
9
15
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
@@ -11,8 +17,13 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
11
17
|
import CreateBy from "../Types/Database/CreateBy";
|
|
12
18
|
import DeleteBy from "../Types/Database/DeleteBy";
|
|
13
19
|
import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
|
|
20
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
21
|
+
import Select from "../Types/Database/Select";
|
|
14
22
|
import UpdateBy from "../Types/Database/UpdateBy";
|
|
15
|
-
import ProjectScopedReferenceValidator
|
|
23
|
+
import ProjectScopedReferenceValidator, {
|
|
24
|
+
ProjectScopedReference,
|
|
25
|
+
resolveReferenceId,
|
|
26
|
+
} from "../Utils/Database/ProjectScopedReferenceValidator";
|
|
16
27
|
import logger, { LogAttributes } from "../Utils/Logger";
|
|
17
28
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
18
29
|
import AlertService from "./AlertService";
|
|
@@ -22,6 +33,39 @@ import DatabaseService from "./DatabaseService";
|
|
|
22
33
|
import IncidentService from "./IncidentService";
|
|
23
34
|
import IncidentSeverityService from "./IncidentSeverityService";
|
|
24
35
|
import IncidentStateTimelineService from "./IncidentStateTimelineService";
|
|
36
|
+
import LabelService from "./LabelService";
|
|
37
|
+
import OnCallDutyPolicyService from "./OnCallDutyPolicyService";
|
|
38
|
+
import TeamMemberService from "./TeamMemberService";
|
|
39
|
+
import TeamService from "./TeamService";
|
|
40
|
+
import ServiceLevelObjectiveFeedService from "./ServiceLevelObjectiveFeedService";
|
|
41
|
+
import ServiceLevelObjectiveService from "./ServiceLevelObjectiveService";
|
|
42
|
+
import { ServiceLevelObjectiveFeedEventType } from "../../Models/DatabaseModels/ServiceLevelObjectiveFeed";
|
|
43
|
+
import { Gray500, Green500, Red500 } from "../../Types/BrandColors";
|
|
44
|
+
import OneUptimeDate from "../../Types/Date";
|
|
45
|
+
import {
|
|
46
|
+
SLO_BURN_RATE_RULE_FEED_COLUMNS,
|
|
47
|
+
SloFeedColumn,
|
|
48
|
+
SloFeedColumnChange,
|
|
49
|
+
SloFeedMarkdown,
|
|
50
|
+
SloFeedRow,
|
|
51
|
+
getBurnRateRuleAddedFeedMarkdown,
|
|
52
|
+
getBurnRateRuleChangedFeedMarkdown,
|
|
53
|
+
getBurnRateRuleRemovedFeedMarkdown,
|
|
54
|
+
getSloFeedColumnChanges,
|
|
55
|
+
getSloFeedColumnsInPayload,
|
|
56
|
+
getSloFeedSelect,
|
|
57
|
+
} from "../../Utils/Slo/SloFeedMarkdown";
|
|
58
|
+
import SloFeedUtil from "../Utils/Slo/SloFeedUtil";
|
|
59
|
+
import SloRecordReferenceValidator from "../Utils/Slo/SloRecordReferenceValidator";
|
|
60
|
+
|
|
61
|
+
/*
|
|
62
|
+
* What the SLO feed carries from onBeforeUpdate to onUpdateSuccess for a
|
|
63
|
+
* hand-made rule edit: the watched columns it writes, and each rule as it was.
|
|
64
|
+
*/
|
|
65
|
+
interface BurnRateRuleFeedSnapshot {
|
|
66
|
+
columns: Array<SloFeedColumn>;
|
|
67
|
+
rowsById: Dictionary<Model>;
|
|
68
|
+
}
|
|
25
69
|
|
|
26
70
|
const THRESHOLD_ERROR_MESSAGE: string =
|
|
27
71
|
"Burn rate threshold must be greater than 0.";
|
|
@@ -40,6 +84,143 @@ export const NO_OUTPUT_ERROR_MESSAGE: string =
|
|
|
40
84
|
const DEFAULT_SHOULD_CREATE_ALERT: boolean = true;
|
|
41
85
|
const DEFAULT_SHOULD_CREATE_INCIDENT: boolean = false;
|
|
42
86
|
|
|
87
|
+
/*
|
|
88
|
+
* The alert and incident options, defaulted exactly like their columns. A
|
|
89
|
+
* payload that never mentions them - every seeded rule, every rule an older API
|
|
90
|
+
* client creates - therefore raises what burn rate rules always raised: a
|
|
91
|
+
* record everyone in the project can see, resolved automatically when the burn
|
|
92
|
+
* recovers, with no owners added. Exported so the tests can pin these against
|
|
93
|
+
* the model's own column metadata instead of a second copy of the literals.
|
|
94
|
+
*/
|
|
95
|
+
export const BURN_RATE_RULE_OPTION_FLAG_DEFAULTS: {
|
|
96
|
+
isAlertPrivate: boolean;
|
|
97
|
+
autoResolveAlert: boolean;
|
|
98
|
+
isIncidentPrivate: boolean;
|
|
99
|
+
autoResolveIncident: boolean;
|
|
100
|
+
addSloOwnersAsOwners: boolean;
|
|
101
|
+
} = {
|
|
102
|
+
isAlertPrivate: false,
|
|
103
|
+
autoResolveAlert: true,
|
|
104
|
+
isIncidentPrivate: false,
|
|
105
|
+
autoResolveIncident: true,
|
|
106
|
+
addSloOwnersAsOwners: false,
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
type BurnRateRuleOptionFlag = keyof typeof BURN_RATE_RULE_OPTION_FLAG_DEFAULTS;
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* Template columns and their limits, from the module the dashboard form reads
|
|
113
|
+
* too, so the browser refuses exactly what this hook would.
|
|
114
|
+
*
|
|
115
|
+
* Titles are varchar(ColumnLength.LongText) - on this rule and on the Alert and
|
|
116
|
+
* Incident they render into - so the column's own length is the limit, and
|
|
117
|
+
* saying so here beats Postgres' raw "value too long". The worker still clamps
|
|
118
|
+
* the RENDERED title, because `{{sloName}}` can expand a template that fit.
|
|
119
|
+
*
|
|
120
|
+
* Markdown columns are unbounded text, but a template is copied into every
|
|
121
|
+
* record the rule opens and into the notifications each of those sends, so
|
|
122
|
+
* they get a generous cap rather than none.
|
|
123
|
+
*/
|
|
124
|
+
export const BURN_RATE_RULE_MARKDOWN_TEMPLATE_MAX_LENGTH: number =
|
|
125
|
+
SLO_BURN_RATE_MARKDOWN_TEMPLATE_MAX_LENGTH;
|
|
126
|
+
|
|
127
|
+
export const BURN_RATE_RULE_TITLE_TEMPLATE_MAX_LENGTH: number =
|
|
128
|
+
SLO_BURN_RATE_TITLE_TEMPLATE_MAX_LENGTH;
|
|
129
|
+
|
|
130
|
+
type BurnRateRuleTemplateColumn =
|
|
131
|
+
| "alertTitleTemplate"
|
|
132
|
+
| "alertDescriptionTemplate"
|
|
133
|
+
| "alertRemediationNotes"
|
|
134
|
+
| "incidentTitleTemplate"
|
|
135
|
+
| "incidentDescriptionTemplate"
|
|
136
|
+
| "incidentRemediationNotes";
|
|
137
|
+
|
|
138
|
+
export const BURN_RATE_RULE_TEMPLATE_COLUMNS: Array<{
|
|
139
|
+
column: BurnRateRuleTemplateColumn;
|
|
140
|
+
title: string;
|
|
141
|
+
maxLength: number;
|
|
142
|
+
}> = [
|
|
143
|
+
{
|
|
144
|
+
column: "alertTitleTemplate",
|
|
145
|
+
title: "Alert title template",
|
|
146
|
+
maxLength: BURN_RATE_RULE_TITLE_TEMPLATE_MAX_LENGTH,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
column: "alertDescriptionTemplate",
|
|
150
|
+
title: "Alert description template",
|
|
151
|
+
maxLength: BURN_RATE_RULE_MARKDOWN_TEMPLATE_MAX_LENGTH,
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
column: "alertRemediationNotes",
|
|
155
|
+
title: "Alert remediation notes",
|
|
156
|
+
maxLength: BURN_RATE_RULE_MARKDOWN_TEMPLATE_MAX_LENGTH,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
column: "incidentTitleTemplate",
|
|
160
|
+
title: "Incident title template",
|
|
161
|
+
maxLength: BURN_RATE_RULE_TITLE_TEMPLATE_MAX_LENGTH,
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
column: "incidentDescriptionTemplate",
|
|
165
|
+
title: "Incident description template",
|
|
166
|
+
maxLength: BURN_RATE_RULE_MARKDOWN_TEMPLATE_MAX_LENGTH,
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
column: "incidentRemediationNotes",
|
|
170
|
+
title: "Incident remediation notes",
|
|
171
|
+
maxLength: BURN_RATE_RULE_MARKDOWN_TEMPLATE_MAX_LENGTH,
|
|
172
|
+
},
|
|
173
|
+
];
|
|
174
|
+
|
|
175
|
+
// Every many-to-many list the rule copies onto the records it opens.
|
|
176
|
+
type BurnRateRuleProjectScopedRelationColumn =
|
|
177
|
+
| "onCallDutyPolicies"
|
|
178
|
+
| "incidentOnCallDutyPolicies"
|
|
179
|
+
| "alertLabels"
|
|
180
|
+
| "incidentLabels"
|
|
181
|
+
| "alertOwnerTeams"
|
|
182
|
+
| "incidentOwnerTeams";
|
|
183
|
+
|
|
184
|
+
type BurnRateRuleOwnerUserColumn = "alertOwnerUsers" | "incidentOwnerUsers";
|
|
185
|
+
|
|
186
|
+
type BurnRateRuleRelationColumn =
|
|
187
|
+
| BurnRateRuleProjectScopedRelationColumn
|
|
188
|
+
| BurnRateRuleOwnerUserColumn;
|
|
189
|
+
|
|
190
|
+
const OWNER_USER_COLUMNS: Array<BurnRateRuleOwnerUserColumn> = [
|
|
191
|
+
"alertOwnerUsers",
|
|
192
|
+
"incidentOwnerUsers",
|
|
193
|
+
];
|
|
194
|
+
|
|
195
|
+
const PROJECT_SCOPED_RELATION_COLUMNS: Array<BurnRateRuleProjectScopedRelationColumn> =
|
|
196
|
+
[
|
|
197
|
+
"onCallDutyPolicies",
|
|
198
|
+
"incidentOnCallDutyPolicies",
|
|
199
|
+
"alertLabels",
|
|
200
|
+
"incidentLabels",
|
|
201
|
+
"alertOwnerTeams",
|
|
202
|
+
"incidentOwnerTeams",
|
|
203
|
+
];
|
|
204
|
+
|
|
205
|
+
const RELATION_COLUMNS: Array<BurnRateRuleRelationColumn> = [
|
|
206
|
+
...PROJECT_SCOPED_RELATION_COLUMNS,
|
|
207
|
+
...OWNER_USER_COLUMNS,
|
|
208
|
+
];
|
|
209
|
+
|
|
210
|
+
export const OWNER_USERS_NOT_IN_PROJECT_ERROR_PREFIX: string =
|
|
211
|
+
"This SLO burn rate rule names owner users who are not members of this project:";
|
|
212
|
+
|
|
213
|
+
/*
|
|
214
|
+
* Ids compare case-insensitively: ObjectID keeps whatever case it was handed,
|
|
215
|
+
* while Postgres renders a uuid lower-cased (ProjectScopedReferenceValidator
|
|
216
|
+
* explains the same trap).
|
|
217
|
+
*/
|
|
218
|
+
type NormalizeIdFunction = (id: string) => string;
|
|
219
|
+
|
|
220
|
+
const normalizeId: NormalizeIdFunction = (id: string): string => {
|
|
221
|
+
return id.trim().toLowerCase();
|
|
222
|
+
};
|
|
223
|
+
|
|
43
224
|
export class Service extends DatabaseService<Model> {
|
|
44
225
|
public constructor() {
|
|
45
226
|
super(Model);
|
|
@@ -140,18 +321,106 @@ export class Service extends DatabaseService<Model> {
|
|
|
140
321
|
createBy.data.shouldCreateAlert = shouldCreateAlert;
|
|
141
322
|
createBy.data.shouldCreateIncident = shouldCreateIncident;
|
|
142
323
|
|
|
324
|
+
/*
|
|
325
|
+
* The alert and incident options, written back explicitly for the same
|
|
326
|
+
* reason as the two output flags - and coerced for the same "false"-string
|
|
327
|
+
* reason: the worker reads autoResolve with `!== false` and the private
|
|
328
|
+
* flags with `=== true`, so an uncoerced "false" would keep auto-resolving
|
|
329
|
+
* and an uncoerced "true" would publish a record the user asked to hide.
|
|
330
|
+
*/
|
|
331
|
+
this.normalizeOptionFlags(createBy.data as unknown as Dictionary<unknown>, {
|
|
332
|
+
applyDefaults: true,
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
this.normalizeTemplates(createBy.data as unknown as Dictionary<unknown>);
|
|
336
|
+
|
|
337
|
+
/*
|
|
338
|
+
* Tenant first, for every reference check below, like the other SLO child
|
|
339
|
+
* rows: DatabaseService stamps the tenant onto the payload before this
|
|
340
|
+
* hook, but the tenancy checks must not depend on that ordering - a
|
|
341
|
+
* payload projectId must never pick the project a severity, routing
|
|
342
|
+
* target or owner is checked against.
|
|
343
|
+
*/
|
|
344
|
+
const projectId: ObjectID | undefined =
|
|
345
|
+
createBy.props.tenantId || createBy.data.projectId;
|
|
346
|
+
|
|
347
|
+
/*
|
|
348
|
+
* The SLO first. Nothing else checks that it belongs to the rule's
|
|
349
|
+
* project, and a rule hung off another tenant's SLO is wrong in every
|
|
350
|
+
* direction: it can never fire (the worker reads rules pinned to the SLO's
|
|
351
|
+
* project), its feed items are written against that SLO's id, and that
|
|
352
|
+
* project deleting its SLO cascades into this project's rule.
|
|
353
|
+
* serviceLevelObjectiveId is create-only (update is [] in its column ACL),
|
|
354
|
+
* so create is the one write to check. The lookup is pinned to this
|
|
355
|
+
* project and a foreign id gets the same answer as a missing one, so the
|
|
356
|
+
* error never confirms or names another tenant's SLO. Both spellings are
|
|
357
|
+
* checked: the id column and the relation write the same join column.
|
|
358
|
+
*/
|
|
359
|
+
await SloRecordReferenceValidator.validateServiceLevelObjectivesBelongToProject(
|
|
360
|
+
{
|
|
361
|
+
projectId: projectId,
|
|
362
|
+
serviceLevelObjectives: [
|
|
363
|
+
createBy.data.serviceLevelObjectiveId,
|
|
364
|
+
createBy.data.serviceLevelObjective,
|
|
365
|
+
],
|
|
366
|
+
subject: "SLO burn rate rule",
|
|
367
|
+
},
|
|
368
|
+
);
|
|
369
|
+
|
|
143
370
|
await this.validateSeverityReferences({
|
|
144
|
-
projectId:
|
|
371
|
+
projectId: projectId,
|
|
145
372
|
alertSeverityId: createBy.data.alertSeverityId,
|
|
146
373
|
incidentSeverityId: createBy.data.incidentSeverityId,
|
|
147
374
|
});
|
|
148
375
|
|
|
376
|
+
await this.validateRoutingReferences({
|
|
377
|
+
projectId: projectId,
|
|
378
|
+
payload: createBy.data as unknown as Dictionary<unknown>,
|
|
379
|
+
storedIds: undefined,
|
|
380
|
+
});
|
|
381
|
+
|
|
149
382
|
return {
|
|
150
383
|
createBy,
|
|
151
384
|
carryForward: null,
|
|
152
385
|
};
|
|
153
386
|
}
|
|
154
387
|
|
|
388
|
+
/*
|
|
389
|
+
* BurnRateRuleAdded on the SLO feed. Skipped for the two rules OneUptime
|
|
390
|
+
* seeds while creating an SLO: the SLO's own "created" item already
|
|
391
|
+
* describes them (SloFeedUtil.runWhileSeedingDefaultBurnRateRules explains
|
|
392
|
+
* how they are told apart). Fire-and-forget - the rule exists whether or not
|
|
393
|
+
* its feed item does.
|
|
394
|
+
*/
|
|
395
|
+
@CaptureSpan()
|
|
396
|
+
protected override async onCreateSuccess(
|
|
397
|
+
onCreate: OnCreate<Model>,
|
|
398
|
+
createdItem: Model,
|
|
399
|
+
): Promise<Model> {
|
|
400
|
+
if (
|
|
401
|
+
createdItem.serviceLevelObjectiveId &&
|
|
402
|
+
!SloFeedUtil.isSeedingDefaultBurnRateRules(
|
|
403
|
+
createdItem.serviceLevelObjectiveId,
|
|
404
|
+
)
|
|
405
|
+
) {
|
|
406
|
+
const createdAt: Date =
|
|
407
|
+
createdItem.createdAt || OneUptimeDate.getCurrentDate();
|
|
408
|
+
|
|
409
|
+
this.writeBurnRateRuleAddedFeed({
|
|
410
|
+
onCreate: onCreate,
|
|
411
|
+
createdItem: createdItem,
|
|
412
|
+
postedAt: createdAt,
|
|
413
|
+
}).catch((err: Error) => {
|
|
414
|
+
logger.error(
|
|
415
|
+
`Error writing the feed item for added SLO burn rate rule ${createdItem.id?.toString()}: ${err}`,
|
|
416
|
+
{ projectId: createdItem.projectId?.toString() } as LogAttributes,
|
|
417
|
+
);
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
return createdItem;
|
|
422
|
+
}
|
|
423
|
+
|
|
155
424
|
@CaptureSpan()
|
|
156
425
|
protected override async onBeforeUpdate(
|
|
157
426
|
updateBy: UpdateBy<Model>,
|
|
@@ -187,6 +456,19 @@ export class Service extends DatabaseService<Model> {
|
|
|
187
456
|
|
|
188
457
|
await this.validateSeverityReferencesOnUpdate(updateBy);
|
|
189
458
|
|
|
459
|
+
/*
|
|
460
|
+
* Only the options this update actually carries are coerced - an absent
|
|
461
|
+
* flag must stay absent, or a form that saves just the name would reset
|
|
462
|
+
* every other option to its default.
|
|
463
|
+
*/
|
|
464
|
+
this.normalizeOptionFlags(updateBy.data as unknown as Dictionary<unknown>, {
|
|
465
|
+
applyDefaults: false,
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
this.normalizeTemplates(updateBy.data as unknown as Dictionary<unknown>);
|
|
469
|
+
|
|
470
|
+
await this.validateRoutingReferencesOnUpdate(updateBy);
|
|
471
|
+
|
|
190
472
|
const newLongWindow: unknown = updateBy.data.longWindowInMinutes as unknown;
|
|
191
473
|
const newShortWindow: unknown = updateBy.data
|
|
192
474
|
.shortWindowInMinutes as unknown;
|
|
@@ -261,35 +543,115 @@ export class Service extends DatabaseService<Model> {
|
|
|
261
543
|
}
|
|
262
544
|
}
|
|
263
545
|
|
|
546
|
+
/*
|
|
547
|
+
* Last, so a payload the checks above rejected never costs the feed a
|
|
548
|
+
* read. Null unless this is a hand-made edit of a watched column.
|
|
549
|
+
*/
|
|
550
|
+
const feedSnapshot: BurnRateRuleFeedSnapshot | null =
|
|
551
|
+
await this.readFeedSnapshotBeforeUpdate(updateBy);
|
|
552
|
+
|
|
264
553
|
return {
|
|
265
554
|
updateBy,
|
|
266
|
-
carryForward:
|
|
555
|
+
carryForward: {
|
|
556
|
+
feedSnapshot: feedSnapshot,
|
|
557
|
+
},
|
|
267
558
|
};
|
|
268
559
|
}
|
|
269
560
|
|
|
561
|
+
/*
|
|
562
|
+
* READ ONLY: notes down the rules this delete may remove. onDeleteSuccess
|
|
563
|
+
* needs each one's SLO, project and name - to resolve what the rule left
|
|
564
|
+
* open and to describe it on the SLO feed - and the row is gone by then.
|
|
565
|
+
*
|
|
566
|
+
* Nothing is resolved here. DatabaseService runs this hook BEFORE it applies
|
|
567
|
+
* the caller's delete permissions, and the CRUD API passes a raw id, so these
|
|
568
|
+
* rows are only candidates. Resolving here as root let a delete that named
|
|
569
|
+
* another project's rule close that project's burn rate alerts and incidents
|
|
570
|
+
* while deleting nothing. onDeleteSuccess acts only on the ids the delete
|
|
571
|
+
* really removed, and the tenant pin keeps this read from even seeing
|
|
572
|
+
* another project's rules. A multi-tenant request is left unpinned because
|
|
573
|
+
* DatabaseService does not pin it either.
|
|
574
|
+
*
|
|
575
|
+
* The widest page rather than the caller's limit and skip: the
|
|
576
|
+
* permission-checked query can page a narrower set differently, and a rule
|
|
577
|
+
* the delete removed that this read missed would keep its records open.
|
|
578
|
+
*
|
|
579
|
+
* A failed read is deliberately not caught: the evaluation worker only
|
|
580
|
+
* resolves records for rules that still exist, so deleting a rule without
|
|
581
|
+
* knowing what it opened would strand those records, and their on-call
|
|
582
|
+
* escalations, forever.
|
|
583
|
+
*/
|
|
270
584
|
@CaptureSpan()
|
|
271
585
|
protected override async onBeforeDelete(
|
|
272
586
|
deleteBy: DeleteBy<Model>,
|
|
273
587
|
): Promise<OnDelete<Model>> {
|
|
274
|
-
/*
|
|
275
|
-
* Resolve anything the rules being deleted left open — otherwise the alert
|
|
276
|
-
* or incident (and its on-call escalations) stays open forever, because the
|
|
277
|
-
* evaluation worker only resolves records for rules that still exist.
|
|
278
|
-
*/
|
|
279
588
|
const itemsToDelete: Array<Model> = await this.findBy({
|
|
280
|
-
query:
|
|
281
|
-
|
|
282
|
-
|
|
589
|
+
query: SloFeedUtil.getTenantPinnedQuery({
|
|
590
|
+
query: deleteBy.query,
|
|
591
|
+
tenantId: deleteBy.props.isMultiTenantRequest
|
|
592
|
+
? undefined
|
|
593
|
+
: deleteBy.props.tenantId,
|
|
594
|
+
}),
|
|
595
|
+
limit: LIMIT_PER_PROJECT,
|
|
596
|
+
skip: 0,
|
|
283
597
|
select: {
|
|
284
598
|
_id: true,
|
|
285
599
|
projectId: true,
|
|
286
600
|
serviceLevelObjectiveId: true,
|
|
601
|
+
// What the SLO feed's "rule removed" item says - the row is gone after.
|
|
602
|
+
name: true,
|
|
603
|
+
burnRateThreshold: true,
|
|
604
|
+
longWindowInMinutes: true,
|
|
605
|
+
shortWindowInMinutes: true,
|
|
287
606
|
},
|
|
288
607
|
props: {
|
|
289
608
|
isRoot: true,
|
|
290
609
|
},
|
|
291
610
|
});
|
|
292
611
|
|
|
612
|
+
return {
|
|
613
|
+
deleteBy,
|
|
614
|
+
carryForward: {
|
|
615
|
+
itemsToDelete: itemsToDelete,
|
|
616
|
+
},
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/*
|
|
621
|
+
* What the rules this delete really removed leave behind: every alert and
|
|
622
|
+
* incident they opened is resolved, and the SLO feed gets a
|
|
623
|
+
* BurnRateRuleRemoved item built from the rows onBeforeDelete read.
|
|
624
|
+
*
|
|
625
|
+
* Only rows whose ids DatabaseService reports as deleted are acted on
|
|
626
|
+
* (SloFeedUtil.getRowsActuallyDeleted): onBeforeDelete read candidates
|
|
627
|
+
* before permissions were applied, and a delete naming another project's
|
|
628
|
+
* rule removes nothing, so it must resolve and describe nothing either.
|
|
629
|
+
*
|
|
630
|
+
* Resolving after the delete is safe: open records are found by fingerprint
|
|
631
|
+
* in the Alert and Incident tables, which do not need the rule row. It is
|
|
632
|
+
* also the honest order - a delete that fails leaves the rule and its
|
|
633
|
+
* records exactly as they were - and the worker cannot re-fire a rule that
|
|
634
|
+
* no longer exists in between.
|
|
635
|
+
*
|
|
636
|
+
* (Deleting the SLO itself cascades its rules in Postgres without this hook;
|
|
637
|
+
* ServiceLevelObjectiveService.onDeleteSuccess resolves those, and the SLO's
|
|
638
|
+
* feed goes with it, so there is nothing to describe.)
|
|
639
|
+
*/
|
|
640
|
+
@CaptureSpan()
|
|
641
|
+
protected override async onDeleteSuccess(
|
|
642
|
+
onDelete: OnDelete<Model>,
|
|
643
|
+
itemIdsBeforeDelete: Array<ObjectID>,
|
|
644
|
+
): Promise<OnDelete<Model>> {
|
|
645
|
+
// Taken first, so the feed item's time is the delete's, not the resolve's.
|
|
646
|
+
const deletedAt: Date = OneUptimeDate.getCurrentDate();
|
|
647
|
+
|
|
648
|
+
const itemsToDelete: Array<Model> = SloFeedUtil.getRowsActuallyDeleted({
|
|
649
|
+
rows:
|
|
650
|
+
(onDelete.carryForward?.itemsToDelete as Array<Model> | undefined) ||
|
|
651
|
+
[],
|
|
652
|
+
deletedIds: itemIdsBeforeDelete,
|
|
653
|
+
});
|
|
654
|
+
|
|
293
655
|
for (const item of itemsToDelete) {
|
|
294
656
|
if (!item.id || !item.projectId || !item.serviceLevelObjectiveId) {
|
|
295
657
|
continue;
|
|
@@ -304,19 +666,283 @@ export class Service extends DatabaseService<Model> {
|
|
|
304
666
|
"Auto-resolved because the SLO burn rate rule that created it was deleted.",
|
|
305
667
|
});
|
|
306
668
|
} catch (err) {
|
|
669
|
+
/*
|
|
670
|
+
* Never fail the request - the rule is already gone - and never let
|
|
671
|
+
* one rule's failure cost the next rule its resolve.
|
|
672
|
+
*/
|
|
307
673
|
logger.error(
|
|
308
|
-
`Error resolving open alerts and incidents for SLO burn rate rule ${item.id
|
|
309
|
-
{ projectId: item.projectId
|
|
674
|
+
`Error resolving open alerts and incidents for deleted SLO burn rate rule ${item.id.toString()}: ${err}`,
|
|
675
|
+
{ projectId: item.projectId.toString() } as LogAttributes,
|
|
310
676
|
);
|
|
311
677
|
}
|
|
312
678
|
}
|
|
313
679
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
680
|
+
// Fire-and-forget like the other rule items.
|
|
681
|
+
if (itemsToDelete.length > 0) {
|
|
682
|
+
this.writeBurnRateRuleRemovedFeed({
|
|
683
|
+
onDelete: onDelete,
|
|
317
684
|
itemsToDelete: itemsToDelete,
|
|
318
|
-
|
|
319
|
-
|
|
685
|
+
postedAt: deletedAt,
|
|
686
|
+
}).catch((err: Error) => {
|
|
687
|
+
logger.error(
|
|
688
|
+
`Error writing the feed items for removed SLO burn rate rules: ${err}`,
|
|
689
|
+
);
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
return onDelete;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
private async writeBurnRateRuleAddedFeed(data: {
|
|
697
|
+
onCreate: OnCreate<Model>;
|
|
698
|
+
createdItem: Model;
|
|
699
|
+
postedAt: Date;
|
|
700
|
+
}): Promise<void> {
|
|
701
|
+
const serviceLevelObjectiveId: ObjectID | undefined =
|
|
702
|
+
data.createdItem.serviceLevelObjectiveId;
|
|
703
|
+
const projectId: ObjectID | undefined = data.createdItem.projectId;
|
|
704
|
+
|
|
705
|
+
if (!serviceLevelObjectiveId || !projectId) {
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
const markdown: SloFeedMarkdown = getBurnRateRuleAddedFeedMarkdown({
|
|
710
|
+
sloMarkdownLink: await ServiceLevelObjectiveService.getSloMarkdownLink({
|
|
711
|
+
projectId: projectId,
|
|
712
|
+
sloId: serviceLevelObjectiveId,
|
|
713
|
+
}),
|
|
714
|
+
rule: data.createdItem,
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
await ServiceLevelObjectiveFeedService.createServiceLevelObjectiveFeedItem({
|
|
718
|
+
serviceLevelObjectiveId: serviceLevelObjectiveId,
|
|
719
|
+
projectId: projectId,
|
|
720
|
+
serviceLevelObjectiveFeedEventType:
|
|
721
|
+
ServiceLevelObjectiveFeedEventType.BurnRateRuleAdded,
|
|
722
|
+
displayColor: Gray500,
|
|
723
|
+
feedInfoInMarkdown: markdown.feedInfoInMarkdown,
|
|
724
|
+
moreInformationInMarkdown: markdown.moreInformationInMarkdown,
|
|
725
|
+
userId:
|
|
726
|
+
data.createdItem.createdByUserId ||
|
|
727
|
+
data.onCreate.createBy.props.userId ||
|
|
728
|
+
undefined,
|
|
729
|
+
postedAt: data.postedAt,
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
/*
|
|
734
|
+
* The before-half of BurnRateRuleChanged: the watched columns a hand-made
|
|
735
|
+
* edit writes, and each rule as it was before it.
|
|
736
|
+
*
|
|
737
|
+
* Only a non-root write takes a snapshot, and only a write with a snapshot
|
|
738
|
+
* posts. Root writes to a rule are OneUptime's own code paths - the
|
|
739
|
+
* evaluation worker stamping lifecycle columns, the SLO seeding its default
|
|
740
|
+
* rules - so the rule feed describes what people change through the
|
|
741
|
+
* dashboard and the API, and describes it properly: "old -> new", with the
|
|
742
|
+
* untouched fields of a re-submitted form left out. The column check comes
|
|
743
|
+
* before any read, and a failed read never blocks the update.
|
|
744
|
+
*/
|
|
745
|
+
private async readFeedSnapshotBeforeUpdate(
|
|
746
|
+
updateBy: UpdateBy<Model>,
|
|
747
|
+
): Promise<BurnRateRuleFeedSnapshot | null> {
|
|
748
|
+
if (updateBy.props.isRoot) {
|
|
749
|
+
return null;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
const columns: Array<SloFeedColumn> = getSloFeedColumnsInPayload(
|
|
753
|
+
updateBy.data,
|
|
754
|
+
SLO_BURN_RATE_RULE_FEED_COLUMNS,
|
|
755
|
+
);
|
|
756
|
+
|
|
757
|
+
if (columns.length === 0) {
|
|
758
|
+
return null;
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
try {
|
|
762
|
+
const rows: Array<Model> = await this.findBy({
|
|
763
|
+
// Pinned: this hook runs before DatabaseService applies permissions.
|
|
764
|
+
query: SloFeedUtil.getTenantPinnedQuery({
|
|
765
|
+
query: updateBy.query,
|
|
766
|
+
tenantId: updateBy.props.tenantId,
|
|
767
|
+
}),
|
|
768
|
+
select: this.getFeedSelect(columns),
|
|
769
|
+
limit: updateBy.limit,
|
|
770
|
+
skip: updateBy.skip,
|
|
771
|
+
props: {
|
|
772
|
+
isRoot: true,
|
|
773
|
+
},
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
const rowsById: Dictionary<Model> = {};
|
|
777
|
+
|
|
778
|
+
for (const row of rows) {
|
|
779
|
+
if (row.id) {
|
|
780
|
+
rowsById[row.id.toString()] = row;
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
return {
|
|
785
|
+
columns: columns,
|
|
786
|
+
rowsById: rowsById,
|
|
787
|
+
};
|
|
788
|
+
} catch (err) {
|
|
789
|
+
logger.error(
|
|
790
|
+
`Error reading SLO burn rate rules before an update for the SLO feed: ${err}`,
|
|
791
|
+
);
|
|
792
|
+
return null;
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
private getFeedSelect(columns: Array<SloFeedColumn>): Select<Model> {
|
|
797
|
+
return {
|
|
798
|
+
_id: true,
|
|
799
|
+
projectId: true,
|
|
800
|
+
serviceLevelObjectiveId: true,
|
|
801
|
+
name: true,
|
|
802
|
+
...getSloFeedSelect(columns),
|
|
803
|
+
} as Select<Model>;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
private async writeBurnRateRuleChangedFeed(data: {
|
|
807
|
+
onUpdate: OnUpdate<Model>;
|
|
808
|
+
updatedItemIds: Array<ObjectID>;
|
|
809
|
+
postedAt: Date;
|
|
810
|
+
}): Promise<void> {
|
|
811
|
+
const snapshot: BurnRateRuleFeedSnapshot | null =
|
|
812
|
+
(data.onUpdate.carryForward?.feedSnapshot as
|
|
813
|
+
| BurnRateRuleFeedSnapshot
|
|
814
|
+
| null
|
|
815
|
+
| undefined) || null;
|
|
816
|
+
|
|
817
|
+
if (
|
|
818
|
+
!snapshot ||
|
|
819
|
+
snapshot.columns.length === 0 ||
|
|
820
|
+
data.updatedItemIds.length === 0
|
|
821
|
+
) {
|
|
822
|
+
return;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
const userId: ObjectID | undefined =
|
|
826
|
+
data.onUpdate.updateBy.props.userId || undefined;
|
|
827
|
+
|
|
828
|
+
for (const ruleId of data.updatedItemIds) {
|
|
829
|
+
const before: Model | undefined = snapshot.rowsById[ruleId.toString()];
|
|
830
|
+
|
|
831
|
+
if (!before) {
|
|
832
|
+
continue;
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
try {
|
|
836
|
+
const after: Model | null = await this.findOneById({
|
|
837
|
+
id: ruleId,
|
|
838
|
+
select: this.getFeedSelect(snapshot.columns),
|
|
839
|
+
props: {
|
|
840
|
+
isRoot: true,
|
|
841
|
+
},
|
|
842
|
+
});
|
|
843
|
+
|
|
844
|
+
if (!after || !after.projectId || !after.serviceLevelObjectiveId) {
|
|
845
|
+
continue;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
const changes: Array<SloFeedColumnChange> = getSloFeedColumnChanges({
|
|
849
|
+
columns: snapshot.columns,
|
|
850
|
+
before: before as unknown as SloFeedRow,
|
|
851
|
+
after: after as unknown as SloFeedRow,
|
|
852
|
+
});
|
|
853
|
+
|
|
854
|
+
// A form re-submitted without a real change describes nothing.
|
|
855
|
+
if (changes.length === 0) {
|
|
856
|
+
continue;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
const markdown: SloFeedMarkdown = getBurnRateRuleChangedFeedMarkdown({
|
|
860
|
+
sloMarkdownLink:
|
|
861
|
+
await ServiceLevelObjectiveService.getSloMarkdownLink({
|
|
862
|
+
projectId: after.projectId,
|
|
863
|
+
sloId: after.serviceLevelObjectiveId,
|
|
864
|
+
}),
|
|
865
|
+
ruleName: after.name || before.name,
|
|
866
|
+
changes: changes,
|
|
867
|
+
});
|
|
868
|
+
|
|
869
|
+
const isEnabledOnlyChange: boolean =
|
|
870
|
+
changes.length === 1 && changes[0]!.column === "isEnabled";
|
|
871
|
+
|
|
872
|
+
await ServiceLevelObjectiveFeedService.createServiceLevelObjectiveFeedItem(
|
|
873
|
+
{
|
|
874
|
+
serviceLevelObjectiveId: after.serviceLevelObjectiveId,
|
|
875
|
+
projectId: after.projectId,
|
|
876
|
+
serviceLevelObjectiveFeedEventType:
|
|
877
|
+
ServiceLevelObjectiveFeedEventType.BurnRateRuleChanged,
|
|
878
|
+
displayColor:
|
|
879
|
+
isEnabledOnlyChange && changes[0]!.to === "On"
|
|
880
|
+
? Green500
|
|
881
|
+
: Gray500,
|
|
882
|
+
feedInfoInMarkdown: markdown.feedInfoInMarkdown,
|
|
883
|
+
moreInformationInMarkdown: markdown.moreInformationInMarkdown,
|
|
884
|
+
userId: userId,
|
|
885
|
+
postedAt: data.postedAt,
|
|
886
|
+
},
|
|
887
|
+
);
|
|
888
|
+
} catch (err) {
|
|
889
|
+
logger.error(
|
|
890
|
+
`Error writing the feed item for changed SLO burn rate rule ${ruleId.toString()}: ${err}`,
|
|
891
|
+
{ projectId: before.projectId?.toString() } as LogAttributes,
|
|
892
|
+
);
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
private async writeBurnRateRuleRemovedFeed(data: {
|
|
898
|
+
onDelete: OnDelete<Model>;
|
|
899
|
+
itemsToDelete: Array<Model>;
|
|
900
|
+
postedAt: Date;
|
|
901
|
+
}): Promise<void> {
|
|
902
|
+
const deletedByUserId: ObjectID | undefined =
|
|
903
|
+
data.onDelete.deleteBy.deletedByUser?.id ||
|
|
904
|
+
data.onDelete.deleteBy.props.userId ||
|
|
905
|
+
undefined;
|
|
906
|
+
|
|
907
|
+
for (const rule of data.itemsToDelete) {
|
|
908
|
+
const serviceLevelObjectiveId: ObjectID | undefined =
|
|
909
|
+
rule.serviceLevelObjectiveId;
|
|
910
|
+
const projectId: ObjectID | undefined = rule.projectId;
|
|
911
|
+
|
|
912
|
+
if (!serviceLevelObjectiveId || !projectId) {
|
|
913
|
+
continue;
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
try {
|
|
917
|
+
const markdown: SloFeedMarkdown = getBurnRateRuleRemovedFeedMarkdown({
|
|
918
|
+
sloMarkdownLink:
|
|
919
|
+
await ServiceLevelObjectiveService.getSloMarkdownLink({
|
|
920
|
+
projectId: projectId,
|
|
921
|
+
sloId: serviceLevelObjectiveId,
|
|
922
|
+
}),
|
|
923
|
+
rule: rule,
|
|
924
|
+
});
|
|
925
|
+
|
|
926
|
+
await ServiceLevelObjectiveFeedService.createServiceLevelObjectiveFeedItem(
|
|
927
|
+
{
|
|
928
|
+
serviceLevelObjectiveId: serviceLevelObjectiveId,
|
|
929
|
+
projectId: projectId,
|
|
930
|
+
serviceLevelObjectiveFeedEventType:
|
|
931
|
+
ServiceLevelObjectiveFeedEventType.BurnRateRuleRemoved,
|
|
932
|
+
displayColor: Red500,
|
|
933
|
+
feedInfoInMarkdown: markdown.feedInfoInMarkdown,
|
|
934
|
+
moreInformationInMarkdown: markdown.moreInformationInMarkdown,
|
|
935
|
+
userId: deletedByUserId,
|
|
936
|
+
postedAt: data.postedAt,
|
|
937
|
+
},
|
|
938
|
+
);
|
|
939
|
+
} catch (err) {
|
|
940
|
+
logger.error(
|
|
941
|
+
`Error writing the feed item for removed SLO burn rate rule ${rule.id?.toString()}: ${err}`,
|
|
942
|
+
{ projectId: projectId.toString() } as LogAttributes,
|
|
943
|
+
);
|
|
944
|
+
}
|
|
945
|
+
}
|
|
320
946
|
}
|
|
321
947
|
|
|
322
948
|
/*
|
|
@@ -330,12 +956,39 @@ export class Service extends DatabaseService<Model> {
|
|
|
330
956
|
*
|
|
331
957
|
* Runs after the write commits, so an update that was rejected leaves the
|
|
332
958
|
* open records exactly where they were.
|
|
959
|
+
*
|
|
960
|
+
* Switching autoResolveAlert or autoResolveIncident OFF is deliberately not
|
|
961
|
+
* a trigger. Those switches only decide what the worker does when the burn
|
|
962
|
+
* recovers; a rule with auto-resolve off still stands behind what it has
|
|
963
|
+
* open, so nothing is resolved and nothing is forgotten. The reverse is also
|
|
964
|
+
* true: disabling the rule or switching an output off resolves regardless of
|
|
965
|
+
* the auto-resolve switches, because then the rule cannot justify the record
|
|
966
|
+
* at all - the same stance the SLO-level resolves take.
|
|
333
967
|
*/
|
|
334
968
|
@CaptureSpan()
|
|
335
969
|
protected override async onUpdateSuccess(
|
|
336
970
|
onUpdate: OnUpdate<Model>,
|
|
337
971
|
updatedItemIds: Array<ObjectID>,
|
|
338
972
|
): Promise<OnUpdate<Model>> {
|
|
973
|
+
/*
|
|
974
|
+
* BurnRateRuleChanged on the SLO feed - fire-and-forget, and only when
|
|
975
|
+
* onBeforeUpdate took a snapshot (a hand-made edit of a watched column), so
|
|
976
|
+
* the worker's lifecycle stamps do no feed work at all.
|
|
977
|
+
*/
|
|
978
|
+
if (onUpdate.carryForward?.feedSnapshot) {
|
|
979
|
+
const updatedAt: Date = OneUptimeDate.getCurrentDate();
|
|
980
|
+
|
|
981
|
+
this.writeBurnRateRuleChangedFeed({
|
|
982
|
+
onUpdate: onUpdate,
|
|
983
|
+
updatedItemIds: updatedItemIds,
|
|
984
|
+
postedAt: updatedAt,
|
|
985
|
+
}).catch((err: Error) => {
|
|
986
|
+
logger.error(
|
|
987
|
+
`Error writing SLO feed items after a burn rate rule update: ${err}`,
|
|
988
|
+
);
|
|
989
|
+
});
|
|
990
|
+
}
|
|
991
|
+
|
|
339
992
|
/*
|
|
340
993
|
* These three reads are strict `=== false`, and that is only sound because
|
|
341
994
|
* onBeforeUpdate ran first: validateOutputsOnUpdate coerces both output
|
|
@@ -739,6 +1392,392 @@ export class Service extends DatabaseService<Model> {
|
|
|
739
1392
|
}
|
|
740
1393
|
}
|
|
741
1394
|
|
|
1395
|
+
/*
|
|
1396
|
+
* Coerce the five option flags. `applyDefaults` is the create path, where a
|
|
1397
|
+
* flag the payload never mentions is written as its default; on update an
|
|
1398
|
+
* absent flag stays absent.
|
|
1399
|
+
*
|
|
1400
|
+
* An explicit null is not "absent", though. All five are NOT NULL columns,
|
|
1401
|
+
* so writing null would fail the update with a raw constraint error - it is
|
|
1402
|
+
* read the way the create path reads it, as the column default.
|
|
1403
|
+
*/
|
|
1404
|
+
private normalizeOptionFlags(
|
|
1405
|
+
data: Dictionary<unknown>,
|
|
1406
|
+
options: { applyDefaults: boolean },
|
|
1407
|
+
): void {
|
|
1408
|
+
const flags: Array<BurnRateRuleOptionFlag> = Object.keys(
|
|
1409
|
+
BURN_RATE_RULE_OPTION_FLAG_DEFAULTS,
|
|
1410
|
+
) as Array<BurnRateRuleOptionFlag>;
|
|
1411
|
+
|
|
1412
|
+
for (const flag of flags) {
|
|
1413
|
+
const value: unknown = data[flag];
|
|
1414
|
+
|
|
1415
|
+
if (!options.applyDefaults && value === undefined) {
|
|
1416
|
+
continue;
|
|
1417
|
+
}
|
|
1418
|
+
|
|
1419
|
+
data[flag] = this.normalizeBooleanInput(
|
|
1420
|
+
value,
|
|
1421
|
+
BURN_RATE_RULE_OPTION_FLAG_DEFAULTS[flag],
|
|
1422
|
+
);
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
|
|
1426
|
+
/*
|
|
1427
|
+
* Titles, descriptions and remediation notes. A blank template is stored as
|
|
1428
|
+
* NULL: the worker treats blank and absent the same (it falls back to the
|
|
1429
|
+
* built-in text), and NULL keeps the table and the edit form honest about
|
|
1430
|
+
* which rules have a template at all. Content is never trimmed - leading
|
|
1431
|
+
* whitespace is meaningful in markdown.
|
|
1432
|
+
*/
|
|
1433
|
+
private normalizeTemplates(data: Dictionary<unknown>): void {
|
|
1434
|
+
for (const template of BURN_RATE_RULE_TEMPLATE_COLUMNS) {
|
|
1435
|
+
const value: unknown = data[template.column];
|
|
1436
|
+
|
|
1437
|
+
if (value === undefined || value === null) {
|
|
1438
|
+
continue;
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
if (typeof value !== "string") {
|
|
1442
|
+
throw new BadDataException(`${template.title} must be text.`);
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
if (value.trim() === "") {
|
|
1446
|
+
data[template.column] = null;
|
|
1447
|
+
continue;
|
|
1448
|
+
}
|
|
1449
|
+
|
|
1450
|
+
if (value.length > template.maxLength) {
|
|
1451
|
+
throw new BadDataException(
|
|
1452
|
+
`${template.title} must be ${template.maxLength} characters or fewer. It is ${value.length} characters long.`,
|
|
1453
|
+
);
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
/*
|
|
1459
|
+
* Labels, owner teams and on-call policies are project-scoped rows joined to
|
|
1460
|
+
* the rule by plain many-to-many tables, so nothing stopped an API caller
|
|
1461
|
+
* attaching another project's team - and the worker would then copy it onto
|
|
1462
|
+
* every alert this rule opens, handing that team another project's page.
|
|
1463
|
+
* The on-call lists were never validated either; they are the same hazard
|
|
1464
|
+
* with an escalation attached, so they are checked here too.
|
|
1465
|
+
*
|
|
1466
|
+
* `storedIds` is the update path's inheritance: ids a rule already holds are
|
|
1467
|
+
* carried forward unchecked (the dashboard re-submits whole lists on every
|
|
1468
|
+
* save), and only what the write INTRODUCES is validated - the rule
|
|
1469
|
+
* MonitorStepsProjectValidator follows for the same reason.
|
|
1470
|
+
*/
|
|
1471
|
+
private async validateRoutingReferences(data: {
|
|
1472
|
+
projectId: ObjectID | undefined;
|
|
1473
|
+
payload: Dictionary<unknown>;
|
|
1474
|
+
storedIds: Dictionary<Set<string>> | undefined;
|
|
1475
|
+
}): Promise<void> {
|
|
1476
|
+
if (!data.projectId) {
|
|
1477
|
+
// Same reasoning as validateSeverityReferences: nothing to compare to.
|
|
1478
|
+
return;
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
const references: Array<ProjectScopedReference> = [];
|
|
1482
|
+
|
|
1483
|
+
for (const relation of this.getProjectScopedRelations()) {
|
|
1484
|
+
const ids: Array<string> = this.getIntroducedRelationIds(
|
|
1485
|
+
data.payload[relation.column],
|
|
1486
|
+
data.storedIds?.[relation.column],
|
|
1487
|
+
);
|
|
1488
|
+
|
|
1489
|
+
for (const id of ids) {
|
|
1490
|
+
references.push({
|
|
1491
|
+
modelName: relation.modelName,
|
|
1492
|
+
id: id,
|
|
1493
|
+
service: relation.service,
|
|
1494
|
+
});
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
if (references.length > 0) {
|
|
1499
|
+
await ProjectScopedReferenceValidator.validateReferencesBelongToProject({
|
|
1500
|
+
projectId: data.projectId,
|
|
1501
|
+
subject: "SLO burn rate rule",
|
|
1502
|
+
references: references,
|
|
1503
|
+
});
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
const ownerUserIds: Array<string> = [];
|
|
1507
|
+
|
|
1508
|
+
for (const column of OWNER_USER_COLUMNS) {
|
|
1509
|
+
ownerUserIds.push(
|
|
1510
|
+
...this.getIntroducedRelationIds(
|
|
1511
|
+
data.payload[column],
|
|
1512
|
+
data.storedIds?.[column],
|
|
1513
|
+
),
|
|
1514
|
+
);
|
|
1515
|
+
}
|
|
1516
|
+
|
|
1517
|
+
await this.validateOwnerUsersAreProjectMembers({
|
|
1518
|
+
projectId: data.projectId,
|
|
1519
|
+
userIds: ownerUserIds,
|
|
1520
|
+
});
|
|
1521
|
+
}
|
|
1522
|
+
|
|
1523
|
+
/*
|
|
1524
|
+
* The update twin. One read serves both halves: it names the projects the
|
|
1525
|
+
* update touches (when the caller carries no tenant) and what each matched
|
|
1526
|
+
* rule already stores, and it only happens when the payload carries a list.
|
|
1527
|
+
*/
|
|
1528
|
+
private async validateRoutingReferencesOnUpdate(
|
|
1529
|
+
updateBy: UpdateBy<Model>,
|
|
1530
|
+
): Promise<void> {
|
|
1531
|
+
const payload: Dictionary<unknown> =
|
|
1532
|
+
updateBy.data as unknown as Dictionary<unknown>;
|
|
1533
|
+
|
|
1534
|
+
const columnsInPayload: Array<BurnRateRuleRelationColumn> =
|
|
1535
|
+
RELATION_COLUMNS.filter((column: BurnRateRuleRelationColumn): boolean => {
|
|
1536
|
+
return payload[column] !== undefined && payload[column] !== null;
|
|
1537
|
+
});
|
|
1538
|
+
|
|
1539
|
+
if (columnsInPayload.length === 0) {
|
|
1540
|
+
return;
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1543
|
+
const select: Dictionary<unknown> = {
|
|
1544
|
+
_id: true,
|
|
1545
|
+
projectId: true,
|
|
1546
|
+
};
|
|
1547
|
+
|
|
1548
|
+
for (const column of columnsInPayload) {
|
|
1549
|
+
select[column] = {
|
|
1550
|
+
_id: true,
|
|
1551
|
+
};
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
const rules: Array<Model> = await this.findBy({
|
|
1555
|
+
query: updateBy.query,
|
|
1556
|
+
select: select as unknown as Select<Model>,
|
|
1557
|
+
limit: LIMIT_PER_PROJECT,
|
|
1558
|
+
skip: 0,
|
|
1559
|
+
props: {
|
|
1560
|
+
isRoot: true,
|
|
1561
|
+
},
|
|
1562
|
+
});
|
|
1563
|
+
|
|
1564
|
+
const projectIds: Dictionary<ObjectID> = {};
|
|
1565
|
+
|
|
1566
|
+
if (updateBy.props.tenantId) {
|
|
1567
|
+
projectIds[updateBy.props.tenantId.toString()] = updateBy.props.tenantId;
|
|
1568
|
+
} else {
|
|
1569
|
+
for (const rule of rules) {
|
|
1570
|
+
if (rule.projectId) {
|
|
1571
|
+
projectIds[rule.projectId.toString()] = rule.projectId;
|
|
1572
|
+
}
|
|
1573
|
+
}
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
for (const projectId of Object.values(projectIds)) {
|
|
1577
|
+
const storedIds: Dictionary<Set<string>> = {};
|
|
1578
|
+
|
|
1579
|
+
for (const column of columnsInPayload) {
|
|
1580
|
+
const idsForColumn: Set<string> = new Set<string>();
|
|
1581
|
+
|
|
1582
|
+
for (const rule of rules) {
|
|
1583
|
+
if (
|
|
1584
|
+
rule.projectId &&
|
|
1585
|
+
rule.projectId.toString() !== projectId.toString()
|
|
1586
|
+
) {
|
|
1587
|
+
continue;
|
|
1588
|
+
}
|
|
1589
|
+
|
|
1590
|
+
const stored: Array<DatabaseBaseModel> =
|
|
1591
|
+
(rule.getValue(column) as unknown as
|
|
1592
|
+
| Array<DatabaseBaseModel>
|
|
1593
|
+
| undefined) || [];
|
|
1594
|
+
|
|
1595
|
+
for (const related of stored) {
|
|
1596
|
+
const relatedId: string | undefined =
|
|
1597
|
+
resolveReferenceId(related)?.toString();
|
|
1598
|
+
|
|
1599
|
+
if (relatedId) {
|
|
1600
|
+
idsForColumn.add(normalizeId(relatedId));
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1603
|
+
}
|
|
1604
|
+
|
|
1605
|
+
storedIds[column] = idsForColumn;
|
|
1606
|
+
}
|
|
1607
|
+
|
|
1608
|
+
await this.validateRoutingReferences({
|
|
1609
|
+
projectId: projectId,
|
|
1610
|
+
payload: payload,
|
|
1611
|
+
storedIds: storedIds,
|
|
1612
|
+
});
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
/*
|
|
1617
|
+
* User is a global model with no tenant column, so the reference validator
|
|
1618
|
+
* could only confirm a user EXISTS - any account on the instance would pass.
|
|
1619
|
+
* Owners are notified with the record's title and a link to it, so naming a
|
|
1620
|
+
* stranger as an owner would tell them about another project's alert.
|
|
1621
|
+
*
|
|
1622
|
+
* Team membership is what "in this project" means, and it is exactly the set
|
|
1623
|
+
* the dashboard's owner picker offers (ProjectUser lists TeamMember rows).
|
|
1624
|
+
* Pending invitations count for that reason: refusing a user the picker just
|
|
1625
|
+
* offered would fail a save nobody could explain.
|
|
1626
|
+
*
|
|
1627
|
+
* The error echoes the ids the caller sent and never a name or email -
|
|
1628
|
+
* resolving an id from outside the project into a person would leak it.
|
|
1629
|
+
*/
|
|
1630
|
+
private async validateOwnerUsersAreProjectMembers(data: {
|
|
1631
|
+
projectId: ObjectID;
|
|
1632
|
+
userIds: Array<string>;
|
|
1633
|
+
}): Promise<void> {
|
|
1634
|
+
const requestedById: Map<string, string> = new Map<string, string>();
|
|
1635
|
+
|
|
1636
|
+
for (const userId of data.userIds) {
|
|
1637
|
+
const key: string = normalizeId(userId);
|
|
1638
|
+
|
|
1639
|
+
if (key && !requestedById.has(key)) {
|
|
1640
|
+
requestedById.set(key, userId);
|
|
1641
|
+
}
|
|
1642
|
+
}
|
|
1643
|
+
|
|
1644
|
+
if (requestedById.size === 0) {
|
|
1645
|
+
return;
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1648
|
+
const memberships: Array<TeamMember> = await TeamMemberService.findBy({
|
|
1649
|
+
query: {
|
|
1650
|
+
projectId: data.projectId,
|
|
1651
|
+
userId: QueryHelper.any(Array.from(requestedById.values())),
|
|
1652
|
+
},
|
|
1653
|
+
select: {
|
|
1654
|
+
userId: true,
|
|
1655
|
+
},
|
|
1656
|
+
limit: LIMIT_PER_PROJECT,
|
|
1657
|
+
skip: 0,
|
|
1658
|
+
props: {
|
|
1659
|
+
isRoot: true,
|
|
1660
|
+
},
|
|
1661
|
+
});
|
|
1662
|
+
|
|
1663
|
+
const memberIds: Set<string> = new Set<string>();
|
|
1664
|
+
|
|
1665
|
+
for (const membership of memberships) {
|
|
1666
|
+
if (membership.userId) {
|
|
1667
|
+
memberIds.add(normalizeId(membership.userId.toString()));
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1671
|
+
const nonMembers: Array<string> = [];
|
|
1672
|
+
|
|
1673
|
+
for (const [key, userId] of requestedById) {
|
|
1674
|
+
if (!memberIds.has(key)) {
|
|
1675
|
+
nonMembers.push(userId);
|
|
1676
|
+
}
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
if (nonMembers.length === 0) {
|
|
1680
|
+
return;
|
|
1681
|
+
}
|
|
1682
|
+
|
|
1683
|
+
throw new BadDataException(
|
|
1684
|
+
`${OWNER_USERS_NOT_IN_PROJECT_ERROR_PREFIX} ${nonMembers
|
|
1685
|
+
.map((userId: string): string => {
|
|
1686
|
+
return `"${userId}"`;
|
|
1687
|
+
})
|
|
1688
|
+
.join(", ")}. Please pick users from this project and try again.`,
|
|
1689
|
+
);
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1692
|
+
/*
|
|
1693
|
+
* The ids a many-to-many payload introduces. The same list reaches a hook as
|
|
1694
|
+
* entity stubs, `{ _id }` objects, ObjectIDs or bare uuid strings depending
|
|
1695
|
+
* on the caller, which resolveReferenceId already reads; anything it cannot
|
|
1696
|
+
* read is not an id and is left for the write itself to reject.
|
|
1697
|
+
*/
|
|
1698
|
+
private getIntroducedRelationIds(
|
|
1699
|
+
value: unknown,
|
|
1700
|
+
storedIds: Set<string> | undefined,
|
|
1701
|
+
): Array<string> {
|
|
1702
|
+
if (value === undefined || value === null) {
|
|
1703
|
+
return [];
|
|
1704
|
+
}
|
|
1705
|
+
|
|
1706
|
+
const items: Array<unknown> = Array.isArray(value) ? value : [value];
|
|
1707
|
+
const seen: Set<string> = new Set<string>();
|
|
1708
|
+
const ids: Array<string> = [];
|
|
1709
|
+
|
|
1710
|
+
for (const item of items) {
|
|
1711
|
+
const id: string = resolveReferenceId(item)?.toString().trim() || "";
|
|
1712
|
+
|
|
1713
|
+
if (!id) {
|
|
1714
|
+
continue;
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1717
|
+
const key: string = normalizeId(id);
|
|
1718
|
+
|
|
1719
|
+
if (seen.has(key) || storedIds?.has(key)) {
|
|
1720
|
+
continue;
|
|
1721
|
+
}
|
|
1722
|
+
|
|
1723
|
+
seen.add(key);
|
|
1724
|
+
ids.push(id);
|
|
1725
|
+
}
|
|
1726
|
+
|
|
1727
|
+
return ids;
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
/*
|
|
1731
|
+
* Built per call rather than at module load: these services sit in an import
|
|
1732
|
+
* graph that loops back to this one, and a module-level table would capture
|
|
1733
|
+
* whichever of them had not finished loading yet as undefined.
|
|
1734
|
+
*/
|
|
1735
|
+
private getProjectScopedRelations(): Array<{
|
|
1736
|
+
column: BurnRateRuleProjectScopedRelationColumn;
|
|
1737
|
+
modelName: string;
|
|
1738
|
+
service: DatabaseService<DatabaseBaseModel>;
|
|
1739
|
+
}> {
|
|
1740
|
+
const onCallDutyPolicyService: DatabaseService<DatabaseBaseModel> =
|
|
1741
|
+
OnCallDutyPolicyService as unknown as DatabaseService<DatabaseBaseModel>;
|
|
1742
|
+
const labelService: DatabaseService<DatabaseBaseModel> =
|
|
1743
|
+
LabelService as unknown as DatabaseService<DatabaseBaseModel>;
|
|
1744
|
+
const teamService: DatabaseService<DatabaseBaseModel> =
|
|
1745
|
+
TeamService as unknown as DatabaseService<DatabaseBaseModel>;
|
|
1746
|
+
|
|
1747
|
+
return [
|
|
1748
|
+
{
|
|
1749
|
+
column: "onCallDutyPolicies",
|
|
1750
|
+
modelName: "On-Call Duty Policy",
|
|
1751
|
+
service: onCallDutyPolicyService,
|
|
1752
|
+
},
|
|
1753
|
+
{
|
|
1754
|
+
column: "incidentOnCallDutyPolicies",
|
|
1755
|
+
modelName: "On-Call Duty Policy",
|
|
1756
|
+
service: onCallDutyPolicyService,
|
|
1757
|
+
},
|
|
1758
|
+
{
|
|
1759
|
+
column: "alertLabels",
|
|
1760
|
+
modelName: "Label",
|
|
1761
|
+
service: labelService,
|
|
1762
|
+
},
|
|
1763
|
+
{
|
|
1764
|
+
column: "incidentLabels",
|
|
1765
|
+
modelName: "Label",
|
|
1766
|
+
service: labelService,
|
|
1767
|
+
},
|
|
1768
|
+
{
|
|
1769
|
+
column: "alertOwnerTeams",
|
|
1770
|
+
modelName: "Team",
|
|
1771
|
+
service: teamService,
|
|
1772
|
+
},
|
|
1773
|
+
{
|
|
1774
|
+
column: "incidentOwnerTeams",
|
|
1775
|
+
modelName: "Team",
|
|
1776
|
+
service: teamService,
|
|
1777
|
+
},
|
|
1778
|
+
];
|
|
1779
|
+
}
|
|
1780
|
+
|
|
742
1781
|
private async getProjectIdsForUpdateQuery(
|
|
743
1782
|
updateBy: UpdateBy<Model>,
|
|
744
1783
|
): Promise<Array<ObjectID>> {
|