@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
|
@@ -20,20 +20,14 @@ import getJestMockFunction, { MockFunction } from "../../MockType";
|
|
|
20
20
|
/*
|
|
21
21
|
* Mounts the widgets the SLO dashboard template actually ships — every one of
|
|
22
22
|
* them, taken from getTemplateConfig(DashboardTemplateType.Slo) — through the
|
|
23
|
-
* REAL renderers
|
|
23
|
+
* REAL renderers, in the two states a reader meets them in: the toolbar on
|
|
24
|
+
* "All" (a freshly created dashboard) and one SLO picked.
|
|
24
25
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* its loading skeleton, a tile printing "null%" before the evaluation worker
|
|
31
|
-
* has run, a chart drawing a broken frame over an empty series, or the one
|
|
32
|
-
* guidance row rendering empty.
|
|
33
|
-
*
|
|
34
|
-
* Every assertion below starts from the template config rather than from
|
|
35
|
-
* hand-built components, so a seventh SLO widget added to the template is
|
|
36
|
-
* covered here without editing this file.
|
|
26
|
+
* The editorial and scoping suites read the template as data. Nothing there
|
|
27
|
+
* catches the shipped ARGUMENTS and the renderers disagreeing: an SLO widget
|
|
28
|
+
* stuck on a skeleton, a fresh dashboard that asks the reader to edit it, a
|
|
29
|
+
* tile printing "null%", the fleet list waiting for a pick it does not need,
|
|
30
|
+
* or a heading that renders empty.
|
|
37
31
|
*/
|
|
38
32
|
|
|
39
33
|
const getItemMock: MockFunction = getJestMockFunction();
|
|
@@ -42,11 +36,7 @@ const aggregateMock: MockFunction = getJestMockFunction();
|
|
|
42
36
|
const getCurrentProjectIdMock: MockFunction = getJestMockFunction();
|
|
43
37
|
const lineChartRenderMock: MockFunction = getJestMockFunction();
|
|
44
38
|
|
|
45
|
-
|
|
46
|
-
* The arrow wrappers are load bearing: jest.mock is hoisted above the compiled
|
|
47
|
-
* requires, so the mock variables above are still unassigned when the factory
|
|
48
|
-
* runs. Dereferencing them lazily, at call time, is what makes this work.
|
|
49
|
-
*/
|
|
39
|
+
// Lazy dereference: jest.mock factories are hoisted above these assignments.
|
|
50
40
|
jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
|
|
51
41
|
return {
|
|
52
42
|
__esModule: true,
|
|
@@ -84,13 +74,8 @@ jest.mock("../../../UI/Utils/Project", () => {
|
|
|
84
74
|
});
|
|
85
75
|
|
|
86
76
|
/*
|
|
87
|
-
* recharts measures a 0x0 parent in jsdom, so the
|
|
88
|
-
*
|
|
89
|
-
* reason. The stub records the props instead — which is where the reference
|
|
90
|
-
* line lives — and renders a marker the assertions can count.
|
|
91
|
-
*
|
|
92
|
-
* (The real recharts SVG is exercised by SloWidgetChartRendering.test.tsx;
|
|
93
|
-
* what is pinned here is which of the TEMPLATE's charts gets a target line.)
|
|
77
|
+
* recharts measures a 0x0 parent in jsdom, so the stub records the props —
|
|
78
|
+
* which is where the reference line lives — and renders a countable marker.
|
|
94
79
|
*/
|
|
95
80
|
jest.mock("../../../UI/Components/Charts/Line/LineChart", () => {
|
|
96
81
|
return {
|
|
@@ -106,7 +91,37 @@ jest.mock("../../../UI/Components/Charts/Line/LineChart", () => {
|
|
|
106
91
|
};
|
|
107
92
|
});
|
|
108
93
|
|
|
94
|
+
// The SLO List links rows with a react-router Link.
|
|
95
|
+
jest.mock(
|
|
96
|
+
"../../../../App/FeatureSet/Dashboard/src/Components/AppLink/AppLink",
|
|
97
|
+
() => {
|
|
98
|
+
return {
|
|
99
|
+
__esModule: true,
|
|
100
|
+
default: (props: { children: React.ReactNode }) => {
|
|
101
|
+
return React.createElement("a", null, props.children);
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
jest.mock("../../../../App/FeatureSet/Dashboard/src/Utils/RouteMap", () => {
|
|
108
|
+
return {
|
|
109
|
+
__esModule: true,
|
|
110
|
+
default: {},
|
|
111
|
+
RouteUtil: {
|
|
112
|
+
populateRouteParams: () => {
|
|
113
|
+
return {
|
|
114
|
+
toString: () => {
|
|
115
|
+
return "/dashboard/slos/view";
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
|
|
109
123
|
import DashboardSloComponentElement from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Components/DashboardSloComponent";
|
|
124
|
+
import DashboardSloListComponentElement from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Components/DashboardSloListComponent";
|
|
110
125
|
import DashboardTextComponentElement from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Components/DashboardTextComponent";
|
|
111
126
|
import { DashboardBaseComponentProps } from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Components/DashboardBaseComponent";
|
|
112
127
|
import ServiceLevelObjective from "../../../Models/DatabaseModels/ServiceLevelObjective";
|
|
@@ -117,6 +132,7 @@ import DashboardSloComponent, {
|
|
|
117
132
|
SloWidgetDisplayType,
|
|
118
133
|
SloWidgetMetric,
|
|
119
134
|
} from "../../../Types/Dashboard/DashboardComponents/DashboardSloComponent";
|
|
135
|
+
import DashboardSloListComponent from "../../../Types/Dashboard/DashboardComponents/DashboardSloListComponent";
|
|
120
136
|
import DashboardTextComponent from "../../../Types/Dashboard/DashboardComponents/DashboardTextComponent";
|
|
121
137
|
import DashboardComponentType from "../../../Types/Dashboard/DashboardComponentType";
|
|
122
138
|
import {
|
|
@@ -127,12 +143,14 @@ import {
|
|
|
127
143
|
DashboardTemplateType,
|
|
128
144
|
getTemplateConfig,
|
|
129
145
|
} from "../../../Types/Dashboard/DashboardTemplates";
|
|
146
|
+
import DashboardVariable from "../../../Types/Dashboard/DashboardVariable";
|
|
130
147
|
import DashboardViewConfig from "../../../Types/Dashboard/DashboardViewConfig";
|
|
131
148
|
import { JSONObject } from "../../../Types/JSON";
|
|
132
149
|
import ObjectID from "../../../Types/ObjectID";
|
|
133
150
|
import SloStatus from "../../../Types/ServiceLevelObjective/SloStatus";
|
|
134
151
|
import RangeStartAndEndDateTime from "../../../Types/Time/RangeStartAndEndDateTime";
|
|
135
152
|
import TimeRange from "../../../Types/Time/TimeRange";
|
|
153
|
+
import { SLO_WIDGET_NO_SELECTION_TEXT } from "../../../Utils/Dashboard/SloWidgetSource";
|
|
136
154
|
import { SLO_NOT_EVALUATED_TEXT } from "../../../Utils/Slo/SloWidgetFormat";
|
|
137
155
|
import ChartReferenceLineProps from "../../../UI/Components/Charts/Types/ReferenceLineProps";
|
|
138
156
|
import SeriesPoint from "../../../UI/Components/Charts/Types/SeriesPoints";
|
|
@@ -149,70 +167,62 @@ const TEMPLATE_CONFIG: DashboardViewConfig | null = getTemplateConfig(
|
|
|
149
167
|
);
|
|
150
168
|
|
|
151
169
|
/*
|
|
152
|
-
* Cast rather than guarded at every use: "the
|
|
153
|
-
*
|
|
154
|
-
*
|
|
170
|
+
* Cast rather than guarded at every use: "the template resolves to a config"
|
|
171
|
+
* is asserted by the first test, which fails loudly before any render test
|
|
172
|
+
* can fail confusingly.
|
|
155
173
|
*/
|
|
156
174
|
const VIEW_CONFIG: DashboardViewConfig = TEMPLATE_CONFIG as DashboardViewConfig;
|
|
157
175
|
|
|
158
176
|
const TEMPLATE_COMPONENTS: Array<DashboardBaseComponent> =
|
|
159
177
|
TEMPLATE_CONFIG?.components || [];
|
|
160
178
|
|
|
161
|
-
|
|
162
|
-
(
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
179
|
+
function ofType<T>(componentType: DashboardComponentType): Array<T> {
|
|
180
|
+
return TEMPLATE_COMPONENTS.filter(
|
|
181
|
+
(component: DashboardBaseComponent): boolean => {
|
|
182
|
+
return component.componentType === componentType;
|
|
183
|
+
},
|
|
184
|
+
) as unknown as Array<T>;
|
|
185
|
+
}
|
|
166
186
|
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
)
|
|
187
|
+
const SLO_WIDGETS: Array<DashboardSloComponent> = ofType<DashboardSloComponent>(
|
|
188
|
+
DashboardComponentType.Slo,
|
|
189
|
+
);
|
|
190
|
+
const SLO_LIST_WIDGETS: Array<DashboardSloListComponent> =
|
|
191
|
+
ofType<DashboardSloListComponent>(DashboardComponentType.SloList);
|
|
192
|
+
const TEXT_WIDGETS: Array<DashboardTextComponent> =
|
|
193
|
+
ofType<DashboardTextComponent>(DashboardComponentType.Text);
|
|
172
194
|
|
|
173
195
|
const TILE_WIDGETS: Array<DashboardSloComponent> = SLO_WIDGETS.filter(
|
|
174
196
|
(widget: DashboardSloComponent): boolean => {
|
|
175
197
|
return widget.arguments.displayType === SloWidgetDisplayType.Tile;
|
|
176
198
|
},
|
|
177
199
|
);
|
|
178
|
-
|
|
179
200
|
const CHART_WIDGETS: Array<DashboardSloComponent> = SLO_WIDGETS.filter(
|
|
180
201
|
(widget: DashboardSloComponent): boolean => {
|
|
181
202
|
return widget.arguments.displayType === SloWidgetDisplayType.Chart;
|
|
182
203
|
},
|
|
183
204
|
);
|
|
184
205
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
const getWidgetLabel: GetWidgetLabelFunction = (
|
|
189
|
-
widget: DashboardSloComponent,
|
|
190
|
-
): string => {
|
|
191
|
-
return widget.arguments.widgetTitle || "(untitled SLO widget)";
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
type GetWidgetMetricFunction = (
|
|
195
|
-
widget: DashboardSloComponent,
|
|
196
|
-
) => SloWidgetMetric;
|
|
197
|
-
|
|
198
|
-
const getWidgetMetric: GetWidgetMetricFunction = (
|
|
199
|
-
widget: DashboardSloComponent,
|
|
200
|
-
): SloWidgetMetric => {
|
|
201
|
-
// Sli is the renderer's own fallback when the argument was never set.
|
|
202
|
-
return widget.arguments.sloMetric || SloWidgetMetric.Sli;
|
|
203
|
-
};
|
|
206
|
+
// The variables exactly as the template ships them: the toolbar on "All".
|
|
207
|
+
const SHIPPED_VARIABLES: Array<DashboardVariable> =
|
|
208
|
+
TEMPLATE_CONFIG?.variables || [];
|
|
204
209
|
|
|
205
210
|
// ── fixtures ──────────────────────────────────────────────────────────────
|
|
206
211
|
|
|
207
|
-
const SLO_ID: ObjectID = new ObjectID("33333333-3333-4333-8333-333333333333");
|
|
208
212
|
const PROJECT_ID: ObjectID = new ObjectID(
|
|
209
213
|
"44444444-4444-4444-8444-444444444444",
|
|
210
214
|
);
|
|
215
|
+
const PICKED_SLO_ID: ObjectID = new ObjectID(
|
|
216
|
+
"33333333-3333-4333-8333-333333333333",
|
|
217
|
+
);
|
|
218
|
+
const SLO_NAME: string = "Checkout availability";
|
|
219
|
+
|
|
220
|
+
const PICKED_VARIABLES: Array<DashboardVariable> = SHIPPED_VARIABLES.map(
|
|
221
|
+
(variable: DashboardVariable): DashboardVariable => {
|
|
222
|
+
return { ...variable, selectedValue: SLO_NAME };
|
|
223
|
+
},
|
|
224
|
+
);
|
|
211
225
|
|
|
212
|
-
/*
|
|
213
|
-
* A CUSTOM range pins the chart window to fixed instants; a relative range
|
|
214
|
-
* would resolve against the wall clock on every render.
|
|
215
|
-
*/
|
|
216
226
|
const START_DATE: Date = new Date("2026-08-10T00:00:00.000Z");
|
|
217
227
|
const END_DATE: Date = new Date("2026-08-10T06:00:00.000Z");
|
|
218
228
|
|
|
@@ -221,109 +231,57 @@ const DASHBOARD_RANGE: RangeStartAndEndDateTime = {
|
|
|
221
231
|
startAndEndDate: new InBetween<Date>(START_DATE, END_DATE),
|
|
222
232
|
};
|
|
223
233
|
|
|
224
|
-
/*
|
|
225
|
-
* The dashboard canvas is twelve units wide, so this is the width a real
|
|
226
|
-
* board is laid out against; the helpers below turn each widget's DECLARED
|
|
227
|
-
* units into the pixel box the canvas would give it.
|
|
228
|
-
*/
|
|
229
234
|
const TOTAL_DASHBOARD_WIDTH_IN_PX: number = 1200;
|
|
230
|
-
|
|
231
|
-
const SLO_NAME: string = "Checkout availability";
|
|
232
235
|
const TARGET_PERCENTAGE: number = 99.9;
|
|
233
|
-
const
|
|
234
|
-
|
|
235
|
-
const BUDGET_REMAINING_SECONDS: number = 3600;
|
|
236
|
-
const BURN_RATE: number = 1.25;
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* What each tile must render for the row above. Written out rather than
|
|
240
|
-
* computed so a change in the formatter's rounding or units fails here:
|
|
241
|
-
* the SLI keeps three decimals, the budget percentage one, the budget
|
|
242
|
-
* seconds collapse to whole minutes (3600s -> 60 min) and burn rate is a
|
|
243
|
-
* multiplier.
|
|
244
|
-
*
|
|
245
|
-
* "×" is U+00D7 MULTIPLICATION SIGN, spelled as an escape so a mangled
|
|
246
|
-
* file encoding cannot make this pass by accident.
|
|
247
|
-
*/
|
|
236
|
+
const HISTORY_ROW_COUNT: number = 8;
|
|
237
|
+
|
|
248
238
|
interface TileExpectation {
|
|
249
239
|
value: string;
|
|
250
240
|
subline: string | null;
|
|
251
241
|
}
|
|
252
242
|
|
|
243
|
+
/*
|
|
244
|
+
* Written out rather than computed, so a change in the formatter's rounding
|
|
245
|
+
* or units fails here. "×" is U+00D7 MULTIPLICATION SIGN.
|
|
246
|
+
*/
|
|
253
247
|
const EXPECTED_TILE: Record<SloWidgetMetric, TileExpectation> = {
|
|
254
|
-
[SloWidgetMetric.Sli]: {
|
|
255
|
-
value: "99.95%",
|
|
256
|
-
subline: "target 99.9%",
|
|
257
|
-
},
|
|
248
|
+
[SloWidgetMetric.Sli]: { value: "99.95%", subline: "target 99.9%" },
|
|
258
249
|
[SloWidgetMetric.ErrorBudgetRemaining]: {
|
|
259
250
|
value: "42.5%",
|
|
260
251
|
subline: "60 min remaining",
|
|
261
252
|
},
|
|
262
|
-
[SloWidgetMetric.BurnRate]: {
|
|
263
|
-
value: "1.25×",
|
|
264
|
-
subline: null,
|
|
265
|
-
},
|
|
253
|
+
[SloWidgetMetric.BurnRate]: { value: "1.25×", subline: null },
|
|
266
254
|
};
|
|
267
255
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
type BuildSloFunction = (data?: {
|
|
273
|
-
hasTarget?: boolean | undefined;
|
|
274
|
-
}) => ServiceLevelObjective;
|
|
256
|
+
type BuildSloFunction = (
|
|
257
|
+
overrides?: Partial<ServiceLevelObjective>,
|
|
258
|
+
) => ServiceLevelObjective;
|
|
275
259
|
|
|
276
260
|
const buildSlo: BuildSloFunction = (
|
|
277
|
-
|
|
261
|
+
overrides: Partial<ServiceLevelObjective> = {},
|
|
278
262
|
): ServiceLevelObjective => {
|
|
279
263
|
const slo: ServiceLevelObjective = new ServiceLevelObjective();
|
|
264
|
+
slo._id = PICKED_SLO_ID.toString();
|
|
280
265
|
slo.name = SLO_NAME;
|
|
281
|
-
slo.
|
|
282
|
-
slo.
|
|
283
|
-
slo.
|
|
284
|
-
slo.
|
|
266
|
+
slo.targetPercentage = TARGET_PERCENTAGE;
|
|
267
|
+
slo.currentSliPercentage = 99.95;
|
|
268
|
+
slo.errorBudgetRemainingPercentage = 42.5;
|
|
269
|
+
slo.errorBudgetRemainingSeconds = 3600;
|
|
270
|
+
slo.currentBurnRate = 1.25;
|
|
285
271
|
slo.sloStatus = SloStatus.Healthy;
|
|
286
|
-
|
|
287
|
-
/*
|
|
288
|
-
* `targetPercentage` is nullable on the model, so leaving it unset is a
|
|
289
|
-
* state a real SLO can be in — and the reference-line rule turns on it.
|
|
290
|
-
*/
|
|
291
|
-
if (data.hasTarget !== false) {
|
|
292
|
-
slo.targetPercentage = TARGET_PERCENTAGE;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
return slo;
|
|
272
|
+
return Object.assign(slo, overrides);
|
|
296
273
|
};
|
|
297
274
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
const buildUnevaluatedSlo: BuildUnevaluatedSloFunction = (
|
|
309
|
-
stateValue: null | undefined,
|
|
310
|
-
): ServiceLevelObjective => {
|
|
311
|
-
const slo: ServiceLevelObjective = new ServiceLevelObjective();
|
|
312
|
-
slo.name = SLO_NAME;
|
|
313
|
-
slo.targetPercentage = TARGET_PERCENTAGE;
|
|
314
|
-
|
|
315
|
-
const emptyState: Record<string, null | undefined> = {
|
|
316
|
-
currentSliPercentage: stateValue,
|
|
317
|
-
errorBudgetRemainingPercentage: stateValue,
|
|
318
|
-
errorBudgetRemainingSeconds: stateValue,
|
|
319
|
-
currentBurnRate: stateValue,
|
|
320
|
-
sloStatus: stateValue,
|
|
321
|
-
};
|
|
322
|
-
|
|
323
|
-
return Object.assign(slo, emptyState) as unknown as ServiceLevelObjective;
|
|
324
|
-
};
|
|
275
|
+
const FLEET: Array<ServiceLevelObjective> = [
|
|
276
|
+
buildSlo({
|
|
277
|
+
_id: ObjectID.generate().toString(),
|
|
278
|
+
name: "Payments API",
|
|
279
|
+
errorBudgetRemainingPercentage: 3,
|
|
280
|
+
sloStatus: SloStatus.AtRisk,
|
|
281
|
+
}),
|
|
282
|
+
buildSlo(),
|
|
283
|
+
];
|
|
325
284
|
|
|
326
|
-
/** One SloHistory bucket every five minutes, oldest first. */
|
|
327
285
|
type BuildSloHistoryFunction = (rowCount: number) => AggregatedResult;
|
|
328
286
|
|
|
329
287
|
const buildSloHistory: BuildSloHistoryFunction = (
|
|
@@ -343,30 +301,42 @@ const buildSloHistory: BuildSloHistoryFunction = (
|
|
|
343
301
|
return { data: rows } as unknown as AggregatedResult;
|
|
344
302
|
};
|
|
345
303
|
|
|
346
|
-
|
|
304
|
+
/*
|
|
305
|
+
* One ModelAPI.getList, two callers: an SLO widget looks a picked name up with
|
|
306
|
+
* a two-row read; the SLO List reads the fleet with its own cap.
|
|
307
|
+
*/
|
|
308
|
+
type RespondToListFunction = (args: JSONObject) => JSONObject;
|
|
309
|
+
|
|
310
|
+
let sloForNameLookup: ServiceLevelObjective = buildSlo();
|
|
311
|
+
|
|
312
|
+
const respondToList: RespondToListFunction = (args: JSONObject): JSONObject => {
|
|
313
|
+
if (args["limit"] === 2) {
|
|
314
|
+
return { data: [sloForNameLookup], count: 1 };
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return { data: FLEET, count: FLEET.length };
|
|
318
|
+
};
|
|
347
319
|
|
|
348
320
|
// ── rendering ─────────────────────────────────────────────────────────────
|
|
349
321
|
|
|
350
|
-
type BuildPropsFunction = (
|
|
351
|
-
component: DashboardBaseComponent
|
|
352
|
-
|
|
322
|
+
type BuildPropsFunction = (data: {
|
|
323
|
+
component: DashboardBaseComponent;
|
|
324
|
+
variables: Array<DashboardVariable>;
|
|
325
|
+
}) => DashboardBaseComponentProps;
|
|
353
326
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
* arbitrary test number. A widget shrunk to a height-1 row in the template
|
|
363
|
-
* would then be exercised at that height here.
|
|
364
|
-
*/
|
|
327
|
+
/*
|
|
328
|
+
* Size every widget the way the canvas does — from the units the TEMPLATE
|
|
329
|
+
* declares — so height-dependent branches see the geometry actually shipped.
|
|
330
|
+
*/
|
|
331
|
+
const buildBaseProps: BuildPropsFunction = (data: {
|
|
332
|
+
component: DashboardBaseComponent;
|
|
333
|
+
variables: Array<DashboardVariable>;
|
|
334
|
+
}): DashboardBaseComponentProps => {
|
|
365
335
|
return {
|
|
366
|
-
componentId: component.componentId,
|
|
336
|
+
componentId: data.component.componentId,
|
|
367
337
|
isEditMode: false,
|
|
368
338
|
isSelected: false,
|
|
369
|
-
key: component.componentId.toString(),
|
|
339
|
+
key: data.component.componentId.toString(),
|
|
370
340
|
onComponentUpdate: (): void => {
|
|
371
341
|
// No widget on this template writes back through this.
|
|
372
342
|
},
|
|
@@ -376,75 +346,54 @@ const buildBaseProps: BuildPropsFunction = (
|
|
|
376
346
|
dashboardCanvasWidthInPx: TOTAL_DASHBOARD_WIDTH_IN_PX,
|
|
377
347
|
dashboardCanvasHeightInPx: 800,
|
|
378
348
|
dashboardComponentHeightInPx: GetHeightOfDashboardComponent(
|
|
379
|
-
component.heightInDashboardUnits,
|
|
349
|
+
data.component.heightInDashboardUnits,
|
|
380
350
|
TOTAL_DASHBOARD_WIDTH_IN_PX,
|
|
381
351
|
),
|
|
382
352
|
dashboardComponentWidthInPx: GetWidthOfDashboardComponent(
|
|
383
|
-
component.widthInDashboardUnits,
|
|
353
|
+
data.component.widthInDashboardUnits,
|
|
384
354
|
TOTAL_DASHBOARD_WIDTH_IN_PX,
|
|
385
355
|
),
|
|
386
356
|
dashboardViewConfig: VIEW_CONFIG,
|
|
387
357
|
dashboardStartAndEndDate: DASHBOARD_RANGE,
|
|
388
358
|
metricTypes: [],
|
|
389
359
|
refreshTick: 0,
|
|
390
|
-
variables:
|
|
360
|
+
variables: data.variables,
|
|
391
361
|
};
|
|
392
362
|
};
|
|
393
363
|
|
|
394
|
-
type RenderSloWidgetFunction = (
|
|
364
|
+
type RenderSloWidgetFunction = (
|
|
365
|
+
widget: DashboardSloComponent,
|
|
366
|
+
variables: Array<DashboardVariable>,
|
|
367
|
+
) => RenderResult;
|
|
395
368
|
|
|
396
369
|
const renderSloWidget: RenderSloWidgetFunction = (
|
|
397
370
|
widget: DashboardSloComponent,
|
|
371
|
+
variables: Array<DashboardVariable>,
|
|
398
372
|
): RenderResult => {
|
|
399
373
|
return render(
|
|
400
374
|
<DashboardSloComponentElement
|
|
401
|
-
{...buildBaseProps(widget)}
|
|
375
|
+
{...buildBaseProps({ component: widget, variables })}
|
|
402
376
|
component={widget}
|
|
403
377
|
/>,
|
|
404
378
|
);
|
|
405
379
|
};
|
|
406
380
|
|
|
407
|
-
type
|
|
408
|
-
widget: DashboardTextComponent,
|
|
409
|
-
) => RenderResult;
|
|
381
|
+
type LabelOfFunction = (widget: DashboardSloComponent) => string;
|
|
410
382
|
|
|
411
|
-
const
|
|
412
|
-
widget
|
|
413
|
-
): RenderResult => {
|
|
414
|
-
return render(
|
|
415
|
-
<DashboardTextComponentElement
|
|
416
|
-
{...buildBaseProps(widget)}
|
|
417
|
-
component={widget}
|
|
418
|
-
/>,
|
|
419
|
-
);
|
|
383
|
+
const labelOf: LabelOfFunction = (widget: DashboardSloComponent): string => {
|
|
384
|
+
return widget.arguments.widgetTitle || "(untitled SLO widget)";
|
|
420
385
|
};
|
|
421
386
|
|
|
422
|
-
|
|
423
|
-
* Picking an objective in the settings panel writes exactly one argument
|
|
424
|
-
* onto the stored widget. Cloned rather than mutated so the template's own
|
|
425
|
-
* components stay unconfigured for every other test in this file.
|
|
426
|
-
*/
|
|
427
|
-
type ConfigureSloWidgetFunction = (
|
|
428
|
-
widget: DashboardSloComponent,
|
|
429
|
-
) => DashboardSloComponent;
|
|
387
|
+
type CountRequestsFunction = () => number;
|
|
430
388
|
|
|
431
|
-
const
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
...widget.arguments,
|
|
438
|
-
serviceLevelObjectiveId: SLO_ID.toString(),
|
|
439
|
-
},
|
|
440
|
-
};
|
|
389
|
+
const countRequests: CountRequestsFunction = (): number => {
|
|
390
|
+
return (
|
|
391
|
+
getItemMock.mock.calls.length +
|
|
392
|
+
getListMock.mock.calls.length +
|
|
393
|
+
aggregateMock.mock.calls.length
|
|
394
|
+
);
|
|
441
395
|
};
|
|
442
396
|
|
|
443
|
-
/*
|
|
444
|
-
* Assertions carry the widget's title on both sides so a failure names the
|
|
445
|
-
* offending widget rather than reporting `false !== true` for one of six
|
|
446
|
-
* identical-looking renders.
|
|
447
|
-
*/
|
|
448
397
|
type ExpectRenderedFunction = (data: {
|
|
449
398
|
label: string;
|
|
450
399
|
text: string | RegExp;
|
|
@@ -477,17 +426,6 @@ const expectNotRendered: ExpectNotRenderedFunction = (data: {
|
|
|
477
426
|
).toBe(`${data.label}: does not render "${String(data.text)}"`);
|
|
478
427
|
};
|
|
479
428
|
|
|
480
|
-
/** Requests the widget under test issued, whichever route it reached for. */
|
|
481
|
-
type CountRequestsFunction = () => number;
|
|
482
|
-
|
|
483
|
-
const countRequests: CountRequestsFunction = (): number => {
|
|
484
|
-
return (
|
|
485
|
-
getItemMock.mock.calls.length +
|
|
486
|
-
getListMock.mock.calls.length +
|
|
487
|
-
aggregateMock.mock.calls.length
|
|
488
|
-
);
|
|
489
|
-
};
|
|
490
|
-
|
|
491
429
|
type GetLastChartPropsFunction = () => LineChartStubProps;
|
|
492
430
|
|
|
493
431
|
const getLastChartProps: GetLastChartPropsFunction = (): LineChartStubProps => {
|
|
@@ -499,9 +437,12 @@ const getLastChartProps: GetLastChartPropsFunction = (): LineChartStubProps => {
|
|
|
499
437
|
|
|
500
438
|
beforeEach((): void => {
|
|
501
439
|
jest.clearAllMocks();
|
|
440
|
+
sloForNameLookup = buildSlo();
|
|
502
441
|
getCurrentProjectIdMock.mockReturnValue(PROJECT_ID);
|
|
503
442
|
getItemMock.mockResolvedValue(buildSlo());
|
|
504
|
-
getListMock.
|
|
443
|
+
getListMock.mockImplementation((args: unknown) => {
|
|
444
|
+
return Promise.resolve(respondToList(args as JSONObject));
|
|
445
|
+
});
|
|
505
446
|
aggregateMock.mockResolvedValue(buildSloHistory(HISTORY_ROW_COUNT));
|
|
506
447
|
});
|
|
507
448
|
|
|
@@ -510,177 +451,138 @@ afterEach((): void => {
|
|
|
510
451
|
});
|
|
511
452
|
|
|
512
453
|
describe("SLO dashboard template — what it ships", () => {
|
|
513
|
-
test("resolves to
|
|
454
|
+
test("resolves to SLO widgets in both display types, the SLO List, headings and the SLO variable", () => {
|
|
514
455
|
/*
|
|
515
|
-
* Every loop below iterates one of these arrays, so an empty one would
|
|
516
|
-
*
|
|
456
|
+
* Every loop below iterates one of these arrays, so an empty one would make
|
|
457
|
+
* those tests pass vacuously for ever. This is the guard.
|
|
517
458
|
*/
|
|
518
459
|
expect(TEMPLATE_CONFIG).not.toBeNull();
|
|
519
|
-
expect(SLO_WIDGETS.length).toBeGreaterThan(0);
|
|
520
|
-
expect(TEXT_WIDGETS.length).toBeGreaterThan(0);
|
|
521
460
|
expect(TILE_WIDGETS.length).toBeGreaterThan(0);
|
|
522
461
|
expect(CHART_WIDGETS.length).toBeGreaterThan(0);
|
|
523
|
-
|
|
524
|
-
/*
|
|
525
|
-
* A widget whose displayType was dropped would fall out of BOTH groups
|
|
526
|
-
* and be silently skipped by the display-type tests.
|
|
527
|
-
*/
|
|
528
462
|
expect(TILE_WIDGETS.length + CHART_WIDGETS.length).toBe(SLO_WIDGETS.length);
|
|
463
|
+
expect(SLO_LIST_WIDGETS).toHaveLength(1);
|
|
464
|
+
expect(TEXT_WIDGETS.length).toBeGreaterThan(0);
|
|
465
|
+
expect(SHIPPED_VARIABLES).toHaveLength(1);
|
|
529
466
|
|
|
530
|
-
|
|
531
|
-
* The premise of the setup-state tests: a template cannot know a
|
|
532
|
-
* project's SLO ids, so it ships none. If this ever changes, the widget
|
|
533
|
-
* renders data instead of its setup state and the tests below become
|
|
534
|
-
* meaningless rather than failing for a good reason.
|
|
535
|
-
*/
|
|
467
|
+
// The premise of everything below: every SLO widget follows that variable.
|
|
536
468
|
for (const widget of SLO_WIDGETS) {
|
|
537
|
-
const label: string = getWidgetLabel(widget);
|
|
538
469
|
expect(
|
|
539
|
-
`${
|
|
540
|
-
).toBe(
|
|
470
|
+
`${labelOf(widget)}: pinned=${widget.arguments.serviceLevelObjectiveId || "none"} follows=${widget.arguments.serviceLevelObjectiveVariableId}`,
|
|
471
|
+
).toBe(
|
|
472
|
+
`${labelOf(widget)}: pinned=none follows=${(SHIPPED_VARIABLES[0] as DashboardVariable).id}`,
|
|
473
|
+
);
|
|
541
474
|
}
|
|
542
475
|
});
|
|
543
476
|
});
|
|
544
477
|
|
|
545
|
-
describe("SLO dashboard template —
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
478
|
+
describe("SLO dashboard template — as created, with the toolbar on All", () => {
|
|
479
|
+
/*
|
|
480
|
+
* The complaint this rewrite answers: a fresh SLO dashboard opened on six
|
|
481
|
+
* inert "Click to select an SLO" widgets and a row telling the reader to
|
|
482
|
+
* edit it. Now every SLO widget names the one control that works in the view
|
|
483
|
+
* mode a new dashboard opens in — and asks nothing of the server until used.
|
|
484
|
+
*/
|
|
485
|
+
test("every SLO widget asks for a toolbar pick under its own title, and reads nothing", async () => {
|
|
549
486
|
for (const widget of SLO_WIDGETS) {
|
|
550
|
-
const label: string =
|
|
487
|
+
const label: string = labelOf(widget);
|
|
551
488
|
const requestsBefore: number = countRequests();
|
|
552
489
|
|
|
553
|
-
renderSloWidget(widget);
|
|
490
|
+
renderSloWidget(widget, SHIPPED_VARIABLES);
|
|
554
491
|
|
|
555
|
-
await expectRendered({ label
|
|
492
|
+
await expectRendered({ label, text: SLO_WIDGET_NO_SELECTION_TEXT });
|
|
493
|
+
await expectRendered({ label, text: label });
|
|
494
|
+
expectNotRendered({ label, text: "Click to select an SLO" });
|
|
495
|
+
expectNotRendered({ label, text: SLO_NOT_EVALUATED_TEXT });
|
|
556
496
|
|
|
557
|
-
/*
|
|
558
|
-
* The title is what makes six identical placeholders tell the reader
|
|
559
|
-
* which tile is which before anything is configured — the reason the
|
|
560
|
-
* template sets widgetTitle on every one of them.
|
|
561
|
-
*/
|
|
562
|
-
await expectRendered({ label: label, text: label });
|
|
563
|
-
|
|
564
|
-
/*
|
|
565
|
-
* A widget with no objective must not reach ANY endpoint: on a public
|
|
566
|
-
* dashboard the stored id is the authorization decision, so a request
|
|
567
|
-
* without one has nothing the server could scope.
|
|
568
|
-
*/
|
|
569
497
|
expect(`${label}: ${countRequests() - requestsBefore} requests`).toBe(
|
|
570
498
|
`${label}: 0 requests`,
|
|
571
499
|
);
|
|
500
|
+
expect(lineChartRenderMock).not.toHaveBeenCalled();
|
|
572
501
|
|
|
573
502
|
cleanup();
|
|
574
503
|
}
|
|
575
504
|
});
|
|
576
505
|
|
|
577
|
-
test("
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
for (const widget of TILE_WIDGETS) {
|
|
581
|
-
const label: string = getWidgetLabel(widget);
|
|
582
|
-
|
|
583
|
-
renderSloWidget(widget);
|
|
584
|
-
|
|
585
|
-
await expectRendered({ label: label, text: SETUP_MESSAGE });
|
|
586
|
-
|
|
587
|
-
/*
|
|
588
|
-
* Two different empty states that must not be confused: "nothing is
|
|
589
|
-
* chosen" is the reader's next action, "not evaluated yet" is a claim
|
|
590
|
-
* about an SLO — and there is no SLO here to make it about.
|
|
591
|
-
*/
|
|
592
|
-
expectNotRendered({ label: label, text: SLO_NOT_EVALUATED_TEXT });
|
|
593
|
-
|
|
594
|
-
cleanup();
|
|
595
|
-
}
|
|
596
|
-
});
|
|
597
|
-
|
|
598
|
-
test("an unconfigured Chart offers setup rather than mounting an empty chart", async () => {
|
|
599
|
-
expect(CHART_WIDGETS.length).toBeGreaterThan(0);
|
|
600
|
-
|
|
601
|
-
for (const widget of CHART_WIDGETS) {
|
|
602
|
-
const label: string = getWidgetLabel(widget);
|
|
603
|
-
const chartsBefore: number = lineChartRenderMock.mock.calls.length;
|
|
604
|
-
|
|
605
|
-
renderSloWidget(widget);
|
|
506
|
+
test("reaches the toolbar prompt even before a project is resolved", async () => {
|
|
507
|
+
getCurrentProjectIdMock.mockReturnValue(null);
|
|
606
508
|
|
|
607
|
-
|
|
509
|
+
for (const widget of SLO_WIDGETS) {
|
|
510
|
+
renderSloWidget(widget, SHIPPED_VARIABLES);
|
|
608
511
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
512
|
+
await expectRendered({
|
|
513
|
+
label: labelOf(widget),
|
|
514
|
+
text: SLO_WIDGET_NO_SELECTION_TEXT,
|
|
515
|
+
});
|
|
516
|
+
expectNotRendered({
|
|
517
|
+
label: labelOf(widget),
|
|
518
|
+
text: "No project selected.",
|
|
519
|
+
});
|
|
612
520
|
|
|
613
521
|
cleanup();
|
|
614
522
|
}
|
|
615
523
|
});
|
|
616
524
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
525
|
+
/*
|
|
526
|
+
* The fleet does not wait for anything: the SLO List queries the moment the
|
|
527
|
+
* dashboard is created, every active objective, least budget first.
|
|
528
|
+
*/
|
|
529
|
+
test("the SLO List shows the fleet immediately", async () => {
|
|
530
|
+
const list: DashboardSloListComponent =
|
|
531
|
+
SLO_LIST_WIDGETS[0] as DashboardSloListComponent;
|
|
532
|
+
|
|
533
|
+
render(
|
|
534
|
+
<DashboardSloListComponentElement
|
|
535
|
+
{...buildBaseProps({ component: list, variables: SHIPPED_VARIABLES })}
|
|
536
|
+
component={list}
|
|
537
|
+
/>,
|
|
538
|
+
);
|
|
627
539
|
|
|
628
|
-
|
|
540
|
+
expect(await screen.findAllByTestId("slo-list-row")).toHaveLength(
|
|
541
|
+
FLEET.length,
|
|
542
|
+
);
|
|
543
|
+
expect(screen.getByText("Service Level Objectives")).toBeInTheDocument();
|
|
629
544
|
|
|
630
|
-
|
|
631
|
-
expectNotRendered({ label: label, text: "No project selected." });
|
|
545
|
+
const args: JSONObject = getListMock.mock.calls[0]![0] as JSONObject;
|
|
632
546
|
|
|
633
|
-
|
|
634
|
-
}
|
|
547
|
+
expect(args["query"]).toEqual({ projectId: PROJECT_ID, isArchived: false });
|
|
635
548
|
});
|
|
636
549
|
});
|
|
637
550
|
|
|
638
|
-
describe("SLO dashboard template —
|
|
639
|
-
test("each tile renders its own metric's number and subline", async () => {
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
const coveredMetrics: Set<SloWidgetMetric> = new Set<SloWidgetMetric>();
|
|
551
|
+
describe("SLO dashboard template — with an SLO picked in the toolbar", () => {
|
|
552
|
+
test("each tile renders its own metric's number and subline, under the picked SLO's name", async () => {
|
|
553
|
+
const covered: Set<SloWidgetMetric> = new Set<SloWidgetMetric>();
|
|
643
554
|
|
|
644
555
|
for (const widget of TILE_WIDGETS) {
|
|
645
|
-
const label: string =
|
|
646
|
-
const metric: SloWidgetMetric =
|
|
556
|
+
const label: string = labelOf(widget);
|
|
557
|
+
const metric: SloWidgetMetric =
|
|
558
|
+
widget.arguments.sloMetric || SloWidgetMetric.Sli;
|
|
647
559
|
const expected: TileExpectation = EXPECTED_TILE[metric];
|
|
648
560
|
|
|
649
|
-
|
|
561
|
+
covered.add(metric);
|
|
650
562
|
|
|
651
|
-
renderSloWidget(
|
|
563
|
+
renderSloWidget(widget, PICKED_VARIABLES);
|
|
652
564
|
|
|
653
|
-
await expectRendered({ label
|
|
565
|
+
await expectRendered({ label, text: expected.value });
|
|
566
|
+
await expectRendered({ label, text: `${SLO_NAME} · ${label}` });
|
|
654
567
|
|
|
655
568
|
if (expected.subline !== null) {
|
|
656
|
-
await expectRendered({ label
|
|
569
|
+
await expectRendered({ label, text: expected.subline });
|
|
657
570
|
}
|
|
658
571
|
|
|
659
572
|
/*
|
|
660
|
-
*
|
|
661
|
-
*
|
|
662
|
-
* number. Pin that each one renders ONLY its own.
|
|
573
|
+
* Three tiles read three columns off one row, so a tile wired to the
|
|
574
|
+
* wrong metric would still render a plausible number.
|
|
663
575
|
*/
|
|
664
576
|
for (const otherMetric of Object.values(SloWidgetMetric)) {
|
|
665
|
-
if (otherMetric
|
|
666
|
-
|
|
577
|
+
if (otherMetric !== metric) {
|
|
578
|
+
expectNotRendered({ label, text: EXPECTED_TILE[otherMetric].value });
|
|
667
579
|
}
|
|
668
|
-
|
|
669
|
-
expectNotRendered({
|
|
670
|
-
label: label,
|
|
671
|
-
text: EXPECTED_TILE[otherMetric].value,
|
|
672
|
-
});
|
|
673
580
|
}
|
|
674
581
|
|
|
675
582
|
cleanup();
|
|
676
583
|
}
|
|
677
584
|
|
|
678
|
-
|
|
679
|
-
* The template is an SLO review in the order it is read — where the
|
|
680
|
-
* service is, how much room is left, how fast it is going — so all three
|
|
681
|
-
* numbers have to be on the board.
|
|
682
|
-
*/
|
|
683
|
-
expect(coveredMetrics.size).toBe(Object.keys(EXPECTED_TILE).length);
|
|
585
|
+
expect(covered.size).toBe(Object.keys(EXPECTED_TILE).length);
|
|
684
586
|
});
|
|
685
587
|
|
|
686
588
|
test.each([
|
|
@@ -689,252 +591,154 @@ describe("SLO dashboard template — a configured Objective Health tile", () =>
|
|
|
689
591
|
])(
|
|
690
592
|
"says the SLO is not evaluated yet for %s, never null or NaN",
|
|
691
593
|
async (_shape: string, stateValue: null | undefined) => {
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
594
|
+
sloForNameLookup = Object.assign(buildSlo(), {
|
|
595
|
+
currentSliPercentage: stateValue,
|
|
596
|
+
errorBudgetRemainingPercentage: stateValue,
|
|
597
|
+
errorBudgetRemainingSeconds: stateValue,
|
|
598
|
+
currentBurnRate: stateValue,
|
|
599
|
+
sloStatus: stateValue,
|
|
600
|
+
}) as unknown as ServiceLevelObjective;
|
|
695
601
|
|
|
696
602
|
for (const widget of TILE_WIDGETS) {
|
|
697
|
-
const label: string =
|
|
698
|
-
|
|
603
|
+
const label: string = labelOf(widget);
|
|
699
604
|
const { container }: RenderResult = renderSloWidget(
|
|
700
|
-
|
|
605
|
+
widget,
|
|
606
|
+
PICKED_VARIABLES,
|
|
701
607
|
);
|
|
702
608
|
|
|
703
|
-
await expectRendered({ label
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
renderedText.match(/null|NaN|undefined/i);
|
|
713
|
-
|
|
714
|
-
expect(
|
|
715
|
-
`${label}: ${leakedValue ? leakedValue[0] : "no leaked value"}`,
|
|
716
|
-
).toBe(`${label}: no leaked value`);
|
|
717
|
-
|
|
718
|
-
// Nor any of the numbers an evaluated SLO would have rendered.
|
|
719
|
-
for (const metric of Object.values(SloWidgetMetric)) {
|
|
720
|
-
expectNotRendered({
|
|
721
|
-
label: label,
|
|
722
|
-
text: EXPECTED_TILE[metric].value,
|
|
723
|
-
});
|
|
724
|
-
}
|
|
609
|
+
await expectRendered({ label, text: SLO_NOT_EVALUATED_TEXT });
|
|
610
|
+
|
|
611
|
+
const leaked: RegExpMatchArray | null = (
|
|
612
|
+
container.textContent || ""
|
|
613
|
+
).match(/null|NaN|undefined/i);
|
|
614
|
+
|
|
615
|
+
expect(`${label}: ${leaked ? leaked[0] : "no leaked value"}`).toBe(
|
|
616
|
+
`${label}: no leaked value`,
|
|
617
|
+
);
|
|
725
618
|
|
|
726
619
|
cleanup();
|
|
727
620
|
}
|
|
728
621
|
},
|
|
729
622
|
);
|
|
730
|
-
});
|
|
731
|
-
|
|
732
|
-
describe("SLO dashboard template — the Error Budget Trends charts", () => {
|
|
733
|
-
test("an empty SloHistory series renders the empty state, not a chart", async () => {
|
|
734
|
-
aggregateMock.mockResolvedValue(buildSloHistory(0));
|
|
735
|
-
|
|
736
|
-
expect(CHART_WIDGETS.length).toBeGreaterThan(0);
|
|
737
623
|
|
|
624
|
+
test("every history chart plots the picked SLO's series by its id", async () => {
|
|
738
625
|
for (const widget of CHART_WIDGETS) {
|
|
739
|
-
const label: string =
|
|
740
|
-
const chartsBefore: number = lineChartRenderMock.mock.calls.length;
|
|
626
|
+
const label: string = labelOf(widget);
|
|
741
627
|
|
|
742
|
-
|
|
628
|
+
aggregateMock.mockClear();
|
|
629
|
+
renderSloWidget(widget, PICKED_VARIABLES);
|
|
743
630
|
|
|
744
|
-
await expectRendered({ label
|
|
631
|
+
await expectRendered({ label, text: `points:${HISTORY_ROW_COUNT}` });
|
|
745
632
|
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
633
|
+
const query: JSONObject = (
|
|
634
|
+
(aggregateMock.mock.calls[0]![0] as JSONObject)[
|
|
635
|
+
"aggregateBy"
|
|
636
|
+
] as JSONObject
|
|
637
|
+
)["query"] as JSONObject;
|
|
638
|
+
|
|
639
|
+
expect(`${label}: ${(query["sloId"] as ObjectID).toString()}`).toBe(
|
|
640
|
+
`${label}: ${PICKED_SLO_ID.toString()}`,
|
|
641
|
+
);
|
|
754
642
|
|
|
755
643
|
cleanup();
|
|
756
644
|
}
|
|
757
645
|
});
|
|
758
646
|
|
|
759
|
-
test("
|
|
760
|
-
expect(CHART_WIDGETS.length).toBeGreaterThan(0);
|
|
761
|
-
|
|
647
|
+
test("the SLI history draws the objective's target as a reference line; the others draw none", async () => {
|
|
762
648
|
for (const widget of CHART_WIDGETS) {
|
|
763
|
-
const label: string =
|
|
649
|
+
const label: string = labelOf(widget);
|
|
650
|
+
const isSli: boolean = widget.arguments.sloMetric === SloWidgetMetric.Sli;
|
|
764
651
|
|
|
765
|
-
renderSloWidget(
|
|
652
|
+
renderSloWidget(widget, PICKED_VARIABLES);
|
|
766
653
|
|
|
767
|
-
await expectRendered({
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
654
|
+
await expectRendered({ label, text: `points:${HISTORY_ROW_COUNT}` });
|
|
655
|
+
|
|
656
|
+
const referenceLines: Array<ChartReferenceLineProps> =
|
|
657
|
+
getLastChartProps().referenceLines || [];
|
|
658
|
+
|
|
659
|
+
if (isSli) {
|
|
660
|
+
expect(referenceLines).toHaveLength(1);
|
|
661
|
+
expect(referenceLines[0]!.value).toBe(TARGET_PERCENTAGE);
|
|
662
|
+
expect(referenceLines[0]!.label).toBe(`Target ${TARGET_PERCENTAGE}%`);
|
|
663
|
+
} else {
|
|
664
|
+
expect(`${label}: ${referenceLines.length} reference lines`).toBe(
|
|
665
|
+
`${label}: 0 reference lines`,
|
|
666
|
+
);
|
|
667
|
+
}
|
|
771
668
|
|
|
772
669
|
cleanup();
|
|
773
670
|
}
|
|
774
671
|
});
|
|
775
672
|
|
|
776
|
-
test("
|
|
777
|
-
|
|
778
|
-
(widget: DashboardSloComponent): boolean => {
|
|
779
|
-
return getWidgetMetric(widget) === SloWidgetMetric.Sli;
|
|
780
|
-
},
|
|
781
|
-
);
|
|
782
|
-
|
|
783
|
-
/*
|
|
784
|
-
* "Are we above the line" is the question the Error Budget Trends row
|
|
785
|
-
* exists to answer at a glance, so the template must carry an SLI chart
|
|
786
|
-
* for this test to be about anything.
|
|
787
|
-
*/
|
|
788
|
-
expect(sliChart).toBeDefined();
|
|
673
|
+
test("an empty history renders the empty state, not an empty chart", async () => {
|
|
674
|
+
aggregateMock.mockResolvedValue(buildSloHistory(0));
|
|
789
675
|
|
|
790
|
-
|
|
676
|
+
for (const widget of CHART_WIDGETS) {
|
|
677
|
+
const label: string = labelOf(widget);
|
|
678
|
+
const chartsBefore: number = lineChartRenderMock.mock.calls.length;
|
|
791
679
|
|
|
792
|
-
|
|
793
|
-
label: "SLI chart",
|
|
794
|
-
text: `points:${HISTORY_ROW_COUNT}`,
|
|
795
|
-
});
|
|
680
|
+
renderSloWidget(widget, PICKED_VARIABLES);
|
|
796
681
|
|
|
797
|
-
|
|
798
|
-
|
|
682
|
+
await expectRendered({ label, text: /No history for the selected/i });
|
|
683
|
+
expect(
|
|
684
|
+
`${label}: ${lineChartRenderMock.mock.calls.length - chartsBefore} charts`,
|
|
685
|
+
).toBe(`${label}: 0 charts`);
|
|
799
686
|
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
expect(referenceLines[0]!.label).toBe(`Target ${TARGET_PERCENTAGE}%`);
|
|
687
|
+
cleanup();
|
|
688
|
+
}
|
|
803
689
|
});
|
|
804
690
|
|
|
805
|
-
test("
|
|
806
|
-
|
|
691
|
+
test("the SLO List narrows to the picked objective", async () => {
|
|
692
|
+
const list: DashboardSloListComponent =
|
|
693
|
+
SLO_LIST_WIDGETS[0] as DashboardSloListComponent;
|
|
807
694
|
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
695
|
+
render(
|
|
696
|
+
<DashboardSloListComponentElement
|
|
697
|
+
{...buildBaseProps({ component: list, variables: PICKED_VARIABLES })}
|
|
698
|
+
component={list}
|
|
699
|
+
/>,
|
|
812
700
|
);
|
|
813
701
|
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
renderSloWidget(configureSloWidget(sliChart as DashboardSloComponent));
|
|
702
|
+
await screen.findAllByTestId("slo-list-row");
|
|
817
703
|
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
*/
|
|
822
|
-
await expectRendered({
|
|
823
|
-
label: "SLI chart without a target",
|
|
824
|
-
text: `points:${HISTORY_ROW_COUNT}`,
|
|
825
|
-
});
|
|
826
|
-
|
|
827
|
-
/*
|
|
828
|
-
* A line at 0 (or at NaN) would read as a target of zero percent, which
|
|
829
|
-
* is a reliability claim the SLO never made.
|
|
830
|
-
*/
|
|
831
|
-
expect(getLastChartProps().referenceLines || []).toEqual([]);
|
|
832
|
-
});
|
|
833
|
-
|
|
834
|
-
test("the budget and burn-rate charts never draw a target line", async () => {
|
|
835
|
-
const otherCharts: Array<DashboardSloComponent> = CHART_WIDGETS.filter(
|
|
836
|
-
(widget: DashboardSloComponent): boolean => {
|
|
837
|
-
return getWidgetMetric(widget) !== SloWidgetMetric.Sli;
|
|
838
|
-
},
|
|
839
|
-
);
|
|
840
|
-
|
|
841
|
-
expect(otherCharts.length).toBeGreaterThan(0);
|
|
842
|
-
|
|
843
|
-
for (const widget of otherCharts) {
|
|
844
|
-
const label: string = getWidgetLabel(widget);
|
|
845
|
-
|
|
846
|
-
renderSloWidget(configureSloWidget(widget));
|
|
847
|
-
|
|
848
|
-
await expectRendered({
|
|
849
|
-
label: label,
|
|
850
|
-
text: `points:${HISTORY_ROW_COUNT}`,
|
|
851
|
-
});
|
|
852
|
-
|
|
853
|
-
/*
|
|
854
|
-
* targetPercentage is a percentage of the SLI; drawn across a burn
|
|
855
|
-
* rate ("99.9x") or across remaining budget it is meaningless, and
|
|
856
|
-
* the SLO row carries one on every one of these renders.
|
|
857
|
-
*/
|
|
858
|
-
const referenceLines: Array<ChartReferenceLineProps> =
|
|
859
|
-
getLastChartProps().referenceLines || [];
|
|
860
|
-
|
|
861
|
-
expect(`${label}: ${referenceLines.length} reference lines`).toBe(
|
|
862
|
-
`${label}: 0 reference lines`,
|
|
863
|
-
);
|
|
864
|
-
|
|
865
|
-
cleanup();
|
|
866
|
-
}
|
|
704
|
+
expect(
|
|
705
|
+
(getListMock.mock.calls[0]![0] as JSONObject)["query"] as JSONObject,
|
|
706
|
+
).toEqual({ projectId: PROJECT_ID, isArchived: false, name: SLO_NAME });
|
|
867
707
|
});
|
|
868
708
|
});
|
|
869
709
|
|
|
870
710
|
describe("SLO dashboard template — the text rows", () => {
|
|
871
|
-
test("every text row renders its
|
|
872
|
-
expect(TEXT_WIDGETS.length).toBeGreaterThan(0);
|
|
873
|
-
|
|
711
|
+
test("every text row is a bold heading that renders its words in full at a legible size", () => {
|
|
874
712
|
for (const widget of TEXT_WIDGETS) {
|
|
875
713
|
const text: string = widget.arguments.text;
|
|
876
|
-
const { container }: RenderResult = renderTextWidget(widget);
|
|
877
|
-
|
|
878
|
-
const rendered: HTMLElement | null = screen.queryByText(text);
|
|
879
714
|
|
|
880
|
-
|
|
881
|
-
|
|
715
|
+
render(
|
|
716
|
+
<DashboardTextComponentElement
|
|
717
|
+
{...buildBaseProps({
|
|
718
|
+
component: widget,
|
|
719
|
+
variables: SHIPPED_VARIABLES,
|
|
720
|
+
})}
|
|
721
|
+
component={widget}
|
|
722
|
+
/>,
|
|
882
723
|
);
|
|
883
724
|
|
|
884
|
-
|
|
885
|
-
expect(container.textContent).not.toContain("No text configured");
|
|
725
|
+
const rendered: HTMLElement = screen.getByText(text);
|
|
886
726
|
|
|
727
|
+
expect(rendered.textContent).toBe(text);
|
|
887
728
|
/*
|
|
888
|
-
*
|
|
889
|
-
*
|
|
729
|
+
* No instruction row: every text row is a heading, which the renderer
|
|
730
|
+
* gives `font-semibold`.
|
|
890
731
|
*/
|
|
891
|
-
const expectedWeight: string = widget.arguments.isBold
|
|
892
|
-
? "font-semibold"
|
|
893
|
-
: "font-normal";
|
|
894
|
-
|
|
895
732
|
expect(
|
|
896
|
-
`"${text}"
|
|
897
|
-
).toBe(`"${text}"
|
|
898
|
-
|
|
899
|
-
cleanup();
|
|
900
|
-
}
|
|
901
|
-
});
|
|
902
|
-
|
|
903
|
-
test("the guidance row renders the whole instruction at a legible size", () => {
|
|
904
|
-
/*
|
|
905
|
-
* Row 1 is the one instruction a reader needs on a freshly created SLO
|
|
906
|
-
* dashboard: every widget above is inert until an objective is picked,
|
|
907
|
-
* and the widgets' own "Click to select an SLO" does nothing in the view
|
|
908
|
-
* mode a template opens in. A clipped or empty render loses that.
|
|
909
|
-
*/
|
|
910
|
-
const guidance: DashboardTextComponent | undefined = TEXT_WIDGETS.find(
|
|
911
|
-
(widget: DashboardTextComponent): boolean => {
|
|
912
|
-
return widget.topInDashboardUnits === 1;
|
|
913
|
-
},
|
|
914
|
-
);
|
|
733
|
+
`"${text}" bold=${rendered.className.includes("font-semibold")}`,
|
|
734
|
+
).toBe(`"${text}" bold=true`);
|
|
915
735
|
|
|
916
|
-
|
|
736
|
+
const fontSizeInPx: number = Number.parseFloat(rendered.style.fontSize);
|
|
917
737
|
|
|
918
|
-
|
|
919
|
-
|
|
738
|
+
expect(Number.isFinite(fontSizeInPx)).toBe(true);
|
|
739
|
+
expect(fontSizeInPx).toBeGreaterThan(0);
|
|
920
740
|
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
const rendered: HTMLElement = screen.getByText(text);
|
|
924
|
-
|
|
925
|
-
// Rendered whole: not the first clause, not an ellipsis.
|
|
926
|
-
expect(rendered.textContent).toBe(text);
|
|
927
|
-
expect((rendered.textContent || "").length).toBe(text.length);
|
|
928
|
-
|
|
929
|
-
/*
|
|
930
|
-
* The Text widget scales its font to the row height. A height-1 row that
|
|
931
|
-
* resolved to 0 (or to a non-number) would render the sentence
|
|
932
|
-
* invisibly while every text assertion above still passed.
|
|
933
|
-
*/
|
|
934
|
-
const fontSizeInPx: number = Number.parseFloat(rendered.style.fontSize);
|
|
935
|
-
|
|
936
|
-
expect(Number.isFinite(fontSizeInPx)).toBe(true);
|
|
937
|
-
expect(fontSizeInPx).toBeGreaterThan(0);
|
|
938
|
-
expect(fontSizeInPx).toBeLessThanOrEqual(64);
|
|
741
|
+
cleanup();
|
|
742
|
+
}
|
|
939
743
|
});
|
|
940
744
|
});
|