@oneuptime/common 12.0.33 → 13.0.0
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 +117 -1
- package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
- package/Models/DatabaseModels/AlertCustomField.ts +77 -3
- package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
- package/Models/DatabaseModels/GlobalConfig.ts +12 -12
- package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
- package/Models/DatabaseModels/InventoryItem.ts +44 -1
- package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
- package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
- package/Models/DatabaseModels/NetworkDevice.ts +126 -0
- package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
- package/Models/DatabaseModels/RumApplication.ts +6 -6
- package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
- package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamMember.ts +0 -9
- package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamPermission.ts +3 -24
- package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
- package/Models/DatabaseModels/UserTelegram.ts +0 -4
- package/Scripts/benchmark-fanin-capacity.js +181 -0
- package/Server/API/TelemetryAPI.ts +1284 -164
- package/Server/API/UserNotificationSettingAPI.ts +55 -0
- package/Server/API/UserTelegramAPI.ts +48 -4
- package/Server/EnvironmentConfig.ts +82 -18
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Infrastructure/QueueWorker.ts +20 -14
- package/Server/Infrastructure/Redis.ts +8 -8
- package/Server/Infrastructure/Semaphore.ts +2 -0
- package/Server/Infrastructure/Status.ts +10 -4
- package/Server/Middleware/TelemetryIngest.ts +453 -7
- package/Server/Services/AccessTokenService.ts +1 -0
- package/Server/Services/AlertCustomFieldService.ts +98 -0
- package/Server/Services/AlertService.ts +37 -0
- package/Server/Services/ApiKeyPermissionService.ts +461 -29
- package/Server/Services/CustomFieldMappingService.ts +879 -0
- package/Server/Services/DatabaseService.ts +65 -13
- package/Server/Services/GlobalConfigService.ts +194 -0
- package/Server/Services/IncidentCustomFieldService.ts +98 -0
- package/Server/Services/IncidentService.ts +35 -0
- package/Server/Services/InventoryItemService.ts +31 -1
- package/Server/Services/MetricService.ts +194 -0
- package/Server/Services/MonitorService.ts +32 -0
- package/Server/Services/MonitorTemplateService.ts +140 -19
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +427 -66
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
- package/Server/Services/NetworkDeviceService.ts +69 -0
- package/Server/Services/ProjectService.ts +22 -0
- package/Server/Services/RoutineEmailSettingsService.ts +73 -0
- package/Server/Services/RumSessionReplayViewService.ts +104 -24
- package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
- package/Server/Services/ScheduledMaintenanceService.ts +32 -0
- package/Server/Services/TeamMemberService.ts +78 -0
- package/Server/Services/TeamPermissionService.ts +235 -3
- package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
- package/Server/Services/UserNotificationRuleService.ts +76 -25
- package/Server/Services/UserNotificationSettingService.ts +34 -6
- package/Server/Services/UserTelegramService.ts +326 -5
- package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
- package/Server/Types/Database/QueryHelper.ts +2 -0
- package/Server/Types/Database/QueryUtil.ts +56 -0
- package/Server/Types/Markdown.ts +93 -1
- package/Server/Utils/APIKey/AccessPermission.ts +5 -2
- package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
- package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
- package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +82 -17
- package/Server/Utils/DataSource/EgressGuard.ts +177 -8
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +67 -5
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +2 -2
- package/Server/Utils/FrontendEnvironment.ts +40 -0
- package/Server/Utils/LogRedaction.ts +20 -0
- package/Server/Utils/Logger.ts +11 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +394 -86
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
- package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +312 -52
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
- package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
- package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
- package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
- package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
- package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
- package/Server/Utils/SSRFProtection.ts +217 -10
- package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
- package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
- package/Server/Utils/StartServer.ts +2 -17
- package/Server/Utils/TelegramVerificationToken.ts +185 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +11 -1
- package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +83 -9
- package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
- package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
- package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
- package/Server/Utils/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +975 -95
- package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
- package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
- package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
- package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
- package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
- package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
- package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
- package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
- package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
- package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
- package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
- package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
- package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
- package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
- package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
- package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
- package/Tests/Models/InventoryItemStatus.test.ts +147 -0
- package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
- package/Tests/ResponsiveVisibility.test.ts +115 -0
- package/Tests/ResponsiveVisibility.ts +183 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +129 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
- package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
- package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
- package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
- package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
- package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
- package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +241 -0
- package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
- package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
- package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
- package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
- package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
- package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
- package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
- package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
- package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
- package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
- package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
- package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
- package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
- package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +178 -0
- package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
- package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1351 -74
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
- package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
- package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
- package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
- package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
- package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
- package/Tests/Server/Types/Markdown.test.ts +194 -1
- package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
- package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
- package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
- package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +214 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
- package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +2 -2
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +10 -3
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
- package/Tests/Server/Utils/EventLoop.test.ts +359 -0
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
- package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
- package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +590 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +659 -8
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
- package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
- package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
- package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
- package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
- package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
- package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
- package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
- package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +111 -8
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
- package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
- package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
- package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
- package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
- package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
- package/Tests/Types/JSONFunctions.test.ts +300 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
- package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
- package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
- package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
- package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
- package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
- package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
- package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
- package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
- package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
- package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
- package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
- package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
- package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
- package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
- package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
- package/Tests/Types/WebsiteRequest.test.ts +285 -3
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
- package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
- package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
- package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
- package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
- package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
- package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
- package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
- package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
- package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
- package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
- package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
- package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
- package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
- package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +133 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
- package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
- package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
- package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
- package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
- package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
- package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +719 -0
- package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
- package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
- package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
- package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
- package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
- package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
- package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
- package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
- package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
- package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
- package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -0
- package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
- package/Tests/Utils/API.test.ts +308 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
- package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
- package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
- package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
- package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
- package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
- package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
- package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
- package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
- package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
- package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
- package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
- package/Tests/Utils/ValueFormatter.test.ts +148 -0
- package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
- package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
- package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
- package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
- package/Types/Dashboard/DashboardVariable.ts +8 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/JSON.ts +4 -0
- package/Types/JSONFunctions.ts +205 -43
- package/Types/Monitor/CephAlertTemplates.ts +157 -195
- package/Types/Monitor/DockerAlertTemplates.ts +338 -128
- package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
- package/Types/Monitor/HostAlertTemplates.ts +302 -130
- package/Types/Monitor/IotAlertTemplates.ts +112 -104
- package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
- package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
- package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
- package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
- package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
- package/Types/Monitor/RumAlertTemplates.ts +46 -7
- package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
- package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
- package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
- package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
- package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
- package/Types/Rum/SessionReplay.ts +209 -0
- package/Types/Rum/SessionReplayApi.ts +722 -0
- package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
- package/Types/Rum/SessionReplayConsentMode.ts +11 -7
- package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
- package/Types/Rum/SessionReplayHealth.ts +238 -0
- package/Types/SerializableObjectDictionary.ts +4 -0
- package/Types/Telemetry/InventoryLiveness.ts +56 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
- package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
- package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
- package/Types/WebsiteRequest.ts +85 -3
- package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
- package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
- package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
- package/UI/Components/Charts/Line/LineChart.tsx +13 -2
- package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
- package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
- package/UI/Components/Charts/Utils/XAxis.ts +217 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +189 -46
- package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
- package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
- package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
- package/UI/Components/Header/Header.tsx +25 -9
- package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
- package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
- package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
- package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
- package/UI/Components/Icon/Icon.tsx +11 -0
- package/UI/Components/JSONTable/JSONTable.tsx +2 -2
- package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
- package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
- package/UI/Components/ModelTable/Column.ts +15 -0
- package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
- package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
- package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
- package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
- package/UI/Components/Table/CellClassName.ts +81 -0
- package/UI/Components/Table/TableRow.tsx +20 -14
- package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
- package/UI/Components/Table/Types/Column.ts +36 -0
- package/UI/Components/Tooltip/Tooltip.tsx +11 -1
- package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
- package/UI/Components/Workflow/NodePlacement.ts +57 -0
- package/UI/Components/Workflow/Workflow.tsx +47 -18
- package/UI/Config.ts +15 -33
- package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
- package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
- package/UI/Utils/Telemetry/Telemetry.ts +10 -8
- package/UI/esbuild-config.js +6 -0
- package/Utils/API.ts +129 -3
- package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
- package/Utils/Dashboard/LabelVariable.ts +152 -0
- package/Utils/Dashboard/VariableUrlState.ts +27 -5
- package/Utils/HTTPResponseBodyReader.ts +221 -0
- package/Utils/MetricUnitUtil.ts +34 -0
- package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
- package/Utils/Monitor/MetricValueFormatter.ts +342 -0
- package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
- package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
- package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
- package/Utils/Rum/ChunkMath.ts +106 -0
- package/Utils/Rum/SessionReplayHealth.ts +732 -0
- package/Utils/Rum/SessionReplayStringMap.ts +226 -0
- package/Utils/Schema/ModelSchema.ts +1 -0
- package/Utils/StatusPage/ResourceSearch.ts +290 -0
- package/Utils/Telemetry/OriginAllowList.ts +355 -0
- package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
- package/Utils/ValueFormatter.ts +35 -1
- package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
- package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
- package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js +34 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
- package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
- package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
- package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +769 -109
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
- package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
- package/build/dist/Server/API/UserTelegramAPI.js +28 -6
- package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +73 -14
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Infrastructure/Redis.js +8 -8
- package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Infrastructure/Status.js +10 -4
- package/build/dist/Server/Infrastructure/Status.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AccessTokenService.js +1 -0
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
- package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +34 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
- package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseService.js +58 -13
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +133 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +32 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +28 -1
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/MetricService.js +163 -0
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +29 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +116 -17
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +349 -64
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +22 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
- package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
- package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
- package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
- package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +62 -2
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamPermissionService.js +166 -3
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserTelegramService.js +257 -4
- package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +75 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
- package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +53 -18
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +54 -3
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +2 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
- package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
- package/build/dist/Server/Utils/LogRedaction.js +20 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +10 -0
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +323 -81
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +254 -48
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
- package/build/dist/Server/Utils/SSRFProtection.js +136 -9
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +3 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
- package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +9 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +70 -13
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
- package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
- package/build/dist/Types/CustomField/CustomFieldValueMapping.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
- package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/JSON.js +1 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +131 -37
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
- package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
- package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
- package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
- package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
- package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +117 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
- package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
- package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
- package/build/dist/Types/SerializableObjectDictionary.js +4 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
- package/build/dist/Types/WebsiteRequest.js +55 -3
- package/build/dist/Types/WebsiteRequest.js.map +1 -1
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +89 -8
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
- package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
- package/build/dist/UI/Components/Header/Header.js +2 -3
- package/build/dist/UI/Components/Header/Header.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
- package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +5 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
- package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
- package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
- package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
- package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
- package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
- package/build/dist/UI/Components/Table/CellClassName.js +55 -0
- package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
- package/build/dist/UI/Components/Table/TableRow.js +16 -13
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
- package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
- package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
- package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
- package/build/dist/UI/Config.js +10 -20
- package/build/dist/UI/Config.js.map +1 -1
- package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
- package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
- package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
- package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Utils/API.js +67 -5
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
- package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
- package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
- package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
- package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
- package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
- package/build/dist/Utils/MetricUnitUtil.js +26 -0
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
- package/build/dist/Utils/Rum/ChunkMath.js +76 -0
- package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
- package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
- package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
- package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
- package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
- package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
- package/build/dist/Utils/ValueFormatter.js +32 -1
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/jest.config.json +2 -0
- package/package.json +1 -1
- package/test-setup.sh +9 -9
- package/tsconfig.json +51 -11
|
@@ -5,9 +5,11 @@ import {
|
|
|
5
5
|
getKubernetesAlertTemplateById,
|
|
6
6
|
} from "../../../Types/Monitor/KubernetesAlertTemplates";
|
|
7
7
|
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
8
|
+
import { hasRecoveryDeadBand } from "./Utils/RecommendationCriteriaAssertions";
|
|
8
9
|
import MonitorStepKubernetesMonitor from "../../../Types/Monitor/MonitorStepKubernetesMonitor";
|
|
9
10
|
import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
|
|
10
11
|
import { FilterType } from "../../../Types/Monitor/CriteriaFilter";
|
|
12
|
+
import RollingTime from "../../../Types/RollingTime/RollingTime";
|
|
11
13
|
import ObjectID from "../../../Types/ObjectID";
|
|
12
14
|
|
|
13
15
|
/*
|
|
@@ -19,9 +21,18 @@ import ObjectID from "../../../Types/ObjectID";
|
|
|
19
21
|
* name (`resource.k8s.node.name`), not the bare `k8s.node.name`.
|
|
20
22
|
* OneUptime stamps OTel resource attributes with a `resource.` prefix
|
|
21
23
|
* at ingest, so the bare key would match nothing and collapse every
|
|
22
|
-
* node into one mislabeled series. The key differs per template —
|
|
23
|
-
* HPA template groups per HPA and the pod-limit
|
|
24
|
-
* so each case carries its own
|
|
24
|
+
* node into one mislabeled series. The key SET differs per template —
|
|
25
|
+
* the HPA template groups per namespace+HPA and the pod-limit
|
|
26
|
+
* templates per namespace+pod — so each case carries its own
|
|
27
|
+
* expected set, and both queries must carry exactly that set or the
|
|
28
|
+
* formula's fingerprint join silently finds nothing.
|
|
29
|
+
*
|
|
30
|
+
* Namespace is in those sets because a Kubernetes object name is
|
|
31
|
+
* unique only within a namespace, and because the set is also what
|
|
32
|
+
* the resulting alert can NAME (see SeriesLabelDisplay). Node is
|
|
33
|
+
* deliberately NOT: kubeletstats always carries it but the
|
|
34
|
+
* k8s_cluster side only gets it from the best-effort k8sattributes
|
|
35
|
+
* processor, and a key only one side carries breaks the join.
|
|
25
36
|
*
|
|
26
37
|
* 2. The aggregation differs by numerator shape:
|
|
27
38
|
* - Request utilization sums MANY container series per node, and both
|
|
@@ -31,9 +42,13 @@ import ObjectID from "../../../Types/ObjectID";
|
|
|
31
42
|
* (kubeletstats) and denominator (k8s_cluster) come from different
|
|
32
43
|
* receivers, so `Avg` on both sides gives the correct per-minute
|
|
33
44
|
* ratio regardless of each receiver's scrape count.
|
|
34
|
-
* - The saturation
|
|
35
|
-
*
|
|
36
|
-
*
|
|
45
|
+
* - The HPA saturation ratio is `Avg` (one series per HPA on both
|
|
46
|
+
* sides). The two POD-LIMIT saturation templates are no longer
|
|
47
|
+
* ratios at all — they read the kubeletstats receiver's own
|
|
48
|
+
* `k8s.pod.*_limit_utilization` family, which divides by the SUM
|
|
49
|
+
* of a pod's container limits instead of the mean a hand-built
|
|
50
|
+
* ratio against `k8s.container.*_limit` produced. They are
|
|
51
|
+
* covered by SINGLE_QUERY_SATURATION below.
|
|
37
52
|
*
|
|
38
53
|
* 3. The criteria reference the FORMULA alias (the computed percentage),
|
|
39
54
|
* not a raw query alias.
|
|
@@ -53,7 +68,19 @@ interface RatioTemplateCase {
|
|
|
53
68
|
resultAlias: string;
|
|
54
69
|
aggregation: MetricsAggregationType;
|
|
55
70
|
threshold: number;
|
|
56
|
-
|
|
71
|
+
/*
|
|
72
|
+
* The full group-by key SET, in order. Both queries must carry exactly
|
|
73
|
+
* this, or the two halves of the ratio hash to fingerprints that never
|
|
74
|
+
* meet and the formula silently evaluates against an empty operand.
|
|
75
|
+
*/
|
|
76
|
+
groupBy: Array<string>;
|
|
77
|
+
/*
|
|
78
|
+
* Only set when the template overrides the builder's default
|
|
79
|
+
* `(num / den) * 100`. Node disk usage is the one case: kubeletstats
|
|
80
|
+
* gives no node capacity series this repo ingests, so the percentage
|
|
81
|
+
* is `used / (used + available)`.
|
|
82
|
+
*/
|
|
83
|
+
formula?: string | undefined;
|
|
57
84
|
}
|
|
58
85
|
|
|
59
86
|
const RATIO_TEMPLATES: Array<RatioTemplateCase> = [
|
|
@@ -67,7 +94,7 @@ const RATIO_TEMPLATES: Array<RatioTemplateCase> = [
|
|
|
67
94
|
resultAlias: "node_cpu_request_utilization",
|
|
68
95
|
aggregation: MetricsAggregationType.Sum,
|
|
69
96
|
threshold: 90,
|
|
70
|
-
groupBy: "resource.k8s.node.name",
|
|
97
|
+
groupBy: ["resource.k8s.node.name"],
|
|
71
98
|
},
|
|
72
99
|
{
|
|
73
100
|
id: "k8s-node-memory-request-utilization",
|
|
@@ -78,7 +105,26 @@ const RATIO_TEMPLATES: Array<RatioTemplateCase> = [
|
|
|
78
105
|
resultAlias: "node_memory_request_utilization",
|
|
79
106
|
aggregation: MetricsAggregationType.Sum,
|
|
80
107
|
threshold: 90,
|
|
81
|
-
groupBy: "resource.k8s.node.name",
|
|
108
|
+
groupBy: ["resource.k8s.node.name"],
|
|
109
|
+
},
|
|
110
|
+
/*
|
|
111
|
+
* Node disk fill — Avg/Avg, and the ONE template with a non-default
|
|
112
|
+
* formula. `k8s.node.filesystem.usage` is bytes, so comparing it to 90
|
|
113
|
+
* fired on every node forever; the percentage is built from the
|
|
114
|
+
* companion `k8s.node.filesystem.available` on the same kubeletstats
|
|
115
|
+
* node scrape.
|
|
116
|
+
*/
|
|
117
|
+
{
|
|
118
|
+
id: "k8s-high-disk-usage",
|
|
119
|
+
numerator: "k8s.node.filesystem.usage",
|
|
120
|
+
denominator: "k8s.node.filesystem.available",
|
|
121
|
+
numAlias: "used_disk",
|
|
122
|
+
denAlias: "avail_disk",
|
|
123
|
+
resultAlias: "disk_usage",
|
|
124
|
+
aggregation: MetricsAggregationType.Avg,
|
|
125
|
+
threshold: 90,
|
|
126
|
+
groupBy: ["resource.k8s.node.name"],
|
|
127
|
+
formula: "(used_disk / (used_disk + avail_disk)) * 100",
|
|
82
128
|
},
|
|
83
129
|
// Usage utilization — Avg/Avg (one series per node, cross-receiver).
|
|
84
130
|
{
|
|
@@ -90,7 +136,7 @@ const RATIO_TEMPLATES: Array<RatioTemplateCase> = [
|
|
|
90
136
|
resultAlias: "node_cpu_utilization",
|
|
91
137
|
aggregation: MetricsAggregationType.Avg,
|
|
92
138
|
threshold: 90,
|
|
93
|
-
groupBy: "resource.k8s.node.name",
|
|
139
|
+
groupBy: ["resource.k8s.node.name"],
|
|
94
140
|
},
|
|
95
141
|
{
|
|
96
142
|
id: "k8s-high-memory",
|
|
@@ -101,17 +147,19 @@ const RATIO_TEMPLATES: Array<RatioTemplateCase> = [
|
|
|
101
147
|
resultAlias: "node_memory_utilization",
|
|
102
148
|
aggregation: MetricsAggregationType.Avg,
|
|
103
149
|
threshold: 85,
|
|
104
|
-
groupBy: "resource.k8s.node.name",
|
|
150
|
+
groupBy: ["resource.k8s.node.name"],
|
|
105
151
|
},
|
|
106
152
|
/*
|
|
107
|
-
* Autoscaling
|
|
153
|
+
* Autoscaling saturation — Avg/Avg, and NOT keyed on the node.
|
|
108
154
|
*
|
|
109
|
-
* The HPA ratio groups per HPA object
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
* silently collapse every HPA (or every pod) into one mislabeled
|
|
155
|
+
* The HPA ratio groups per namespace+HPA object. Locking the group-by
|
|
156
|
+
* set here is the point of this case: it was the first ratio template in
|
|
157
|
+
* this file not keyed on `resource.k8s.node.name`, so a copy-paste of
|
|
158
|
+
* the node key would silently collapse every HPA into one mislabeled
|
|
114
159
|
* series that still renders and still alerts.
|
|
160
|
+
*
|
|
161
|
+
* The two POD-LIMIT saturation templates used to live here as ratios.
|
|
162
|
+
* They are single-query now — see SINGLE_QUERY_SATURATION.
|
|
115
163
|
*/
|
|
116
164
|
{
|
|
117
165
|
id: "k8s-hpa-at-max-replicas",
|
|
@@ -122,29 +170,51 @@ const RATIO_TEMPLATES: Array<RatioTemplateCase> = [
|
|
|
122
170
|
resultAlias: "hpa_replica_saturation",
|
|
123
171
|
aggregation: MetricsAggregationType.Avg,
|
|
124
172
|
threshold: 90,
|
|
125
|
-
groupBy: "resource.k8s.hpa.name",
|
|
173
|
+
groupBy: ["resource.k8s.namespace.name", "resource.k8s.hpa.name"],
|
|
126
174
|
},
|
|
175
|
+
];
|
|
176
|
+
|
|
177
|
+
/*
|
|
178
|
+
* The two container-limit saturation templates, which read the
|
|
179
|
+
* kubeletstats receiver's OWN saturation family instead of rebuilding it.
|
|
180
|
+
*
|
|
181
|
+
* They were ratios of `k8s.pod.<x>.usage` (kubeletstats, one series per
|
|
182
|
+
* POD) over `k8s.container.<x>_limit` (k8s_cluster, one series per
|
|
183
|
+
* CONTAINER) joined by series fingerprint across two independent scrape
|
|
184
|
+
* cycles. That had two defects this table exists to keep fixed:
|
|
185
|
+
*
|
|
186
|
+
* - `Avg` over a per-container denominator takes the MEAN container
|
|
187
|
+
* limit, not their sum, so every pod with a sidecar over-reported its
|
|
188
|
+
* saturation by roughly its container count.
|
|
189
|
+
* - a cross-receiver fingerprint join fails SILENTLY: the formula
|
|
190
|
+
* evaluates against an empty operand and the monitor simply stops
|
|
191
|
+
* alerting.
|
|
192
|
+
*/
|
|
193
|
+
interface SingleQuerySaturationCase {
|
|
194
|
+
id: string;
|
|
195
|
+
metricName: string;
|
|
196
|
+
metricAlias: string;
|
|
197
|
+
aggregation: MetricsAggregationType;
|
|
198
|
+
threshold: number;
|
|
199
|
+
groupBy: Array<string>;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const SINGLE_QUERY_SATURATION: Array<SingleQuerySaturationCase> = [
|
|
127
203
|
{
|
|
128
204
|
id: "k8s-pod-memory-limit-saturation",
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
denAlias: "limit_mem",
|
|
133
|
-
resultAlias: "pod_memory_limit_saturation",
|
|
134
|
-
aggregation: MetricsAggregationType.Avg,
|
|
205
|
+
metricName: "k8s.pod.memory_limit_utilization",
|
|
206
|
+
metricAlias: "pod_memory_limit_saturation",
|
|
207
|
+
aggregation: MetricsAggregationType.Max,
|
|
135
208
|
threshold: 90,
|
|
136
|
-
groupBy: "resource.k8s.pod.name",
|
|
209
|
+
groupBy: ["resource.k8s.namespace.name", "resource.k8s.pod.name"],
|
|
137
210
|
},
|
|
138
211
|
{
|
|
139
212
|
id: "k8s-pod-cpu-limit-saturation",
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
denAlias: "limit_cpu",
|
|
144
|
-
resultAlias: "pod_cpu_limit_saturation",
|
|
145
|
-
aggregation: MetricsAggregationType.Avg,
|
|
213
|
+
metricName: "k8s.pod.cpu_limit_utilization",
|
|
214
|
+
metricAlias: "pod_cpu_limit_saturation",
|
|
215
|
+
aggregation: MetricsAggregationType.Max,
|
|
146
216
|
threshold: 90,
|
|
147
|
-
groupBy: "resource.k8s.pod.name",
|
|
217
|
+
groupBy: ["resource.k8s.namespace.name", "resource.k8s.pod.name"],
|
|
148
218
|
},
|
|
149
219
|
];
|
|
150
220
|
|
|
@@ -225,19 +295,21 @@ describe("KubernetesAlertTemplates - per-series ratio templates", () => {
|
|
|
225
295
|
* Decision (1): group by the resource-prefixed attribute on BOTH
|
|
226
296
|
* queries so the per-series fingerprints line up for the formula join.
|
|
227
297
|
*/
|
|
228
|
-
expect(numerator.metricQueryData.groupByAttributeKeys).toEqual(
|
|
298
|
+
expect(numerator.metricQueryData.groupByAttributeKeys).toEqual(
|
|
229
299
|
tc.groupBy,
|
|
230
|
-
|
|
231
|
-
expect(denominator.metricQueryData.groupByAttributeKeys).toEqual(
|
|
300
|
+
);
|
|
301
|
+
expect(denominator.metricQueryData.groupByAttributeKeys).toEqual(
|
|
232
302
|
tc.groupBy,
|
|
233
|
-
|
|
303
|
+
);
|
|
234
304
|
|
|
235
|
-
|
|
236
|
-
|
|
305
|
+
for (const key of tc.groupBy) {
|
|
306
|
+
// The `resource.` prefix is load-bearing — a bare OTel key matches nothing.
|
|
307
|
+
expect(key.startsWith("resource.")).toBe(true);
|
|
308
|
+
}
|
|
237
309
|
|
|
238
310
|
// Formula divides numerator by denominator and scales to a percentage.
|
|
239
311
|
expect(formulaConfigs[0].metricFormulaData.metricFormula).toBe(
|
|
240
|
-
`(${tc.numAlias} / ${tc.denAlias}) * 100`,
|
|
312
|
+
tc.formula || `(${tc.numAlias} / ${tc.denAlias}) * 100`,
|
|
241
313
|
);
|
|
242
314
|
|
|
243
315
|
/*
|
|
@@ -268,7 +340,7 @@ describe("KubernetesAlertTemplates - per-series ratio templates", () => {
|
|
|
268
340
|
};
|
|
269
341
|
|
|
270
342
|
test.each(RATIO_TEMPLATES)(
|
|
271
|
-
"$id unhealthy/healthy criteria
|
|
343
|
+
"$id unhealthy/healthy criteria leave a recovery dead band around $threshold",
|
|
272
344
|
(tc: RatioTemplateCase) => {
|
|
273
345
|
const template: KubernetesAlertTemplate | undefined =
|
|
274
346
|
getKubernetesAlertTemplateById(tc.id);
|
|
@@ -281,11 +353,30 @@ describe("KubernetesAlertTemplates - per-series ratio templates", () => {
|
|
|
281
353
|
const offlineFilter: any = offline.data.filters[0];
|
|
282
354
|
const onlineFilter: any = online.data.filters[0];
|
|
283
355
|
|
|
284
|
-
// Same metric
|
|
356
|
+
// Same metric; the comparison direction AND the threshold differ.
|
|
285
357
|
expect(onlineFilter.metricMonitorOptions.metricAlias).toBe(
|
|
286
358
|
tc.resultAlias,
|
|
287
359
|
);
|
|
288
|
-
|
|
360
|
+
/*
|
|
361
|
+
* The healthy criteria recovers at a threshold strictly INSIDE the
|
|
362
|
+
* firing one, so a metric hovering at the boundary cannot satisfy
|
|
363
|
+
* both on consecutive evaluations. This assertion used to be
|
|
364
|
+
* `expect(onlineFilter.value).toBe(tc.threshold)` — the two criteria
|
|
365
|
+
* exactly partitioned the range, which is the flapping configuration
|
|
366
|
+
* this suite existed to lock in.
|
|
367
|
+
*/
|
|
368
|
+
expect(
|
|
369
|
+
hasRecoveryDeadBand(
|
|
370
|
+
{
|
|
371
|
+
filterType: offlineFilter.filterType,
|
|
372
|
+
value: offlineFilter.value as number,
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
filterType: onlineFilter.filterType,
|
|
376
|
+
value: onlineFilter.value as number,
|
|
377
|
+
},
|
|
378
|
+
),
|
|
379
|
+
).toBe(true);
|
|
289
380
|
|
|
290
381
|
expect(COMPLEMENT_OF[offlineFilter.filterType]).toBe(
|
|
291
382
|
onlineFilter.filterType,
|
|
@@ -358,4 +449,507 @@ describe("KubernetesAlertTemplates - autoscaling & limit saturation", () => {
|
|
|
358
449
|
|
|
359
450
|
expect(new Set(ids).size).toBe(ids.length);
|
|
360
451
|
});
|
|
452
|
+
|
|
453
|
+
test.each(SINGLE_QUERY_SATURATION)(
|
|
454
|
+
"$id reads the receiver's own saturation metric, not a hand-built ratio",
|
|
455
|
+
(tc: SingleQuerySaturationCase) => {
|
|
456
|
+
const monitor: MonitorStepKubernetesMonitor = getKubernetesMonitor(
|
|
457
|
+
getStep(tc.id),
|
|
458
|
+
);
|
|
459
|
+
|
|
460
|
+
const queryConfigs: Array<any> = monitor.metricViewConfig
|
|
461
|
+
.queryConfigs as Array<any>;
|
|
462
|
+
const formulaConfigs: Array<any> = monitor.metricViewConfig
|
|
463
|
+
.formulaConfigs as Array<any>;
|
|
464
|
+
|
|
465
|
+
/*
|
|
466
|
+
* ONE query and NO formula. A second query here means someone
|
|
467
|
+
* reintroduced the cross-receiver ratio, whose fingerprint join
|
|
468
|
+
* fails silently and whose Avg denominator is the MEAN of a pod's
|
|
469
|
+
* container limits rather than their sum.
|
|
470
|
+
*/
|
|
471
|
+
expect(queryConfigs).toHaveLength(1);
|
|
472
|
+
expect(formulaConfigs).toHaveLength(0);
|
|
473
|
+
|
|
474
|
+
const [query] = queryConfigs;
|
|
475
|
+
|
|
476
|
+
expect(query.metricQueryData.filterData.metricName).toBe(tc.metricName);
|
|
477
|
+
expect(query.metricQueryData.filterData.aggegationType).toBe(
|
|
478
|
+
tc.aggregation,
|
|
479
|
+
);
|
|
480
|
+
expect(query.metricQueryData.groupByAttributeKeys).toEqual(tc.groupBy);
|
|
481
|
+
|
|
482
|
+
/*
|
|
483
|
+
* THE assertion that keeps this template alerting at all.
|
|
484
|
+
*
|
|
485
|
+
* kubeletstats reports the `*_limit_utilization` family with UCUM
|
|
486
|
+
* unit "1" — a 0-1 fraction. MetricUnitUtil puts "1" in the percent
|
|
487
|
+
* family with `toCanonical: 100`, and MetricResultUnitConverter
|
|
488
|
+
* (invoked on the monitor path before the criteria are compared)
|
|
489
|
+
* only rescales when the alias declares a display unit. Drop this
|
|
490
|
+
* "%" and the values stay in [0, 1], the "> 90" threshold below is
|
|
491
|
+
* never reachable, and the monitor goes SILENT rather than loud.
|
|
492
|
+
*/
|
|
493
|
+
expect(query.metricAliasData.legendUnit).toBe("%");
|
|
494
|
+
|
|
495
|
+
const [offline, online] = getCriteriaInstances(tc.id);
|
|
496
|
+
const offlineFilter: any = offline.data.filters[0];
|
|
497
|
+
const onlineFilter: any = online.data.filters[0];
|
|
498
|
+
|
|
499
|
+
// The criteria compare the query alias — there is no formula alias now.
|
|
500
|
+
expect(offlineFilter.metricMonitorOptions.metricAlias).toBe(
|
|
501
|
+
tc.metricAlias,
|
|
502
|
+
);
|
|
503
|
+
expect(onlineFilter.metricMonitorOptions.metricAlias).toBe(
|
|
504
|
+
tc.metricAlias,
|
|
505
|
+
);
|
|
506
|
+
expect(offlineFilter.value).toBe(tc.threshold);
|
|
507
|
+
|
|
508
|
+
/*
|
|
509
|
+
* Dead-band coverage these two ids used to get from RATIO_TEMPLATES.
|
|
510
|
+
* Removing them from that table must not quietly drop it.
|
|
511
|
+
*/
|
|
512
|
+
expect(
|
|
513
|
+
hasRecoveryDeadBand(
|
|
514
|
+
{
|
|
515
|
+
filterType: offlineFilter.filterType,
|
|
516
|
+
value: offlineFilter.value as number,
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
filterType: onlineFilter.filterType,
|
|
520
|
+
value: onlineFilter.value as number,
|
|
521
|
+
},
|
|
522
|
+
),
|
|
523
|
+
).toBe(true);
|
|
524
|
+
},
|
|
525
|
+
);
|
|
526
|
+
|
|
527
|
+
test("the memory saturation alert does not promise an OOMKill the metric cannot support", () => {
|
|
528
|
+
/*
|
|
529
|
+
* `k8s.pod.memory_limit_utilization` divides the kubelet's pod memory
|
|
530
|
+
* figure, which INCLUDES reclaimable page cache, by the pod's limit.
|
|
531
|
+
* The kubelet's kill decision is on working set, so a file-heavy
|
|
532
|
+
* workload can sit at 95% here indefinitely without ever being
|
|
533
|
+
* OOMKilled. The old copy asserted the opposite as a certainty.
|
|
534
|
+
*/
|
|
535
|
+
const description: string = getIncidentDescription(
|
|
536
|
+
"k8s-pod-memory-limit-saturation",
|
|
537
|
+
);
|
|
538
|
+
|
|
539
|
+
expect(description).not.toContain(
|
|
540
|
+
"OOMKills a container the moment it crosses its limit",
|
|
541
|
+
);
|
|
542
|
+
expect(description).not.toContain("immediately preceding a restart");
|
|
543
|
+
});
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
/*
|
|
547
|
+
* ---------------------------------------------------------------------
|
|
548
|
+
* Regression guards for template/metric mismatches.
|
|
549
|
+
*
|
|
550
|
+
* Every test below is named for a specific shipped defect. Each one fails
|
|
551
|
+
* if that defect is reintroduced, not merely if a value changes.
|
|
552
|
+
* ---------------------------------------------------------------------
|
|
553
|
+
*/
|
|
554
|
+
|
|
555
|
+
function getStep(id: string): MonitorStep {
|
|
556
|
+
const template: KubernetesAlertTemplate | undefined =
|
|
557
|
+
getKubernetesAlertTemplateById(id);
|
|
558
|
+
|
|
559
|
+
if (!template) {
|
|
560
|
+
throw new Error(`Kubernetes alert template ${id} is not registered`);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
return template.getMonitorStep(buildArgs());
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
function getCriteriaInstances(id: string): Array<any> {
|
|
567
|
+
return getStep(id).data?.monitorCriteria.data
|
|
568
|
+
?.monitorCriteriaInstanceArray as Array<any>;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
function getIncidentDescription(id: string): string {
|
|
572
|
+
const [offline] = getCriteriaInstances(id);
|
|
573
|
+
|
|
574
|
+
return offline.data.incidents[0].description as string;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
function getQueryConfigs(id: string): Array<any> {
|
|
578
|
+
return getKubernetesMonitor(getStep(id)).metricViewConfig
|
|
579
|
+
.queryConfigs as Array<any>;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
describe("KubernetesAlertTemplates - metric/criteria agreement", () => {
|
|
583
|
+
/*
|
|
584
|
+
* BUG: k8s-high-disk-usage handed `k8s.node.filesystem.usage` — declared
|
|
585
|
+
* `unit: "bytes"` in KubernetesMetricCatalog, and never converted, since
|
|
586
|
+
* the query carried no legendUnit — straight to a `> 90` comparison. So
|
|
587
|
+
* "more than 90 BYTES used" was true for every node on its very first
|
|
588
|
+
* evaluation, and the healthy criterion ("90 bytes or less") was
|
|
589
|
+
* unreachable: a permanently red monitor with an incident that could
|
|
590
|
+
* never resolve.
|
|
591
|
+
*/
|
|
592
|
+
test("k8s-high-disk-usage never compares raw bytes to a percentage threshold", () => {
|
|
593
|
+
const monitor: MonitorStepKubernetesMonitor = getKubernetesMonitor(
|
|
594
|
+
getStep("k8s-high-disk-usage"),
|
|
595
|
+
);
|
|
596
|
+
|
|
597
|
+
const queryConfigs: Array<any> = monitor.metricViewConfig
|
|
598
|
+
.queryConfigs as Array<any>;
|
|
599
|
+
const formulaConfigs: Array<any> = monitor.metricViewConfig
|
|
600
|
+
.formulaConfigs as Array<any>;
|
|
601
|
+
|
|
602
|
+
// A percentage has to be COMPUTED — there is no ready-made series.
|
|
603
|
+
expect(queryConfigs).toHaveLength(2);
|
|
604
|
+
expect(formulaConfigs).toHaveLength(1);
|
|
605
|
+
|
|
606
|
+
/*
|
|
607
|
+
* There is no `k8s.node.filesystem.capacity` anywhere in this repo, so
|
|
608
|
+
* the denominator is `usage + available` — the same figure `df`
|
|
609
|
+
* reports as Use%, and the same one the cluster dashboard charts.
|
|
610
|
+
*/
|
|
611
|
+
expect(formulaConfigs[0].metricFormulaData.metricFormula).toBe(
|
|
612
|
+
"(used_disk / (used_disk + avail_disk)) * 100",
|
|
613
|
+
);
|
|
614
|
+
expect(formulaConfigs[0].metricAliasData.legendUnit).toBe("%");
|
|
615
|
+
|
|
616
|
+
const [offline, online] = getCriteriaInstances("k8s-high-disk-usage");
|
|
617
|
+
|
|
618
|
+
/*
|
|
619
|
+
* The threshold must be compared against the FORMULA's alias. Pointing
|
|
620
|
+
* it at a raw query alias is exactly how the bytes-vs-90 comparison
|
|
621
|
+
* happened.
|
|
622
|
+
*/
|
|
623
|
+
for (const filter of [offline.data.filters[0], online.data.filters[0]]) {
|
|
624
|
+
expect(filter.metricMonitorOptions.metricAlias).toBe("disk_usage");
|
|
625
|
+
expect(
|
|
626
|
+
queryConfigs.map((q: any) => {
|
|
627
|
+
return q.metricAliasData.metricVariable;
|
|
628
|
+
}),
|
|
629
|
+
).not.toContain(filter.metricMonitorOptions.metricAlias);
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
/*
|
|
634
|
+
* BUG: k8s-pod-pending filtered on `attributes: { "resource.k8s.pod.phase":
|
|
635
|
+
* "Pending" }`. Nothing emits that attribute — not the k8s_cluster
|
|
636
|
+
* receiver, not the agent's k8sattributes processor, not the ingest path
|
|
637
|
+
* — and the worker copies the map verbatim into the ClickHouse
|
|
638
|
+
* predicate. The query matched ZERO rows forever: the monitor never
|
|
639
|
+
* fired, never resolved, and never reported that it was watching
|
|
640
|
+
* nothing.
|
|
641
|
+
*/
|
|
642
|
+
describe("k8s-pod-pending", () => {
|
|
643
|
+
test("carries no attribute filter", () => {
|
|
644
|
+
const [query] = getQueryConfigs("k8s-pod-pending");
|
|
645
|
+
|
|
646
|
+
expect(query.metricQueryData.filterData.attributes).toEqual({});
|
|
647
|
+
});
|
|
648
|
+
|
|
649
|
+
test("selects the Pending phase by VALUE, not by a label that does not exist", () => {
|
|
650
|
+
/*
|
|
651
|
+
* `k8s.pod.phase` encodes the phase in the value: 1 = Pending,
|
|
652
|
+
* 2 = Running, 3 = Succeeded, 4 = Failed, 5 = Unknown.
|
|
653
|
+
*/
|
|
654
|
+
const [offline, online] = getCriteriaInstances("k8s-pod-pending");
|
|
655
|
+
const offlineFilter: any = offline.data.filters[0];
|
|
656
|
+
const onlineFilter: any = online.data.filters[0];
|
|
657
|
+
|
|
658
|
+
expect(offlineFilter.metricMonitorOptions.metricAlias).toBe(
|
|
659
|
+
"min_pod_phase",
|
|
660
|
+
);
|
|
661
|
+
expect(offlineFilter.filterType).toBe(FilterType.EqualTo);
|
|
662
|
+
expect(offlineFilter.value).toBe(1);
|
|
663
|
+
|
|
664
|
+
/*
|
|
665
|
+
* NotEqualTo, not GreaterThan. An equality comparison gets NO
|
|
666
|
+
* recovery dead band (getRecoveryThreshold returns undefined), so
|
|
667
|
+
* the recovery value stays exactly 1. GreaterThan would complement
|
|
668
|
+
* to LessThanOrEqualTo and derive 1.1 — a fractional edge on a
|
|
669
|
+
* metric whose values are an enum.
|
|
670
|
+
*/
|
|
671
|
+
expect(onlineFilter.metricMonitorOptions.metricAlias).toBe(
|
|
672
|
+
"min_pod_phase",
|
|
673
|
+
);
|
|
674
|
+
expect(onlineFilter.filterType).toBe(FilterType.NotEqualTo);
|
|
675
|
+
expect(onlineFilter.value).toBe(1);
|
|
676
|
+
});
|
|
677
|
+
|
|
678
|
+
test("aggregates with Min, not Sum", () => {
|
|
679
|
+
/*
|
|
680
|
+
* Pending is the LOWEST phase code, so a cluster-wide Min is exactly
|
|
681
|
+
* 1 when at least one pod is Pending. `Sum` also walked into the
|
|
682
|
+
* trap DashboardTemplates.ts documents: a per-resource gauge
|
|
683
|
+
* re-emitted every scrape sums to (pods x scrapes).
|
|
684
|
+
*/
|
|
685
|
+
const [query] = getQueryConfigs("k8s-pod-pending");
|
|
686
|
+
|
|
687
|
+
expect(query.metricQueryData.filterData.aggegationType).toBe(
|
|
688
|
+
MetricsAggregationType.Min,
|
|
689
|
+
);
|
|
690
|
+
expect(query.metricQueryData.filterData.metricName).toBe("k8s.pod.phase");
|
|
691
|
+
});
|
|
692
|
+
});
|
|
693
|
+
|
|
694
|
+
/*
|
|
695
|
+
* BUG: k8s-apiserver-throttling summed `apiserver_dropped_requests_total`,
|
|
696
|
+
* a cumulative Prometheus counter, against `> 0`. Nothing in the shipped
|
|
697
|
+
* pipeline converts counters to deltas (no cumulativetodelta processor,
|
|
698
|
+
* no Rate/Delta member on AggregationType or on
|
|
699
|
+
* CompareCriteria.reduceWindow), so every sample was the API server's
|
|
700
|
+
* LIFETIME total. One throttled request since the process started pinned
|
|
701
|
+
* the monitor Offline forever.
|
|
702
|
+
*/
|
|
703
|
+
test("k8s-apiserver-throttling does not alert on a cumulative counter", () => {
|
|
704
|
+
const [query] = getQueryConfigs("k8s-apiserver-throttling");
|
|
705
|
+
const metricName: string = query.metricQueryData.filterData
|
|
706
|
+
.metricName as string;
|
|
707
|
+
|
|
708
|
+
expect(metricName).toBe("apiserver_current_inflight_requests");
|
|
709
|
+
expect(metricName.endsWith("_total")).toBe(false);
|
|
710
|
+
expect(query.metricQueryData.filterData.aggegationType).toBe(
|
|
711
|
+
MetricsAggregationType.Max,
|
|
712
|
+
);
|
|
713
|
+
|
|
714
|
+
const [offline, online] = getCriteriaInstances("k8s-apiserver-throttling");
|
|
715
|
+
const offlineFilter: any = offline.data.filters[0];
|
|
716
|
+
const onlineFilter: any = online.data.filters[0];
|
|
717
|
+
|
|
718
|
+
/*
|
|
719
|
+
* GreaterThanOrEqualTo, not GreaterThan. This gauge counts ADMITTED
|
|
720
|
+
* concurrency, so it is bounded above by the API server's own
|
|
721
|
+
* admission limit and saturates AT it. 200 is the default
|
|
722
|
+
* --max-mutating-requests-inflight exactly, so "> 200" would ask the
|
|
723
|
+
* mutating queue to exceed its own ceiling and never fire.
|
|
724
|
+
*/
|
|
725
|
+
expect(offlineFilter.filterType).toBe(FilterType.GreaterThanOrEqualTo);
|
|
726
|
+
expect(offlineFilter.value).toBe(200);
|
|
727
|
+
expect(onlineFilter.filterType).toBe(FilterType.LessThan);
|
|
728
|
+
// 10% dead band inside the firing threshold.
|
|
729
|
+
expect(onlineFilter.value).toBe(180);
|
|
730
|
+
});
|
|
731
|
+
|
|
732
|
+
/*
|
|
733
|
+
* Generalisation of the counter bug above: nothing in the query path can
|
|
734
|
+
* differentiate a monotonic counter, so a `_total` series compared
|
|
735
|
+
* against a fixed threshold can never satisfy its own recovery
|
|
736
|
+
* criterion. If a future template needs one, it needs a Rate/Delta
|
|
737
|
+
* aggregation first.
|
|
738
|
+
*/
|
|
739
|
+
test("no template thresholds a cumulative `_total` counter", () => {
|
|
740
|
+
for (const template of getAllKubernetesAlertTemplates()) {
|
|
741
|
+
for (const query of getQueryConfigs(template.id)) {
|
|
742
|
+
const metricName: string = query.metricQueryData.filterData
|
|
743
|
+
.metricName as string;
|
|
744
|
+
|
|
745
|
+
expect(`${template.id}:${metricName}`).not.toMatch(/_total$/);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
});
|
|
749
|
+
|
|
750
|
+
/*
|
|
751
|
+
* BUG: every template's query attributes are copied verbatim into the
|
|
752
|
+
* ClickHouse predicate, so an attribute key nothing stamps silently
|
|
753
|
+
* reduces the query to zero rows. No template needs one today; a future
|
|
754
|
+
* one must add its key here deliberately, having checked the agent
|
|
755
|
+
* actually emits it.
|
|
756
|
+
*/
|
|
757
|
+
test("no template filters on an attribute the agent does not stamp", () => {
|
|
758
|
+
const ALLOWED_ATTRIBUTE_KEYS: Set<string> = new Set<string>();
|
|
759
|
+
|
|
760
|
+
for (const template of getAllKubernetesAlertTemplates()) {
|
|
761
|
+
for (const query of getQueryConfigs(template.id)) {
|
|
762
|
+
const attributes: Record<string, string> =
|
|
763
|
+
query.metricQueryData.filterData.attributes || {};
|
|
764
|
+
|
|
765
|
+
for (const key of Object.keys(attributes)) {
|
|
766
|
+
expect(`${template.id} filters on ${key}`).toBe(
|
|
767
|
+
ALLOWED_ATTRIBUTE_KEYS.has(key)
|
|
768
|
+
? `${template.id} filters on ${key}`
|
|
769
|
+
: "an attribute key on the allowlist",
|
|
770
|
+
);
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
/*
|
|
777
|
+
* BUG: k8s-crashloopbackoff's criteria copy said restarts "exceeds 5 in
|
|
778
|
+
* the monitoring window". `k8s.container.restarts` is
|
|
779
|
+
* containerStatus.restartCount — monotonic for the pod object's life —
|
|
780
|
+
* and `Max` over a monotonic series is just the counter, so no per-window
|
|
781
|
+
* count is computed anywhere.
|
|
782
|
+
*/
|
|
783
|
+
test("k8s-crashloopbackoff does not claim a per-window restart count", () => {
|
|
784
|
+
const [offline] = getCriteriaInstances("k8s-crashloopbackoff");
|
|
785
|
+
const [query] = getQueryConfigs("k8s-crashloopbackoff");
|
|
786
|
+
|
|
787
|
+
// The configuration that makes the old wording false is still in place.
|
|
788
|
+
expect(query.metricQueryData.filterData.metricName).toBe(
|
|
789
|
+
"k8s.container.restarts",
|
|
790
|
+
);
|
|
791
|
+
expect(query.metricQueryData.filterData.aggegationType).toBe(
|
|
792
|
+
MetricsAggregationType.Max,
|
|
793
|
+
);
|
|
794
|
+
|
|
795
|
+
expect(offline.data.description).not.toContain("in the monitoring window");
|
|
796
|
+
expect(offline.data.description).toContain("cumulative");
|
|
797
|
+
});
|
|
798
|
+
|
|
799
|
+
/*
|
|
800
|
+
* BUG: k8s-daemonset-unavailable queries
|
|
801
|
+
* `k8s.daemonset.misscheduled_nodes` — which KubernetesMetricCatalog
|
|
802
|
+
* defines as "nodes running a daemon pod that should NOT be running one"
|
|
803
|
+
* — while its name, alias, description, incident title and criteria name
|
|
804
|
+
* all said "unavailable", i.e. the opposite condition. An engineer paged
|
|
805
|
+
* for a stale node selector went looking for a missing DaemonSet.
|
|
806
|
+
*
|
|
807
|
+
* The `id` deliberately keeps the old word: it is the stable key the
|
|
808
|
+
* recommendation diff matches on.
|
|
809
|
+
*/
|
|
810
|
+
test("the DaemonSet template's copy matches the metric it queries", () => {
|
|
811
|
+
const template: KubernetesAlertTemplate | undefined =
|
|
812
|
+
getKubernetesAlertTemplateById("k8s-daemonset-unavailable");
|
|
813
|
+
const [query] = getQueryConfigs("k8s-daemonset-unavailable");
|
|
814
|
+
const [offline] = getCriteriaInstances("k8s-daemonset-unavailable");
|
|
815
|
+
|
|
816
|
+
expect(query.metricQueryData.filterData.metricName).toBe(
|
|
817
|
+
"k8s.daemonset.misscheduled_nodes",
|
|
818
|
+
);
|
|
819
|
+
|
|
820
|
+
for (const text of [
|
|
821
|
+
template!.name,
|
|
822
|
+
template!.description,
|
|
823
|
+
offline.data.incidents[0].title as string,
|
|
824
|
+
offline.data.name as string,
|
|
825
|
+
]) {
|
|
826
|
+
expect(text.toLowerCase()).not.toContain("unavailable");
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
// And the alias no longer misnames the value either.
|
|
830
|
+
expect(query.metricAliasData.metricVariable).toBe("misscheduled_nodes");
|
|
831
|
+
expect(offline.data.filters[0].metricMonitorOptions.metricAlias).toBe(
|
|
832
|
+
"misscheduled_nodes",
|
|
833
|
+
);
|
|
834
|
+
});
|
|
835
|
+
|
|
836
|
+
/*
|
|
837
|
+
* BUG: the three control-plane templates are offered in the picker but
|
|
838
|
+
* collect nothing on a default agent install — the chart's prometheus
|
|
839
|
+
* receiver and all three scrape jobs are wrapped in
|
|
840
|
+
* `{{- if .Values.controlPlane.enabled }}`, and values.yaml ships
|
|
841
|
+
* `controlPlane: { enabled: false }`. A one-click monitor that is never
|
|
842
|
+
* Met, with no indication it is inert.
|
|
843
|
+
*/
|
|
844
|
+
test("every ControlPlane template says it needs the control-plane scrape", () => {
|
|
845
|
+
const controlPlaneTemplates: Array<KubernetesAlertTemplate> =
|
|
846
|
+
getAllKubernetesAlertTemplates().filter((t: KubernetesAlertTemplate) => {
|
|
847
|
+
return t.category === "ControlPlane";
|
|
848
|
+
});
|
|
849
|
+
|
|
850
|
+
expect(controlPlaneTemplates.length).toBeGreaterThan(0);
|
|
851
|
+
|
|
852
|
+
for (const template of controlPlaneTemplates) {
|
|
853
|
+
expect(template.description).toContain("controlPlane.enabled");
|
|
854
|
+
}
|
|
855
|
+
});
|
|
856
|
+
|
|
857
|
+
/*
|
|
858
|
+
* The recommendation card renders `template.description` as raw JSX
|
|
859
|
+
* text, not markdown (KubernetesTemplatePicker), so a code span would
|
|
860
|
+
* show up as literal backticks.
|
|
861
|
+
*/
|
|
862
|
+
test("no template description uses markdown code spans", () => {
|
|
863
|
+
for (const template of getAllKubernetesAlertTemplates()) {
|
|
864
|
+
expect(`${template.id}: ${template.description}`).not.toContain("`");
|
|
865
|
+
}
|
|
866
|
+
});
|
|
867
|
+
});
|
|
868
|
+
|
|
869
|
+
/*
|
|
870
|
+
* The rolling window is load-bearing now that the FIRE side defaults to
|
|
871
|
+
* EvaluateOverTimeType.AllValues: every per-minute bucket in the window
|
|
872
|
+
* must breach, so the window IS the "how long has this been true" knob.
|
|
873
|
+
* Nothing else guards these, and shortening one silently reintroduces the
|
|
874
|
+
* page-on-every-deploy behaviour.
|
|
875
|
+
*/
|
|
876
|
+
describe("KubernetesAlertTemplates - deliberate rolling windows", () => {
|
|
877
|
+
const ROLLING_WINDOWS: Array<{
|
|
878
|
+
id: string;
|
|
879
|
+
window: RollingTime;
|
|
880
|
+
why: string;
|
|
881
|
+
}> = [
|
|
882
|
+
{
|
|
883
|
+
id: "k8s-deployment-replica-mismatch",
|
|
884
|
+
window: RollingTime.Past15Minutes,
|
|
885
|
+
why: "must outlast a normal rolling update, or it pages once per deploy",
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
id: "k8s-pod-pending",
|
|
889
|
+
window: RollingTime.Past15Minutes,
|
|
890
|
+
why: "must outlast normal scheduling; a few seconds Pending is not stuck",
|
|
891
|
+
},
|
|
892
|
+
{
|
|
893
|
+
id: "k8s-etcd-no-leader",
|
|
894
|
+
window: RollingTime.Past1Minute,
|
|
895
|
+
why: "a single lost leader is itself the incident",
|
|
896
|
+
},
|
|
897
|
+
];
|
|
898
|
+
|
|
899
|
+
test.each(ROLLING_WINDOWS)(
|
|
900
|
+
"$id watches $window because $why",
|
|
901
|
+
(tc: { id: string; window: RollingTime; why: string }) => {
|
|
902
|
+
expect(getKubernetesMonitor(getStep(tc.id)).rollingTime).toBe(tc.window);
|
|
903
|
+
},
|
|
904
|
+
);
|
|
905
|
+
});
|
|
906
|
+
|
|
907
|
+
/*
|
|
908
|
+
* BUG: eleven incident descriptions said "Check the root cause for the
|
|
909
|
+
* specific <thing>". On a GROUPED monitor that is false. A per-series
|
|
910
|
+
* match's rootCause is nothing but the concatenated compare lines
|
|
911
|
+
* (MonitorCriteriaEvaluator.collectPerSeriesMatches sets
|
|
912
|
+
* `rootCause: rootCauseLines.join("\n")`); the RICH root cause carrying the
|
|
913
|
+
* pod/node/container table is only written to the SCALAR response, which
|
|
914
|
+
* is used when there is NO series match. The identity the sentence
|
|
915
|
+
* promised is in the alert one field lower, under the "Affected resource"
|
|
916
|
+
* and "Start here" headings SeriesContextEnricher appends to the
|
|
917
|
+
* description — so the reader was being sent to the wrong row of the
|
|
918
|
+
* email.
|
|
919
|
+
*/
|
|
920
|
+
describe("KubernetesAlertTemplates - grouped alerts point at the right field", () => {
|
|
921
|
+
function isGrouped(id: string): boolean {
|
|
922
|
+
return getQueryConfigs(id).some((query: any) => {
|
|
923
|
+
return (query.metricQueryData.groupByAttributeKeys || []).length > 0;
|
|
924
|
+
});
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
test("at least one template is grouped (guards the guard)", () => {
|
|
928
|
+
expect(
|
|
929
|
+
getAllKubernetesAlertTemplates().filter((t: KubernetesAlertTemplate) => {
|
|
930
|
+
return isGrouped(t.id);
|
|
931
|
+
}).length,
|
|
932
|
+
).toBeGreaterThan(5);
|
|
933
|
+
});
|
|
934
|
+
|
|
935
|
+
test("no grouped template sends the reader to the root cause for identity", () => {
|
|
936
|
+
for (const template of getAllKubernetesAlertTemplates()) {
|
|
937
|
+
if (!isGrouped(template.id)) {
|
|
938
|
+
continue;
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
for (const instance of getCriteriaInstances(template.id)) {
|
|
942
|
+
for (const alert of instance.data?.alerts || []) {
|
|
943
|
+
expect(`${template.id}: ${alert.description}`).not.toMatch(
|
|
944
|
+
/root cause/i,
|
|
945
|
+
);
|
|
946
|
+
}
|
|
947
|
+
for (const incident of instance.data?.incidents || []) {
|
|
948
|
+
expect(`${template.id}: ${incident.description}`).not.toMatch(
|
|
949
|
+
/root cause/i,
|
|
950
|
+
);
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
});
|
|
361
955
|
});
|