@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
|
@@ -11,74 +11,48 @@ import DashboardVariable, {
|
|
|
11
11
|
import DashboardViewConfig from "../../../Types/Dashboard/DashboardViewConfig";
|
|
12
12
|
import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
|
|
13
13
|
import MetricQueryData from "../../../Types/Metrics/MetricQueryData";
|
|
14
|
-
import DashboardModelQueryInterpolation
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
} from "../../../Utils/Dashboard/
|
|
14
|
+
import DashboardModelQueryInterpolation from "../../../Utils/Dashboard/ModelQueryVariableInterpolation";
|
|
15
|
+
import {
|
|
16
|
+
resolveSloWidgetSource,
|
|
17
|
+
SloWidgetSource,
|
|
18
|
+
SloWidgetSourceState,
|
|
19
|
+
} from "../../../Utils/Dashboard/SloWidgetSource";
|
|
20
|
+
import DashboardVariableInterpolation from "../../../Utils/Dashboard/VariableInterpolation";
|
|
21
|
+
import { SLO_LIST_ATTRIBUTE_TO_COLUMN } from "../../../Utils/Slo/SloListWidgetFormat";
|
|
20
22
|
import { describe, expect, test } from "@jest/globals";
|
|
21
23
|
|
|
22
24
|
/*
|
|
23
|
-
* What the SLO template's
|
|
24
|
-
* running the
|
|
25
|
-
*
|
|
25
|
+
* What the SLO template's one toolbar variable actually scopes, established by
|
|
26
|
+
* running the REAL resolution code over the REAL template config — never by
|
|
27
|
+
* reading the template's comments.
|
|
26
28
|
*
|
|
27
|
-
* The template
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* getting that boundary wrong throws nothing — it ships a dashboard whose
|
|
31
|
-
* halves silently disagree about what is selected: uptime narrowed to one
|
|
32
|
-
* monitor, the SLI tile beside it still reporting the whole objective, and
|
|
33
|
-
* no indication which number answers which question.
|
|
29
|
+
* The template promises that one pick scopes the whole board. That promise is
|
|
30
|
+
* three different mechanisms, and getting any one wrong throws nothing — it
|
|
31
|
+
* ships a board whose sections silently disagree about what is selected:
|
|
34
32
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
/*
|
|
43
|
-
* The attribute key MonitorMetricUtil.buildAttributes stamps onto
|
|
44
|
-
* `oneuptime.monitor.online` and `oneuptime.monitor.response.time`. It is a
|
|
45
|
-
* BARE key: metric attributes written by OneUptime's own monitor workers are
|
|
46
|
-
* not OTel collector resource attributes and carry no prefix.
|
|
47
|
-
*/
|
|
48
|
-
const MONITOR_ATTRIBUTE: string = "monitorName";
|
|
49
|
-
|
|
50
|
-
/*
|
|
51
|
-
* The two plausible mis-spellings of that binding. Both fail SILENTLY, which
|
|
52
|
-
* is why they are pinned here rather than left to review:
|
|
33
|
+
* - metric widgets (the Error Budget row) go through
|
|
34
|
+
* DashboardVariableInterpolation, which writes an attribute predicate;
|
|
35
|
+
* - the SLO List goes through DashboardModelQueryInterpolation, which
|
|
36
|
+
* writes a Postgres column predicate only for a key it has a column for
|
|
37
|
+
* (SLO_LIST_ATTRIBUTE_TO_COLUMN);
|
|
38
|
+
* - the Selected SLO widgets go through resolveSloWidgetSource, which turns
|
|
39
|
+
* the selection into the one objective they show.
|
|
53
40
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* variable's picker would offer no options at all and any value forced
|
|
57
|
-
* into it would filter on an attribute no row has — every monitor widget
|
|
58
|
-
* renders empty, with no error anywhere.
|
|
59
|
-
*
|
|
60
|
-
* - "monitorNames" is the PLURAL key IncidentService stamps on incident
|
|
61
|
-
* metrics, comma-joined ("api-gateway,web-frontend"). It really exists in
|
|
62
|
-
* the metric store, so the picker would even populate — with comma-joined
|
|
63
|
-
* lists rather than monitor names — and an IN test for a single monitor
|
|
64
|
-
* would match none of the uptime rows, emptying exactly the widgets this
|
|
65
|
-
* variable exists to scope.
|
|
41
|
+
* The template's declarative facts — inventory, titles, layout — are pinned in
|
|
42
|
+
* Common/Tests/Types/Dashboard/SloDashboardTemplate.test.ts.
|
|
66
43
|
*/
|
|
67
|
-
const PREFIXED_MONITOR_ATTRIBUTE: string = "resource.monitorName";
|
|
68
|
-
const PLURAL_MONITOR_ATTRIBUTE: string = "monitorNames";
|
|
69
44
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const
|
|
45
|
+
// The bare key SloMetricUtil stamps on every `oneuptime.slo.*` row.
|
|
46
|
+
const SLO_NAME_ATTRIBUTE: string = "sloName";
|
|
47
|
+
|
|
48
|
+
const PICKED_SLO: string = "Checkout API";
|
|
49
|
+
const OTHER_SLO: string = "Search API";
|
|
75
50
|
|
|
76
51
|
/*
|
|
77
|
-
* An attribute the reader could plausibly have added to a widget by hand
|
|
78
|
-
*
|
|
79
|
-
* Monitor variable owns exactly one key and must not tidy up its neighbours.
|
|
52
|
+
* An attribute the reader could plausibly have added to a widget by hand. It
|
|
53
|
+
* must survive every pick / clear cycle: the SLO variable owns exactly one key.
|
|
80
54
|
*/
|
|
81
|
-
const UNRELATED_ATTRIBUTE: string = "
|
|
55
|
+
const UNRELATED_ATTRIBUTE: string = "oneuptime.label.team";
|
|
82
56
|
|
|
83
57
|
// -- Helpers ---------------------------------------------------------------
|
|
84
58
|
|
|
@@ -90,101 +64,32 @@ function getConfig(): DashboardViewConfig {
|
|
|
90
64
|
);
|
|
91
65
|
|
|
92
66
|
expect(config).not.toBeNull();
|
|
93
|
-
return
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// TEMPORARY mutation harness - removed before commit.
|
|
97
|
-
function mutateForFailureCheck(
|
|
98
|
-
config: DashboardViewConfig,
|
|
99
|
-
): DashboardViewConfig {
|
|
100
|
-
const mutation: string = process.env["SLO_TEST_MUTATION"] || "";
|
|
101
|
-
const variable: DashboardVariable = (config.variables ||
|
|
102
|
-
[])[0] as DashboardVariable;
|
|
103
|
-
|
|
104
|
-
if (mutation === "prefixedKey") {
|
|
105
|
-
variable.attributeKey = "resource.monitorName";
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (mutation === "multiDefault") {
|
|
109
|
-
variable.defaultValue = "api-gateway";
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (mutation === "singleSelectDefault") {
|
|
113
|
-
variable.isMultiSelect = false;
|
|
114
|
-
variable.defaultValue = "api-gateway";
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
if (mutation === "sloGainsQuery") {
|
|
118
|
-
const slo: DashboardBaseComponent = config.components.filter(
|
|
119
|
-
(component: DashboardBaseComponent): boolean => {
|
|
120
|
-
return component.componentType === DashboardComponentType.Slo;
|
|
121
|
-
},
|
|
122
|
-
)[0] as DashboardBaseComponent;
|
|
123
|
-
(slo.arguments as WidgetArguments)["metricQueryConfig"] = {
|
|
124
|
-
metricQueryData: {
|
|
125
|
-
filterData: { metricName: "x", aggegationType: "Avg" },
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if (mutation === "storedFilter") {
|
|
131
|
-
const widget: DashboardBaseComponent = config.components.filter(
|
|
132
|
-
(component: DashboardBaseComponent): boolean => {
|
|
133
|
-
return component.componentType === DashboardComponentType.Value;
|
|
134
|
-
},
|
|
135
|
-
)[0] as DashboardBaseComponent;
|
|
136
|
-
const queryConfig: WidgetArguments = (widget.arguments as WidgetArguments)[
|
|
137
|
-
"metricQueryConfig"
|
|
138
|
-
] as WidgetArguments;
|
|
139
|
-
const queryData: WidgetArguments = queryConfig[
|
|
140
|
-
"metricQueryData"
|
|
141
|
-
] as WidgetArguments;
|
|
142
|
-
(queryData["filterData"] as WidgetArguments)["attributes"] = {
|
|
143
|
-
monitorName: "api-gateway",
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (mutation === "dropAValueWidget") {
|
|
148
|
-
const index: number = config.components.findIndex(
|
|
149
|
-
(component: DashboardBaseComponent): boolean => {
|
|
150
|
-
return component.componentType === DashboardComponentType.Value;
|
|
151
|
-
},
|
|
152
|
-
);
|
|
153
|
-
config.components.splice(index, 1);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
return config;
|
|
67
|
+
return config as DashboardViewConfig;
|
|
157
68
|
}
|
|
158
69
|
|
|
159
70
|
/*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
* key true by construction.
|
|
71
|
+
* Selected by being the template's ONLY variable, never by its key — selecting
|
|
72
|
+
* it by key would make the tests that pin the key true by construction.
|
|
163
73
|
*/
|
|
164
|
-
function
|
|
74
|
+
function sloVariable(config: DashboardViewConfig): DashboardVariable {
|
|
165
75
|
const variables: Array<DashboardVariable> = config.variables || [];
|
|
166
76
|
|
|
167
77
|
expect(variables).toHaveLength(1);
|
|
168
78
|
return variables[0] as DashboardVariable;
|
|
169
79
|
}
|
|
170
80
|
|
|
171
|
-
|
|
81
|
+
// The toolbar's single-select writes selectedValue; "" is its All option.
|
|
82
|
+
function picked(
|
|
172
83
|
variable: DashboardVariable,
|
|
173
|
-
|
|
84
|
+
selectedValue: string,
|
|
174
85
|
): DashboardVariable {
|
|
175
|
-
return { ...variable,
|
|
86
|
+
return { ...variable, selectedValue: selectedValue };
|
|
176
87
|
}
|
|
177
88
|
|
|
178
89
|
function argumentsOf(component: DashboardBaseComponent): WidgetArguments {
|
|
179
90
|
return (component.arguments as WidgetArguments | undefined) || {};
|
|
180
91
|
}
|
|
181
92
|
|
|
182
|
-
/*
|
|
183
|
-
* Titles are the only stable handle on a template widget — componentIds are
|
|
184
|
-
* regenerated on every getTemplateConfig call and array positions shift
|
|
185
|
-
* whenever a row is inserted. Each widget family stores its title under a
|
|
186
|
-
* different argument key.
|
|
187
|
-
*/
|
|
188
93
|
const TITLE_ARGUMENT_KEYS: Array<string> = [
|
|
189
94
|
"title",
|
|
190
95
|
"chartTitle",
|
|
@@ -208,34 +113,41 @@ function titleOf(component: DashboardBaseComponent): string {
|
|
|
208
113
|
return "";
|
|
209
114
|
}
|
|
210
115
|
|
|
116
|
+
function componentsOfType(
|
|
117
|
+
config: DashboardViewConfig,
|
|
118
|
+
componentType: DashboardComponentType,
|
|
119
|
+
): Array<DashboardBaseComponent> {
|
|
120
|
+
return config.components.filter(
|
|
121
|
+
(component: DashboardBaseComponent): boolean => {
|
|
122
|
+
return component.componentType === componentType;
|
|
123
|
+
},
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
211
127
|
/*
|
|
212
|
-
* Every metric query a widget owns
|
|
213
|
-
* `metricQueryConfigs
|
|
214
|
-
* DashboardChartComponent interpolates all of them, so both are collected —
|
|
215
|
-
* a second query added to a chart later is covered without editing here.
|
|
128
|
+
* Every metric query a widget owns — the primary config and any additional
|
|
129
|
+
* `metricQueryConfigs`, both of which DashboardChartComponent interpolates.
|
|
216
130
|
*/
|
|
217
131
|
function queryConfigsOf(
|
|
218
132
|
component: DashboardBaseComponent,
|
|
219
133
|
): Array<MetricQueryConfigData> {
|
|
220
134
|
const args: WidgetArguments = argumentsOf(component);
|
|
221
135
|
const configs: Array<MetricQueryConfigData> = [];
|
|
222
|
-
const primary: unknown = args["metricQueryConfig"];
|
|
223
136
|
|
|
224
|
-
if (
|
|
225
|
-
configs.push(
|
|
137
|
+
if (args["metricQueryConfig"]) {
|
|
138
|
+
configs.push(args["metricQueryConfig"] as MetricQueryConfigData);
|
|
226
139
|
}
|
|
227
140
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
141
|
+
if (Array.isArray(args["metricQueryConfigs"])) {
|
|
142
|
+
configs.push(
|
|
143
|
+
...(args["metricQueryConfigs"] as Array<MetricQueryConfigData>),
|
|
144
|
+
);
|
|
232
145
|
}
|
|
233
146
|
|
|
234
147
|
return configs;
|
|
235
148
|
}
|
|
236
149
|
|
|
237
|
-
|
|
238
|
-
function widgetsWithMetricQuery(
|
|
150
|
+
function metricWidgets(
|
|
239
151
|
config: DashboardViewConfig,
|
|
240
152
|
): Array<DashboardBaseComponent> {
|
|
241
153
|
return config.components.filter(
|
|
@@ -245,62 +157,36 @@ function widgetsWithMetricQuery(
|
|
|
245
157
|
);
|
|
246
158
|
}
|
|
247
159
|
|
|
248
|
-
function widgetsWithoutMetricQuery(
|
|
249
|
-
config: DashboardViewConfig,
|
|
250
|
-
): Array<DashboardBaseComponent> {
|
|
251
|
-
return config.components.filter(
|
|
252
|
-
(component: DashboardBaseComponent): boolean => {
|
|
253
|
-
return queryConfigsOf(component).length === 0;
|
|
254
|
-
},
|
|
255
|
-
);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
function componentsOfType(
|
|
259
|
-
config: DashboardViewConfig,
|
|
260
|
-
componentType: DashboardComponentType,
|
|
261
|
-
): Array<DashboardBaseComponent> {
|
|
262
|
-
return config.components.filter(
|
|
263
|
-
(component: DashboardBaseComponent): boolean => {
|
|
264
|
-
return component.componentType === componentType;
|
|
265
|
-
},
|
|
266
|
-
);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
160
|
function filterDataOf(queryConfig: MetricQueryConfigData): WidgetArguments {
|
|
270
|
-
return queryConfig.metricQueryData?.filterData
|
|
271
|
-
|
|
272
|
-
| undefined as WidgetArguments;
|
|
161
|
+
return (queryConfig.metricQueryData?.filterData ||
|
|
162
|
+
{}) as unknown as WidgetArguments;
|
|
273
163
|
}
|
|
274
164
|
|
|
275
165
|
function attributesOf(queryConfig: MetricQueryConfigData): WidgetArguments {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
166
|
+
return (
|
|
167
|
+
(filterDataOf(queryConfig)["attributes"] as WidgetArguments | undefined) ||
|
|
168
|
+
{}
|
|
169
|
+
);
|
|
279
170
|
}
|
|
280
171
|
|
|
281
172
|
/*
|
|
282
|
-
* A
|
|
283
|
-
*
|
|
284
|
-
*
|
|
285
|
-
* that distinction is load-bearing: the server's WHERE-builder emits
|
|
286
|
-
* `attributes[key] IN (...)` only for an actual Includes instance, so a
|
|
287
|
-
* plain array smuggled in here would read as `= a,b` and fail.
|
|
173
|
+
* A filter as one line, so a failure names the offending key and operator.
|
|
174
|
+
* `Includes` renders as IN(...) and anything else as `=` — load-bearing: the
|
|
175
|
+
* server writes `attributes[key] IN (...)` only for a real Includes instance.
|
|
288
176
|
*/
|
|
289
|
-
function
|
|
290
|
-
const
|
|
291
|
-
const keys: Array<string> = Object.keys(attributes).sort();
|
|
177
|
+
function describeFilter(filter: WidgetArguments): string {
|
|
178
|
+
const keys: Array<string> = Object.keys(filter).sort();
|
|
292
179
|
|
|
293
180
|
if (keys.length === 0) {
|
|
294
|
-
return "no
|
|
181
|
+
return "no filter";
|
|
295
182
|
}
|
|
296
183
|
|
|
297
184
|
return keys
|
|
298
185
|
.map((key: string): string => {
|
|
299
|
-
const value: unknown =
|
|
186
|
+
const value: unknown = filter[key];
|
|
300
187
|
|
|
301
188
|
if (value instanceof Includes) {
|
|
302
|
-
|
|
303
|
-
return `${key} IN (${values.join(", ")})`;
|
|
189
|
+
return `${key} IN (${(value.values as Array<string>).join(", ")})`;
|
|
304
190
|
}
|
|
305
191
|
|
|
306
192
|
return `${key} = ${String(value)}`;
|
|
@@ -308,106 +194,59 @@ function describeAttributes(queryConfig: MetricQueryConfigData): string {
|
|
|
308
194
|
.join("; ");
|
|
309
195
|
}
|
|
310
196
|
|
|
311
|
-
function
|
|
312
|
-
if (!resolved) {
|
|
313
|
-
return "All";
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
if (resolved.multi) {
|
|
317
|
-
return `IN (${resolved.multi.join(", ")})`;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
return `= ${String(resolved.scalar)}`;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
/*
|
|
324
|
-
* The predicate every scoped widget must end up with, written once so the
|
|
325
|
-
* expectation for each widget is "<title>: <this>".
|
|
326
|
-
*/
|
|
327
|
-
const EXPECTED_PREDICATE: string = `${MONITOR_ATTRIBUTE} IN (${PICKED_MONITORS.join(
|
|
328
|
-
", ",
|
|
329
|
-
)})`;
|
|
330
|
-
|
|
331
|
-
/*
|
|
332
|
-
* Applies the variables to every query a widget owns and labels the outcome
|
|
333
|
-
* with the widget's title.
|
|
334
|
-
*/
|
|
335
|
-
function describeWidgetUnderVariables(
|
|
197
|
+
function describeMetricWidget(
|
|
336
198
|
component: DashboardBaseComponent,
|
|
337
199
|
variables: Array<DashboardVariable>,
|
|
338
200
|
): string {
|
|
339
|
-
|
|
340
|
-
(queryConfig: MetricQueryConfigData): string => {
|
|
341
|
-
return
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
201
|
+
return `${titleOf(component)}: ${queryConfigsOf(component)
|
|
202
|
+
.map((queryConfig: MetricQueryConfigData): string => {
|
|
203
|
+
return describeFilter(
|
|
204
|
+
attributesOf(
|
|
205
|
+
DashboardVariableInterpolation.applyToQueryConfig(
|
|
206
|
+
queryConfig,
|
|
207
|
+
variables,
|
|
208
|
+
),
|
|
345
209
|
),
|
|
346
210
|
);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
return `${titleOf(component)}: ${applied.join(" | ")}`;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
function describeWidgetAsShipped(component: DashboardBaseComponent): string {
|
|
354
|
-
const shipped: Array<string> = queryConfigsOf(component).map(
|
|
355
|
-
(queryConfig: MetricQueryConfigData): string => {
|
|
356
|
-
return describeAttributes(queryConfig);
|
|
357
|
-
},
|
|
358
|
-
);
|
|
359
|
-
|
|
360
|
-
return `${titleOf(component)}: ${shipped.join(" | ")}`;
|
|
211
|
+
})
|
|
212
|
+
.join(" | ")}`;
|
|
361
213
|
}
|
|
362
214
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
return Array.from(
|
|
367
|
-
new Set(
|
|
368
|
-
components.map((component: DashboardBaseComponent): string => {
|
|
369
|
-
return component.componentType;
|
|
370
|
-
}),
|
|
371
|
-
),
|
|
372
|
-
).sort();
|
|
215
|
+
// The SLO List's base query, as the renderer and the public policy build it.
|
|
216
|
+
function sloListBaseQuery(): Record<string, unknown> {
|
|
217
|
+
return { projectId: "project-1", isArchived: false };
|
|
373
218
|
}
|
|
374
219
|
|
|
375
|
-
function
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
220
|
+
function describeSloWidget(
|
|
221
|
+
component: DashboardBaseComponent,
|
|
222
|
+
variables: Array<DashboardVariable>,
|
|
223
|
+
): string {
|
|
224
|
+
const args: WidgetArguments = argumentsOf(component);
|
|
225
|
+
const source: SloWidgetSource = resolveSloWidgetSource({
|
|
226
|
+
serviceLevelObjectiveId: args["serviceLevelObjectiveId"] as
|
|
227
|
+
| string
|
|
228
|
+
| undefined,
|
|
229
|
+
serviceLevelObjectiveVariableId: args["serviceLevelObjectiveVariableId"] as
|
|
230
|
+
| string
|
|
231
|
+
| undefined,
|
|
232
|
+
variables,
|
|
233
|
+
});
|
|
384
234
|
|
|
385
|
-
return
|
|
386
|
-
.
|
|
387
|
-
|
|
388
|
-
return `${componentType} x ${counts[componentType]}`;
|
|
389
|
-
});
|
|
235
|
+
return `${titleOf(component)}: ${source.state}${
|
|
236
|
+
source.sloName ? ` ${source.sloName}` : ""
|
|
237
|
+
}`;
|
|
390
238
|
}
|
|
391
239
|
|
|
392
|
-
/*
|
|
393
|
-
* A saved-dashboard state the template itself never ships: a widget whose
|
|
394
|
-
* stored config already carries an attribute filter, because the reader
|
|
395
|
-
* added one in the widget's own settings before touching the toolbar. Built
|
|
396
|
-
* from a real template query config so the surrounding shape (metricName and
|
|
397
|
-
* the misspelled `aggegationType` key the fetch layer reads) is the real one.
|
|
398
|
-
*/
|
|
399
240
|
function withStoredAttributes(
|
|
400
241
|
queryConfig: MetricQueryConfigData,
|
|
401
242
|
attributes: WidgetArguments,
|
|
402
243
|
): MetricQueryConfigData {
|
|
403
|
-
const filterData: WidgetArguments = filterDataOf(queryConfig) || {};
|
|
404
|
-
|
|
405
244
|
return {
|
|
406
245
|
...queryConfig,
|
|
407
246
|
metricQueryData: {
|
|
408
247
|
...queryConfig.metricQueryData,
|
|
409
248
|
filterData: {
|
|
410
|
-
...
|
|
249
|
+
...filterDataOf(queryConfig),
|
|
411
250
|
attributes: attributes,
|
|
412
251
|
},
|
|
413
252
|
} as unknown as MetricQueryData,
|
|
@@ -416,46 +255,32 @@ function withStoredAttributes(
|
|
|
416
255
|
|
|
417
256
|
// -- Tests -----------------------------------------------------------------
|
|
418
257
|
|
|
419
|
-
describe("SLO template
|
|
258
|
+
describe("SLO template variable scoping", () => {
|
|
420
259
|
describe("the binding itself", () => {
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
* applyToAttributes' TelemetryAttribute filter. Any other type — a
|
|
424
|
-
* CustomList or Query variable bound to the same key — renders an
|
|
425
|
-
* identical toolbar picker and scopes nothing.
|
|
426
|
-
*/
|
|
427
|
-
test("is a TelemetryAttribute variable bound to the bare monitorName key", () => {
|
|
428
|
-
const variable: DashboardVariable = monitorVariable(getConfig());
|
|
260
|
+
test("is a single-select Telemetry Attribute variable on the bare sloName key", () => {
|
|
261
|
+
const variable: DashboardVariable = sloVariable(getConfig());
|
|
429
262
|
|
|
430
263
|
expect(
|
|
431
|
-
`${variable.name} -> ${variable.type} on ${variable.attributeKey}`,
|
|
264
|
+
`${variable.name} -> ${variable.type} on ${variable.attributeKey} multi=${variable.isMultiSelect === true}`,
|
|
432
265
|
).toBe(
|
|
433
|
-
`
|
|
266
|
+
`slo -> ${DashboardVariableType.TelemetryAttribute} on ${SLO_NAME_ATTRIBUTE} multi=false`,
|
|
434
267
|
);
|
|
435
|
-
expect(variable.attributeKey).not.toBe(PREFIXED_MONITOR_ATTRIBUTE);
|
|
436
|
-
expect(variable.attributeKey).not.toBe(PLURAL_MONITOR_ATTRIBUTE);
|
|
437
268
|
});
|
|
438
269
|
|
|
439
270
|
/*
|
|
440
271
|
* The key the variable is declared with is the key the predicate is
|
|
441
|
-
* written under — asserted from the interpolation
|
|
442
|
-
*
|
|
443
|
-
* compiles into `attributes['monitorName'] IN (...)`.
|
|
272
|
+
* written under — asserted from the interpolation OUTPUT, which is what
|
|
273
|
+
* the fetch layer compiles into `attributes['sloName'] = ...`.
|
|
444
274
|
*/
|
|
445
|
-
test("writes its predicate under that
|
|
275
|
+
test("writes its metric predicate under that bare key and no other", () => {
|
|
446
276
|
const config: DashboardViewConfig = getConfig();
|
|
447
|
-
const widgets: Array<DashboardBaseComponent> =
|
|
448
|
-
widgetsWithMetricQuery(config);
|
|
449
|
-
|
|
450
|
-
expect(widgets.length).toBeGreaterThan(0);
|
|
451
|
-
|
|
452
277
|
const keysWritten: Set<string> = new Set<string>();
|
|
453
278
|
|
|
454
|
-
for (const widget of
|
|
279
|
+
for (const widget of metricWidgets(config)) {
|
|
455
280
|
for (const queryConfig of queryConfigsOf(widget)) {
|
|
456
281
|
const applied: MetricQueryConfigData =
|
|
457
282
|
DashboardVariableInterpolation.applyToQueryConfig(queryConfig, [
|
|
458
|
-
|
|
283
|
+
picked(sloVariable(config), PICKED_SLO),
|
|
459
284
|
]);
|
|
460
285
|
|
|
461
286
|
for (const key of Object.keys(attributesOf(applied))) {
|
|
@@ -464,417 +289,413 @@ describe("SLO template Monitor variable scoping", () => {
|
|
|
464
289
|
}
|
|
465
290
|
}
|
|
466
291
|
|
|
467
|
-
expect(Array.from(keysWritten)
|
|
292
|
+
expect(Array.from(keysWritten)).toEqual([SLO_NAME_ATTRIBUTE]);
|
|
468
293
|
});
|
|
469
294
|
|
|
470
295
|
/*
|
|
471
|
-
*
|
|
472
|
-
*
|
|
473
|
-
*
|
|
474
|
-
* is dropped on the floor while the picker keeps showing them.
|
|
296
|
+
* A single-select resolves to a SCALAR equality, never an IN-list — the
|
|
297
|
+
* same shape on the metric store, on the SLO list's name column, and in
|
|
298
|
+
* the one-SLO widgets.
|
|
475
299
|
*/
|
|
476
|
-
test("
|
|
477
|
-
const config: DashboardViewConfig = getConfig();
|
|
478
|
-
const picked: DashboardVariable = withSelection(
|
|
479
|
-
monitorVariable(config),
|
|
480
|
-
PICKED_MONITORS,
|
|
481
|
-
);
|
|
482
|
-
const asSingleSelect: DashboardVariable = {
|
|
483
|
-
...picked,
|
|
484
|
-
isMultiSelect: false,
|
|
485
|
-
};
|
|
486
|
-
|
|
300
|
+
test("resolves a pick to one scalar value", () => {
|
|
487
301
|
expect(
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
)
|
|
491
|
-
|
|
492
|
-
)}`,
|
|
493
|
-
).toBe(`multi=IN (${PICKED_MONITORS.join(", ")}) single=All`);
|
|
302
|
+
DashboardVariableInterpolation.resolveValue(
|
|
303
|
+
picked(sloVariable(getConfig()), PICKED_SLO),
|
|
304
|
+
),
|
|
305
|
+
).toEqual({ scalar: PICKED_SLO });
|
|
494
306
|
});
|
|
307
|
+
});
|
|
495
308
|
|
|
309
|
+
describe("every widget on the board answers to the toolbar", () => {
|
|
496
310
|
/*
|
|
497
|
-
*
|
|
498
|
-
*
|
|
499
|
-
*
|
|
500
|
-
*
|
|
501
|
-
*
|
|
502
|
-
* no warning that the field did nothing.
|
|
503
|
-
* - Switched to single-select, the same default is worse than dead: it
|
|
504
|
-
* applies on first render, so a freshly created dashboard reports one
|
|
505
|
-
* monitor's uptime beside SLO tiles that report the whole objective.
|
|
311
|
+
* The closed classification. A widget family added to the template later
|
|
312
|
+
* has to be placed in one of these routes deliberately, or this fails:
|
|
313
|
+
* there is no fourth route, and a widget the toolbar cannot reach is
|
|
314
|
+
* exactly the "project-wide data beside one objective" the template
|
|
315
|
+
* removed.
|
|
506
316
|
*/
|
|
507
|
-
test("
|
|
508
|
-
const
|
|
317
|
+
test("metric widgets, the SLO List and the SLO widgets are each reached; only headings are not", () => {
|
|
318
|
+
const config: DashboardViewConfig = getConfig();
|
|
319
|
+
const routes: Array<string> = config.components.map(
|
|
320
|
+
(component: DashboardBaseComponent): string => {
|
|
321
|
+
if (queryConfigsOf(component).length > 0) {
|
|
322
|
+
return `${component.componentType}: metric predicate`;
|
|
323
|
+
}
|
|
509
324
|
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
}`,
|
|
514
|
-
).toBe("monitor multiSelect=true default=(none)");
|
|
515
|
-
});
|
|
325
|
+
if (component.componentType === DashboardComponentType.SloList) {
|
|
326
|
+
return `${component.componentType}: name column`;
|
|
327
|
+
}
|
|
516
328
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
defaultValue: PICKED_MONITORS[0] as string,
|
|
521
|
-
};
|
|
329
|
+
if (component.componentType === DashboardComponentType.Slo) {
|
|
330
|
+
return `${component.componentType}: followed selection`;
|
|
331
|
+
}
|
|
522
332
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
)
|
|
333
|
+
return `${component.componentType}: not reached`;
|
|
334
|
+
},
|
|
335
|
+
);
|
|
336
|
+
|
|
337
|
+
expect(Array.from(new Set(routes)).sort()).toEqual(
|
|
338
|
+
[
|
|
339
|
+
`${DashboardComponentType.Chart}: metric predicate`,
|
|
340
|
+
`${DashboardComponentType.Value}: metric predicate`,
|
|
341
|
+
`${DashboardComponentType.SloList}: name column`,
|
|
342
|
+
`${DashboardComponentType.Slo}: followed selection`,
|
|
343
|
+
`${DashboardComponentType.Text}: not reached`,
|
|
344
|
+
].sort(),
|
|
345
|
+
);
|
|
526
346
|
});
|
|
527
347
|
});
|
|
528
348
|
|
|
529
|
-
describe("with
|
|
349
|
+
describe("with the toolbar on All the board is the fleet", () => {
|
|
530
350
|
test("the untouched variable resolves to All", () => {
|
|
531
|
-
const variable: DashboardVariable = monitorVariable(getConfig());
|
|
532
|
-
|
|
533
351
|
expect(
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
)}`,
|
|
537
|
-
).toBe("monitor: All");
|
|
352
|
+
DashboardVariableInterpolation.resolveValue(sloVariable(getConfig())),
|
|
353
|
+
).toBeUndefined();
|
|
538
354
|
});
|
|
539
355
|
|
|
540
356
|
/*
|
|
541
|
-
*
|
|
542
|
-
*
|
|
543
|
-
* object so the memoised widgets do not refetch on mount.
|
|
544
|
-
*
|
|
545
|
-
* This is also the test that catches a default being added to the
|
|
546
|
-
* template: a single-select default would turn every line below into
|
|
547
|
-
* "monitorName = ...".
|
|
357
|
+
* applyToQueryConfig hands back the very same object, so the memoised
|
|
358
|
+
* widgets do not refetch on mount — and no widget gains a filter.
|
|
548
359
|
*/
|
|
549
360
|
test("no metric widget's query changes at all", () => {
|
|
550
361
|
const config: DashboardViewConfig = getConfig();
|
|
551
|
-
const variable: DashboardVariable =
|
|
552
|
-
const widgets: Array<DashboardBaseComponent> =
|
|
553
|
-
widgetsWithMetricQuery(config);
|
|
362
|
+
const variable: DashboardVariable = sloVariable(config);
|
|
363
|
+
const widgets: Array<DashboardBaseComponent> = metricWidgets(config);
|
|
554
364
|
|
|
555
365
|
expect(widgets.length).toBeGreaterThan(0);
|
|
556
366
|
|
|
557
|
-
const
|
|
558
|
-
(
|
|
559
|
-
|
|
560
|
-
(
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
]);
|
|
565
|
-
|
|
566
|
-
return applied === queryConfig
|
|
367
|
+
for (const widget of widgets) {
|
|
368
|
+
for (const queryConfig of queryConfigsOf(widget)) {
|
|
369
|
+
expect(
|
|
370
|
+
`${titleOf(widget)}: ${
|
|
371
|
+
DashboardVariableInterpolation.applyToQueryConfig(queryConfig, [
|
|
372
|
+
variable,
|
|
373
|
+
]) === queryConfig
|
|
567
374
|
? "unchanged"
|
|
568
|
-
:
|
|
569
|
-
}
|
|
570
|
-
);
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
},
|
|
574
|
-
);
|
|
575
|
-
|
|
576
|
-
expect(outcomes).toEqual(
|
|
577
|
-
widgets.map((widget: DashboardBaseComponent): string => {
|
|
578
|
-
return `${titleOf(widget)}: unchanged`;
|
|
579
|
-
}),
|
|
580
|
-
);
|
|
375
|
+
: "changed"
|
|
376
|
+
}`,
|
|
377
|
+
).toBe(`${titleOf(widget)}: unchanged`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
581
380
|
});
|
|
582
381
|
|
|
583
|
-
test("
|
|
584
|
-
const
|
|
585
|
-
const widgets: Array<DashboardBaseComponent> =
|
|
586
|
-
widgetsWithMetricQuery(config);
|
|
382
|
+
test("the SLO List keeps its fleet query", () => {
|
|
383
|
+
const query: Record<string, unknown> = sloListBaseQuery();
|
|
587
384
|
|
|
588
|
-
expect(
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
385
|
+
expect(
|
|
386
|
+
DashboardModelQueryInterpolation.applyToQuery(
|
|
387
|
+
query,
|
|
388
|
+
[sloVariable(getConfig())],
|
|
389
|
+
SLO_LIST_ATTRIBUTE_TO_COLUMN,
|
|
390
|
+
),
|
|
391
|
+
).toBe(query);
|
|
594
392
|
});
|
|
595
|
-
});
|
|
596
393
|
|
|
597
|
-
describe("with monitors picked", () => {
|
|
598
394
|
/*
|
|
599
|
-
* The
|
|
600
|
-
*
|
|
601
|
-
* query are the widgets a TelemetryAttribute variable can reach, and on
|
|
602
|
-
* this template those are the three Monitor Health value tiles and the
|
|
603
|
-
* two monitor charts.
|
|
395
|
+
* The one section that waits — and it waits for the TOOLBAR (NoSelection),
|
|
396
|
+
* not for edit mode (Unconfigured) and not on a broken binding.
|
|
604
397
|
*/
|
|
605
|
-
test("
|
|
398
|
+
test("every SLO widget asks for a toolbar pick", () => {
|
|
606
399
|
const config: DashboardViewConfig = getConfig();
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
expect(typeBreakdownOf(widgets)).toEqual([
|
|
611
|
-
`${DashboardComponentType.Chart} x 2`,
|
|
612
|
-
`${DashboardComponentType.Value} x 3`,
|
|
613
|
-
]);
|
|
614
|
-
});
|
|
615
|
-
|
|
616
|
-
test("every one of them gains an Includes predicate on monitorName", () => {
|
|
617
|
-
const config: DashboardViewConfig = getConfig();
|
|
618
|
-
const picked: DashboardVariable = withSelection(
|
|
619
|
-
monitorVariable(config),
|
|
620
|
-
PICKED_MONITORS,
|
|
400
|
+
const sloWidgets: Array<DashboardBaseComponent> = componentsOfType(
|
|
401
|
+
config,
|
|
402
|
+
DashboardComponentType.Slo,
|
|
621
403
|
);
|
|
622
|
-
const widgets: Array<DashboardBaseComponent> =
|
|
623
|
-
widgetsWithMetricQuery(config);
|
|
624
404
|
|
|
625
|
-
expect(
|
|
405
|
+
expect(sloWidgets.length).toBeGreaterThan(0);
|
|
626
406
|
expect(
|
|
627
|
-
|
|
628
|
-
return
|
|
407
|
+
sloWidgets.map((widget: DashboardBaseComponent): string => {
|
|
408
|
+
return describeSloWidget(widget, config.variables || []);
|
|
629
409
|
}),
|
|
630
410
|
).toEqual(
|
|
631
|
-
|
|
632
|
-
return `${titleOf(widget)}: ${
|
|
411
|
+
sloWidgets.map((widget: DashboardBaseComponent): string => {
|
|
412
|
+
return `${titleOf(widget)}: ${SloWidgetSourceState.NoSelection}`;
|
|
633
413
|
}),
|
|
634
414
|
);
|
|
635
415
|
});
|
|
636
416
|
|
|
637
|
-
|
|
638
|
-
* Scoping must not cost the widget its identity. `metricName` says which
|
|
639
|
-
* series to read and the aggregation is stored under the MISSPELLED key
|
|
640
|
-
* `aggegationType` — that misspelling is the contract the fetch layer
|
|
641
|
-
* reads, so a rewrite that dropped or corrected it would return an
|
|
642
|
-
* unaggregated (or empty) result for a widget that still looks right.
|
|
643
|
-
*/
|
|
644
|
-
test("the scoped query keeps its metric name and its aggegationType key", () => {
|
|
417
|
+
test("picking All explicitly is the same as never picking", () => {
|
|
645
418
|
const config: DashboardViewConfig = getConfig();
|
|
646
|
-
const
|
|
647
|
-
monitorVariable(config),
|
|
648
|
-
PICKED_MONITORS,
|
|
649
|
-
);
|
|
650
|
-
const widgets: Array<DashboardBaseComponent> =
|
|
651
|
-
widgetsWithMetricQuery(config);
|
|
652
|
-
|
|
653
|
-
expect(widgets.length).toBeGreaterThan(0);
|
|
419
|
+
const all: DashboardVariable = picked(sloVariable(config), "");
|
|
654
420
|
|
|
655
|
-
const
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
for (const queryConfig of queryConfigsOf(widget)) {
|
|
660
|
-
const shipped: WidgetArguments = filterDataOf(queryConfig);
|
|
661
|
-
const applied: WidgetArguments = filterDataOf(
|
|
662
|
-
DashboardVariableInterpolation.applyToQueryConfig(queryConfig, [
|
|
663
|
-
picked,
|
|
664
|
-
]),
|
|
665
|
-
);
|
|
666
|
-
|
|
667
|
-
before.push(
|
|
668
|
-
`${titleOf(widget)}: ${String(shipped["metricName"])} / ${String(
|
|
669
|
-
shipped["aggegationType"],
|
|
670
|
-
)}`,
|
|
671
|
-
);
|
|
672
|
-
after.push(
|
|
673
|
-
`${titleOf(widget)}: ${String(applied["metricName"])} / ${String(
|
|
674
|
-
applied["aggegationType"],
|
|
675
|
-
)}`,
|
|
676
|
-
);
|
|
677
|
-
}
|
|
421
|
+
for (const widget of metricWidgets(config)) {
|
|
422
|
+
expect(describeMetricWidget(widget, [all])).toBe(
|
|
423
|
+
`${titleOf(widget)}: no filter`,
|
|
424
|
+
);
|
|
678
425
|
}
|
|
679
426
|
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
427
|
+
for (const widget of componentsOfType(
|
|
428
|
+
config,
|
|
429
|
+
DashboardComponentType.Slo,
|
|
430
|
+
)) {
|
|
431
|
+
expect(describeSloWidget(widget, [all])).toBe(
|
|
432
|
+
`${titleOf(widget)}: ${SloWidgetSourceState.NoSelection}`,
|
|
433
|
+
);
|
|
684
434
|
}
|
|
685
435
|
});
|
|
436
|
+
});
|
|
686
437
|
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
* component's stored arguments, the first selection would be baked into
|
|
690
|
-
* the dashboard the next time it was saved — and clearing the toolbar
|
|
691
|
-
* afterwards would not undo it, because "All" only removes the filter
|
|
692
|
-
* from the copy it is building.
|
|
693
|
-
*/
|
|
694
|
-
test("the stored template config is never written back to", () => {
|
|
438
|
+
describe("with one SLO picked the whole board is that SLO", () => {
|
|
439
|
+
test("every metric widget gains the sloName predicate", () => {
|
|
695
440
|
const config: DashboardViewConfig = getConfig();
|
|
696
|
-
const
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
);
|
|
700
|
-
const widgets: Array<DashboardBaseComponent> =
|
|
701
|
-
widgetsWithMetricQuery(config);
|
|
441
|
+
const variables: Array<DashboardVariable> = [
|
|
442
|
+
picked(sloVariable(config), PICKED_SLO),
|
|
443
|
+
];
|
|
444
|
+
const widgets: Array<DashboardBaseComponent> = metricWidgets(config);
|
|
702
445
|
|
|
703
446
|
expect(widgets.length).toBeGreaterThan(0);
|
|
447
|
+
expect(
|
|
448
|
+
widgets.map((widget: DashboardBaseComponent): string => {
|
|
449
|
+
return describeMetricWidget(widget, variables);
|
|
450
|
+
}),
|
|
451
|
+
).toEqual(
|
|
452
|
+
widgets.map((widget: DashboardBaseComponent): string => {
|
|
453
|
+
return `${titleOf(widget)}: ${SLO_NAME_ATTRIBUTE} = ${PICKED_SLO}`;
|
|
454
|
+
}),
|
|
455
|
+
);
|
|
456
|
+
});
|
|
704
457
|
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
458
|
+
test("the SLO List narrows to the objective's row, and still excludes archived SLOs", () => {
|
|
459
|
+
const scoped: Record<string, unknown> =
|
|
460
|
+
DashboardModelQueryInterpolation.applyToQuery(
|
|
461
|
+
sloListBaseQuery(),
|
|
462
|
+
[picked(sloVariable(getConfig()), PICKED_SLO)],
|
|
463
|
+
SLO_LIST_ATTRIBUTE_TO_COLUMN,
|
|
711
464
|
);
|
|
712
|
-
}
|
|
713
465
|
|
|
714
|
-
expect(
|
|
715
|
-
|
|
716
|
-
widgets.map((widget: DashboardBaseComponent): string => {
|
|
717
|
-
return `${titleOf(widget)}: no attribute filter`;
|
|
718
|
-
}),
|
|
466
|
+
expect(describeFilter(scoped)).toBe(
|
|
467
|
+
`isArchived = false; name = ${PICKED_SLO}; projectId = project-1`,
|
|
719
468
|
);
|
|
720
469
|
});
|
|
721
|
-
});
|
|
722
470
|
|
|
723
|
-
|
|
724
|
-
/*
|
|
725
|
-
* The unscoped half. A Slo widget resolves one objective from the
|
|
726
|
-
* serviceLevelObjectiveId stored on it and issues no metric query, so
|
|
727
|
-
* there is nothing for a TelemetryAttribute variable to interpolate —
|
|
728
|
-
* picking a monitor narrows the uptime row and leaves every SLO number
|
|
729
|
-
* reporting the whole objective, which is the correct reading of both.
|
|
730
|
-
*/
|
|
731
|
-
test("no Slo widget owns a metric query", () => {
|
|
471
|
+
test("every SLO widget follows the picked objective", () => {
|
|
732
472
|
const config: DashboardViewConfig = getConfig();
|
|
473
|
+
const variables: Array<DashboardVariable> = [
|
|
474
|
+
picked(sloVariable(config), PICKED_SLO),
|
|
475
|
+
];
|
|
733
476
|
const sloWidgets: Array<DashboardBaseComponent> = componentsOfType(
|
|
734
477
|
config,
|
|
735
478
|
DashboardComponentType.Slo,
|
|
736
479
|
);
|
|
737
480
|
|
|
738
|
-
expect(sloWidgets.length).toBeGreaterThan(0);
|
|
739
481
|
expect(
|
|
740
482
|
sloWidgets.map((widget: DashboardBaseComponent): string => {
|
|
741
|
-
return
|
|
483
|
+
return describeSloWidget(widget, variables);
|
|
742
484
|
}),
|
|
743
485
|
).toEqual(
|
|
744
486
|
sloWidgets.map((widget: DashboardBaseComponent): string => {
|
|
745
|
-
return `${titleOf(widget)}:
|
|
487
|
+
return `${titleOf(widget)}: ${SloWidgetSourceState.FollowsSelection} ${PICKED_SLO}`;
|
|
746
488
|
}),
|
|
747
489
|
);
|
|
748
490
|
});
|
|
749
491
|
|
|
750
492
|
/*
|
|
751
|
-
*
|
|
752
|
-
*
|
|
753
|
-
*
|
|
754
|
-
*
|
|
755
|
-
* are additionally project-wide and time-range-free — which is why they
|
|
756
|
-
* are titled "All Monitors" / "Latest ..." rather than anything that
|
|
757
|
-
* implies the toolbar narrows them.
|
|
493
|
+
* Scoping must not cost a widget its identity: the series, the misspelled
|
|
494
|
+
* `aggegationType` the fetch layer reads, and the per-SLO fan-out all
|
|
495
|
+
* survive. A chart that lost `groupByAttributeKeys` under a pick would
|
|
496
|
+
* collapse to one unlabelled line.
|
|
758
497
|
*/
|
|
759
|
-
test("
|
|
498
|
+
test("a scoped query keeps its metric, aggregation and fan-out", () => {
|
|
760
499
|
const config: DashboardViewConfig = getConfig();
|
|
761
|
-
const
|
|
762
|
-
|
|
500
|
+
const variables: Array<DashboardVariable> = [
|
|
501
|
+
picked(sloVariable(config), PICKED_SLO),
|
|
502
|
+
];
|
|
763
503
|
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
504
|
+
for (const widget of metricWidgets(config)) {
|
|
505
|
+
for (const queryConfig of queryConfigsOf(widget)) {
|
|
506
|
+
const applied: MetricQueryConfigData =
|
|
507
|
+
DashboardVariableInterpolation.applyToQueryConfig(
|
|
508
|
+
queryConfig,
|
|
509
|
+
variables,
|
|
510
|
+
);
|
|
511
|
+
|
|
512
|
+
expect(filterDataOf(applied)["metricName"]).toBe(
|
|
513
|
+
filterDataOf(queryConfig)["metricName"],
|
|
514
|
+
);
|
|
515
|
+
expect(filterDataOf(applied)["aggegationType"]).toBe(
|
|
516
|
+
filterDataOf(queryConfig)["aggegationType"],
|
|
517
|
+
);
|
|
518
|
+
expect(applied.metricQueryData.groupByAttributeKeys).toEqual(
|
|
519
|
+
queryConfig.metricQueryData.groupByAttributeKeys,
|
|
520
|
+
);
|
|
521
|
+
expect(String(filterDataOf(queryConfig)["metricName"])).not.toBe(
|
|
522
|
+
"undefined",
|
|
523
|
+
);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
774
526
|
});
|
|
775
527
|
|
|
776
528
|
/*
|
|
777
|
-
*
|
|
778
|
-
*
|
|
779
|
-
*
|
|
780
|
-
* attribute keys the widget itself declares a column for. None of the
|
|
781
|
-
* three lists on this template declares one for `monitorName` (the list
|
|
782
|
-
* components never call the helper, and the public-dashboard monitor
|
|
783
|
-
* policy ships no attributeToColumn map), so a picked Monitor variable
|
|
784
|
-
* leaves their queries byte-identical.
|
|
785
|
-
*
|
|
786
|
-
* The second half of the test is what keeps the first from being
|
|
787
|
-
* vacuous: the very same variable DOES write a predicate the moment a
|
|
788
|
-
* map claims the key, so what withholds it is the missing mapping and
|
|
789
|
-
* not something inert about the variable.
|
|
529
|
+
* Interpolation is a render-time transform. Written back into the stored
|
|
530
|
+
* arguments, the first pick would be baked into the dashboard on its next
|
|
531
|
+
* save, and "All" could never undo it.
|
|
790
532
|
*/
|
|
791
|
-
test("
|
|
533
|
+
test("the stored template config is never written back to", () => {
|
|
792
534
|
const config: DashboardViewConfig = getConfig();
|
|
793
|
-
const
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
const query: Record<string, unknown> = { projectId: "project-1" };
|
|
535
|
+
const before: string = JSON.stringify(config);
|
|
536
|
+
const variables: Array<DashboardVariable> = [
|
|
537
|
+
picked(sloVariable(config), PICKED_SLO),
|
|
538
|
+
];
|
|
798
539
|
|
|
799
|
-
const
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
),
|
|
806
|
-
).toBe(query);
|
|
540
|
+
for (const widget of metricWidgets(config)) {
|
|
541
|
+
DashboardVariableInterpolation.applyToQueryConfigs(
|
|
542
|
+
queryConfigsOf(widget),
|
|
543
|
+
variables,
|
|
544
|
+
);
|
|
545
|
+
}
|
|
807
546
|
|
|
808
|
-
const
|
|
809
|
-
|
|
810
|
-
|
|
547
|
+
for (const widget of componentsOfType(
|
|
548
|
+
config,
|
|
549
|
+
DashboardComponentType.Slo,
|
|
550
|
+
)) {
|
|
551
|
+
describeSloWidget(widget, variables);
|
|
552
|
+
}
|
|
811
553
|
|
|
812
|
-
expect(
|
|
813
|
-
expect((scoped["name"] as Includes).values).toEqual(PICKED_MONITORS);
|
|
554
|
+
expect(JSON.stringify(config)).toBe(before);
|
|
814
555
|
});
|
|
815
556
|
});
|
|
816
557
|
|
|
817
|
-
describe("clearing the selection", () => {
|
|
818
|
-
|
|
819
|
-
* The failure this prevents: the popover reads "All" the instant the
|
|
820
|
-
* last pick is removed, so anything still filtered at that moment is
|
|
821
|
-
* filtered behind a control that says it is not. A stored filter on the
|
|
822
|
-
* variable's own key is therefore dropped, not merely left alone —
|
|
823
|
-
* while every other attribute on the widget is left exactly as the
|
|
824
|
-
* reader set it.
|
|
825
|
-
*/
|
|
826
|
-
test("removes a stored monitorName filter and keeps the reader's other attributes", () => {
|
|
558
|
+
describe("moving and clearing the selection", () => {
|
|
559
|
+
test("picking a different SLO replaces the scope rather than adding to it", () => {
|
|
827
560
|
const config: DashboardViewConfig = getConfig();
|
|
828
|
-
const widget: DashboardBaseComponent =
|
|
561
|
+
const widget: DashboardBaseComponent = metricWidgets(
|
|
829
562
|
config,
|
|
830
563
|
)[0] as DashboardBaseComponent;
|
|
831
|
-
const
|
|
564
|
+
const stored: MetricQueryConfigData = withStoredAttributes(
|
|
832
565
|
queryConfigsOf(widget)[0] as MetricQueryConfigData,
|
|
833
566
|
{
|
|
834
|
-
[
|
|
835
|
-
[UNRELATED_ATTRIBUTE]: "
|
|
567
|
+
[SLO_NAME_ATTRIBUTE]: OTHER_SLO,
|
|
568
|
+
[UNRELATED_ATTRIBUTE]: "payments",
|
|
836
569
|
},
|
|
837
570
|
);
|
|
838
571
|
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
`${
|
|
572
|
+
expect(
|
|
573
|
+
describeFilter(
|
|
574
|
+
attributesOf(
|
|
575
|
+
DashboardVariableInterpolation.applyToQueryConfig(stored, [
|
|
576
|
+
picked(sloVariable(config), PICKED_SLO),
|
|
577
|
+
]),
|
|
578
|
+
),
|
|
579
|
+
),
|
|
580
|
+
).toBe(
|
|
581
|
+
`${UNRELATED_ATTRIBUTE} = payments; ${SLO_NAME_ATTRIBUTE} = ${PICKED_SLO}`,
|
|
849
582
|
);
|
|
850
583
|
});
|
|
851
584
|
|
|
852
585
|
/*
|
|
853
|
-
* The
|
|
854
|
-
*
|
|
855
|
-
*
|
|
586
|
+
* The toolbar reads "All" the instant it is cleared, so anything still
|
|
587
|
+
* filtered at that moment is filtered behind a control that says it is
|
|
588
|
+
* not. The variable's own key is dropped; the reader's others are kept.
|
|
856
589
|
*/
|
|
857
|
-
test("
|
|
590
|
+
test("clearing drops the variable's own key and keeps the reader's attributes", () => {
|
|
858
591
|
const config: DashboardViewConfig = getConfig();
|
|
859
|
-
const widget: DashboardBaseComponent =
|
|
592
|
+
const widget: DashboardBaseComponent = metricWidgets(
|
|
860
593
|
config,
|
|
861
594
|
)[0] as DashboardBaseComponent;
|
|
862
|
-
const
|
|
595
|
+
const stored: MetricQueryConfigData = withStoredAttributes(
|
|
863
596
|
queryConfigsOf(widget)[0] as MetricQueryConfigData,
|
|
864
597
|
{
|
|
865
|
-
[
|
|
866
|
-
[UNRELATED_ATTRIBUTE]: "
|
|
598
|
+
[SLO_NAME_ATTRIBUTE]: PICKED_SLO,
|
|
599
|
+
[UNRELATED_ATTRIBUTE]: "payments",
|
|
867
600
|
},
|
|
868
601
|
);
|
|
869
602
|
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
603
|
+
expect(
|
|
604
|
+
describeFilter(
|
|
605
|
+
attributesOf(
|
|
606
|
+
DashboardVariableInterpolation.applyToQueryConfig(stored, [
|
|
607
|
+
picked(sloVariable(config), ""),
|
|
608
|
+
]),
|
|
609
|
+
),
|
|
610
|
+
),
|
|
611
|
+
).toBe(`${UNRELATED_ATTRIBUTE} = payments`);
|
|
612
|
+
});
|
|
874
613
|
|
|
875
|
-
|
|
876
|
-
|
|
614
|
+
test("clearing removes a stale name filter from the SLO List", () => {
|
|
615
|
+
const cleared: Record<string, unknown> =
|
|
616
|
+
DashboardModelQueryInterpolation.applyToQuery(
|
|
617
|
+
{ ...sloListBaseQuery(), name: OTHER_SLO },
|
|
618
|
+
[picked(sloVariable(getConfig()), "")],
|
|
619
|
+
SLO_LIST_ATTRIBUTE_TO_COLUMN,
|
|
620
|
+
);
|
|
621
|
+
|
|
622
|
+
expect(describeFilter(cleared)).toBe(
|
|
623
|
+
"isArchived = false; projectId = project-1",
|
|
877
624
|
);
|
|
878
625
|
});
|
|
879
626
|
});
|
|
627
|
+
|
|
628
|
+
describe("variables the reader adds later", () => {
|
|
629
|
+
/*
|
|
630
|
+
* A second Telemetry Attribute variable (say, a team label) still filters
|
|
631
|
+
* the metric charts — that is what it is for — but it must neither move
|
|
632
|
+
* the SLO widgets off the SLO the SLO variable names, nor write a filter
|
|
633
|
+
* onto the SLO List, which has no column for it.
|
|
634
|
+
*/
|
|
635
|
+
test("an unrelated attribute variable neither redirects the SLO widgets nor filters the SLO List", () => {
|
|
636
|
+
const config: DashboardViewConfig = getConfig();
|
|
637
|
+
const team: DashboardVariable = {
|
|
638
|
+
id: "team-variable",
|
|
639
|
+
name: "team",
|
|
640
|
+
type: DashboardVariableType.TelemetryAttribute,
|
|
641
|
+
attributeKey: UNRELATED_ATTRIBUTE,
|
|
642
|
+
isMultiSelect: false,
|
|
643
|
+
selectedValue: "payments",
|
|
644
|
+
};
|
|
645
|
+
const variables: Array<DashboardVariable> = [
|
|
646
|
+
picked(sloVariable(config), PICKED_SLO),
|
|
647
|
+
team,
|
|
648
|
+
];
|
|
649
|
+
|
|
650
|
+
for (const widget of componentsOfType(
|
|
651
|
+
config,
|
|
652
|
+
DashboardComponentType.Slo,
|
|
653
|
+
)) {
|
|
654
|
+
expect(describeSloWidget(widget, variables)).toBe(
|
|
655
|
+
`${titleOf(widget)}: ${SloWidgetSourceState.FollowsSelection} ${PICKED_SLO}`,
|
|
656
|
+
);
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
expect(
|
|
660
|
+
describeFilter(
|
|
661
|
+
DashboardModelQueryInterpolation.applyToQuery(
|
|
662
|
+
sloListBaseQuery(),
|
|
663
|
+
[team],
|
|
664
|
+
SLO_LIST_ATTRIBUTE_TO_COLUMN,
|
|
665
|
+
),
|
|
666
|
+
),
|
|
667
|
+
).toBe("isArchived = false; projectId = project-1");
|
|
668
|
+
});
|
|
669
|
+
});
|
|
670
|
+
|
|
671
|
+
describe("why the template ships a single-select", () => {
|
|
672
|
+
/*
|
|
673
|
+
* If a reader switches the variable to multi-select, the metric charts
|
|
674
|
+
* compare the picks — and the one-SLO widgets, which cannot, ask for a
|
|
675
|
+
* single pick instead of guessing. Pinned so that trade-off stays visible.
|
|
676
|
+
*/
|
|
677
|
+
test("a multi-pick compares on the charts and leaves the SLO widgets asking for one", () => {
|
|
678
|
+
const config: DashboardViewConfig = getConfig();
|
|
679
|
+
const multi: DashboardVariable = {
|
|
680
|
+
...sloVariable(config),
|
|
681
|
+
isMultiSelect: true,
|
|
682
|
+
selectedValues: [PICKED_SLO, OTHER_SLO],
|
|
683
|
+
};
|
|
684
|
+
|
|
685
|
+
for (const widget of metricWidgets(config)) {
|
|
686
|
+
expect(describeMetricWidget(widget, [multi])).toBe(
|
|
687
|
+
`${titleOf(widget)}: ${SLO_NAME_ATTRIBUTE} IN (${PICKED_SLO}, ${OTHER_SLO})`,
|
|
688
|
+
);
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
for (const widget of componentsOfType(
|
|
692
|
+
config,
|
|
693
|
+
DashboardComponentType.Slo,
|
|
694
|
+
)) {
|
|
695
|
+
expect(describeSloWidget(widget, [multi])).toBe(
|
|
696
|
+
`${titleOf(widget)}: ${SloWidgetSourceState.MultipleSelection}`,
|
|
697
|
+
);
|
|
698
|
+
}
|
|
699
|
+
});
|
|
700
|
+
});
|
|
880
701
|
});
|