@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,659 @@
|
|
|
1
|
+
import DashboardBaseComponent from "../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
|
|
2
|
+
import DashboardComponentType from "../../../Types/Dashboard/DashboardComponentType";
|
|
3
|
+
import DashboardViewConfig from "../../../Types/Dashboard/DashboardViewConfig";
|
|
4
|
+
import {
|
|
5
|
+
DashboardTemplate,
|
|
6
|
+
DashboardTemplates,
|
|
7
|
+
DashboardTemplateType,
|
|
8
|
+
getTemplateConfig,
|
|
9
|
+
} from "../../../Types/Dashboard/DashboardTemplates";
|
|
10
|
+
import ValueFormatter from "../../../Utils/ValueFormatter";
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
* EDITORIAL invariants that must hold for EVERY dashboard template,
|
|
14
|
+
* present and future. The structural layer — grid bounds, overlap, unique
|
|
15
|
+
* ids, the misspelled `aggegationType`, gauge threshold ordering, variable
|
|
16
|
+
* shape, Slo widget wiring — lives in DashboardTemplateInvariants and is
|
|
17
|
+
* deliberately not repeated here.
|
|
18
|
+
*
|
|
19
|
+
* This file is the layer above it: a template can satisfy every structural
|
|
20
|
+
* rule and still read badly. A header stranded over an empty band, two
|
|
21
|
+
* gauges with the same name, the same series printed twice, a paragraph
|
|
22
|
+
* dropped into a one-row Text widget, an unbounded list — none of those
|
|
23
|
+
* are type errors, none overlap anything, and all of them ship a dashboard
|
|
24
|
+
* that a reader has to decipher rather than read.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
// The grid the dashboard renderer lays out against (DashboardSize.widthInDashboardUnits).
|
|
28
|
+
const GRID_WIDTH_IN_UNITS: number = 12;
|
|
29
|
+
|
|
30
|
+
/*
|
|
31
|
+
* Blank is the "start from scratch" card: it has a catalog entry so it
|
|
32
|
+
* shows up in the modal, but deliberately resolves to no config, so every
|
|
33
|
+
* layout rule below skips it.
|
|
34
|
+
*/
|
|
35
|
+
const TEMPLATE_TYPES_WITH_CONFIG: Array<DashboardTemplateType> = Object.values(
|
|
36
|
+
DashboardTemplateType,
|
|
37
|
+
).filter((type: DashboardTemplateType): boolean => {
|
|
38
|
+
return type !== DashboardTemplateType.Blank;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
interface LoadedTemplate {
|
|
42
|
+
type: DashboardTemplateType;
|
|
43
|
+
config: DashboardViewConfig;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function loadAllTemplates(): Array<LoadedTemplate> {
|
|
47
|
+
return TEMPLATE_TYPES_WITH_CONFIG.map(
|
|
48
|
+
(type: DashboardTemplateType): LoadedTemplate => {
|
|
49
|
+
const config: DashboardViewConfig | null = getTemplateConfig(type);
|
|
50
|
+
|
|
51
|
+
if (!config) {
|
|
52
|
+
throw new Error(`Expected ${type} to resolve to a config`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return { type: type, config: config };
|
|
56
|
+
},
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function getArguments(
|
|
61
|
+
component: DashboardBaseComponent,
|
|
62
|
+
): Record<string, unknown> {
|
|
63
|
+
return (component.arguments as Record<string, unknown>) || {};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/*
|
|
67
|
+
* Every widget family stores its human label under a different argument
|
|
68
|
+
* key, and the label is the only stable handle a reader (or a test) has:
|
|
69
|
+
* componentIds are regenerated on every getTemplateConfig() call and array
|
|
70
|
+
* positions shift whenever a row is inserted.
|
|
71
|
+
*/
|
|
72
|
+
const TITLE_ARGUMENT_KEYS: Array<string> = [
|
|
73
|
+
"title",
|
|
74
|
+
"chartTitle",
|
|
75
|
+
"gaugeTitle",
|
|
76
|
+
"tableTitle",
|
|
77
|
+
"widgetTitle",
|
|
78
|
+
"text",
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
function titleOf(component: DashboardBaseComponent): string | undefined {
|
|
82
|
+
const args: Record<string, unknown> = getArguments(component);
|
|
83
|
+
|
|
84
|
+
for (const key of TITLE_ARGUMENT_KEYS) {
|
|
85
|
+
const value: unknown = args[key];
|
|
86
|
+
|
|
87
|
+
if (typeof value === "string") {
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function describeComponent(
|
|
96
|
+
type: DashboardTemplateType,
|
|
97
|
+
component: DashboardBaseComponent,
|
|
98
|
+
): string {
|
|
99
|
+
return `${type} ${component.componentType} "${
|
|
100
|
+
titleOf(component) ?? "<untitled>"
|
|
101
|
+
}" at row ${component.topInDashboardUnits}`;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function isTextWidget(component: DashboardBaseComponent): boolean {
|
|
105
|
+
return component.componentType === DashboardComponentType.Text;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/*
|
|
109
|
+
* A bold Text widget is what the templates use as a section heading — the
|
|
110
|
+
* renderer gives it `font-semibold` and nothing else distinguishes it from
|
|
111
|
+
* body copy (DashboardTextComponent).
|
|
112
|
+
*/
|
|
113
|
+
function isSectionHeader(component: DashboardBaseComponent): boolean {
|
|
114
|
+
return isTextWidget(component) && getArguments(component)["isBold"] === true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/*
|
|
118
|
+
* The filterData block that reaches the metric fetch layer, or undefined
|
|
119
|
+
* for widgets that do not query metrics at all (text, lists, log streams,
|
|
120
|
+
* trace and Slo widgets).
|
|
121
|
+
*/
|
|
122
|
+
function getMetricFilterData(
|
|
123
|
+
component: DashboardBaseComponent,
|
|
124
|
+
): Record<string, unknown> | undefined {
|
|
125
|
+
const queryConfig: Record<string, unknown> | undefined = getArguments(
|
|
126
|
+
component,
|
|
127
|
+
)["metricQueryConfig"] as Record<string, unknown> | undefined;
|
|
128
|
+
|
|
129
|
+
const queryData: Record<string, unknown> | undefined = queryConfig?.[
|
|
130
|
+
"metricQueryData"
|
|
131
|
+
] as Record<string, unknown> | undefined;
|
|
132
|
+
|
|
133
|
+
const filterData: Record<string, unknown> | undefined = queryData?.[
|
|
134
|
+
"filterData"
|
|
135
|
+
] as Record<string, unknown> | undefined;
|
|
136
|
+
|
|
137
|
+
if (!filterData || typeof filterData["metricName"] !== "string") {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return filterData;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*
|
|
145
|
+
* Every widget family whose body is a row list. Derived from the component
|
|
146
|
+
* enum rather than written out, so a new inventory widget is covered the
|
|
147
|
+
* day it is added instead of the day someone remembers to extend a literal
|
|
148
|
+
* array here.
|
|
149
|
+
*/
|
|
150
|
+
const LIST_COMPONENT_TYPES: Array<DashboardComponentType> = Object.values(
|
|
151
|
+
DashboardComponentType,
|
|
152
|
+
).filter((componentType: DashboardComponentType): boolean => {
|
|
153
|
+
return componentType.endsWith("List");
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
/*
|
|
157
|
+
* DashboardTextComponent renders non-markdown text as ONE centred flex
|
|
158
|
+
* line at `fontSize = min(componentHeightInPx * 0.35, 64)`, inside a card
|
|
159
|
+
* whose wrapper is `overflow-hidden`. There is no graceful degradation: a
|
|
160
|
+
* wrapped second line is clipped by the card, so over-long copy simply
|
|
161
|
+
* stops mid-sentence.
|
|
162
|
+
*
|
|
163
|
+
* What fits is a RATIO rather than a pixel count, because the font scales
|
|
164
|
+
* with the row. Running the canvas' own arithmetic (DashboardSize:
|
|
165
|
+
* unit = (canvasWidth - 11 * 10) / 12, widgetWidth = w * unit + (w - 1) * 10,
|
|
166
|
+
* less 12px of card padding and the component's own px-2 on each side), a
|
|
167
|
+
* 12-column, one-row widget holds
|
|
168
|
+
*
|
|
169
|
+
* (12 * unit + 110 - 40) / (0.35 * unit * averageAdvanceInEm)
|
|
170
|
+
*
|
|
171
|
+
* characters — 71 to 76 of them at an average advance of 0.5em, for canvas
|
|
172
|
+
* widths from 768px to 1920px. The true average advance of the app's
|
|
173
|
+
* semibold UI font sits somewhere in 0.46em-0.55em, so the honest capacity
|
|
174
|
+
* is a band (very roughly 65-80 characters), not a single number.
|
|
175
|
+
*
|
|
176
|
+
* We take the LOOSE end of that band — 6.5 characters per grid column, so
|
|
177
|
+
* 78 for the full-width rows every template uses today. Loose enough that
|
|
178
|
+
* the test never adjudicates a borderline header, tight enough that a
|
|
179
|
+
* paragraph pasted into a header row fails. Height divides the budget
|
|
180
|
+
* because the font grows with the row while the width does not: a two-row
|
|
181
|
+
* Text widget renders at roughly twice the font size and therefore fits
|
|
182
|
+
* about HALF the characters, not double.
|
|
183
|
+
*/
|
|
184
|
+
const TEXT_CHARACTERS_PER_WIDTH_UNIT: number = 6.5;
|
|
185
|
+
|
|
186
|
+
function maximumTextLengthFor(component: DashboardBaseComponent): number {
|
|
187
|
+
return Math.floor(
|
|
188
|
+
(TEXT_CHARACTERS_PER_WIDTH_UNIT * component.widthInDashboardUnits) /
|
|
189
|
+
component.heightInDashboardUnits,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
describe("DashboardTemplates editorial invariants (all templates)", () => {
|
|
194
|
+
describe("opening title", () => {
|
|
195
|
+
/*
|
|
196
|
+
* The card the reader clicked in the "Create from Template" modal and
|
|
197
|
+
* the heading they land on have to be the same words, or the dashboard
|
|
198
|
+
* they just created looks like somebody else's. Equality against the
|
|
199
|
+
* catalog entry — not merely "row 0 holds some bold text" — is what
|
|
200
|
+
* makes renaming a catalog card without renaming its title row fail.
|
|
201
|
+
*/
|
|
202
|
+
test("every template opens with a bold, full-width row that carries its catalog name", (): void => {
|
|
203
|
+
const loadedTemplates: Array<LoadedTemplate> = loadAllTemplates();
|
|
204
|
+
|
|
205
|
+
expect(loadedTemplates.length).toBeGreaterThan(0);
|
|
206
|
+
|
|
207
|
+
for (const loaded of loadedTemplates) {
|
|
208
|
+
const catalogEntry: DashboardTemplate | undefined =
|
|
209
|
+
DashboardTemplates.find((template: DashboardTemplate): boolean => {
|
|
210
|
+
return template.type === loaded.type;
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
expect(
|
|
214
|
+
`${loaded.type} has a catalog entry: ${Boolean(catalogEntry)}`,
|
|
215
|
+
).toBe(`${loaded.type} has a catalog entry: true`);
|
|
216
|
+
|
|
217
|
+
const openingRow: Array<DashboardBaseComponent> =
|
|
218
|
+
loaded.config.components.filter(
|
|
219
|
+
(component: DashboardBaseComponent): boolean => {
|
|
220
|
+
return component.topInDashboardUnits === 0;
|
|
221
|
+
},
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
expect(`${loaded.type} components on row 0: ${openingRow.length}`).toBe(
|
|
225
|
+
`${loaded.type} components on row 0: 1`,
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
const title: DashboardBaseComponent = openingRow[0]!;
|
|
229
|
+
const label: string = `${loaded.type} row 0`;
|
|
230
|
+
|
|
231
|
+
expect(`${label} type=${title.componentType}`).toBe(
|
|
232
|
+
`${label} type=${DashboardComponentType.Text}`,
|
|
233
|
+
);
|
|
234
|
+
expect(`${label} isBold=${getArguments(title)["isBold"]}`).toBe(
|
|
235
|
+
`${label} isBold=true`,
|
|
236
|
+
);
|
|
237
|
+
expect(
|
|
238
|
+
`${label} width=${title.widthInDashboardUnits} height=${title.heightInDashboardUnits}`,
|
|
239
|
+
).toBe(`${label} width=${GRID_WIDTH_IN_UNITS} height=1`);
|
|
240
|
+
expect(`${label} text=${String(titleOf(title))}`).toBe(
|
|
241
|
+
`${label} text=${(catalogEntry as DashboardTemplate).name}`,
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
describe("section headers", () => {
|
|
248
|
+
/*
|
|
249
|
+
* A heading is a promise that something follows it. A bold Text widget
|
|
250
|
+
* with nothing starting on the row beneath renders as a stranded label
|
|
251
|
+
* over whitespace — which is exactly what is left behind when a widget
|
|
252
|
+
* is deleted from a template and its header is not.
|
|
253
|
+
*/
|
|
254
|
+
test("every bold section header is full width, one row tall, and has a widget directly beneath it", (): void => {
|
|
255
|
+
const loadedTemplates: Array<LoadedTemplate> = loadAllTemplates();
|
|
256
|
+
|
|
257
|
+
expect(loadedTemplates.length).toBeGreaterThan(0);
|
|
258
|
+
|
|
259
|
+
let headersChecked: number = 0;
|
|
260
|
+
|
|
261
|
+
for (const loaded of loadedTemplates) {
|
|
262
|
+
const headers: Array<DashboardBaseComponent> =
|
|
263
|
+
loaded.config.components.filter(isSectionHeader);
|
|
264
|
+
|
|
265
|
+
for (const header of headers) {
|
|
266
|
+
headersChecked++;
|
|
267
|
+
|
|
268
|
+
const label: string = describeComponent(loaded.type, header);
|
|
269
|
+
|
|
270
|
+
expect(
|
|
271
|
+
`${label} width=${header.widthInDashboardUnits} height=${header.heightInDashboardUnits}`,
|
|
272
|
+
).toBe(`${label} width=${GRID_WIDTH_IN_UNITS} height=1`);
|
|
273
|
+
|
|
274
|
+
const rowBeneath: number = header.topInDashboardUnits + 1;
|
|
275
|
+
const widgetsBeneath: number = loaded.config.components.filter(
|
|
276
|
+
(component: DashboardBaseComponent): boolean => {
|
|
277
|
+
return component.topInDashboardUnits === rowBeneath;
|
|
278
|
+
},
|
|
279
|
+
).length;
|
|
280
|
+
|
|
281
|
+
expect(
|
|
282
|
+
`${label} widgets starting on row ${rowBeneath}: ${widgetsBeneath > 0}`,
|
|
283
|
+
).toBe(`${label} widgets starting on row ${rowBeneath}: true`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Every template ships at least a title row, so this cannot be zero.
|
|
288
|
+
expect(headersChecked).toBeGreaterThan(0);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
describe("vertical rhythm", () => {
|
|
293
|
+
/*
|
|
294
|
+
* A row no widget occupies renders as a band of empty canvas mid
|
|
295
|
+
* dashboard. It is never intentional in a template: it means a widget
|
|
296
|
+
* was resized or removed and the rows below it were not pulled up.
|
|
297
|
+
* (That the declared height CONTAINS the lowest widget is the
|
|
298
|
+
* structural file's rule; this one is about the gaps above it.)
|
|
299
|
+
*/
|
|
300
|
+
test("no template leaves an empty row above its lowest widget", (): void => {
|
|
301
|
+
const loadedTemplates: Array<LoadedTemplate> = loadAllTemplates();
|
|
302
|
+
|
|
303
|
+
expect(loadedTemplates.length).toBeGreaterThan(0);
|
|
304
|
+
|
|
305
|
+
for (const loaded of loadedTemplates) {
|
|
306
|
+
expect(loaded.config.components.length).toBeGreaterThan(0);
|
|
307
|
+
|
|
308
|
+
const occupiedRows: Set<number> = new Set<number>();
|
|
309
|
+
let lowestOccupiedEdge: number = 0;
|
|
310
|
+
|
|
311
|
+
for (const component of loaded.config.components) {
|
|
312
|
+
const bottom: number =
|
|
313
|
+
component.topInDashboardUnits + component.heightInDashboardUnits;
|
|
314
|
+
|
|
315
|
+
lowestOccupiedEdge = Math.max(lowestOccupiedEdge, bottom);
|
|
316
|
+
|
|
317
|
+
for (
|
|
318
|
+
let row: number = component.topInDashboardUnits;
|
|
319
|
+
row < bottom;
|
|
320
|
+
row++
|
|
321
|
+
) {
|
|
322
|
+
occupiedRows.add(row);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const emptyRows: Array<number> = [];
|
|
327
|
+
|
|
328
|
+
for (let row: number = 0; row < lowestOccupiedEdge; row++) {
|
|
329
|
+
if (!occupiedRows.has(row)) {
|
|
330
|
+
emptyRows.push(row);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
expect(
|
|
335
|
+
`${loaded.type} empty rows above row ${lowestOccupiedEdge}: ${emptyRows.join(", ")}`,
|
|
336
|
+
).toBe(`${loaded.type} empty rows above row ${lowestOccupiedEdge}: `);
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
describe("widget titles", () => {
|
|
342
|
+
/*
|
|
343
|
+
* Titles are the handle: the reader uses them to say which widget is
|
|
344
|
+
* wrong, and every per-template suite in this directory looks widgets
|
|
345
|
+
* up by title because ids regenerate on every call. Two Gauges called
|
|
346
|
+
* "MTTR" on one dashboard are indistinguishable to both.
|
|
347
|
+
*
|
|
348
|
+
* Scoped to the component FAMILY on purpose. The Incident and Alert
|
|
349
|
+
* templates legitimately pair a Value tile and a Gauge that both read
|
|
350
|
+
* "MTTR" — different widget shapes showing the same measure, which a
|
|
351
|
+
* reader can tell apart at a glance. Two widgets of the SAME shape
|
|
352
|
+
* sharing a name is the ambiguity worth failing on.
|
|
353
|
+
*/
|
|
354
|
+
test("every widget title is non-empty and unique within its component family", (): void => {
|
|
355
|
+
const loadedTemplates: Array<LoadedTemplate> = loadAllTemplates();
|
|
356
|
+
|
|
357
|
+
expect(loadedTemplates.length).toBeGreaterThan(0);
|
|
358
|
+
|
|
359
|
+
let widgetsChecked: number = 0;
|
|
360
|
+
|
|
361
|
+
for (const loaded of loadedTemplates) {
|
|
362
|
+
const seenTitles: Set<string> = new Set<string>();
|
|
363
|
+
const duplicates: Array<string> = [];
|
|
364
|
+
|
|
365
|
+
for (const component of loaded.config.components) {
|
|
366
|
+
widgetsChecked++;
|
|
367
|
+
|
|
368
|
+
const label: string = describeComponent(loaded.type, component);
|
|
369
|
+
const title: string | undefined = titleOf(component);
|
|
370
|
+
|
|
371
|
+
expect(`${label} title is a ${typeof title}`).toBe(
|
|
372
|
+
`${label} title is a string`,
|
|
373
|
+
);
|
|
374
|
+
expect(`${label} title="${(title ?? "").trim()}"`).not.toBe(
|
|
375
|
+
`${label} title=""`,
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
const key: string = `${component.componentType}: "${title}"`;
|
|
379
|
+
|
|
380
|
+
if (seenTitles.has(key)) {
|
|
381
|
+
duplicates.push(key);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
seenTitles.add(key);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
expect(
|
|
388
|
+
`${loaded.type} duplicate titles: ${duplicates.join(", ")}`,
|
|
389
|
+
).toBe(`${loaded.type} duplicate titles: `);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
expect(widgetsChecked).toBeGreaterThan(0);
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
describe("metric coverage", () => {
|
|
397
|
+
/*
|
|
398
|
+
* The same series, aggregated the same way, drawn twice in the same
|
|
399
|
+
* widget shape is a duplicated widget rather than a second view of the
|
|
400
|
+
* data: it consumes a slot and a fetch and tells the reader nothing new.
|
|
401
|
+
* Deliberate second views differ in at least one of the three —
|
|
402
|
+
* "Worst Response Time" (Max) beside "Avg Response Time" (Avg) on the
|
|
403
|
+
* SLO template, or a Value tile and a Chart of the same series — so the
|
|
404
|
+
* triple, not the metric name alone, is what has to be unique.
|
|
405
|
+
*/
|
|
406
|
+
test("no template prints the same component family, metric and aggregation twice", (): void => {
|
|
407
|
+
const loadedTemplates: Array<LoadedTemplate> = loadAllTemplates();
|
|
408
|
+
|
|
409
|
+
expect(loadedTemplates.length).toBeGreaterThan(0);
|
|
410
|
+
|
|
411
|
+
let seriesChecked: number = 0;
|
|
412
|
+
|
|
413
|
+
for (const loaded of loadedTemplates) {
|
|
414
|
+
const seenTriples: Map<string, string> = new Map<string, string>();
|
|
415
|
+
const duplicates: Array<string> = [];
|
|
416
|
+
|
|
417
|
+
for (const component of loaded.config.components) {
|
|
418
|
+
const filterData: Record<string, unknown> | undefined =
|
|
419
|
+
getMetricFilterData(component);
|
|
420
|
+
|
|
421
|
+
if (!filterData) {
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
seriesChecked++;
|
|
426
|
+
|
|
427
|
+
const triple: string = `${component.componentType}/${String(
|
|
428
|
+
filterData["metricName"],
|
|
429
|
+
)}/${String(filterData["aggegationType"])}`;
|
|
430
|
+
const existing: string | undefined = seenTriples.get(triple);
|
|
431
|
+
|
|
432
|
+
if (existing) {
|
|
433
|
+
duplicates.push(
|
|
434
|
+
`${triple} on both "${existing}" and "${titleOf(component)}"`,
|
|
435
|
+
);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
seenTriples.set(triple, String(titleOf(component)));
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
expect(`${loaded.type} repeated series: ${duplicates.join("; ")}`).toBe(
|
|
442
|
+
`${loaded.type} repeated series: `,
|
|
443
|
+
);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
expect(seriesChecked).toBeGreaterThan(0);
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
describe("row caps", () => {
|
|
451
|
+
/*
|
|
452
|
+
* Inventory widgets render whatever the API hands back. Without a cap a
|
|
453
|
+
* template dropped into a project with 4,000 monitors paints 4,000 rows
|
|
454
|
+
* into a four-row widget — the fetch, the DOM and the scroll position
|
|
455
|
+
* all pay for rows nobody can see. Every list factory defaults
|
|
456
|
+
* `maxRows`, so a missing one means a new family shipped without the
|
|
457
|
+
* default rather than a template opting out.
|
|
458
|
+
*/
|
|
459
|
+
test("every list widget caps its rows with a positive integer maxRows", (): void => {
|
|
460
|
+
const loadedTemplates: Array<LoadedTemplate> = loadAllTemplates();
|
|
461
|
+
|
|
462
|
+
expect(LIST_COMPONENT_TYPES.length).toBeGreaterThan(0);
|
|
463
|
+
expect(loadedTemplates.length).toBeGreaterThan(0);
|
|
464
|
+
|
|
465
|
+
let listWidgetsChecked: number = 0;
|
|
466
|
+
|
|
467
|
+
for (const loaded of loadedTemplates) {
|
|
468
|
+
for (const component of loaded.config.components) {
|
|
469
|
+
if (!LIST_COMPONENT_TYPES.includes(component.componentType)) {
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
listWidgetsChecked++;
|
|
474
|
+
|
|
475
|
+
const label: string = describeComponent(loaded.type, component);
|
|
476
|
+
const maxRows: unknown = getArguments(component)["maxRows"];
|
|
477
|
+
|
|
478
|
+
expect(`${label} maxRows is a ${typeof maxRows}`).toBe(
|
|
479
|
+
`${label} maxRows is a number`,
|
|
480
|
+
);
|
|
481
|
+
expect(
|
|
482
|
+
`${label} maxRows=${String(maxRows)} usable=${
|
|
483
|
+
typeof maxRows === "number" &&
|
|
484
|
+
Number.isInteger(maxRows) &&
|
|
485
|
+
maxRows > 0
|
|
486
|
+
}`,
|
|
487
|
+
).toBe(`${label} maxRows=${String(maxRows)} usable=true`);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
expect(listWidgetsChecked).toBeGreaterThan(0);
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
/*
|
|
495
|
+
* Tables and log streams take the same argument and pay the same cost,
|
|
496
|
+
* so wherever a template declares one at all it has to be a usable row
|
|
497
|
+
* count. `maxRows: 0` and `maxRows: 12.5` are both type-legal on a
|
|
498
|
+
* Record<string, unknown> and neither renders anything sensible.
|
|
499
|
+
*/
|
|
500
|
+
test("every widget that declares maxRows declares a positive whole number", (): void => {
|
|
501
|
+
const loadedTemplates: Array<LoadedTemplate> = loadAllTemplates();
|
|
502
|
+
|
|
503
|
+
expect(loadedTemplates.length).toBeGreaterThan(0);
|
|
504
|
+
|
|
505
|
+
let declarationsChecked: number = 0;
|
|
506
|
+
|
|
507
|
+
for (const loaded of loadedTemplates) {
|
|
508
|
+
for (const component of loaded.config.components) {
|
|
509
|
+
const maxRows: unknown = getArguments(component)["maxRows"];
|
|
510
|
+
|
|
511
|
+
if (maxRows === undefined) {
|
|
512
|
+
continue;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
declarationsChecked++;
|
|
516
|
+
|
|
517
|
+
const label: string = describeComponent(loaded.type, component);
|
|
518
|
+
|
|
519
|
+
expect(
|
|
520
|
+
`${label} maxRows=${String(maxRows)} usable=${
|
|
521
|
+
typeof maxRows === "number" &&
|
|
522
|
+
Number.isInteger(maxRows) &&
|
|
523
|
+
maxRows > 0
|
|
524
|
+
}`,
|
|
525
|
+
).toBe(`${label} maxRows=${String(maxRows)} usable=true`);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
expect(declarationsChecked).toBeGreaterThan(0);
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
describe("gauges", () => {
|
|
534
|
+
/*
|
|
535
|
+
* A gauge's sweep is the reader's only scale. When the series is one
|
|
536
|
+
* the renderer formats as a percentage — which ValueFormatter decides
|
|
537
|
+
* from the metric NAME, `.utilization` / `.ratio` / `.fraction` /
|
|
538
|
+
* `.percent` — the only sweep that means anything is 0 to 100: a dial
|
|
539
|
+
* that stops at 1 pins a 37% reading hard against the top, and one that
|
|
540
|
+
* runs to 1000 leaves it invisible near the bottom.
|
|
541
|
+
*
|
|
542
|
+
* Deriving percent-ness from ValueFormatter rather than from a list
|
|
543
|
+
* written here keeps this test honest about the same metrics the
|
|
544
|
+
* renderer itself treats as percentages, including the two kubeletstats
|
|
545
|
+
* names ValueFormatter deliberately excludes (k8s.node/pod.cpu.utilization
|
|
546
|
+
* are cores despite the name, and are NOT held to a 0-100 sweep here).
|
|
547
|
+
*/
|
|
548
|
+
test("every gauge on a percent-formatted metric sweeps exactly 0 to 100", (): void => {
|
|
549
|
+
const loadedTemplates: Array<LoadedTemplate> = loadAllTemplates();
|
|
550
|
+
|
|
551
|
+
expect(loadedTemplates.length).toBeGreaterThan(0);
|
|
552
|
+
|
|
553
|
+
let percentGaugesChecked: number = 0;
|
|
554
|
+
|
|
555
|
+
for (const loaded of loadedTemplates) {
|
|
556
|
+
for (const component of loaded.config.components) {
|
|
557
|
+
if (component.componentType !== DashboardComponentType.Gauge) {
|
|
558
|
+
continue;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
const filterData: Record<string, unknown> | undefined =
|
|
562
|
+
getMetricFilterData(component);
|
|
563
|
+
|
|
564
|
+
if (
|
|
565
|
+
!filterData ||
|
|
566
|
+
!ValueFormatter.isFractionMetric(String(filterData["metricName"]))
|
|
567
|
+
) {
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
percentGaugesChecked++;
|
|
572
|
+
|
|
573
|
+
const args: Record<string, unknown> = getArguments(component);
|
|
574
|
+
const label: string = `${describeComponent(loaded.type, component)} on ${String(
|
|
575
|
+
filterData["metricName"],
|
|
576
|
+
)}`;
|
|
577
|
+
|
|
578
|
+
expect(
|
|
579
|
+
`${label} range=${String(args["minValue"])}..${String(args["maxValue"])}`,
|
|
580
|
+
).toBe(`${label} range=0..100`);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// Guard: the CPU / memory / interface-utilization gauges below.
|
|
585
|
+
expect(percentGaugesChecked).toBeGreaterThan(0);
|
|
586
|
+
});
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
describe("text widgets", () => {
|
|
590
|
+
test("no Text widget carries more copy than its row can render on one line", (): void => {
|
|
591
|
+
const loadedTemplates: Array<LoadedTemplate> = loadAllTemplates();
|
|
592
|
+
|
|
593
|
+
expect(loadedTemplates.length).toBeGreaterThan(0);
|
|
594
|
+
|
|
595
|
+
let textWidgetsChecked: number = 0;
|
|
596
|
+
|
|
597
|
+
for (const loaded of loadedTemplates) {
|
|
598
|
+
for (const component of loaded.config.components) {
|
|
599
|
+
if (!isTextWidget(component)) {
|
|
600
|
+
continue;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
textWidgetsChecked++;
|
|
604
|
+
|
|
605
|
+
const text: string = String(getArguments(component)["text"] ?? "");
|
|
606
|
+
const budget: number = maximumTextLengthFor(component);
|
|
607
|
+
const label: string = `${loaded.type} Text at row ${component.topInDashboardUnits} (w${component.widthInDashboardUnits} h${component.heightInDashboardUnits}, budget ${budget})`;
|
|
608
|
+
|
|
609
|
+
expect(
|
|
610
|
+
`${label} length=${text.length} withinBudget=${text.length <= budget}`,
|
|
611
|
+
).toBe(`${label} length=${text.length} withinBudget=true`);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
expect(textWidgetsChecked).toBeGreaterThan(0);
|
|
616
|
+
});
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
describe("catalog copy", () => {
|
|
620
|
+
/*
|
|
621
|
+
* The description is the whole of what the modal tells a reader before
|
|
622
|
+
* they commit to a template, and it is rendered as running text under
|
|
623
|
+
* the card's name. A fragment that trails off, or one that starts
|
|
624
|
+
* lower-case because it was written as a continuation of the name,
|
|
625
|
+
* reads as a bug in the modal rather than as a choice.
|
|
626
|
+
*/
|
|
627
|
+
test("every catalog entry describes itself in a complete sentence", (): void => {
|
|
628
|
+
expect(DashboardTemplates.length).toBeGreaterThan(0);
|
|
629
|
+
|
|
630
|
+
for (const template of DashboardTemplates) {
|
|
631
|
+
const description: string = template.description.trim();
|
|
632
|
+
const label: string = `${template.type} description`;
|
|
633
|
+
|
|
634
|
+
expect(`${label} is empty: ${description.length === 0}`).toBe(
|
|
635
|
+
`${label} is empty: false`,
|
|
636
|
+
);
|
|
637
|
+
/*
|
|
638
|
+
* Plain character comparison rather than a regex: eslint's
|
|
639
|
+
* wrap-regex and prettier disagree about the parentheses around an
|
|
640
|
+
* inline literal, and there is no spelling of it both accept.
|
|
641
|
+
*/
|
|
642
|
+
const firstCharacter: string = description.charAt(0);
|
|
643
|
+
const startsUpperCase: boolean =
|
|
644
|
+
firstCharacter >= "A" && firstCharacter <= "Z";
|
|
645
|
+
|
|
646
|
+
expect(
|
|
647
|
+
`${label} starts upper-case: ${startsUpperCase} ("${description.slice(0, 24)}")`,
|
|
648
|
+
).toBe(
|
|
649
|
+
`${label} starts upper-case: true ("${description.slice(0, 24)}")`,
|
|
650
|
+
);
|
|
651
|
+
expect(
|
|
652
|
+
`${label} ends with a full stop: ${description.endsWith(".")} ("${description.slice(-24)}")`,
|
|
653
|
+
).toBe(
|
|
654
|
+
`${label} ends with a full stop: true ("${description.slice(-24)}")`,
|
|
655
|
+
);
|
|
656
|
+
}
|
|
657
|
+
});
|
|
658
|
+
});
|
|
659
|
+
});
|