@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
|
@@ -0,0 +1,1069 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import LabelService from "./LabelService";
|
|
3
|
+
import ServiceLevelObjectiveFeedService from "./ServiceLevelObjectiveFeedService";
|
|
4
|
+
import ServiceLevelObjectiveMonitorRuleEngineService from "./ServiceLevelObjectiveMonitorRuleEngineService";
|
|
5
|
+
import ServiceLevelObjectiveService from "./ServiceLevelObjectiveService";
|
|
6
|
+
import Label from "../../Models/DatabaseModels/Label";
|
|
7
|
+
import { ServiceLevelObjectiveFeedEventType } from "../../Models/DatabaseModels/ServiceLevelObjectiveFeed";
|
|
8
|
+
import Model from "../../Models/DatabaseModels/ServiceLevelObjectiveMonitorRule";
|
|
9
|
+
import { Gray500, Green500, Red500 } from "../../Types/BrandColors";
|
|
10
|
+
import Color from "../../Types/Color";
|
|
11
|
+
import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
12
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
13
|
+
import ObjectID from "../../Types/ObjectID";
|
|
14
|
+
import { escapeMarkdownInline } from "../../Utils/Markdown/MarkdownEscape";
|
|
15
|
+
import {
|
|
16
|
+
getRuleCriteriaValidationError,
|
|
17
|
+
isValidRuleCriteria,
|
|
18
|
+
} from "../../Utils/Rules/RuleCriteriaMatcher";
|
|
19
|
+
import {
|
|
20
|
+
describeSloMonitorRuleCriteria,
|
|
21
|
+
getSloMonitorRuleCriteriaKey,
|
|
22
|
+
getSloMonitorRuleLabelIds,
|
|
23
|
+
} from "../../Utils/Slo/SloMonitorRuleCriteria";
|
|
24
|
+
import CreateBy from "../Types/Database/CreateBy";
|
|
25
|
+
import DeleteBy from "../Types/Database/DeleteBy";
|
|
26
|
+
import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
|
|
27
|
+
import ModelPermission from "../Types/Database/Permissions/Index";
|
|
28
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
29
|
+
import Select from "../Types/Database/Select";
|
|
30
|
+
import UpdateBy from "../Types/Database/UpdateBy";
|
|
31
|
+
import { resolveReferenceId } from "../Utils/Database/ProjectScopedReferenceValidator";
|
|
32
|
+
import SloRecordReferenceValidator from "../Utils/Slo/SloRecordReferenceValidator";
|
|
33
|
+
import SloLegacyMonitorLabelAdoption from "../Utils/Slo/SloLegacyMonitorLabelAdoption";
|
|
34
|
+
import logger, { LogAttributes } from "../Utils/Logger";
|
|
35
|
+
import MonitorRulePatternValidator from "../Utils/Rules/MonitorRulePatternValidator";
|
|
36
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
37
|
+
|
|
38
|
+
/*
|
|
39
|
+
* Everything a hook needs to validate a rule, describe it in the SLO feed,
|
|
40
|
+
* and find the SLO to re-sync. One select for all three, so a single read
|
|
41
|
+
* serves the validation and the before-snapshot.
|
|
42
|
+
*/
|
|
43
|
+
const RULE_SNAPSHOT_SELECT: Select<Model> = {
|
|
44
|
+
_id: true,
|
|
45
|
+
projectId: true,
|
|
46
|
+
serviceLevelObjectiveId: true,
|
|
47
|
+
name: true,
|
|
48
|
+
description: true,
|
|
49
|
+
isEnabled: true,
|
|
50
|
+
monitorLabels: {
|
|
51
|
+
_id: true,
|
|
52
|
+
name: true,
|
|
53
|
+
},
|
|
54
|
+
monitorNamePattern: true,
|
|
55
|
+
monitorDescriptionPattern: true,
|
|
56
|
+
criteria: true,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
type BuildRuleFeedSentenceFunction = (data: {
|
|
60
|
+
sloLink: string;
|
|
61
|
+
ruleName: string;
|
|
62
|
+
}) => string;
|
|
63
|
+
|
|
64
|
+
interface RuleUpdateCarryForward {
|
|
65
|
+
rulesBeforeUpdate: Array<Model>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
interface RuleDeleteCarryForward {
|
|
69
|
+
rulesToDelete: Array<Model>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export class Service extends DatabaseService<Model> {
|
|
73
|
+
public constructor() {
|
|
74
|
+
super(Model);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@CaptureSpan()
|
|
78
|
+
protected override async onBeforeCreate(
|
|
79
|
+
createBy: CreateBy<Model>,
|
|
80
|
+
): Promise<OnCreate<Model>> {
|
|
81
|
+
const serviceLevelObjectiveId: ObjectID | string | undefined =
|
|
82
|
+
resolveReferenceId(
|
|
83
|
+
createBy.data.serviceLevelObjectiveId ||
|
|
84
|
+
createBy.data.serviceLevelObjective,
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
if (!serviceLevelObjectiveId) {
|
|
88
|
+
throw new BadDataException(
|
|
89
|
+
"Service Level Objective ID is required to create an SLO monitor rule.",
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
this.assertHasMatchCriteria({
|
|
94
|
+
monitorLabelCount: (createBy.data.monitorLabels || []).length,
|
|
95
|
+
monitorNamePattern: createBy.data.monitorNamePattern,
|
|
96
|
+
monitorDescriptionPattern: createBy.data.monitorDescriptionPattern,
|
|
97
|
+
criteria: createBy.data.criteria,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
MonitorRulePatternValidator.validate({
|
|
101
|
+
namePattern: createBy.data.monitorNamePattern,
|
|
102
|
+
descriptionPattern: createBy.data.monitorDescriptionPattern,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
await this.assertServiceLevelObjectiveIsInScope({
|
|
106
|
+
projectId: createBy.props.tenantId || createBy.data.projectId,
|
|
107
|
+
// Both spellings: the id column and the relation write one join column.
|
|
108
|
+
serviceLevelObjective: [
|
|
109
|
+
createBy.data.serviceLevelObjectiveId,
|
|
110
|
+
createBy.data.serviceLevelObjective,
|
|
111
|
+
],
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Last: only a create every check above accepted may change the SLO.
|
|
115
|
+
await this.adoptLegacyMonitorLabelsBeforeCreate({
|
|
116
|
+
createBy: createBy,
|
|
117
|
+
projectId: createBy.props.tenantId || createBy.data.projectId,
|
|
118
|
+
serviceLevelObjectiveId: serviceLevelObjectiveId,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
createBy: createBy,
|
|
123
|
+
carryForward: null,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@CaptureSpan()
|
|
128
|
+
protected override async onCreateSuccess(
|
|
129
|
+
onCreate: OnCreate<Model>,
|
|
130
|
+
createdItem: Model,
|
|
131
|
+
): Promise<Model> {
|
|
132
|
+
if (!createdItem.id) {
|
|
133
|
+
return createdItem;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/*
|
|
137
|
+
* Read back what was actually stored rather than trusting the payload:
|
|
138
|
+
* a criteria save rewrites the legacy columns (the safety shadow), and
|
|
139
|
+
* the feed item should describe the rule the engine will evaluate.
|
|
140
|
+
*/
|
|
141
|
+
const rule: Model =
|
|
142
|
+
(await this.findRuleSnapshotQuietly(createdItem.id)) || createdItem;
|
|
143
|
+
|
|
144
|
+
const serviceLevelObjectiveId: ObjectID | undefined =
|
|
145
|
+
rule.serviceLevelObjectiveId || createdItem.serviceLevelObjectiveId;
|
|
146
|
+
|
|
147
|
+
/*
|
|
148
|
+
* Posted before the sync, so the feed reads cause then effect: the rule
|
|
149
|
+
* was added, then the monitors it matched were attached.
|
|
150
|
+
*/
|
|
151
|
+
await this.postRuleFeedItem({
|
|
152
|
+
rule: rule,
|
|
153
|
+
eventType: ServiceLevelObjectiveFeedEventType.MonitorRuleAdded,
|
|
154
|
+
displayColor: Green500,
|
|
155
|
+
userId: createdItem.createdByUserId || onCreate.createBy.props.userId,
|
|
156
|
+
buildFeedInfoInMarkdown: (data: {
|
|
157
|
+
sloLink: string;
|
|
158
|
+
ruleName: string;
|
|
159
|
+
}): string => {
|
|
160
|
+
return rule.isEnabled === false
|
|
161
|
+
? `🧩 Added monitor rule ${data.ruleName} to ${data.sloLink}. It was added disabled, so it does not attach any monitors yet.`
|
|
162
|
+
: `🧩 Added monitor rule ${data.ruleName} to ${data.sloLink}. Monitors it matches are attached to this SLO.`;
|
|
163
|
+
},
|
|
164
|
+
moreInformationInMarkdown: await this.describeRuleForFeed(rule),
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
/*
|
|
168
|
+
* Backfill: a rule the user just wrote should attach the monitors that
|
|
169
|
+
* already match, not only ones created after it.
|
|
170
|
+
*/
|
|
171
|
+
if (serviceLevelObjectiveId) {
|
|
172
|
+
await this.syncQuietly(serviceLevelObjectiveId);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return createdItem;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
@CaptureSpan()
|
|
179
|
+
protected override async onBeforeUpdate(
|
|
180
|
+
updateBy: UpdateBy<Model>,
|
|
181
|
+
): Promise<OnUpdate<Model>> {
|
|
182
|
+
MonitorRulePatternValidator.validate({
|
|
183
|
+
namePattern: updateBy.data.monitorNamePattern as string | undefined,
|
|
184
|
+
descriptionPattern: updateBy.data.monitorDescriptionPattern as
|
|
185
|
+
| string
|
|
186
|
+
| undefined,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
const touchesCriteria: boolean =
|
|
190
|
+
updateBy.data.monitorLabels !== undefined ||
|
|
191
|
+
updateBy.data.monitorNamePattern !== undefined ||
|
|
192
|
+
updateBy.data.monitorDescriptionPattern !== undefined ||
|
|
193
|
+
updateBy.data.criteria !== undefined;
|
|
194
|
+
|
|
195
|
+
const touchesFeedColumns: boolean =
|
|
196
|
+
touchesCriteria ||
|
|
197
|
+
updateBy.data.name !== undefined ||
|
|
198
|
+
updateBy.data.description !== undefined ||
|
|
199
|
+
updateBy.data.isEnabled !== undefined;
|
|
200
|
+
|
|
201
|
+
/*
|
|
202
|
+
* One read serves two purposes: the merged criteria check below, and the
|
|
203
|
+
* before-snapshot onUpdateSuccess compares against to decide whether the
|
|
204
|
+
* edit changed anything worth a feed item. An edit that touches none of
|
|
205
|
+
* those columns needs neither, so it pays for no read.
|
|
206
|
+
*/
|
|
207
|
+
const rulesBeforeUpdate: Array<Model> = touchesFeedColumns
|
|
208
|
+
? await this.findRulesForQuery(updateBy)
|
|
209
|
+
: [];
|
|
210
|
+
|
|
211
|
+
/*
|
|
212
|
+
* An edit can empty a rule out just as easily as a create can, and the
|
|
213
|
+
* result is the same useless rule. The merged view is what matters, so
|
|
214
|
+
* fields the edit does not mention are read back off the stored row -
|
|
215
|
+
* clearing only the labels on a rule that also has a name pattern is
|
|
216
|
+
* perfectly fine, and must not be refused.
|
|
217
|
+
*/
|
|
218
|
+
if (touchesCriteria) {
|
|
219
|
+
this.assertUpdateKeepsMatchCriteria({
|
|
220
|
+
updateBy: updateBy,
|
|
221
|
+
rules: rulesBeforeUpdate,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const carryForward: RuleUpdateCarryForward = {
|
|
226
|
+
rulesBeforeUpdate: rulesBeforeUpdate,
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
return { updateBy, carryForward: carryForward };
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
@CaptureSpan()
|
|
233
|
+
protected override async onUpdateSuccess(
|
|
234
|
+
onUpdate: OnUpdate<Model>,
|
|
235
|
+
updatedItemIds: Array<ObjectID>,
|
|
236
|
+
): Promise<OnUpdate<Model>> {
|
|
237
|
+
const updatedIds: Set<string> = new Set<string>(
|
|
238
|
+
updatedItemIds.map((id: ObjectID): string => {
|
|
239
|
+
return id.toString();
|
|
240
|
+
}),
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
/*
|
|
244
|
+
* The snapshot was read with the caller's raw (tenant-pinned) query,
|
|
245
|
+
* before the permission check narrowed it. updatedItemIds is the set that
|
|
246
|
+
* was actually written, so only those rows are described.
|
|
247
|
+
*/
|
|
248
|
+
const rulesBeforeUpdate: Array<Model> = (
|
|
249
|
+
(onUpdate.carryForward as RuleUpdateCarryForward | null)
|
|
250
|
+
?.rulesBeforeUpdate || []
|
|
251
|
+
).filter((rule: Model): boolean => {
|
|
252
|
+
return Boolean(rule.id && updatedIds.has(rule.id.toString()));
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
const ruleBeforeUpdateById: Map<string, Model> = new Map<string, Model>();
|
|
256
|
+
|
|
257
|
+
for (const rule of rulesBeforeUpdate) {
|
|
258
|
+
ruleBeforeUpdateById.set(rule.id!.toString(), rule);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
let rulesAfterUpdate: Array<Model> = [];
|
|
262
|
+
|
|
263
|
+
if (updatedItemIds.length > 0) {
|
|
264
|
+
try {
|
|
265
|
+
rulesAfterUpdate = await this.findBy({
|
|
266
|
+
query: {
|
|
267
|
+
_id: QueryHelper.any(updatedItemIds),
|
|
268
|
+
},
|
|
269
|
+
select: RULE_SNAPSHOT_SELECT,
|
|
270
|
+
limit: LIMIT_PER_PROJECT,
|
|
271
|
+
skip: 0,
|
|
272
|
+
props: {
|
|
273
|
+
isRoot: true,
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
} catch (error) {
|
|
277
|
+
logger.error(
|
|
278
|
+
`Error reading SLO monitor rules back after an update: ${error}`,
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
for (const rule of rulesAfterUpdate) {
|
|
284
|
+
const ruleBeforeUpdate: Model | undefined = rule.id
|
|
285
|
+
? ruleBeforeUpdateById.get(rule.id.toString())
|
|
286
|
+
: undefined;
|
|
287
|
+
|
|
288
|
+
if (!ruleBeforeUpdate) {
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
await this.postRuleChangedFeedItem({
|
|
293
|
+
previous: ruleBeforeUpdate,
|
|
294
|
+
current: rule,
|
|
295
|
+
userId: onUpdate.updateBy.props.userId,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/*
|
|
300
|
+
* Every editable column changes what the rule matches, whether it is
|
|
301
|
+
* enabled, or neither (name, description) - and the sync is idempotent,
|
|
302
|
+
* so re-running it after an edit that changed nothing costs a read and
|
|
303
|
+
* repairs any drift it finds.
|
|
304
|
+
*/
|
|
305
|
+
for (const serviceLevelObjectiveId of this.uniqueServiceLevelObjectiveIds([
|
|
306
|
+
...rulesAfterUpdate,
|
|
307
|
+
...rulesBeforeUpdate,
|
|
308
|
+
])) {
|
|
309
|
+
await this.syncQuietly(serviceLevelObjectiveId);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return onUpdate;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Notes down which SLO each doomed rule belongs to, so onDeleteSuccess can
|
|
317
|
+
* re-sync those SLOs and tell their feeds.
|
|
318
|
+
*
|
|
319
|
+
* This has to happen before the delete: once the row is gone there is
|
|
320
|
+
* nothing left to read the SLO id or the rule name off.
|
|
321
|
+
*
|
|
322
|
+
* It is READ ONLY, and reads through the caller's own props rather than as
|
|
323
|
+
* root. DatabaseService runs onBeforeDelete before checkDeleteQueryPermission,
|
|
324
|
+
* so the query here is the caller's raw one - anything this hook did as root
|
|
325
|
+
* would act on rows the caller may not be allowed to delete.
|
|
326
|
+
*/
|
|
327
|
+
@CaptureSpan()
|
|
328
|
+
protected override async onBeforeDelete(
|
|
329
|
+
deleteBy: DeleteBy<Model>,
|
|
330
|
+
): Promise<OnDelete<Model>> {
|
|
331
|
+
let rulesToDelete: Array<Model> = [];
|
|
332
|
+
|
|
333
|
+
try {
|
|
334
|
+
rulesToDelete = await this.findBy({
|
|
335
|
+
query: deleteBy.query,
|
|
336
|
+
select: {
|
|
337
|
+
_id: true,
|
|
338
|
+
projectId: true,
|
|
339
|
+
serviceLevelObjectiveId: true,
|
|
340
|
+
name: true,
|
|
341
|
+
},
|
|
342
|
+
limit: LIMIT_PER_PROJECT,
|
|
343
|
+
skip: 0,
|
|
344
|
+
props: deleteBy.props,
|
|
345
|
+
});
|
|
346
|
+
} catch (error) {
|
|
347
|
+
/*
|
|
348
|
+
* Best effort. Failing to note the rules down must not block the
|
|
349
|
+
* delete; the worst case is that their monitors stay attached until the
|
|
350
|
+
* next edit to a rule on that SLO, or the next change to the monitor.
|
|
351
|
+
*/
|
|
352
|
+
logger.error(
|
|
353
|
+
`Error collecting SLO monitor rules before delete: ${error}`,
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const carryForward: RuleDeleteCarryForward = {
|
|
358
|
+
rulesToDelete: rulesToDelete,
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
return { deleteBy, carryForward: carryForward };
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Deleting a rule undoes it: every monitor only that rule attached is
|
|
366
|
+
* detached, and monitors another enabled rule of the SLO still matches stay
|
|
367
|
+
* - the union of the remaining rules takes effect. Monitors attached by hand
|
|
368
|
+
* are never touched.
|
|
369
|
+
*
|
|
370
|
+
* Acts only on `itemIdsBeforeDelete`, the permission-checked set that was
|
|
371
|
+
* actually deleted, never on the raw carry-forward.
|
|
372
|
+
*/
|
|
373
|
+
@CaptureSpan()
|
|
374
|
+
protected override async onDeleteSuccess(
|
|
375
|
+
onDelete: OnDelete<Model>,
|
|
376
|
+
itemIdsBeforeDelete: Array<ObjectID>,
|
|
377
|
+
): Promise<OnDelete<Model>> {
|
|
378
|
+
const deletedIds: Set<string> = new Set<string>(
|
|
379
|
+
itemIdsBeforeDelete.map((id: ObjectID): string => {
|
|
380
|
+
return id.toString();
|
|
381
|
+
}),
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
const deletedRules: Array<Model> = (
|
|
385
|
+
(onDelete.carryForward as RuleDeleteCarryForward | null)?.rulesToDelete ||
|
|
386
|
+
[]
|
|
387
|
+
).filter((rule: Model): boolean => {
|
|
388
|
+
return Boolean(rule.id && deletedIds.has(rule.id.toString()));
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
for (const rule of deletedRules) {
|
|
392
|
+
await this.postRuleFeedItem({
|
|
393
|
+
rule: rule,
|
|
394
|
+
eventType: ServiceLevelObjectiveFeedEventType.MonitorRuleRemoved,
|
|
395
|
+
displayColor: Red500,
|
|
396
|
+
userId: onDelete.deleteBy.props.userId,
|
|
397
|
+
buildFeedInfoInMarkdown: (data: {
|
|
398
|
+
sloLink: string;
|
|
399
|
+
ruleName: string;
|
|
400
|
+
}): string => {
|
|
401
|
+
return `🗑️ Removed monitor rule ${data.ruleName} from ${data.sloLink}. Monitors only this rule attached are detached; monitors attached by hand, or matched by another enabled rule, stay.`;
|
|
402
|
+
},
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
for (const serviceLevelObjectiveId of this.uniqueServiceLevelObjectiveIds(
|
|
407
|
+
deletedRules,
|
|
408
|
+
)) {
|
|
409
|
+
await this.syncQuietly(serviceLevelObjectiveId);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
return onDelete;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* The SLOs whose monitor rules refer to any of these labels - through the
|
|
417
|
+
* legacy label join table or inside configurable criteria. LabelService
|
|
418
|
+
* asks this before a label delete cascades those references away, so it can
|
|
419
|
+
* re-sync the SLOs once the label is gone.
|
|
420
|
+
*
|
|
421
|
+
* Two lookups, deliberately: the legacy relation query keeps using its join
|
|
422
|
+
* table index, and criteria keep relation ids inside jsonb where only the
|
|
423
|
+
* JSON operator can see them. A criteria-backed rule can show up in both (a
|
|
424
|
+
* criteria save leaves the legacy join rows in place), hence the dedupe.
|
|
425
|
+
*/
|
|
426
|
+
@CaptureSpan()
|
|
427
|
+
public async findServiceLevelObjectiveIdsForRulesUsingLabels(
|
|
428
|
+
labelIds: Array<ObjectID>,
|
|
429
|
+
): Promise<Array<ObjectID>> {
|
|
430
|
+
if (labelIds.length === 0) {
|
|
431
|
+
return [];
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
const legacyRules: Array<Model> = await this.findBy({
|
|
435
|
+
query: {
|
|
436
|
+
monitorLabels: labelIds,
|
|
437
|
+
},
|
|
438
|
+
select: {
|
|
439
|
+
_id: true,
|
|
440
|
+
serviceLevelObjectiveId: true,
|
|
441
|
+
},
|
|
442
|
+
limit: LIMIT_MAX,
|
|
443
|
+
skip: 0,
|
|
444
|
+
props: {
|
|
445
|
+
isRoot: true,
|
|
446
|
+
},
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
const criteriaRules: Array<Model> = await this.findBy({
|
|
450
|
+
query: {
|
|
451
|
+
criteria: QueryHelper.jsonArrayObjectsContainAnyArrayValue({
|
|
452
|
+
arrayKey: "filters",
|
|
453
|
+
discriminatorKey: "field",
|
|
454
|
+
discriminatorValue: "monitorLabels",
|
|
455
|
+
valueArrayKey: "value",
|
|
456
|
+
values: labelIds,
|
|
457
|
+
}),
|
|
458
|
+
},
|
|
459
|
+
select: {
|
|
460
|
+
_id: true,
|
|
461
|
+
serviceLevelObjectiveId: true,
|
|
462
|
+
},
|
|
463
|
+
limit: LIMIT_MAX,
|
|
464
|
+
skip: 0,
|
|
465
|
+
props: {
|
|
466
|
+
isRoot: true,
|
|
467
|
+
},
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
return this.uniqueServiceLevelObjectiveIds([
|
|
471
|
+
...legacyRules,
|
|
472
|
+
...criteriaRules,
|
|
473
|
+
]);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Which of these SLOs have at least one enabled monitor rule, as lower-case
|
|
478
|
+
* id strings. The SLO service asks this to refuse hand-edits to a monitor
|
|
479
|
+
* list the rules own. Read as root: the caller has already pinned the SLOs
|
|
480
|
+
* to the caller's tenant.
|
|
481
|
+
*/
|
|
482
|
+
@CaptureSpan()
|
|
483
|
+
public async findServiceLevelObjectiveIdsWithEnabledRules(
|
|
484
|
+
serviceLevelObjectiveIds: Array<ObjectID>,
|
|
485
|
+
): Promise<Set<string>> {
|
|
486
|
+
return await this.findServiceLevelObjectiveIdsHavingRules({
|
|
487
|
+
serviceLevelObjectiveIds: serviceLevelObjectiveIds,
|
|
488
|
+
isEnabledOnly: true,
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Which of these SLOs have at least one monitor rule row, enabled OR
|
|
494
|
+
* disabled, as lower-case id strings. The SLO service asks this before it
|
|
495
|
+
* acts on a write of the deprecated monitor label list: once an SLO has
|
|
496
|
+
* rules of any kind, they - not that list - decide what it measures. A
|
|
497
|
+
* disabled rule counts, for the same reason it stops legacy adoption: it is
|
|
498
|
+
* a decision somebody made on the Monitor Rules page. Read as root: the
|
|
499
|
+
* caller hands in ids a permission-checked write already touched.
|
|
500
|
+
*/
|
|
501
|
+
@CaptureSpan()
|
|
502
|
+
public async findServiceLevelObjectiveIdsWithAnyRule(
|
|
503
|
+
serviceLevelObjectiveIds: Array<ObjectID>,
|
|
504
|
+
): Promise<Set<string>> {
|
|
505
|
+
return await this.findServiceLevelObjectiveIdsHavingRules({
|
|
506
|
+
serviceLevelObjectiveIds: serviceLevelObjectiveIds,
|
|
507
|
+
isEnabledOnly: false,
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
private async findServiceLevelObjectiveIdsHavingRules(data: {
|
|
512
|
+
serviceLevelObjectiveIds: Array<ObjectID>;
|
|
513
|
+
isEnabledOnly: boolean;
|
|
514
|
+
}): Promise<Set<string>> {
|
|
515
|
+
const { serviceLevelObjectiveIds } = data;
|
|
516
|
+
|
|
517
|
+
const result: Set<string> = new Set<string>();
|
|
518
|
+
|
|
519
|
+
if (serviceLevelObjectiveIds.length === 0) {
|
|
520
|
+
return result;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
const rules: Array<Model> = await this.findBy({
|
|
524
|
+
query: data.isEnabledOnly
|
|
525
|
+
? {
|
|
526
|
+
serviceLevelObjectiveId: QueryHelper.any(serviceLevelObjectiveIds),
|
|
527
|
+
isEnabled: true,
|
|
528
|
+
}
|
|
529
|
+
: {
|
|
530
|
+
serviceLevelObjectiveId: QueryHelper.any(serviceLevelObjectiveIds),
|
|
531
|
+
},
|
|
532
|
+
select: {
|
|
533
|
+
_id: true,
|
|
534
|
+
serviceLevelObjectiveId: true,
|
|
535
|
+
},
|
|
536
|
+
limit: LIMIT_PER_PROJECT,
|
|
537
|
+
skip: 0,
|
|
538
|
+
props: {
|
|
539
|
+
isRoot: true,
|
|
540
|
+
},
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
for (const rule of rules) {
|
|
544
|
+
const id: string =
|
|
545
|
+
rule.serviceLevelObjectiveId?.toString().toLowerCase() || "";
|
|
546
|
+
|
|
547
|
+
if (id) {
|
|
548
|
+
result.add(id);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
return result;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
/*
|
|
556
|
+
* A rule points at an SLO, and nothing in the framework checks that the SLO
|
|
557
|
+
* belongs to the rule's project. A rule created against another tenant's
|
|
558
|
+
* SLO would attach this project's monitors to it - and reveal, through the
|
|
559
|
+
* feed and the Monitors page, which monitors this project has.
|
|
560
|
+
*
|
|
561
|
+
* SloRecordReferenceValidator rather than ProjectScopedReferenceValidator.
|
|
562
|
+
* That one reads the referenced row as root and names a foreign one in its
|
|
563
|
+
* error ("belong to a different project: Service Level Objective <name>"),
|
|
564
|
+
* which confirms another tenant's SLO exists and hands its name to anyone
|
|
565
|
+
* holding its id. This lookup is pinned to the rule's project, selects only
|
|
566
|
+
* ids, and gives a foreign id the same answer as an id that matches nothing.
|
|
567
|
+
*/
|
|
568
|
+
private async assertServiceLevelObjectiveIsInScope(data: {
|
|
569
|
+
projectId: ObjectID | undefined;
|
|
570
|
+
// The id column and/or the relation, in any shape the payload used.
|
|
571
|
+
serviceLevelObjective: unknown;
|
|
572
|
+
}): Promise<void> {
|
|
573
|
+
await SloRecordReferenceValidator.validateServiceLevelObjectivesBelongToProject(
|
|
574
|
+
{
|
|
575
|
+
projectId: data.projectId,
|
|
576
|
+
serviceLevelObjectives: data.serviceLevelObjective,
|
|
577
|
+
subject: "SLO monitor rule",
|
|
578
|
+
},
|
|
579
|
+
);
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/**
|
|
583
|
+
* Converts the SLO's deprecated "Auto-Add Monitors With Labels" list into a
|
|
584
|
+
* rule before this create writes a rule of its own.
|
|
585
|
+
*
|
|
586
|
+
* onCreateSuccess re-syncs the SLO with every enabled rule it has. For an
|
|
587
|
+
* SLO whose list a previous-release pod wrote after the backfill - and whose
|
|
588
|
+
* monitors that pod's engine attached - that would be the new rule alone,
|
|
589
|
+
* and every monitor the list attached that the new rule does not match
|
|
590
|
+
* would be detached. Adopting first puts the list's rule next to the new
|
|
591
|
+
* one, so the sync keeps those monitors (the SLO measures the union of its
|
|
592
|
+
* rules) and adds the new rule's matches.
|
|
593
|
+
*
|
|
594
|
+
* Why before the create and not in onCreateSuccess: adoption only acts on an
|
|
595
|
+
* SLO with no rule row at all (see SloLegacyMonitorLabelAdoption), which is
|
|
596
|
+
* never true once the new row is written. Excluding the new row's id instead
|
|
597
|
+
* breaks exactly when it matters - two first rules created at once (an API
|
|
598
|
+
* client creating several in parallel) each see the other, and neither
|
|
599
|
+
* adopts. Before any of them is written, the SLO row lock serialises the
|
|
600
|
+
* adoptions and exactly one rule is adopted.
|
|
601
|
+
*
|
|
602
|
+
* Only with rule-attached monitors as evidence: an SLO whose user deleted
|
|
603
|
+
* the converted rule keeps its label rows too, and a new rule must not bring
|
|
604
|
+
* that one back (the delete's sync released its monitors). Rule edits and
|
|
605
|
+
* deletes never adopt: an edited rule is itself a rule row, and after a
|
|
606
|
+
* delete "no rule, monitors still attached" is what a deliberate delete
|
|
607
|
+
* looks like.
|
|
608
|
+
*
|
|
609
|
+
* DatabaseService applies the create permission check only after this hook,
|
|
610
|
+
* and adoption is a write - so it runs only for a caller that same check
|
|
611
|
+
* lets through: a caller without permission to create the rule must not
|
|
612
|
+
* change the SLO. DatabaseService still applies the check again afterwards.
|
|
613
|
+
* The gate is the permission check only. A create refused later (required
|
|
614
|
+
* fields, uniqueness, the insert itself) may already have adopted, which is
|
|
615
|
+
* harmless: with rule-attached monitors as evidence, adoption only makes
|
|
616
|
+
* visible a list whose monitors are already attached, and the next monitor
|
|
617
|
+
* edit would adopt it anyway.
|
|
618
|
+
*
|
|
619
|
+
* A failed adoption fails the create. Creating the rule anyway would let its
|
|
620
|
+
* sync detach the monitors the list attached, silently - the loss this
|
|
621
|
+
* exists to prevent. Nothing has been written yet, so a retry is clean.
|
|
622
|
+
*/
|
|
623
|
+
private async adoptLegacyMonitorLabelsBeforeCreate(data: {
|
|
624
|
+
createBy: CreateBy<Model>;
|
|
625
|
+
projectId: ObjectID | undefined;
|
|
626
|
+
serviceLevelObjectiveId: ObjectID | string;
|
|
627
|
+
}): Promise<void> {
|
|
628
|
+
if (!data.projectId) {
|
|
629
|
+
// Nothing to pin the adoption to - and a rule needs a project anyway.
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
try {
|
|
634
|
+
ModelPermission.checkCreatePermissions(
|
|
635
|
+
Model,
|
|
636
|
+
data.createBy.data,
|
|
637
|
+
data.createBy.props,
|
|
638
|
+
);
|
|
639
|
+
} catch {
|
|
640
|
+
// DatabaseService refuses this create right after the hook, and says why.
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
await SloLegacyMonitorLabelAdoption.adoptLegacyMonitorLabels({
|
|
645
|
+
projectId: data.projectId,
|
|
646
|
+
serviceLevelObjectiveIds: [data.serviceLevelObjectiveId],
|
|
647
|
+
requireRuleAttachedMonitors: true,
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
/*
|
|
652
|
+
* A rule with no criteria matches nothing, yet an enabled one still counts
|
|
653
|
+
* as "this SLO's monitors are managed by rules" and blocks adding monitors
|
|
654
|
+
* by hand. An empty form is far more likely to be an unfinished one, so say
|
|
655
|
+
* so instead of saving a rule that silently locks the monitor list.
|
|
656
|
+
*/
|
|
657
|
+
private assertHasMatchCriteria(data: {
|
|
658
|
+
monitorLabelCount: number;
|
|
659
|
+
monitorNamePattern?: string | undefined;
|
|
660
|
+
monitorDescriptionPattern?: string | undefined;
|
|
661
|
+
criteria?: Model["criteria"];
|
|
662
|
+
}): void {
|
|
663
|
+
if (data.criteria !== undefined && data.criteria !== null) {
|
|
664
|
+
const validationError: string | null = getRuleCriteriaValidationError(
|
|
665
|
+
data.criteria,
|
|
666
|
+
);
|
|
667
|
+
|
|
668
|
+
if (validationError) {
|
|
669
|
+
throw new BadDataException(validationError);
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
if (
|
|
673
|
+
isValidRuleCriteria(data.criteria) &&
|
|
674
|
+
data.criteria.filters.length > 0
|
|
675
|
+
) {
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
throw new BadDataException(
|
|
680
|
+
"An SLO monitor rule needs at least one match condition.",
|
|
681
|
+
);
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
if (
|
|
685
|
+
data.monitorLabelCount === 0 &&
|
|
686
|
+
!data.monitorNamePattern &&
|
|
687
|
+
!data.monitorDescriptionPattern
|
|
688
|
+
) {
|
|
689
|
+
throw new BadDataException(
|
|
690
|
+
"An SLO monitor rule needs at least one match criterion: monitor labels, a monitor name pattern, or a monitor description pattern. Use .* as the name pattern to match every monitor in the project.",
|
|
691
|
+
);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
/**
|
|
696
|
+
* The rules an update actually touches, read for validation and for the
|
|
697
|
+
* feed's before-snapshot.
|
|
698
|
+
*
|
|
699
|
+
* onBeforeUpdate runs before DatabaseService applies the update query's
|
|
700
|
+
* permission check, so the query here is still the caller's raw one. The
|
|
701
|
+
* tenant is pinned onto it when the caller has one, so a validation read can
|
|
702
|
+
* never reach across projects and answer questions about another tenant's
|
|
703
|
+
* rules. Genuinely root callers (the engines, migrations) have no tenantId
|
|
704
|
+
* and are trusted.
|
|
705
|
+
*/
|
|
706
|
+
private async findRulesForQuery(
|
|
707
|
+
updateBy: UpdateBy<Model>,
|
|
708
|
+
): Promise<Array<Model>> {
|
|
709
|
+
const query: Record<string, unknown> = {
|
|
710
|
+
...(updateBy.query as Record<string, unknown>),
|
|
711
|
+
};
|
|
712
|
+
|
|
713
|
+
if (updateBy.props.tenantId) {
|
|
714
|
+
query["projectId"] = updateBy.props.tenantId;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
return await this.findBy({
|
|
718
|
+
query: query as UpdateBy<Model>["query"],
|
|
719
|
+
select: RULE_SNAPSHOT_SELECT,
|
|
720
|
+
limit: LIMIT_PER_PROJECT,
|
|
721
|
+
skip: 0,
|
|
722
|
+
props: {
|
|
723
|
+
isRoot: true,
|
|
724
|
+
},
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
/**
|
|
729
|
+
* The create-time criteria check, applied to what each rule will look like
|
|
730
|
+
* after this edit. Every rule the edit touches has to survive it.
|
|
731
|
+
*/
|
|
732
|
+
private assertUpdateKeepsMatchCriteria(data: {
|
|
733
|
+
updateBy: UpdateBy<Model>;
|
|
734
|
+
rules: Array<Model>;
|
|
735
|
+
}): void {
|
|
736
|
+
const { updateBy } = data;
|
|
737
|
+
|
|
738
|
+
const nextLabels: Array<unknown> | undefined = updateBy.data
|
|
739
|
+
.monitorLabels as Array<unknown> | undefined;
|
|
740
|
+
|
|
741
|
+
for (const rule of data.rules) {
|
|
742
|
+
this.assertHasMatchCriteria({
|
|
743
|
+
monitorLabelCount: (nextLabels === undefined
|
|
744
|
+
? rule.monitorLabels || []
|
|
745
|
+
: nextLabels || []
|
|
746
|
+
).length,
|
|
747
|
+
monitorNamePattern:
|
|
748
|
+
updateBy.data.monitorNamePattern === undefined
|
|
749
|
+
? rule.monitorNamePattern
|
|
750
|
+
: (updateBy.data.monitorNamePattern as string | undefined),
|
|
751
|
+
monitorDescriptionPattern:
|
|
752
|
+
updateBy.data.monitorDescriptionPattern === undefined
|
|
753
|
+
? rule.monitorDescriptionPattern
|
|
754
|
+
: (updateBy.data.monitorDescriptionPattern as string | undefined),
|
|
755
|
+
criteria:
|
|
756
|
+
updateBy.data.criteria === undefined
|
|
757
|
+
? rule.criteria
|
|
758
|
+
: (updateBy.data.criteria as Model["criteria"]),
|
|
759
|
+
});
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
/*
|
|
764
|
+
* Describes a meaningful edit in the SLO feed, and stays silent for an edit
|
|
765
|
+
* that changed nothing a reader would care about. The dashboard's edit form
|
|
766
|
+
* resubmits every field, so presence in the payload proves nothing - the
|
|
767
|
+
* stored row before and after is compared instead.
|
|
768
|
+
*/
|
|
769
|
+
private async postRuleChangedFeedItem(data: {
|
|
770
|
+
previous: Model;
|
|
771
|
+
current: Model;
|
|
772
|
+
userId: ObjectID | undefined;
|
|
773
|
+
}): Promise<void> {
|
|
774
|
+
const { previous, current } = data;
|
|
775
|
+
|
|
776
|
+
const isNameChanged: boolean =
|
|
777
|
+
(previous.name || "") !== (current.name || "");
|
|
778
|
+
const isDescriptionChanged: boolean =
|
|
779
|
+
(previous.description || "") !== (current.description || "");
|
|
780
|
+
const wasEnabled: boolean = previous.isEnabled !== false;
|
|
781
|
+
const isEnabled: boolean = current.isEnabled !== false;
|
|
782
|
+
const isEnabledChanged: boolean = wasEnabled !== isEnabled;
|
|
783
|
+
const isCriteriaChanged: boolean =
|
|
784
|
+
getSloMonitorRuleCriteriaKey(previous) !==
|
|
785
|
+
getSloMonitorRuleCriteriaKey(current);
|
|
786
|
+
|
|
787
|
+
if (
|
|
788
|
+
!isNameChanged &&
|
|
789
|
+
!isDescriptionChanged &&
|
|
790
|
+
!isEnabledChanged &&
|
|
791
|
+
!isCriteriaChanged
|
|
792
|
+
) {
|
|
793
|
+
return;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
const details: Array<string> = [];
|
|
797
|
+
|
|
798
|
+
if (isNameChanged) {
|
|
799
|
+
details.push(
|
|
800
|
+
`- **Name:** ${this.formatRuleName(previous.name)} → ${this.formatRuleName(current.name)}`,
|
|
801
|
+
);
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
if (isDescriptionChanged) {
|
|
805
|
+
details.push(
|
|
806
|
+
`- **Description:** ${
|
|
807
|
+
!previous.description
|
|
808
|
+
? "added"
|
|
809
|
+
: !current.description
|
|
810
|
+
? "removed"
|
|
811
|
+
: "updated"
|
|
812
|
+
}`,
|
|
813
|
+
);
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
if (isEnabledChanged) {
|
|
817
|
+
details.push(
|
|
818
|
+
`- **Status:** ${wasEnabled ? "Enabled" : "Disabled"} → ${isEnabled ? "Enabled" : "Disabled"}`,
|
|
819
|
+
);
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
if (isCriteriaChanged) {
|
|
823
|
+
const labelNameById: Map<string, string> = await this.getLabelNamesById([
|
|
824
|
+
...getSloMonitorRuleLabelIds(previous),
|
|
825
|
+
...getSloMonitorRuleLabelIds(current),
|
|
826
|
+
]);
|
|
827
|
+
|
|
828
|
+
details.push(
|
|
829
|
+
`- **Match criteria (before):** ${escapeMarkdownInline(
|
|
830
|
+
describeSloMonitorRuleCriteria({
|
|
831
|
+
rule: previous,
|
|
832
|
+
labelNameById: labelNameById,
|
|
833
|
+
}),
|
|
834
|
+
)}`,
|
|
835
|
+
);
|
|
836
|
+
details.push(
|
|
837
|
+
`- **Match criteria (now):** ${escapeMarkdownInline(
|
|
838
|
+
describeSloMonitorRuleCriteria({
|
|
839
|
+
rule: current,
|
|
840
|
+
labelNameById: labelNameById,
|
|
841
|
+
}),
|
|
842
|
+
)}`,
|
|
843
|
+
);
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
const isOnlyEnabledChanged: boolean =
|
|
847
|
+
isEnabledChanged &&
|
|
848
|
+
!isNameChanged &&
|
|
849
|
+
!isDescriptionChanged &&
|
|
850
|
+
!isCriteriaChanged;
|
|
851
|
+
|
|
852
|
+
await this.postRuleFeedItem({
|
|
853
|
+
rule: current,
|
|
854
|
+
eventType: ServiceLevelObjectiveFeedEventType.MonitorRuleChanged,
|
|
855
|
+
displayColor: Gray500,
|
|
856
|
+
userId: data.userId,
|
|
857
|
+
buildFeedInfoInMarkdown: (sentence: {
|
|
858
|
+
sloLink: string;
|
|
859
|
+
ruleName: string;
|
|
860
|
+
}): string => {
|
|
861
|
+
if (isOnlyEnabledChanged) {
|
|
862
|
+
return isEnabled
|
|
863
|
+
? `▶️ Enabled monitor rule ${sentence.ruleName} on ${sentence.sloLink}. Monitors it matches are attached to this SLO again.`
|
|
864
|
+
: `⏸️ Disabled monitor rule ${sentence.ruleName} on ${sentence.sloLink}. Monitors only this rule attached are detached.`;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
return `🧩 Updated monitor rule ${sentence.ruleName} on ${sentence.sloLink}.`;
|
|
868
|
+
},
|
|
869
|
+
moreInformationInMarkdown: details.join("\n"),
|
|
870
|
+
});
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
/*
|
|
874
|
+
* Posts one rule event to the rule's SLO feed. The rule name and everything
|
|
875
|
+
* else user-controlled is escaped here, once, at the point it becomes
|
|
876
|
+
* markdown. Never throws: the rule is already saved, and a feed item that
|
|
877
|
+
* could not be written must not fail the write it describes.
|
|
878
|
+
*/
|
|
879
|
+
private async postRuleFeedItem(data: {
|
|
880
|
+
rule: Model;
|
|
881
|
+
eventType: ServiceLevelObjectiveFeedEventType;
|
|
882
|
+
displayColor: Color;
|
|
883
|
+
userId: ObjectID | undefined;
|
|
884
|
+
buildFeedInfoInMarkdown: BuildRuleFeedSentenceFunction;
|
|
885
|
+
moreInformationInMarkdown?: string | undefined;
|
|
886
|
+
}): Promise<void> {
|
|
887
|
+
const { rule } = data;
|
|
888
|
+
|
|
889
|
+
if (!rule.serviceLevelObjectiveId || !rule.projectId) {
|
|
890
|
+
return;
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
try {
|
|
894
|
+
const sloLink: string =
|
|
895
|
+
await ServiceLevelObjectiveService.getSloMarkdownLink({
|
|
896
|
+
projectId: rule.projectId,
|
|
897
|
+
sloId: rule.serviceLevelObjectiveId,
|
|
898
|
+
});
|
|
899
|
+
|
|
900
|
+
await ServiceLevelObjectiveFeedService.createServiceLevelObjectiveFeedItem(
|
|
901
|
+
{
|
|
902
|
+
serviceLevelObjectiveId: rule.serviceLevelObjectiveId,
|
|
903
|
+
projectId: rule.projectId,
|
|
904
|
+
serviceLevelObjectiveFeedEventType: data.eventType,
|
|
905
|
+
displayColor: data.displayColor,
|
|
906
|
+
feedInfoInMarkdown: data.buildFeedInfoInMarkdown({
|
|
907
|
+
sloLink: sloLink,
|
|
908
|
+
ruleName: this.formatRuleName(rule.name),
|
|
909
|
+
}),
|
|
910
|
+
moreInformationInMarkdown:
|
|
911
|
+
data.moreInformationInMarkdown || undefined,
|
|
912
|
+
userId: data.userId || undefined,
|
|
913
|
+
},
|
|
914
|
+
);
|
|
915
|
+
} catch (error) {
|
|
916
|
+
logger.error(
|
|
917
|
+
`Error posting SLO monitor rule feed item for rule ${rule.id?.toString()}: ${error}`,
|
|
918
|
+
{ projectId: rule.projectId.toString() } as LogAttributes,
|
|
919
|
+
);
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
// "**Production APIs**" - escaped, bold, and never an empty pair of stars.
|
|
924
|
+
private formatRuleName(name: string | undefined): string {
|
|
925
|
+
const escapedName: string = escapeMarkdownInline(name).trim();
|
|
926
|
+
|
|
927
|
+
return escapedName ? `**${escapedName}**` : "**an unnamed rule**";
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
/*
|
|
931
|
+
* The "more information" half of a MonitorRuleAdded item: whether the rule
|
|
932
|
+
* is on, and what it matches in words.
|
|
933
|
+
*/
|
|
934
|
+
private async describeRuleForFeed(rule: Model): Promise<string> {
|
|
935
|
+
const lines: Array<string> = [
|
|
936
|
+
`- **Status:** ${rule.isEnabled === false ? "Disabled" : "Enabled"}`,
|
|
937
|
+
];
|
|
938
|
+
|
|
939
|
+
try {
|
|
940
|
+
const labelNameById: Map<string, string> = await this.getLabelNamesById(
|
|
941
|
+
getSloMonitorRuleLabelIds(rule),
|
|
942
|
+
);
|
|
943
|
+
|
|
944
|
+
lines.push(
|
|
945
|
+
`- **Match criteria:** ${escapeMarkdownInline(
|
|
946
|
+
describeSloMonitorRuleCriteria({
|
|
947
|
+
rule: rule,
|
|
948
|
+
labelNameById: labelNameById,
|
|
949
|
+
}),
|
|
950
|
+
)}`,
|
|
951
|
+
);
|
|
952
|
+
} catch (error) {
|
|
953
|
+
logger.error(`Error describing SLO monitor rule criteria: ${error}`);
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
if (rule.description) {
|
|
957
|
+
lines.push(
|
|
958
|
+
`- **Description:** ${escapeMarkdownInline(rule.description)}`,
|
|
959
|
+
);
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
return lines.join("\n");
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
/*
|
|
966
|
+
* Label names for a feed description. Criteria rules store label ids only,
|
|
967
|
+
* so their names are looked up; a lookup that fails leaves the ids to be
|
|
968
|
+
* described as unknown labels rather than losing the feed item.
|
|
969
|
+
*/
|
|
970
|
+
private async getLabelNamesById(
|
|
971
|
+
labelIds: Array<string>,
|
|
972
|
+
): Promise<Map<string, string>> {
|
|
973
|
+
const labelNameById: Map<string, string> = new Map<string, string>();
|
|
974
|
+
|
|
975
|
+
const uniqueLabelIds: Array<string> = Array.from(
|
|
976
|
+
new Set<string>(labelIds),
|
|
977
|
+
).filter((id: string): boolean => {
|
|
978
|
+
return ObjectID.isValidUUID(id);
|
|
979
|
+
});
|
|
980
|
+
|
|
981
|
+
if (uniqueLabelIds.length === 0) {
|
|
982
|
+
return labelNameById;
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
try {
|
|
986
|
+
const labels: Array<Label> = await LabelService.findBy({
|
|
987
|
+
query: {
|
|
988
|
+
_id: QueryHelper.any(uniqueLabelIds),
|
|
989
|
+
},
|
|
990
|
+
select: {
|
|
991
|
+
_id: true,
|
|
992
|
+
name: true,
|
|
993
|
+
},
|
|
994
|
+
limit: uniqueLabelIds.length,
|
|
995
|
+
skip: 0,
|
|
996
|
+
props: {
|
|
997
|
+
isRoot: true,
|
|
998
|
+
},
|
|
999
|
+
});
|
|
1000
|
+
|
|
1001
|
+
for (const label of labels) {
|
|
1002
|
+
const id: string = label.id?.toString() || "";
|
|
1003
|
+
|
|
1004
|
+
if (id && label.name) {
|
|
1005
|
+
labelNameById.set(id, label.name);
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
} catch (error) {
|
|
1009
|
+
logger.error(
|
|
1010
|
+
`Error looking up label names for an SLO monitor rule feed item: ${error}`,
|
|
1011
|
+
);
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
return labelNameById;
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
private async findRuleSnapshotQuietly(id: ObjectID): Promise<Model | null> {
|
|
1018
|
+
try {
|
|
1019
|
+
return await this.findOneById({
|
|
1020
|
+
id: id,
|
|
1021
|
+
select: RULE_SNAPSHOT_SELECT,
|
|
1022
|
+
props: {
|
|
1023
|
+
isRoot: true,
|
|
1024
|
+
},
|
|
1025
|
+
});
|
|
1026
|
+
} catch (error) {
|
|
1027
|
+
logger.error(
|
|
1028
|
+
`Error reading SLO monitor rule ${id.toString()} back after create: ${error}`,
|
|
1029
|
+
);
|
|
1030
|
+
return null;
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
// De-duplicated SLO ids, in the order the rules first mention them.
|
|
1035
|
+
private uniqueServiceLevelObjectiveIds(rules: Array<Model>): Array<ObjectID> {
|
|
1036
|
+
const idsByValue: Map<string, ObjectID> = new Map<string, ObjectID>();
|
|
1037
|
+
|
|
1038
|
+
for (const rule of rules) {
|
|
1039
|
+
const id: ObjectID | undefined = rule.serviceLevelObjectiveId;
|
|
1040
|
+
|
|
1041
|
+
if (id && !idsByValue.has(id.toString().toLowerCase())) {
|
|
1042
|
+
idsByValue.set(id.toString().toLowerCase(), id);
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
return Array.from(idsByValue.values());
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
/**
|
|
1050
|
+
* Rule CRUD must not fail because the sync did. The rule is already saved
|
|
1051
|
+
* and the next rule edit, or the next change to a monitor, re-runs it.
|
|
1052
|
+
*/
|
|
1053
|
+
private async syncQuietly(serviceLevelObjectiveId: ObjectID): Promise<void> {
|
|
1054
|
+
try {
|
|
1055
|
+
await ServiceLevelObjectiveMonitorRuleEngineService.syncMonitorsForSlo({
|
|
1056
|
+
serviceLevelObjectiveId: serviceLevelObjectiveId,
|
|
1057
|
+
});
|
|
1058
|
+
} catch (error) {
|
|
1059
|
+
logger.error(
|
|
1060
|
+
`Error syncing monitor rules for SLO ${serviceLevelObjectiveId.toString()}: ${error}`,
|
|
1061
|
+
{
|
|
1062
|
+
serviceLevelObjectiveId: serviceLevelObjectiveId.toString(),
|
|
1063
|
+
} as LogAttributes,
|
|
1064
|
+
);
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
export default new Service();
|