@oneuptime/common 13.0.1 → 13.0.4
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/RumSession.ts +34 -0
- package/Models/DatabaseModels/AlertEpisodeLabelRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodeOnCallRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodeOwnerRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodePrivacyRule.ts +2 -2
- package/Models/DatabaseModels/AlertGroupingRule.ts +2 -2
- package/Models/DatabaseModels/AlertLabelRule.ts +2 -2
- package/Models/DatabaseModels/AlertOnCallRule.ts +2 -2
- package/Models/DatabaseModels/AlertOwnerRule.ts +2 -2
- package/Models/DatabaseModels/AlertPrivacyRule.ts +2 -2
- package/Models/DatabaseModels/AlertReminderRule.ts +6 -4
- package/Models/DatabaseModels/AutoRemediationRule.ts +2 -2
- package/Models/DatabaseModels/CephClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/CephClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/CloudResourceLabelRule.ts +2 -2
- package/Models/DatabaseModels/CloudResourceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DashboardLabelRule.ts +2 -2
- package/Models/DatabaseModels/DashboardOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.ts +11 -0
- package/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.ts +44 -0
- package/Models/DatabaseModels/DockerHostLabelRule.ts +2 -2
- package/Models/DatabaseModels/DockerHostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/HostLabelRule.ts +2 -2
- package/Models/DatabaseModels/HostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeOnCallRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodePrivacyRule.ts +2 -2
- package/Models/DatabaseModels/IncidentGroupingRule.ts +2 -2
- package/Models/DatabaseModels/IncidentLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncidentOnCallRule.ts +2 -2
- package/Models/DatabaseModels/IncidentOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentPrivacyRule.ts +2 -2
- package/Models/DatabaseModels/IncidentReminderRule.ts +6 -4
- package/Models/DatabaseModels/IncidentSlaRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicy.ts +3 -4
- package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.ts +254 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/IoTFleetLabelRule.ts +2 -2
- package/Models/DatabaseModels/IoTFleetOwnerRule.ts +2 -2
- package/Models/DatabaseModels/KubernetesClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/KubernetesClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/MonitorLabelRule.ts +2 -2
- package/Models/DatabaseModels/MonitorOwnerRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceLabelRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +2 -2
- package/Models/DatabaseModels/PodmanHostLabelRule.ts +2 -2
- package/Models/DatabaseModels/PodmanHostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ProxmoxClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/ProxmoxClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RumApplicationLabelRule.ts +2 -2
- package/Models/DatabaseModels/RumApplicationOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RunbookLabelRule.ts +2 -2
- package/Models/DatabaseModels/RunbookOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RunbookRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceReminderRule.ts +6 -4
- package/Models/DatabaseModels/ServerlessFunctionLabelRule.ts +2 -2
- package/Models/DatabaseModels/ServerlessFunctionOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ServiceLabelRule.ts +2 -2
- package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +283 -4
- package/Models/DatabaseModels/ServiceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageLabelRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageMonitorRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageOwnerRule.ts +2 -2
- package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +2 -2
- package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/WorkflowLabelRule.ts +2 -2
- package/Models/DatabaseModels/WorkflowOwnerRule.ts +2 -2
- package/Server/API/TelemetryAPI.ts +323 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.ts +111 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.ts +644 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/MultipartFormData.ts +46 -21
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +21 -0
- package/Server/Services/AlertGroupingEngineService.ts +27 -0
- package/Server/Services/AlertLabelRuleEngineService.ts +27 -0
- package/Server/Services/AlertOnCallRuleEngineService.ts +27 -0
- package/Server/Services/AlertOwnerRuleEngineService.ts +27 -0
- package/Server/Services/AlertPrivacyRuleEngineService.ts +27 -0
- package/Server/Services/AlertReminderRuleService.ts +65 -33
- package/Server/Services/AutoRemediationRuleEngineService.ts +90 -8
- package/Server/Services/CephClusterLabelRuleEngineService.ts +20 -0
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +20 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +20 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DashboardLabelRuleEngineService.ts +20 -0
- package/Server/Services/DashboardOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DatabaseService.ts +409 -6
- package/Server/Services/DockerHostLabelRuleEngineService.ts +20 -0
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +23 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/HostLabelRuleEngineService.ts +13 -0
- package/Server/Services/HostOwnerRuleEngineService.ts +13 -0
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +21 -0
- package/Server/Services/IncidentGroupingEngineService.ts +64 -13
- package/Server/Services/IncidentLabelRuleEngineService.ts +64 -9
- package/Server/Services/IncidentOnCallRuleEngineService.ts +64 -10
- package/Server/Services/IncidentOwnerRuleEngineService.ts +64 -10
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +64 -10
- package/Server/Services/IncidentReminderRuleService.ts +66 -34
- package/Server/Services/IncidentSlaRuleService.ts +55 -12
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +20 -0
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +20 -0
- package/Server/Services/IncomingCallPolicyPhoneNumberService.ts +184 -0
- package/Server/Services/IncomingCallPolicyService.ts +276 -5
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +20 -0
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +20 -0
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +23 -0
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/LabelService.ts +50 -7
- package/Server/Services/MonitorLabelRuleEngineService.ts +20 -0
- package/Server/Services/MonitorOwnerRuleEngineService.ts +20 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +2 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +93 -1
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +26 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +25 -0
- package/Server/Services/NetworkDeviceService.ts +2 -0
- package/Server/Services/NetworkSiteAssignmentRuleService.ts +90 -1
- package/Server/Services/NetworkSiteService.ts +242 -29
- package/Server/Services/NetworkSiteTypeService.ts +177 -77
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +20 -0
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +20 -0
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +22 -0
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +22 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +20 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +20 -0
- package/Server/Services/ProjectCallSMSConfigService.ts +156 -7
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +25 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +25 -0
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +22 -0
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +22 -0
- package/Server/Services/RunbookLabelRuleEngineService.ts +20 -0
- package/Server/Services/RunbookOwnerRuleEngineService.ts +20 -0
- package/Server/Services/RunbookRuleEngineService.ts +18 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +62 -10
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +62 -11
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +48 -18
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +25 -0
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +25 -0
- package/Server/Services/ServiceLabelRuleEngineService.ts +20 -0
- package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +675 -12
- package/Server/Services/ServiceLevelObjectiveService.ts +55 -13
- package/Server/Services/ServiceOwnerRuleEngineService.ts +20 -0
- package/Server/Services/StatusPageLabelRuleEngineService.ts +20 -0
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +31 -2
- package/Server/Services/StatusPageMonitorRuleService.ts +34 -1
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +20 -0
- package/Server/Services/UserService.ts +23 -50
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +25 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +25 -0
- package/Server/Services/WorkflowLabelRuleEngineService.ts +20 -0
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +20 -0
- package/Server/Static/Brand/README.md +10 -5
- package/Server/Static/Brand/favicons/oneuptime-up-v1.svg +8 -0
- package/Server/Types/Database/QueryHelper.ts +88 -0
- package/Server/Utils/AI/Toolbox/SloTools.ts +19 -2
- package/Server/Utils/IncomingCallPhoneNumber.ts +29 -16
- package/Server/Utils/Profiling.ts +13 -1
- package/Server/Utils/Rules/MonitorRuleCriteriaCache.ts +38 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +498 -0
- package/Server/Utils/Telemetry.ts +3 -1
- package/Server/Utils/VendorAssets.ts +3 -0
- package/Tests/App/Dashboard/AIInsightViewTriage.test.tsx +348 -0
- package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +476 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +25 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +449 -24
- package/Tests/App/Dashboard/DashboardPersistentSideMenuLayouts.test.tsx +702 -0
- package/Tests/App/Dashboard/ExceptionsLandingRedirect.test.tsx +63 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +150 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +279 -100
- package/Tests/App/Dashboard/InventoryItemSideMenu.test.tsx +155 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +11 -0
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +215 -71
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +347 -0
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +263 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +413 -17
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +138 -0
- package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +940 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +378 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +735 -0
- package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +275 -108
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +13 -3
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +127 -4
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -4
- package/Tests/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.test.ts +362 -0
- package/Tests/Models/DatabaseModels/RuleBaseModel.test.ts +69 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +181 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +1303 -145
- package/Tests/Server/API/UserTwoFactorSelfService.test.ts +407 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +611 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +61 -3
- package/Tests/Server/Middleware/TelemetryIngestionDisabled.test.ts +211 -0
- package/Tests/Server/Services/AlertIncidentRuleCriteriaEngineServices.test.ts +651 -0
- package/Tests/Server/Services/AutoRemediationRuleEngineService.test.ts +79 -0
- package/Tests/Server/Services/DatabaseServiceRelationOnlyRuleRollout.test.ts +330 -0
- package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +522 -0
- package/Tests/Server/Services/IncidentSlaRuleCriteriaCorrelation.test.ts +99 -0
- package/Tests/Server/Services/IncomingCallPolicyPhoneNumberService.test.ts +1540 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +179 -2
- package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +170 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +559 -53
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +122 -55
- package/Tests/Server/Services/ReminderRuleCriteria.test.ts +173 -0
- package/Tests/Server/Services/ResourceRuleCriteriaEngineServices.test.ts +170 -0
- package/Tests/Server/Services/ScheduledMaintenanceRuleCriteriaCorrelation.test.ts +154 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +2450 -470
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +464 -121
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +281 -0
- package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +132 -0
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +159 -14
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +6 -8
- package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +203 -34
- package/Tests/Server/Types/Database/QueryHelperJsonArrayObjects.test.ts +128 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +190 -1
- package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +461 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +25 -0
- package/Tests/Server/Utils/Billing/BillingFailureNoticeThrottle.test.ts +359 -0
- package/Tests/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.test.ts +318 -0
- package/Tests/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.test.ts +220 -0
- package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +1043 -0
- package/Tests/Server/Utils/Execute.test.ts +302 -0
- package/Tests/Server/Utils/GracefulShutdown.test.ts +565 -0
- package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +36 -20
- package/Tests/Server/Utils/LoggerCore.test.ts +597 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtil.test.ts +1109 -0
- package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +750 -0
- package/Tests/Server/Utils/ProductAnalytics.test.ts +404 -0
- package/Tests/Server/Utils/Profiling.test.ts +366 -0
- package/Tests/Server/Utils/Rules/MonitorRuleCriteriaCache.test.ts +99 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +558 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +711 -0
- package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +522 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +17 -0
- package/Tests/Types/Dashboard/DashboardTemplateEditorialInvariants.test.ts +659 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +97 -0
- package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +1179 -0
- package/Tests/Types/Database/AccessControl/OwnedThrough.test.ts +136 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilCorePaths.test.ts +1014 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveRotation.test.ts +9 -6
- package/Tests/Types/Rules/RuleCriteriaFieldRegistry.test.ts +276 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +180 -1
- package/Tests/Types/Telemetry/LlmConventions.test.ts +495 -0
- package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +13 -6
- package/Tests/UI/Components/Alert.test.tsx +532 -93
- package/Tests/UI/Components/Feed.test.tsx +241 -0
- package/Tests/UI/Components/Forms/BasicFormStepNavigation.test.tsx +368 -0
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +454 -0
- package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +290 -0
- package/Tests/UI/Components/Forms/ModelFormRuleCriteria.test.tsx +331 -0
- package/Tests/UI/Components/IconOpticalSize.test.tsx +79 -31
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +6 -6
- package/Tests/UI/Components/NavBar.test.tsx +91 -2
- package/Tests/UI/Components/PencilButton.test.tsx +211 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaBuilder.test.tsx +510 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +350 -0
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +50 -0
- package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +329 -0
- package/Tests/UI/Components/useFeedItems.test.tsx +107 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +401 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +1 -1
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +7 -1
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +2 -0
- package/Tests/UI/Rum/ReplayEngine.test.ts +1069 -5
- package/Tests/UI/Rum/ReplayHeader.test.tsx +579 -2
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +23 -5
- package/Tests/UI/Rum/ReplayRail.test.tsx +143 -1
- package/Tests/UI/Rum/ReplayRenderBudget.test.tsx +338 -0
- package/Tests/UI/Rum/ReplaySignals.test.ts +179 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +210 -3
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +180 -1
- package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +405 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +13 -16
- package/Tests/UI/Rum/SessionReplayFacets.test.tsx +199 -0
- package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +58 -21
- package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +2 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +717 -4
- package/Tests/UI/Rum/SessionReplayUsersPage.test.tsx +435 -0
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +577 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +1 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -1
- package/Tests/UI/Utils/LabelRuleImportExport.test.ts +192 -0
- package/Tests/UI/Utils/Navigation.test.ts +30 -0
- package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +880 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +158 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +93 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +138 -0
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +174 -0
- package/Tests/Utils/Rules/RuleCriteriaMatcher.test.ts +1424 -0
- package/Tests/Utils/Rum/SessionIdentity.test.ts +72 -0
- package/Tests/Utils/Rum/SessionReplayHealth.test.ts +884 -0
- package/Tests/Utils/Slo/SloBurnRateRuleState.test.ts +374 -28
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +118 -0
- package/Types/Dashboard/DashboardTemplates.ts +465 -0
- package/Types/OnCallDutyPolicy/Layer.ts +12 -0
- package/Types/Rules/RuleCriteria.ts +51 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +449 -0
- package/Types/Rum/SessionReplay.ts +75 -0
- package/Types/Rum/SessionReplayApi.ts +93 -0
- package/UI/Components/Alerts/Alert.tsx +102 -72
- package/UI/Components/Button/Button.tsx +4 -1
- package/UI/Components/Dropdown/Dropdown.tsx +2 -0
- package/UI/Components/Feed/Feed.tsx +15 -0
- package/UI/Components/Feed/useFeedItems.ts +227 -0
- package/UI/Components/Forms/BasicForm.tsx +42 -21
- package/UI/Components/Forms/ModelForm.tsx +80 -1
- package/UI/Components/Icon/Icon.tsx +3 -35
- package/UI/Components/ModelTable/ModelTable.tsx +19 -0
- package/UI/Components/Navbar/NavBar.tsx +1 -0
- package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +735 -0
- package/UI/Components/RuleCriteria/RuleCriteriaModelForm.tsx +209 -0
- package/UI/Components/RuleCriteria/RuleCriteriaModelTable.tsx +205 -0
- package/UI/Components/RuleCriteria/RuleCriteriaSummary.tsx +123 -0
- package/UI/Components/Table/Table.tsx +3 -0
- package/UI/Components/Table/TableBody.tsx +3 -0
- package/UI/Components/Table/TableRow.tsx +8 -2
- package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +14 -2
- package/UI/Styles/Theme.css +1 -0
- package/UI/Utils/LabelRuleImportExport.ts +114 -6
- package/UI/Utils/Navigation.ts +1 -2
- package/UI/esbuild-config.js +46 -0
- package/Utils/Faker.ts +93 -6
- package/Utils/LabelRuleImportExport.ts +295 -2
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +108 -8
- package/Utils/NetworkSite/CidrMatchUtil.ts +102 -0
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +152 -2
- package/Utils/Rules/RuleCriteriaMatcher.ts +931 -0
- package/Utils/Rum/SessionIdentity.ts +16 -0
- package/Utils/Slo/SloBurnRateRuleState.ts +87 -33
- package/Utils/Telemetry/OriginAllowList.ts +74 -0
- package/build/dist/Models/AnalyticsModels/RumSession.js +32 -0
- package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/AlertReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AutoRemediationRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AutoRemediationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DashboardLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js +12 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js +50 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/HostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/HostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/IncidentReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSlaRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentSlaRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js +3 -4
- package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js +277 -0
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/MonitorLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServiceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +281 -4
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +211 -4
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js +301 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +38 -21
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +21 -0
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +44 -26
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +54 -11
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +235 -10
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +12 -0
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -0
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +39 -13
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +39 -9
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +44 -26
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +33 -12
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js +127 -0
- package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js.map +1 -0
- package/build/dist/Server/Services/IncomingCallPolicyService.js +187 -4
- package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +39 -7
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +2 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +57 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +2 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +56 -1
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +187 -22
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +126 -51
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js +115 -6
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js +12 -0
- package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +38 -9
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +38 -10
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +32 -14
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +554 -12
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +50 -14
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +25 -2
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js +19 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +14 -49
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +67 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +21 -4
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/IncomingCallPhoneNumber.js +9 -3
- package/build/dist/Server/Utils/IncomingCallPhoneNumber.js.map +1 -1
- package/build/dist/Server/Utils/Profiling.js +10 -1
- package/build/dist/Server/Utils/Profiling.js.map +1 -1
- package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js +30 -0
- package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +344 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +1 -1
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +2 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +425 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +11 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteria.js +18 -0
- package/build/dist/Types/Rules/RuleCriteria.js.map +1 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +435 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +64 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/UI/Components/Alerts/Alert.js +63 -41
- package/build/dist/UI/Components/Alerts/Alert.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +3 -1
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/Feed.js +4 -1
- package/build/dist/UI/Components/Feed/Feed.js.map +1 -1
- package/build/dist/UI/Components/Feed/useFeedItems.js +137 -0
- package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -0
- package/build/dist/UI/Components/Forms/BasicForm.js +38 -19
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +65 -1
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +3 -35
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +12 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +1 -0
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +383 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js +124 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js +126 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js +63 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +1 -1
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableBody.js +4 -2
- package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +3 -2
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +14 -2
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +1 -1
- package/build/dist/UI/Utils/LabelRuleImportExport.js +81 -5
- package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/Utils/Faker.js +76 -6
- package/build/dist/Utils/Faker.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +157 -3
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +81 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +77 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +109 -2
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -1
- package/build/dist/Utils/Rules/RuleCriteriaMatcher.js +526 -0
- package/build/dist/Utils/Rules/RuleCriteriaMatcher.js.map +1 -0
- package/build/dist/Utils/Rum/SessionIdentity.js +13 -1
- package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
- package/build/dist/Utils/Slo/SloBurnRateRuleState.js +28 -15
- package/build/dist/Utils/Slo/SloBurnRateRuleState.js.map +1 -1
- package/build/dist/Utils/Telemetry/OriginAllowList.js +61 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
- package/package.json +20 -20
|
@@ -0,0 +1,880 @@
|
|
|
1
|
+
import Includes from "../../../Types/BaseDatabase/Includes";
|
|
2
|
+
import DashboardBaseComponent from "../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
|
|
3
|
+
import DashboardComponentType from "../../../Types/Dashboard/DashboardComponentType";
|
|
4
|
+
import {
|
|
5
|
+
DashboardTemplateType,
|
|
6
|
+
getTemplateConfig,
|
|
7
|
+
} from "../../../Types/Dashboard/DashboardTemplates";
|
|
8
|
+
import DashboardVariable, {
|
|
9
|
+
DashboardVariableType,
|
|
10
|
+
} from "../../../Types/Dashboard/DashboardVariable";
|
|
11
|
+
import DashboardViewConfig from "../../../Types/Dashboard/DashboardViewConfig";
|
|
12
|
+
import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
|
|
13
|
+
import MetricQueryData from "../../../Types/Metrics/MetricQueryData";
|
|
14
|
+
import DashboardModelQueryInterpolation, {
|
|
15
|
+
AttributeToColumnMap,
|
|
16
|
+
} from "../../../Utils/Dashboard/ModelQueryVariableInterpolation";
|
|
17
|
+
import DashboardVariableInterpolation, {
|
|
18
|
+
ResolvedVariableValue,
|
|
19
|
+
} from "../../../Utils/Dashboard/VariableInterpolation";
|
|
20
|
+
import { describe, expect, test } from "@jest/globals";
|
|
21
|
+
|
|
22
|
+
/*
|
|
23
|
+
* What the SLO template's Monitor variable actually scopes, established by
|
|
24
|
+
* running the real interpolation code over the real template config rather
|
|
25
|
+
* than by reading the template's comments.
|
|
26
|
+
*
|
|
27
|
+
* The template is two halves. Objective Health and Error Budget Trends read
|
|
28
|
+
* one ServiceLevelObjective by stored id; Monitor Health reads two metric
|
|
29
|
+
* series. Only the second half is reachable by a dashboard variable, and
|
|
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.
|
|
34
|
+
*
|
|
35
|
+
* The template's declarative facts — widget inventory, titles, layout,
|
|
36
|
+
* unconfigured SLO ids — are pinned in
|
|
37
|
+
* Common/Tests/Types/Dashboard/SloDashboardTemplate.test.ts. This file only
|
|
38
|
+
* asserts behaviour under DashboardVariableInterpolation (metric widgets)
|
|
39
|
+
* and DashboardModelQueryInterpolation (Postgres-backed list widgets).
|
|
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:
|
|
53
|
+
*
|
|
54
|
+
* - "resource.monitorName" is the prefix collector-sourced resource
|
|
55
|
+
* attributes carry. Nothing writes it for these two series, so the
|
|
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.
|
|
66
|
+
*/
|
|
67
|
+
const PREFIXED_MONITOR_ATTRIBUTE: string = "resource.monitorName";
|
|
68
|
+
const PLURAL_MONITOR_ATTRIBUTE: string = "monitorNames";
|
|
69
|
+
|
|
70
|
+
/*
|
|
71
|
+
* Two picks on purpose. An objective is normally backed by several monitors,
|
|
72
|
+
* so a single pick would not exercise what the variable is multi-select for.
|
|
73
|
+
*/
|
|
74
|
+
const PICKED_MONITORS: Array<string> = ["api-gateway", "web-frontend"];
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* An attribute the reader could plausibly have added to a widget by hand
|
|
78
|
+
* before using the toolbar. It has to survive every clear/pick cycle: the
|
|
79
|
+
* Monitor variable owns exactly one key and must not tidy up its neighbours.
|
|
80
|
+
*/
|
|
81
|
+
const UNRELATED_ATTRIBUTE: string = "probeName";
|
|
82
|
+
|
|
83
|
+
// -- Helpers ---------------------------------------------------------------
|
|
84
|
+
|
|
85
|
+
type WidgetArguments = Record<string, unknown>;
|
|
86
|
+
|
|
87
|
+
function getConfig(): DashboardViewConfig {
|
|
88
|
+
const config: DashboardViewConfig | null = getTemplateConfig(
|
|
89
|
+
DashboardTemplateType.Slo,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
expect(config).not.toBeNull();
|
|
93
|
+
return mutateForFailureCheck(config as DashboardViewConfig);
|
|
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;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/*
|
|
160
|
+
* The variable is selected by being the template's ONLY one, never by its
|
|
161
|
+
* attribute key — selecting it by the key would make the tests that pin the
|
|
162
|
+
* key true by construction.
|
|
163
|
+
*/
|
|
164
|
+
function monitorVariable(config: DashboardViewConfig): DashboardVariable {
|
|
165
|
+
const variables: Array<DashboardVariable> = config.variables || [];
|
|
166
|
+
|
|
167
|
+
expect(variables).toHaveLength(1);
|
|
168
|
+
return variables[0] as DashboardVariable;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function withSelection(
|
|
172
|
+
variable: DashboardVariable,
|
|
173
|
+
selectedValues: Array<string>,
|
|
174
|
+
): DashboardVariable {
|
|
175
|
+
return { ...variable, selectedValues: selectedValues };
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function argumentsOf(component: DashboardBaseComponent): WidgetArguments {
|
|
179
|
+
return (component.arguments as WidgetArguments | undefined) || {};
|
|
180
|
+
}
|
|
181
|
+
|
|
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
|
+
const TITLE_ARGUMENT_KEYS: Array<string> = [
|
|
189
|
+
"title",
|
|
190
|
+
"chartTitle",
|
|
191
|
+
"gaugeTitle",
|
|
192
|
+
"tableTitle",
|
|
193
|
+
"widgetTitle",
|
|
194
|
+
"text",
|
|
195
|
+
];
|
|
196
|
+
|
|
197
|
+
function titleOf(component: DashboardBaseComponent): string {
|
|
198
|
+
const args: WidgetArguments = argumentsOf(component);
|
|
199
|
+
|
|
200
|
+
for (const key of TITLE_ARGUMENT_KEYS) {
|
|
201
|
+
const value: unknown = args[key];
|
|
202
|
+
|
|
203
|
+
if (typeof value === "string") {
|
|
204
|
+
return value;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return "";
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/*
|
|
212
|
+
* Every metric query a widget owns. Chart widgets may carry an additional
|
|
213
|
+
* `metricQueryConfigs` array beside the primary config, and
|
|
214
|
+
* DashboardChartComponent interpolates all of them, so both are collected —
|
|
215
|
+
* a second query added to a chart later is covered without editing here.
|
|
216
|
+
*/
|
|
217
|
+
function queryConfigsOf(
|
|
218
|
+
component: DashboardBaseComponent,
|
|
219
|
+
): Array<MetricQueryConfigData> {
|
|
220
|
+
const args: WidgetArguments = argumentsOf(component);
|
|
221
|
+
const configs: Array<MetricQueryConfigData> = [];
|
|
222
|
+
const primary: unknown = args["metricQueryConfig"];
|
|
223
|
+
|
|
224
|
+
if (primary) {
|
|
225
|
+
configs.push(primary as MetricQueryConfigData);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const additional: unknown = args["metricQueryConfigs"];
|
|
229
|
+
|
|
230
|
+
if (Array.isArray(additional)) {
|
|
231
|
+
configs.push(...(additional as Array<MetricQueryConfigData>));
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return configs;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// The widgets a TelemetryAttribute variable can reach at all.
|
|
238
|
+
function widgetsWithMetricQuery(
|
|
239
|
+
config: DashboardViewConfig,
|
|
240
|
+
): Array<DashboardBaseComponent> {
|
|
241
|
+
return config.components.filter(
|
|
242
|
+
(component: DashboardBaseComponent): boolean => {
|
|
243
|
+
return queryConfigsOf(component).length > 0;
|
|
244
|
+
},
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
|
|
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
|
+
function filterDataOf(queryConfig: MetricQueryConfigData): WidgetArguments {
|
|
270
|
+
return queryConfig.metricQueryData?.filterData as
|
|
271
|
+
| WidgetArguments
|
|
272
|
+
| undefined as WidgetArguments;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function attributesOf(queryConfig: MetricQueryConfigData): WidgetArguments {
|
|
276
|
+
const filterData: WidgetArguments = filterDataOf(queryConfig) || {};
|
|
277
|
+
|
|
278
|
+
return (filterData["attributes"] as WidgetArguments | undefined) || {};
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/*
|
|
282
|
+
* A widget's attribute filter rendered as one line, so a failing expectation
|
|
283
|
+
* names the offending key and operator instead of dumping an object graph.
|
|
284
|
+
* `Includes` renders as IN(...) and anything else as a plain assignment —
|
|
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.
|
|
288
|
+
*/
|
|
289
|
+
function describeAttributes(queryConfig: MetricQueryConfigData): string {
|
|
290
|
+
const attributes: WidgetArguments = attributesOf(queryConfig);
|
|
291
|
+
const keys: Array<string> = Object.keys(attributes).sort();
|
|
292
|
+
|
|
293
|
+
if (keys.length === 0) {
|
|
294
|
+
return "no attribute filter";
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return keys
|
|
298
|
+
.map((key: string): string => {
|
|
299
|
+
const value: unknown = attributes[key];
|
|
300
|
+
|
|
301
|
+
if (value instanceof Includes) {
|
|
302
|
+
const values: Array<string> = value.values as Array<string>;
|
|
303
|
+
return `${key} IN (${values.join(", ")})`;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return `${key} = ${String(value)}`;
|
|
307
|
+
})
|
|
308
|
+
.join("; ");
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function describeResolved(resolved: ResolvedVariableValue | undefined): string {
|
|
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(
|
|
336
|
+
component: DashboardBaseComponent,
|
|
337
|
+
variables: Array<DashboardVariable>,
|
|
338
|
+
): string {
|
|
339
|
+
const applied: Array<string> = queryConfigsOf(component).map(
|
|
340
|
+
(queryConfig: MetricQueryConfigData): string => {
|
|
341
|
+
return describeAttributes(
|
|
342
|
+
DashboardVariableInterpolation.applyToQueryConfig(
|
|
343
|
+
queryConfig,
|
|
344
|
+
variables,
|
|
345
|
+
),
|
|
346
|
+
);
|
|
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(" | ")}`;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function typesPresentIn(
|
|
364
|
+
components: Array<DashboardBaseComponent>,
|
|
365
|
+
): Array<string> {
|
|
366
|
+
return Array.from(
|
|
367
|
+
new Set(
|
|
368
|
+
components.map((component: DashboardBaseComponent): string => {
|
|
369
|
+
return component.componentType;
|
|
370
|
+
}),
|
|
371
|
+
),
|
|
372
|
+
).sort();
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function typeBreakdownOf(
|
|
376
|
+
components: Array<DashboardBaseComponent>,
|
|
377
|
+
): Array<string> {
|
|
378
|
+
const counts: Record<string, number> = {};
|
|
379
|
+
|
|
380
|
+
for (const component of components) {
|
|
381
|
+
counts[component.componentType] =
|
|
382
|
+
(counts[component.componentType] || 0) + 1;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
return Object.keys(counts)
|
|
386
|
+
.sort()
|
|
387
|
+
.map((componentType: string): string => {
|
|
388
|
+
return `${componentType} x ${counts[componentType]}`;
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
|
|
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
|
+
function withStoredAttributes(
|
|
400
|
+
queryConfig: MetricQueryConfigData,
|
|
401
|
+
attributes: WidgetArguments,
|
|
402
|
+
): MetricQueryConfigData {
|
|
403
|
+
const filterData: WidgetArguments = filterDataOf(queryConfig) || {};
|
|
404
|
+
|
|
405
|
+
return {
|
|
406
|
+
...queryConfig,
|
|
407
|
+
metricQueryData: {
|
|
408
|
+
...queryConfig.metricQueryData,
|
|
409
|
+
filterData: {
|
|
410
|
+
...filterData,
|
|
411
|
+
attributes: attributes,
|
|
412
|
+
},
|
|
413
|
+
} as unknown as MetricQueryData,
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// -- Tests -----------------------------------------------------------------
|
|
418
|
+
|
|
419
|
+
describe("SLO template Monitor variable scoping", () => {
|
|
420
|
+
describe("the binding itself", () => {
|
|
421
|
+
/*
|
|
422
|
+
* The variable only reaches a metric query through
|
|
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());
|
|
429
|
+
|
|
430
|
+
expect(
|
|
431
|
+
`${variable.name} -> ${variable.type} on ${variable.attributeKey}`,
|
|
432
|
+
).toBe(
|
|
433
|
+
`monitor -> ${DashboardVariableType.TelemetryAttribute} on ${MONITOR_ATTRIBUTE}`,
|
|
434
|
+
);
|
|
435
|
+
expect(variable.attributeKey).not.toBe(PREFIXED_MONITOR_ATTRIBUTE);
|
|
436
|
+
expect(variable.attributeKey).not.toBe(PLURAL_MONITOR_ATTRIBUTE);
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
/*
|
|
440
|
+
* The key the variable is declared with is the key the predicate is
|
|
441
|
+
* written under — asserted from the interpolation output rather than
|
|
442
|
+
* from the declaration, because that output is what the fetch layer
|
|
443
|
+
* compiles into `attributes['monitorName'] IN (...)`.
|
|
444
|
+
*/
|
|
445
|
+
test("writes its predicate under that same bare key and no other", () => {
|
|
446
|
+
const config: DashboardViewConfig = getConfig();
|
|
447
|
+
const widgets: Array<DashboardBaseComponent> =
|
|
448
|
+
widgetsWithMetricQuery(config);
|
|
449
|
+
|
|
450
|
+
expect(widgets.length).toBeGreaterThan(0);
|
|
451
|
+
|
|
452
|
+
const keysWritten: Set<string> = new Set<string>();
|
|
453
|
+
|
|
454
|
+
for (const widget of widgets) {
|
|
455
|
+
for (const queryConfig of queryConfigsOf(widget)) {
|
|
456
|
+
const applied: MetricQueryConfigData =
|
|
457
|
+
DashboardVariableInterpolation.applyToQueryConfig(queryConfig, [
|
|
458
|
+
withSelection(monitorVariable(config), PICKED_MONITORS),
|
|
459
|
+
]);
|
|
460
|
+
|
|
461
|
+
for (const key of Object.keys(attributesOf(applied))) {
|
|
462
|
+
keysWritten.add(key);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
expect(Array.from(keysWritten).sort()).toEqual([MONITOR_ATTRIBUTE]);
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
/*
|
|
471
|
+
* Multi-select is not cosmetic. The toolbar's multi picker writes
|
|
472
|
+
* `selectedValues`, and resolveValue reads that list ONLY when
|
|
473
|
+
* isMultiSelect is set — flip the flag and every pick the reader makes
|
|
474
|
+
* is dropped on the floor while the picker keeps showing them.
|
|
475
|
+
*/
|
|
476
|
+
test("is multi-select, which is what makes selectedValues resolve at all", () => {
|
|
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
|
+
|
|
487
|
+
expect(
|
|
488
|
+
`multi=${describeResolved(
|
|
489
|
+
DashboardVariableInterpolation.resolveValue(picked),
|
|
490
|
+
)} single=${describeResolved(
|
|
491
|
+
DashboardVariableInterpolation.resolveValue(asSingleSelect),
|
|
492
|
+
)}`,
|
|
493
|
+
).toBe(`multi=IN (${PICKED_MONITORS.join(", ")}) single=All`);
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
/*
|
|
497
|
+
* Why the template ships no defaultValue, in the two ways it could be
|
|
498
|
+
* added:
|
|
499
|
+
*
|
|
500
|
+
* - On this multi-select it is dead config. resolveValue never consults
|
|
501
|
+
* defaultValue for a multi-select, so the author gets no scoping and
|
|
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.
|
|
506
|
+
*/
|
|
507
|
+
test("ships no defaultValue", () => {
|
|
508
|
+
const variable: DashboardVariable = monitorVariable(getConfig());
|
|
509
|
+
|
|
510
|
+
expect(
|
|
511
|
+
`${variable.name} multiSelect=${variable.isMultiSelect === true} default=${
|
|
512
|
+
variable.defaultValue ?? "(none)"
|
|
513
|
+
}`,
|
|
514
|
+
).toBe("monitor multiSelect=true default=(none)");
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
test("a defaultValue added to this multi-select would never apply", () => {
|
|
518
|
+
const variable: DashboardVariable = {
|
|
519
|
+
...monitorVariable(getConfig()),
|
|
520
|
+
defaultValue: PICKED_MONITORS[0] as string,
|
|
521
|
+
};
|
|
522
|
+
|
|
523
|
+
expect(
|
|
524
|
+
describeResolved(DashboardVariableInterpolation.resolveValue(variable)),
|
|
525
|
+
).toBe("All");
|
|
526
|
+
});
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
describe("with nothing selected the dashboard is project-wide", () => {
|
|
530
|
+
test("the untouched variable resolves to All", () => {
|
|
531
|
+
const variable: DashboardVariable = monitorVariable(getConfig());
|
|
532
|
+
|
|
533
|
+
expect(
|
|
534
|
+
`${variable.name}: ${describeResolved(
|
|
535
|
+
DashboardVariableInterpolation.resolveValue(variable),
|
|
536
|
+
)}`,
|
|
537
|
+
).toBe("monitor: All");
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
/*
|
|
541
|
+
* The same statement at the level the reader actually sees: no widget's
|
|
542
|
+
* query gains a filter, and applyToQueryConfig hands back the very same
|
|
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 = ...".
|
|
548
|
+
*/
|
|
549
|
+
test("no metric widget's query changes at all", () => {
|
|
550
|
+
const config: DashboardViewConfig = getConfig();
|
|
551
|
+
const variable: DashboardVariable = monitorVariable(config);
|
|
552
|
+
const widgets: Array<DashboardBaseComponent> =
|
|
553
|
+
widgetsWithMetricQuery(config);
|
|
554
|
+
|
|
555
|
+
expect(widgets.length).toBeGreaterThan(0);
|
|
556
|
+
|
|
557
|
+
const outcomes: Array<string> = widgets.map(
|
|
558
|
+
(widget: DashboardBaseComponent): string => {
|
|
559
|
+
const results: Array<string> = queryConfigsOf(widget).map(
|
|
560
|
+
(queryConfig: MetricQueryConfigData): string => {
|
|
561
|
+
const applied: MetricQueryConfigData =
|
|
562
|
+
DashboardVariableInterpolation.applyToQueryConfig(queryConfig, [
|
|
563
|
+
variable,
|
|
564
|
+
]);
|
|
565
|
+
|
|
566
|
+
return applied === queryConfig
|
|
567
|
+
? "unchanged"
|
|
568
|
+
: describeAttributes(applied);
|
|
569
|
+
},
|
|
570
|
+
);
|
|
571
|
+
|
|
572
|
+
return `${titleOf(widget)}: ${results.join(" | ")}`;
|
|
573
|
+
},
|
|
574
|
+
);
|
|
575
|
+
|
|
576
|
+
expect(outcomes).toEqual(
|
|
577
|
+
widgets.map((widget: DashboardBaseComponent): string => {
|
|
578
|
+
return `${titleOf(widget)}: unchanged`;
|
|
579
|
+
}),
|
|
580
|
+
);
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
test("and the widgets ship with no attribute filter of their own", () => {
|
|
584
|
+
const config: DashboardViewConfig = getConfig();
|
|
585
|
+
const widgets: Array<DashboardBaseComponent> =
|
|
586
|
+
widgetsWithMetricQuery(config);
|
|
587
|
+
|
|
588
|
+
expect(widgets.length).toBeGreaterThan(0);
|
|
589
|
+
expect(widgets.map(describeWidgetAsShipped)).toEqual(
|
|
590
|
+
widgets.map((widget: DashboardBaseComponent): string => {
|
|
591
|
+
return `${titleOf(widget)}: no attribute filter`;
|
|
592
|
+
}),
|
|
593
|
+
);
|
|
594
|
+
});
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
describe("with monitors picked", () => {
|
|
598
|
+
/*
|
|
599
|
+
* The scoped half of the dashboard, established from the config rather
|
|
600
|
+
* than from a list of titles: exactly the widgets that own a metric
|
|
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.
|
|
604
|
+
*/
|
|
605
|
+
test("the reachable widgets are exactly the three Value tiles and two Charts", () => {
|
|
606
|
+
const config: DashboardViewConfig = getConfig();
|
|
607
|
+
const widgets: Array<DashboardBaseComponent> =
|
|
608
|
+
widgetsWithMetricQuery(config);
|
|
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,
|
|
621
|
+
);
|
|
622
|
+
const widgets: Array<DashboardBaseComponent> =
|
|
623
|
+
widgetsWithMetricQuery(config);
|
|
624
|
+
|
|
625
|
+
expect(widgets.length).toBeGreaterThan(0);
|
|
626
|
+
expect(
|
|
627
|
+
widgets.map((widget: DashboardBaseComponent): string => {
|
|
628
|
+
return describeWidgetUnderVariables(widget, [picked]);
|
|
629
|
+
}),
|
|
630
|
+
).toEqual(
|
|
631
|
+
widgets.map((widget: DashboardBaseComponent): string => {
|
|
632
|
+
return `${titleOf(widget)}: ${EXPECTED_PREDICATE}`;
|
|
633
|
+
}),
|
|
634
|
+
);
|
|
635
|
+
});
|
|
636
|
+
|
|
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", () => {
|
|
645
|
+
const config: DashboardViewConfig = getConfig();
|
|
646
|
+
const picked: DashboardVariable = withSelection(
|
|
647
|
+
monitorVariable(config),
|
|
648
|
+
PICKED_MONITORS,
|
|
649
|
+
);
|
|
650
|
+
const widgets: Array<DashboardBaseComponent> =
|
|
651
|
+
widgetsWithMetricQuery(config);
|
|
652
|
+
|
|
653
|
+
expect(widgets.length).toBeGreaterThan(0);
|
|
654
|
+
|
|
655
|
+
const before: Array<string> = [];
|
|
656
|
+
const after: Array<string> = [];
|
|
657
|
+
|
|
658
|
+
for (const widget of widgets) {
|
|
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
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
expect(after).toEqual(before);
|
|
681
|
+
// Guards the comparison above from passing on two lists of undefineds.
|
|
682
|
+
for (const line of before) {
|
|
683
|
+
expect(line).not.toContain("undefined");
|
|
684
|
+
}
|
|
685
|
+
});
|
|
686
|
+
|
|
687
|
+
/*
|
|
688
|
+
* Interpolation is a render-time transform. If it wrote back into the
|
|
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", () => {
|
|
695
|
+
const config: DashboardViewConfig = getConfig();
|
|
696
|
+
const picked: DashboardVariable = withSelection(
|
|
697
|
+
monitorVariable(config),
|
|
698
|
+
PICKED_MONITORS,
|
|
699
|
+
);
|
|
700
|
+
const widgets: Array<DashboardBaseComponent> =
|
|
701
|
+
widgetsWithMetricQuery(config);
|
|
702
|
+
|
|
703
|
+
expect(widgets.length).toBeGreaterThan(0);
|
|
704
|
+
|
|
705
|
+
const shipped: Array<string> = widgets.map(describeWidgetAsShipped);
|
|
706
|
+
|
|
707
|
+
for (const widget of widgets) {
|
|
708
|
+
DashboardVariableInterpolation.applyToQueryConfigs(
|
|
709
|
+
queryConfigsOf(widget),
|
|
710
|
+
[picked],
|
|
711
|
+
);
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
expect(widgets.map(describeWidgetAsShipped)).toEqual(shipped);
|
|
715
|
+
expect(shipped).toEqual(
|
|
716
|
+
widgets.map((widget: DashboardBaseComponent): string => {
|
|
717
|
+
return `${titleOf(widget)}: no attribute filter`;
|
|
718
|
+
}),
|
|
719
|
+
);
|
|
720
|
+
});
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
describe("the widgets the variable cannot reach", () => {
|
|
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", () => {
|
|
732
|
+
const config: DashboardViewConfig = getConfig();
|
|
733
|
+
const sloWidgets: Array<DashboardBaseComponent> = componentsOfType(
|
|
734
|
+
config,
|
|
735
|
+
DashboardComponentType.Slo,
|
|
736
|
+
);
|
|
737
|
+
|
|
738
|
+
expect(sloWidgets.length).toBeGreaterThan(0);
|
|
739
|
+
expect(
|
|
740
|
+
sloWidgets.map((widget: DashboardBaseComponent): string => {
|
|
741
|
+
return `${titleOf(widget)}: ${queryConfigsOf(widget).length} metric queries`;
|
|
742
|
+
}),
|
|
743
|
+
).toEqual(
|
|
744
|
+
sloWidgets.map((widget: DashboardBaseComponent): string => {
|
|
745
|
+
return `${titleOf(widget)}: 0 metric queries`;
|
|
746
|
+
}),
|
|
747
|
+
);
|
|
748
|
+
});
|
|
749
|
+
|
|
750
|
+
/*
|
|
751
|
+
* Stated as a closed set so a widget family added to this template later
|
|
752
|
+
* has to be classified deliberately: everything outside the metric half
|
|
753
|
+
* is a Text row, an Slo widget, or one of the three Postgres-backed
|
|
754
|
+
* lists. All of them are immune to the Monitor variable, and the lists
|
|
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.
|
|
758
|
+
*/
|
|
759
|
+
test("the unreachable widgets are only text rows, Slo widgets and the model-backed lists", () => {
|
|
760
|
+
const config: DashboardViewConfig = getConfig();
|
|
761
|
+
const widgets: Array<DashboardBaseComponent> =
|
|
762
|
+
widgetsWithoutMetricQuery(config);
|
|
763
|
+
|
|
764
|
+
expect(widgets.length).toBeGreaterThan(0);
|
|
765
|
+
expect(typesPresentIn(widgets)).toEqual(
|
|
766
|
+
[
|
|
767
|
+
DashboardComponentType.AlertList,
|
|
768
|
+
DashboardComponentType.IncidentList,
|
|
769
|
+
DashboardComponentType.MonitorList,
|
|
770
|
+
DashboardComponentType.Slo,
|
|
771
|
+
DashboardComponentType.Text,
|
|
772
|
+
].sort(),
|
|
773
|
+
);
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
/*
|
|
777
|
+
* The list widgets query Postgres by column, not by OTel attribute, so
|
|
778
|
+
* they are interpolated — if at all — through
|
|
779
|
+
* DashboardModelQueryInterpolation, which writes a predicate only for
|
|
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.
|
|
790
|
+
*/
|
|
791
|
+
test("a picked Monitor variable writes no model-query predicate unless a widget maps the key", () => {
|
|
792
|
+
const config: DashboardViewConfig = getConfig();
|
|
793
|
+
const picked: DashboardVariable = withSelection(
|
|
794
|
+
monitorVariable(config),
|
|
795
|
+
PICKED_MONITORS,
|
|
796
|
+
);
|
|
797
|
+
const query: Record<string, unknown> = { projectId: "project-1" };
|
|
798
|
+
|
|
799
|
+
const unmapped: AttributeToColumnMap = { "host.name": "hostname" };
|
|
800
|
+
expect(
|
|
801
|
+
DashboardModelQueryInterpolation.applyToQuery(
|
|
802
|
+
query,
|
|
803
|
+
[picked],
|
|
804
|
+
unmapped,
|
|
805
|
+
),
|
|
806
|
+
).toBe(query);
|
|
807
|
+
|
|
808
|
+
const mapped: AttributeToColumnMap = { [MONITOR_ATTRIBUTE]: "name" };
|
|
809
|
+
const scoped: Record<string, unknown> =
|
|
810
|
+
DashboardModelQueryInterpolation.applyToQuery(query, [picked], mapped);
|
|
811
|
+
|
|
812
|
+
expect(scoped["name"]).toBeInstanceOf(Includes);
|
|
813
|
+
expect((scoped["name"] as Includes).values).toEqual(PICKED_MONITORS);
|
|
814
|
+
});
|
|
815
|
+
});
|
|
816
|
+
|
|
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", () => {
|
|
827
|
+
const config: DashboardViewConfig = getConfig();
|
|
828
|
+
const widget: DashboardBaseComponent = widgetsWithMetricQuery(
|
|
829
|
+
config,
|
|
830
|
+
)[0] as DashboardBaseComponent;
|
|
831
|
+
const storedQuery: MetricQueryConfigData = withStoredAttributes(
|
|
832
|
+
queryConfigsOf(widget)[0] as MetricQueryConfigData,
|
|
833
|
+
{
|
|
834
|
+
[MONITOR_ATTRIBUTE]: "api-gateway",
|
|
835
|
+
[UNRELATED_ATTRIBUTE]: "us-west",
|
|
836
|
+
},
|
|
837
|
+
);
|
|
838
|
+
|
|
839
|
+
const cleared: MetricQueryConfigData =
|
|
840
|
+
DashboardVariableInterpolation.applyToQueryConfig(storedQuery, [
|
|
841
|
+
withSelection(monitorVariable(config), []),
|
|
842
|
+
]);
|
|
843
|
+
|
|
844
|
+
expect(`${titleOf(widget)}: ${describeAttributes(storedQuery)}`).toBe(
|
|
845
|
+
`${titleOf(widget)}: ${MONITOR_ATTRIBUTE} = api-gateway; ${UNRELATED_ATTRIBUTE} = us-west`,
|
|
846
|
+
);
|
|
847
|
+
expect(`${titleOf(widget)}: ${describeAttributes(cleared)}`).toBe(
|
|
848
|
+
`${titleOf(widget)}: ${UNRELATED_ATTRIBUTE} = us-west`,
|
|
849
|
+
);
|
|
850
|
+
});
|
|
851
|
+
|
|
852
|
+
/*
|
|
853
|
+
* The other direction, so the removal above cannot be mistaken for the
|
|
854
|
+
* variable simply never writing: re-picking replaces the stale scalar
|
|
855
|
+
* with the IN predicate rather than leaving both, or ANDing them.
|
|
856
|
+
*/
|
|
857
|
+
test("re-picking replaces a stale scalar rather than adding to it", () => {
|
|
858
|
+
const config: DashboardViewConfig = getConfig();
|
|
859
|
+
const widget: DashboardBaseComponent = widgetsWithMetricQuery(
|
|
860
|
+
config,
|
|
861
|
+
)[0] as DashboardBaseComponent;
|
|
862
|
+
const storedQuery: MetricQueryConfigData = withStoredAttributes(
|
|
863
|
+
queryConfigsOf(widget)[0] as MetricQueryConfigData,
|
|
864
|
+
{
|
|
865
|
+
[MONITOR_ATTRIBUTE]: "some-other-monitor",
|
|
866
|
+
[UNRELATED_ATTRIBUTE]: "us-west",
|
|
867
|
+
},
|
|
868
|
+
);
|
|
869
|
+
|
|
870
|
+
const scoped: MetricQueryConfigData =
|
|
871
|
+
DashboardVariableInterpolation.applyToQueryConfig(storedQuery, [
|
|
872
|
+
withSelection(monitorVariable(config), PICKED_MONITORS),
|
|
873
|
+
]);
|
|
874
|
+
|
|
875
|
+
expect(`${titleOf(widget)}: ${describeAttributes(scoped)}`).toBe(
|
|
876
|
+
`${titleOf(widget)}: ${EXPECTED_PREDICATE}; ${UNRELATED_ATTRIBUTE} = us-west`,
|
|
877
|
+
);
|
|
878
|
+
});
|
|
879
|
+
});
|
|
880
|
+
});
|