@oneuptime/common 12.0.24 → 12.0.26
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/Index.ts +2 -0
- package/Models/AnalyticsModels/Span.ts +101 -0
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +413 -0
- package/Models/DatabaseModels/AlertSeverity.ts +4 -1
- package/Models/DatabaseModels/CephClusterFeed.ts +625 -0
- package/Models/DatabaseModels/CloudResourceFeed.ts +625 -0
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +13 -0
- package/Models/DatabaseModels/DetectionRule.ts +9 -3
- package/Models/DatabaseModels/DockerHostFeed.ts +625 -0
- package/Models/DatabaseModels/DockerSwarmClusterFeed.ts +628 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +9 -3
- package/Models/DatabaseModels/HostFeed.ts +625 -0
- package/Models/DatabaseModels/IncidentSeverity.ts +4 -1
- package/Models/DatabaseModels/Index.ts +22 -0
- package/Models/DatabaseModels/KubernetesClusterFeed.ts +628 -0
- package/Models/DatabaseModels/Monitor.ts +87 -0
- package/Models/DatabaseModels/NetworkDevice.ts +96 -5
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +92 -6
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +301 -31
- package/Models/DatabaseModels/NetworkSite.ts +120 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
- package/Models/DatabaseModels/PodmanHostFeed.ts +625 -0
- package/Models/DatabaseModels/ProxmoxClusterFeed.ts +626 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +67 -0
- package/Models/DatabaseModels/ServiceFeed.ts +625 -0
- package/Models/DatabaseModels/TelemetrySourceMap.ts +474 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +758 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +1 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +1 -0
- package/Models/DatabaseModels/UserWebAuthn.ts +1 -0
- package/Server/API/AlertAPI.ts +23 -1
- package/Server/API/BaseAPI.ts +14 -27
- package/Server/API/IncidentAPI.ts +41 -1
- package/Server/API/IncidentEpisodeAPI.ts +23 -1
- package/Server/API/MicrosoftTeamsAPI.ts +31 -2
- package/Server/API/ScheduledMaintenanceAPI.ts +23 -1
- package/Server/API/SlackAPI.ts +48 -2
- package/Server/API/TelemetryAPI.ts +167 -42
- package/Server/API/UserOnCallLogTimelineAPI.ts +75 -61
- package/Server/API/UserTotpAuthAPI.ts +67 -1
- package/Server/API/UserWebAuthnAPI.ts +44 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.ts +57 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.ts +54 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.ts +489 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +18 -0
- package/Server/Middleware/IdentityRateLimit.ts +53 -3
- package/Server/Middleware/SlackAuthorization.ts +96 -18
- package/Server/Services/AIService.ts +181 -41
- package/Server/Services/CephClusterFeedService.ts +99 -0
- package/Server/Services/CephClusterLabelRuleEngineService.ts +29 -0
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/CephClusterOwnerTeamService.ts +129 -0
- package/Server/Services/CephClusterOwnerUserService.ts +123 -0
- package/Server/Services/CephClusterService.ts +223 -2
- package/Server/Services/CloudResourceFeedService.ts +99 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +30 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +33 -0
- package/Server/Services/CloudResourceOwnerTeamService.ts +129 -0
- package/Server/Services/CloudResourceOwnerUserService.ts +123 -0
- package/Server/Services/CloudResourceService.ts +227 -2
- package/Server/Services/DatabaseService.ts +265 -0
- package/Server/Services/DockerHostFeedService.ts +99 -0
- package/Server/Services/DockerHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/DockerHostOwnerTeamService.ts +129 -0
- package/Server/Services/DockerHostOwnerUserService.ts +123 -0
- package/Server/Services/DockerHostService.ts +227 -2
- package/Server/Services/DockerSwarmClusterFeedService.ts +102 -0
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +133 -0
- package/Server/Services/DockerSwarmClusterOwnerUserService.ts +127 -0
- package/Server/Services/DockerSwarmClusterService.ts +229 -2
- package/Server/Services/EnterpriseLicenseService.ts +15 -7
- package/Server/Services/ExceptionAggregationService.ts +12 -2
- package/Server/Services/HostFeedService.ts +99 -0
- package/Server/Services/HostLabelRuleEngineService.ts +29 -0
- package/Server/Services/HostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/HostOwnerTeamService.ts +129 -0
- package/Server/Services/HostOwnerUserService.ts +123 -0
- package/Server/Services/HostService.ts +215 -2
- package/Server/Services/IncidentService.ts +11 -0
- package/Server/Services/Index.ts +24 -0
- package/Server/Services/KubernetesClusterFeedService.ts +99 -0
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/KubernetesClusterOwnerTeamService.ts +133 -0
- package/Server/Services/KubernetesClusterOwnerUserService.ts +127 -0
- package/Server/Services/KubernetesClusterService.ts +231 -2
- package/Server/Services/LogAggregationService.ts +23 -280
- package/Server/Services/MetricAggregationService.ts +98 -1
- package/Server/Services/MonitorService.ts +177 -13
- package/Server/Services/MonitorTemplateService.ts +111 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +777 -86
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +199 -16
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +1055 -14
- package/Server/Services/NetworkDeviceService.ts +750 -4
- package/Server/Services/NetworkInterfaceService.ts +415 -0
- package/Server/Services/NetworkSiteService.ts +485 -52
- package/Server/Services/PodmanHostFeedService.ts +99 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/PodmanHostOwnerTeamService.ts +129 -0
- package/Server/Services/PodmanHostOwnerUserService.ts +123 -0
- package/Server/Services/PodmanHostService.ts +227 -2
- package/Server/Services/ProjectService.ts +16 -10
- package/Server/Services/ProxmoxClusterFeedService.ts +99 -0
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/ProxmoxClusterOwnerTeamService.ts +131 -0
- package/Server/Services/ProxmoxClusterOwnerUserService.ts +124 -0
- package/Server/Services/ProxmoxClusterService.ts +225 -2
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +61 -0
- package/Server/Services/ServiceFeedService.ts +99 -0
- package/Server/Services/ServiceLabelRuleEngineService.ts +29 -0
- package/Server/Services/ServiceOwnerRuleEngineService.ts +26 -0
- package/Server/Services/ServiceOwnerTeamService.ts +129 -0
- package/Server/Services/ServiceOwnerUserService.ts +123 -0
- package/Server/Services/ServiceService.ts +227 -3
- package/Server/Services/StatusPageSubscriberService.ts +7 -0
- package/Server/Services/TelemetryAttributeService.ts +13 -3
- package/Server/Services/TelemetrySourceMapService.ts +307 -0
- package/Server/Services/ThreatIntelFeedService.ts +222 -0
- package/Server/Services/ThreatIntelIndicatorService.ts +428 -0
- package/Server/Services/TraceAggregationService.ts +101 -11
- package/Server/Services/UserService.ts +13 -6
- package/Server/Services/UserTwoFactorBackupCodeService.ts +127 -0
- package/Server/Services/UserWebhookService.ts +11 -2
- package/Server/Static/Brand/README.md +38 -0
- package/Server/Static/Brand/favicons/apple-touch-icon.png +0 -0
- package/Server/Static/Brand/favicons/favicon-16x16.png +0 -0
- package/Server/Static/Brand/favicons/favicon-32x32.png +0 -0
- package/Server/Static/Brand/favicons/favicon.ico +0 -0
- package/Server/Static/Brand/favicons/safari-pinned-tab.svg +31 -0
- package/Server/Static/Brand/hou-wb.svg +1 -0
- package/Server/Static/Brand/oneuptime-logo.svg +1 -0
- package/Server/Static/Brand/ou-wb.svg +1 -0
- package/Server/Static/Vendor/README.md +4 -0
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +13 -3
- package/Server/Types/Database/AggregateBy.ts +83 -0
- package/Server/Types/Database/AggregateResultUtil.ts +126 -0
- package/Server/Types/Database/JSONColumnQuery.ts +18 -0
- package/Server/Types/Database/QueryHelper.ts +40 -0
- package/Server/Types/Database/QueryUtil.ts +26 -0
- package/Server/Types/Workflow/Components/API/Utils.ts +10 -1
- package/Server/Types/Workflow/Components/JavaScript.ts +8 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +9 -0
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +18 -0
- package/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.ts +422 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +176 -0
- package/Server/Utils/DataSource/HttpFetch.ts +18 -0
- package/Server/Utils/Database/RelationIdUtil.ts +42 -0
- package/Server/Utils/Marketing/MarketingEventUtil.ts +38 -9
- package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +34 -3
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +9 -1
- package/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts +28 -10
- package/Server/Utils/Monitor/MonitorAlert.ts +541 -332
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +330 -64
- package/Server/Utils/Monitor/MonitorIncident.ts +640 -434
- package/Server/Utils/Monitor/MonitorResource.ts +226 -49
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +46 -3
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +23 -102
- package/Server/Utils/Monitor/PerEntityCriteriaFanOut.ts +329 -0
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +427 -0
- package/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.ts +310 -0
- package/Server/Utils/OnCallNotificationContext.ts +686 -0
- package/Server/Utils/PrivateNetworkWebhookConfig.ts +549 -0
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +139 -0
- package/Server/Utils/Response.ts +11 -1
- package/Server/Utils/SSRFProtection.ts +230 -60
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +106 -0
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +84 -284
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +47 -20
- package/Server/Utils/SecurityEvent/SecurityEventAlerting.ts +318 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.ts +199 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.ts +252 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +739 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +533 -0
- package/Server/Utils/StartServer.ts +83 -56
- package/Server/Utils/StatusPageSubscriberWebhook.ts +3 -0
- package/Server/Utils/Telemetry/LlmMetricSpend.ts +56 -5
- package/Server/Utils/Telemetry/LlmSpan.ts +46 -0
- package/Server/Utils/Telemetry/SourceMapResolver.ts +480 -0
- package/Server/Utils/TwoFactorBackupCodeNotification.ts +106 -0
- package/Server/Utils/VM/VMAPI.ts +3 -0
- package/Server/Utils/VM/VMRunner.ts +27 -1
- package/Server/Utils/VendorAssets.ts +42 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +136 -6
- package/Server/Utils/Workspace/Slack/Actions/Auth.ts +0 -12
- package/Server/Views/AcknowledgeUserOnCallNotification.ejs +11 -9
- package/Server/Views/Partials/Head.ejs +9 -9
- package/Server/Views/Partials/OnCallNotificationDetails.ejs +48 -0
- package/Server/Views/ViewMessage.ejs +11 -9
- package/Tests/App/Accounts/LoginTwoFactorRecovery.test.tsx +972 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +401 -0
- package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +707 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +1908 -18
- package/Tests/App/Dashboard/LlmCallsTableIdentity.test.tsx +322 -0
- package/Tests/App/Dashboard/LlmOverview.test.tsx +335 -0
- package/Tests/App/Dashboard/LlmSpanDisplay.test.ts +391 -0
- package/Tests/App/Dashboard/LlmUsageBreakdown.test.tsx +1007 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +230 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +216 -0
- package/Tests/App/Dashboard/TopologyAddToMonitoring.test.tsx +192 -0
- package/Tests/App/Dashboard/WorkspaceNotificationRuleConditions.test.tsx +439 -0
- package/Tests/Models/DatabaseModels/DateColumnDeserialization.test.ts +182 -0
- package/Tests/Models/DatabaseModels/RelationColumnModelTypeCoverage.test.ts +82 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +398 -0
- package/Tests/Models/DiscoveryScanNameColumn.test.ts +151 -16
- package/Tests/Models/DiscoveryScanSnmpEnabledColumn.test.ts +593 -0
- package/Tests/Models/NetworkDeviceCreateContract.test.ts +102 -0
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +607 -0
- package/Tests/Server/API/AIGenerationRequestBudget.test.ts +355 -0
- package/Tests/Server/API/AIKillSwitchBackstop.test.ts +602 -0
- package/Tests/Server/API/BaseAPI.test.ts +41 -0
- package/Tests/Server/API/BaseAPIUpdateDateColumns.test.ts +154 -0
- package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +9 -16
- package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +335 -0
- package/Tests/Server/API/UserOnCallLogTimelineAcknowledgePage.test.ts +611 -0
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +498 -4
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +682 -0
- package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +595 -0
- package/Tests/Server/Middleware/SlackAuthorization.test.ts +262 -5
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +9 -0
- package/Tests/Server/Services/AIServiceProjectAccess.test.ts +6 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +18 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +590 -0
- package/Tests/Server/Services/DatabaseServiceUpdateWriteRouting.test.ts +12 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +162 -26
- package/Tests/Server/Services/EnterpriseLicenseServiceCreate.test.ts +292 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +119 -12
- package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +109 -0
- package/Tests/Server/Services/MetricAggregationAttributeOperators.test.ts +170 -0
- package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +383 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +997 -3
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +830 -0
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +528 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +3141 -1
- package/Tests/Server/Services/NetworkDeviceRegisteredHostnames.test.ts +1023 -0
- package/Tests/Server/Services/NetworkDeviceSiteAssignmentRuleSkip.test.ts +728 -0
- package/Tests/Server/Services/NetworkInterfaceServiceUpsert.test.ts +795 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +903 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +165 -24
- package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +5 -3
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +5 -2
- package/Tests/Server/Services/ResourceCreationFeedWrites.test.ts +304 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +269 -0
- package/Tests/Server/Services/ResourceOwnerFeedWrites.test.ts +245 -0
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +792 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +483 -0
- package/Tests/Server/Services/ThreatIntelFeedService.test.ts +351 -0
- package/Tests/Server/Services/ThreatIntelIndicatorService.test.ts +366 -0
- package/Tests/Server/Services/TraceAggregationAttributeOperators.test.ts +507 -0
- package/Tests/Server/Services/UserTwoFactorBackupCodeGenerateIfNone.test.ts +705 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleOnCallDutyPolicy.test.ts +306 -0
- package/Tests/Server/Types/Database/AggregateResultUtil.test.ts +386 -0
- package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +424 -0
- package/Tests/Server/Types/Database/QueryHelperWildcard.test.ts +142 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentPrivateNetwork.test.ts +163 -0
- package/Tests/Server/Types/Workflow/Components/JavaScriptPrivateNetwork.test.ts +124 -0
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +5 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +39 -1
- package/Tests/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.test.ts +338 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWildcard.test.ts +383 -0
- package/Tests/Server/Utils/Marketing/EmittedMarketingEvent.ts +23 -0
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +51 -0
- package/Tests/Server/Utils/Monitor/Criteria/SyntheticMonitorCriteria.test.ts +259 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +557 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +12 -2
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +404 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +8 -2
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +125 -98
- package/Tests/Server/Utils/Monitor/PerEntityCriteriaFanOut.test.ts +444 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1112 -0
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +717 -0
- package/Tests/Server/Utils/NetworkDevice/RulePatternValidator.test.ts +78 -0
- package/Tests/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.test.ts +363 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +35 -0
- package/Tests/Server/Utils/OnCallNotificationContext.test.ts +908 -0
- package/Tests/Server/Utils/PrivateNetworkWebhookConfig.test.ts +423 -0
- package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +191 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +597 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +381 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +417 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/SecurityEventAlerting.test.ts +246 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.test.ts +282 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.test.ts +312 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.test.ts +854 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.test.ts +437 -0
- package/Tests/Server/Utils/StartServerErrorStatus.test.ts +225 -0
- package/Tests/Server/Utils/StatusPage/MonitorRulePatternValidator.test.ts +62 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhookPrivateNetwork.test.ts +119 -0
- package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +37 -18
- package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +143 -2
- package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +804 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +542 -0
- package/Tests/Server/Utils/TwoFactorBackupCodeNotification.test.ts +272 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +111 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +117 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +101 -4
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstallStateDiagnostics.test.ts +922 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsRosterDiagnosticMessages.test.ts +642 -0
- package/Tests/Server/Views/OnCallAcknowledgePage.test.ts +430 -0
- package/Tests/Types/API/URLQueryString.test.ts +472 -0
- package/Tests/Types/BaseDatabase/Wildcard.test.ts +163 -0
- package/Tests/Types/BaseDatabase/WildcardPattern.test.ts +149 -0
- package/Tests/Types/Database/DateColumnValue.test.ts +265 -0
- package/Tests/Types/DateToIsoStringOrNull.test.ts +67 -0
- package/Tests/Types/Log/LogQueryToFilter.test.ts +218 -43
- package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +225 -0
- package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +296 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +102 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +145 -0
- package/Tests/Types/NetworkSite/SiteHealthRollupPolicy.test.ts +58 -0
- package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +15 -0
- package/Tests/Types/Telemetry/LlmMetricConventions.test.ts +391 -0
- package/Tests/Types/Telemetry/TelemetrySearchQuery.test.ts +620 -0
- package/Tests/Types/WhatsApp/WhatsAppTemplates.test.ts +110 -0
- package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +76 -6
- package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +16 -4
- package/Tests/Types/Workspace/NotificationRules/OnCallDutyPolicyConditions.test.ts +669 -0
- package/Tests/UI/Components/DictionaryFilterOperatorWildcard.test.ts +175 -0
- package/Tests/UI/Components/IconOpticalSize.test.tsx +377 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +332 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsInstallGuidanceContent.test.tsx +643 -0
- package/Tests/Utils/Monitor/InterfaceInventoryUtil.test.ts +824 -0
- package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +626 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +718 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +59 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +287 -2
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +73 -0
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilder.test.ts +317 -0
- package/Tests/Utils/NetworkDiscovery/RescanIntervalUtil.test.ts +262 -0
- package/Tests/Utils/NetworkDiscovery/ScanModeUtil.test.ts +474 -0
- package/Tests/Utils/NetworkDiscovery/SnmpScanConfigUtil.test.ts +2442 -0
- package/Tests/Utils/NetworkSite/SiteMaintenanceUtil.test.ts +188 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +522 -0
- package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +694 -0
- package/Tests/Utils/SecurityEvent/ThreatIntel/StixPatternParser.test.ts +281 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +87 -67
- package/Tests/Utils/Telemetry/LlmMetricQuery.test.ts +298 -0
- package/Types/API/URL.ts +45 -10
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +8 -0
- package/Types/BaseDatabase/NotWildcard.ts +86 -0
- package/Types/BaseDatabase/Wildcard.ts +89 -0
- package/Types/BaseDatabase/WildcardPattern.ts +176 -0
- package/Types/Database/DateColumnValue.ts +184 -0
- package/Types/Database/TableColumn.ts +40 -5
- package/Types/Date.ts +37 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/JSON.ts +8 -0
- package/Types/Log/LogQueryToFilter.ts +167 -129
- package/Types/Monitor/DockerAlertTemplates.ts +43 -12
- package/Types/Monitor/HostAlertTemplates.ts +31 -3
- package/Types/Monitor/KubernetesAlertTemplates.ts +98 -0
- package/Types/Monitor/MonitorStep.ts +49 -0
- package/Types/Monitor/PodmanAlertTemplates.ts +39 -12
- package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +14 -0
- package/Types/Monitor/SnmpMonitor/LldpNeighbor.ts +11 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +11 -4
- package/Types/NetworkAutomation/RuleRunResult.ts +191 -2
- package/Types/NetworkSite/SiteHealthRollupPolicy.ts +96 -0
- package/Types/Permission.ts +411 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +42 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +118 -0
- package/Types/SerializableObjectDictionary.ts +8 -0
- package/Types/Telemetry/LlmConventions.ts +255 -0
- package/Types/Telemetry/LlmMetricConventions.ts +212 -7
- package/Types/Telemetry/SourceMap.ts +56 -0
- package/Types/Telemetry/TelemetrySearchQuery.ts +949 -0
- package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +12 -1
- package/UI/Components/Dictionary/DictionaryFilterOperator.ts +83 -0
- package/UI/Components/Icon/Icon.tsx +28 -1
- package/UI/Components/LogsViewer/components/LogSearchBar.tsx +26 -4
- package/UI/Components/LogsViewer/components/LogSearchHelp.tsx +34 -16
- package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +15 -2
- package/Utils/Metrics/MetricExplorerUrl.ts +77 -15
- package/Utils/Monitor/InterfaceInventoryUtil.ts +251 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +333 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +249 -28
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +14 -6
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +2 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +49 -18
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +215 -0
- package/Utils/NetworkDiscovery/RescanIntervalUtil.ts +148 -0
- package/Utils/NetworkDiscovery/ScanModeUtil.ts +105 -0
- package/Utils/NetworkDiscovery/SnmpScanConfigUtil.ts +827 -0
- package/Utils/NetworkSite/SiteMaintenanceUtil.ts +110 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +350 -19
- package/Utils/NetworkSite/SiteUptimeUtil.ts +422 -21
- package/Utils/SecurityEvent/ThreatIntel/StixPatternParser.ts +383 -0
- package/Utils/Telemetry/CrossSignalScope.ts +37 -39
- package/Utils/Telemetry/LlmMetricQuery.ts +83 -0
- package/build/dist/Models/AnalyticsModels/Index.js +2 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Span.js +89 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +325 -0
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +11 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +9 -3
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +9 -3
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/HostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +22 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Monitor.js +81 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +103 -7
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +91 -6
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +276 -31
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +124 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +66 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ServiceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js +496 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +800 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +1 -0
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +1 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +18 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +11 -20
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +35 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +18 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +30 -2
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +18 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +45 -2
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +100 -35
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +64 -59
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +65 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +42 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js +88 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js +61 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js +179 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +40 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Middleware/SlackAuthorization.js +58 -7
- package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +177 -30
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterFeedService.js +89 -0
- package/build/dist/Server/Services/CephClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +175 -1
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceFeedService.js +89 -0
- package/build/dist/Server/Services/CloudResourceFeedService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +28 -3
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +177 -1
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +201 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostFeedService.js +89 -0
- package/build/dist/Server/Services/DockerHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +177 -1
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js +90 -0
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +175 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +40 -30
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +8 -2
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostFeedService.js +89 -0
- package/build/dist/Server/Services/HostFeedService.js.map +1 -0
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/HostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/HostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +175 -1
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +10 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +24 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterFeedService.js +89 -0
- package/build/dist/Server/Services/KubernetesClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +177 -1
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +19 -196
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +59 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +115 -13
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +86 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +561 -67
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +130 -16
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +850 -8
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +594 -5
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkInterfaceService.js +306 -0
- package/build/dist/Server/Services/NetworkInterfaceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +408 -47
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostFeedService.js +89 -0
- package/build/dist/Server/Services/PodmanHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +177 -1
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +40 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js +89 -0
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +175 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +56 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceFeedService.js +89 -0
- package/build/dist/Server/Services/ServiceFeedService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +24 -0
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ServiceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ServiceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +173 -2
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +7 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryAttributeService.js +9 -3
- package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +265 -0
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js +157 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js +276 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js.map +1 -0
- package/build/dist/Server/Services/TraceAggregationService.js +62 -6
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +22 -13
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js +120 -0
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +11 -2
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +12 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/AggregateBy.js +2 -0
- package/build/dist/Server/Types/Database/AggregateBy.js.map +1 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js +90 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js.map +1 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js +14 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +42 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +18 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js +10 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +8 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +15 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js +266 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +134 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +8 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/Database/RelationIdUtil.js +31 -0
- package/build/dist/Server/Utils/Database/RelationIdUtil.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +26 -8
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +42 -17
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +9 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js +15 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +386 -271
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +278 -64
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +469 -350
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +183 -44
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +46 -3
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +18 -91
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js +194 -0
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js.map +1 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +332 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js +279 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js.map +1 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js +415 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js.map +1 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js +424 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js.map +1 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +108 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +12 -1
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +160 -58
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +89 -0
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +75 -234
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +41 -16
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js +217 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js +103 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js +168 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +527 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +70 -44
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +3 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js +52 -3
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js +24 -1
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +327 -0
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +84 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +10 -1
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +29 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +121 -6
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +0 -10
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
- package/build/dist/Types/API/URL.js +40 -10
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +8 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/BaseDatabase/NotWildcard.js +72 -0
- package/build/dist/Types/BaseDatabase/NotWildcard.js.map +1 -0
- package/build/dist/Types/BaseDatabase/Wildcard.js +75 -0
- package/build/dist/Types/BaseDatabase/Wildcard.js.map +1 -0
- package/build/dist/Types/BaseDatabase/WildcardPattern.js +137 -0
- package/build/dist/Types/BaseDatabase/WildcardPattern.js.map +1 -0
- package/build/dist/Types/Database/DateColumnValue.js +125 -0
- package/build/dist/Types/Database/DateColumnValue.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +18 -2
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Date.js +31 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/JSON.js +2 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/Log/LogQueryToFilter.js +111 -108
- package/build/dist/Types/Log/LogQueryToFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DockerAlertTemplates.js +40 -16
- package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/HostAlertTemplates.js +29 -7
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +98 -4
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +40 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +36 -16
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +90 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js +84 -0
- package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +354 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +100 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -0
- package/build/dist/Types/SerializableObjectDictionary.js +8 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmConventions.js +236 -0
- package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmMetricConventions.js +197 -5
- package/build/dist/Types/Telemetry/LlmMetricConventions.js.map +1 -1
- package/build/dist/Types/Telemetry/SourceMap.js +9 -0
- package/build/dist/Types/Telemetry/SourceMap.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetrySearchQuery.js +661 -0
- package/build/dist/Types/Telemetry/TelemetrySearchQuery.js.map +1 -0
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +12 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +67 -0
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +28 -1
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +25 -4
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js +36 -16
- package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +14 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +54 -9
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
- package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js +128 -0
- package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +190 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +206 -28
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +14 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +34 -18
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +163 -0
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js +99 -0
- package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js +85 -0
- package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js +560 -0
- package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js +56 -0
- package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +185 -10
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +248 -21
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js +255 -0
- package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js.map +1 -0
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +27 -30
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/build/dist/Utils/Telemetry/LlmMetricQuery.js +57 -1
- package/build/dist/Utils/Telemetry/LlmMetricQuery.js.map +1 -1
- package/package.json +2 -1
- package/Tests/Types/Log/LogQueryParser.test.ts +0 -186
- package/Types/Log/LogQueryParser.ts +0 -252
- package/build/dist/Types/Log/LogQueryParser.js +0 -200
- package/build/dist/Types/Log/LogQueryParser.js.map +0 -1
|
@@ -62,6 +62,20 @@ export default class MonitorIncident {
|
|
|
62
62
|
* incidents are treated like any other for dedupe/resolve.
|
|
63
63
|
*/
|
|
64
64
|
breachingSeriesFingerprints?: Set<string> | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* The breaching fingerprints of EACH criteria evaluated on this
|
|
67
|
+
* tick, keyed by criteria id — a criteria that ran and matched
|
|
68
|
+
* nothing maps to an empty set.
|
|
69
|
+
*
|
|
70
|
+
* Without this, "is this series still breaching?" was answered from
|
|
71
|
+
* the winning criteria's set alone, so a host held critical by
|
|
72
|
+
* criteria A silently auto-resolved another host's still-valid
|
|
73
|
+
* incident from criteria B. A criteria absent from this dictionary
|
|
74
|
+
* was not evaluated at all, and its open incidents are left alone.
|
|
75
|
+
*/
|
|
76
|
+
breachingSeriesFingerprintsByCriteriaId?:
|
|
77
|
+
| Dictionary<Set<string>>
|
|
78
|
+
| undefined;
|
|
65
79
|
/**
|
|
66
80
|
* Event-driven (incoming-request / webhook) mode. When true, an open
|
|
67
81
|
* incident carrying a seriesFingerprint is never auto-resolved here —
|
|
@@ -100,6 +114,8 @@ export default class MonitorIncident {
|
|
|
100
114
|
|
|
101
115
|
// check if should close the incident.
|
|
102
116
|
|
|
117
|
+
const resolvedIncidentIds: Set<string> = new Set<string>();
|
|
118
|
+
|
|
103
119
|
for (const openIncident of openIncidents) {
|
|
104
120
|
const shouldClose: boolean = this.shouldCloseIncident({
|
|
105
121
|
openIncident,
|
|
@@ -107,10 +123,14 @@ export default class MonitorIncident {
|
|
|
107
123
|
input.autoResolveCriteriaInstanceIdIncidentIdsDictionary,
|
|
108
124
|
criteriaInstance: input.criteriaInstance,
|
|
109
125
|
breachingSeriesFingerprints: input.breachingSeriesFingerprints,
|
|
126
|
+
breachingSeriesFingerprintsByCriteriaId:
|
|
127
|
+
input.breachingSeriesFingerprintsByCriteriaId,
|
|
110
128
|
disableSeriesAbsenceResolution: input.disableSeriesAbsenceResolution,
|
|
111
129
|
});
|
|
112
130
|
|
|
113
131
|
if (shouldClose) {
|
|
132
|
+
resolvedIncidentIds.add(openIncident.id!.toString());
|
|
133
|
+
|
|
114
134
|
// then resolve incident.
|
|
115
135
|
await this.resolveOpenIncident({
|
|
116
136
|
openIncident: openIncident,
|
|
@@ -133,7 +153,20 @@ export default class MonitorIncident {
|
|
|
133
153
|
}
|
|
134
154
|
}
|
|
135
155
|
|
|
136
|
-
|
|
156
|
+
/*
|
|
157
|
+
* Return the incidents still open AFTER this pass. The create path
|
|
158
|
+
* dedupes against this list, and an incident this pass just resolved
|
|
159
|
+
* must not count as "already active" — that combination resolved a
|
|
160
|
+
* stale whole-monitor incident and then refused to create the
|
|
161
|
+
* per-series incidents meant to replace it.
|
|
162
|
+
*/
|
|
163
|
+
if (resolvedIncidentIds.size === 0) {
|
|
164
|
+
return openIncidents;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return openIncidents.filter((openIncident: Incident) => {
|
|
168
|
+
return !resolvedIncidentIds.has(openIncident.id!.toString());
|
|
169
|
+
});
|
|
137
170
|
}
|
|
138
171
|
|
|
139
172
|
/**
|
|
@@ -264,6 +297,26 @@ export default class MonitorIncident {
|
|
|
264
297
|
* reference `{{host.name}}` etc. via the template engine.
|
|
265
298
|
*/
|
|
266
299
|
matchesPerSeries?: Array<PerSeriesCriteriaMatch> | undefined;
|
|
300
|
+
/**
|
|
301
|
+
* The still-open incidents, when the caller has already run the
|
|
302
|
+
* resolve pass itself.
|
|
303
|
+
*
|
|
304
|
+
* A single evaluation can fan out across several matching criteria
|
|
305
|
+
* (host A critical while host B is only warning). The resolve pass
|
|
306
|
+
* has to run exactly once, with every criteria's breaching set in
|
|
307
|
+
* hand — running it once per criteria would let each criteria
|
|
308
|
+
* absence-resolve the others' incidents. So MonitorResource runs it
|
|
309
|
+
* up front and hands the survivors here.
|
|
310
|
+
*/
|
|
311
|
+
openIncidents?: Array<Incident> | undefined;
|
|
312
|
+
/**
|
|
313
|
+
* Per-criteria breaching fingerprints, forwarded to the resolve pass
|
|
314
|
+
* when this method runs it itself. See
|
|
315
|
+
* checkOpenIncidentsAndCloseIfResolved.
|
|
316
|
+
*/
|
|
317
|
+
breachingSeriesFingerprintsByCriteriaId?:
|
|
318
|
+
| Dictionary<Set<string>>
|
|
319
|
+
| undefined;
|
|
267
320
|
/**
|
|
268
321
|
* Series fingerprints whose underlying resource (host, docker host,
|
|
269
322
|
* kubernetes cluster, or service) is inside an ongoing scheduled
|
|
@@ -318,22 +371,45 @@ export default class MonitorIncident {
|
|
|
318
371
|
|
|
319
372
|
// check active incidents and if there are open incidents, do not cretae anothr incident.
|
|
320
373
|
const openIncidents: Array<Incident> =
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
374
|
+
input.openIncidents !== undefined
|
|
375
|
+
? input.openIncidents
|
|
376
|
+
: await this.checkOpenIncidentsAndCloseIfResolved({
|
|
377
|
+
monitorId: input.monitor.id!,
|
|
378
|
+
autoResolveCriteriaInstanceIdIncidentIdsDictionary:
|
|
379
|
+
input.autoResolveCriteriaInstanceIdIncidentIdsDictionary,
|
|
380
|
+
rootCause: input.rootCause,
|
|
381
|
+
criteriaInstance: input.criteriaInstance,
|
|
382
|
+
dataToProcess: input.dataToProcess,
|
|
383
|
+
evaluationSummary: input.evaluationSummary,
|
|
384
|
+
breachingSeriesFingerprints,
|
|
385
|
+
breachingSeriesFingerprintsByCriteriaId:
|
|
386
|
+
input.breachingSeriesFingerprintsByCriteriaId,
|
|
387
|
+
disableSeriesAbsenceResolution:
|
|
388
|
+
input.disableSeriesAbsenceResolution,
|
|
389
|
+
});
|
|
332
390
|
|
|
333
391
|
if (!input.criteriaInstance.data?.createIncidents) {
|
|
334
392
|
return;
|
|
335
393
|
}
|
|
336
394
|
|
|
395
|
+
/*
|
|
396
|
+
* Checked once, up front. It used to be tested deep inside the
|
|
397
|
+
* template x series loops with a `return`, which on a grouped
|
|
398
|
+
* monitor abandoned every series after the first.
|
|
399
|
+
*/
|
|
400
|
+
if (DisableAutomaticIncidentCreation) {
|
|
401
|
+
input.evaluationSummary?.events.push({
|
|
402
|
+
type: "incident-skipped",
|
|
403
|
+
title: "Incident creation skipped",
|
|
404
|
+
message:
|
|
405
|
+
"Automatic incident creation is disabled by environment configuration.",
|
|
406
|
+
relatedCriteriaId: input.criteriaInstance.data?.id,
|
|
407
|
+
at: OneUptimeDate.getCurrentDate(),
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
|
|
337
413
|
/*
|
|
338
414
|
* Alert-dependency suppression: a parent monitor is in a suppressing
|
|
339
415
|
* status (offline by default), so skip creating any incident for this
|
|
@@ -406,434 +482,455 @@ export default class MonitorIncident {
|
|
|
406
482
|
for (const criteriaIncident of input.criteriaInstance.data?.incidents ||
|
|
407
483
|
[]) {
|
|
408
484
|
for (const seriesMatch of seriesToProcess) {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
seriesMatch?.
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
* Per-series scheduled-maintenance suppression: this series'
|
|
416
|
-
* resource is inside an ongoing maintenance window, so skip
|
|
417
|
-
* creating an incident for it. Other series on the same monitor
|
|
418
|
-
* whose resources are not under maintenance still get incidents.
|
|
419
|
-
* Note: we only suppress *new* creation — any incident already
|
|
420
|
-
* open for this series is left to the normal resolve path
|
|
421
|
-
* (checkOpenIncidentsAndCloseIfResolved still sees the full
|
|
422
|
-
* breaching set), so a real incident raised before maintenance
|
|
423
|
-
* is not silently closed.
|
|
424
|
-
*/
|
|
425
|
-
if (
|
|
426
|
-
seriesFingerprint &&
|
|
427
|
-
input.suppressedSeriesFingerprints?.has(seriesFingerprint)
|
|
428
|
-
) {
|
|
429
|
-
logger.debug(
|
|
430
|
-
`${input.monitor.id?.toString()} - Skipping incident for series ${seriesFingerprint}: its resource is under an active scheduled maintenance window.`,
|
|
431
|
-
incidentLogAttributes,
|
|
432
|
-
);
|
|
433
|
-
|
|
434
|
-
input.evaluationSummary?.events.push({
|
|
435
|
-
type: "incident-skipped",
|
|
436
|
-
title: "Incident suppressed by scheduled maintenance",
|
|
437
|
-
message:
|
|
438
|
-
"Skipped creating an incident because the resource for this series is under an active scheduled maintenance window.",
|
|
439
|
-
relatedCriteriaId: input.criteriaInstance.data?.id,
|
|
440
|
-
at: OneUptimeDate.getCurrentDate(),
|
|
441
|
-
});
|
|
442
|
-
continue;
|
|
443
|
-
}
|
|
485
|
+
try {
|
|
486
|
+
const seriesFingerprint: string | undefined =
|
|
487
|
+
seriesMatch?.fingerprint;
|
|
488
|
+
const seriesLabels: JSONObject | undefined = seriesMatch?.labels;
|
|
489
|
+
const seriesRootCause: string =
|
|
490
|
+
seriesMatch?.rootCause || input.rootCause;
|
|
444
491
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
(criteriaIncident.id?.toString() || undefined) &&
|
|
464
|
-
(incident.seriesFingerprint || undefined) === seriesFingerprint
|
|
492
|
+
/*
|
|
493
|
+
* Per-series scheduled-maintenance suppression: this series'
|
|
494
|
+
* resource is inside an ongoing maintenance window, so skip
|
|
495
|
+
* creating an incident for it. Other series on the same monitor
|
|
496
|
+
* whose resources are not under maintenance still get incidents.
|
|
497
|
+
* Note: we only suppress *new* creation — any incident already
|
|
498
|
+
* open for this series is left to the normal resolve path
|
|
499
|
+
* (checkOpenIncidentsAndCloseIfResolved still sees the full
|
|
500
|
+
* breaching set), so a real incident raised before maintenance
|
|
501
|
+
* is not silently closed.
|
|
502
|
+
*/
|
|
503
|
+
if (
|
|
504
|
+
seriesFingerprint &&
|
|
505
|
+
input.suppressedSeriesFingerprints?.has(seriesFingerprint)
|
|
506
|
+
) {
|
|
507
|
+
logger.debug(
|
|
508
|
+
`${input.monitor.id?.toString()} - Skipping incident for series ${seriesFingerprint}: its resource is under an active scheduled maintenance window.`,
|
|
509
|
+
incidentLogAttributes,
|
|
465
510
|
);
|
|
466
|
-
},
|
|
467
|
-
);
|
|
468
|
-
|
|
469
|
-
const hasAlreadyOpenIncident: boolean = Boolean(alreadyOpenIncident);
|
|
470
511
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
512
|
+
input.evaluationSummary?.events.push({
|
|
513
|
+
type: "incident-skipped",
|
|
514
|
+
title: "Incident suppressed by scheduled maintenance",
|
|
515
|
+
message:
|
|
516
|
+
"Skipped creating an incident because the resource for this series is under an active scheduled maintenance window.",
|
|
517
|
+
relatedCriteriaId: input.criteriaInstance.data?.id,
|
|
518
|
+
at: OneUptimeDate.getCurrentDate(),
|
|
519
|
+
});
|
|
520
|
+
continue;
|
|
521
|
+
}
|
|
480
522
|
|
|
481
|
-
if (hasAlreadyOpenIncident) {
|
|
482
523
|
/*
|
|
483
|
-
*
|
|
484
|
-
*
|
|
485
|
-
*
|
|
486
|
-
*
|
|
487
|
-
*
|
|
488
|
-
*
|
|
524
|
+
* Dedupe match must mirror the create path below (which sets
|
|
525
|
+
* `createdCriteriaId` / `createdIncidentTemplateId` only when the
|
|
526
|
+
* corresponding id is present). A criteria incident template can be
|
|
527
|
+
* missing its `id` (legacy/API-authored criteria), so guard the
|
|
528
|
+
* `.toString()` with `?.` — an unguarded call previously threw
|
|
529
|
+
* "Cannot read properties of undefined (reading 'toString')" here and
|
|
530
|
+
* failed the probe/telemetry queue job on every cycle for the affected
|
|
531
|
+
* monitor. Normalise both sides to `undefined` on missing so a created
|
|
532
|
+
* incident (whose template id was left NULL) still matches itself next
|
|
533
|
+
* cycle instead of being recreated as a duplicate.
|
|
489
534
|
*/
|
|
490
|
-
const
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
relatedIncidentNumberWithPrefix:
|
|
502
|
-
alreadyOpenIncident?.incidentNumberWithPrefix,
|
|
503
|
-
at: OneUptimeDate.getCurrentDate(),
|
|
504
|
-
});
|
|
505
|
-
continue;
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
logger.debug(
|
|
509
|
-
`${input.monitor.id?.toString()} - Create incident.`,
|
|
510
|
-
incidentLogAttributes,
|
|
511
|
-
);
|
|
512
|
-
|
|
513
|
-
const incident: Incident = new Incident();
|
|
514
|
-
const storageMap: JSONObject =
|
|
515
|
-
MonitorTemplateUtil.buildTemplateStorageMap({
|
|
516
|
-
monitorType: input.monitor.monitorType!,
|
|
517
|
-
dataToProcess: input.dataToProcess,
|
|
518
|
-
monitor: input.monitor,
|
|
519
|
-
seriesLabels,
|
|
520
|
-
});
|
|
521
|
-
|
|
522
|
-
incident.title = MonitorTemplateUtil.processTemplateString({
|
|
523
|
-
value: criteriaIncident.title,
|
|
524
|
-
storageMap,
|
|
525
|
-
});
|
|
526
|
-
incident.description = MonitorTemplateUtil.processTemplateString({
|
|
527
|
-
value: criteriaIncident.description,
|
|
528
|
-
storageMap,
|
|
529
|
-
});
|
|
535
|
+
const alreadyOpenIncident: Incident | undefined = openIncidents.find(
|
|
536
|
+
(incident: Incident) => {
|
|
537
|
+
return (
|
|
538
|
+
(incident.createdCriteriaId || undefined) ===
|
|
539
|
+
(input.criteriaInstance.data?.id?.toString() || undefined) &&
|
|
540
|
+
(incident.createdIncidentTemplateId || undefined) ===
|
|
541
|
+
(criteriaIncident.id?.toString() || undefined) &&
|
|
542
|
+
(incident.seriesFingerprint || undefined) === seriesFingerprint
|
|
543
|
+
);
|
|
544
|
+
},
|
|
545
|
+
);
|
|
530
546
|
|
|
531
|
-
|
|
532
|
-
* Resolve the incident severity. `criteriaIncident.incidentSeverityId`
|
|
533
|
-
* can be a truthy-but-EMPTY ObjectID (id === "") — a stored
|
|
534
|
-
* `{"_type":"ObjectID","value":""}` deserializes to `new ObjectID("")`,
|
|
535
|
-
* which is an object so `!incidentSeverityId` is false. That empty id
|
|
536
|
-
* serializes to "" for the `uuid` (not-null) column and lands as NULL,
|
|
537
|
-
* throwing 23502 inside the probe-ingest worker and retrying forever.
|
|
538
|
-
* Use `?.toString()` truthiness so an empty/blank ObjectID is treated
|
|
539
|
-
* the same as "missing" and falls through to the project-default lookup.
|
|
540
|
-
*/
|
|
541
|
-
/*
|
|
542
|
-
* A criteria severity that belongs to *another* project is rejected by
|
|
543
|
-
* IncidentService on create. Throwing here would fail the whole
|
|
544
|
-
* probe/telemetry ingest job for this monitor — no incident, and no
|
|
545
|
-
* payload or monitor log persisted either, because those run after the
|
|
546
|
-
* create. Treat it as "missing" and fall back to this project's own
|
|
547
|
-
* default, which is also what stops the bad id spreading onto new
|
|
548
|
-
* incidents. monitorSteps can still hold one: the 1785240000000
|
|
549
|
-
* repair skipped ids it could not resolve.
|
|
550
|
-
*/
|
|
551
|
-
const isCriteriaSeverityUsable: boolean =
|
|
552
|
-
await ProjectScopedReferenceValidator.isUsableInProject({
|
|
553
|
-
projectId: input.monitor.projectId!,
|
|
554
|
-
id: criteriaIncident.incidentSeverityId,
|
|
555
|
-
service: IncidentSeverityService,
|
|
556
|
-
});
|
|
547
|
+
const hasAlreadyOpenIncident: boolean = Boolean(alreadyOpenIncident);
|
|
557
548
|
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
) {
|
|
562
|
-
logger.error(
|
|
563
|
-
`${input.monitor.id?.toString()} - Criteria "${
|
|
564
|
-
input.criteriaInstance.data?.name
|
|
565
|
-
}" references incident severity ${criteriaIncident.incidentSeverityId.toString()}, which does not belong to project ${input.monitor.projectId?.toString()}. Falling back to this project's default severity.`,
|
|
549
|
+
logger.debug(
|
|
550
|
+
`${input.monitor.id?.toString()} - Open Incident ${alreadyOpenIncident?.id?.toString()}`,
|
|
551
|
+
incidentLogAttributes,
|
|
566
552
|
);
|
|
567
|
-
}
|
|
568
553
|
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
await IncidentSeverityService.findOneBy({
|
|
574
|
-
query: {
|
|
575
|
-
projectId: input.monitor.projectId!,
|
|
576
|
-
},
|
|
577
|
-
sort: {
|
|
578
|
-
order: SortOrder.Ascending,
|
|
579
|
-
},
|
|
580
|
-
props: {
|
|
581
|
-
isRoot: true,
|
|
582
|
-
},
|
|
583
|
-
select: {
|
|
584
|
-
_id: true,
|
|
585
|
-
},
|
|
586
|
-
});
|
|
554
|
+
logger.debug(
|
|
555
|
+
`${input.monitor.id?.toString()} - Has open incident ${hasAlreadyOpenIncident}`,
|
|
556
|
+
incidentLogAttributes,
|
|
557
|
+
);
|
|
587
558
|
|
|
588
|
-
if (
|
|
559
|
+
if (hasAlreadyOpenIncident) {
|
|
589
560
|
/*
|
|
590
|
-
*
|
|
591
|
-
*
|
|
592
|
-
*
|
|
593
|
-
*
|
|
561
|
+
* Use the open incident's already-rendered title when
|
|
562
|
+
* available — the template (`criteriaIncident.title`) still
|
|
563
|
+
* contains unresolved `{{…}}` placeholders because it's the
|
|
564
|
+
* criterion's template string, not the instance's rendered
|
|
565
|
+
* output. Falling back to the template only when the open
|
|
566
|
+
* incident somehow has no title.
|
|
594
567
|
*/
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
input.criteriaInstance.data?.name
|
|
598
|
-
}".`,
|
|
599
|
-
);
|
|
568
|
+
const renderedTitle: string =
|
|
569
|
+
alreadyOpenIncident?.title || criteriaIncident.title;
|
|
600
570
|
|
|
601
571
|
input.evaluationSummary?.events.push({
|
|
602
572
|
type: "incident-skipped",
|
|
603
|
-
title:
|
|
573
|
+
title: `Incident already active: ${renderedTitle}`,
|
|
604
574
|
message:
|
|
605
|
-
"Skipped creating
|
|
575
|
+
"Skipped creating a new incident because an active incident exists for this criteria.",
|
|
606
576
|
relatedCriteriaId: input.criteriaInstance.data?.id,
|
|
577
|
+
relatedIncidentId: alreadyOpenIncident?.id?.toString(),
|
|
578
|
+
relatedIncidentNumber: alreadyOpenIncident?.incidentNumber,
|
|
579
|
+
relatedIncidentNumberWithPrefix:
|
|
580
|
+
alreadyOpenIncident?.incidentNumberWithPrefix,
|
|
607
581
|
at: OneUptimeDate.getCurrentDate(),
|
|
608
582
|
});
|
|
609
583
|
continue;
|
|
610
584
|
}
|
|
611
585
|
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
586
|
+
logger.debug(
|
|
587
|
+
`${input.monitor.id?.toString()} - Create incident.`,
|
|
588
|
+
incidentLogAttributes,
|
|
589
|
+
);
|
|
616
590
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
591
|
+
const incident: Incident = new Incident();
|
|
592
|
+
const storageMap: JSONObject =
|
|
593
|
+
MonitorTemplateUtil.buildTemplateStorageMap({
|
|
594
|
+
monitorType: input.monitor.monitorType!,
|
|
595
|
+
dataToProcess: input.dataToProcess,
|
|
596
|
+
monitor: input.monitor,
|
|
597
|
+
seriesLabels,
|
|
598
|
+
});
|
|
623
599
|
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
600
|
+
incident.title = MonitorTemplateUtil.processTemplateString({
|
|
601
|
+
value: criteriaIncident.title,
|
|
602
|
+
storageMap,
|
|
603
|
+
});
|
|
604
|
+
incident.description = MonitorTemplateUtil.processTemplateString({
|
|
605
|
+
value: criteriaIncident.description,
|
|
606
|
+
storageMap,
|
|
607
|
+
});
|
|
630
608
|
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
609
|
+
/*
|
|
610
|
+
* Resolve the incident severity. `criteriaIncident.incidentSeverityId`
|
|
611
|
+
* can be a truthy-but-EMPTY ObjectID (id === "") — a stored
|
|
612
|
+
* `{"_type":"ObjectID","value":""}` deserializes to `new ObjectID("")`,
|
|
613
|
+
* which is an object so `!incidentSeverityId` is false. That empty id
|
|
614
|
+
* serializes to "" for the `uuid` (not-null) column and lands as NULL,
|
|
615
|
+
* throwing 23502 inside the probe-ingest worker and retrying forever.
|
|
616
|
+
* Use `?.toString()` truthiness so an empty/blank ObjectID is treated
|
|
617
|
+
* the same as "missing" and falls through to the project-default lookup.
|
|
618
|
+
*/
|
|
619
|
+
/*
|
|
620
|
+
* A criteria severity that belongs to *another* project is rejected by
|
|
621
|
+
* IncidentService on create. Throwing here would fail the whole
|
|
622
|
+
* probe/telemetry ingest job for this monitor — no incident, and no
|
|
623
|
+
* payload or monitor log persisted either, because those run after the
|
|
624
|
+
* create. Treat it as "missing" and fall back to this project's own
|
|
625
|
+
* default, which is also what stops the bad id spreading onto new
|
|
626
|
+
* incidents. monitorSteps can still hold one: the 1785240000000
|
|
627
|
+
* repair skipped ids it could not resolve.
|
|
628
|
+
*/
|
|
629
|
+
const isCriteriaSeverityUsable: boolean =
|
|
630
|
+
await ProjectScopedReferenceValidator.isUsableInProject({
|
|
631
|
+
projectId: input.monitor.projectId!,
|
|
632
|
+
id: criteriaIncident.incidentSeverityId,
|
|
633
|
+
service: IncidentSeverityService,
|
|
634
|
+
});
|
|
634
635
|
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
}
|
|
636
|
+
if (
|
|
637
|
+
criteriaIncident.incidentSeverityId?.toString() &&
|
|
638
|
+
!isCriteriaSeverityUsable
|
|
639
|
+
) {
|
|
640
|
+
logger.error(
|
|
641
|
+
`${input.monitor.id?.toString()} - Criteria "${
|
|
642
|
+
input.criteriaInstance.data?.name
|
|
643
|
+
}" references incident severity ${criteriaIncident.incidentSeverityId.toString()}, which does not belong to project ${input.monitor.projectId?.toString()}. Falling back to this project's default severity.`,
|
|
644
|
+
);
|
|
645
|
+
}
|
|
646
646
|
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
647
|
+
if (!isCriteriaSeverityUsable) {
|
|
648
|
+
// pick the critical (first/lowest-order root) severity.
|
|
649
|
+
|
|
650
|
+
const severity: IncidentSeverity | null =
|
|
651
|
+
await IncidentSeverityService.findOneBy({
|
|
652
|
+
query: {
|
|
653
|
+
projectId: input.monitor.projectId!,
|
|
654
|
+
},
|
|
655
|
+
sort: {
|
|
656
|
+
order: SortOrder.Ascending,
|
|
657
|
+
},
|
|
658
|
+
props: {
|
|
659
|
+
isRoot: true,
|
|
660
|
+
},
|
|
661
|
+
select: {
|
|
662
|
+
_id: true,
|
|
663
|
+
},
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
if (!severity?.id?.toString()) {
|
|
667
|
+
/*
|
|
668
|
+
* The project has no incident severity configured. Throwing here
|
|
669
|
+
* would fail the entire probe/telemetry ingest job, which then
|
|
670
|
+
* retries forever for a misconfiguration the worker cannot fix.
|
|
671
|
+
* Skip incident creation gracefully and log instead.
|
|
672
|
+
*/
|
|
673
|
+
logger.error(
|
|
674
|
+
`${input.monitor.id?.toString()} - Cannot create incident: project ${input.monitor.projectId?.toString()} has no incident severity configured. Skipping incident creation for criteria "${
|
|
675
|
+
input.criteriaInstance.data?.name
|
|
676
|
+
}".`,
|
|
677
|
+
);
|
|
650
678
|
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
679
|
+
input.evaluationSummary?.events.push({
|
|
680
|
+
type: "incident-skipped",
|
|
681
|
+
title: "Incident creation skipped",
|
|
682
|
+
message:
|
|
683
|
+
"Skipped creating an incident because the project has no incident severity configured.",
|
|
684
|
+
relatedCriteriaId: input.criteriaInstance.data?.id,
|
|
685
|
+
at: OneUptimeDate.getCurrentDate(),
|
|
686
|
+
});
|
|
687
|
+
continue;
|
|
688
|
+
}
|
|
656
689
|
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
monitorType: input.monitor.monitorType,
|
|
662
|
-
});
|
|
663
|
-
}
|
|
690
|
+
incident.incidentSeverityId = severity.id!;
|
|
691
|
+
} else {
|
|
692
|
+
incident.incidentSeverityId = criteriaIncident.incidentSeverityId!;
|
|
693
|
+
}
|
|
664
694
|
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
*/
|
|
672
|
-
SeriesResourceLinker.attachResolvedResources({
|
|
673
|
-
model: incident,
|
|
674
|
-
resolved: resourceContext,
|
|
675
|
-
});
|
|
695
|
+
incident.monitors = [input.monitor];
|
|
696
|
+
incident.projectId = input.monitor.projectId!;
|
|
697
|
+
incident.rootCause = seriesRootCause;
|
|
698
|
+
incident.createdStateLog = JSON.parse(
|
|
699
|
+
JSON.stringify(input.dataToProcess, null, 2),
|
|
700
|
+
);
|
|
676
701
|
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
// Set labels from criteria
|
|
685
|
-
incident.labels =
|
|
686
|
-
criteriaIncident.labelIds?.map((id: ObjectID) => {
|
|
687
|
-
const label: Label = new Label();
|
|
688
|
-
label._id = id.toString();
|
|
689
|
-
return label;
|
|
690
|
-
}) || [];
|
|
691
|
-
|
|
692
|
-
incident.isCreatedAutomatically = true;
|
|
693
|
-
|
|
694
|
-
// Set status page visibility (defaults to true if not specified)
|
|
695
|
-
if (criteriaIncident.showIncidentOnStatusPage !== undefined) {
|
|
696
|
-
incident.isVisibleOnStatusPage =
|
|
697
|
-
criteriaIncident.showIncidentOnStatusPage;
|
|
698
|
-
}
|
|
702
|
+
/*
|
|
703
|
+
* Same capture on every incident this evaluation opens - they all
|
|
704
|
+
* came from the one check.
|
|
705
|
+
*/
|
|
706
|
+
const serializedMonitorSummary: JSONObject | null =
|
|
707
|
+
MonitorSummarySnapshotUtil.serialize(input.monitorSummary);
|
|
699
708
|
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
709
|
+
if (serializedMonitorSummary) {
|
|
710
|
+
incident.monitorSummary = serializedMonitorSummary;
|
|
711
|
+
}
|
|
703
712
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
713
|
+
/*
|
|
714
|
+
* Guard against missing ids — these are optional reference fields and
|
|
715
|
+
* must not crash incident creation (which runs inside the probe /
|
|
716
|
+
* telemetry queue workers). A missing id previously threw
|
|
717
|
+
* "Cannot read properties of undefined (reading 'toString')" and failed
|
|
718
|
+
* the job on every cycle for the affected monitor.
|
|
719
|
+
*/
|
|
720
|
+
if (input.criteriaInstance.data?.id) {
|
|
721
|
+
incident.createdCriteriaId =
|
|
722
|
+
input.criteriaInstance.data.id.toString();
|
|
723
|
+
}
|
|
707
724
|
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
) {
|
|
712
|
-
incident.createdByProbeId = (
|
|
713
|
-
input.dataToProcess as ProbeMonitorResponse
|
|
714
|
-
).probeId;
|
|
715
|
-
}
|
|
725
|
+
if (criteriaIncident.id) {
|
|
726
|
+
incident.createdIncidentTemplateId = criteriaIncident.id.toString();
|
|
727
|
+
}
|
|
716
728
|
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
729
|
+
if (seriesFingerprint) {
|
|
730
|
+
incident.seriesFingerprint = seriesFingerprint;
|
|
731
|
+
}
|
|
732
|
+
if (seriesLabels && Object.keys(seriesLabels).length > 0) {
|
|
733
|
+
incident.seriesLabels = seriesLabels;
|
|
734
|
+
|
|
735
|
+
await SeriesResourceLinker.linkSeriesResourcesToModel({
|
|
736
|
+
model: incident,
|
|
737
|
+
seriesLabels,
|
|
738
|
+
projectId: input.monitor.projectId!,
|
|
739
|
+
monitorType: input.monitor.monitorType,
|
|
740
|
+
});
|
|
741
|
+
}
|
|
725
742
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
743
|
+
/*
|
|
744
|
+
* Deterministic resource link from the monitor's step config
|
|
745
|
+
* (resolved once above). Runs for both grouped and ungrouped
|
|
746
|
+
* incidents and merges with anything the series-label path
|
|
747
|
+
* resolved, so the per-resource Activity tabs always see
|
|
748
|
+
* monitor-created incidents.
|
|
749
|
+
*/
|
|
750
|
+
SeriesResourceLinker.attachResolvedResources({
|
|
751
|
+
model: incident,
|
|
752
|
+
resolved: resourceContext,
|
|
734
753
|
});
|
|
735
|
-
return;
|
|
736
|
-
}
|
|
737
754
|
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
755
|
+
incident.onCallDutyPolicies =
|
|
756
|
+
criteriaIncident.onCallPolicyIds?.map((id: ObjectID) => {
|
|
757
|
+
const onCallPolicy: OnCallDutyPolicy = new OnCallDutyPolicy();
|
|
758
|
+
onCallPolicy._id = id.toString();
|
|
759
|
+
return onCallPolicy;
|
|
760
|
+
}) || [];
|
|
761
|
+
|
|
762
|
+
// Set labels from criteria
|
|
763
|
+
incident.labels =
|
|
764
|
+
criteriaIncident.labelIds?.map((id: ObjectID) => {
|
|
765
|
+
const label: Label = new Label();
|
|
766
|
+
label._id = id.toString();
|
|
767
|
+
return label;
|
|
768
|
+
}) || [];
|
|
769
|
+
|
|
770
|
+
incident.isCreatedAutomatically = true;
|
|
771
|
+
|
|
772
|
+
// Set status page visibility (defaults to true if not specified)
|
|
773
|
+
if (criteriaIncident.showIncidentOnStatusPage !== undefined) {
|
|
774
|
+
incident.isVisibleOnStatusPage =
|
|
775
|
+
criteriaIncident.showIncidentOnStatusPage;
|
|
776
|
+
}
|
|
744
777
|
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
* owners of the network device this monitor watches, so device
|
|
749
|
-
* ownership flows into the incidents its monitor raises.
|
|
750
|
-
*/
|
|
751
|
-
if (networkDeviceOwners === null) {
|
|
752
|
-
networkDeviceOwners =
|
|
753
|
-
await NetworkDeviceOwnerUserService.getDeviceOwnersForMonitor({
|
|
754
|
-
monitor: input.monitor,
|
|
755
|
-
monitorStepId: (
|
|
756
|
-
input.dataToProcess as ProbeMonitorResponse
|
|
757
|
-
).monitorStepId?.toString(),
|
|
758
|
-
});
|
|
759
|
-
}
|
|
778
|
+
if (criteriaIncident.isPrivate === true) {
|
|
779
|
+
incident.isPrivate = true;
|
|
780
|
+
}
|
|
760
781
|
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
);
|
|
782
|
+
if (input.props.telemetryQuery) {
|
|
783
|
+
incident.telemetryQuery = input.props.telemetryQuery;
|
|
784
|
+
}
|
|
765
785
|
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
786
|
+
if (
|
|
787
|
+
input.dataToProcess &&
|
|
788
|
+
(input.dataToProcess as ProbeMonitorResponse).probeId
|
|
789
|
+
) {
|
|
790
|
+
incident.createdByProbeId = (
|
|
791
|
+
input.dataToProcess as ProbeMonitorResponse
|
|
792
|
+
).probeId;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
if (criteriaIncident.remediationNotes) {
|
|
796
|
+
incident.remediationNotes =
|
|
797
|
+
MonitorTemplateUtil.processTemplateString({
|
|
798
|
+
value: criteriaIncident.remediationNotes,
|
|
799
|
+
storageMap,
|
|
800
|
+
});
|
|
801
|
+
}
|
|
770
802
|
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
createdIncident.id!,
|
|
775
|
-
ownerUserIds,
|
|
776
|
-
ownerTeamIds,
|
|
777
|
-
true, // notify owners
|
|
778
|
-
{
|
|
803
|
+
const createdIncident: Incident = await IncidentService.create({
|
|
804
|
+
data: incident,
|
|
805
|
+
props: {
|
|
779
806
|
isRoot: true,
|
|
780
807
|
},
|
|
808
|
+
});
|
|
809
|
+
|
|
810
|
+
/*
|
|
811
|
+
* Add owner teams and users after incident creation. Owners
|
|
812
|
+
* configured on the criteria template are merged (deduped) with the
|
|
813
|
+
* owners of the network device this monitor watches, so device
|
|
814
|
+
* ownership flows into the incidents its monitor raises.
|
|
815
|
+
*/
|
|
816
|
+
if (networkDeviceOwners === null) {
|
|
817
|
+
networkDeviceOwners =
|
|
818
|
+
await NetworkDeviceOwnerUserService.getDeviceOwnersForMonitor({
|
|
819
|
+
monitor: input.monitor,
|
|
820
|
+
monitorStepId: (
|
|
821
|
+
input.dataToProcess as ProbeMonitorResponse
|
|
822
|
+
).monitorStepId?.toString(),
|
|
823
|
+
});
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
const ownerUserIds: Array<ObjectID> = this.mergeOwnerIds(
|
|
827
|
+
criteriaIncident.ownerUserIds || [],
|
|
828
|
+
networkDeviceOwners.ownerUserIds,
|
|
781
829
|
);
|
|
782
|
-
}
|
|
783
830
|
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
) {
|
|
789
|
-
for (const roleAssignment of criteriaIncident.incidentMemberRoles) {
|
|
790
|
-
try {
|
|
791
|
-
const assignment: IncidentMemberRoleAssignment =
|
|
792
|
-
roleAssignment as IncidentMemberRoleAssignment;
|
|
793
|
-
|
|
794
|
-
if (assignment.roleId && assignment.userId) {
|
|
795
|
-
const incidentMember: IncidentMember = new IncidentMember();
|
|
796
|
-
incidentMember.incidentId = createdIncident.id!;
|
|
797
|
-
incidentMember.projectId = input.monitor.projectId!;
|
|
798
|
-
incidentMember.userId = new ObjectID(
|
|
799
|
-
assignment.userId.toString(),
|
|
800
|
-
);
|
|
801
|
-
incidentMember.incidentRoleId = new ObjectID(
|
|
802
|
-
assignment.roleId.toString(),
|
|
803
|
-
);
|
|
831
|
+
const ownerTeamIds: Array<ObjectID> = this.mergeOwnerIds(
|
|
832
|
+
criteriaIncident.ownerTeamIds || [],
|
|
833
|
+
networkDeviceOwners.ownerTeamIds,
|
|
834
|
+
);
|
|
804
835
|
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
836
|
+
if (ownerTeamIds.length || ownerUserIds.length) {
|
|
837
|
+
await IncidentService.addOwners(
|
|
838
|
+
input.monitor.projectId!,
|
|
839
|
+
createdIncident.id!,
|
|
840
|
+
ownerUserIds,
|
|
841
|
+
ownerTeamIds,
|
|
842
|
+
true, // notify owners
|
|
843
|
+
{
|
|
844
|
+
isRoot: true,
|
|
845
|
+
},
|
|
846
|
+
);
|
|
847
|
+
}
|
|
811
848
|
|
|
812
|
-
|
|
813
|
-
|
|
849
|
+
// Add incident member role assignments after incident creation
|
|
850
|
+
if (
|
|
851
|
+
criteriaIncident.incidentMemberRoles &&
|
|
852
|
+
criteriaIncident.incidentMemberRoles.length > 0
|
|
853
|
+
) {
|
|
854
|
+
for (const roleAssignment of criteriaIncident.incidentMemberRoles) {
|
|
855
|
+
try {
|
|
856
|
+
const assignment: IncidentMemberRoleAssignment =
|
|
857
|
+
roleAssignment as IncidentMemberRoleAssignment;
|
|
858
|
+
|
|
859
|
+
if (assignment.roleId && assignment.userId) {
|
|
860
|
+
const incidentMember: IncidentMember = new IncidentMember();
|
|
861
|
+
incidentMember.incidentId = createdIncident.id!;
|
|
862
|
+
incidentMember.projectId = input.monitor.projectId!;
|
|
863
|
+
incidentMember.userId = new ObjectID(
|
|
864
|
+
assignment.userId.toString(),
|
|
865
|
+
);
|
|
866
|
+
incidentMember.incidentRoleId = new ObjectID(
|
|
867
|
+
assignment.roleId.toString(),
|
|
868
|
+
);
|
|
869
|
+
|
|
870
|
+
await IncidentMemberService.create({
|
|
871
|
+
data: incidentMember,
|
|
872
|
+
props: {
|
|
873
|
+
isRoot: true,
|
|
874
|
+
},
|
|
875
|
+
});
|
|
876
|
+
|
|
877
|
+
logger.debug(
|
|
878
|
+
`${input.monitor.id?.toString()} - Assigned incident member role ${assignment.roleId.toString()} to user ${assignment.userId.toString()}`,
|
|
879
|
+
incidentLogAttributes,
|
|
880
|
+
);
|
|
881
|
+
}
|
|
882
|
+
} catch (memberError) {
|
|
883
|
+
logger.error(
|
|
884
|
+
`${input.monitor.id?.toString()} - Failed to assign incident member role: ${memberError}`,
|
|
814
885
|
incidentLogAttributes,
|
|
815
886
|
);
|
|
816
887
|
}
|
|
817
|
-
} catch (memberError) {
|
|
818
|
-
logger.error(
|
|
819
|
-
`${input.monitor.id?.toString()} - Failed to assign incident member role: ${memberError}`,
|
|
820
|
-
incidentLogAttributes,
|
|
821
|
-
);
|
|
822
888
|
}
|
|
823
889
|
}
|
|
824
|
-
}
|
|
825
890
|
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
891
|
+
input.evaluationSummary?.events.push({
|
|
892
|
+
type: "incident-created",
|
|
893
|
+
title: `Incident created: ${createdIncident.title || criteriaIncident.title}`,
|
|
894
|
+
message: `Incident triggered from criteria "${input.criteriaInstance.data?.name || "Unnamed criteria"}".`,
|
|
895
|
+
relatedCriteriaId: input.criteriaInstance.data?.id,
|
|
896
|
+
relatedIncidentId: createdIncident.id?.toString(),
|
|
897
|
+
relatedIncidentNumber: createdIncident.incidentNumber,
|
|
898
|
+
relatedIncidentNumberWithPrefix:
|
|
899
|
+
createdIncident.incidentNumberWithPrefix,
|
|
900
|
+
at: OneUptimeDate.getCurrentDate(),
|
|
901
|
+
});
|
|
902
|
+
} catch (err) {
|
|
903
|
+
/*
|
|
904
|
+
* One series must not take the rest of the fleet down with it.
|
|
905
|
+
* Everything in this loop happens per host/container/key and
|
|
906
|
+
* touches the database; an error thrown from here used to
|
|
907
|
+
* propagate out of MonitorResource (which has no catch, only a
|
|
908
|
+
* `finally` that releases the lock) and abandon every series
|
|
909
|
+
* after the failing one, plus the monitor log for the tick.
|
|
910
|
+
*/
|
|
911
|
+
logger.error(
|
|
912
|
+
`${input.monitor.id?.toString()} - Failed to create incident${
|
|
913
|
+
seriesMatch?.fingerprint
|
|
914
|
+
? ` for series ${seriesMatch.fingerprint}`
|
|
915
|
+
: ""
|
|
916
|
+
}.`,
|
|
917
|
+
);
|
|
918
|
+
logger.error(err);
|
|
919
|
+
|
|
920
|
+
input.evaluationSummary?.events.push({
|
|
921
|
+
type: "incident-skipped",
|
|
922
|
+
title: "Incident creation failed",
|
|
923
|
+
message: `Could not create an incident${
|
|
924
|
+
seriesMatch?.fingerprint
|
|
925
|
+
? ` for series ${seriesMatch.fingerprint}`
|
|
926
|
+
: ""
|
|
927
|
+
}: ${err instanceof Error ? err.message : String(err)}`,
|
|
928
|
+
relatedCriteriaId: input.criteriaInstance.data?.id,
|
|
929
|
+
at: OneUptimeDate.getCurrentDate(),
|
|
930
|
+
});
|
|
931
|
+
|
|
932
|
+
continue;
|
|
933
|
+
}
|
|
837
934
|
}
|
|
838
935
|
}
|
|
839
936
|
}
|
|
@@ -929,6 +1026,106 @@ export default class MonitorIncident {
|
|
|
929
1026
|
}
|
|
930
1027
|
}
|
|
931
1028
|
|
|
1029
|
+
/**
|
|
1030
|
+
* Is `openIncident`'s series still breaching the criteria that raised
|
|
1031
|
+
* it?
|
|
1032
|
+
*
|
|
1033
|
+
* Prefers the per-criteria dictionary, which answers the question for
|
|
1034
|
+
* the criteria that actually owns this incident. The single-set
|
|
1035
|
+
* fallback only knows the winning criteria's breaches, so it has to
|
|
1036
|
+
* approximate with `createIncidents` — a criteria that creates no
|
|
1037
|
+
* incidents is a recovery criteria whose "matches" are healthy series,
|
|
1038
|
+
* and counting those as breaches would pin an offline incident open
|
|
1039
|
+
* forever.
|
|
1040
|
+
*/
|
|
1041
|
+
private static isSeriesStillBreaching(input: {
|
|
1042
|
+
openIncident: Incident;
|
|
1043
|
+
criteriaInstance: MonitorCriteriaInstance | null;
|
|
1044
|
+
openSeriesFingerprint: string;
|
|
1045
|
+
breachingSeriesFingerprints: Set<string>;
|
|
1046
|
+
breachingSeriesFingerprintsByCriteriaId?:
|
|
1047
|
+
| Dictionary<Set<string>>
|
|
1048
|
+
| undefined;
|
|
1049
|
+
}): boolean {
|
|
1050
|
+
const owningCriteriaId: string | undefined =
|
|
1051
|
+
input.openIncident.createdCriteriaId?.toString() || undefined;
|
|
1052
|
+
|
|
1053
|
+
if (input.breachingSeriesFingerprintsByCriteriaId && owningCriteriaId) {
|
|
1054
|
+
return Boolean(
|
|
1055
|
+
input.breachingSeriesFingerprintsByCriteriaId[owningCriteriaId]?.has(
|
|
1056
|
+
input.openSeriesFingerprint,
|
|
1057
|
+
),
|
|
1058
|
+
);
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
const matchedCriteriaCreatesIncidents: boolean =
|
|
1062
|
+
input.criteriaInstance?.data?.createIncidents === true;
|
|
1063
|
+
|
|
1064
|
+
return (
|
|
1065
|
+
matchedCriteriaCreatesIncidents &&
|
|
1066
|
+
input.breachingSeriesFingerprints.has(input.openSeriesFingerprint)
|
|
1067
|
+
);
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
private static wasCriteriaEvaluated(input: {
|
|
1071
|
+
openIncident: Incident;
|
|
1072
|
+
breachingSeriesFingerprintsByCriteriaId: Dictionary<Set<string>>;
|
|
1073
|
+
}): boolean {
|
|
1074
|
+
const owningCriteriaId: string | undefined =
|
|
1075
|
+
input.openIncident.createdCriteriaId?.toString() || undefined;
|
|
1076
|
+
|
|
1077
|
+
if (!owningCriteriaId) {
|
|
1078
|
+
return true;
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
return (
|
|
1082
|
+
input.breachingSeriesFingerprintsByCriteriaId[owningCriteriaId] !==
|
|
1083
|
+
undefined
|
|
1084
|
+
);
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
/**
|
|
1088
|
+
* Did the criteria that raised this incident opt into auto-resolve for
|
|
1089
|
+
* the template that raised it?
|
|
1090
|
+
*
|
|
1091
|
+
* An incident whose `createdIncidentTemplateId` is missing (legacy or
|
|
1092
|
+
* API-authored criteria whose template carries no id) is matched
|
|
1093
|
+
* against the criteria as a whole. Requiring an exact template id
|
|
1094
|
+
* there meant such an incident could never auto-resolve — and, because
|
|
1095
|
+
* it stayed open, its criteria could never raise a new one either.
|
|
1096
|
+
*/
|
|
1097
|
+
private static isAutoResolveConfiguredForIncident(input: {
|
|
1098
|
+
openIncident: Incident;
|
|
1099
|
+
autoResolveCriteriaInstanceIdIncidentIdsDictionary: Dictionary<
|
|
1100
|
+
Array<string>
|
|
1101
|
+
>;
|
|
1102
|
+
}): boolean {
|
|
1103
|
+
const createdCriteriaId: string | undefined =
|
|
1104
|
+
input.openIncident.createdCriteriaId?.toString() || undefined;
|
|
1105
|
+
|
|
1106
|
+
if (!createdCriteriaId) {
|
|
1107
|
+
return false;
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
const autoResolveTemplates: Array<string> | undefined =
|
|
1111
|
+
input.autoResolveCriteriaInstanceIdIncidentIdsDictionary[
|
|
1112
|
+
createdCriteriaId
|
|
1113
|
+
];
|
|
1114
|
+
|
|
1115
|
+
if (!autoResolveTemplates || autoResolveTemplates.length === 0) {
|
|
1116
|
+
return false;
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
const createdTemplateId: string | undefined =
|
|
1120
|
+
input.openIncident.createdIncidentTemplateId?.toString() || undefined;
|
|
1121
|
+
|
|
1122
|
+
if (!createdTemplateId) {
|
|
1123
|
+
return true;
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
return autoResolveTemplates.includes(createdTemplateId);
|
|
1127
|
+
}
|
|
1128
|
+
|
|
932
1129
|
private static shouldCloseIncident(input: {
|
|
933
1130
|
openIncident: Incident;
|
|
934
1131
|
autoResolveCriteriaInstanceIdIncidentIdsDictionary: Dictionary<
|
|
@@ -936,6 +1133,9 @@ export default class MonitorIncident {
|
|
|
936
1133
|
>;
|
|
937
1134
|
criteriaInstance: MonitorCriteriaInstance | null; // null if no criteia met.
|
|
938
1135
|
breachingSeriesFingerprints?: Set<string> | undefined;
|
|
1136
|
+
breachingSeriesFingerprintsByCriteriaId?:
|
|
1137
|
+
| Dictionary<Set<string>>
|
|
1138
|
+
| undefined;
|
|
939
1139
|
disableSeriesAbsenceResolution?: boolean | undefined;
|
|
940
1140
|
}): boolean {
|
|
941
1141
|
const openSeriesFingerprint: string | undefined =
|
|
@@ -956,69 +1156,75 @@ export default class MonitorIncident {
|
|
|
956
1156
|
return false;
|
|
957
1157
|
}
|
|
958
1158
|
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
* series set and this open incident has a fingerprint, resolve
|
|
962
|
-
* whenever the fingerprint is no longer in the set — regardless
|
|
963
|
-
* of whether some *other* series is still breaching the same
|
|
964
|
-
* criteria. This is the whole point of per-host incidents.
|
|
965
|
-
*/
|
|
966
|
-
if (
|
|
967
|
-
input.breachingSeriesFingerprints !== undefined &&
|
|
968
|
-
openSeriesFingerprint
|
|
969
|
-
) {
|
|
1159
|
+
// Per-series mode: this evaluation knows which series are breaching.
|
|
1160
|
+
if (input.breachingSeriesFingerprints !== undefined) {
|
|
970
1161
|
/*
|
|
971
|
-
*
|
|
972
|
-
*
|
|
973
|
-
*
|
|
974
|
-
*
|
|
975
|
-
*
|
|
976
|
-
*
|
|
977
|
-
*
|
|
978
|
-
* as still-breaching when the matched criteria actually creates
|
|
979
|
-
* incidents (an offline/breach criteria); a recovery criteria
|
|
980
|
-
* (createIncidents=false) contributes no breaches and lets the
|
|
981
|
-
* per-series incident auto-resolve.
|
|
1162
|
+
* A whole-monitor incident (no fingerprint) on a monitor that now
|
|
1163
|
+
* raises incidents per series. It was raised before the monitor
|
|
1164
|
+
* was grouped, and nothing can ever dedupe against it again —
|
|
1165
|
+
* every incident from here on carries a fingerprint. Left alone it
|
|
1166
|
+
* stays open forever while its replacements come and go. Resolve
|
|
1167
|
+
* it, on the same auto-resolve terms as any other incident from
|
|
1168
|
+
* its criteria.
|
|
982
1169
|
*/
|
|
983
|
-
|
|
984
|
-
input.
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
matchedCriteriaCreatesIncidents &&
|
|
988
|
-
input.breachingSeriesFingerprints.has(openSeriesFingerprint);
|
|
1170
|
+
if (!openSeriesFingerprint) {
|
|
1171
|
+
if (input.disableSeriesAbsenceResolution) {
|
|
1172
|
+
return false;
|
|
1173
|
+
}
|
|
989
1174
|
|
|
990
|
-
|
|
991
|
-
|
|
1175
|
+
return MonitorIncident.isAutoResolveConfiguredForIncident({
|
|
1176
|
+
openIncident: input.openIncident,
|
|
1177
|
+
autoResolveCriteriaInstanceIdIncidentIdsDictionary:
|
|
1178
|
+
input.autoResolveCriteriaInstanceIdIncidentIdsDictionary,
|
|
1179
|
+
});
|
|
992
1180
|
}
|
|
993
1181
|
|
|
994
1182
|
/*
|
|
995
|
-
*
|
|
996
|
-
*
|
|
997
|
-
*
|
|
1183
|
+
* Per-series auto-resolve: resolve whenever this fingerprint is no
|
|
1184
|
+
* longer breaching the criteria that raised it — regardless of
|
|
1185
|
+
* whether some *other* series is still breaching. That is the
|
|
1186
|
+
* whole point of per-host incidents.
|
|
998
1187
|
*/
|
|
999
|
-
if (
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1188
|
+
if (
|
|
1189
|
+
MonitorIncident.isSeriesStillBreaching({
|
|
1190
|
+
openIncident: input.openIncident,
|
|
1191
|
+
criteriaInstance: input.criteriaInstance,
|
|
1192
|
+
openSeriesFingerprint,
|
|
1193
|
+
breachingSeriesFingerprints: input.breachingSeriesFingerprints,
|
|
1194
|
+
breachingSeriesFingerprintsByCriteriaId:
|
|
1195
|
+
input.breachingSeriesFingerprintsByCriteriaId,
|
|
1196
|
+
})
|
|
1197
|
+
) {
|
|
1004
1198
|
return false;
|
|
1005
1199
|
}
|
|
1006
1200
|
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1201
|
+
/*
|
|
1202
|
+
* The criteria that raised this incident was not evaluated on this
|
|
1203
|
+
* tick at all (disabled, deleted, or the monitor stops at its
|
|
1204
|
+
* first match). Absence of a breaching set for it is not evidence
|
|
1205
|
+
* of recovery, so leave the incident alone.
|
|
1206
|
+
*/
|
|
1012
1207
|
if (
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
input.openIncident
|
|
1016
|
-
|
|
1208
|
+
input.breachingSeriesFingerprintsByCriteriaId &&
|
|
1209
|
+
!MonitorIncident.wasCriteriaEvaluated({
|
|
1210
|
+
openIncident: input.openIncident,
|
|
1211
|
+
breachingSeriesFingerprintsByCriteriaId:
|
|
1212
|
+
input.breachingSeriesFingerprintsByCriteriaId,
|
|
1213
|
+
})
|
|
1017
1214
|
) {
|
|
1018
|
-
return
|
|
1215
|
+
return false;
|
|
1019
1216
|
}
|
|
1020
1217
|
|
|
1021
|
-
|
|
1218
|
+
/*
|
|
1219
|
+
* Series no longer breaching. Only auto-close if the criteria was
|
|
1220
|
+
* configured to auto-resolve in the first place; otherwise stay
|
|
1221
|
+
* open so a human can acknowledge.
|
|
1222
|
+
*/
|
|
1223
|
+
return MonitorIncident.isAutoResolveConfiguredForIncident({
|
|
1224
|
+
openIncident: input.openIncident,
|
|
1225
|
+
autoResolveCriteriaInstanceIdIncidentIdsDictionary:
|
|
1226
|
+
input.autoResolveCriteriaInstanceIdIncidentIdsDictionary,
|
|
1227
|
+
});
|
|
1022
1228
|
}
|
|
1023
1229
|
|
|
1024
1230
|
if (
|