@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
|
@@ -1,11 +1,25 @@
|
|
|
1
|
+
import Label from "../../Models/DatabaseModels/Label";
|
|
1
2
|
import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
2
3
|
import ServiceLevelObjective from "../../Models/DatabaseModels/ServiceLevelObjective";
|
|
4
|
+
import { ServiceLevelObjectiveFeedEventType } from "../../Models/DatabaseModels/ServiceLevelObjectiveFeed";
|
|
5
|
+
import ServiceLevelObjectiveMonitorRule from "../../Models/DatabaseModels/ServiceLevelObjectiveMonitorRule";
|
|
6
|
+
import { Gray500, Green500 } from "../../Types/BrandColors";
|
|
3
7
|
import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
4
8
|
import PartialEntity from "../../Types/Database/PartialEntity";
|
|
5
9
|
import ObjectID from "../../Types/ObjectID";
|
|
6
|
-
import
|
|
10
|
+
import { escapeMarkdownInline } from "../../Utils/Markdown/MarkdownEscape";
|
|
11
|
+
import RuleCriteriaMatcher from "../../Utils/Rules/RuleCriteriaMatcher";
|
|
12
|
+
import { MAX_RULES_EVALUATED_PER_PROJECT } from "../../Utils/Rules/RuleEngineLimits";
|
|
13
|
+
import RulePatternMatchUtil from "../../Utils/Rules/RulePatternMatchUtil";
|
|
14
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
15
|
+
import Select from "../Types/Database/Select";
|
|
7
16
|
import logger, { LogAttributes } from "../Utils/Logger";
|
|
17
|
+
import logIfRuleReadWasTruncated from "../Utils/Rules/RuleEngineRuleRead";
|
|
18
|
+
import SloLegacyMonitorLabelAdoption from "../Utils/Slo/SloLegacyMonitorLabelAdoption";
|
|
19
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
8
20
|
import MonitorService from "./MonitorService";
|
|
21
|
+
import ServiceLevelObjectiveFeedService from "./ServiceLevelObjectiveFeedService";
|
|
22
|
+
import ServiceLevelObjectiveMonitorRuleService from "./ServiceLevelObjectiveMonitorRuleService";
|
|
9
23
|
import ServiceLevelObjectiveService from "./ServiceLevelObjectiveService";
|
|
10
24
|
|
|
11
25
|
/**
|
|
@@ -63,27 +77,69 @@ function isSameSet(a: Set<string>, b: Set<string>): boolean {
|
|
|
63
77
|
return true;
|
|
64
78
|
}
|
|
65
79
|
|
|
80
|
+
/*
|
|
81
|
+
* The rule kind named in logs - and the model this engine evaluates, which
|
|
82
|
+
* the rule-criteria runtime coverage contract looks for in this file.
|
|
83
|
+
*/
|
|
84
|
+
const RULE_KIND: string = "ServiceLevelObjectiveMonitorRule";
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Everything the engine needs to know about one rule to decide membership.
|
|
88
|
+
* `findBy` hands back partial models, so this is the shape actually selected
|
|
89
|
+
* rather than the full entity. `criteria: true` is load-bearing: without it a
|
|
90
|
+
* criteria-backed rule reads as a legacy one whose shadowed "(?!)" name
|
|
91
|
+
* pattern matches nothing.
|
|
92
|
+
*/
|
|
93
|
+
const RULE_SELECT: Select<ServiceLevelObjectiveMonitorRule> = {
|
|
94
|
+
_id: true,
|
|
95
|
+
projectId: true,
|
|
96
|
+
serviceLevelObjectiveId: true,
|
|
97
|
+
isEnabled: true,
|
|
98
|
+
monitorLabels: { _id: true },
|
|
99
|
+
monitorNamePattern: true,
|
|
100
|
+
monitorDescriptionPattern: true,
|
|
101
|
+
criteria: true,
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/*
|
|
105
|
+
* Feed items name the monitors a sync attached or detached. A rule written
|
|
106
|
+
* against a whole estate can move thousands at once, so the sentence names a
|
|
107
|
+
* handful, the "more information" section lists a bounded page of them, and
|
|
108
|
+
* the rest are counted rather than enumerated.
|
|
109
|
+
*/
|
|
110
|
+
const MAX_MONITORS_NAMED_IN_FEED_HEADLINE: number = 5;
|
|
111
|
+
const MAX_MONITORS_LISTED_IN_FEED_DETAILS: number = 50;
|
|
112
|
+
|
|
66
113
|
/**
|
|
67
|
-
* Keeps an SLO's monitor list in step with its
|
|
114
|
+
* Keeps an SLO's monitor list in step with its monitor rules.
|
|
68
115
|
*
|
|
69
|
-
* An SLO can
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
116
|
+
* An SLO can carry any number of ServiceLevelObjectiveMonitorRule rows ("every
|
|
117
|
+
* monitor labelled Production", "every monitor whose name starts with api-").
|
|
118
|
+
* Membership is a UNION at the SLO level: a monitor belongs to the SLO while
|
|
119
|
+
* at least one ENABLED rule of that SLO matches it, and stops belonging the
|
|
120
|
+
* moment none does. Two entry points drive that, because membership can be
|
|
121
|
+
* invalidated from either side:
|
|
73
122
|
*
|
|
74
|
-
* - the SLO side (its
|
|
75
|
-
*
|
|
123
|
+
* - the SLO side (one of its rules was created, edited, disabled or
|
|
124
|
+
* deleted) -> syncMonitorsForSlo
|
|
125
|
+
* - the monitor side (its labels, name or description changed, or it was
|
|
126
|
+
* just created) -> syncSlosForMonitor
|
|
76
127
|
*
|
|
77
128
|
* Both write through ServiceLevelObjective.autoAddedMonitors, which records
|
|
78
|
-
* which attachments the
|
|
79
|
-
* a human attached by hand survives every rule evaluation
|
|
80
|
-
* that runs when the rule is deleted.
|
|
129
|
+
* which attachments the rules own. Only those are ever detached, so a monitor
|
|
130
|
+
* a human attached by hand survives every rule evaluation - including the one
|
|
131
|
+
* that runs when the last rule is deleted.
|
|
132
|
+
*
|
|
133
|
+
* Membership is kept in sync whatever the SLO's own state: a disabled or
|
|
134
|
+
* archived SLO is skipped by the evaluation worker, not by this engine, so
|
|
135
|
+
* re-enabling or unarchiving one starts from the right monitor set instead of
|
|
136
|
+
* whatever it held when it was switched off.
|
|
81
137
|
*/
|
|
82
138
|
export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
83
139
|
/**
|
|
84
|
-
* Re-evaluates one SLO
|
|
85
|
-
* Use when
|
|
86
|
-
*
|
|
140
|
+
* Re-evaluates every enabled rule of one SLO against every monitor in its
|
|
141
|
+
* project. Use when a rule changed - it is the authoritative, self-healing
|
|
142
|
+
* path and repairs any drift it finds.
|
|
87
143
|
*/
|
|
88
144
|
@CaptureSpan()
|
|
89
145
|
public async syncMonitorsForSlo(data: {
|
|
@@ -95,9 +151,7 @@ export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
|
95
151
|
select: {
|
|
96
152
|
_id: true,
|
|
97
153
|
projectId: true,
|
|
98
|
-
|
|
99
|
-
_id: true,
|
|
100
|
-
},
|
|
154
|
+
name: true,
|
|
101
155
|
monitors: {
|
|
102
156
|
_id: true,
|
|
103
157
|
},
|
|
@@ -114,35 +168,40 @@ export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
|
114
168
|
return emptyResult();
|
|
115
169
|
}
|
|
116
170
|
|
|
117
|
-
const
|
|
171
|
+
const rules: Array<ServiceLevelObjectiveMonitorRule> =
|
|
172
|
+
await this.findEnabledRules({
|
|
173
|
+
projectId: slo.projectId,
|
|
174
|
+
serviceLevelObjectiveId: slo.id,
|
|
175
|
+
});
|
|
118
176
|
|
|
119
177
|
/*
|
|
120
|
-
* No rule (
|
|
121
|
-
* turn detaches everything the
|
|
122
|
-
* therefore undoes
|
|
123
|
-
* an SLO nobody remembers configuring.
|
|
178
|
+
* No enabled rule (the last one was just disabled or deleted) means
|
|
179
|
+
* nothing matches, which in turn detaches everything the rules had
|
|
180
|
+
* attached. Removing the rules therefore undoes them rather than leaving
|
|
181
|
+
* their monitors stranded on an SLO nobody remembers configuring.
|
|
124
182
|
*/
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
?
|
|
128
|
-
: await this.
|
|
183
|
+
const matchedMonitors: Array<Monitor> =
|
|
184
|
+
rules.length === 0
|
|
185
|
+
? []
|
|
186
|
+
: await this.findMatchingMonitors({
|
|
129
187
|
projectId: slo.projectId,
|
|
130
|
-
|
|
188
|
+
rules: rules,
|
|
131
189
|
});
|
|
132
190
|
|
|
133
191
|
return await this.writeMembership({
|
|
134
192
|
slo: slo,
|
|
135
193
|
attachedMonitorIds: toIdSet(slo.monitors),
|
|
136
194
|
autoAddedMonitorIds: toIdSet(slo.autoAddedMonitors),
|
|
137
|
-
matchedMonitorIds:
|
|
195
|
+
matchedMonitorIds: toIdSet(matchedMonitors),
|
|
196
|
+
knownMonitors: matchedMonitors,
|
|
138
197
|
});
|
|
139
198
|
}
|
|
140
199
|
|
|
141
200
|
/**
|
|
142
|
-
* Re-evaluates every
|
|
143
|
-
* Use when the monitor
|
|
144
|
-
* membership,
|
|
145
|
-
* monitors the rules match.
|
|
201
|
+
* Re-evaluates every enabled SLO monitor rule in the project against a
|
|
202
|
+
* single monitor. Use when the monitor changed: it touches only this
|
|
203
|
+
* monitor's membership, and costs a fixed handful of queries per project
|
|
204
|
+
* regardless of how many monitors the rules match.
|
|
146
205
|
*/
|
|
147
206
|
@CaptureSpan()
|
|
148
207
|
public async syncSlosForMonitor(data: {
|
|
@@ -154,6 +213,8 @@ export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
|
154
213
|
select: {
|
|
155
214
|
_id: true,
|
|
156
215
|
projectId: true,
|
|
216
|
+
name: true,
|
|
217
|
+
description: true,
|
|
157
218
|
labels: {
|
|
158
219
|
_id: true,
|
|
159
220
|
},
|
|
@@ -174,20 +235,150 @@ export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
|
174
235
|
return [];
|
|
175
236
|
}
|
|
176
237
|
|
|
177
|
-
const monitorLabelIds: Set<string> = toIdSet(monitor.labels);
|
|
178
238
|
const monitorId: string = monitor.id.toString();
|
|
179
239
|
|
|
240
|
+
const rules: Array<ServiceLevelObjectiveMonitorRule> =
|
|
241
|
+
await this.findEnabledRules({ projectId: projectId });
|
|
242
|
+
|
|
243
|
+
const rulesBySloId: Map<
|
|
244
|
+
string,
|
|
245
|
+
Array<ServiceLevelObjectiveMonitorRule>
|
|
246
|
+
> = new Map<string, Array<ServiceLevelObjectiveMonitorRule>>();
|
|
247
|
+
|
|
248
|
+
for (const rule of rules) {
|
|
249
|
+
const sloId: string = rule.serviceLevelObjectiveId?.toString() || "";
|
|
250
|
+
|
|
251
|
+
if (!sloId) {
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const sloRules: Array<ServiceLevelObjectiveMonitorRule> =
|
|
256
|
+
rulesBySloId.get(sloId) || [];
|
|
257
|
+
sloRules.push(rule);
|
|
258
|
+
rulesBySloId.set(sloId, sloRules);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/*
|
|
262
|
+
* The SLOs this monitor's membership can change on: every SLO with an
|
|
263
|
+
* enabled rule, plus every SLO that still records this monitor as
|
|
264
|
+
* rule-attached. The second group has no enabled rule left (a disable or
|
|
265
|
+
* delete whose own sync failed), so nothing matches there any more and
|
|
266
|
+
* the monitor is released - without it, that drift would only ever be
|
|
267
|
+
* repaired by the next edit to a rule on that SLO.
|
|
268
|
+
*/
|
|
269
|
+
const candidateSloIds: Set<string> = new Set<string>(rulesBySloId.keys());
|
|
270
|
+
|
|
271
|
+
for (const sloId of await this.findSloIdsHoldingAutoAddedMonitor({
|
|
272
|
+
projectId: projectId,
|
|
273
|
+
monitorId: monitor.id,
|
|
274
|
+
})) {
|
|
275
|
+
candidateSloIds.add(sloId);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (candidateSloIds.size === 0) {
|
|
279
|
+
return [];
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const results: Array<SloMonitorSyncResult> = [];
|
|
283
|
+
|
|
284
|
+
/*
|
|
285
|
+
* A candidate with no enabled rule is about to have this monitor released.
|
|
286
|
+
* Before that, one whose monitors were attached by the deprecated label
|
|
287
|
+
* list - written by a previous-release pod after the one-shot backfill ran
|
|
288
|
+
* - is given its rule, and synced with it instead. Without this the first
|
|
289
|
+
* edit to such a monitor silently took it off the SLO. See
|
|
290
|
+
* SloLegacyMonitorLabelAdoption for why this can do it without bringing
|
|
291
|
+
* back a rule a user deleted, and for the other places that adopt.
|
|
292
|
+
*/
|
|
293
|
+
const sloIdsWithoutEnabledRule: Array<string> = Array.from(
|
|
294
|
+
candidateSloIds,
|
|
295
|
+
).filter((sloId: string): boolean => {
|
|
296
|
+
return !rulesBySloId.has(sloId);
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
if (sloIdsWithoutEnabledRule.length > 0) {
|
|
300
|
+
let adoptedSloIds: Set<string> = new Set<string>();
|
|
301
|
+
|
|
302
|
+
try {
|
|
303
|
+
adoptedSloIds = new Set<string>(
|
|
304
|
+
await SloLegacyMonitorLabelAdoption.adoptLegacyMonitorLabels({
|
|
305
|
+
projectId: projectId,
|
|
306
|
+
serviceLevelObjectiveIds: sloIdsWithoutEnabledRule,
|
|
307
|
+
}),
|
|
308
|
+
);
|
|
309
|
+
} catch (error) {
|
|
310
|
+
/*
|
|
311
|
+
* Whether these SLOs are label-configured is unknown, and releasing
|
|
312
|
+
* the monitor from one that is would lose it. They are left alone
|
|
313
|
+
* this time; releasing a genuinely stale attachment can wait for the
|
|
314
|
+
* next sync.
|
|
315
|
+
*/
|
|
316
|
+
logger.error(
|
|
317
|
+
`Error adopting legacy SLO monitor labels for monitor ${monitorId}; not releasing it from SLOs without an enabled rule this time: ${error}`,
|
|
318
|
+
{
|
|
319
|
+
projectId: projectId.toString(),
|
|
320
|
+
monitorId: monitorId,
|
|
321
|
+
} as LogAttributes,
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
for (const sloId of sloIdsWithoutEnabledRule) {
|
|
325
|
+
candidateSloIds.delete(sloId);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
for (const sloId of sloIdsWithoutEnabledRule) {
|
|
330
|
+
if (!adoptedSloIds.has(sloId.toLowerCase())) {
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
candidateSloIds.delete(sloId);
|
|
335
|
+
|
|
336
|
+
try {
|
|
337
|
+
/*
|
|
338
|
+
* A full sync, not just this monitor: the new rule also claims every
|
|
339
|
+
* other labelled monitor the previous-release engine would have
|
|
340
|
+
* attached since.
|
|
341
|
+
*/
|
|
342
|
+
const result: SloMonitorSyncResult = await this.syncMonitorsForSlo({
|
|
343
|
+
serviceLevelObjectiveId: new ObjectID(sloId),
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
if (
|
|
347
|
+
result.monitorIdsAdded.length > 0 ||
|
|
348
|
+
result.monitorIdsRemoved.length > 0
|
|
349
|
+
) {
|
|
350
|
+
results.push(result);
|
|
351
|
+
}
|
|
352
|
+
} catch (error) {
|
|
353
|
+
logger.error(
|
|
354
|
+
`Error syncing SLO ${sloId} after adopting its legacy monitor labels for monitor ${monitorId}: ${error}`,
|
|
355
|
+
{
|
|
356
|
+
projectId: projectId.toString(),
|
|
357
|
+
monitorId: monitorId,
|
|
358
|
+
} as LogAttributes,
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if (candidateSloIds.size === 0) {
|
|
364
|
+
return results;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
180
368
|
const slos: Array<ServiceLevelObjective> =
|
|
181
369
|
await ServiceLevelObjectiveService.findBy({
|
|
182
370
|
query: {
|
|
183
371
|
projectId: projectId,
|
|
372
|
+
_id: QueryHelper.any(
|
|
373
|
+
Array.from(candidateSloIds).map((id: string) => {
|
|
374
|
+
return new ObjectID(id);
|
|
375
|
+
}),
|
|
376
|
+
),
|
|
184
377
|
},
|
|
185
378
|
select: {
|
|
186
379
|
_id: true,
|
|
187
380
|
projectId: true,
|
|
188
|
-
|
|
189
|
-
_id: true,
|
|
190
|
-
},
|
|
381
|
+
name: true,
|
|
191
382
|
monitors: {
|
|
192
383
|
_id: true,
|
|
193
384
|
},
|
|
@@ -202,46 +393,46 @@ export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
|
202
393
|
},
|
|
203
394
|
});
|
|
204
395
|
|
|
205
|
-
const results: Array<SloMonitorSyncResult> = [];
|
|
206
|
-
|
|
207
396
|
for (const slo of slos) {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
// SLOs without a label rule are curated by hand. Never touch them.
|
|
211
|
-
if (ruleLabelIds.size === 0) {
|
|
397
|
+
if (!slo.id) {
|
|
212
398
|
continue;
|
|
213
399
|
}
|
|
214
400
|
|
|
215
|
-
|
|
216
|
-
|
|
401
|
+
try {
|
|
402
|
+
const sloRules: Array<ServiceLevelObjectiveMonitorRule> =
|
|
403
|
+
rulesBySloId.get(slo.id.toString()) || [];
|
|
217
404
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
405
|
+
const doesMatch: boolean = sloRules.some(
|
|
406
|
+
(rule: ServiceLevelObjectiveMonitorRule): boolean => {
|
|
407
|
+
return this.doesMonitorMatchRule({ monitor: monitor, rule: rule });
|
|
408
|
+
},
|
|
409
|
+
);
|
|
222
410
|
|
|
223
|
-
|
|
224
|
-
* Only this monitor's membership is in question, so the "matched" set
|
|
225
|
-
* handed to writeMembership is the SLO's current auto-added set with
|
|
226
|
-
* this monitor toggled in or out. Every other auto-added monitor is
|
|
227
|
-
* reported as still matching and is left exactly where it is.
|
|
228
|
-
*/
|
|
229
|
-
const matchedMonitorIds: Set<string> = new Set<string>(
|
|
230
|
-
autoAddedMonitorIds,
|
|
231
|
-
);
|
|
411
|
+
const autoAddedMonitorIds: Set<string> = toIdSet(slo.autoAddedMonitors);
|
|
232
412
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
413
|
+
/*
|
|
414
|
+
* Only this monitor's membership is in question, so the "matched" set
|
|
415
|
+
* handed to writeMembership is the SLO's current rule-attached set
|
|
416
|
+
* with this monitor toggled in or out. Every other rule-attached
|
|
417
|
+
* monitor is reported as still matching and is left exactly where it
|
|
418
|
+
* is.
|
|
419
|
+
*/
|
|
420
|
+
const matchedMonitorIds: Set<string> = new Set<string>(
|
|
421
|
+
autoAddedMonitorIds,
|
|
422
|
+
);
|
|
423
|
+
|
|
424
|
+
if (doesMatch) {
|
|
425
|
+
matchedMonitorIds.add(monitorId);
|
|
426
|
+
} else {
|
|
427
|
+
matchedMonitorIds.delete(monitorId);
|
|
428
|
+
}
|
|
238
429
|
|
|
239
|
-
try {
|
|
240
430
|
const result: SloMonitorSyncResult = await this.writeMembership({
|
|
241
431
|
slo: slo,
|
|
242
|
-
attachedMonitorIds:
|
|
432
|
+
attachedMonitorIds: toIdSet(slo.monitors),
|
|
243
433
|
autoAddedMonitorIds: autoAddedMonitorIds,
|
|
244
434
|
matchedMonitorIds: matchedMonitorIds,
|
|
435
|
+
knownMonitors: [monitor],
|
|
245
436
|
});
|
|
246
437
|
|
|
247
438
|
if (
|
|
@@ -252,11 +443,11 @@ export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
|
252
443
|
}
|
|
253
444
|
} catch (error) {
|
|
254
445
|
/*
|
|
255
|
-
* One SLO failing must not stop the others: the monitor
|
|
256
|
-
*
|
|
446
|
+
* One SLO failing must not stop the others: the monitor has already
|
|
447
|
+
* changed, and half a sync is better than none.
|
|
257
448
|
*/
|
|
258
449
|
logger.error(
|
|
259
|
-
`Error syncing SLO ${slo.id
|
|
450
|
+
`Error syncing SLO ${slo.id.toString()} monitor rules for monitor ${monitorId}: ${error}`,
|
|
260
451
|
{
|
|
261
452
|
projectId: projectId.toString(),
|
|
262
453
|
monitorId: monitorId,
|
|
@@ -269,30 +460,187 @@ export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
|
269
460
|
}
|
|
270
461
|
|
|
271
462
|
/**
|
|
272
|
-
*
|
|
463
|
+
* Does this monitor satisfy the rule?
|
|
464
|
+
*
|
|
465
|
+
* A rule with configurable `criteria` is evaluated filter by filter through
|
|
466
|
+
* the shared matcher (All / Any, text and label operators). A rule without
|
|
467
|
+
* it uses its legacy columns, which are ANDed with empty ones skipped - the
|
|
468
|
+
* way every other monitor rule in the product reads. Either way, a rule
|
|
469
|
+
* with no criteria at all matches nothing: silently measuring the entire
|
|
470
|
+
* project is not a reasonable reading of an empty form. Users who genuinely
|
|
471
|
+
* want that write `.*` as the name pattern.
|
|
472
|
+
*
|
|
473
|
+
* Pattern matching goes through RulePatternMatchUtil, the same matcher the
|
|
474
|
+
* status page and network device rules use, so a pattern means the same
|
|
475
|
+
* thing everywhere in the product: a case-insensitive regex, or a `*`
|
|
476
|
+
* wildcard glob (#2940).
|
|
477
|
+
*/
|
|
478
|
+
public doesMonitorMatchRule(data: {
|
|
479
|
+
monitor: Monitor;
|
|
480
|
+
rule: ServiceLevelObjectiveMonitorRule;
|
|
481
|
+
}): boolean {
|
|
482
|
+
return RuleCriteriaMatcher.matchesWithLegacySync({
|
|
483
|
+
rule: data.rule,
|
|
484
|
+
legacyFields: [
|
|
485
|
+
"monitorLabels",
|
|
486
|
+
"monitorNamePattern",
|
|
487
|
+
"monitorDescriptionPattern",
|
|
488
|
+
],
|
|
489
|
+
emptyResult: false,
|
|
490
|
+
matchesLegacyRule: (
|
|
491
|
+
legacyRule: ServiceLevelObjectiveMonitorRule,
|
|
492
|
+
): boolean => {
|
|
493
|
+
return this.doesMonitorMatchLegacyRule({
|
|
494
|
+
monitor: data.monitor,
|
|
495
|
+
rule: legacyRule,
|
|
496
|
+
});
|
|
497
|
+
},
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
private doesMonitorMatchLegacyRule(data: {
|
|
502
|
+
monitor: Monitor;
|
|
503
|
+
rule: ServiceLevelObjectiveMonitorRule;
|
|
504
|
+
}): boolean {
|
|
505
|
+
const { monitor, rule } = data;
|
|
506
|
+
|
|
507
|
+
const hasLabelCriteria: boolean = Boolean(
|
|
508
|
+
rule.monitorLabels && rule.monitorLabels.length > 0,
|
|
509
|
+
);
|
|
510
|
+
const hasNameCriteria: boolean = Boolean(rule.monitorNamePattern);
|
|
511
|
+
const hasDescriptionCriteria: boolean = Boolean(
|
|
512
|
+
rule.monitorDescriptionPattern,
|
|
513
|
+
);
|
|
514
|
+
|
|
515
|
+
if (!hasLabelCriteria && !hasNameCriteria && !hasDescriptionCriteria) {
|
|
516
|
+
return false;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
if (hasLabelCriteria) {
|
|
520
|
+
const ruleLabelIds: Set<string> = toIdSet(rule.monitorLabels);
|
|
521
|
+
const monitorLabelIds: Set<string> = toIdSet(monitor.labels);
|
|
522
|
+
|
|
523
|
+
let hasAnyLabel: boolean = false;
|
|
524
|
+
|
|
525
|
+
for (const labelId of monitorLabelIds) {
|
|
526
|
+
if (ruleLabelIds.has(labelId)) {
|
|
527
|
+
hasAnyLabel = true;
|
|
528
|
+
break;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
if (!hasAnyLabel) {
|
|
533
|
+
return false;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
if (hasNameCriteria) {
|
|
538
|
+
if (
|
|
539
|
+
!RulePatternMatchUtil.matches(monitor.name, rule.monitorNamePattern)
|
|
540
|
+
) {
|
|
541
|
+
return false;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
if (hasDescriptionCriteria) {
|
|
546
|
+
if (
|
|
547
|
+
!RulePatternMatchUtil.matches(
|
|
548
|
+
monitor.description,
|
|
549
|
+
rule.monitorDescriptionPattern,
|
|
550
|
+
)
|
|
551
|
+
) {
|
|
552
|
+
return false;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
return true;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* The enabled rules of a project, or of one SLO in it. Disabled rules are
|
|
561
|
+
* filtered in the query rather than in memory: they match nothing, so there
|
|
562
|
+
* is no reason to count them against the per-project read ceiling.
|
|
273
563
|
*/
|
|
274
564
|
@CaptureSpan()
|
|
275
|
-
private async
|
|
565
|
+
private async findEnabledRules(data: {
|
|
276
566
|
projectId: ObjectID;
|
|
277
|
-
|
|
278
|
-
}): Promise<
|
|
279
|
-
const
|
|
280
|
-
(
|
|
281
|
-
|
|
567
|
+
serviceLevelObjectiveId?: ObjectID | undefined;
|
|
568
|
+
}): Promise<Array<ServiceLevelObjectiveMonitorRule>> {
|
|
569
|
+
const rules: Array<ServiceLevelObjectiveMonitorRule> =
|
|
570
|
+
await ServiceLevelObjectiveMonitorRuleService.findBy({
|
|
571
|
+
query: data.serviceLevelObjectiveId
|
|
572
|
+
? {
|
|
573
|
+
projectId: data.projectId,
|
|
574
|
+
serviceLevelObjectiveId: data.serviceLevelObjectiveId,
|
|
575
|
+
isEnabled: true,
|
|
576
|
+
}
|
|
577
|
+
: {
|
|
578
|
+
projectId: data.projectId,
|
|
579
|
+
isEnabled: true,
|
|
580
|
+
},
|
|
581
|
+
select: RULE_SELECT,
|
|
582
|
+
limit: MAX_RULES_EVALUATED_PER_PROJECT,
|
|
583
|
+
skip: 0,
|
|
584
|
+
props: {
|
|
585
|
+
isRoot: true,
|
|
586
|
+
},
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
logIfRuleReadWasTruncated({
|
|
590
|
+
ruleKind: RULE_KIND,
|
|
591
|
+
projectId: data.projectId,
|
|
592
|
+
rulesRead: rules.length,
|
|
593
|
+
});
|
|
594
|
+
|
|
595
|
+
return rules;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* Every monitor in the project at least one of `rules` matches.
|
|
600
|
+
*
|
|
601
|
+
* When every rule is a legacy rule with a label list, a monitor can only
|
|
602
|
+
* match if it carries at least one label from the union of those lists, so
|
|
603
|
+
* that union is pushed into the query - it is the criterion that usually
|
|
604
|
+
* narrows the project the most. Anything else (a criteria-backed rule, a
|
|
605
|
+
* pattern-only rule) could match a monitor with no labels at all, so the
|
|
606
|
+
* project's monitors are read once and matched in memory. Regexes are always
|
|
607
|
+
* applied in memory: Postgres regex semantics and JavaScript's are not the
|
|
608
|
+
* same dialect, and the pattern a user typed has to mean one thing.
|
|
609
|
+
*/
|
|
610
|
+
@CaptureSpan()
|
|
611
|
+
private async findMatchingMonitors(data: {
|
|
612
|
+
projectId: ObjectID;
|
|
613
|
+
rules: Array<ServiceLevelObjectiveMonitorRule>;
|
|
614
|
+
}): Promise<Array<Monitor>> {
|
|
615
|
+
const rules: Array<ServiceLevelObjectiveMonitorRule> = data.rules.filter(
|
|
616
|
+
(rule: ServiceLevelObjectiveMonitorRule): boolean => {
|
|
617
|
+
return this.hasAnyMatchCriteria(rule);
|
|
282
618
|
},
|
|
283
619
|
);
|
|
284
620
|
|
|
285
|
-
if (
|
|
286
|
-
return
|
|
621
|
+
if (rules.length === 0) {
|
|
622
|
+
return [];
|
|
287
623
|
}
|
|
288
624
|
|
|
625
|
+
const labelPrefilter: Array<ObjectID> | null =
|
|
626
|
+
this.getLabelPrefilter(rules);
|
|
627
|
+
|
|
289
628
|
const monitors: Array<Monitor> = await MonitorService.findBy({
|
|
290
|
-
query:
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
629
|
+
query: labelPrefilter
|
|
630
|
+
? {
|
|
631
|
+
projectId: data.projectId,
|
|
632
|
+
labels: labelPrefilter,
|
|
633
|
+
}
|
|
634
|
+
: {
|
|
635
|
+
projectId: data.projectId,
|
|
636
|
+
},
|
|
294
637
|
select: {
|
|
295
638
|
_id: true,
|
|
639
|
+
name: true,
|
|
640
|
+
description: true,
|
|
641
|
+
labels: {
|
|
642
|
+
_id: true,
|
|
643
|
+
},
|
|
296
644
|
},
|
|
297
645
|
limit: LIMIT_PER_PROJECT,
|
|
298
646
|
skip: 0,
|
|
@@ -301,40 +649,112 @@ export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
|
301
649
|
},
|
|
302
650
|
});
|
|
303
651
|
|
|
304
|
-
return
|
|
652
|
+
return monitors.filter((monitor: Monitor): boolean => {
|
|
653
|
+
return rules.some((rule: ServiceLevelObjectiveMonitorRule): boolean => {
|
|
654
|
+
return this.doesMonitorMatchRule({ monitor: monitor, rule: rule });
|
|
655
|
+
});
|
|
656
|
+
});
|
|
305
657
|
}
|
|
306
658
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
}): boolean {
|
|
311
|
-
if (data.ruleLabelIds.size === 0 || data.labelIds.size === 0) {
|
|
312
|
-
return false;
|
|
659
|
+
private hasAnyMatchCriteria(rule: ServiceLevelObjectiveMonitorRule): boolean {
|
|
660
|
+
if (rule.criteria !== undefined && rule.criteria !== null) {
|
|
661
|
+
return true;
|
|
313
662
|
}
|
|
314
663
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
664
|
+
return Boolean(
|
|
665
|
+
(rule.monitorLabels && rule.monitorLabels.length > 0) ||
|
|
666
|
+
rule.monitorNamePattern ||
|
|
667
|
+
rule.monitorDescriptionPattern,
|
|
668
|
+
);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/*
|
|
672
|
+
* The label ids to push into the monitor query, or null when no safe
|
|
673
|
+
* pre-filter exists. Safe only when EVERY rule is a legacy rule with labels:
|
|
674
|
+
* each such rule requires any-of its own labels, so no monitor outside the
|
|
675
|
+
* union can match any of them. The query may hand back only the matching
|
|
676
|
+
* label rows, which still leaves every rule its evidence.
|
|
677
|
+
*/
|
|
678
|
+
private getLabelPrefilter(
|
|
679
|
+
rules: Array<ServiceLevelObjectiveMonitorRule>,
|
|
680
|
+
): Array<ObjectID> | null {
|
|
681
|
+
const labelIds: Map<string, ObjectID> = new Map<string, ObjectID>();
|
|
682
|
+
|
|
683
|
+
for (const rule of rules) {
|
|
684
|
+
if (rule.criteria !== undefined && rule.criteria !== null) {
|
|
685
|
+
return null;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
const ruleLabels: Array<Label> = (rule.monitorLabels || []).filter(
|
|
689
|
+
(label: Label): boolean => {
|
|
690
|
+
return Boolean(label.id);
|
|
691
|
+
},
|
|
692
|
+
);
|
|
693
|
+
|
|
694
|
+
if (ruleLabels.length === 0) {
|
|
695
|
+
return null;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
for (const label of ruleLabels) {
|
|
699
|
+
labelIds.set(label.id!.toString(), label.id!);
|
|
318
700
|
}
|
|
319
701
|
}
|
|
320
702
|
|
|
321
|
-
return
|
|
703
|
+
return labelIds.size > 0 ? Array.from(labelIds.values()) : null;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/*
|
|
707
|
+
* The SLOs that record this monitor as rule-attached. Selects ids only: a
|
|
708
|
+
* relation filter can narrow the joined relation rows it hands back, so the
|
|
709
|
+
* membership itself is read separately by id.
|
|
710
|
+
*/
|
|
711
|
+
private async findSloIdsHoldingAutoAddedMonitor(data: {
|
|
712
|
+
projectId: ObjectID;
|
|
713
|
+
monitorId: ObjectID;
|
|
714
|
+
}): Promise<Array<string>> {
|
|
715
|
+
const slos: Array<ServiceLevelObjective> =
|
|
716
|
+
await ServiceLevelObjectiveService.findBy({
|
|
717
|
+
query: {
|
|
718
|
+
projectId: data.projectId,
|
|
719
|
+
autoAddedMonitors: [data.monitorId],
|
|
720
|
+
},
|
|
721
|
+
select: {
|
|
722
|
+
_id: true,
|
|
723
|
+
},
|
|
724
|
+
limit: LIMIT_PER_PROJECT,
|
|
725
|
+
skip: 0,
|
|
726
|
+
props: {
|
|
727
|
+
isRoot: true,
|
|
728
|
+
},
|
|
729
|
+
});
|
|
730
|
+
|
|
731
|
+
return slos
|
|
732
|
+
.map((slo: ServiceLevelObjective): string => {
|
|
733
|
+
return slo.id?.toString() || "";
|
|
734
|
+
})
|
|
735
|
+
.filter((id: string): boolean => {
|
|
736
|
+
return id.length > 0;
|
|
737
|
+
});
|
|
322
738
|
}
|
|
323
739
|
|
|
324
740
|
/**
|
|
325
741
|
* Applies a computed match set to one SLO and persists the difference.
|
|
326
742
|
*
|
|
327
|
-
* `matchedMonitorIds` is the full set of monitors the
|
|
743
|
+
* `matchedMonitorIds` is the full set of monitors the rules claim. Anything
|
|
328
744
|
* in it that is not attached gets attached and recorded as rule-owned;
|
|
329
|
-
* anything recorded as rule-owned that the
|
|
745
|
+
* anything recorded as rule-owned that the rules no longer claim gets
|
|
330
746
|
* detached. Attachments that are not rule-owned are invisible to both
|
|
331
747
|
* halves, which is what keeps manual monitors safe.
|
|
748
|
+
*
|
|
749
|
+
* `knownMonitors` are monitors the caller already read, so the feed item
|
|
750
|
+
* can name them without another lookup.
|
|
332
751
|
*/
|
|
333
752
|
private async writeMembership(data: {
|
|
334
753
|
slo: ServiceLevelObjective;
|
|
335
754
|
attachedMonitorIds: Set<string>;
|
|
336
755
|
autoAddedMonitorIds: Set<string>;
|
|
337
756
|
matchedMonitorIds: Set<string>;
|
|
757
|
+
knownMonitors?: Array<Monitor> | undefined;
|
|
338
758
|
}): Promise<SloMonitorSyncResult> {
|
|
339
759
|
const { slo, attachedMonitorIds, autoAddedMonitorIds, matchedMonitorIds } =
|
|
340
760
|
data;
|
|
@@ -356,9 +776,9 @@ export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
|
356
776
|
});
|
|
357
777
|
|
|
358
778
|
/*
|
|
359
|
-
* A monitor
|
|
360
|
-
* manual: it is never promoted into autoAddedMonitors, so
|
|
361
|
-
*
|
|
779
|
+
* A monitor a rule matches but that a human attached by hand stays
|
|
780
|
+
* manual: it is never promoted into autoAddedMonitors, so the rule
|
|
781
|
+
* letting go of it later detaches nothing.
|
|
362
782
|
*/
|
|
363
783
|
const nextAutoAddedMonitorIds: Set<string> = new Set<string>(
|
|
364
784
|
Array.from(autoAddedMonitorIds).filter((id: string) => {
|
|
@@ -397,6 +817,10 @@ export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
|
397
817
|
* the compiler infer it for two arrays of Monitor (whose own relations
|
|
398
818
|
* fan out across most of the schema) trips TS2589 "type instantiation is
|
|
399
819
|
* excessively deep". The shape is exactly what the column types say.
|
|
820
|
+
*
|
|
821
|
+
* Written as root on purpose: rules are server-side configuration, and
|
|
822
|
+
* the manual-add guard in ServiceLevelObjectiveService lets root writes
|
|
823
|
+
* through precisely so this one is never refused.
|
|
400
824
|
*/
|
|
401
825
|
const updateData: PartialEntity<ServiceLevelObjective> = {
|
|
402
826
|
monitors: toMonitors(nextAttachedMonitorIds),
|
|
@@ -412,15 +836,287 @@ export class ServiceLevelObjectiveMonitorRuleEngineServiceClass {
|
|
|
412
836
|
});
|
|
413
837
|
|
|
414
838
|
logger.debug(
|
|
415
|
-
`SLO monitor
|
|
839
|
+
`SLO monitor rules synced SLO ${slo.id.toString()}: +${monitorIdsAdded.length} / -${monitorIdsRemoved.length} monitors`,
|
|
416
840
|
{ projectId: slo.projectId?.toString() } as LogAttributes,
|
|
417
841
|
);
|
|
418
842
|
|
|
843
|
+
/*
|
|
844
|
+
* Only monitors that were really on the list count as detached. A repair
|
|
845
|
+
* that drops a stale bookkeeping entry for a monitor no longer attached
|
|
846
|
+
* changed nothing a reader of the feed could see.
|
|
847
|
+
*/
|
|
848
|
+
await this.postMembershipFeedItems({
|
|
849
|
+
slo: slo,
|
|
850
|
+
monitorIdsAttached: monitorIdsAdded,
|
|
851
|
+
monitorIdsDetached: monitorIdsRemoved.filter((id: string) => {
|
|
852
|
+
return attachedMonitorIds.has(id);
|
|
853
|
+
}),
|
|
854
|
+
knownMonitors: data.knownMonitors || [],
|
|
855
|
+
});
|
|
856
|
+
|
|
419
857
|
return {
|
|
420
858
|
monitorIdsAdded: monitorIdsAdded,
|
|
421
859
|
monitorIdsRemoved: monitorIdsRemoved,
|
|
422
860
|
};
|
|
423
861
|
}
|
|
862
|
+
|
|
863
|
+
/*
|
|
864
|
+
* Tells the SLO's feed which monitors the rules just attached or detached.
|
|
865
|
+
* Posted without a user: nobody clicked anything, a rule reacted to a
|
|
866
|
+
* change. Manual attaches from the Monitors page are posted by the SLO
|
|
867
|
+
* service instead, and this engine writes as root with no user, which is
|
|
868
|
+
* how the two never double-post.
|
|
869
|
+
*
|
|
870
|
+
* Never throws. The membership is already saved; a feed item that could
|
|
871
|
+
* not be written must not turn a successful sync into a failed one.
|
|
872
|
+
*/
|
|
873
|
+
private async postMembershipFeedItems(data: {
|
|
874
|
+
slo: ServiceLevelObjective;
|
|
875
|
+
monitorIdsAttached: Array<string>;
|
|
876
|
+
monitorIdsDetached: Array<string>;
|
|
877
|
+
knownMonitors: Array<Monitor>;
|
|
878
|
+
}): Promise<void> {
|
|
879
|
+
const { slo } = data;
|
|
880
|
+
|
|
881
|
+
if (
|
|
882
|
+
!slo.id ||
|
|
883
|
+
!slo.projectId ||
|
|
884
|
+
(data.monitorIdsAttached.length === 0 &&
|
|
885
|
+
data.monitorIdsDetached.length === 0)
|
|
886
|
+
) {
|
|
887
|
+
return;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
try {
|
|
891
|
+
const sloLink: string =
|
|
892
|
+
await ServiceLevelObjectiveService.getSloMarkdownLink({
|
|
893
|
+
projectId: slo.projectId,
|
|
894
|
+
sloId: slo.id,
|
|
895
|
+
sloName: slo.name || undefined,
|
|
896
|
+
});
|
|
897
|
+
|
|
898
|
+
const monitorNameById: Map<string, string> =
|
|
899
|
+
await this.getMonitorNamesById({
|
|
900
|
+
monitorIds: [
|
|
901
|
+
...data.monitorIdsAttached.slice(
|
|
902
|
+
0,
|
|
903
|
+
MAX_MONITORS_LISTED_IN_FEED_DETAILS,
|
|
904
|
+
),
|
|
905
|
+
...data.monitorIdsDetached.slice(
|
|
906
|
+
0,
|
|
907
|
+
MAX_MONITORS_LISTED_IN_FEED_DETAILS,
|
|
908
|
+
),
|
|
909
|
+
],
|
|
910
|
+
knownMonitors: data.knownMonitors,
|
|
911
|
+
});
|
|
912
|
+
|
|
913
|
+
if (data.monitorIdsAttached.length > 0) {
|
|
914
|
+
const count: number = data.monitorIdsAttached.length;
|
|
915
|
+
|
|
916
|
+
await ServiceLevelObjectiveFeedService.createServiceLevelObjectiveFeedItem(
|
|
917
|
+
{
|
|
918
|
+
serviceLevelObjectiveId: slo.id,
|
|
919
|
+
projectId: slo.projectId,
|
|
920
|
+
serviceLevelObjectiveFeedEventType:
|
|
921
|
+
ServiceLevelObjectiveFeedEventType.MonitorsAttached,
|
|
922
|
+
displayColor: Green500,
|
|
923
|
+
feedInfoInMarkdown:
|
|
924
|
+
count === 1
|
|
925
|
+
? `🔗 Monitor rules attached ${this.describeMonitorNames({
|
|
926
|
+
monitorIds: data.monitorIdsAttached,
|
|
927
|
+
monitorNameById: monitorNameById,
|
|
928
|
+
})} to ${sloLink}. It now counts towards this SLO.`
|
|
929
|
+
: `🔗 Monitor rules attached ${count} monitors to ${sloLink}: ${this.describeMonitorNames(
|
|
930
|
+
{
|
|
931
|
+
monitorIds: data.monitorIdsAttached,
|
|
932
|
+
monitorNameById: monitorNameById,
|
|
933
|
+
},
|
|
934
|
+
)}.`,
|
|
935
|
+
moreInformationInMarkdown: this.listMonitorsInDetails({
|
|
936
|
+
title: "Monitors attached",
|
|
937
|
+
monitorIds: data.monitorIdsAttached,
|
|
938
|
+
monitorNameById: monitorNameById,
|
|
939
|
+
}),
|
|
940
|
+
},
|
|
941
|
+
);
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
if (data.monitorIdsDetached.length > 0) {
|
|
945
|
+
const count: number = data.monitorIdsDetached.length;
|
|
946
|
+
|
|
947
|
+
await ServiceLevelObjectiveFeedService.createServiceLevelObjectiveFeedItem(
|
|
948
|
+
{
|
|
949
|
+
serviceLevelObjectiveId: slo.id,
|
|
950
|
+
projectId: slo.projectId,
|
|
951
|
+
serviceLevelObjectiveFeedEventType:
|
|
952
|
+
ServiceLevelObjectiveFeedEventType.MonitorsDetached,
|
|
953
|
+
displayColor: Gray500,
|
|
954
|
+
feedInfoInMarkdown:
|
|
955
|
+
count === 1
|
|
956
|
+
? `✂️ Monitor rules detached ${this.describeMonitorNames({
|
|
957
|
+
monitorIds: data.monitorIdsDetached,
|
|
958
|
+
monitorNameById: monitorNameById,
|
|
959
|
+
})} from ${sloLink}. It no longer matches any enabled monitor rule of this SLO.`
|
|
960
|
+
: `✂️ Monitor rules detached ${count} monitors from ${sloLink}: ${this.describeMonitorNames(
|
|
961
|
+
{
|
|
962
|
+
monitorIds: data.monitorIdsDetached,
|
|
963
|
+
monitorNameById: monitorNameById,
|
|
964
|
+
},
|
|
965
|
+
)}.`,
|
|
966
|
+
moreInformationInMarkdown: this.listMonitorsInDetails({
|
|
967
|
+
title: "Monitors detached",
|
|
968
|
+
monitorIds: data.monitorIdsDetached,
|
|
969
|
+
monitorNameById: monitorNameById,
|
|
970
|
+
}),
|
|
971
|
+
},
|
|
972
|
+
);
|
|
973
|
+
}
|
|
974
|
+
} catch (error) {
|
|
975
|
+
logger.error(
|
|
976
|
+
`Error posting SLO monitor rule membership feed items for SLO ${slo.id.toString()}: ${error}`,
|
|
977
|
+
{ projectId: slo.projectId.toString() } as LogAttributes,
|
|
978
|
+
);
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
/*
|
|
983
|
+
* Names for the monitors a feed item mentions. Monitors the caller already
|
|
984
|
+
* holds are used as they are; the rest (a detached monitor is by definition
|
|
985
|
+
* no longer among the matches) are read in one bounded query.
|
|
986
|
+
*/
|
|
987
|
+
private async getMonitorNamesById(data: {
|
|
988
|
+
monitorIds: Array<string>;
|
|
989
|
+
knownMonitors: Array<Monitor>;
|
|
990
|
+
}): Promise<Map<string, string>> {
|
|
991
|
+
const monitorNameById: Map<string, string> = new Map<string, string>();
|
|
992
|
+
|
|
993
|
+
for (const monitor of data.knownMonitors) {
|
|
994
|
+
const id: string = monitor.id?.toString() || "";
|
|
995
|
+
|
|
996
|
+
if (id && monitor.name) {
|
|
997
|
+
monitorNameById.set(id, monitor.name);
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
const missingIds: Array<string> = Array.from(
|
|
1002
|
+
new Set<string>(data.monitorIds),
|
|
1003
|
+
).filter((id: string): boolean => {
|
|
1004
|
+
return !monitorNameById.has(id);
|
|
1005
|
+
});
|
|
1006
|
+
|
|
1007
|
+
if (missingIds.length === 0) {
|
|
1008
|
+
return monitorNameById;
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
const monitors: Array<Monitor> = await MonitorService.findBy({
|
|
1012
|
+
query: {
|
|
1013
|
+
_id: QueryHelper.any(
|
|
1014
|
+
missingIds.map((id: string) => {
|
|
1015
|
+
return new ObjectID(id);
|
|
1016
|
+
}),
|
|
1017
|
+
),
|
|
1018
|
+
},
|
|
1019
|
+
select: {
|
|
1020
|
+
_id: true,
|
|
1021
|
+
name: true,
|
|
1022
|
+
},
|
|
1023
|
+
limit: missingIds.length,
|
|
1024
|
+
skip: 0,
|
|
1025
|
+
props: {
|
|
1026
|
+
isRoot: true,
|
|
1027
|
+
},
|
|
1028
|
+
});
|
|
1029
|
+
|
|
1030
|
+
for (const monitor of monitors) {
|
|
1031
|
+
const id: string = monitor.id?.toString() || "";
|
|
1032
|
+
|
|
1033
|
+
if (id && monitor.name) {
|
|
1034
|
+
monitorNameById.set(id, monitor.name);
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
return monitorNameById;
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
/*
|
|
1042
|
+
* The display names, escaped, sorted so the same set always reads the same
|
|
1043
|
+
* way. A name that could not be resolved still counts - it is shown as
|
|
1044
|
+
* "a monitor" rather than dropped from the sentence.
|
|
1045
|
+
*/
|
|
1046
|
+
private getSortedMonitorNames(data: {
|
|
1047
|
+
monitorIds: Array<string>;
|
|
1048
|
+
monitorNameById: Map<string, string>;
|
|
1049
|
+
}): Array<string> {
|
|
1050
|
+
return data.monitorIds
|
|
1051
|
+
.slice(0, MAX_MONITORS_LISTED_IN_FEED_DETAILS)
|
|
1052
|
+
.map((id: string): string => {
|
|
1053
|
+
return data.monitorNameById.get(id) || "";
|
|
1054
|
+
})
|
|
1055
|
+
.sort((a: string, b: string): number => {
|
|
1056
|
+
if (!a || !b) {
|
|
1057
|
+
return a ? -1 : b ? 1 : 0;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
return a.localeCompare(b, undefined, { sensitivity: "base" });
|
|
1061
|
+
})
|
|
1062
|
+
.map((name: string): string => {
|
|
1063
|
+
return name ? `**${escapeMarkdownInline(name)}**` : "a monitor";
|
|
1064
|
+
});
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
// "**A**", "**A** and **B**", "**A**, **B**, ... and 7 more".
|
|
1068
|
+
private describeMonitorNames(data: {
|
|
1069
|
+
monitorIds: Array<string>;
|
|
1070
|
+
monitorNameById: Map<string, string>;
|
|
1071
|
+
}): string {
|
|
1072
|
+
const names: Array<string> = this.getSortedMonitorNames(data);
|
|
1073
|
+
const named: Array<string> = names.slice(
|
|
1074
|
+
0,
|
|
1075
|
+
MAX_MONITORS_NAMED_IN_FEED_HEADLINE,
|
|
1076
|
+
);
|
|
1077
|
+
const remaining: number = data.monitorIds.length - named.length;
|
|
1078
|
+
|
|
1079
|
+
if (remaining > 0) {
|
|
1080
|
+
return `${named.join(", ")} and ${remaining} more`;
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
if (named.length <= 1) {
|
|
1084
|
+
return named[0] || "a monitor";
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
return `${named.slice(0, -1).join(", ")} and ${named[named.length - 1]}`;
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
/*
|
|
1091
|
+
* The full (bounded) list, only when the sentence could not name everyone -
|
|
1092
|
+
* a single monitor, or a handful, is already fully described above.
|
|
1093
|
+
*/
|
|
1094
|
+
private listMonitorsInDetails(data: {
|
|
1095
|
+
title: string;
|
|
1096
|
+
monitorIds: Array<string>;
|
|
1097
|
+
monitorNameById: Map<string, string>;
|
|
1098
|
+
}): string | undefined {
|
|
1099
|
+
if (data.monitorIds.length <= MAX_MONITORS_NAMED_IN_FEED_HEADLINE) {
|
|
1100
|
+
return undefined;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
const names: Array<string> = this.getSortedMonitorNames(data);
|
|
1104
|
+
const notListed: number = data.monitorIds.length - names.length;
|
|
1105
|
+
|
|
1106
|
+
const lines: Array<string> = [
|
|
1107
|
+
`**${data.title} (${data.monitorIds.length})**`,
|
|
1108
|
+
"",
|
|
1109
|
+
...names.map((name: string): string => {
|
|
1110
|
+
return `- ${name}`;
|
|
1111
|
+
}),
|
|
1112
|
+
];
|
|
1113
|
+
|
|
1114
|
+
if (notListed > 0) {
|
|
1115
|
+
lines.push(`- …and ${notListed} more not listed here.`);
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
return lines.join("\n");
|
|
1119
|
+
}
|
|
424
1120
|
}
|
|
425
1121
|
|
|
426
1122
|
export default new ServiceLevelObjectiveMonitorRuleEngineServiceClass();
|