@oneuptime/common 13.0.5 → 13.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/AuditLog.ts +81 -1
- package/Models/AnalyticsModels/SecurityEvent.ts +4 -4
- package/Models/DatabaseModels/Alert.ts +62 -0
- package/Models/DatabaseModels/GlobalConfig.ts +1 -1
- package/Models/DatabaseModels/Incident.ts +66 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +74 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +74 -0
- package/Models/DatabaseModels/Index.ts +6 -4
- package/Models/DatabaseModels/NetworkDevice.ts +67 -0
- package/Models/DatabaseModels/NetworkDeviceDiagnostic.ts +746 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +151 -0
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +1 -1
- package/Models/DatabaseModels/Project.ts +41 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +74 -0
- package/Models/DatabaseModels/SecurityEventConnection.ts +11 -11
- package/Models/DatabaseModels/ServiceLevelObjective.ts +185 -8
- package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +746 -43
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +575 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +582 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +16 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +16 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +75 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +1 -1
- package/Server/API/BaseAPI.ts +17 -0
- package/Server/API/BillingInvoiceAPI.ts +343 -30
- package/Server/API/BillingPaymentMethodAPI.ts +126 -5
- package/Server/API/DashboardAPI.ts +96 -2
- package/Server/API/SecurityEventConnectionAPI.ts +141 -11
- package/Server/API/StatusPageAPI.ts +308 -199
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.ts +36 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.ts +516 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.ts +98 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +138 -67
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +213 -84
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +112 -35
- package/Server/Services/AlertLabelRuleEngineService.ts +299 -217
- package/Server/Services/AlertOwnerRuleEngineService.ts +572 -396
- package/Server/Services/AlertPrivacyRuleEngineService.ts +116 -40
- package/Server/Services/AlertService.ts +111 -4
- package/Server/Services/AuditLogService.ts +612 -59
- package/Server/Services/BillingInvoiceService.ts +112 -102
- package/Server/Services/BillingService.ts +539 -11
- package/Server/Services/CephClusterLabelRuleEngineService.ts +170 -109
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +233 -115
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +163 -100
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +236 -115
- package/Server/Services/DashboardLabelRuleEngineService.ts +145 -84
- package/Server/Services/DashboardOwnerRuleEngineService.ts +213 -95
- package/Server/Services/DatabaseService.ts +171 -21
- package/Server/Services/DockerHostLabelRuleEngineService.ts +171 -110
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +233 -115
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +181 -112
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +243 -118
- package/Server/Services/HostLabelRuleEngineService.ts +167 -106
- package/Server/Services/HostOwnerRuleEngineService.ts +229 -111
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +141 -67
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +272 -72
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +112 -35
- package/Server/Services/IncidentEpisodePublicNoteService.ts +24 -0
- package/Server/Services/IncidentLabelRuleEngineService.ts +279 -204
- package/Server/Services/IncidentOwnerRuleEngineService.ts +595 -425
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +117 -44
- package/Server/Services/IncidentPublicNoteService.ts +24 -0
- package/Server/Services/IncidentService.ts +114 -3
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +147 -83
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +221 -100
- package/Server/Services/Index.ts +6 -4
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +145 -84
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +213 -95
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +181 -112
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +243 -118
- package/Server/Services/LabelService.ts +23 -28
- package/Server/Services/MonitorLabelRuleEngineService.ts +152 -92
- package/Server/Services/MonitorOwnerRuleEngineService.ts +220 -104
- package/Server/Services/MonitorProbeService.ts +20 -2
- package/Server/Services/MonitorService.ts +11 -9
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +376 -5
- package/Server/Services/NetworkDeviceDiagnosticService.ts +417 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +147 -83
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +218 -97
- package/Server/Services/NetworkDeviceService.ts +39 -2
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +151 -80
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +222 -97
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +154 -83
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +225 -100
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +171 -110
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +235 -115
- package/Server/Services/ProjectService.ts +111 -10
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +174 -110
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +239 -116
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +137 -73
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +200 -83
- package/Server/Services/RunbookLabelRuleEngineService.ts +146 -84
- package/Server/Services/RunbookOwnerRuleEngineService.ts +216 -95
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +324 -230
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +613 -428
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +24 -0
- package/Server/Services/ScheduledMaintenanceService.ts +43 -14
- package/Server/Services/SecurityEventConnectionService.ts +56 -4
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +143 -74
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +206 -85
- package/Server/Services/ServiceLabelRuleEngineService.ts +172 -110
- package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +1057 -18
- package/Server/Services/ServiceLevelObjectiveFeedService.ts +108 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +793 -97
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +1069 -0
- package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +240 -1
- package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +257 -1
- package/Server/Services/ServiceLevelObjectiveService.ts +1356 -56
- package/Server/Services/ServiceOwnerRuleEngineService.ts +238 -116
- package/Server/Services/StatusPageAnnouncementService.ts +13 -0
- package/Server/Services/StatusPageLabelRuleEngineService.ts +146 -85
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +210 -99
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +28 -232
- package/Server/Services/StatusPageSubscriberService.ts +6 -0
- package/Server/Services/TelemetryUsageBillingService.ts +38 -7
- package/Server/Services/ThreatIntelFeedService.ts +1 -1
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +173 -110
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +238 -116
- package/Server/Services/WorkflowLabelRuleEngineService.ts +145 -84
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +215 -95
- package/Server/Types/Database/UpdateByID.ts +3 -0
- package/Server/Types/Database/UpdateOneBy.ts +7 -0
- package/Server/Utils/AI/AlertAIContextBuilder.ts +19 -0
- package/Server/Utils/AI/IncidentAIContextBuilder.ts +39 -0
- package/Server/Utils/AI/Toolbox/AlertTools.ts +37 -1
- package/Server/Utils/AI/Toolbox/IncidentTools.ts +22 -1
- package/Server/Utils/AI/Toolbox/SloTools.ts +416 -51
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +151 -13
- package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +17 -4
- package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +155 -8
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +16 -0
- package/Server/Utils/Database/RelationValueUtil.ts +106 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +6 -1
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +22 -27
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +3 -1
- package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +50 -20
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +13 -1
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +6 -11
- package/Server/Utils/Rules/MonitorRulePatternValidator.ts +51 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +110 -0
- package/Server/Utils/Rules/RuleRun/RuleApplication.ts +81 -0
- package/Server/Utils/Rules/RuleRun/RuleRunPermission.ts +188 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +803 -0
- package/Server/Utils/Rules/RuleRun/RuleRunner.ts +341 -0
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +3 -2
- package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +6 -4
- package/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.ts +263 -16
- package/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.ts +2101 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +194 -14
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +1 -2
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +38 -7
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +2 -0
- package/Server/Utils/SecurityEvent/Connectors/Types.ts +242 -2
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +1 -1
- package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +3 -3
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +2 -2
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +217 -56
- package/Server/Utils/Slo/SloFeedUtil.ts +200 -0
- package/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.ts +173 -0
- package/Server/Utils/Slo/SloMetricUtil.ts +327 -0
- package/Server/Utils/Slo/SloOwnerReferenceValidator.ts +208 -0
- package/Server/Utils/Slo/SloRecordReferenceValidator.ts +169 -0
- package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +6 -43
- package/Server/Utils/StatusPageResource.ts +50 -5
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +664 -15
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +4 -1
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +307 -0
- package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +289 -0
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +598 -0
- package/Tests/App/Dashboard/BillingDefaultPaymentMethod.test.tsx +1046 -0
- package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +3 -0
- package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +201 -7
- package/Tests/App/Dashboard/BooleanSeriesCriteriaFilterText.test.ts +82 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +16 -1
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +116 -8
- package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +168 -1
- package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +1 -1
- package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +20 -3
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +1095 -1
- package/Tests/App/Dashboard/CorrelateFilterChips.test.tsx +910 -0
- package/Tests/App/Dashboard/CorrelateGraph.test.tsx +3747 -25
- package/Tests/App/Dashboard/CorrelateGraphHelpers.test.ts +1085 -0
- package/Tests/App/Dashboard/CorrelateInspector.test.tsx +1534 -0
- package/Tests/App/Dashboard/CorrelateNodeCard.test.tsx +965 -0
- package/Tests/App/Dashboard/CorrelateResultSummary.test.tsx +1525 -0
- package/Tests/App/Dashboard/CorrelationGraph.test.ts +1030 -0
- package/Tests/App/Dashboard/CorrelationGraphLayout.test.ts +526 -0
- package/Tests/App/Dashboard/DeviceDiagnostics.test.tsx +787 -0
- package/Tests/App/Dashboard/DeviceLatencyTrend.test.tsx +278 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +279 -0
- package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +87 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +443 -8
- package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +340 -0
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +98 -2
- package/Tests/App/Dashboard/ExceptionSegmentedControl.test.tsx +1020 -0
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +268 -47
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1114 -76
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +124 -2
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +279 -176
- package/Tests/App/Dashboard/InvestigationRunDetails.test.tsx +1166 -0
- package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +437 -0
- package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +65 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +5 -0
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +74 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +125 -5
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +1764 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1000 -64
- package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +448 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +739 -189
- package/Tests/App/Dashboard/SecurityEventSeverityPill.test.tsx +233 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +282 -0
- package/Tests/App/Dashboard/SloActiveBurnEventsCard.test.tsx +538 -0
- package/Tests/App/Dashboard/SloBulkActionsArchive.test.tsx +252 -0
- package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +322 -518
- package/Tests/App/Dashboard/SloElement.test.tsx +194 -0
- package/Tests/App/Dashboard/SloFeed.test.tsx +289 -0
- package/Tests/App/Dashboard/SloHistoryCharts.test.tsx +471 -0
- package/Tests/App/Dashboard/SloHistorySeries.test.tsx +607 -0
- package/Tests/App/Dashboard/SloListWidget.test.tsx +783 -0
- package/Tests/App/Dashboard/SloMetricsPage.test.tsx +346 -0
- package/Tests/App/Dashboard/SloMonitorsPage.test.tsx +661 -0
- package/Tests/App/Dashboard/SloMonitorsSummaryCard.test.tsx +489 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +437 -0
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +305 -0
- package/Tests/App/Dashboard/SloOverviewData.test.tsx +563 -0
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +311 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +426 -0
- package/Tests/App/Dashboard/SloOverviewSidebarCards.test.tsx +493 -0
- package/Tests/App/Dashboard/SloSettings.test.tsx +633 -0
- package/Tests/App/Dashboard/SloStatusSummaryCards.test.tsx +403 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +373 -0
- package/Tests/App/Dashboard/SloWidgetVariableBinding.test.tsx +689 -0
- package/Tests/App/Dashboard/TopologyConnectivitySection.test.tsx +206 -0
- package/Tests/App/Dashboard/TracesEntityNames.test.tsx +47 -15
- package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +1312 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +9 -1
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +14 -16
- package/Tests/Models/DatabaseModels/AuditLogModelConfiguration.test.ts +442 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +9 -10
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +48 -1
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +835 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +3 -2
- package/Tests/Models/DiscoveryScanNetbiosLookupColumn.test.ts +328 -0
- package/Tests/Models/DiscoveryScanShortDeviceNamesColumn.test.ts +335 -0
- package/Tests/Models/NetworkDeviceDiagnosticContract.test.ts +194 -0
- package/Tests/Models/NetworkDeviceDnsNameColumn.test.ts +321 -0
- package/Tests/Models/ProjectDataResidencyColumn.test.ts +154 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +181 -50
- package/Tests/Server/API/BaseAPI.test.ts +6 -0
- package/Tests/Server/API/BaseAPIUpdateMiscDataProps.test.ts +217 -0
- package/Tests/Server/API/BillingInvoiceAPI.test.ts +7 -0
- package/Tests/Server/API/BillingInvoiceAPIPaymentStates.test.ts +990 -0
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +498 -0
- package/Tests/Server/API/DashboardPublicSloAPI.test.ts +405 -0
- package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +901 -7
- package/Tests/Server/API/SessionReplayAPI.test.ts +116 -0
- package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +857 -0
- package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +1084 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +33 -3
- package/Tests/Server/Infrastructure/Postgres/AddDataResidencyToProjectMigration.test.ts +202 -0
- package/Tests/Server/Infrastructure/Postgres/AddNetbiosLookupToNetworkDeviceDiscoveryScanMigration.test.ts +330 -0
- package/Tests/Server/Infrastructure/Postgres/AddNetworkDeviceDnsNameAndShortDeviceNamesMigration.test.ts +340 -0
- package/Tests/Server/Infrastructure/Postgres/BackfillSloMonitorRulesAndAffectedResourcesMigration.test.ts +343 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +801 -0
- package/Tests/Server/Services/AddSubscriberUpdateNotificationStatusMigration.test.ts +307 -0
- package/Tests/Server/Services/AuditLogService.test.ts +1124 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +200 -1
- package/Tests/Server/Services/BillingInvoiceServiceMutexRelease.test.ts +254 -0
- package/Tests/Server/Services/BillingService.test.ts +70 -0
- package/Tests/Server/Services/BillingServicePayInvoiceStates.test.ts +723 -0
- package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +14 -2
- package/Tests/Server/Services/BillingServiceSubscriptionPaymentMethodSync.test.ts +1634 -0
- package/Tests/Server/Services/DatabaseServiceAuditRelationDiff.test.ts +492 -0
- package/Tests/Server/Services/DatabaseServicePasswordFieldSecrets.test.ts +629 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +431 -0
- package/Tests/Server/Services/IncidentAlertSloReferenceGuard.test.ts +358 -0
- package/Tests/Server/Services/MonitorProbeServicePastDueMonitoring.test.ts +362 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1460 -1
- package/Tests/Server/Services/NetworkDeviceDiagnosticService.test.ts +962 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +106 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +10 -1
- package/Tests/Server/Services/NetworkDeviceServicePastDueMonitoring.test.ts +335 -0
- package/Tests/Server/Services/NetworkDeviceSiteRuleDnsName.test.ts +568 -0
- package/Tests/Server/Services/ProjectDataResidencyPostgres.test.ts +344 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +187 -0
- package/Tests/Server/Services/ProjectServiceDataResidency.test.ts +369 -0
- package/Tests/Server/Services/ProjectServiceDataResidencySelfHosted.test.ts +176 -0
- package/Tests/Server/Services/ProjectServicePastDueMonitoring.test.ts +289 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +24 -8
- package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +1396 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupARun.test.ts +917 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +1262 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +902 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +1163 -0
- package/Tests/Server/Services/RuleRun/PrivacyRuleEnginesRun.test.ts +843 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +465 -0
- package/Tests/Server/Services/SecurityEventConnectionService.test.ts +525 -4
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +77 -23
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleFeedWrites.test.ts +777 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleOptions.test.ts +1399 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +67 -74
- package/Tests/Server/Services/ServiceLevelObjectiveChildRowTenancy.test.ts +906 -0
- package/Tests/Server/Services/ServiceLevelObjectiveDeleteTenancy.test.ts +1029 -0
- package/Tests/Server/Services/ServiceLevelObjectiveFeedService.test.ts +313 -0
- package/Tests/Server/Services/ServiceLevelObjectiveFeedWrites.test.ts +1214 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMarkdownLink.test.ts +289 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +1455 -430
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleLegacyLabelAdoption.test.ts +634 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +1193 -0
- package/Tests/Server/Services/{SloMonitorLabelRuleHooks.test.ts → ServiceLevelObjectiveMonitorRuleTriggers.test.ts} +135 -41
- package/Tests/Server/Services/ServiceLevelObjectiveOwnerFeedWrites.test.ts +671 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +180 -85
- package/Tests/Server/Services/ServiceLevelObjectiveServiceArchive.test.ts +537 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceLegacyMonitorLabelWrite.test.ts +870 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceMonitorRuleGuard.test.ts +343 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceReEvaluation.test.ts +246 -0
- package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +501 -0
- package/Tests/Server/Services/SloAffectedResourceLinkContract.test.ts +86 -0
- package/Tests/Server/Services/SloAffectedResourceMetricAttributes.test.ts +547 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +10 -4
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +7 -2
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +174 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateServiceVariables.test.ts +40 -0
- package/Tests/Server/Services/SubscriberUpdateNotificationHooks.test.ts +541 -0
- package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +288 -0
- package/Tests/Server/TestingUtils/PastDueMonitoringClaimSql.ts +177 -0
- package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +51 -10
- package/Tests/Server/TestingUtils/__mocks__/Stripe.mock.ts +16 -1
- package/Tests/Server/Types/Database/Permissions/ProjectDataResidencyColumn.test.ts +386 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +26 -36
- package/Tests/Server/Utils/AI/SloAffectedResourceAIContext.test.ts +445 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +423 -1
- package/Tests/Server/Utils/AI/SloToolsArchive.test.ts +294 -0
- package/Tests/Server/Utils/AI/SloToolsRuleReadPermissions.test.ts +297 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +255 -10
- package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +404 -750
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +45 -0
- package/Tests/Server/Utils/Database/RelationValueUtil.test.ts +157 -0
- package/Tests/Server/Utils/Monitor/Criteria/BooleanSeriesEvaluateOverTime.test.ts +260 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +181 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +147 -30
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.test.ts +17 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +136 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidatorLoadOrder.test.ts +472 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +48 -2
- package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +435 -475
- package/Tests/Server/Utils/Rules/MonitorRulePatternValidator.test.ts +77 -0
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +177 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +365 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunRegistry.test.ts +173 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunner.test.ts +675 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +8 -8
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorFetchSummary.test.ts +261 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +68 -13
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsAuth.test.ts → Connectors/GoogleSecOps/GoogleSecOpsAuth.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClient.test.ts → Connectors/GoogleSecOps/GoogleSecOpsClient.test.ts} +4 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.test.ts +483 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorCuratedAndLateAlerts.test.ts +676 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFetchEvents.test.ts +1994 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFixtures.ts +332 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorHttpIntegration.test.ts +680 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorRequestContract.test.ts +1206 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorTestConnection.test.ts +1136 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsCuratedRuleCounts.test.ts +407 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsErrorHandling.test.ts → Connectors/GoogleSecOps/GoogleSecOpsErrorHandling.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingAdaptiveCatchUp.test.ts +730 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClickhouseIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts} +130 -35
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFailureTaxonomy.test.ts +772 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFixtures.ts +648 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsHttpIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingHttpIntegration.test.ts} +230 -225
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingIntegration.test.ts +1390 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingLoop.test.ts +981 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingNothingImportedRegression.test.ts +290 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsRequestContract.test.ts → Connectors/GoogleSecOps/GoogleSecOpsRequestContract.test.ts} +2 -2
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsResponseParsing.test.ts → Connectors/GoogleSecOps/GoogleSecOpsResponseParsing.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsSearchDetections.test.ts → Connectors/GoogleSecOps/GoogleSecOpsSearchDetections.test.ts} +38 -5
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsTesterIntegration.test.ts +421 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +1445 -3
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +14 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +313 -4
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +352 -0
- package/Tests/Server/Utils/Slo/SloFeedUtil.test.ts +326 -0
- package/Tests/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.test.ts +260 -0
- package/Tests/Server/Utils/Slo/SloMetricUtil.test.ts +592 -0
- package/Tests/Server/Utils/Slo/SloRecordReferenceValidator.test.ts +311 -0
- package/Tests/Server/Utils/StatusPageResource.test.ts +91 -3
- package/Tests/Types/Billing/SubscriptionStatus.test.ts +176 -0
- package/Tests/Types/Billing/SubscriptionStatusPastDueMonitoring.test.ts +187 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +53 -7
- package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +816 -792
- package/Tests/Types/Monitor/CriteriaFilter.test.ts +216 -24
- package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepRetriesParsing.test.ts +201 -0
- package/Tests/Types/Rules/RuleRun.test.ts +315 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +60 -0
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +29 -4
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +217 -0
- package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +200 -0
- package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +141 -87
- package/Tests/UI/Components/AlertBanner.test.tsx +319 -0
- package/Tests/UI/Components/BulkArchiveActionsCopy.test.tsx +310 -0
- package/Tests/UI/Components/Detail/DetailIdIsUnique.test.tsx +87 -0
- package/Tests/UI/Components/Dropdown/DropdownClearable.test.tsx +393 -0
- package/Tests/UI/Components/Dropdown/DropdownMultiSelectChipAccessibleName.test.tsx +64 -0
- package/Tests/UI/Components/EmptyState/EmptyState.test.tsx +335 -4
- package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +337 -0
- package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +21 -20
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +15 -2
- package/Tests/UI/Components/LockedFilterChip.test.tsx +281 -144
- package/Tests/UI/Components/MoreMenu.test.tsx +133 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +84 -3
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/RuleRun/RuleDetailFields.test.tsx +336 -0
- package/Tests/UI/Components/RuleRun/RuleTable.test.tsx +304 -0
- package/Tests/UI/Components/RuleRun/RunRuleNowModal.test.tsx +231 -0
- package/Tests/UI/Components/RuleRun/RunRulesBulkAction.test.ts +213 -0
- package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +124 -61
- package/Tests/UI/Rum/ReplayEngine.test.ts +154 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +234 -123
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +122 -0
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +245 -0
- package/Tests/UI/Rum/ReplayRail.test.tsx +294 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +213 -1
- package/Tests/UI/Rum/ReplayStage.test.tsx +565 -172
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +260 -3
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +1391 -0
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +222 -0
- package/Tests/UI/Utils/DashboardStackingLayers.test.ts +8 -1
- package/Tests/UI/Utils/RuleRunClient.test.ts +303 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +1 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +2 -0
- package/Tests/Utils/Dashboard/Components/DashboardSloListComponent.test.ts +206 -0
- package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +36 -2
- package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +409 -588
- package/Tests/Utils/Dashboard/SloWidgetSource.test.ts +351 -0
- package/Tests/Utils/Markdown/MarkdownEscape.test.ts +361 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +1425 -118
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +188 -3
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +661 -13
- package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +349 -0
- package/Tests/Utils/NetworkDiscovery/RunImportedDeviceNaming.test.ts +656 -0
- package/Tests/Utils/NetworkDiscovery/ShortDeviceNamePlanner.test.ts +1020 -0
- package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +619 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +317 -0
- package/Tests/Utils/Project/DataResidency.test.ts +198 -0
- package/Tests/Utils/Rules/RuleRunSummary.test.ts +394 -0
- package/Tests/Utils/Slo/SloAffectedResourceMarkdown.test.ts +302 -0
- package/Tests/Utils/Slo/SloBurnRateTemplate.test.ts +468 -0
- package/Tests/Utils/Slo/SloEvaluation.test.ts +20 -4
- package/Tests/Utils/Slo/SloFeedMarkdown.test.ts +1185 -0
- package/Tests/Utils/Slo/SloHealth.test.ts +262 -0
- package/Tests/Utils/Slo/SloHistoryMetricName.test.ts +102 -0
- package/Tests/Utils/Slo/SloListWidgetFormat.test.ts +522 -0
- package/Tests/Utils/Slo/SloMetricType.test.ts +355 -0
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +387 -0
- package/Tests/Utils/Slo/SloMonitorStatusSummary.test.ts +210 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +226 -0
- package/Tests/Utils/Slo/SloProjection.test.ts +1039 -0
- package/Tests/Utils/Slo/SloWidgetFormat.test.ts +47 -0
- package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +1 -80
- package/Types/BaseDatabase/EnableAuditLogOn.ts +41 -0
- package/Types/Billing/SubscriptionStatus.ts +39 -4
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +5 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +10 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloListComponent.ts +29 -0
- package/Types/Dashboard/DashboardTemplates.ts +290 -297
- package/Types/Database/EnableAuditLog.ts +23 -1
- package/Types/Email/EmailTemplateType.ts +4 -0
- package/Types/Monitor/CriteriaFilter.ts +55 -8
- package/Types/Monitor/MonitorStep.ts +5 -2
- package/Types/Monitor/MonitorStepDnsMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepDnssecMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepDomainMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepExternalStatusPageMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepRetries.ts +59 -0
- package/Types/Monitor/MonitorStepSnmpMonitor.ts +9 -2
- package/Types/NetworkDevice/NetworkDeviceDiagnosticResult.ts +104 -0
- package/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.ts +47 -0
- package/Types/NetworkDevice/NetworkDeviceDiagnosticType.ts +47 -0
- package/Types/NetworkDevice/NetworkDevicePingMetricNames.ts +20 -0
- package/Types/Permission.ts +127 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +5 -0
- package/Types/Rules/RuleRun.ts +518 -0
- package/Types/Rum/SessionReplayApi.ts +18 -0
- package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +6 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +30 -4
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +108 -1
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +6 -2
- package/Types/ServiceLevelObjective/SloHistoryMetricName.ts +25 -0
- package/Types/ServiceLevelObjective/SloMetricType.ts +49 -0
- package/Types/StatusPage/StatusPageSubscriberNotificationEventType.ts +4 -0
- package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +331 -0
- package/Types/StatusPage/SubscriberNotificationTrigger.ts +12 -0
- package/Types/StatusPage/SubscriberUpdateNotification.ts +89 -0
- package/Types/Telemetry/LockedFilterDetail.ts +7 -28
- package/Types/Telemetry/ServiceType.ts +7 -0
- package/Typings/Index.d.ts +53 -3
- package/UI/Components/AlertBanner/AlertBanner.tsx +85 -27
- package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +21 -2
- package/UI/Components/Detail/Detail.tsx +9 -2
- package/UI/Components/Dropdown/Dropdown.tsx +64 -1
- package/UI/Components/EmptyState/EmptyState.tsx +27 -3
- package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +124 -0
- package/UI/Components/Forms/ModelForm.tsx +6 -5
- package/UI/Components/LabelRule/LabelRuleTable.tsx +8 -2
- package/UI/Components/LogsViewer/LogsViewer.tsx +2 -6
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +2 -13
- package/UI/Components/LogsViewer/types.ts +2 -2
- package/UI/Components/MoreMenu/MoreMenu.tsx +14 -3
- package/UI/Components/RuleRun/RuleDetailFields.tsx +359 -0
- package/UI/Components/RuleRun/RuleTable.tsx +183 -0
- package/UI/Components/RuleRun/RuleView.tsx +170 -0
- package/UI/Components/RuleRun/RunRuleNowModal.tsx +147 -0
- package/UI/Components/RuleRun/RunRulesBulkAction.ts +103 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +2 -6
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +38 -104
- package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +2 -18
- package/UI/Components/TelemetryViewer/types.ts +2 -2
- package/UI/Utils/Rules/RuleRunClient.ts +178 -0
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +8 -0
- package/Utils/Dashboard/Components/DashboardSloComponent.ts +19 -2
- package/Utils/Dashboard/Components/DashboardSloListComponent.ts +126 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/Dashboard/SloWidgetSource.ts +188 -0
- package/Utils/Markdown/MarkdownEscape.ts +63 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +161 -36
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +25 -0
- package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +146 -0
- package/Utils/NetworkDiscovery/RunImportedDeviceNaming.ts +390 -0
- package/Utils/NetworkDiscovery/ShortDeviceNamePlanner.ts +291 -0
- package/Utils/NetworkDiscovery/ShortHostnameUtil.ts +91 -0
- package/Utils/NetworkSite/CidrMatchUtil.ts +37 -12
- package/Utils/Project/DataResidency.ts +63 -0
- package/Utils/Rules/RuleRunSummary.ts +323 -0
- package/Utils/Slo/SloAffectedResourceMarkdown.ts +123 -0
- package/Utils/Slo/SloBurnRateTemplate.ts +373 -0
- package/Utils/Slo/SloFeedMarkdown.ts +1507 -0
- package/Utils/Slo/SloHealth.ts +96 -9
- package/Utils/Slo/SloListWidgetFormat.ts +370 -0
- package/Utils/Slo/SloMetricType.ts +237 -0
- package/Utils/Slo/SloMonitorRuleCriteria.ts +364 -0
- package/Utils/Slo/SloMonitorStatusSummary.ts +210 -0
- package/Utils/Slo/SloOverviewText.ts +265 -0
- package/Utils/Slo/SloProjection.ts +967 -0
- package/Utils/Slo/SloWidgetFormat.ts +12 -2
- package/Utils/Telemetry/LockedFilterSearch.ts +3 -49
- package/build/dist/Models/AnalyticsModels/AuditLog.js +70 -1
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +4 -4
- package/build/dist/Models/DatabaseModels/Alert.js +60 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +64 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +6 -4
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +68 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js +772 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +140 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +42 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +11 -11
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +192 -10
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +798 -96
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +596 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +590 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +16 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +16 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +75 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +1 -1
- package/build/dist/Server/API/BaseAPI.js +14 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +233 -19
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +86 -5
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +72 -2
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/SecurityEventConnectionAPI.js +102 -10
- package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +236 -154
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js +21 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js +207 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js +72 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +112 -56
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +167 -68
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +87 -26
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +270 -203
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +498 -354
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +97 -34
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +91 -8
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AuditLogService.js +408 -44
- package/build/dist/Server/Services/AuditLogService.js.map +1 -1
- package/build/dist/Server/Services/BillingInvoiceService.js +94 -85
- package/build/dist/Server/Services/BillingInvoiceService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +406 -14
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +135 -86
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +189 -100
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +125 -18
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +145 -91
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +191 -101
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +190 -102
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +112 -56
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +220 -63
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +87 -26
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +258 -192
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +519 -376
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +95 -32
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +90 -5
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +113 -65
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +6 -4
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +145 -91
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +191 -101
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +20 -25
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +123 -77
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +167 -82
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +18 -2
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +11 -9
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +287 -5
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js +333 -0
- package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +36 -2
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +117 -64
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +173 -83
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +116 -65
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +82 -10
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +111 -63
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +161 -77
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +280 -209
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +521 -376
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +24 -0
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +24 -8
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventConnectionService.js +43 -3
- package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +115 -62
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +163 -77
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +769 -18
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js +96 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +614 -87
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +844 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +207 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +221 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +997 -50
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +191 -102
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageAnnouncementService.js +12 -0
- package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +118 -70
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +158 -76
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +19 -215
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +6 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +27 -5
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +1 -1
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +17 -0
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +31 -0
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +24 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +21 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +337 -53
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +108 -15
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +2 -2
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +115 -6
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +13 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/Database/RelationValueUtil.js +82 -0
- package/build/dist/Server/Utils/Database/RelationValueUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +10 -6
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +17 -21
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +5 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +50 -10
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +13 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +6 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js +34 -0
- package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +69 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js +128 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +746 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js +221 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +6 -4
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.js +174 -14
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js +1417 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +138 -18
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +1 -2
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +23 -18
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +2 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +95 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +3 -3
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +2 -2
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +118 -40
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/Slo/SloFeedUtil.js +150 -0
- package/build/dist/Server/Utils/Slo/SloFeedUtil.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js +136 -0
- package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloMetricUtil.js +269 -0
- package/build/dist/Server/Utils/Slo/SloMetricUtil.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js +134 -0
- package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js +137 -0
- package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +6 -26
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageResource.js +31 -5
- package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
- package/build/dist/Types/Billing/SubscriptionStatus.js +37 -3
- package/build/dist/Types/Billing/SubscriptionStatus.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +5 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +275 -286
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Database/EnableAuditLog.js +19 -1
- package/build/dist/Types/Database/EnableAuditLog.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +4 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -6
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +2 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepRetries.js +47 -0
- package/build/dist/Types/Monitor/MonitorStepRetries.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js.map +1 -1
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js +29 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js +37 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js +42 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js +20 -0
- package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js.map +1 -0
- package/build/dist/Types/Permission.js +114 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +5 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +267 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +16 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +65 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +6 -2
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -1
- package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js +26 -0
- package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloMetricType.js +45 -0
- package/build/dist/Types/ServiceLevelObjective/SloMetricType.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js +4 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js.map +1 -1
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +295 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js +13 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +67 -0
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js +7 -7
- package/build/dist/Types/Telemetry/ServiceType.js +7 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/AlertBanner/AlertBanner.js +48 -19
- package/build/dist/UI/Components/AlertBanner/AlertBanner.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +10 -2
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +12 -3
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -5
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js +3 -3
- package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +47 -0
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +1 -0
- package/build/dist/UI/Components/Forms/ModelForm.js +6 -5
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +6 -2
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +0 -2
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +3 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/RuleRun/RuleDetailFields.js +226 -0
- package/build/dist/UI/Components/RuleRun/RuleDetailFields.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RuleTable.js +97 -0
- package/build/dist/UI/Components/RuleRun/RuleTable.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RuleView.js +83 -0
- package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js +74 -0
- package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js +78 -0
- package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +24 -50
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +0 -4
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Utils/Rules/RuleRunClient.js +98 -0
- package/build/dist/UI/Utils/Rules/RuleRunClient.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +8 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +16 -2
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js +94 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Dashboard/SloWidgetSource.js +125 -0
- package/build/dist/Utils/Dashboard/SloWidgetSource.js.map +1 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js +49 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +112 -34
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +22 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +129 -0
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js +255 -0
- package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js +184 -0
- package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js +79 -0
- package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +21 -12
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
- package/build/dist/Utils/Project/DataResidency.js +51 -0
- package/build/dist/Utils/Project/DataResidency.js.map +1 -0
- package/build/dist/Utils/Rules/RuleRunSummary.js +197 -0
- package/build/dist/Utils/Rules/RuleRunSummary.js.map +1 -0
- package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js +51 -0
- package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js.map +1 -0
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +228 -0
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js.map +1 -0
- package/build/dist/Utils/Slo/SloFeedMarkdown.js +934 -0
- package/build/dist/Utils/Slo/SloFeedMarkdown.js.map +1 -0
- package/build/dist/Utils/Slo/SloHealth.js +75 -9
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloListWidgetFormat.js +217 -0
- package/build/dist/Utils/Slo/SloListWidgetFormat.js.map +1 -0
- package/build/dist/Utils/Slo/SloMetricType.js +212 -0
- package/build/dist/Utils/Slo/SloMetricType.js.map +1 -0
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +216 -0
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -0
- package/build/dist/Utils/Slo/SloMonitorStatusSummary.js +129 -0
- package/build/dist/Utils/Slo/SloMonitorStatusSummary.js.map +1 -0
- package/build/dist/Utils/Slo/SloOverviewText.js +110 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -0
- package/build/dist/Utils/Slo/SloProjection.js +448 -0
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -0
- package/build/dist/Utils/Slo/SloWidgetFormat.js +4 -2
- package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -1
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js +1 -26
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -1
- package/package.json +1 -1
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +0 -447
- package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +0 -263
- package/Server/API/GoogleSecOpsConnectionAPI.ts +0 -320
- package/Server/Services/GoogleSecOpsConnectionRunService.ts +0 -10
- package/Server/Services/GoogleSecOpsConnectionService.ts +0 -116
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +0 -777
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +0 -1373
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +0 -512
- package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +0 -838
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +0 -441
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +0 -1001
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +0 -657
- package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +0 -153
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +0 -784
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +0 -823
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +0 -918
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +0 -738
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +0 -874
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +0 -1297
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +0 -1577
- package/Tests/UI/Components/LockedFilterActions.test.tsx +0 -396
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +0 -111
- package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +0 -205
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +0 -478
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +0 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +0 -287
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +0 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +0 -231
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +0 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +0 -9
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +0 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +0 -70
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +0 -537
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +0 -1034
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +0 -410
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +0 -1
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +0 -2
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +0 -1
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +0 -88
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +0 -1
|
@@ -1,28 +1,13 @@
|
|
|
1
|
+
import Label from "../../../../Models/DatabaseModels/Label";
|
|
1
2
|
import MetricType from "../../../../Models/DatabaseModels/MetricType";
|
|
2
|
-
import MutableMetric from "../../../../Models/AnalyticsModels/MutableMetric";
|
|
3
|
-
import Alert from "../../../../Models/DatabaseModels/Alert";
|
|
4
|
-
import AlertSeverity from "../../../../Models/DatabaseModels/AlertSeverity";
|
|
5
|
-
import AlertState from "../../../../Models/DatabaseModels/AlertState";
|
|
6
|
-
import AlertStateTimeline from "../../../../Models/DatabaseModels/AlertStateTimeline";
|
|
7
|
-
import Incident from "../../../../Models/DatabaseModels/Incident";
|
|
8
|
-
import IncidentOwnerTeam from "../../../../Models/DatabaseModels/IncidentOwnerTeam";
|
|
9
|
-
import IncidentOwnerUser from "../../../../Models/DatabaseModels/IncidentOwnerUser";
|
|
10
|
-
import IncidentSeverity from "../../../../Models/DatabaseModels/IncidentSeverity";
|
|
11
|
-
import Monitor from "../../../../Models/DatabaseModels/Monitor";
|
|
12
|
-
import Semaphore from "../../../../Server/Infrastructure/Semaphore";
|
|
13
|
-
import AlertService from "../../../../Server/Services/AlertService";
|
|
14
|
-
import AlertStateTimelineService from "../../../../Server/Services/AlertStateTimelineService";
|
|
15
3
|
import GlobalConfigService from "../../../../Server/Services/GlobalConfigService";
|
|
16
|
-
import IncidentOwnerTeamService from "../../../../Server/Services/IncidentOwnerTeamService";
|
|
17
|
-
import IncidentOwnerUserService from "../../../../Server/Services/IncidentOwnerUserService";
|
|
18
|
-
import IncidentService from "../../../../Server/Services/IncidentService";
|
|
19
4
|
import MetricService from "../../../../Server/Services/MetricService";
|
|
20
|
-
import
|
|
21
|
-
import
|
|
22
|
-
import NetworkDeviceMetricUtil from "../../../../Server/Utils/Monitor/NetworkDeviceMetricUtil";
|
|
5
|
+
import logger from "../../../../Server/Utils/Logger";
|
|
6
|
+
import SloMetricUtil from "../../../../Server/Utils/Slo/SloMetricUtil";
|
|
23
7
|
import TelemetryUtil from "../../../../Server/Utils/Telemetry/Telemetry";
|
|
24
8
|
import AlertMetricType from "../../../../Types/Alerts/AlertMetricType";
|
|
25
9
|
import DashboardBaseComponent from "../../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
|
|
10
|
+
import DashboardComponentType from "../../../../Types/Dashboard/DashboardComponentType";
|
|
26
11
|
import {
|
|
27
12
|
DashboardTemplateType,
|
|
28
13
|
getTemplateConfig,
|
|
@@ -32,12 +17,16 @@ import DashboardVariable, {
|
|
|
32
17
|
} from "../../../../Types/Dashboard/DashboardVariable";
|
|
33
18
|
import DashboardViewConfig from "../../../../Types/Dashboard/DashboardViewConfig";
|
|
34
19
|
import Dictionary from "../../../../Types/Dictionary";
|
|
20
|
+
import IncidentMetricType from "../../../../Types/Incident/IncidentMetricType";
|
|
35
21
|
import { JSONObject } from "../../../../Types/JSON";
|
|
36
22
|
import MonitorMetricType from "../../../../Types/Monitor/MonitorMetricType";
|
|
37
|
-
import PingMonitorResponse from "../../../../Types/Monitor/PingMonitor/PingMonitorResponse";
|
|
38
|
-
import SnmpMonitorResponse from "../../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
|
|
39
23
|
import ObjectID from "../../../../Types/ObjectID";
|
|
40
|
-
import
|
|
24
|
+
import SloMetricType from "../../../../Types/ServiceLevelObjective/SloMetricType";
|
|
25
|
+
import ServiceType from "../../../../Types/Telemetry/ServiceType";
|
|
26
|
+
import { SLO_LIST_ATTRIBUTE_TO_COLUMN } from "../../../../Utils/Slo/SloListWidgetFormat";
|
|
27
|
+
import SloMetricTypeUtil, {
|
|
28
|
+
SLO_METRIC_SLO_NAME_ATTRIBUTE,
|
|
29
|
+
} from "../../../../Utils/Slo/SloMetricType";
|
|
41
30
|
import {
|
|
42
31
|
afterEach,
|
|
43
32
|
beforeEach,
|
|
@@ -48,60 +37,39 @@ import {
|
|
|
48
37
|
} from "@jest/globals";
|
|
49
38
|
|
|
50
39
|
/*
|
|
51
|
-
* The SLO dashboard template queries metric series by NAME
|
|
52
|
-
*
|
|
53
|
-
* is
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
40
|
+
* The SLO dashboard template queries metric series by NAME, fans them out and
|
|
41
|
+
* scopes them by one attribute KEY, and labels them with a UNIT. None of the
|
|
42
|
+
* three is checked by the compiler across the two sides: the template spells
|
|
43
|
+
* them, and SloMetricUtil — called by the evaluation worker — decides what
|
|
44
|
+
* actually lands in the metric store. Rename either side and nothing fails to
|
|
45
|
+
* compile; the dashboard just renders empty charts, an empty toolbar picker,
|
|
46
|
+
* or numbers under the wrong unit, in every project.
|
|
57
47
|
*
|
|
58
48
|
* So this suite drives the template side from getTemplateConfig and the
|
|
59
|
-
* emitter side from the
|
|
60
|
-
* asserts they still meet
|
|
61
|
-
* own comments make about code in other files:
|
|
49
|
+
* emitter side from the REAL SloMetricUtil.saveSloMetrics (never from source
|
|
50
|
+
* text), and asserts they still meet:
|
|
62
51
|
*
|
|
63
|
-
* -
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* every network device".
|
|
69
|
-
* - IncidentService stamps `monitorNames` (plural, comma-joined), which
|
|
70
|
-
* the Monitor variable can never match — the reason incident METRICS
|
|
71
|
-
* are off this dashboard.
|
|
72
|
-
* - AlertService stamps the singular `monitorName`, which it can match —
|
|
73
|
-
* so alert metrics are off the dashboard for a different reason
|
|
74
|
-
* (a burn-rate alert carries no monitor at all), not this one.
|
|
52
|
+
* - every `oneuptime.slo.*` series the template queries is written,
|
|
53
|
+
* - with the BARE `sloName` attribute the toolbar variable binds to, the
|
|
54
|
+
* charts group by, and the SLO List maps to its name column,
|
|
55
|
+
* - published in `attributeKeys`, which is what the variable picker reads,
|
|
56
|
+
* - under the unit the template prints and the aggregation it charts with.
|
|
75
57
|
*/
|
|
76
58
|
|
|
77
59
|
const PROJECT_ID: ObjectID = new ObjectID(
|
|
78
60
|
"11111111-1111-4111-8111-111111111111",
|
|
79
61
|
);
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
);
|
|
83
|
-
const PROBE_ID: ObjectID = new ObjectID("33333333-3333-4333-8333-333333333333");
|
|
84
|
-
const DEVICE_ID: ObjectID = new ObjectID(
|
|
85
|
-
"44444444-4444-4444-8444-444444444444",
|
|
86
|
-
);
|
|
87
|
-
const INCIDENT_ID: ObjectID = new ObjectID(
|
|
88
|
-
"55555555-5555-4555-8555-555555555555",
|
|
89
|
-
);
|
|
90
|
-
const ALERT_ID: ObjectID = new ObjectID("66666666-6666-4666-8666-666666666666");
|
|
91
|
-
const SEVERITY_ID: ObjectID = new ObjectID(
|
|
92
|
-
"77777777-7777-4777-8777-777777777777",
|
|
93
|
-
);
|
|
62
|
+
const SLO_ID: ObjectID = new ObjectID("22222222-2222-4222-8222-222222222222");
|
|
63
|
+
const LABEL_ID: ObjectID = new ObjectID("33333333-3333-4333-8333-333333333333");
|
|
94
64
|
|
|
95
|
-
const
|
|
96
|
-
const DEVICE_NAME: string = "core-sw-01";
|
|
65
|
+
const SLO_NAME: string = "Checkout API";
|
|
97
66
|
|
|
98
67
|
/*
|
|
99
|
-
* The
|
|
100
|
-
*
|
|
101
|
-
*
|
|
68
|
+
* The spellings that fail SILENTLY: a `resource.`-prefixed key (what collector
|
|
69
|
+
* resource attributes carry) offers an empty picker, and `sloId` would offer
|
|
70
|
+
* UUIDs and match no SLO name.
|
|
102
71
|
*/
|
|
103
|
-
const
|
|
104
|
-
const PLURAL_MONITOR_KEY: string = "monitorNames";
|
|
72
|
+
const PREFIXED_SLO_NAME_KEY: string = "resource.sloName";
|
|
105
73
|
|
|
106
74
|
// -- Template-side helpers (read from getTemplateConfig, never literals) ----
|
|
107
75
|
|
|
@@ -129,23 +97,27 @@ function metricQueryConfigOf(
|
|
|
129
97
|
);
|
|
130
98
|
}
|
|
131
99
|
|
|
132
|
-
function
|
|
133
|
-
|
|
100
|
+
function queryDataOf(component: DashboardBaseComponent): WidgetArguments {
|
|
101
|
+
return (
|
|
134
102
|
(metricQueryConfigOf(component)["metricQueryData"] as
|
|
135
103
|
| WidgetArguments
|
|
136
|
-
| undefined) || {}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
104
|
+
| undefined) || {}
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function filterDataOf(component: DashboardBaseComponent): WidgetArguments {
|
|
109
|
+
return (
|
|
110
|
+
(queryDataOf(component)["filterData"] as WidgetArguments | undefined) || {}
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function metricNameOf(component: DashboardBaseComponent): string | undefined {
|
|
115
|
+
const value: unknown = filterDataOf(component)["metricName"];
|
|
140
116
|
|
|
141
117
|
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
142
118
|
}
|
|
143
119
|
|
|
144
|
-
|
|
145
|
-
* Only Chart widgets keep metricAliasData — the Value factory routes
|
|
146
|
-
* through buildMetricQueryData, which drops it — so this returns undefined
|
|
147
|
-
* for tiles by construction, not by accident.
|
|
148
|
-
*/
|
|
120
|
+
// Only Chart widgets keep metricAliasData; tiles take their unit from the catalog.
|
|
149
121
|
function legendUnitOf(component: DashboardBaseComponent): string | undefined {
|
|
150
122
|
const aliasData: WidgetArguments =
|
|
151
123
|
(metricQueryConfigOf(component)["metricAliasData"] as
|
|
@@ -156,23 +128,27 @@ function legendUnitOf(component: DashboardBaseComponent): string | undefined {
|
|
|
156
128
|
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
157
129
|
}
|
|
158
130
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
if (name) {
|
|
167
|
-
names.add(name);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
131
|
+
function metricWidgets(): Array<DashboardBaseComponent> {
|
|
132
|
+
return sloTemplateConfig().components.filter(
|
|
133
|
+
(component: DashboardBaseComponent): boolean => {
|
|
134
|
+
return metricNameOf(component) !== undefined;
|
|
135
|
+
},
|
|
136
|
+
);
|
|
137
|
+
}
|
|
170
138
|
|
|
171
|
-
|
|
139
|
+
// Every distinct metric series the shipped SLO template asks for.
|
|
140
|
+
function metricNamesQueriedBySloTemplate(): Array<string> {
|
|
141
|
+
return Array.from(
|
|
142
|
+
new Set(
|
|
143
|
+
metricWidgets().map((component: DashboardBaseComponent): string => {
|
|
144
|
+
return metricNameOf(component) as string;
|
|
145
|
+
}),
|
|
146
|
+
),
|
|
147
|
+
).sort();
|
|
172
148
|
}
|
|
173
149
|
|
|
174
|
-
|
|
175
|
-
function
|
|
150
|
+
// The attribute key the template's one toolbar variable scopes by.
|
|
151
|
+
function sloVariableAttributeKey(): string {
|
|
176
152
|
const telemetryVariables: Array<DashboardVariable> = (
|
|
177
153
|
sloTemplateConfig().variables || []
|
|
178
154
|
).filter((variable: DashboardVariable): boolean => {
|
|
@@ -194,6 +170,10 @@ function attributesOfRow(row: JSONObject): JSONObject {
|
|
|
194
170
|
return (row["attributes"] as JSONObject | undefined) || {};
|
|
195
171
|
}
|
|
196
172
|
|
|
173
|
+
function attributeKeysOfRow(row: JSONObject): Array<string> {
|
|
174
|
+
return (row["attributeKeys"] as Array<string> | undefined) || [];
|
|
175
|
+
}
|
|
176
|
+
|
|
197
177
|
function rowsNamed(
|
|
198
178
|
rows: Array<JSONObject>,
|
|
199
179
|
metricName: string,
|
|
@@ -206,12 +186,10 @@ function rowsNamed(
|
|
|
206
186
|
describe("SLO template metric emitter contract", () => {
|
|
207
187
|
let insertedRows: Array<JSONObject>;
|
|
208
188
|
let indexedMetricTypes: Dictionary<MetricType>;
|
|
209
|
-
let savedMutableMetrics: Array<MutableMetric>;
|
|
210
189
|
|
|
211
190
|
beforeEach(() => {
|
|
212
191
|
insertedRows = [];
|
|
213
192
|
indexedMetricTypes = {};
|
|
214
|
-
savedMutableMetrics = [];
|
|
215
193
|
|
|
216
194
|
jest
|
|
217
195
|
.spyOn(GlobalConfigService, "findOneBy")
|
|
@@ -231,15 +209,6 @@ describe("SLO template metric emitter contract", () => {
|
|
|
231
209
|
Object.assign(indexedMetricTypes, data.metricNameServiceNameMap);
|
|
232
210
|
},
|
|
233
211
|
);
|
|
234
|
-
jest.spyOn(Semaphore, "lock").mockResolvedValue({} as never);
|
|
235
|
-
jest.spyOn(Semaphore, "release").mockResolvedValue(undefined as never);
|
|
236
|
-
jest
|
|
237
|
-
.spyOn(MutableMetricService, "replaceEntityMetrics")
|
|
238
|
-
.mockImplementation(
|
|
239
|
-
async (data: { metrics: Array<MutableMetric> }): Promise<void> => {
|
|
240
|
-
savedMutableMetrics.push(...data.metrics);
|
|
241
|
-
},
|
|
242
|
-
);
|
|
243
212
|
});
|
|
244
213
|
|
|
245
214
|
afterEach(() => {
|
|
@@ -247,181 +216,98 @@ describe("SLO template metric emitter contract", () => {
|
|
|
247
216
|
});
|
|
248
217
|
|
|
249
218
|
/*
|
|
250
|
-
* One
|
|
251
|
-
*
|
|
252
|
-
* dashboard charts.
|
|
219
|
+
* One evaluation, exactly as the worker hands it over: a named, labelled SLO
|
|
220
|
+
* with a finite value for every series.
|
|
253
221
|
*/
|
|
254
|
-
async function
|
|
255
|
-
|
|
256
|
-
|
|
222
|
+
async function saveEvaluation(
|
|
223
|
+
overrides: { sloName?: string | undefined } = {},
|
|
224
|
+
): Promise<void> {
|
|
225
|
+
const label: Label = new Label();
|
|
226
|
+
label._id = LABEL_ID.toString();
|
|
227
|
+
label.id = LABEL_ID;
|
|
228
|
+
label.name = "team";
|
|
229
|
+
|
|
230
|
+
await SloMetricUtil.saveSloMetrics({
|
|
257
231
|
projectId: PROJECT_ID,
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
probeName: "London Probe",
|
|
232
|
+
sloId: SLO_ID,
|
|
233
|
+
sloName: "sloName" in overrides ? overrides.sloName : SLO_NAME,
|
|
234
|
+
labels: [label],
|
|
235
|
+
values: {
|
|
236
|
+
[SloMetricType.SliPercent]: 99.95,
|
|
237
|
+
[SloMetricType.TargetPercent]: 99.9,
|
|
238
|
+
[SloMetricType.ErrorBudgetRemainingPercent]: 42.5,
|
|
239
|
+
[SloMetricType.ErrorBudgetRemainingSeconds]: 3600,
|
|
240
|
+
[SloMetricType.BurnRate]: 1.25,
|
|
241
|
+
[SloMetricType.Status]: 0,
|
|
242
|
+
},
|
|
270
243
|
});
|
|
271
244
|
}
|
|
272
245
|
|
|
273
|
-
/** One network-device poll that both pinged and walked the device. */
|
|
274
|
-
async function saveDeviceMetrics(): Promise<void> {
|
|
275
|
-
const walk: SnmpMonitorResponse = {
|
|
276
|
-
isOnline: true,
|
|
277
|
-
responseTimeInMs: 42,
|
|
278
|
-
failureCause: "",
|
|
279
|
-
oidResponses: [],
|
|
280
|
-
};
|
|
281
|
-
|
|
282
|
-
const ping: PingMonitorResponse = {
|
|
283
|
-
packetsSent: 2,
|
|
284
|
-
packetsReceived: 2,
|
|
285
|
-
packetLossPercent: 0,
|
|
286
|
-
avgRoundTripTimeInMs: 1.5,
|
|
287
|
-
};
|
|
288
|
-
|
|
289
|
-
await NetworkDeviceMetricUtil.saveWalkMetrics({
|
|
290
|
-
projectId: PROJECT_ID,
|
|
291
|
-
networkDeviceId: DEVICE_ID,
|
|
292
|
-
deviceName: DEVICE_NAME,
|
|
293
|
-
probeId: PROBE_ID,
|
|
294
|
-
snmpResponse: walk,
|
|
295
|
-
responseTimeInMs: walk.responseTimeInMs,
|
|
296
|
-
isOnline: true,
|
|
297
|
-
pingResponse: ping,
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
function mockIncident(): void {
|
|
302
|
-
const incident: Incident = new Incident();
|
|
303
|
-
|
|
304
|
-
incident._id = INCIDENT_ID.toString();
|
|
305
|
-
incident.id = INCIDENT_ID;
|
|
306
|
-
incident.projectId = PROJECT_ID;
|
|
307
|
-
incident.createdAt = new Date("2026-08-10T10:00:00.000Z");
|
|
308
|
-
incident.declaredAt = new Date("2026-08-10T10:00:00.000Z");
|
|
309
|
-
|
|
310
|
-
const monitor: Monitor = new Monitor();
|
|
311
|
-
monitor._id = MONITOR_ID.toString();
|
|
312
|
-
monitor.id = MONITOR_ID;
|
|
313
|
-
monitor.name = MONITOR_NAME;
|
|
314
|
-
incident.monitors = [monitor];
|
|
315
|
-
|
|
316
|
-
const severity: IncidentSeverity = new IncidentSeverity();
|
|
317
|
-
severity._id = SEVERITY_ID.toString();
|
|
318
|
-
severity.id = SEVERITY_ID;
|
|
319
|
-
severity.name = "Critical";
|
|
320
|
-
incident.incidentSeverity = severity;
|
|
321
|
-
|
|
322
|
-
jest
|
|
323
|
-
.spyOn(IncidentService, "findOneById")
|
|
324
|
-
.mockResolvedValue(incident as never);
|
|
325
|
-
jest
|
|
326
|
-
.spyOn(IncidentOwnerUserService, "findBy")
|
|
327
|
-
.mockResolvedValue([] as Array<IncidentOwnerUser> as never);
|
|
328
|
-
jest
|
|
329
|
-
.spyOn(IncidentOwnerTeamService, "findBy")
|
|
330
|
-
.mockResolvedValue([] as Array<IncidentOwnerTeam> as never);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
function mockAlert(): void {
|
|
334
|
-
const alert: Alert = new Alert();
|
|
335
|
-
|
|
336
|
-
alert._id = ALERT_ID.toString();
|
|
337
|
-
alert.id = ALERT_ID;
|
|
338
|
-
alert.projectId = PROJECT_ID;
|
|
339
|
-
alert.createdAt = new Date("2026-08-10T10:00:00.000Z");
|
|
340
|
-
|
|
341
|
-
const monitor: Monitor = new Monitor();
|
|
342
|
-
monitor._id = MONITOR_ID.toString();
|
|
343
|
-
monitor.id = MONITOR_ID;
|
|
344
|
-
monitor.name = MONITOR_NAME;
|
|
345
|
-
alert.monitor = monitor;
|
|
346
|
-
|
|
347
|
-
const severity: AlertSeverity = new AlertSeverity();
|
|
348
|
-
severity._id = SEVERITY_ID.toString();
|
|
349
|
-
severity.id = SEVERITY_ID;
|
|
350
|
-
severity.name = "Critical";
|
|
351
|
-
alert.alertSeverity = severity;
|
|
352
|
-
|
|
353
|
-
const createdState: AlertStateTimeline = new AlertStateTimeline();
|
|
354
|
-
createdState._id = ObjectID.generate().toString();
|
|
355
|
-
createdState.projectId = PROJECT_ID;
|
|
356
|
-
createdState.startsAt = new Date("2026-08-10T10:00:00.000Z");
|
|
357
|
-
createdState.alertState = new AlertState();
|
|
358
|
-
|
|
359
|
-
jest.spyOn(AlertService, "findOneById").mockResolvedValue(alert as never);
|
|
360
|
-
jest
|
|
361
|
-
.spyOn(AlertStateTimelineService, "findBy")
|
|
362
|
-
.mockResolvedValue([createdState] as never);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
246
|
describe("the series the template asks for", () => {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
247
|
+
/*
|
|
248
|
+
* A series added to or removed from the template is a decision: whoever
|
|
249
|
+
* makes it comes here and proves the emitter writes it, with the key the
|
|
250
|
+
* toolbar variable binds to.
|
|
251
|
+
*/
|
|
252
|
+
test("queries exactly the budget and burn series, and nothing else", () => {
|
|
253
|
+
expect(metricNamesQueriedBySloTemplate()).toEqual(
|
|
254
|
+
[
|
|
255
|
+
SloMetricType.BurnRate,
|
|
256
|
+
SloMetricType.ErrorBudgetRemainingPercent,
|
|
257
|
+
SloMetricType.ErrorBudgetRemainingSeconds,
|
|
258
|
+
].sort(),
|
|
377
259
|
);
|
|
378
260
|
});
|
|
379
261
|
|
|
380
|
-
|
|
381
|
-
|
|
262
|
+
/*
|
|
263
|
+
* Monitor, incident and alert series carry monitor keys and never
|
|
264
|
+
* `sloName`, so the SLO variable would leave them showing the whole
|
|
265
|
+
* project under a toolbar naming one SLO.
|
|
266
|
+
*/
|
|
267
|
+
test("names every series through SloMetricType, and none through another catalog", () => {
|
|
382
268
|
const queried: Array<string> = metricNamesQueriedBySloTemplate();
|
|
269
|
+
const foreign: Array<string> = [
|
|
270
|
+
...Object.values(MonitorMetricType),
|
|
271
|
+
...Object.values(IncidentMetricType),
|
|
272
|
+
...Object.values(AlertMetricType),
|
|
273
|
+
];
|
|
383
274
|
|
|
384
|
-
// The template really does query something, so the loop below bites.
|
|
385
275
|
expect(queried.length).toBeGreaterThan(0);
|
|
386
276
|
|
|
387
277
|
for (const metricName of queried) {
|
|
388
278
|
expect(
|
|
389
|
-
`${metricName}:
|
|
390
|
-
).toBe(`${metricName}:
|
|
279
|
+
`${metricName}: SloMetricType=${(Object.values(SloMetricType) as Array<string>).includes(metricName)} foreign=${foreign.includes(metricName)}`,
|
|
280
|
+
).toBe(`${metricName}: SloMetricType=true foreign=false`);
|
|
391
281
|
}
|
|
392
282
|
});
|
|
393
283
|
});
|
|
394
284
|
|
|
395
|
-
describe("
|
|
396
|
-
test("
|
|
397
|
-
await
|
|
285
|
+
describe("SloMetricUtil, the emitter the template queries", () => {
|
|
286
|
+
test("writes every series the template queries", async () => {
|
|
287
|
+
await saveEvaluation();
|
|
398
288
|
|
|
399
|
-
const
|
|
289
|
+
for (const metricName of metricNamesQueriedBySloTemplate()) {
|
|
290
|
+
expect(
|
|
291
|
+
`${metricName}: rows emitted=${rowsNamed(insertedRows, metricName).length}`,
|
|
292
|
+
).toBe(`${metricName}: rows emitted=1`);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
400
295
|
|
|
401
|
-
|
|
296
|
+
test("stamps the BARE sloName the toolbar variable binds to, with the SLO's exact name", async () => {
|
|
297
|
+
await saveEvaluation();
|
|
402
298
|
|
|
403
|
-
|
|
404
|
-
const rows: Array<JSONObject> = rowsNamed(insertedRows, metricName);
|
|
299
|
+
const attributeKey: string = sloVariableAttributeKey();
|
|
405
300
|
|
|
406
|
-
|
|
407
|
-
expect(`${metricName}: rows emitted=${rows.length > 0}`).toBe(
|
|
408
|
-
`${metricName}: rows emitted=true`,
|
|
409
|
-
);
|
|
301
|
+
expect(attributeKey).toBe(SLO_METRIC_SLO_NAME_ATTRIBUTE);
|
|
410
302
|
|
|
411
|
-
|
|
303
|
+
for (const metricName of metricNamesQueriedBySloTemplate()) {
|
|
304
|
+
for (const row of rowsNamed(insertedRows, metricName)) {
|
|
412
305
|
const attributes: JSONObject = attributesOfRow(row);
|
|
413
306
|
|
|
414
307
|
expect(
|
|
415
|
-
`${metricName}: ${
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
).toBe(`${metricName}: ${SINGULAR_MONITOR_KEY}=${MONITOR_NAME}`);
|
|
419
|
-
|
|
420
|
-
/*
|
|
421
|
-
* A `resource.`-prefixed key would compile on both sides and
|
|
422
|
-
* hand the reader an empty variable picker, so pin its absence
|
|
423
|
-
* rather than only the presence of the bare key.
|
|
424
|
-
*/
|
|
308
|
+
`${metricName}: ${attributeKey}=${String(attributes[attributeKey])}`,
|
|
309
|
+
).toBe(`${metricName}: ${attributeKey}=${SLO_NAME}`);
|
|
310
|
+
|
|
425
311
|
const prefixedKeys: Array<string> = Object.keys(attributes).filter(
|
|
426
312
|
(key: string): boolean => {
|
|
427
313
|
return key.startsWith("resource.");
|
|
@@ -431,320 +317,394 @@ describe("SLO template metric emitter contract", () => {
|
|
|
431
317
|
expect(
|
|
432
318
|
`${metricName}: resource-prefixed keys=${prefixedKeys.join(", ")}`,
|
|
433
319
|
).toBe(`${metricName}: resource-prefixed keys=`);
|
|
320
|
+
expect(attributes[PREFIXED_SLO_NAME_KEY]).toBeUndefined();
|
|
434
321
|
}
|
|
435
322
|
}
|
|
436
323
|
});
|
|
437
324
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
await
|
|
444
|
-
|
|
445
|
-
const attributeKey: string = monitorVariableAttributeKey();
|
|
446
|
-
const queried: Array<string> = metricNamesQueriedBySloTemplate();
|
|
447
|
-
|
|
448
|
-
expect(queried.length).toBeGreaterThan(0);
|
|
449
|
-
|
|
450
|
-
for (const metricName of queried) {
|
|
451
|
-
const rows: Array<JSONObject> = rowsNamed(insertedRows, metricName);
|
|
325
|
+
/*
|
|
326
|
+
* attributeKeys, not attributes, is what the variable's option list is
|
|
327
|
+
* built from — a stamped-but-unpublished key offers an empty dropdown.
|
|
328
|
+
*/
|
|
329
|
+
test("publishes the variable's key in attributeKeys, which the picker reads", async () => {
|
|
330
|
+
await saveEvaluation();
|
|
452
331
|
|
|
453
|
-
|
|
454
|
-
`${metricName}: rows emitted=true`,
|
|
455
|
-
);
|
|
456
|
-
|
|
457
|
-
for (const row of rows) {
|
|
458
|
-
const attributes: JSONObject = attributesOfRow(row);
|
|
332
|
+
const attributeKey: string = sloVariableAttributeKey();
|
|
459
333
|
|
|
334
|
+
for (const metricName of metricNamesQueriedBySloTemplate()) {
|
|
335
|
+
for (const row of rowsNamed(insertedRows, metricName)) {
|
|
460
336
|
expect(
|
|
461
|
-
`${metricName}:
|
|
462
|
-
|
|
463
|
-
attributeKey,
|
|
464
|
-
)}`,
|
|
465
|
-
).toBe(`${metricName}: variable key ${attributeKey} stamped=true`);
|
|
337
|
+
`${metricName}: ${attributeKey} in attributeKeys=${attributeKeysOfRow(row).includes(attributeKey)}`,
|
|
338
|
+
).toBe(`${metricName}: ${attributeKey} in attributeKeys=true`);
|
|
466
339
|
}
|
|
467
340
|
}
|
|
468
341
|
});
|
|
469
342
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
)
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
const
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
/*
|
|
486
|
-
* attributeKeys, not attributes, is what the variable's option
|
|
487
|
-
* list is built from — a stamped-but-unpublished key offers an
|
|
488
|
-
* empty dropdown.
|
|
489
|
-
*/
|
|
343
|
+
/*
|
|
344
|
+
* Labels are merged onto the same attribute map. They must never clobber
|
|
345
|
+
* the key the whole dashboard is scoped by.
|
|
346
|
+
*/
|
|
347
|
+
test("keeps sloName intact when the SLO's labels are merged in", async () => {
|
|
348
|
+
await saveEvaluation();
|
|
349
|
+
|
|
350
|
+
for (const metricName of metricNamesQueriedBySloTemplate()) {
|
|
351
|
+
const row: JSONObject = rowsNamed(
|
|
352
|
+
insertedRows,
|
|
353
|
+
metricName,
|
|
354
|
+
)[0] as JSONObject;
|
|
355
|
+
const attributes: JSONObject = attributesOfRow(row);
|
|
356
|
+
|
|
357
|
+
expect(attributes[SLO_METRIC_SLO_NAME_ATTRIBUTE]).toBe(SLO_NAME);
|
|
490
358
|
expect(
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
)
|
|
494
|
-
).toBe(
|
|
359
|
+
Object.keys(attributes).some((key: string): boolean => {
|
|
360
|
+
return key.startsWith("oneuptime.label.");
|
|
361
|
+
}),
|
|
362
|
+
).toBe(true);
|
|
495
363
|
}
|
|
496
364
|
});
|
|
497
365
|
|
|
498
|
-
test(
|
|
499
|
-
await
|
|
366
|
+
test("groups each chart by keys every row of its series actually carries", async () => {
|
|
367
|
+
await saveEvaluation();
|
|
500
368
|
|
|
501
|
-
|
|
502
|
-
insertedRows,
|
|
503
|
-
MonitorMetricType.IsOnline,
|
|
504
|
-
).map((row: JSONObject): unknown => {
|
|
505
|
-
return row["value"];
|
|
506
|
-
});
|
|
369
|
+
let checked: number = 0;
|
|
507
370
|
|
|
508
|
-
|
|
371
|
+
for (const component of metricWidgets()) {
|
|
372
|
+
const groupByKeys: Array<string> =
|
|
373
|
+
(queryDataOf(component)["groupByAttributeKeys"] as
|
|
374
|
+
| Array<string>
|
|
375
|
+
| undefined) || [];
|
|
509
376
|
|
|
510
|
-
|
|
511
|
-
|
|
377
|
+
if (groupByKeys.length === 0) {
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
512
380
|
|
|
513
|
-
|
|
514
|
-
insertedRows,
|
|
515
|
-
MonitorMetricType.IsOnline,
|
|
516
|
-
).map((row: JSONObject): unknown => {
|
|
517
|
-
return row["value"];
|
|
518
|
-
});
|
|
381
|
+
const metricName: string = metricNameOf(component) as string;
|
|
519
382
|
|
|
520
|
-
|
|
383
|
+
for (const row of rowsNamed(insertedRows, metricName)) {
|
|
384
|
+
for (const key of groupByKeys) {
|
|
385
|
+
checked++;
|
|
386
|
+
expect(
|
|
387
|
+
`${metricName}: groups by ${key}, carried=${attributeKeysOfRow(row).includes(key)}`,
|
|
388
|
+
).toBe(`${metricName}: groups by ${key}, carried=true`);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
521
392
|
|
|
522
|
-
|
|
523
|
-
* Unit "" is why the template's tile is "Monitor Uptime (avg)": an
|
|
524
|
-
* Avg over a 0/1 series is a ratio in [0, 1]. If this ever became
|
|
525
|
-
* "%" the emitter would be writing 1 for 100% and every "%"-labelled
|
|
526
|
-
* widget in the product would be off by two orders of magnitude.
|
|
527
|
-
*/
|
|
528
|
-
expect(
|
|
529
|
-
`IsOnline: unit=${String(
|
|
530
|
-
indexedMetricTypes[MonitorMetricType.IsOnline]?.unit,
|
|
531
|
-
)}`,
|
|
532
|
-
).toBe("IsOnline: unit=");
|
|
393
|
+
expect(checked).toBeGreaterThan(0);
|
|
533
394
|
});
|
|
534
395
|
|
|
535
|
-
|
|
536
|
-
|
|
396
|
+
/*
|
|
397
|
+
* The SLO List reads Postgres, not the metric store — the toolbar reaches
|
|
398
|
+
* it only because its column map claims the SAME key the emitter writes.
|
|
399
|
+
*/
|
|
400
|
+
test("writes the key the SLO List maps to its name column", async () => {
|
|
401
|
+
await saveEvaluation();
|
|
402
|
+
|
|
403
|
+
const attributeKey: string = sloVariableAttributeKey();
|
|
404
|
+
|
|
405
|
+
expect(SLO_LIST_ATTRIBUTE_TO_COLUMN[attributeKey]).toBe("name");
|
|
406
|
+
expect(attributesOfRow(insertedRows[0] as JSONObject)[attributeKey]).toBe(
|
|
407
|
+
SLO_NAME,
|
|
408
|
+
);
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
test("declares the same unit the template prints beside each chart", async () => {
|
|
412
|
+
await saveEvaluation();
|
|
537
413
|
|
|
538
414
|
let compared: number = 0;
|
|
539
415
|
|
|
540
|
-
for (const component of
|
|
541
|
-
const metricName: string
|
|
416
|
+
for (const component of metricWidgets()) {
|
|
417
|
+
const metricName: string = metricNameOf(component) as string;
|
|
542
418
|
const legendUnit: string | undefined = legendUnitOf(component);
|
|
543
419
|
|
|
544
|
-
if (!
|
|
420
|
+
if (!legendUnit) {
|
|
545
421
|
continue;
|
|
546
422
|
}
|
|
547
423
|
|
|
548
424
|
compared++;
|
|
549
425
|
|
|
550
|
-
/*
|
|
551
|
-
* The chart prints this string under the values it plots. The
|
|
552
|
-
* emitter decides what those values actually are, so a unit change
|
|
553
|
-
* on one side without the other mislabels real numbers.
|
|
554
|
-
*/
|
|
555
426
|
expect(
|
|
556
427
|
`${metricName}: template legendUnit=${legendUnit}, emitted unit=${String(
|
|
557
428
|
indexedMetricTypes[metricName]?.unit,
|
|
558
|
-
)}`,
|
|
429
|
+
)}, catalog unit=${SloMetricTypeUtil.getUnit(metricName as SloMetricType)}`,
|
|
559
430
|
).toBe(
|
|
560
|
-
`${metricName}: template legendUnit=${legendUnit}, emitted unit=${legendUnit}`,
|
|
431
|
+
`${metricName}: template legendUnit=${legendUnit}, emitted unit=${legendUnit}, catalog unit=${legendUnit}`,
|
|
561
432
|
);
|
|
562
433
|
}
|
|
563
434
|
|
|
564
435
|
// Without this the loop would pass by never running.
|
|
565
436
|
expect(compared).toBeGreaterThan(0);
|
|
566
437
|
});
|
|
567
|
-
});
|
|
568
|
-
|
|
569
|
-
describe("NetworkDeviceMetricUtil, the other writer of the same names", () => {
|
|
570
|
-
test("writes the very same metric names off a device poll", async () => {
|
|
571
|
-
await saveDeviceMetrics();
|
|
572
438
|
|
|
573
|
-
|
|
439
|
+
/*
|
|
440
|
+
* The Value tiles carry no legendUnit: they print whatever unit the
|
|
441
|
+
* MetricType row registers. So every series a tile reads must register a
|
|
442
|
+
* real one — "%", "seconds" (scaled into minutes and hours), "x" — or the
|
|
443
|
+
* tile prints a bare number that could be anything.
|
|
444
|
+
*/
|
|
445
|
+
test("registers a unit for every series a tile totals", async () => {
|
|
446
|
+
await saveEvaluation();
|
|
447
|
+
|
|
448
|
+
const tileSeries: Array<string> = metricWidgets()
|
|
449
|
+
.filter((component: DashboardBaseComponent): boolean => {
|
|
450
|
+
return component.componentType === DashboardComponentType.Value;
|
|
451
|
+
})
|
|
452
|
+
.map((component: DashboardBaseComponent): string => {
|
|
453
|
+
return metricNameOf(component) as string;
|
|
454
|
+
});
|
|
574
455
|
|
|
575
|
-
expect(
|
|
456
|
+
expect(tileSeries.length).toBeGreaterThan(0);
|
|
576
457
|
|
|
577
|
-
for (const metricName of
|
|
578
|
-
/*
|
|
579
|
-
* This is the contamination the template's comment documents: an
|
|
580
|
-
* unscoped uptime/response-time widget is "every probeable monitor
|
|
581
|
-
* PLUS every network device". The day this stops being true the
|
|
582
|
-
* comment is wrong and should be deleted, so fail here rather than
|
|
583
|
-
* let it rot.
|
|
584
|
-
*/
|
|
458
|
+
for (const metricName of tileSeries) {
|
|
585
459
|
expect(
|
|
586
|
-
`${metricName}:
|
|
587
|
-
|
|
588
|
-
}`,
|
|
589
|
-
)
|
|
460
|
+
`${metricName}: unit=${String(indexedMetricTypes[metricName]?.unit)}`,
|
|
461
|
+
).toBe(
|
|
462
|
+
`${metricName}: unit=${SloMetricTypeUtil.getUnit(metricName as SloMetricType)}`,
|
|
463
|
+
);
|
|
464
|
+
expect(
|
|
465
|
+
String(indexedMetricTypes[metricName]?.unit).length,
|
|
466
|
+
).toBeGreaterThan(0);
|
|
590
467
|
}
|
|
591
468
|
});
|
|
592
469
|
|
|
593
|
-
test("
|
|
594
|
-
|
|
470
|
+
test("charts each series with the aggregation the catalog registers it under", () => {
|
|
471
|
+
let compared: number = 0;
|
|
595
472
|
|
|
596
|
-
const
|
|
597
|
-
|
|
473
|
+
for (const component of metricWidgets()) {
|
|
474
|
+
if (component.componentType !== DashboardComponentType.Chart) {
|
|
475
|
+
continue;
|
|
476
|
+
}
|
|
598
477
|
|
|
599
|
-
|
|
478
|
+
compared++;
|
|
600
479
|
|
|
601
|
-
|
|
602
|
-
|
|
480
|
+
const metricName: SloMetricType = metricNameOf(
|
|
481
|
+
component,
|
|
482
|
+
) as SloMetricType;
|
|
603
483
|
|
|
604
|
-
expect(
|
|
605
|
-
`${metricName}:
|
|
484
|
+
expect(
|
|
485
|
+
`${metricName}: ${String(filterDataOf(component)["aggegationType"])}`,
|
|
486
|
+
).toBe(
|
|
487
|
+
`${metricName}: ${SloMetricTypeUtil.getAggregationType(metricName)}`,
|
|
606
488
|
);
|
|
489
|
+
}
|
|
607
490
|
|
|
608
|
-
|
|
609
|
-
|
|
491
|
+
expect(compared).toBeGreaterThan(0);
|
|
492
|
+
});
|
|
610
493
|
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
494
|
+
/*
|
|
495
|
+
* The rows are keyed to the SLO itself, not to one of its monitors — so the
|
|
496
|
+
* series survive a monitor being swapped out of the objective, and telemetry
|
|
497
|
+
* billing can tell them from customer telemetry.
|
|
498
|
+
*/
|
|
499
|
+
test("keys every queried row to the SLO", async () => {
|
|
500
|
+
await saveEvaluation();
|
|
501
|
+
|
|
502
|
+
for (const metricName of metricNamesQueriedBySloTemplate()) {
|
|
503
|
+
for (const row of rowsNamed(insertedRows, metricName)) {
|
|
504
|
+
expect(row["primaryEntityId"]).toBe(SLO_ID.toString());
|
|
505
|
+
expect(row["primaryEntityType"]).toBe(
|
|
506
|
+
ServiceType.ServiceLevelObjective,
|
|
507
|
+
);
|
|
508
|
+
expect(attributesOfRow(row)["sloId"]).toBe(SLO_ID.toString());
|
|
509
|
+
expect(attributesOfRow(row)["projectId"]).toBe(PROJECT_ID.toString());
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
});
|
|
614
513
|
|
|
514
|
+
/*
|
|
515
|
+
* An evaluation that somehow carries no name posts no `sloName`, rather
|
|
516
|
+
* than an empty-string value the picker would offer as a blank option.
|
|
517
|
+
*/
|
|
518
|
+
test("stamps no sloName at all for a nameless evaluation", async () => {
|
|
519
|
+
await saveEvaluation({ sloName: " " });
|
|
520
|
+
|
|
521
|
+
for (const metricName of metricNamesQueriedBySloTemplate()) {
|
|
522
|
+
for (const row of rowsNamed(insertedRows, metricName)) {
|
|
615
523
|
expect(
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
/*
|
|
622
|
-
* Because the device rows carry no monitorName, picking a
|
|
623
|
-
* monitor in the toolbar DROPS them rather than making them
|
|
624
|
-
* selectable — they are never an option in the picker either.
|
|
625
|
-
* If a device row ever gained this key the template's Monitor
|
|
626
|
-
* variable would start offering device names as "monitors".
|
|
627
|
-
*/
|
|
628
|
-
expect(
|
|
629
|
-
`${metricName}: ${attributeKey} stamped=${Object.prototype.hasOwnProperty.call(
|
|
630
|
-
attributes,
|
|
631
|
-
attributeKey,
|
|
632
|
-
)}`,
|
|
633
|
-
).toBe(`${metricName}: ${attributeKey} stamped=false`);
|
|
524
|
+
Object.prototype.hasOwnProperty.call(
|
|
525
|
+
attributesOfRow(row),
|
|
526
|
+
SLO_METRIC_SLO_NAME_ATTRIBUTE,
|
|
527
|
+
),
|
|
528
|
+
).toBe(false);
|
|
634
529
|
}
|
|
635
530
|
}
|
|
636
531
|
});
|
|
637
532
|
});
|
|
638
533
|
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
534
|
+
/*
|
|
535
|
+
* Regression: SLO names are not unique within a project, and the fleet
|
|
536
|
+
* charts grouped by `sloName` alone — so two objectives sharing a name, one
|
|
537
|
+
* healthy and one overspent, were ONE line (the average of their budgets)
|
|
538
|
+
* under one legend entry. The series name is built here exactly as
|
|
539
|
+
* MetricCharts' buildQuerySeries builds it from the grouped attributes:
|
|
540
|
+
* "key=value" segments joined by ", ".
|
|
541
|
+
*/
|
|
542
|
+
describe("two SLOs that share a name", () => {
|
|
543
|
+
const OTHER_SLO_ID: ObjectID = new ObjectID(
|
|
544
|
+
"44444444-4444-4444-8444-444444444444",
|
|
545
|
+
);
|
|
546
|
+
|
|
547
|
+
type SeriesNameOfFunction = (
|
|
548
|
+
row: JSONObject,
|
|
549
|
+
groupByKeys: Array<string>,
|
|
550
|
+
) => string;
|
|
551
|
+
|
|
552
|
+
const seriesNameOf: SeriesNameOfFunction = (
|
|
553
|
+
row: JSONObject,
|
|
554
|
+
groupByKeys: Array<string>,
|
|
555
|
+
): string => {
|
|
556
|
+
return groupByKeys
|
|
557
|
+
.map((key: string): string => {
|
|
558
|
+
const value: unknown = attributesOfRow(row)[key];
|
|
559
|
+
const displayValue: string =
|
|
560
|
+
value === undefined || value === null || value === ""
|
|
561
|
+
? "(unset)"
|
|
562
|
+
: String(value);
|
|
563
|
+
|
|
564
|
+
return `${key}=${displayValue}`;
|
|
565
|
+
})
|
|
566
|
+
.join(", ");
|
|
567
|
+
};
|
|
642
568
|
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
569
|
+
test("stay two lines on every fleet chart, each still led by the name", async () => {
|
|
570
|
+
for (const [sloId, budget] of [
|
|
571
|
+
[SLO_ID, 90],
|
|
572
|
+
[OTHER_SLO_ID, -20],
|
|
573
|
+
] as Array<[ObjectID, number]>) {
|
|
574
|
+
await SloMetricUtil.saveSloMetrics({
|
|
575
|
+
projectId: PROJECT_ID,
|
|
576
|
+
sloId: sloId,
|
|
577
|
+
sloName: SLO_NAME,
|
|
578
|
+
values: {
|
|
579
|
+
[SloMetricType.ErrorBudgetRemainingPercent]: budget,
|
|
580
|
+
[SloMetricType.ErrorBudgetRemainingSeconds]: budget * 60,
|
|
581
|
+
[SloMetricType.BurnRate]: budget > 0 ? 0.5 : 8,
|
|
582
|
+
},
|
|
646
583
|
});
|
|
584
|
+
}
|
|
647
585
|
|
|
648
|
-
|
|
649
|
-
`incident: ${PLURAL_MONITOR_KEY}=${String(
|
|
650
|
-
baseMetricAttributes[PLURAL_MONITOR_KEY],
|
|
651
|
-
)}`,
|
|
652
|
-
).toBe(`incident: ${PLURAL_MONITOR_KEY}=${MONITOR_NAME}`);
|
|
653
|
-
|
|
654
|
-
/*
|
|
655
|
-
* The singular key is what the Monitor variable filters on. Its
|
|
656
|
-
* absence is why no incident METRIC widget is on this dashboard:
|
|
657
|
-
* one pick would empty it while the uptime tiles beside it stayed
|
|
658
|
-
* populated. If IncidentService ever adds the singular key, incident
|
|
659
|
-
* metrics become scopeable and that decision can be revisited.
|
|
660
|
-
*/
|
|
661
|
-
expect(
|
|
662
|
-
`incident: ${SINGULAR_MONITOR_KEY} stamped=${Object.prototype.hasOwnProperty.call(
|
|
663
|
-
baseMetricAttributes,
|
|
664
|
-
SINGULAR_MONITOR_KEY,
|
|
665
|
-
)}`,
|
|
666
|
-
).toBe(`incident: ${SINGULAR_MONITOR_KEY} stamped=false`);
|
|
667
|
-
});
|
|
586
|
+
let charts: number = 0;
|
|
668
587
|
|
|
669
|
-
|
|
670
|
-
|
|
588
|
+
for (const component of metricWidgets()) {
|
|
589
|
+
if (component.componentType !== DashboardComponentType.Chart) {
|
|
590
|
+
continue;
|
|
591
|
+
}
|
|
671
592
|
|
|
672
|
-
|
|
593
|
+
charts++;
|
|
594
|
+
|
|
595
|
+
const metricName: string = metricNameOf(component) as string;
|
|
596
|
+
const groupByKeys: Array<string> =
|
|
597
|
+
(queryDataOf(component)["groupByAttributeKeys"] as
|
|
598
|
+
| Array<string>
|
|
599
|
+
| undefined) || [];
|
|
600
|
+
const seriesNames: Array<string> = Array.from(
|
|
601
|
+
new Set(
|
|
602
|
+
rowsNamed(insertedRows, metricName).map(
|
|
603
|
+
(row: JSONObject): string => {
|
|
604
|
+
return seriesNameOf(row, groupByKeys);
|
|
605
|
+
},
|
|
606
|
+
),
|
|
607
|
+
),
|
|
608
|
+
);
|
|
673
609
|
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
});
|
|
610
|
+
expect(`${metricName}: ${seriesNames.length} series`).toBe(
|
|
611
|
+
`${metricName}: 2 series`,
|
|
612
|
+
);
|
|
678
613
|
|
|
679
|
-
|
|
680
|
-
|
|
614
|
+
for (const seriesName of seriesNames) {
|
|
615
|
+
expect(
|
|
616
|
+
seriesName.startsWith(
|
|
617
|
+
`${SLO_METRIC_SLO_NAME_ATTRIBUTE}=${SLO_NAME}`,
|
|
618
|
+
),
|
|
619
|
+
).toBe(true);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
681
622
|
|
|
682
|
-
expect(
|
|
683
|
-
`incident: variable key ${attributeKey} present=${Object.prototype.hasOwnProperty.call(
|
|
684
|
-
baseMetricAttributes,
|
|
685
|
-
attributeKey,
|
|
686
|
-
)}`,
|
|
687
|
-
).toBe(`incident: variable key ${attributeKey} present=false`);
|
|
623
|
+
expect(charts).toBeGreaterThan(0);
|
|
688
624
|
});
|
|
689
625
|
});
|
|
690
626
|
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
627
|
+
/*
|
|
628
|
+
* Regression: the toolbar picker lists the `sloName` values posted in the
|
|
629
|
+
* last day. The worker posted nothing for an SLO it could only guard, so a
|
|
630
|
+
* Paused, Misconfigured or never-measured SLO sat in the SLO List but could
|
|
631
|
+
* never be picked. saveSloGuardMetrics is what the guard paths post.
|
|
632
|
+
*/
|
|
633
|
+
describe("an SLO the worker can only guard (Paused, Misconfigured, not yet measured)", () => {
|
|
634
|
+
type SaveGuardFunction = (overrides?: {
|
|
635
|
+
targetPercentage?: number | null | undefined;
|
|
636
|
+
}) => Promise<void>;
|
|
637
|
+
|
|
638
|
+
const saveGuard: SaveGuardFunction = async (
|
|
639
|
+
overrides: { targetPercentage?: number | null | undefined } = {},
|
|
640
|
+
): Promise<void> => {
|
|
641
|
+
await SloMetricUtil.saveSloGuardMetrics({
|
|
642
|
+
projectId: PROJECT_ID,
|
|
643
|
+
sloId: SLO_ID,
|
|
644
|
+
sloName: SLO_NAME,
|
|
645
|
+
targetPercentage:
|
|
646
|
+
"targetPercentage" in overrides ? overrides.targetPercentage : 99.9,
|
|
647
|
+
});
|
|
648
|
+
};
|
|
701
649
|
|
|
702
|
-
|
|
703
|
-
|
|
650
|
+
test("still posts the key the picker lists, with the SLO's exact name", async () => {
|
|
651
|
+
await saveGuard();
|
|
704
652
|
|
|
705
|
-
|
|
706
|
-
const attributes: JSONObject = (metric.attributes || {}) as JSONObject;
|
|
653
|
+
const attributeKey: string = sloVariableAttributeKey();
|
|
707
654
|
|
|
708
|
-
|
|
709
|
-
* Alert metrics ARE scopeable by the Monitor variable — which is
|
|
710
|
-
* exactly why the template's reason for leaving them off is a
|
|
711
|
-
* different one (a burn-rate alert is created with no monitor
|
|
712
|
-
* attached, so it carries no value for this key at all). Pinning
|
|
713
|
-
* the key here keeps that distinction checkable.
|
|
714
|
-
*/
|
|
715
|
-
expect(
|
|
716
|
-
`alert: ${SINGULAR_MONITOR_KEY}=${String(
|
|
717
|
-
attributes[SINGULAR_MONITOR_KEY],
|
|
718
|
-
)}`,
|
|
719
|
-
).toBe(`alert: ${SINGULAR_MONITOR_KEY}=${MONITOR_NAME}`);
|
|
655
|
+
expect(insertedRows.length).toBeGreaterThan(0);
|
|
720
656
|
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
).toBe(
|
|
657
|
+
for (const row of insertedRows) {
|
|
658
|
+
expect(attributesOfRow(row)[attributeKey]).toBe(SLO_NAME);
|
|
659
|
+
expect(attributeKeysOfRow(row)).toContain(attributeKey);
|
|
660
|
+
expect(attributesOfRow(row)["sloId"]).toBe(SLO_ID.toString());
|
|
661
|
+
expect(row["primaryEntityId"]).toBe(SLO_ID.toString());
|
|
662
|
+
expect(row["primaryEntityType"]).toBe(
|
|
663
|
+
ServiceType.ServiceLevelObjective,
|
|
664
|
+
);
|
|
727
665
|
}
|
|
728
666
|
});
|
|
729
667
|
|
|
730
|
-
|
|
731
|
-
|
|
668
|
+
/*
|
|
669
|
+
* The target is configuration, true with or without a measurement. A
|
|
670
|
+
* budget, burn rate or status point would chart a measurement that never
|
|
671
|
+
* happened, and would feed the template's tiles and charts.
|
|
672
|
+
*/
|
|
673
|
+
test("posts only the target, and nothing the template's widgets aggregate", async () => {
|
|
674
|
+
await saveGuard();
|
|
732
675
|
|
|
733
|
-
|
|
676
|
+
expect(
|
|
677
|
+
insertedRows.map((row: JSONObject): unknown => {
|
|
678
|
+
return row["name"];
|
|
679
|
+
}),
|
|
680
|
+
).toEqual([SloMetricType.TargetPercent]);
|
|
681
|
+
expect((insertedRows[0] as JSONObject)["value"]).toBe(99.9);
|
|
682
|
+
|
|
683
|
+
for (const metricName of metricNamesQueriedBySloTemplate()) {
|
|
684
|
+
expect(rowsNamed(insertedRows, metricName)).toHaveLength(0);
|
|
685
|
+
}
|
|
686
|
+
});
|
|
734
687
|
|
|
735
|
-
|
|
688
|
+
test("writes nothing when there is no target to post", async () => {
|
|
689
|
+
await saveGuard({ targetPercentage: null });
|
|
736
690
|
|
|
737
|
-
expect(
|
|
691
|
+
expect(insertedRows).toHaveLength(0);
|
|
692
|
+
});
|
|
738
693
|
|
|
739
|
-
|
|
740
|
-
|
|
694
|
+
/*
|
|
695
|
+
* The guard paths must still resolve open burn-rate alerts and record the
|
|
696
|
+
* guard status, so a metric store failure is logged, never thrown.
|
|
697
|
+
*/
|
|
698
|
+
test("never throws when the metric store fails", async () => {
|
|
699
|
+
jest
|
|
700
|
+
.spyOn(MetricService, "insertJsonRows")
|
|
701
|
+
.mockRejectedValue(new Error("ClickHouse is down") as never);
|
|
702
|
+
jest.spyOn(logger, "error").mockImplementation((): void => {
|
|
703
|
+
// Silenced: the failure is the point of this test.
|
|
704
|
+
});
|
|
741
705
|
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
attributes[attributeKey],
|
|
745
|
-
)}`,
|
|
746
|
-
).toBe(`${String(metric.name)}: ${attributeKey}=${MONITOR_NAME}`);
|
|
747
|
-
}
|
|
706
|
+
await expect(saveGuard()).resolves.toBeUndefined();
|
|
707
|
+
expect(logger.error).toHaveBeenCalled();
|
|
748
708
|
});
|
|
749
709
|
});
|
|
750
710
|
});
|