@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,1034 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
11
|
-
import { contentHashEventUid, parseEventTime, readString, readValue, } from "../../../../Utils/SecurityEvent/NormalizerHelpers";
|
|
12
|
-
import Semaphore, { SemaphoreLockTimeoutError, } from "../../../Infrastructure/Semaphore";
|
|
13
|
-
import GoogleSecOpsConnection from "../../../../Models/DatabaseModels/GoogleSecOpsConnection";
|
|
14
|
-
import LIMIT_MAX from "../../../../Types/Database/LimitMax";
|
|
15
|
-
import OneUptimeDate from "../../../../Types/Date";
|
|
16
|
-
import GoogleSecOpsAlertNormalizer from "../../../../Utils/SecurityEvent/GoogleSecOpsAlertNormalizer";
|
|
17
|
-
import GoogleSecOpsConnectionService from "../../../Services/GoogleSecOpsConnectionService";
|
|
18
|
-
import OTelIngestService from "../../../Services/OpenTelemetryIngestService";
|
|
19
|
-
import SecurityEventService from "../../../Services/SecurityEventService";
|
|
20
|
-
import { resolveTelemetryRetentionInDays } from "../../../../Types/Telemetry/TelemetryRetentionConfig";
|
|
21
|
-
import logger from "../../Logger";
|
|
22
|
-
import { redactLogString } from "../../LogRedaction";
|
|
23
|
-
import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
24
|
-
import ConnectorErrorMessage from "../ConnectorErrorMessage";
|
|
25
|
-
import SecurityEventDedupe from "../SecurityEventDedupe";
|
|
26
|
-
import { buildSecurityEventDbRow } from "../SecurityEventRow";
|
|
27
|
-
import ThreatIntelEnricher from "../ThreatIntel/ThreatIntelEnricher";
|
|
28
|
-
import GoogleSecOpsClient from "./GoogleSecOpsClient";
|
|
29
|
-
const SECOPS_SERVICE_NAME = "Google SecOps";
|
|
30
|
-
const SECOPS_VENDOR_NAME = "Google";
|
|
31
|
-
/*
|
|
32
|
-
* The first poll of a new connection reads a full day of CREATED detections.
|
|
33
|
-
* Fifteen minutes used to be the default, and on a tenant whose rules run
|
|
34
|
-
* hourly or daily it reliably returned nothing, which read as "the
|
|
35
|
-
* connector is broken" on the very first look.
|
|
36
|
-
*/
|
|
37
|
-
const DEFAULT_LOOKBACK_IN_MINUTES = 24 * 60;
|
|
38
|
-
/*
|
|
39
|
-
* Adaptive catch-up. A scheduled poll reads at most MAX_CHUNK_MINUTES of
|
|
40
|
-
* created time past its cursor. A poll that cannot read its window in one
|
|
41
|
-
* run halves the next chunk and a complete poll doubles it back, because
|
|
42
|
-
* re-reading an identical window that never fits pinned the cursor forever
|
|
43
|
-
* and nothing new was ever imported. The chunk is measured from the cursor,
|
|
44
|
-
* not from the overlapped window start: a chunk no longer than the overlap
|
|
45
|
-
* would otherwise end at or before the cursor and never move it.
|
|
46
|
-
*/
|
|
47
|
-
const MAX_CHUNK_MINUTES = 24 * 60;
|
|
48
|
-
const MIN_CHUNK_MINUTES = 1;
|
|
49
|
-
const WINDOW_OVERLAP_IN_MINUTES = 1;
|
|
50
|
-
/*
|
|
51
|
-
* Separate request budgets per kind of read. The two created-time search
|
|
52
|
-
* passes are the authoritative read of rule detections and share one page
|
|
53
|
-
* budget; the alerts view splits truncated windows and gets its own, so a
|
|
54
|
-
* burst that the alerts view has to split can no longer starve the searches
|
|
55
|
-
* (or the other way round).
|
|
56
|
-
*/
|
|
57
|
-
const MAX_SEARCH_PAGES_PER_POLL = 20;
|
|
58
|
-
const MAX_ALERTS_VIEW_REQUESTS_PER_POLL = 16;
|
|
59
|
-
// The worker job times out at ten minutes; normalizing and importing follow.
|
|
60
|
-
const MAX_FETCH_DURATION_MS = 4 * 60 * 1000;
|
|
61
|
-
const MAX_ALERTS_PER_REQUEST = 1000;
|
|
62
|
-
const MAX_SEARCH_PAGE_SIZE = 1000;
|
|
63
|
-
const MAX_DIAGNOSTIC_SAMPLES = 25;
|
|
64
|
-
const MAX_RANGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
65
|
-
const DEFAULT_POLL_INTERVAL_IN_MINUTES = 5;
|
|
66
|
-
/*
|
|
67
|
-
* A detection created within one poll interval plus this grace of its
|
|
68
|
-
* detection time would still have been caught by a detection-time cursor;
|
|
69
|
-
* anything later is exactly the record the old basis lost.
|
|
70
|
-
*/
|
|
71
|
-
const CREATION_LAG_GRACE_IN_MINUTES = 1;
|
|
72
|
-
/*
|
|
73
|
-
* Curated (Google-authored) rule detections are optional: tenants without
|
|
74
|
-
* that entitlement answer 403 (and some 400/404) on the curated route. Those
|
|
75
|
-
* statuses degrade the pass to a warning; 401, 429, 5xx, timeouts and parse
|
|
76
|
-
* failures still fail the run like any other pass.
|
|
77
|
-
*/
|
|
78
|
-
const CURATED_OPTIONAL_STATUSES = [400, 403, 404];
|
|
79
|
-
export const GOOGLE_SECOPS_SOURCE_LOCK_NAMESPACE = "GoogleSecOpsSource";
|
|
80
|
-
class RecordedPollFailure extends Error {
|
|
81
|
-
}
|
|
82
|
-
export default class GoogleSecOpsPoller {
|
|
83
|
-
static async pollAllDueConnections() {
|
|
84
|
-
var _a, _b;
|
|
85
|
-
const connections = await GoogleSecOpsConnectionService.findBy({
|
|
86
|
-
query: {
|
|
87
|
-
isEnabled: true,
|
|
88
|
-
},
|
|
89
|
-
select: {
|
|
90
|
-
_id: true,
|
|
91
|
-
projectId: true,
|
|
92
|
-
name: true,
|
|
93
|
-
region: true,
|
|
94
|
-
instanceResourceName: true,
|
|
95
|
-
serviceAccountJson: true,
|
|
96
|
-
pollIntervalInMinutes: true,
|
|
97
|
-
lastPolledAt: true,
|
|
98
|
-
cursor: true,
|
|
99
|
-
// Carries nextChunkMinutes, the length of the next catch-up chunk.
|
|
100
|
-
lastPollResult: true,
|
|
101
|
-
includeNonAlertingDetections: true,
|
|
102
|
-
},
|
|
103
|
-
skip: 0,
|
|
104
|
-
limit: LIMIT_MAX,
|
|
105
|
-
props: {
|
|
106
|
-
isRoot: true,
|
|
107
|
-
},
|
|
108
|
-
});
|
|
109
|
-
const now = OneUptimeDate.getCurrentDate();
|
|
110
|
-
for (const connection of connections) {
|
|
111
|
-
const intervalInMinutes = Math.max(1, connection.pollIntervalInMinutes || 5);
|
|
112
|
-
if (connection.lastPolledAt) {
|
|
113
|
-
const dueAt = OneUptimeDate.addRemoveMinutes(connection.lastPolledAt, intervalInMinutes);
|
|
114
|
-
if (OneUptimeDate.isAfter(dueAt, now)) {
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
try {
|
|
119
|
-
const ingested = await this.pollConnection(connection);
|
|
120
|
-
/*
|
|
121
|
-
* The count used to be returned and dropped on the floor, which
|
|
122
|
-
* left "polling healthy but quiet" and "polling silently broken"
|
|
123
|
-
* looking identical from outside the process. At info rather than
|
|
124
|
-
* debug for that reason — a number nobody sees at the default log
|
|
125
|
-
* level answers the question no better than not having it.
|
|
126
|
-
*/
|
|
127
|
-
logger.info(`GoogleSecOpsPoller: connection ${(_a = connection.id) === null || _a === void 0 ? void 0 : _a.toString()} ingested ${ingested} security events.`);
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
logger.error(`GoogleSecOpsPoller: error polling connection ${(_b = connection.id) === null || _b === void 0 ? void 0 : _b.toString()}:`);
|
|
131
|
-
logger.error(error);
|
|
132
|
-
if (error instanceof RecordedPollFailure) {
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
135
|
-
/*
|
|
136
|
-
* Stamping the failure is best-effort and must never take the
|
|
137
|
-
* loop down with it: a throw here would skip every connection
|
|
138
|
-
* still due in this tick and leave this one's lastPolledAt and
|
|
139
|
-
* lastError null, so the poller would look like it had simply
|
|
140
|
-
* never run.
|
|
141
|
-
*/
|
|
142
|
-
if (connection.id) {
|
|
143
|
-
const connectionId = connection.id;
|
|
144
|
-
await ConnectorErrorMessage.recordFailure({
|
|
145
|
-
label: `GoogleSecOpsPoller: connection ${connectionId.toString()}`,
|
|
146
|
-
write: async () => {
|
|
147
|
-
await GoogleSecOpsConnectionService.updateOneById({
|
|
148
|
-
id: connectionId,
|
|
149
|
-
data: {
|
|
150
|
-
lastPolledAt: OneUptimeDate.getCurrentDate(),
|
|
151
|
-
lastError: redactLogString(ConnectorErrorMessage.toMessage(error, { truncate: false })),
|
|
152
|
-
},
|
|
153
|
-
props: {
|
|
154
|
-
isRoot: true,
|
|
155
|
-
},
|
|
156
|
-
});
|
|
157
|
-
},
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
static async pollConnection(connection, clientOverride) {
|
|
164
|
-
const result = await this.executeConnection(connection, { type: "poll" }, clientOverride);
|
|
165
|
-
if (result.status === "failed") {
|
|
166
|
-
throw new RecordedPollFailure(result.error || "Google SecOps poll failed.");
|
|
167
|
-
}
|
|
168
|
-
return result.ingestedCount;
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Source-scoped serialization is required because ClickHouse does not
|
|
172
|
-
* deduplicate eventUid: a lookup followed by insert is only safe under this
|
|
173
|
-
* lock. The same lock covers different connections to the same source.
|
|
174
|
-
*/
|
|
175
|
-
static async executeConnection(connection, options, clientOverride) {
|
|
176
|
-
var _a;
|
|
177
|
-
this.validateConnection(connection);
|
|
178
|
-
if (options.type === "test" || options.type === "preview") {
|
|
179
|
-
return this.executeUnlocked(connection, options, clientOverride);
|
|
180
|
-
}
|
|
181
|
-
let mutex;
|
|
182
|
-
try {
|
|
183
|
-
mutex = await Semaphore.lock({
|
|
184
|
-
namespace: GOOGLE_SECOPS_SOURCE_LOCK_NAMESPACE,
|
|
185
|
-
key: connection.projectId.toString(),
|
|
186
|
-
lockTimeout: 30000,
|
|
187
|
-
acquireTimeout: 10000,
|
|
188
|
-
retryInterval: 100,
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
catch (error) {
|
|
192
|
-
/*
|
|
193
|
-
* The library's timeout message names Redis keys and reads like an
|
|
194
|
-
* infrastructure fault. It is the expected steady state when a long
|
|
195
|
-
* import holds the source lock, so it is reworded for the person
|
|
196
|
-
* reading run history, and left as a BadDataException so the run
|
|
197
|
-
* executor records it without retrying.
|
|
198
|
-
*/
|
|
199
|
-
if (error instanceof SemaphoreLockTimeoutError) {
|
|
200
|
-
throw new BadDataException("Another poll or import for this source is still running in this project. This run was skipped; polling continues on the next scheduled tick.");
|
|
201
|
-
}
|
|
202
|
-
throw error;
|
|
203
|
-
}
|
|
204
|
-
try {
|
|
205
|
-
/*
|
|
206
|
-
* An injected client also injects the connection snapshot for tests.
|
|
207
|
-
* Production always reloads after waiting for another poll or backfill.
|
|
208
|
-
*/
|
|
209
|
-
const current = clientOverride
|
|
210
|
-
? connection
|
|
211
|
-
: await GoogleSecOpsConnectionService.findOneById({
|
|
212
|
-
id: connection.id,
|
|
213
|
-
select: {
|
|
214
|
-
_id: true,
|
|
215
|
-
projectId: true,
|
|
216
|
-
name: true,
|
|
217
|
-
region: true,
|
|
218
|
-
instanceResourceName: true,
|
|
219
|
-
serviceAccountJson: true,
|
|
220
|
-
cursor: true,
|
|
221
|
-
/*
|
|
222
|
-
* Reloaded with the cursor: the previous poll's result decides
|
|
223
|
-
* this poll's chunk and whether it resumes past a forced advance.
|
|
224
|
-
*/
|
|
225
|
-
lastPollResult: true,
|
|
226
|
-
pollIntervalInMinutes: true,
|
|
227
|
-
includeNonAlertingDetections: true,
|
|
228
|
-
},
|
|
229
|
-
props: { isRoot: true },
|
|
230
|
-
});
|
|
231
|
-
if (!current ||
|
|
232
|
-
((_a = current.projectId) === null || _a === void 0 ? void 0 : _a.toString()) !== connection.projectId.toString()) {
|
|
233
|
-
throw new BadDataException("Google SecOps connection no longer exists in this project.");
|
|
234
|
-
}
|
|
235
|
-
return await this.executeUnlocked(current, options, clientOverride);
|
|
236
|
-
}
|
|
237
|
-
finally {
|
|
238
|
-
try {
|
|
239
|
-
await Semaphore.release(mutex);
|
|
240
|
-
}
|
|
241
|
-
catch (error) {
|
|
242
|
-
logger.error(`GoogleSecOpsPoller: could not release source lock: ${redactLogString(ConnectorErrorMessage.toMessage(error))}`);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
static validateConnection(connection) {
|
|
247
|
-
if (!connection.id ||
|
|
248
|
-
!connection.projectId ||
|
|
249
|
-
!connection.region ||
|
|
250
|
-
!connection.instanceResourceName ||
|
|
251
|
-
!connection.serviceAccountJson) {
|
|
252
|
-
throw new BadDataException("Google SecOps connection is missing id, projectId, region, instance, or credentials.");
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
static getWindow(connection, options) {
|
|
256
|
-
const now = OneUptimeDate.getCurrentDate();
|
|
257
|
-
let endTime = now;
|
|
258
|
-
let startTime = OneUptimeDate.addRemoveMinutes(now, -DEFAULT_LOOKBACK_IN_MINUTES);
|
|
259
|
-
const warnings = [];
|
|
260
|
-
let hasUsableCursor = false;
|
|
261
|
-
if (options.type === "preview" || options.type === "backfill") {
|
|
262
|
-
startTime = new Date(options.startTime || "");
|
|
263
|
-
endTime = new Date(options.endTime || "");
|
|
264
|
-
if (!Number.isFinite(startTime.getTime()) ||
|
|
265
|
-
!Number.isFinite(endTime.getTime()) ||
|
|
266
|
-
startTime >= endTime ||
|
|
267
|
-
endTime.getTime() > now.getTime() + 60000 ||
|
|
268
|
-
endTime.getTime() - startTime.getTime() > MAX_RANGE_MS) {
|
|
269
|
-
throw new BadDataException("Select a valid past time range of at most seven days.");
|
|
270
|
-
}
|
|
271
|
-
return { startTime, endTime, warnings, hasUsableCursor };
|
|
272
|
-
}
|
|
273
|
-
if (options.type !== "poll") {
|
|
274
|
-
return { startTime, endTime, warnings, hasUsableCursor };
|
|
275
|
-
}
|
|
276
|
-
const chunk = this.getChunkMinutes(connection);
|
|
277
|
-
let cursorTime = null;
|
|
278
|
-
if (connection.cursor) {
|
|
279
|
-
const parsed = new Date(connection.cursor);
|
|
280
|
-
if (!Number.isFinite(parsed.getTime())) {
|
|
281
|
-
warnings.push("The saved cursor is unreadable; polling the default 24 hour window.");
|
|
282
|
-
}
|
|
283
|
-
else if (parsed >= now) {
|
|
284
|
-
warnings.push("The saved cursor is in the future; polling the default 24 hour window.");
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
cursorTime = parsed;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
if (cursorTime) {
|
|
291
|
-
hasUsableCursor = true;
|
|
292
|
-
startTime = this.resumesFromForcedAdvance(connection, cursorTime)
|
|
293
|
-
? cursorTime
|
|
294
|
-
: OneUptimeDate.addRemoveMinutes(cursorTime, -WINDOW_OVERLAP_IN_MINUTES);
|
|
295
|
-
const chunkEnd = OneUptimeDate.addRemoveMinutes(cursorTime, chunk);
|
|
296
|
-
if (chunkEnd < endTime) {
|
|
297
|
-
endTime = chunkEnd;
|
|
298
|
-
warnings.push(`Catching up from the saved cursor in ${this.describeChunk(chunk)} windows. Later detections will be fetched by subsequent polls.`);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
else {
|
|
302
|
-
// The first window keeps its 24 hour lookback; a narrowed chunk only shortens its end.
|
|
303
|
-
const chunkEnd = OneUptimeDate.addRemoveMinutes(startTime, chunk);
|
|
304
|
-
if (chunkEnd < endTime) {
|
|
305
|
-
endTime = chunkEnd;
|
|
306
|
-
warnings.push(`Reading the first ${chunk} minutes of the 24 hour lookback. Later detections will be fetched by subsequent polls.`);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
const chunkBase = cursorTime || startTime;
|
|
310
|
-
return {
|
|
311
|
-
startTime,
|
|
312
|
-
endTime,
|
|
313
|
-
warnings,
|
|
314
|
-
hasUsableCursor,
|
|
315
|
-
chunkBase,
|
|
316
|
-
requestedChunkMinutes: chunk,
|
|
317
|
-
chunkMinutes: Math.max(MIN_CHUNK_MINUTES, Math.ceil((endTime.getTime() - chunkBase.getTime()) / 60000)),
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
/*
|
|
321
|
-
* lastPollResult.nextChunkMinutes when it is a whole number of minutes
|
|
322
|
-
* inside the allowed range. Anything else (no previous poll, a hand-edited
|
|
323
|
-
* row, a result from before adaptive catch-up) reads the full 24 hours.
|
|
324
|
-
*/
|
|
325
|
-
static getChunkMinutes(connection) {
|
|
326
|
-
const stored = connection.lastPollResult
|
|
327
|
-
? connection.lastPollResult["nextChunkMinutes"]
|
|
328
|
-
: undefined;
|
|
329
|
-
if (typeof stored === "number" &&
|
|
330
|
-
Number.isInteger(stored) &&
|
|
331
|
-
stored >= MIN_CHUNK_MINUTES &&
|
|
332
|
-
stored <= MAX_CHUNK_MINUTES) {
|
|
333
|
-
return stored;
|
|
334
|
-
}
|
|
335
|
-
return MAX_CHUNK_MINUTES;
|
|
336
|
-
}
|
|
337
|
-
/*
|
|
338
|
-
* True when the saved cursor is the end of a minute that a forced advance
|
|
339
|
-
* skipped (or a poll that already started there and did not move the
|
|
340
|
-
* cursor). Such a poll starts at the cursor without the overlap: the
|
|
341
|
-
* overlap minute is exactly the minute that could not be read, and
|
|
342
|
-
* re-reading it would overflow again and force a second advance over a
|
|
343
|
-
* minute that was never the problem.
|
|
344
|
-
*/
|
|
345
|
-
static resumesFromForcedAdvance(connection, cursorTime) {
|
|
346
|
-
const stored = connection.lastPollResult;
|
|
347
|
-
if (!stored || stored["type"] !== "poll") {
|
|
348
|
-
return false;
|
|
349
|
-
}
|
|
350
|
-
const readTime = (key) => {
|
|
351
|
-
const value = stored[key];
|
|
352
|
-
return typeof value === "string" ? Date.parse(value) : Number.NaN;
|
|
353
|
-
};
|
|
354
|
-
return ((stored["forcedAdvance"] === true &&
|
|
355
|
-
readTime("windowEnd") === cursorTime.getTime()) ||
|
|
356
|
-
readTime("windowStart") === cursorTime.getTime());
|
|
357
|
-
}
|
|
358
|
-
static describeChunk(minutes) {
|
|
359
|
-
if (minutes % 60 === 0) {
|
|
360
|
-
const hours = minutes / 60;
|
|
361
|
-
return `${hours} hour`;
|
|
362
|
-
}
|
|
363
|
-
return `${minutes} minute`;
|
|
364
|
-
}
|
|
365
|
-
static async executeUnlocked(connection, options, clientOverride) {
|
|
366
|
-
const window = this.getWindow(connection, options);
|
|
367
|
-
const startedMs = Date.now();
|
|
368
|
-
/*
|
|
369
|
-
* Preview and backfill take a detection-time range from the person (it
|
|
370
|
-
* is how the SecOps alerts view frames time), and read created time as
|
|
371
|
-
* well so an import of "yesterday" also carries detections created
|
|
372
|
-
* yesterday about older events. Polls read created time only; the
|
|
373
|
-
* alerts-view pass supplies detection time.
|
|
374
|
-
*/
|
|
375
|
-
const isHistorical = options.type === "preview" || options.type === "backfill";
|
|
376
|
-
const searchBases = isHistorical
|
|
377
|
-
? ["CREATED_TIME", "DETECTION_TIME"]
|
|
378
|
-
: ["CREATED_TIME"];
|
|
379
|
-
const basisLabel = isHistorical
|
|
380
|
-
? "created and detection time"
|
|
381
|
-
: "created time";
|
|
382
|
-
const result = Object.assign(Object.assign(Object.assign({ type: options.type }, (options.runId ? { runId: options.runId } : {})), { status: "running", startedAt: new Date(startedMs).toISOString(), completedAt: new Date(startedMs).toISOString(), durationMs: 0, windowStart: window.startTime.toISOString(), windowEnd: window.endTime.toISOString(), includeNonAlertingDetections: connection.includeNonAlertingDetections === true, basis: isHistorical ? "detection-time" : "created-time", sourceCounts: { ruleDetections: 0, curatedDetections: 0, alertsView: 0 }, fetchedCount: 0, ingestedCount: 0, duplicateCount: 0, rejectedCount: 0, failedCount: 0, complete: true, requestCount: 0, warnings: window.warnings, samples: [], checks: [] }), (window.chunkMinutes !== undefined
|
|
383
|
-
? { chunkMinutes: window.chunkMinutes }
|
|
384
|
-
: {}));
|
|
385
|
-
const budget = {
|
|
386
|
-
startedMs,
|
|
387
|
-
searchRequests: 0,
|
|
388
|
-
alertsViewRequests: 0,
|
|
389
|
-
};
|
|
390
|
-
let phase = "Validate configuration";
|
|
391
|
-
let phaseStartedMs = Date.now();
|
|
392
|
-
try {
|
|
393
|
-
const client = clientOverride ||
|
|
394
|
-
new GoogleSecOpsClient({
|
|
395
|
-
region: connection.region,
|
|
396
|
-
instanceResourceName: connection.instanceResourceName,
|
|
397
|
-
serviceAccountJson: connection.serviceAccountJson,
|
|
398
|
-
});
|
|
399
|
-
result.checks.push({
|
|
400
|
-
name: phase,
|
|
401
|
-
status: "success",
|
|
402
|
-
durationMs: Date.now() - phaseStartedMs,
|
|
403
|
-
message: "The region, instance and service account configuration are valid.",
|
|
404
|
-
});
|
|
405
|
-
if (options.type === "test") {
|
|
406
|
-
phase = "Authenticate with Google";
|
|
407
|
-
phaseStartedMs = Date.now();
|
|
408
|
-
await client.testAuthentication();
|
|
409
|
-
result.checks.push({
|
|
410
|
-
name: phase,
|
|
411
|
-
status: "success",
|
|
412
|
-
durationMs: Date.now() - phaseStartedMs,
|
|
413
|
-
message: "Google accepted the service account credentials.",
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
|
-
/*
|
|
417
|
-
* Three passes over one window, unioned by Collection.id. The alerts
|
|
418
|
-
* view alone filters on DETECTION time, and a rule that runs hourly
|
|
419
|
-
* creates detections whose detection time is already behind a
|
|
420
|
-
* forward-only cursor, so it can never be the primary read.
|
|
421
|
-
*/
|
|
422
|
-
const seen = new Map();
|
|
423
|
-
phase = `Read rule detections by ${basisLabel}`;
|
|
424
|
-
phaseStartedMs = Date.now();
|
|
425
|
-
const rulePass = await this.searchPass(client, window, result, budget, seen, { curated: false, bases: searchBases });
|
|
426
|
-
result.sourceCounts.ruleDetections = rulePass.returned;
|
|
427
|
-
this.recordPass({
|
|
428
|
-
result,
|
|
429
|
-
name: phase,
|
|
430
|
-
startedMs: phaseStartedMs,
|
|
431
|
-
outcome: rulePass,
|
|
432
|
-
countMessage: `${rulePass.returned} rule detections returned for the window by ${basisLabel}.`,
|
|
433
|
-
});
|
|
434
|
-
phase = `Read curated rule detections by ${basisLabel}`;
|
|
435
|
-
phaseStartedMs = Date.now();
|
|
436
|
-
try {
|
|
437
|
-
const curatedPass = await this.searchPass(client, window, result, budget, seen, { curated: true, bases: searchBases });
|
|
438
|
-
result.sourceCounts.curatedDetections = curatedPass.returned;
|
|
439
|
-
this.recordPass({
|
|
440
|
-
result,
|
|
441
|
-
name: phase,
|
|
442
|
-
startedMs: phaseStartedMs,
|
|
443
|
-
outcome: curatedPass,
|
|
444
|
-
countMessage: `${curatedPass.returned} curated rule detections returned for the window by ${basisLabel}.`,
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
catch (curatedError) {
|
|
448
|
-
/*
|
|
449
|
-
* Named differently from the outer catch on purpose: the guidance
|
|
450
|
-
* accuracy test reads executeUnlocked's first catch clause, by its
|
|
451
|
-
* variable name, as the run-failure path.
|
|
452
|
-
*/
|
|
453
|
-
const status = GoogleSecOpsClient.readHttpStatus(curatedError);
|
|
454
|
-
if (status === null || !CURATED_OPTIONAL_STATUSES.includes(status)) {
|
|
455
|
-
throw curatedError;
|
|
456
|
-
}
|
|
457
|
-
const message = redactLogString(ConnectorErrorMessage.toMessage(curatedError));
|
|
458
|
-
result.warnings.push(`Curated rule detections could not be read (HTTP ${status}); this tenant may not have curated rule access. Rule detections and the alerts view were still read.`);
|
|
459
|
-
result.checks.push({
|
|
460
|
-
name: phase,
|
|
461
|
-
status: "warn",
|
|
462
|
-
durationMs: Date.now() - phaseStartedMs,
|
|
463
|
-
message,
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
phase = "Read alerts view by detection time";
|
|
467
|
-
phaseStartedMs = Date.now();
|
|
468
|
-
const alertsPass = await this.fetchWindows(client, window, result, budget, seen);
|
|
469
|
-
result.sourceCounts.alertsView = alertsPass.returned;
|
|
470
|
-
this.recordPass({
|
|
471
|
-
result,
|
|
472
|
-
name: phase,
|
|
473
|
-
startedMs: phaseStartedMs,
|
|
474
|
-
outcome: alertsPass,
|
|
475
|
-
countMessage: `${alertsPass.returned} alerts returned by detection time.`,
|
|
476
|
-
successMessage: `${alertsPass.returned} alerts returned by detection time. The configured Google SecOps instance is reachable and allows reading detections.`,
|
|
477
|
-
});
|
|
478
|
-
const alerts = Array.from(seen.values());
|
|
479
|
-
result.fetchedCount = alerts.length;
|
|
480
|
-
result.creationLag = this.measureCreationLag(alerts, connection, result);
|
|
481
|
-
phase = "Normalize detections";
|
|
482
|
-
phaseStartedMs = Date.now();
|
|
483
|
-
const normalized = [];
|
|
484
|
-
for (const alert of alerts) {
|
|
485
|
-
try {
|
|
486
|
-
if (!GoogleSecOpsAlertNormalizer.isGoogleSecOpsAlert(alert)) {
|
|
487
|
-
result.rejectedCount++;
|
|
488
|
-
continue;
|
|
489
|
-
}
|
|
490
|
-
const event = GoogleSecOpsAlertNormalizer.normalize(alert);
|
|
491
|
-
normalized.push(event);
|
|
492
|
-
if (result.samples.length < MAX_DIAGNOSTIC_SAMPLES) {
|
|
493
|
-
result.samples.push(this.sample(alert, event));
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
catch (_a) {
|
|
497
|
-
result.failedCount++;
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
if (result.rejectedCount) {
|
|
501
|
-
/*
|
|
502
|
-
* Counted and reported, never retried: an object Google returns
|
|
503
|
-
* that is not a Collection is permanently unrecognizable, so
|
|
504
|
-
* holding the cursor for it would pin the window until the 24 hour
|
|
505
|
-
* chunk could never reach the present.
|
|
506
|
-
*/
|
|
507
|
-
result.warnings.push(`${result.rejectedCount} returned objects were discarded because they do not look like Google SecOps detections. They are counted here and do not hold the poll cursor.`);
|
|
508
|
-
}
|
|
509
|
-
if (result.failedCount) {
|
|
510
|
-
result.warnings.push(`${result.failedCount} detections could not be normalized, so this window is not fully imported.`);
|
|
511
|
-
}
|
|
512
|
-
result.complete = result.complete && result.failedCount === 0;
|
|
513
|
-
result.checks.push({
|
|
514
|
-
name: phase,
|
|
515
|
-
status: result.failedCount
|
|
516
|
-
? "failed"
|
|
517
|
-
: result.rejectedCount
|
|
518
|
-
? "warn"
|
|
519
|
-
: "success",
|
|
520
|
-
durationMs: Date.now() - phaseStartedMs,
|
|
521
|
-
message: `${normalized.length} detections recognized; ${result.rejectedCount} rejected; ${result.failedCount} failed.`,
|
|
522
|
-
});
|
|
523
|
-
if (options.type === "poll" || options.type === "backfill") {
|
|
524
|
-
phase = "Import detections";
|
|
525
|
-
phaseStartedMs = Date.now();
|
|
526
|
-
await this.ingest(connection, normalized, result);
|
|
527
|
-
result.checks.push({
|
|
528
|
-
name: phase,
|
|
529
|
-
status: "success",
|
|
530
|
-
durationMs: Date.now() - phaseStartedMs,
|
|
531
|
-
message: `${result.ingestedCount} imported; ${result.duplicateCount} already imported.`,
|
|
532
|
-
});
|
|
533
|
-
}
|
|
534
|
-
result.status = !result.complete
|
|
535
|
-
? "partial"
|
|
536
|
-
: options.type === "test" || result.fetchedCount > 0
|
|
537
|
-
? "success"
|
|
538
|
-
: "empty";
|
|
539
|
-
}
|
|
540
|
-
catch (error) {
|
|
541
|
-
result.status = "failed";
|
|
542
|
-
result.complete = false;
|
|
543
|
-
result.error = redactLogString(ConnectorErrorMessage.toMessage(error, { truncate: false }));
|
|
544
|
-
result.checks.push({
|
|
545
|
-
name: phase,
|
|
546
|
-
status: "failed",
|
|
547
|
-
durationMs: Date.now() - phaseStartedMs,
|
|
548
|
-
message: result.error,
|
|
549
|
-
});
|
|
550
|
-
}
|
|
551
|
-
let decision = null;
|
|
552
|
-
if (options.type === "poll") {
|
|
553
|
-
decision = this.decideCursor(window, result);
|
|
554
|
-
result.nextChunkMinutes = decision.nextChunkMinutes;
|
|
555
|
-
if (decision.forcedAdvance) {
|
|
556
|
-
result.forcedAdvance = true;
|
|
557
|
-
}
|
|
558
|
-
if (decision.warning) {
|
|
559
|
-
/*
|
|
560
|
-
* A forced advance leaves a reported gap, so it leads the warnings
|
|
561
|
-
* (and therefore lastError); narrowing follows the reasons for it.
|
|
562
|
-
*/
|
|
563
|
-
if (decision.forcedAdvance) {
|
|
564
|
-
result.warnings.unshift(decision.warning);
|
|
565
|
-
}
|
|
566
|
-
else {
|
|
567
|
-
result.warnings.push(decision.warning);
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
result.completedAt = OneUptimeDate.getCurrentDate().toISOString();
|
|
572
|
-
result.durationMs = Math.max(0, Date.now() - startedMs);
|
|
573
|
-
for (const warning of result.warnings) {
|
|
574
|
-
logger.warn(`GoogleSecOpsPoller: connection ${connection.id.toString()}: ${warning}`);
|
|
575
|
-
}
|
|
576
|
-
logger.debug(`GoogleSecOpsPoller: connection ${connection.id.toString()} fetched ${result.fetchedCount} alerts and ingested ${result.ingestedCount} security events for ${result.windowStart} to ${result.windowEnd}.`);
|
|
577
|
-
if (options.type === "poll" && decision) {
|
|
578
|
-
await GoogleSecOpsConnectionService.updateOneById({
|
|
579
|
-
id: connection.id,
|
|
580
|
-
data: Object.assign(Object.assign(Object.assign({ lastPolledAt: new Date(result.completedAt), lastPollResult: result, lastError: (result.error ||
|
|
581
|
-
(result.complete
|
|
582
|
-
? null
|
|
583
|
-
: result.warnings.join(" ") ||
|
|
584
|
-
"Poll incomplete.")) }, (decision.cursor ? { cursor: decision.cursor } : {})), (result.complete
|
|
585
|
-
? { lastSuccessfulPollAt: new Date(result.completedAt) }
|
|
586
|
-
: {})), (result.ingestedCount
|
|
587
|
-
? { lastEventIngestedAt: new Date(result.completedAt) }
|
|
588
|
-
: {})),
|
|
589
|
-
props: { isRoot: true },
|
|
590
|
-
});
|
|
591
|
-
}
|
|
592
|
-
else if (options.type === "backfill" && result.ingestedCount) {
|
|
593
|
-
await GoogleSecOpsConnectionService.updateOneById({
|
|
594
|
-
id: connection.id,
|
|
595
|
-
data: { lastEventIngestedAt: new Date(result.completedAt) },
|
|
596
|
-
props: { isRoot: true },
|
|
597
|
-
});
|
|
598
|
-
}
|
|
599
|
-
return result;
|
|
600
|
-
}
|
|
601
|
-
/*
|
|
602
|
-
* Where a scheduled poll leaves its cursor and how long the next chunk is.
|
|
603
|
-
* Google's search endpoints return newest first, so a poll that stops
|
|
604
|
-
* early has no "everything before here was read" point to resume from;
|
|
605
|
-
* the only ways forward are a shorter window and, at one minute, moving
|
|
606
|
-
* past the minute and reporting it.
|
|
607
|
-
*/
|
|
608
|
-
static decideCursor(window, result) {
|
|
609
|
-
const chunkMinutes = window.chunkMinutes || MAX_CHUNK_MINUTES;
|
|
610
|
-
const requestedChunkMinutes = window.requestedChunkMinutes || MAX_CHUNK_MINUTES;
|
|
611
|
-
/*
|
|
612
|
-
* A first poll that does not finish keeps its original start. Otherwise
|
|
613
|
-
* the next default lookback would slide past records before we ever
|
|
614
|
-
* imported them.
|
|
615
|
-
*/
|
|
616
|
-
const heldCursor = window.hasUsableCursor
|
|
617
|
-
? undefined
|
|
618
|
-
: OneUptimeDate.addRemoveMinutes(window.startTime, WINDOW_OVERLAP_IN_MINUTES).toISOString();
|
|
619
|
-
/*
|
|
620
|
-
* Failed and finished polls work from the requested chunk, not from the
|
|
621
|
-
* window read: a caught-up window is only as long as the gap to now, and
|
|
622
|
-
* keeping that as the next chunk would make polls after an outage or a
|
|
623
|
-
* failure fall behind the present for no reason.
|
|
624
|
-
*/
|
|
625
|
-
if (result.status === "failed") {
|
|
626
|
-
// A failure says nothing about volume, so the chunk is kept as it was.
|
|
627
|
-
return {
|
|
628
|
-
cursor: heldCursor,
|
|
629
|
-
nextChunkMinutes: requestedChunkMinutes,
|
|
630
|
-
forcedAdvance: false,
|
|
631
|
-
};
|
|
632
|
-
}
|
|
633
|
-
if (result.complete) {
|
|
634
|
-
// A finished poll never shrinks the chunk; it doubles back after narrowing.
|
|
635
|
-
return {
|
|
636
|
-
cursor: result.windowEnd,
|
|
637
|
-
nextChunkMinutes: Math.min(MAX_CHUNK_MINUTES, Math.max(requestedChunkMinutes, chunkMinutes * 2)),
|
|
638
|
-
forcedAdvance: false,
|
|
639
|
-
};
|
|
640
|
-
}
|
|
641
|
-
if (chunkMinutes > MIN_CHUNK_MINUTES) {
|
|
642
|
-
const nextChunkMinutes = Math.max(MIN_CHUNK_MINUTES, Math.floor(chunkMinutes / 2));
|
|
643
|
-
return {
|
|
644
|
-
cursor: heldCursor,
|
|
645
|
-
nextChunkMinutes,
|
|
646
|
-
forcedAdvance: false,
|
|
647
|
-
warning: `This window holds more records than one poll can read; the next poll reads a ${nextChunkMinutes} minute window from the same starting point.`,
|
|
648
|
-
};
|
|
649
|
-
}
|
|
650
|
-
/*
|
|
651
|
-
* One minute that still cannot be read. Holding here would stall polling
|
|
652
|
-
* for good, so the cursor moves past the minute and the gap is reported
|
|
653
|
-
* loudly with the way to recover it.
|
|
654
|
-
*/
|
|
655
|
-
const from = window.chunkBase || window.startTime;
|
|
656
|
-
return {
|
|
657
|
-
cursor: result.windowEnd,
|
|
658
|
-
nextChunkMinutes: MIN_CHUNK_MINUTES,
|
|
659
|
-
forcedAdvance: true,
|
|
660
|
-
warning: `More records were created in the one minute from ${from.toISOString()} to ${result.windowEnd} than one poll can read. Polling moved past this minute so newer records keep arriving; use Import this time range in Diagnostics on this minute to recover what one run can read.`,
|
|
661
|
-
};
|
|
662
|
-
}
|
|
663
|
-
/*
|
|
664
|
-
* One diagnostic check per read pass. A pass a budget stopped, or never
|
|
665
|
-
* let start, is a warning naming the budget, never a success: a green
|
|
666
|
-
* step that did not read its window hid which data went unread.
|
|
667
|
-
*/
|
|
668
|
-
static recordPass(data) {
|
|
669
|
-
const outcome = data.outcome;
|
|
670
|
-
let status = "success";
|
|
671
|
-
let message = data.successMessage || data.countMessage;
|
|
672
|
-
if (outcome.stoppedBy === "time" && outcome.requests === 0) {
|
|
673
|
-
status = "warn";
|
|
674
|
-
message = "Not run: the poll time budget was spent.";
|
|
675
|
-
this.addWarning(data.result, `${data.name} was not run: the poll time budget was spent.`);
|
|
676
|
-
}
|
|
677
|
-
else if (outcome.stoppedBy) {
|
|
678
|
-
status = "warn";
|
|
679
|
-
const budgetName = outcome.stoppedBy === "time" ? "poll time budget" : "request budget";
|
|
680
|
-
const stop = `stopped by the ${budgetName} after ${outcome.requests} ${outcome.requests === 1 ? "request" : "requests"}`;
|
|
681
|
-
message =
|
|
682
|
-
outcome.requests === 0
|
|
683
|
-
? `Not run: ${stop}. The search passes share one page budget and it was spent before this pass started.`
|
|
684
|
-
: `${data.countMessage} The pass was ${stop}.`;
|
|
685
|
-
this.addWarning(data.result, `${data.name} was ${stop}.`);
|
|
686
|
-
}
|
|
687
|
-
else if (outcome.leftUnread) {
|
|
688
|
-
status = "warn";
|
|
689
|
-
message = `${data.countMessage} Google did not return part of the window.`;
|
|
690
|
-
}
|
|
691
|
-
data.result.checks.push({
|
|
692
|
-
name: data.name,
|
|
693
|
-
status,
|
|
694
|
-
durationMs: Date.now() - data.startedMs,
|
|
695
|
-
message,
|
|
696
|
-
});
|
|
697
|
-
}
|
|
698
|
-
/*
|
|
699
|
-
* The alerts-view pass (legacyFetchAlertsView, detection time). The
|
|
700
|
-
* endpoint has no pagination, so a truncated window is split in half and
|
|
701
|
-
* both halves are re-read until they fit or the alerts-view budget runs
|
|
702
|
-
* out.
|
|
703
|
-
*/
|
|
704
|
-
static async fetchWindows(client, window, result, budget, seen) {
|
|
705
|
-
const outcome = {
|
|
706
|
-
returned: 0,
|
|
707
|
-
requests: 0,
|
|
708
|
-
stoppedBy: null,
|
|
709
|
-
leftUnread: false,
|
|
710
|
-
};
|
|
711
|
-
const pending = [
|
|
712
|
-
{ startTime: window.startTime, endTime: window.endTime },
|
|
713
|
-
];
|
|
714
|
-
let splits = 0;
|
|
715
|
-
while (pending.length > 0) {
|
|
716
|
-
const stop = this.budgetStop(budget, budget.alertsViewRequests, MAX_ALERTS_VIEW_REQUESTS_PER_POLL);
|
|
717
|
-
if (stop) {
|
|
718
|
-
outcome.stoppedBy = stop;
|
|
719
|
-
result.complete = false;
|
|
720
|
-
break;
|
|
721
|
-
}
|
|
722
|
-
const current = pending.shift();
|
|
723
|
-
budget.alertsViewRequests++;
|
|
724
|
-
outcome.requests++;
|
|
725
|
-
result.requestCount++;
|
|
726
|
-
const fetched = await client.fetchDetectionAlerts({
|
|
727
|
-
startTime: current.startTime,
|
|
728
|
-
endTime: current.endTime,
|
|
729
|
-
maxAlerts: result.type === "test" ? 1 : MAX_ALERTS_PER_REQUEST,
|
|
730
|
-
includeNonAlertingDetections: result.includeNonAlertingDetections,
|
|
731
|
-
});
|
|
732
|
-
outcome.returned += fetched.alerts.length;
|
|
733
|
-
for (const alert of fetched.alerts) {
|
|
734
|
-
this.collect(seen, alert, result);
|
|
735
|
-
}
|
|
736
|
-
result.fetchedCount = seen.size;
|
|
737
|
-
const truncated = fetched.truncatedByCount ||
|
|
738
|
-
fetched.truncatedByBytes ||
|
|
739
|
-
Math.max(fetched.filteredAlertsCount, fetched.baselineAlertsCount) >
|
|
740
|
-
fetched.alerts.length;
|
|
741
|
-
if (result.type === "test") {
|
|
742
|
-
/*
|
|
743
|
-
* A one-record permission probe is deliberately limited; it makes no
|
|
744
|
-
* assertion about whether the full detection window can be imported.
|
|
745
|
-
*/
|
|
746
|
-
result.complete = result.complete && fetched.complete;
|
|
747
|
-
if (truncated) {
|
|
748
|
-
result.warnings.push("Connection test reads at most one detection. Use Preview to inspect the full time range.");
|
|
749
|
-
}
|
|
750
|
-
if (!fetched.complete) {
|
|
751
|
-
result.warnings.push("Google returned an incomplete response. Connectivity works, but a complete read is not confirmed.");
|
|
752
|
-
}
|
|
753
|
-
break;
|
|
754
|
-
}
|
|
755
|
-
const midpoint = Math.floor((current.startTime.getTime() + current.endTime.getTime()) / 2);
|
|
756
|
-
if (truncated &&
|
|
757
|
-
current.endTime.getTime() - current.startTime.getTime() > 1000) {
|
|
758
|
-
splits++;
|
|
759
|
-
pending.unshift({ startTime: current.startTime, endTime: new Date(midpoint) }, { startTime: new Date(midpoint), endTime: current.endTime });
|
|
760
|
-
}
|
|
761
|
-
else if (!fetched.complete || truncated) {
|
|
762
|
-
result.complete = false;
|
|
763
|
-
outcome.leftUnread = true;
|
|
764
|
-
this.addWarning(result, truncated
|
|
765
|
-
? "Google still truncated a one-second window of the alerts view, so some alerts in it were not read."
|
|
766
|
-
: "Google ended an alerts view response without confirming it was complete.");
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
if (splits > 0) {
|
|
770
|
-
// One line rather than one per split: lastError joins every warning.
|
|
771
|
-
result.warnings.push(`Google limited the alerts view response for ${window.startTime.toISOString()} to ${window.endTime.toISOString()}, so it was split into smaller windows ${splits} ${splits === 1 ? "time" : "times"}.`);
|
|
772
|
-
}
|
|
773
|
-
return outcome;
|
|
774
|
-
}
|
|
775
|
-
/*
|
|
776
|
-
* A detections-search pass (legacySearchDetections or the curated
|
|
777
|
-
* variant), one basis at a time, following nextPageToken under the page
|
|
778
|
-
* budget the two search passes share.
|
|
779
|
-
*/
|
|
780
|
-
static async searchPass(client, window, result, budget, seen, options) {
|
|
781
|
-
const label = options.curated
|
|
782
|
-
? "curated rule detections"
|
|
783
|
-
: "rule detections";
|
|
784
|
-
const outcome = {
|
|
785
|
-
returned: 0,
|
|
786
|
-
requests: 0,
|
|
787
|
-
stoppedBy: null,
|
|
788
|
-
leftUnread: false,
|
|
789
|
-
};
|
|
790
|
-
for (const listBasis of options.bases) {
|
|
791
|
-
let pageToken = undefined;
|
|
792
|
-
do {
|
|
793
|
-
const stop = this.budgetStop(budget, budget.searchRequests, MAX_SEARCH_PAGES_PER_POLL);
|
|
794
|
-
if (stop) {
|
|
795
|
-
outcome.stoppedBy = stop;
|
|
796
|
-
result.complete = false;
|
|
797
|
-
return outcome;
|
|
798
|
-
}
|
|
799
|
-
budget.searchRequests++;
|
|
800
|
-
outcome.requests++;
|
|
801
|
-
result.requestCount++;
|
|
802
|
-
const page = await client.searchDetections({
|
|
803
|
-
startTime: window.startTime,
|
|
804
|
-
endTime: window.endTime,
|
|
805
|
-
listBasis,
|
|
806
|
-
alertingOnly: !result.includeNonAlertingDetections,
|
|
807
|
-
pageSize: result.type === "test" ? 1 : MAX_SEARCH_PAGE_SIZE,
|
|
808
|
-
pageToken,
|
|
809
|
-
curated: options.curated,
|
|
810
|
-
});
|
|
811
|
-
outcome.returned += page.detections.length;
|
|
812
|
-
for (const detection of page.detections) {
|
|
813
|
-
this.collect(seen, detection, result);
|
|
814
|
-
}
|
|
815
|
-
result.fetchedCount = seen.size;
|
|
816
|
-
if (page.truncated) {
|
|
817
|
-
/*
|
|
818
|
-
* respTooLargeDetectionsTruncated: Google cut the page by byte
|
|
819
|
-
* size and the rest is not reachable through a page token, so the
|
|
820
|
-
* window is not fully read.
|
|
821
|
-
*/
|
|
822
|
-
result.complete = false;
|
|
823
|
-
outcome.leftUnread = true;
|
|
824
|
-
this.addWarning(result, `Google truncated a page of ${label} by size for ${window.startTime.toISOString()} to ${window.endTime.toISOString()}, so part of the window was not read.`);
|
|
825
|
-
}
|
|
826
|
-
if (result.type === "test") {
|
|
827
|
-
// One record per pass is all a permission probe needs.
|
|
828
|
-
return outcome;
|
|
829
|
-
}
|
|
830
|
-
pageToken = page.nextPageToken || undefined;
|
|
831
|
-
} while (pageToken);
|
|
832
|
-
}
|
|
833
|
-
return outcome;
|
|
834
|
-
}
|
|
835
|
-
/*
|
|
836
|
-
* Whether a pass may make another request: each kind of read has its own
|
|
837
|
-
* request count, and all of them share the poll's wall-clock bound so a
|
|
838
|
-
* slow endpoint cannot run the worker job into its timeout.
|
|
839
|
-
*/
|
|
840
|
-
static budgetStop(budget, used, limit) {
|
|
841
|
-
if (used >= limit) {
|
|
842
|
-
return "requests";
|
|
843
|
-
}
|
|
844
|
-
if (Date.now() - budget.startedMs >= MAX_FETCH_DURATION_MS) {
|
|
845
|
-
return "time";
|
|
846
|
-
}
|
|
847
|
-
return null;
|
|
848
|
-
}
|
|
849
|
-
// Repeated conditions (every one-second window, every page) are said once.
|
|
850
|
-
static addWarning(result, warning) {
|
|
851
|
-
if (!result.warnings.includes(warning)) {
|
|
852
|
-
result.warnings.push(warning);
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
/*
|
|
856
|
-
* Union by Collection.id across passes and across the alerts view's
|
|
857
|
-
* chunks; a record with no id falls back to a content hash, and an
|
|
858
|
-
* object that cannot even be inspected is kept under a positional key so
|
|
859
|
-
* it is counted as rejected without hiding the valid records beside it.
|
|
860
|
-
*/
|
|
861
|
-
static collect(seen, record, result) {
|
|
862
|
-
let key;
|
|
863
|
-
try {
|
|
864
|
-
key = readString(record, "id") || contentHashEventUid(record);
|
|
865
|
-
}
|
|
866
|
-
catch (_a) {
|
|
867
|
-
key = `malformed:${result.requestCount}:${seen.size}`;
|
|
868
|
-
}
|
|
869
|
-
seen.set(key, record);
|
|
870
|
-
}
|
|
871
|
-
/*
|
|
872
|
-
* createdTime minus detectionTime over what was fetched. A lag beyond one
|
|
873
|
-
* poll interval is the record a detection-time cursor skips, so the
|
|
874
|
-
* warning names the reason polling reads created time.
|
|
875
|
-
*/
|
|
876
|
-
static measureCreationLag(alerts, connection, result) {
|
|
877
|
-
var _a, _b;
|
|
878
|
-
const intervalInMinutes = Math.max(1, connection.pollIntervalInMinutes || DEFAULT_POLL_INTERVAL_IN_MINUTES);
|
|
879
|
-
const thresholdInMinutes = intervalInMinutes + CREATION_LAG_GRACE_IN_MINUTES;
|
|
880
|
-
let measured = 0;
|
|
881
|
-
let lateCount = 0;
|
|
882
|
-
let maxLagMs = 0;
|
|
883
|
-
for (const alert of alerts) {
|
|
884
|
-
let detectionTime = null;
|
|
885
|
-
let createdTime = null;
|
|
886
|
-
try {
|
|
887
|
-
detectionTime = parseEventTime((_a = readValue(alert, "detectionTime")) !== null && _a !== void 0 ? _a : readValue(alert, "detection_time"));
|
|
888
|
-
createdTime = parseEventTime((_b = readValue(alert, "createdTime")) !== null && _b !== void 0 ? _b : readValue(alert, "created_time"));
|
|
889
|
-
}
|
|
890
|
-
catch (_c) {
|
|
891
|
-
continue;
|
|
892
|
-
}
|
|
893
|
-
if (!detectionTime || !createdTime) {
|
|
894
|
-
continue;
|
|
895
|
-
}
|
|
896
|
-
measured++;
|
|
897
|
-
const lagMs = createdTime.getTime() - detectionTime.getTime();
|
|
898
|
-
if (lagMs > maxLagMs) {
|
|
899
|
-
maxLagMs = lagMs;
|
|
900
|
-
}
|
|
901
|
-
if (lagMs > thresholdInMinutes * 60 * 1000) {
|
|
902
|
-
lateCount++;
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
const lag = {
|
|
906
|
-
measured,
|
|
907
|
-
lateCount,
|
|
908
|
-
maxLagMinutes: Math.round(maxLagMs / 60000),
|
|
909
|
-
};
|
|
910
|
-
if (lateCount > 0) {
|
|
911
|
-
result.warnings.push(`${lateCount} of ${measured} detections were created more than ${thresholdInMinutes} minutes after their detection time (up to ${lag.maxLagMinutes} minutes). This is why the connector polls by created time: a cursor over detection time would already have moved past them.`);
|
|
912
|
-
}
|
|
913
|
-
return lag;
|
|
914
|
-
}
|
|
915
|
-
static sample(alert, event) {
|
|
916
|
-
var _a, _b, _c, _d;
|
|
917
|
-
const detectionTime = parseEventTime((_a = readValue(alert, "detectionTime")) !== null && _a !== void 0 ? _a : readValue(alert, "detection_time"));
|
|
918
|
-
const createdTime = parseEventTime((_b = readValue(alert, "createdTime")) !== null && _b !== void 0 ? _b : readValue(alert, "created_time"));
|
|
919
|
-
const detection = readValue(alert, "detection");
|
|
920
|
-
const entry = Array.isArray(detection)
|
|
921
|
-
? detection[0]
|
|
922
|
-
: detection;
|
|
923
|
-
const isAlert = entry
|
|
924
|
-
? (_d = (_c = entry["alertState"]) !== null && _c !== void 0 ? _c : entry["alert_state"]) !== null && _d !== void 0 ? _d : entry["alerting"]
|
|
925
|
-
: undefined;
|
|
926
|
-
return Object.assign(Object.assign(Object.assign({ id: redactLogString(event.eventUid), ruleName: redactLogString(event.ruleName) }, (detectionTime ? { detectionTime: detectionTime.toISOString() } : {})), (createdTime ? { createdTime: createdTime.toISOString() } : {})), (typeof isAlert === "boolean"
|
|
927
|
-
? { isAlert }
|
|
928
|
-
: isAlert === "ALERTING"
|
|
929
|
-
? { isAlert: true }
|
|
930
|
-
: isAlert === "NOT_ALERTING" || isAlert === "NON_ALERTING"
|
|
931
|
-
? { isAlert: false }
|
|
932
|
-
: {}));
|
|
933
|
-
}
|
|
934
|
-
/**
|
|
935
|
-
* Thin delegate kept as a static on this class: existing tests spy on it,
|
|
936
|
-
* and the query itself now lives in SecurityEventDedupe so the Google
|
|
937
|
-
* poller and the Security Event Connections poller cannot drift.
|
|
938
|
-
*/
|
|
939
|
-
static async findExistingEventUids(projectId, ids) {
|
|
940
|
-
return SecurityEventDedupe.findExistingEventUids({
|
|
941
|
-
projectId,
|
|
942
|
-
vendorName: SECOPS_VENDOR_NAME,
|
|
943
|
-
productName: SECOPS_SERVICE_NAME,
|
|
944
|
-
ids,
|
|
945
|
-
});
|
|
946
|
-
}
|
|
947
|
-
static async ingest(connection, normalized, result) {
|
|
948
|
-
if (!normalized.length) {
|
|
949
|
-
return;
|
|
950
|
-
}
|
|
951
|
-
const seen = new Set();
|
|
952
|
-
const unique = normalized.filter((event) => {
|
|
953
|
-
if (seen.has(event.eventUid)) {
|
|
954
|
-
result.duplicateCount++;
|
|
955
|
-
return false;
|
|
956
|
-
}
|
|
957
|
-
seen.add(event.eventUid);
|
|
958
|
-
return true;
|
|
959
|
-
});
|
|
960
|
-
const existing = await this.findExistingEventUids(connection.projectId, unique.map((event) => {
|
|
961
|
-
return event.eventUid;
|
|
962
|
-
}));
|
|
963
|
-
const fresh = unique.filter((event) => {
|
|
964
|
-
if (existing.has(event.eventUid)) {
|
|
965
|
-
result.duplicateCount++;
|
|
966
|
-
return false;
|
|
967
|
-
}
|
|
968
|
-
return true;
|
|
969
|
-
});
|
|
970
|
-
if (!fresh.length) {
|
|
971
|
-
return;
|
|
972
|
-
}
|
|
973
|
-
const serviceMetadata = await OTelIngestService.telemetryServiceFromName({
|
|
974
|
-
serviceName: SECOPS_SERVICE_NAME,
|
|
975
|
-
projectId: connection.projectId,
|
|
976
|
-
});
|
|
977
|
-
const retentionDays = resolveTelemetryRetentionInDays({
|
|
978
|
-
pillar: "securityEvents",
|
|
979
|
-
serviceConfig: serviceMetadata.serviceRetentionConfig,
|
|
980
|
-
serviceRetentionInDays: serviceMetadata.serviceRetentionInDays,
|
|
981
|
-
projectConfig: serviceMetadata.projectRetentionConfig,
|
|
982
|
-
projectRetentionInDays: serviceMetadata.projectRetentionInDays,
|
|
983
|
-
});
|
|
984
|
-
await ThreatIntelEnricher.enrichNormalizedEvents({
|
|
985
|
-
projectId: connection.projectId,
|
|
986
|
-
events: fresh,
|
|
987
|
-
});
|
|
988
|
-
const rows = fresh.map((event) => {
|
|
989
|
-
event.attributes["oneuptime.google_secops.connection_id"] =
|
|
990
|
-
connection.id.toString();
|
|
991
|
-
return buildSecurityEventDbRow({
|
|
992
|
-
normalized: event,
|
|
993
|
-
projectId: connection.projectId,
|
|
994
|
-
serviceMetadata,
|
|
995
|
-
retentionDays,
|
|
996
|
-
});
|
|
997
|
-
});
|
|
998
|
-
/*
|
|
999
|
-
* The source lock cannot be released before buffered writes are visible.
|
|
1000
|
-
* This low-volume connector needs synchronous acknowledgements regardless
|
|
1001
|
-
* of the high-volume telemetry ingestion defaults.
|
|
1002
|
-
*/
|
|
1003
|
-
await SecurityEventService.insertJsonRows(rows, {
|
|
1004
|
-
clickhouseSettings: { async_insert: 0, insert_distributed_sync: 1 },
|
|
1005
|
-
});
|
|
1006
|
-
result.ingestedCount = rows.length;
|
|
1007
|
-
const times = rows
|
|
1008
|
-
.map((row) => {
|
|
1009
|
-
return new Date(String(row["time"]).replace(" ", "T") + "Z").toISOString();
|
|
1010
|
-
})
|
|
1011
|
-
.sort();
|
|
1012
|
-
result.eventTimeStart = times[0];
|
|
1013
|
-
result.eventTimeEnd = times[times.length - 1];
|
|
1014
|
-
}
|
|
1015
|
-
}
|
|
1016
|
-
__decorate([
|
|
1017
|
-
CaptureSpan(),
|
|
1018
|
-
__metadata("design:type", Function),
|
|
1019
|
-
__metadata("design:paramtypes", []),
|
|
1020
|
-
__metadata("design:returntype", Promise)
|
|
1021
|
-
], GoogleSecOpsPoller, "pollAllDueConnections", null);
|
|
1022
|
-
__decorate([
|
|
1023
|
-
CaptureSpan(),
|
|
1024
|
-
__metadata("design:type", Function),
|
|
1025
|
-
__metadata("design:paramtypes", [GoogleSecOpsConnection, Object]),
|
|
1026
|
-
__metadata("design:returntype", Promise)
|
|
1027
|
-
], GoogleSecOpsPoller, "pollConnection", null);
|
|
1028
|
-
__decorate([
|
|
1029
|
-
CaptureSpan(),
|
|
1030
|
-
__metadata("design:type", Function),
|
|
1031
|
-
__metadata("design:paramtypes", [GoogleSecOpsConnection, Object, Object]),
|
|
1032
|
-
__metadata("design:returntype", Promise)
|
|
1033
|
-
], GoogleSecOpsPoller, "executeConnection", null);
|
|
1034
|
-
//# sourceMappingURL=GoogleSecOpsPoller.js.map
|