@oneuptime/common 13.0.1 → 13.0.3
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/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/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/Rum/SessionReplayApiContracts.test.ts +180 -1
- 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/Slo/SloBurnRateRuleState.test.ts +374 -28
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +118 -0
- package/Types/Dashboard/DashboardTemplates.ts +465 -0
- package/Types/Rules/RuleCriteria.ts +51 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +437 -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/Rules/RuleCriteria.js +18 -0
- package/build/dist/Types/Rules/RuleCriteria.js.map +1 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +426 -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,750 @@
|
|
|
1
|
+
import MetricType from "../../../../Models/DatabaseModels/MetricType";
|
|
2
|
+
import MutableMetric from "../../../../Models/AnalyticsModels/MutableMetric";
|
|
3
|
+
import Alert from "../../../../Models/DatabaseModels/Alert";
|
|
4
|
+
import AlertSeverity from "../../../../Models/DatabaseModels/AlertSeverity";
|
|
5
|
+
import AlertState from "../../../../Models/DatabaseModels/AlertState";
|
|
6
|
+
import AlertStateTimeline from "../../../../Models/DatabaseModels/AlertStateTimeline";
|
|
7
|
+
import Incident from "../../../../Models/DatabaseModels/Incident";
|
|
8
|
+
import IncidentOwnerTeam from "../../../../Models/DatabaseModels/IncidentOwnerTeam";
|
|
9
|
+
import IncidentOwnerUser from "../../../../Models/DatabaseModels/IncidentOwnerUser";
|
|
10
|
+
import IncidentSeverity from "../../../../Models/DatabaseModels/IncidentSeverity";
|
|
11
|
+
import Monitor from "../../../../Models/DatabaseModels/Monitor";
|
|
12
|
+
import Semaphore from "../../../../Server/Infrastructure/Semaphore";
|
|
13
|
+
import AlertService from "../../../../Server/Services/AlertService";
|
|
14
|
+
import AlertStateTimelineService from "../../../../Server/Services/AlertStateTimelineService";
|
|
15
|
+
import GlobalConfigService from "../../../../Server/Services/GlobalConfigService";
|
|
16
|
+
import IncidentOwnerTeamService from "../../../../Server/Services/IncidentOwnerTeamService";
|
|
17
|
+
import IncidentOwnerUserService from "../../../../Server/Services/IncidentOwnerUserService";
|
|
18
|
+
import IncidentService from "../../../../Server/Services/IncidentService";
|
|
19
|
+
import MetricService from "../../../../Server/Services/MetricService";
|
|
20
|
+
import MutableMetricService from "../../../../Server/Services/MutableMetricService";
|
|
21
|
+
import MonitorMetricUtil from "../../../../Server/Utils/Monitor/MonitorMetricUtil";
|
|
22
|
+
import NetworkDeviceMetricUtil from "../../../../Server/Utils/Monitor/NetworkDeviceMetricUtil";
|
|
23
|
+
import TelemetryUtil from "../../../../Server/Utils/Telemetry/Telemetry";
|
|
24
|
+
import AlertMetricType from "../../../../Types/Alerts/AlertMetricType";
|
|
25
|
+
import DashboardBaseComponent from "../../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
|
|
26
|
+
import {
|
|
27
|
+
DashboardTemplateType,
|
|
28
|
+
getTemplateConfig,
|
|
29
|
+
} from "../../../../Types/Dashboard/DashboardTemplates";
|
|
30
|
+
import DashboardVariable, {
|
|
31
|
+
DashboardVariableType,
|
|
32
|
+
} from "../../../../Types/Dashboard/DashboardVariable";
|
|
33
|
+
import DashboardViewConfig from "../../../../Types/Dashboard/DashboardViewConfig";
|
|
34
|
+
import Dictionary from "../../../../Types/Dictionary";
|
|
35
|
+
import { JSONObject } from "../../../../Types/JSON";
|
|
36
|
+
import MonitorMetricType from "../../../../Types/Monitor/MonitorMetricType";
|
|
37
|
+
import PingMonitorResponse from "../../../../Types/Monitor/PingMonitor/PingMonitorResponse";
|
|
38
|
+
import SnmpMonitorResponse from "../../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
|
|
39
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
40
|
+
import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
|
|
41
|
+
import {
|
|
42
|
+
afterEach,
|
|
43
|
+
beforeEach,
|
|
44
|
+
describe,
|
|
45
|
+
expect,
|
|
46
|
+
jest,
|
|
47
|
+
test,
|
|
48
|
+
} from "@jest/globals";
|
|
49
|
+
|
|
50
|
+
/*
|
|
51
|
+
* The SLO dashboard template queries metric series by NAME and scopes them
|
|
52
|
+
* with a variable bound to one attribute KEY. Neither the name nor the key
|
|
53
|
+
* is declared anywhere shared: the template names them, and four unrelated
|
|
54
|
+
* emitters decide what actually lands in the metric store. Rename either
|
|
55
|
+
* side and nothing fails to compile — the dashboard just renders empty
|
|
56
|
+
* widgets in every project.
|
|
57
|
+
*
|
|
58
|
+
* So this suite drives the template side from getTemplateConfig and the
|
|
59
|
+
* emitter side from the real emitters (never from source text), and
|
|
60
|
+
* asserts they still meet. Everything it pins is a claim the template's
|
|
61
|
+
* own comments make about code in other files:
|
|
62
|
+
*
|
|
63
|
+
* - MonitorMetricUtil stamps the BARE `monitorName` (no `resource.`
|
|
64
|
+
* prefix) on both series the template queries.
|
|
65
|
+
* - NetworkDeviceMetricUtil writes those SAME two names off a device
|
|
66
|
+
* poll with `deviceName` / `networkDeviceId` and NO `monitorName` —
|
|
67
|
+
* the contamination that makes the unscoped view "every monitor PLUS
|
|
68
|
+
* every network device".
|
|
69
|
+
* - IncidentService stamps `monitorNames` (plural, comma-joined), which
|
|
70
|
+
* the Monitor variable can never match — the reason incident METRICS
|
|
71
|
+
* are off this dashboard.
|
|
72
|
+
* - AlertService stamps the singular `monitorName`, which it can match —
|
|
73
|
+
* so alert metrics are off the dashboard for a different reason
|
|
74
|
+
* (a burn-rate alert carries no monitor at all), not this one.
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
78
|
+
"11111111-1111-4111-8111-111111111111",
|
|
79
|
+
);
|
|
80
|
+
const MONITOR_ID: ObjectID = new ObjectID(
|
|
81
|
+
"22222222-2222-4222-8222-222222222222",
|
|
82
|
+
);
|
|
83
|
+
const PROBE_ID: ObjectID = new ObjectID("33333333-3333-4333-8333-333333333333");
|
|
84
|
+
const DEVICE_ID: ObjectID = new ObjectID(
|
|
85
|
+
"44444444-4444-4444-8444-444444444444",
|
|
86
|
+
);
|
|
87
|
+
const INCIDENT_ID: ObjectID = new ObjectID(
|
|
88
|
+
"55555555-5555-4555-8555-555555555555",
|
|
89
|
+
);
|
|
90
|
+
const ALERT_ID: ObjectID = new ObjectID("66666666-6666-4666-8666-666666666666");
|
|
91
|
+
const SEVERITY_ID: ObjectID = new ObjectID(
|
|
92
|
+
"77777777-7777-4777-8777-777777777777",
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const MONITOR_NAME: string = "Checkout API";
|
|
96
|
+
const DEVICE_NAME: string = "core-sw-01";
|
|
97
|
+
|
|
98
|
+
/*
|
|
99
|
+
* The singular key the template's Monitor variable binds to, and the
|
|
100
|
+
* plural key IncidentService writes instead. Spelled out here because the
|
|
101
|
+
* whole point is that the two are one character apart.
|
|
102
|
+
*/
|
|
103
|
+
const SINGULAR_MONITOR_KEY: string = "monitorName";
|
|
104
|
+
const PLURAL_MONITOR_KEY: string = "monitorNames";
|
|
105
|
+
|
|
106
|
+
// -- Template-side helpers (read from getTemplateConfig, never literals) ----
|
|
107
|
+
|
|
108
|
+
type WidgetArguments = Record<string, unknown>;
|
|
109
|
+
|
|
110
|
+
function sloTemplateConfig(): DashboardViewConfig {
|
|
111
|
+
const config: DashboardViewConfig | null = getTemplateConfig(
|
|
112
|
+
DashboardTemplateType.Slo,
|
|
113
|
+
);
|
|
114
|
+
expect(config).not.toBeNull();
|
|
115
|
+
return config as DashboardViewConfig;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function argumentsOf(component: DashboardBaseComponent): WidgetArguments {
|
|
119
|
+
return (component.arguments as WidgetArguments | undefined) || {};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function metricQueryConfigOf(
|
|
123
|
+
component: DashboardBaseComponent,
|
|
124
|
+
): WidgetArguments {
|
|
125
|
+
return (
|
|
126
|
+
(argumentsOf(component)["metricQueryConfig"] as
|
|
127
|
+
| WidgetArguments
|
|
128
|
+
| undefined) || {}
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function metricNameOf(component: DashboardBaseComponent): string | undefined {
|
|
133
|
+
const queryData: WidgetArguments =
|
|
134
|
+
(metricQueryConfigOf(component)["metricQueryData"] as
|
|
135
|
+
| WidgetArguments
|
|
136
|
+
| undefined) || {};
|
|
137
|
+
const filterData: WidgetArguments =
|
|
138
|
+
(queryData["filterData"] as WidgetArguments | undefined) || {};
|
|
139
|
+
const value: unknown = filterData["metricName"];
|
|
140
|
+
|
|
141
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*
|
|
145
|
+
* Only Chart widgets keep metricAliasData — the Value factory routes
|
|
146
|
+
* through buildMetricQueryData, which drops it — so this returns undefined
|
|
147
|
+
* for tiles by construction, not by accident.
|
|
148
|
+
*/
|
|
149
|
+
function legendUnitOf(component: DashboardBaseComponent): string | undefined {
|
|
150
|
+
const aliasData: WidgetArguments =
|
|
151
|
+
(metricQueryConfigOf(component)["metricAliasData"] as
|
|
152
|
+
| WidgetArguments
|
|
153
|
+
| undefined) || {};
|
|
154
|
+
const value: unknown = aliasData["legendUnit"];
|
|
155
|
+
|
|
156
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Every distinct metric series the shipped SLO template asks for. */
|
|
160
|
+
function metricNamesQueriedBySloTemplate(): Array<string> {
|
|
161
|
+
const names: Set<string> = new Set<string>();
|
|
162
|
+
|
|
163
|
+
for (const component of sloTemplateConfig().components) {
|
|
164
|
+
const name: string | undefined = metricNameOf(component);
|
|
165
|
+
|
|
166
|
+
if (name) {
|
|
167
|
+
names.add(name);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return Array.from(names).sort();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** The attribute key the template's Monitor variable scopes those series by. */
|
|
175
|
+
function monitorVariableAttributeKey(): string {
|
|
176
|
+
const telemetryVariables: Array<DashboardVariable> = (
|
|
177
|
+
sloTemplateConfig().variables || []
|
|
178
|
+
).filter((variable: DashboardVariable): boolean => {
|
|
179
|
+
return variable.type === DashboardVariableType.TelemetryAttribute;
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
expect(telemetryVariables).toHaveLength(1);
|
|
183
|
+
|
|
184
|
+
const attributeKey: string | undefined = telemetryVariables[0]?.attributeKey;
|
|
185
|
+
|
|
186
|
+
expect(typeof attributeKey).toBe("string");
|
|
187
|
+
|
|
188
|
+
return attributeKey as string;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// -- Emitter-side helpers --------------------------------------------------
|
|
192
|
+
|
|
193
|
+
function attributesOfRow(row: JSONObject): JSONObject {
|
|
194
|
+
return (row["attributes"] as JSONObject | undefined) || {};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function rowsNamed(
|
|
198
|
+
rows: Array<JSONObject>,
|
|
199
|
+
metricName: string,
|
|
200
|
+
): Array<JSONObject> {
|
|
201
|
+
return rows.filter((row: JSONObject): boolean => {
|
|
202
|
+
return row["name"] === metricName;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
describe("SLO template metric emitter contract", () => {
|
|
207
|
+
let insertedRows: Array<JSONObject>;
|
|
208
|
+
let indexedMetricTypes: Dictionary<MetricType>;
|
|
209
|
+
let savedMutableMetrics: Array<MutableMetric>;
|
|
210
|
+
|
|
211
|
+
beforeEach(() => {
|
|
212
|
+
insertedRows = [];
|
|
213
|
+
indexedMetricTypes = {};
|
|
214
|
+
savedMutableMetrics = [];
|
|
215
|
+
|
|
216
|
+
jest
|
|
217
|
+
.spyOn(GlobalConfigService, "findOneBy")
|
|
218
|
+
.mockResolvedValue(null as never);
|
|
219
|
+
jest
|
|
220
|
+
.spyOn(MetricService, "insertJsonRows")
|
|
221
|
+
.mockImplementation(async (rows: Array<JSONObject>): Promise<void> => {
|
|
222
|
+
insertedRows.push(...rows);
|
|
223
|
+
});
|
|
224
|
+
jest
|
|
225
|
+
.spyOn(TelemetryUtil, "indexMetricNameServiceNameMap")
|
|
226
|
+
.mockImplementation(
|
|
227
|
+
async (data: {
|
|
228
|
+
projectId: ObjectID;
|
|
229
|
+
metricNameServiceNameMap: Dictionary<MetricType>;
|
|
230
|
+
}): Promise<void> => {
|
|
231
|
+
Object.assign(indexedMetricTypes, data.metricNameServiceNameMap);
|
|
232
|
+
},
|
|
233
|
+
);
|
|
234
|
+
jest.spyOn(Semaphore, "lock").mockResolvedValue({} as never);
|
|
235
|
+
jest.spyOn(Semaphore, "release").mockResolvedValue(undefined as never);
|
|
236
|
+
jest
|
|
237
|
+
.spyOn(MutableMetricService, "replaceEntityMetrics")
|
|
238
|
+
.mockImplementation(
|
|
239
|
+
async (data: { metrics: Array<MutableMetric> }): Promise<void> => {
|
|
240
|
+
savedMutableMetrics.push(...data.metrics);
|
|
241
|
+
},
|
|
242
|
+
);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
afterEach(() => {
|
|
246
|
+
jest.restoreAllMocks();
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
/*
|
|
250
|
+
* One probe check, exactly as the probe pipeline hands it over. isOnline
|
|
251
|
+
* and responseTimeInMs together produce the only two series this
|
|
252
|
+
* dashboard charts.
|
|
253
|
+
*/
|
|
254
|
+
async function saveProbeMetrics(input: { isOnline: boolean }): Promise<void> {
|
|
255
|
+
await MonitorMetricUtil.saveMonitorMetrics({
|
|
256
|
+
monitorId: MONITOR_ID,
|
|
257
|
+
projectId: PROJECT_ID,
|
|
258
|
+
dataToProcess: {
|
|
259
|
+
projectId: PROJECT_ID,
|
|
260
|
+
monitorId: MONITOR_ID,
|
|
261
|
+
monitorStepId: ObjectID.generate(),
|
|
262
|
+
probeId: PROBE_ID,
|
|
263
|
+
failureCause: "",
|
|
264
|
+
isOnline: input.isOnline,
|
|
265
|
+
responseTimeInMs: 250,
|
|
266
|
+
responseCode: 200,
|
|
267
|
+
} as ProbeMonitorResponse,
|
|
268
|
+
monitorName: MONITOR_NAME,
|
|
269
|
+
probeName: "London Probe",
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/** One network-device poll that both pinged and walked the device. */
|
|
274
|
+
async function saveDeviceMetrics(): Promise<void> {
|
|
275
|
+
const walk: SnmpMonitorResponse = {
|
|
276
|
+
isOnline: true,
|
|
277
|
+
responseTimeInMs: 42,
|
|
278
|
+
failureCause: "",
|
|
279
|
+
oidResponses: [],
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
const ping: PingMonitorResponse = {
|
|
283
|
+
packetsSent: 2,
|
|
284
|
+
packetsReceived: 2,
|
|
285
|
+
packetLossPercent: 0,
|
|
286
|
+
avgRoundTripTimeInMs: 1.5,
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
await NetworkDeviceMetricUtil.saveWalkMetrics({
|
|
290
|
+
projectId: PROJECT_ID,
|
|
291
|
+
networkDeviceId: DEVICE_ID,
|
|
292
|
+
deviceName: DEVICE_NAME,
|
|
293
|
+
probeId: PROBE_ID,
|
|
294
|
+
snmpResponse: walk,
|
|
295
|
+
responseTimeInMs: walk.responseTimeInMs,
|
|
296
|
+
isOnline: true,
|
|
297
|
+
pingResponse: ping,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function mockIncident(): void {
|
|
302
|
+
const incident: Incident = new Incident();
|
|
303
|
+
|
|
304
|
+
incident._id = INCIDENT_ID.toString();
|
|
305
|
+
incident.id = INCIDENT_ID;
|
|
306
|
+
incident.projectId = PROJECT_ID;
|
|
307
|
+
incident.createdAt = new Date("2026-08-10T10:00:00.000Z");
|
|
308
|
+
incident.declaredAt = new Date("2026-08-10T10:00:00.000Z");
|
|
309
|
+
|
|
310
|
+
const monitor: Monitor = new Monitor();
|
|
311
|
+
monitor._id = MONITOR_ID.toString();
|
|
312
|
+
monitor.id = MONITOR_ID;
|
|
313
|
+
monitor.name = MONITOR_NAME;
|
|
314
|
+
incident.monitors = [monitor];
|
|
315
|
+
|
|
316
|
+
const severity: IncidentSeverity = new IncidentSeverity();
|
|
317
|
+
severity._id = SEVERITY_ID.toString();
|
|
318
|
+
severity.id = SEVERITY_ID;
|
|
319
|
+
severity.name = "Critical";
|
|
320
|
+
incident.incidentSeverity = severity;
|
|
321
|
+
|
|
322
|
+
jest
|
|
323
|
+
.spyOn(IncidentService, "findOneById")
|
|
324
|
+
.mockResolvedValue(incident as never);
|
|
325
|
+
jest
|
|
326
|
+
.spyOn(IncidentOwnerUserService, "findBy")
|
|
327
|
+
.mockResolvedValue([] as Array<IncidentOwnerUser> as never);
|
|
328
|
+
jest
|
|
329
|
+
.spyOn(IncidentOwnerTeamService, "findBy")
|
|
330
|
+
.mockResolvedValue([] as Array<IncidentOwnerTeam> as never);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function mockAlert(): void {
|
|
334
|
+
const alert: Alert = new Alert();
|
|
335
|
+
|
|
336
|
+
alert._id = ALERT_ID.toString();
|
|
337
|
+
alert.id = ALERT_ID;
|
|
338
|
+
alert.projectId = PROJECT_ID;
|
|
339
|
+
alert.createdAt = new Date("2026-08-10T10:00:00.000Z");
|
|
340
|
+
|
|
341
|
+
const monitor: Monitor = new Monitor();
|
|
342
|
+
monitor._id = MONITOR_ID.toString();
|
|
343
|
+
monitor.id = MONITOR_ID;
|
|
344
|
+
monitor.name = MONITOR_NAME;
|
|
345
|
+
alert.monitor = monitor;
|
|
346
|
+
|
|
347
|
+
const severity: AlertSeverity = new AlertSeverity();
|
|
348
|
+
severity._id = SEVERITY_ID.toString();
|
|
349
|
+
severity.id = SEVERITY_ID;
|
|
350
|
+
severity.name = "Critical";
|
|
351
|
+
alert.alertSeverity = severity;
|
|
352
|
+
|
|
353
|
+
const createdState: AlertStateTimeline = new AlertStateTimeline();
|
|
354
|
+
createdState._id = ObjectID.generate().toString();
|
|
355
|
+
createdState.projectId = PROJECT_ID;
|
|
356
|
+
createdState.startsAt = new Date("2026-08-10T10:00:00.000Z");
|
|
357
|
+
createdState.alertState = new AlertState();
|
|
358
|
+
|
|
359
|
+
jest.spyOn(AlertService, "findOneById").mockResolvedValue(alert as never);
|
|
360
|
+
jest
|
|
361
|
+
.spyOn(AlertStateTimelineService, "findBy")
|
|
362
|
+
.mockResolvedValue([createdState] as never);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
describe("the series the template asks for", () => {
|
|
366
|
+
test("queries exactly IsOnline and ResponseTime, and nothing else", () => {
|
|
367
|
+
/*
|
|
368
|
+
* A third series added to the template is a decision, not a typo:
|
|
369
|
+
* whoever adds it has to come here and satisfy themselves that the
|
|
370
|
+
* new emitter also stamps the bare monitorName, or the Monitor
|
|
371
|
+
* variable will empty that widget alone.
|
|
372
|
+
*/
|
|
373
|
+
const queried: Array<string> = metricNamesQueriedBySloTemplate();
|
|
374
|
+
|
|
375
|
+
expect(queried).toEqual(
|
|
376
|
+
[MonitorMetricType.IsOnline, MonitorMetricType.ResponseTime].sort(),
|
|
377
|
+
);
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
test("names every series through MonitorMetricType, never as a loose string", () => {
|
|
381
|
+
const known: Array<string> = Object.values(MonitorMetricType);
|
|
382
|
+
const queried: Array<string> = metricNamesQueriedBySloTemplate();
|
|
383
|
+
|
|
384
|
+
// The template really does query something, so the loop below bites.
|
|
385
|
+
expect(queried.length).toBeGreaterThan(0);
|
|
386
|
+
|
|
387
|
+
for (const metricName of queried) {
|
|
388
|
+
expect(
|
|
389
|
+
`${metricName}: is a MonitorMetricType=${known.includes(metricName)}`,
|
|
390
|
+
).toBe(`${metricName}: is a MonitorMetricType=true`);
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
describe("MonitorMetricUtil, the emitter the template queries", () => {
|
|
396
|
+
test("stamps the BARE monitorName on every series the template queries", async () => {
|
|
397
|
+
await saveProbeMetrics({ isOnline: true });
|
|
398
|
+
|
|
399
|
+
const queried: Array<string> = metricNamesQueriedBySloTemplate();
|
|
400
|
+
|
|
401
|
+
expect(queried.length).toBeGreaterThan(0);
|
|
402
|
+
|
|
403
|
+
for (const metricName of queried) {
|
|
404
|
+
const rows: Array<JSONObject> = rowsNamed(insertedRows, metricName);
|
|
405
|
+
|
|
406
|
+
// An empty series here means the template charts a name nobody emits.
|
|
407
|
+
expect(`${metricName}: rows emitted=${rows.length > 0}`).toBe(
|
|
408
|
+
`${metricName}: rows emitted=true`,
|
|
409
|
+
);
|
|
410
|
+
|
|
411
|
+
for (const row of rows) {
|
|
412
|
+
const attributes: JSONObject = attributesOfRow(row);
|
|
413
|
+
|
|
414
|
+
expect(
|
|
415
|
+
`${metricName}: ${SINGULAR_MONITOR_KEY}=${String(
|
|
416
|
+
attributes[SINGULAR_MONITOR_KEY],
|
|
417
|
+
)}`,
|
|
418
|
+
).toBe(`${metricName}: ${SINGULAR_MONITOR_KEY}=${MONITOR_NAME}`);
|
|
419
|
+
|
|
420
|
+
/*
|
|
421
|
+
* A `resource.`-prefixed key would compile on both sides and
|
|
422
|
+
* hand the reader an empty variable picker, so pin its absence
|
|
423
|
+
* rather than only the presence of the bare key.
|
|
424
|
+
*/
|
|
425
|
+
const prefixedKeys: Array<string> = Object.keys(attributes).filter(
|
|
426
|
+
(key: string): boolean => {
|
|
427
|
+
return key.startsWith("resource.");
|
|
428
|
+
},
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
expect(
|
|
432
|
+
`${metricName}: resource-prefixed keys=${prefixedKeys.join(", ")}`,
|
|
433
|
+
).toBe(`${metricName}: resource-prefixed keys=`);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
test("stamps the exact attribute key the template's Monitor variable binds to", async () => {
|
|
439
|
+
/*
|
|
440
|
+
* Both sides read from code: the key comes out of the template, the
|
|
441
|
+
* attributes out of the emitter. A rename on either side lands here.
|
|
442
|
+
*/
|
|
443
|
+
await saveProbeMetrics({ isOnline: true });
|
|
444
|
+
|
|
445
|
+
const attributeKey: string = monitorVariableAttributeKey();
|
|
446
|
+
const queried: Array<string> = metricNamesQueriedBySloTemplate();
|
|
447
|
+
|
|
448
|
+
expect(queried.length).toBeGreaterThan(0);
|
|
449
|
+
|
|
450
|
+
for (const metricName of queried) {
|
|
451
|
+
const rows: Array<JSONObject> = rowsNamed(insertedRows, metricName);
|
|
452
|
+
|
|
453
|
+
expect(`${metricName}: rows emitted=${rows.length > 0}`).toBe(
|
|
454
|
+
`${metricName}: rows emitted=true`,
|
|
455
|
+
);
|
|
456
|
+
|
|
457
|
+
for (const row of rows) {
|
|
458
|
+
const attributes: JSONObject = attributesOfRow(row);
|
|
459
|
+
|
|
460
|
+
expect(
|
|
461
|
+
`${metricName}: variable key ${attributeKey} stamped=${Object.prototype.hasOwnProperty.call(
|
|
462
|
+
attributes,
|
|
463
|
+
attributeKey,
|
|
464
|
+
)}`,
|
|
465
|
+
).toBe(`${metricName}: variable key ${attributeKey} stamped=true`);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
test("publishes the variable's key in attributeKeys, which the picker reads", async () => {
|
|
471
|
+
await saveProbeMetrics({ isOnline: true });
|
|
472
|
+
|
|
473
|
+
const attributeKey: string = monitorVariableAttributeKey();
|
|
474
|
+
const rows: Array<JSONObject> = rowsNamed(
|
|
475
|
+
insertedRows,
|
|
476
|
+
MonitorMetricType.IsOnline,
|
|
477
|
+
);
|
|
478
|
+
|
|
479
|
+
expect(rows.length).toBeGreaterThan(0);
|
|
480
|
+
|
|
481
|
+
for (const row of rows) {
|
|
482
|
+
const attributeKeys: Array<string> =
|
|
483
|
+
(row["attributeKeys"] as Array<string> | undefined) || [];
|
|
484
|
+
|
|
485
|
+
/*
|
|
486
|
+
* attributeKeys, not attributes, is what the variable's option
|
|
487
|
+
* list is built from — a stamped-but-unpublished key offers an
|
|
488
|
+
* empty dropdown.
|
|
489
|
+
*/
|
|
490
|
+
expect(
|
|
491
|
+
`IsOnline: ${attributeKey} in attributeKeys=${attributeKeys.includes(
|
|
492
|
+
attributeKey,
|
|
493
|
+
)}`,
|
|
494
|
+
).toBe(`IsOnline: ${attributeKey} in attributeKeys=true`);
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
test('emits IsOnline as 1 when up, 0 when down, with unit ""', async () => {
|
|
499
|
+
await saveProbeMetrics({ isOnline: true });
|
|
500
|
+
|
|
501
|
+
const upValues: Array<unknown> = rowsNamed(
|
|
502
|
+
insertedRows,
|
|
503
|
+
MonitorMetricType.IsOnline,
|
|
504
|
+
).map((row: JSONObject): unknown => {
|
|
505
|
+
return row["value"];
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
expect(upValues).toEqual([1]);
|
|
509
|
+
|
|
510
|
+
insertedRows = [];
|
|
511
|
+
await saveProbeMetrics({ isOnline: false });
|
|
512
|
+
|
|
513
|
+
const downValues: Array<unknown> = rowsNamed(
|
|
514
|
+
insertedRows,
|
|
515
|
+
MonitorMetricType.IsOnline,
|
|
516
|
+
).map((row: JSONObject): unknown => {
|
|
517
|
+
return row["value"];
|
|
518
|
+
});
|
|
519
|
+
|
|
520
|
+
expect(downValues).toEqual([0]);
|
|
521
|
+
|
|
522
|
+
/*
|
|
523
|
+
* Unit "" is why the template's tile is "Monitor Uptime (avg)": an
|
|
524
|
+
* Avg over a 0/1 series is a ratio in [0, 1]. If this ever became
|
|
525
|
+
* "%" the emitter would be writing 1 for 100% and every "%"-labelled
|
|
526
|
+
* widget in the product would be off by two orders of magnitude.
|
|
527
|
+
*/
|
|
528
|
+
expect(
|
|
529
|
+
`IsOnline: unit=${String(
|
|
530
|
+
indexedMetricTypes[MonitorMetricType.IsOnline]?.unit,
|
|
531
|
+
)}`,
|
|
532
|
+
).toBe("IsOnline: unit=");
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
test("declares the same unit the template prints beside the series", async () => {
|
|
536
|
+
await saveProbeMetrics({ isOnline: true });
|
|
537
|
+
|
|
538
|
+
let compared: number = 0;
|
|
539
|
+
|
|
540
|
+
for (const component of sloTemplateConfig().components) {
|
|
541
|
+
const metricName: string | undefined = metricNameOf(component);
|
|
542
|
+
const legendUnit: string | undefined = legendUnitOf(component);
|
|
543
|
+
|
|
544
|
+
if (!metricName || !legendUnit) {
|
|
545
|
+
continue;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
compared++;
|
|
549
|
+
|
|
550
|
+
/*
|
|
551
|
+
* The chart prints this string under the values it plots. The
|
|
552
|
+
* emitter decides what those values actually are, so a unit change
|
|
553
|
+
* on one side without the other mislabels real numbers.
|
|
554
|
+
*/
|
|
555
|
+
expect(
|
|
556
|
+
`${metricName}: template legendUnit=${legendUnit}, emitted unit=${String(
|
|
557
|
+
indexedMetricTypes[metricName]?.unit,
|
|
558
|
+
)}`,
|
|
559
|
+
).toBe(
|
|
560
|
+
`${metricName}: template legendUnit=${legendUnit}, emitted unit=${legendUnit}`,
|
|
561
|
+
);
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// Without this the loop would pass by never running.
|
|
565
|
+
expect(compared).toBeGreaterThan(0);
|
|
566
|
+
});
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
describe("NetworkDeviceMetricUtil, the other writer of the same names", () => {
|
|
570
|
+
test("writes the very same metric names off a device poll", async () => {
|
|
571
|
+
await saveDeviceMetrics();
|
|
572
|
+
|
|
573
|
+
const queried: Array<string> = metricNamesQueriedBySloTemplate();
|
|
574
|
+
|
|
575
|
+
expect(queried.length).toBeGreaterThan(0);
|
|
576
|
+
|
|
577
|
+
for (const metricName of queried) {
|
|
578
|
+
/*
|
|
579
|
+
* This is the contamination the template's comment documents: an
|
|
580
|
+
* unscoped uptime/response-time widget is "every probeable monitor
|
|
581
|
+
* PLUS every network device". The day this stops being true the
|
|
582
|
+
* comment is wrong and should be deleted, so fail here rather than
|
|
583
|
+
* let it rot.
|
|
584
|
+
*/
|
|
585
|
+
expect(
|
|
586
|
+
`${metricName}: also written by device polls=${
|
|
587
|
+
rowsNamed(insertedRows, metricName).length > 0
|
|
588
|
+
}`,
|
|
589
|
+
).toBe(`${metricName}: also written by device polls=true`);
|
|
590
|
+
}
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
test("stamps deviceName and networkDeviceId, never monitorName", async () => {
|
|
594
|
+
await saveDeviceMetrics();
|
|
595
|
+
|
|
596
|
+
const attributeKey: string = monitorVariableAttributeKey();
|
|
597
|
+
const queried: Array<string> = metricNamesQueriedBySloTemplate();
|
|
598
|
+
|
|
599
|
+
expect(queried.length).toBeGreaterThan(0);
|
|
600
|
+
|
|
601
|
+
for (const metricName of queried) {
|
|
602
|
+
const rows: Array<JSONObject> = rowsNamed(insertedRows, metricName);
|
|
603
|
+
|
|
604
|
+
expect(`${metricName}: device rows=${rows.length > 0}`).toBe(
|
|
605
|
+
`${metricName}: device rows=true`,
|
|
606
|
+
);
|
|
607
|
+
|
|
608
|
+
for (const row of rows) {
|
|
609
|
+
const attributes: JSONObject = attributesOfRow(row);
|
|
610
|
+
|
|
611
|
+
expect(
|
|
612
|
+
`${metricName}: deviceName=${String(attributes["deviceName"])}`,
|
|
613
|
+
).toBe(`${metricName}: deviceName=${DEVICE_NAME}`);
|
|
614
|
+
|
|
615
|
+
expect(
|
|
616
|
+
`${metricName}: networkDeviceId=${String(
|
|
617
|
+
attributes["networkDeviceId"],
|
|
618
|
+
)}`,
|
|
619
|
+
).toBe(`${metricName}: networkDeviceId=${DEVICE_ID.toString()}`);
|
|
620
|
+
|
|
621
|
+
/*
|
|
622
|
+
* Because the device rows carry no monitorName, picking a
|
|
623
|
+
* monitor in the toolbar DROPS them rather than making them
|
|
624
|
+
* selectable — they are never an option in the picker either.
|
|
625
|
+
* If a device row ever gained this key the template's Monitor
|
|
626
|
+
* variable would start offering device names as "monitors".
|
|
627
|
+
*/
|
|
628
|
+
expect(
|
|
629
|
+
`${metricName}: ${attributeKey} stamped=${Object.prototype.hasOwnProperty.call(
|
|
630
|
+
attributes,
|
|
631
|
+
attributeKey,
|
|
632
|
+
)}`,
|
|
633
|
+
).toBe(`${metricName}: ${attributeKey} stamped=false`);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
});
|
|
637
|
+
});
|
|
638
|
+
|
|
639
|
+
describe("IncidentService, which the template deliberately cannot scope", () => {
|
|
640
|
+
test("stamps monitorNames (plural) and not the singular key", async () => {
|
|
641
|
+
mockIncident();
|
|
642
|
+
|
|
643
|
+
const { baseMetricAttributes }: { baseMetricAttributes: JSONObject } =
|
|
644
|
+
await IncidentService.getIncidentMetricContext({
|
|
645
|
+
incidentId: INCIDENT_ID,
|
|
646
|
+
});
|
|
647
|
+
|
|
648
|
+
expect(
|
|
649
|
+
`incident: ${PLURAL_MONITOR_KEY}=${String(
|
|
650
|
+
baseMetricAttributes[PLURAL_MONITOR_KEY],
|
|
651
|
+
)}`,
|
|
652
|
+
).toBe(`incident: ${PLURAL_MONITOR_KEY}=${MONITOR_NAME}`);
|
|
653
|
+
|
|
654
|
+
/*
|
|
655
|
+
* The singular key is what the Monitor variable filters on. Its
|
|
656
|
+
* absence is why no incident METRIC widget is on this dashboard:
|
|
657
|
+
* one pick would empty it while the uptime tiles beside it stayed
|
|
658
|
+
* populated. If IncidentService ever adds the singular key, incident
|
|
659
|
+
* metrics become scopeable and that decision can be revisited.
|
|
660
|
+
*/
|
|
661
|
+
expect(
|
|
662
|
+
`incident: ${SINGULAR_MONITOR_KEY} stamped=${Object.prototype.hasOwnProperty.call(
|
|
663
|
+
baseMetricAttributes,
|
|
664
|
+
SINGULAR_MONITOR_KEY,
|
|
665
|
+
)}`,
|
|
666
|
+
).toBe(`incident: ${SINGULAR_MONITOR_KEY} stamped=false`);
|
|
667
|
+
});
|
|
668
|
+
|
|
669
|
+
test("carries no key the template's Monitor variable could match", async () => {
|
|
670
|
+
mockIncident();
|
|
671
|
+
|
|
672
|
+
const attributeKey: string = monitorVariableAttributeKey();
|
|
673
|
+
|
|
674
|
+
const { baseMetricAttributes }: { baseMetricAttributes: JSONObject } =
|
|
675
|
+
await IncidentService.getIncidentMetricContext({
|
|
676
|
+
incidentId: INCIDENT_ID,
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
// The context really was built, so the check below is about content.
|
|
680
|
+
expect(Object.keys(baseMetricAttributes).length).toBeGreaterThan(0);
|
|
681
|
+
|
|
682
|
+
expect(
|
|
683
|
+
`incident: variable key ${attributeKey} present=${Object.prototype.hasOwnProperty.call(
|
|
684
|
+
baseMetricAttributes,
|
|
685
|
+
attributeKey,
|
|
686
|
+
)}`,
|
|
687
|
+
).toBe(`incident: variable key ${attributeKey} present=false`);
|
|
688
|
+
});
|
|
689
|
+
});
|
|
690
|
+
|
|
691
|
+
describe("AlertService, which the template could scope but does not", () => {
|
|
692
|
+
test("stamps the singular monitorName on every alert metric", async () => {
|
|
693
|
+
mockAlert();
|
|
694
|
+
|
|
695
|
+
await AlertService.refreshAlertMetrics({ alertId: ALERT_ID });
|
|
696
|
+
|
|
697
|
+
const alertCountMetrics: Array<MutableMetric> =
|
|
698
|
+
savedMutableMetrics.filter((metric: MutableMetric): boolean => {
|
|
699
|
+
return metric.name === AlertMetricType.AlertCount;
|
|
700
|
+
});
|
|
701
|
+
|
|
702
|
+
// A refresh that emitted nothing would make every assertion vacuous.
|
|
703
|
+
expect(alertCountMetrics.length).toBeGreaterThan(0);
|
|
704
|
+
|
|
705
|
+
for (const metric of alertCountMetrics) {
|
|
706
|
+
const attributes: JSONObject = (metric.attributes || {}) as JSONObject;
|
|
707
|
+
|
|
708
|
+
/*
|
|
709
|
+
* Alert metrics ARE scopeable by the Monitor variable — which is
|
|
710
|
+
* exactly why the template's reason for leaving them off is a
|
|
711
|
+
* different one (a burn-rate alert is created with no monitor
|
|
712
|
+
* attached, so it carries no value for this key at all). Pinning
|
|
713
|
+
* the key here keeps that distinction checkable.
|
|
714
|
+
*/
|
|
715
|
+
expect(
|
|
716
|
+
`alert: ${SINGULAR_MONITOR_KEY}=${String(
|
|
717
|
+
attributes[SINGULAR_MONITOR_KEY],
|
|
718
|
+
)}`,
|
|
719
|
+
).toBe(`alert: ${SINGULAR_MONITOR_KEY}=${MONITOR_NAME}`);
|
|
720
|
+
|
|
721
|
+
expect(
|
|
722
|
+
`alert: ${PLURAL_MONITOR_KEY} stamped=${Object.prototype.hasOwnProperty.call(
|
|
723
|
+
attributes,
|
|
724
|
+
PLURAL_MONITOR_KEY,
|
|
725
|
+
)}`,
|
|
726
|
+
).toBe(`alert: ${PLURAL_MONITOR_KEY} stamped=false`);
|
|
727
|
+
}
|
|
728
|
+
});
|
|
729
|
+
|
|
730
|
+
test("uses the same key the template's Monitor variable binds to", async () => {
|
|
731
|
+
mockAlert();
|
|
732
|
+
|
|
733
|
+
const attributeKey: string = monitorVariableAttributeKey();
|
|
734
|
+
|
|
735
|
+
await AlertService.refreshAlertMetrics({ alertId: ALERT_ID });
|
|
736
|
+
|
|
737
|
+
expect(savedMutableMetrics.length).toBeGreaterThan(0);
|
|
738
|
+
|
|
739
|
+
for (const metric of savedMutableMetrics) {
|
|
740
|
+
const attributes: JSONObject = (metric.attributes || {}) as JSONObject;
|
|
741
|
+
|
|
742
|
+
expect(
|
|
743
|
+
`${String(metric.name)}: ${attributeKey}=${String(
|
|
744
|
+
attributes[attributeKey],
|
|
745
|
+
)}`,
|
|
746
|
+
).toBe(`${String(metric.name)}: ${attributeKey}=${MONITOR_NAME}`);
|
|
747
|
+
}
|
|
748
|
+
});
|
|
749
|
+
});
|
|
750
|
+
});
|