@oneuptime/common 12.0.33 → 12.0.34
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/IncidentCustomField.ts +77 -3
- package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
- package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
- 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 +35 -2
- 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/Index.ts +8 -0
- package/Server/Infrastructure/QueueWorker.ts +20 -14
- package/Server/Infrastructure/Semaphore.ts +2 -0
- 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/GlobalConfigService.ts +194 -0
- package/Server/Services/IncidentCustomFieldService.ts +98 -0
- package/Server/Services/IncidentService.ts +35 -0
- package/Server/Services/MetricService.ts +194 -0
- package/Server/Services/MonitorService.ts +32 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +78 -25
- 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/UserNotificationSettingService.ts +34 -6
- package/Server/Services/UserTelegramService.ts +326 -5
- package/Server/Types/Database/QueryHelper.ts +2 -0
- 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/DataSource/EgressGuard.ts +177 -8
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +57 -4
- 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 +338 -77
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
- package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +110 -15
- package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -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/PinServiceName.ts +197 -0
- 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/DashboardHeaderSmallScreens.test.tsx +404 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
- package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
- package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -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/ResponsiveVisibility.test.ts +115 -0
- package/Tests/ResponsiveVisibility.ts +183 -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/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +202 -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/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
- 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/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
- package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
- package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +226 -1
- 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/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/CustomFieldMappingValidator.test.ts +437 -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 +1 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -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/CompareCriteriaAggregation.test.ts +584 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -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/PinServiceName.test.ts +666 -0
- 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/JSONFunctions.test.ts +260 -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/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/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/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/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 +711 -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/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/ReplayTimeline.test.tsx +696 -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/GlobalKeyboardShortcut.test.ts +344 -0
- package/Tests/Utils/API.test.ts +308 -0
- package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -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/CustomField/CustomFieldMappingCatalog.ts +161 -0
- package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
- package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/JSONFunctions.ts +189 -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/UptimeHistoryLabels.ts +56 -0
- 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/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/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 +143 -25
- package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -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/Utils/API.ts +129 -3
- package/Utils/HTTPResponseBodyReader.ts +221 -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/IncidentCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/IncidentCustomField.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/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 +29 -2
- 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/Index.js +8 -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/Semaphore.js +1 -0
- package/build/dist/Server/Infrastructure/Semaphore.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/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/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/NetworkDeviceAutoImportRuleEngineService.js +79 -27
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.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/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/QueryHelper.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/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 +44 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.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 +287 -68
- 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/MonitorAlert.js +29 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +88 -13
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.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/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/PinServiceName.js +163 -0
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
- 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/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/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +118 -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/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/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/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 +80 -6
- 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/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/HTTPResponseBodyReader.js +157 -0
- package/build/dist/Utils/HTTPResponseBodyReader.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/package.json +1 -1
|
@@ -5,8 +5,15 @@ import {
|
|
|
5
5
|
getCephAlertTemplateById,
|
|
6
6
|
} from "../../../Types/Monitor/CephAlertTemplates";
|
|
7
7
|
import { getCephMetricByMetricName } from "../../../Types/Monitor/CephMetricCatalog";
|
|
8
|
+
import { getRecoveryThreshold } from "../../../Types/Monitor/Recommendation/RecommendationCriteriaBuilder";
|
|
9
|
+
import {
|
|
10
|
+
getComplementFilterType,
|
|
11
|
+
hasRecoveryDeadBand,
|
|
12
|
+
} from "./Utils/RecommendationCriteriaAssertions";
|
|
8
13
|
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
9
|
-
import MonitorStepCephMonitor
|
|
14
|
+
import MonitorStepCephMonitor, {
|
|
15
|
+
CephResourceScope,
|
|
16
|
+
} from "../../../Types/Monitor/MonitorStepCephMonitor";
|
|
10
17
|
import MonitorCriteriaInstance from "../../../Types/Monitor/MonitorCriteriaInstance";
|
|
11
18
|
import FilterCondition from "../../../Types/Filter/FilterCondition";
|
|
12
19
|
import {
|
|
@@ -35,10 +42,12 @@ import ObjectID from "../../../Types/ObjectID";
|
|
|
35
42
|
*
|
|
36
43
|
* 2. A per-template expectation table pins the spec'd v3 WI-26 rows
|
|
37
44
|
* (severity / filter / Past1Minute exceptions / the
|
|
38
|
-
* MON_DISK_CRIT
|
|
39
|
-
* decisions
|
|
40
|
-
*
|
|
41
|
-
*
|
|
45
|
+
* MON_DISK_CRIT / MON_DISK_LOW severity split) and the
|
|
46
|
+
* aggregation decisions: Sum/Sum for same-receiver RATIOS, and
|
|
47
|
+
* grouped Max/Max for the pg-inactive DIFFERENCE — a difference
|
|
48
|
+
* does not cancel the scrape multiple the way a ratio does, so
|
|
49
|
+
* ungrouped Sum reported a scrape-multiplied PG count and
|
|
50
|
+
* ungrouped Max would have hidden every pool but the largest.
|
|
42
51
|
*/
|
|
43
52
|
|
|
44
53
|
interface ThresholdExpectation {
|
|
@@ -260,6 +269,11 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
|
|
|
260
269
|
},
|
|
261
270
|
},
|
|
262
271
|
{
|
|
272
|
+
/*
|
|
273
|
+
* ceph_pg_degraded is a PER-POOL gauge (pool_id label). Grouped Max
|
|
274
|
+
* reports the pool's own degraded count and names the pool; ungrouped
|
|
275
|
+
* Max reported the largest pool's count as if it were a cluster total.
|
|
276
|
+
*/
|
|
263
277
|
id: "ceph-pg-degraded",
|
|
264
278
|
category: "PG",
|
|
265
279
|
severity: "Warning",
|
|
@@ -268,7 +282,7 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
|
|
|
268
282
|
queries: [
|
|
269
283
|
{ alias: "pg_degraded", metricName: "ceph_pg_degraded", attributes: {} },
|
|
270
284
|
],
|
|
271
|
-
groupBy:
|
|
285
|
+
groupBy: "pool_id",
|
|
272
286
|
formula: null,
|
|
273
287
|
fireCriteria: [
|
|
274
288
|
[{ alias: "pg_degraded", filterType: FilterType.GreaterThan, value: 0 }],
|
|
@@ -282,6 +296,7 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
|
|
|
282
296
|
},
|
|
283
297
|
},
|
|
284
298
|
{
|
|
299
|
+
// Per-pool gauge, same contract as ceph-pg-degraded above.
|
|
285
300
|
id: "ceph-pg-undersized",
|
|
286
301
|
category: "PG",
|
|
287
302
|
severity: "Warning",
|
|
@@ -294,7 +309,7 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
|
|
|
294
309
|
attributes: {},
|
|
295
310
|
},
|
|
296
311
|
],
|
|
297
|
-
groupBy:
|
|
312
|
+
groupBy: "pool_id",
|
|
298
313
|
formula: null,
|
|
299
314
|
fireCriteria: [
|
|
300
315
|
[
|
|
@@ -315,22 +330,26 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
|
|
|
315
330
|
},
|
|
316
331
|
{
|
|
317
332
|
/*
|
|
318
|
-
*
|
|
319
|
-
* series
|
|
320
|
-
* multiple
|
|
321
|
-
*
|
|
322
|
-
* inactive PGs
|
|
333
|
+
* GROUPED Max/Max difference. ceph_pg_total / ceph_pg_active are
|
|
334
|
+
* PER-POOL series, and a difference does not cancel the scrape
|
|
335
|
+
* multiple the way a ratio does: ungrouped Sum/Sum folded both the
|
|
336
|
+
* pools AND the two 30s scrapes inside each one-minute bucket into the
|
|
337
|
+
* value, so a cluster with 3 inactive PGs was alerted as "6". Grouped
|
|
338
|
+
* Max de-duplicates the scrapes per (pool, minute) and yields that
|
|
339
|
+
* pool's exact inactive count. Ungrouped Max would be wrong for the
|
|
340
|
+
* opposite reason — each side collapses to the largest pool — so the
|
|
341
|
+
* group-by and the aggregation belong together.
|
|
323
342
|
*/
|
|
324
343
|
id: "ceph-pg-inactive",
|
|
325
344
|
category: "PG",
|
|
326
345
|
severity: "Critical",
|
|
327
346
|
rollingTime: RollingTime.Past5Minutes,
|
|
328
|
-
aggregation: MetricsAggregationType.
|
|
347
|
+
aggregation: MetricsAggregationType.Max,
|
|
329
348
|
queries: [
|
|
330
349
|
{ alias: "pg_total", metricName: "ceph_pg_total", attributes: {} },
|
|
331
350
|
{ alias: "pg_active", metricName: "ceph_pg_active", attributes: {} },
|
|
332
351
|
],
|
|
333
|
-
groupBy:
|
|
352
|
+
groupBy: "pool_id",
|
|
334
353
|
formula: "pg_total - pg_active",
|
|
335
354
|
fireCriteria: [
|
|
336
355
|
[{ alias: "pg_inactive", filterType: FilterType.GreaterThan, value: 0 }],
|
|
@@ -721,9 +740,10 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
|
|
|
721
740
|
},
|
|
722
741
|
{
|
|
723
742
|
/*
|
|
724
|
-
*
|
|
725
|
-
*
|
|
726
|
-
*
|
|
743
|
+
* MON_DISK_CRIT and MON_DISK_LOW are two SEPARATE templates, not two
|
|
744
|
+
* tiers of one. The create flow stamps every criteria instance in a step
|
|
745
|
+
* with the recommendation's single declared severity, so a Warning tier
|
|
746
|
+
* riding along inside this Critical template paged at Critical.
|
|
727
747
|
*/
|
|
728
748
|
id: "ceph-mon-disk-space",
|
|
729
749
|
category: "Cluster Health",
|
|
@@ -736,11 +756,6 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
|
|
|
736
756
|
metricName: "ceph_health_detail",
|
|
737
757
|
attributes: { name: "MON_DISK_CRIT" },
|
|
738
758
|
},
|
|
739
|
-
{
|
|
740
|
-
alias: "mon_disk_low",
|
|
741
|
-
metricName: "ceph_health_detail",
|
|
742
|
-
attributes: { name: "MON_DISK_LOW" },
|
|
743
|
-
},
|
|
744
759
|
],
|
|
745
760
|
groupBy: null,
|
|
746
761
|
formula: null,
|
|
@@ -752,14 +767,38 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
|
|
|
752
767
|
value: 0,
|
|
753
768
|
},
|
|
754
769
|
],
|
|
755
|
-
[{ alias: "mon_disk_low", filterType: FilterType.GreaterThan, value: 0 }],
|
|
756
770
|
],
|
|
757
771
|
recover: {
|
|
758
772
|
filters: [
|
|
759
773
|
{ alias: "mon_disk_crit", filterType: FilterType.EqualTo, value: 0 },
|
|
774
|
+
],
|
|
775
|
+
condition: FilterCondition.Any,
|
|
776
|
+
treatNoDataAsZero: true,
|
|
777
|
+
},
|
|
778
|
+
},
|
|
779
|
+
{
|
|
780
|
+
id: "ceph-mon-disk-low",
|
|
781
|
+
category: "Cluster Health",
|
|
782
|
+
severity: "Warning",
|
|
783
|
+
rollingTime: RollingTime.Past5Minutes,
|
|
784
|
+
aggregation: MetricsAggregationType.Max,
|
|
785
|
+
queries: [
|
|
786
|
+
{
|
|
787
|
+
alias: "mon_disk_low",
|
|
788
|
+
metricName: "ceph_health_detail",
|
|
789
|
+
attributes: { name: "MON_DISK_LOW" },
|
|
790
|
+
},
|
|
791
|
+
],
|
|
792
|
+
groupBy: null,
|
|
793
|
+
formula: null,
|
|
794
|
+
fireCriteria: [
|
|
795
|
+
[{ alias: "mon_disk_low", filterType: FilterType.GreaterThan, value: 0 }],
|
|
796
|
+
],
|
|
797
|
+
recover: {
|
|
798
|
+
filters: [
|
|
760
799
|
{ alias: "mon_disk_low", filterType: FilterType.EqualTo, value: 0 },
|
|
761
800
|
],
|
|
762
|
-
condition: FilterCondition.
|
|
801
|
+
condition: FilterCondition.Any,
|
|
763
802
|
treatNoDataAsZero: true,
|
|
764
803
|
},
|
|
765
804
|
},
|
|
@@ -841,28 +880,18 @@ function getReferencableAliases(monitor: MonitorStepCephMonitor): Set<string> {
|
|
|
841
880
|
return aliases;
|
|
842
881
|
}
|
|
843
882
|
|
|
883
|
+
/*
|
|
884
|
+
* Delegates to the shared assertion so all eight recommendation suites
|
|
885
|
+
* agree on what a correct fire/recover pair looks like. This function used
|
|
886
|
+
* to require `fire.value === recover.value` — see the comment in
|
|
887
|
+
* RecommendationCriteriaAssertions for why that was the bug rather than
|
|
888
|
+
* the invariant.
|
|
889
|
+
*/
|
|
844
890
|
function isDisjointComplement(
|
|
845
891
|
fire: { filterType: FilterType; value: number },
|
|
846
892
|
recover: { filterType: FilterType; value: number },
|
|
847
893
|
): boolean {
|
|
848
|
-
|
|
849
|
-
return false;
|
|
850
|
-
}
|
|
851
|
-
switch (fire.filterType) {
|
|
852
|
-
case FilterType.GreaterThan:
|
|
853
|
-
return (
|
|
854
|
-
recover.filterType === FilterType.LessThanOrEqualTo ||
|
|
855
|
-
(fire.value === 0 && recover.filterType === FilterType.EqualTo)
|
|
856
|
-
);
|
|
857
|
-
case FilterType.GreaterThanOrEqualTo:
|
|
858
|
-
return recover.filterType === FilterType.LessThan;
|
|
859
|
-
case FilterType.LessThan:
|
|
860
|
-
return recover.filterType === FilterType.GreaterThanOrEqualTo;
|
|
861
|
-
case FilterType.LessThanOrEqualTo:
|
|
862
|
-
return recover.filterType === FilterType.GreaterThan;
|
|
863
|
-
default:
|
|
864
|
-
return false;
|
|
865
|
-
}
|
|
894
|
+
return hasRecoveryDeadBand(fire, recover);
|
|
866
895
|
}
|
|
867
896
|
|
|
868
897
|
// Health-check series exist only while their check is active.
|
|
@@ -908,8 +937,10 @@ describe("CephAlertTemplates - enumerated invariants (every template)", () => {
|
|
|
908
937
|
const instances: Array<MonitorCriteriaInstance> =
|
|
909
938
|
getCriteriaInstances(step);
|
|
910
939
|
/*
|
|
911
|
-
*
|
|
912
|
-
*
|
|
940
|
+
* One unhealthy instance plus the Healthy recovery. Asserted as
|
|
941
|
+
* at-least-2 rather than exactly-2 so a future template may add an extra
|
|
942
|
+
* unhealthy tier — but only where every tier means the SAME severity,
|
|
943
|
+
* because the create flow stamps one severity across the whole step.
|
|
913
944
|
*/
|
|
914
945
|
expect(instances.length).toBeGreaterThanOrEqual(2);
|
|
915
946
|
|
|
@@ -995,6 +1026,135 @@ describe("CephAlertTemplates - enumerated invariants (every template)", () => {
|
|
|
995
1026
|
},
|
|
996
1027
|
);
|
|
997
1028
|
|
|
1029
|
+
test.each(
|
|
1030
|
+
ALL_TEMPLATES.map((t: CephAlertTemplate) => {
|
|
1031
|
+
return [t.id, t];
|
|
1032
|
+
}),
|
|
1033
|
+
)(
|
|
1034
|
+
"%s groups every per-pool metric by pool_id",
|
|
1035
|
+
(_id: unknown, template: unknown) => {
|
|
1036
|
+
/*
|
|
1037
|
+
* REGRESSION (ceph-pg-degraded / ceph-pg-undersized / ceph-pg-inactive):
|
|
1038
|
+
* every ceph_pg_* and ceph_pool_* series is exported PER POOL with a
|
|
1039
|
+
* `pool_id` datapoint label — there is no cluster-wide gauge. Without a
|
|
1040
|
+
* group-by the whole pool fan-out collapses into ONE number: the
|
|
1041
|
+
* ungrouped aggregation folds every pool together, so the alert printed
|
|
1042
|
+
* the worst single pool's count (Max) or a scrape-multiplied sum (Sum)
|
|
1043
|
+
* and presented it as a cluster total, and the evaluator never produced
|
|
1044
|
+
* seriesLabels, so the incident could not name the pool the operator has
|
|
1045
|
+
* to go look at.
|
|
1046
|
+
*
|
|
1047
|
+
* Driven off the catalog's own defaultResourceScope so any FUTURE
|
|
1048
|
+
* per-pool template inherits the rule instead of repeating the mistake.
|
|
1049
|
+
*/
|
|
1050
|
+
const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
|
|
1051
|
+
buildArgs(),
|
|
1052
|
+
);
|
|
1053
|
+
const monitor: MonitorStepCephMonitor = getCephMonitor(step);
|
|
1054
|
+
|
|
1055
|
+
for (const queryConfig of monitor.metricViewConfig
|
|
1056
|
+
.queryConfigs as Array<any>) {
|
|
1057
|
+
const metricName: string =
|
|
1058
|
+
queryConfig.metricQueryData.filterData.metricName;
|
|
1059
|
+
|
|
1060
|
+
if (
|
|
1061
|
+
getCephMetricByMetricName(metricName)?.defaultResourceScope !==
|
|
1062
|
+
CephResourceScope.Pool
|
|
1063
|
+
) {
|
|
1064
|
+
continue;
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
expect(queryConfig.metricQueryData.groupByAttributeKeys || []).toEqual([
|
|
1068
|
+
"pool_id",
|
|
1069
|
+
]);
|
|
1070
|
+
}
|
|
1071
|
+
},
|
|
1072
|
+
);
|
|
1073
|
+
|
|
1074
|
+
test.each(
|
|
1075
|
+
ALL_TEMPLATES.map((t: CephAlertTemplate) => {
|
|
1076
|
+
return [t.id, t];
|
|
1077
|
+
}),
|
|
1078
|
+
)(
|
|
1079
|
+
"%s groups every per-daemon metric by ceph_daemon",
|
|
1080
|
+
(_id: unknown, template: unknown) => {
|
|
1081
|
+
/*
|
|
1082
|
+
* The mirror of the pool rule: OSD- and Mon-scoped series carry a
|
|
1083
|
+
* `ceph_daemon` label, so one incident must fire per daemon. This locks
|
|
1084
|
+
* in the existing osd-down / osd-out / osd-high-latency / mon-quorum /
|
|
1085
|
+
* daemon-slow-ops choices against the same collapse.
|
|
1086
|
+
*/
|
|
1087
|
+
const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
|
|
1088
|
+
buildArgs(),
|
|
1089
|
+
);
|
|
1090
|
+
const monitor: MonitorStepCephMonitor = getCephMonitor(step);
|
|
1091
|
+
|
|
1092
|
+
for (const queryConfig of monitor.metricViewConfig
|
|
1093
|
+
.queryConfigs as Array<any>) {
|
|
1094
|
+
const metricName: string =
|
|
1095
|
+
queryConfig.metricQueryData.filterData.metricName;
|
|
1096
|
+
const scope: CephResourceScope | undefined =
|
|
1097
|
+
getCephMetricByMetricName(metricName)?.defaultResourceScope;
|
|
1098
|
+
|
|
1099
|
+
if (
|
|
1100
|
+
scope !== CephResourceScope.Osd &&
|
|
1101
|
+
scope !== CephResourceScope.Mon
|
|
1102
|
+
) {
|
|
1103
|
+
continue;
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
expect(queryConfig.metricQueryData.groupByAttributeKeys || []).toEqual([
|
|
1107
|
+
"ceph_daemon",
|
|
1108
|
+
]);
|
|
1109
|
+
}
|
|
1110
|
+
},
|
|
1111
|
+
);
|
|
1112
|
+
|
|
1113
|
+
test.each(
|
|
1114
|
+
ALL_TEMPLATES.map((t: CephAlertTemplate) => {
|
|
1115
|
+
return [t.id, t];
|
|
1116
|
+
}),
|
|
1117
|
+
)(
|
|
1118
|
+
"%s never subtracts two ungrouped per-series metrics",
|
|
1119
|
+
(_id: unknown, template: unknown) => {
|
|
1120
|
+
/*
|
|
1121
|
+
* REGRESSION (ceph-pg-inactive): an UNGROUPED difference has no correct
|
|
1122
|
+
* aggregation at all, which is why this is asserted as its own
|
|
1123
|
+
* invariant rather than left to the aggregation rule above.
|
|
1124
|
+
*
|
|
1125
|
+
* A one-minute bucket holds one row per (series, scrape) and the shipped
|
|
1126
|
+
* agent scrapes every 30s, so ungrouped Sum returns 2·Σpools — a cluster
|
|
1127
|
+
* with 3 inactive PGs was alerted as "6", and as a different multiple in
|
|
1128
|
+
* each bucket of the window because the bucket boundaries do not divide
|
|
1129
|
+
* the scrape train evenly. Ungrouped Max is worse: it collapses each
|
|
1130
|
+
* side to the largest pool and the difference stops meaning anything.
|
|
1131
|
+
* Only grouping makes the subtraction well-defined.
|
|
1132
|
+
*/
|
|
1133
|
+
const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
|
|
1134
|
+
buildArgs(),
|
|
1135
|
+
);
|
|
1136
|
+
const monitor: MonitorStepCephMonitor = getCephMonitor(step);
|
|
1137
|
+
const formulaConfigs: Array<any> = (monitor.metricViewConfig
|
|
1138
|
+
.formulaConfigs || []) as Array<any>;
|
|
1139
|
+
|
|
1140
|
+
for (const formulaConfig of formulaConfigs) {
|
|
1141
|
+
const formula: string =
|
|
1142
|
+
formulaConfig.metricFormulaData.metricFormula || "";
|
|
1143
|
+
|
|
1144
|
+
if (!formula.includes("-")) {
|
|
1145
|
+
continue;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
for (const queryConfig of monitor.metricViewConfig
|
|
1149
|
+
.queryConfigs as Array<any>) {
|
|
1150
|
+
expect(
|
|
1151
|
+
(queryConfig.metricQueryData.groupByAttributeKeys || []).length,
|
|
1152
|
+
).toBeGreaterThan(0);
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
},
|
|
1156
|
+
);
|
|
1157
|
+
|
|
998
1158
|
test.each(
|
|
999
1159
|
ALL_TEMPLATES.map((t: CephAlertTemplate) => {
|
|
1000
1160
|
return [t.id, t];
|
|
@@ -1087,7 +1247,7 @@ describe("CephAlertTemplates - enumerated invariants (every template)", () => {
|
|
|
1087
1247
|
return [t.id, t];
|
|
1088
1248
|
}),
|
|
1089
1249
|
)(
|
|
1090
|
-
"%s
|
|
1250
|
+
"%s formula queries share one aggregation, chosen by formula shape",
|
|
1091
1251
|
(_id: unknown, template: unknown) => {
|
|
1092
1252
|
const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
|
|
1093
1253
|
buildArgs(),
|
|
@@ -1102,17 +1262,37 @@ describe("CephAlertTemplates - enumerated invariants (every template)", () => {
|
|
|
1102
1262
|
return;
|
|
1103
1263
|
}
|
|
1104
1264
|
|
|
1265
|
+
expect(formulaConfigs).toHaveLength(1);
|
|
1266
|
+
|
|
1267
|
+
const formula: string =
|
|
1268
|
+
formulaConfigs[0].metricFormulaData.metricFormula || "";
|
|
1269
|
+
const isDifference: boolean = formula.includes("-");
|
|
1270
|
+
const isGrouped: boolean =
|
|
1271
|
+
(queryConfigs[0].metricQueryData.groupByAttributeKeys || []).length > 0;
|
|
1272
|
+
|
|
1105
1273
|
/*
|
|
1106
|
-
* Every Ceph metric rides ONE receiver (the active mgr scrape),
|
|
1107
|
-
*
|
|
1108
|
-
*
|
|
1109
|
-
*
|
|
1110
|
-
*
|
|
1274
|
+
* Every Ceph metric rides ONE receiver (the active mgr scrape), so
|
|
1275
|
+
* both sides of a formula must share ONE aggregation. WHICH one is a
|
|
1276
|
+
* function of the shape:
|
|
1277
|
+
*
|
|
1278
|
+
* - RATIO: Sum. The per-bucket scrape multiple cancels between the
|
|
1279
|
+
* numerator and the denominator, so the percentage is exact.
|
|
1280
|
+
* - grouped DIFFERENCE: Max. Nothing cancels, so Sum would add the
|
|
1281
|
+
* identical scrapes inside one (series, minute) bucket and
|
|
1282
|
+
* multiply the reported count. Max de-duplicates them.
|
|
1283
|
+
* - ungrouped DIFFERENCE: there is NO correct aggregation — Sum
|
|
1284
|
+
* multiplies by the scrape count, Max collapses each side to the
|
|
1285
|
+
* largest series. The separate "difference formulas must be
|
|
1286
|
+
* grouped" invariant below rejects that shape outright.
|
|
1111
1287
|
*/
|
|
1112
|
-
|
|
1288
|
+
const expectedAggregation: MetricsAggregationType =
|
|
1289
|
+
isGrouped && isDifference
|
|
1290
|
+
? MetricsAggregationType.Max
|
|
1291
|
+
: MetricsAggregationType.Sum;
|
|
1292
|
+
|
|
1113
1293
|
for (const queryConfig of queryConfigs) {
|
|
1114
1294
|
expect(queryConfig.metricQueryData.filterData.aggegationType).toBe(
|
|
1115
|
-
|
|
1295
|
+
expectedAggregation,
|
|
1116
1296
|
);
|
|
1117
1297
|
}
|
|
1118
1298
|
|
|
@@ -1215,7 +1395,19 @@ describe("CephAlertTemplates - spec table expectations", () => {
|
|
|
1215
1395
|
expectedFilter.alias,
|
|
1216
1396
|
);
|
|
1217
1397
|
expect(onlineFilters[j].filterType).toBe(expectedFilter.filterType);
|
|
1218
|
-
|
|
1398
|
+
/*
|
|
1399
|
+
* The spec table states the FIRING threshold. The recovery
|
|
1400
|
+
* threshold is derived from it, so the table does not have to
|
|
1401
|
+
* restate every dead-banded number — and so a change to the dead
|
|
1402
|
+
* band shows up as a behaviour change in one place rather than as
|
|
1403
|
+
* a diff across nine spec tables.
|
|
1404
|
+
*/
|
|
1405
|
+
expect(onlineFilters[j].value).toBe(
|
|
1406
|
+
getRecoveryThreshold({
|
|
1407
|
+
filterType: getComplementFilterType(expectedFilter.filterType)!,
|
|
1408
|
+
value: expectedFilter.value,
|
|
1409
|
+
}) ?? expectedFilter.value,
|
|
1410
|
+
);
|
|
1219
1411
|
if (tc.recover.treatNoDataAsZero) {
|
|
1220
1412
|
expect(onlineFilters[j].metricMonitorOptions.onNoDataPolicy).toBe(
|
|
1221
1413
|
NoDataPolicy.TreatAsZero,
|
|
@@ -1229,3 +1421,180 @@ describe("CephAlertTemplates - spec table expectations", () => {
|
|
|
1229
1421
|
},
|
|
1230
1422
|
);
|
|
1231
1423
|
});
|
|
1424
|
+
|
|
1425
|
+
describe("CephAlertTemplates - per-pool PG accounting regressions", () => {
|
|
1426
|
+
/*
|
|
1427
|
+
* These three templates read ceph_pg_* series, which the mgr exports once
|
|
1428
|
+
* per pool. They all shipped UNGROUPED, which is what produced the
|
|
1429
|
+
* "the values do not make any sense at all" reports: with no group-by the
|
|
1430
|
+
* whole pool fan-out is folded into one number before the threshold is
|
|
1431
|
+
* ever compared, and no seriesLabels are produced so the incident cannot
|
|
1432
|
+
* say which pool it is about.
|
|
1433
|
+
*
|
|
1434
|
+
* The spec table above already pins the resulting config; these tests
|
|
1435
|
+
* restate the defect by name so a revert fails with a sentence that
|
|
1436
|
+
* explains itself rather than with an opaque table mismatch.
|
|
1437
|
+
*/
|
|
1438
|
+
|
|
1439
|
+
function getQueryConfigs(templateId: string): Array<any> {
|
|
1440
|
+
const template: CephAlertTemplate | undefined =
|
|
1441
|
+
getCephAlertTemplateById(templateId);
|
|
1442
|
+
expect(template).toBeDefined();
|
|
1443
|
+
|
|
1444
|
+
const monitor: MonitorStepCephMonitor = getCephMonitor(
|
|
1445
|
+
template!.getMonitorStep(buildArgs()),
|
|
1446
|
+
);
|
|
1447
|
+
|
|
1448
|
+
return monitor.metricViewConfig.queryConfigs as Array<any>;
|
|
1449
|
+
}
|
|
1450
|
+
|
|
1451
|
+
test.each([
|
|
1452
|
+
["ceph-pg-degraded", "ceph_pg_degraded"],
|
|
1453
|
+
["ceph-pg-undersized", "ceph_pg_undersized"],
|
|
1454
|
+
])(
|
|
1455
|
+
"%s counts one pool's PGs, not the largest pool's presented as a cluster total",
|
|
1456
|
+
(templateId: string, metricName: string) => {
|
|
1457
|
+
// The catalog is the source of truth for the scope this rule keys off.
|
|
1458
|
+
expect(getCephMetricByMetricName(metricName)?.defaultResourceScope).toBe(
|
|
1459
|
+
CephResourceScope.Pool,
|
|
1460
|
+
);
|
|
1461
|
+
|
|
1462
|
+
const queryConfigs: Array<any> = getQueryConfigs(templateId);
|
|
1463
|
+
expect(queryConfigs).toHaveLength(1);
|
|
1464
|
+
|
|
1465
|
+
/*
|
|
1466
|
+
* Grouped: one incident per pool, and the pool_id reaches the alert.
|
|
1467
|
+
* Ungrouped Max — what this shipped as — reported max-across-pools as
|
|
1468
|
+
* if it were a cluster-wide degraded/undersized count.
|
|
1469
|
+
*/
|
|
1470
|
+
expect(queryConfigs[0].metricQueryData.groupByAttributeKeys).toEqual([
|
|
1471
|
+
"pool_id",
|
|
1472
|
+
]);
|
|
1473
|
+
|
|
1474
|
+
/*
|
|
1475
|
+
* Max, not Sum, is the correct reduction WITHIN a (pool, minute)
|
|
1476
|
+
* bucket: the agent scrapes every 30s and buckets are one minute
|
|
1477
|
+
* wide, so the bucket holds two identical samples of the same gauge.
|
|
1478
|
+
*/
|
|
1479
|
+
expect(queryConfigs[0].metricQueryData.filterData.aggegationType).toBe(
|
|
1480
|
+
MetricsAggregationType.Max,
|
|
1481
|
+
);
|
|
1482
|
+
},
|
|
1483
|
+
);
|
|
1484
|
+
|
|
1485
|
+
test("ceph-pg-inactive reports a pool's exact inactive count, not a scrape-multiplied one", () => {
|
|
1486
|
+
const queryConfigs: Array<any> = getQueryConfigs("ceph-pg-inactive");
|
|
1487
|
+
|
|
1488
|
+
// pg_total and pg_active — both per-pool, both on the same mgr scrape.
|
|
1489
|
+
expect(queryConfigs).toHaveLength(2);
|
|
1490
|
+
|
|
1491
|
+
for (const queryConfig of queryConfigs) {
|
|
1492
|
+
expect(
|
|
1493
|
+
getCephMetricByMetricName(
|
|
1494
|
+
queryConfig.metricQueryData.filterData.metricName,
|
|
1495
|
+
)?.defaultResourceScope,
|
|
1496
|
+
).toBe(CephResourceScope.Pool);
|
|
1497
|
+
|
|
1498
|
+
/*
|
|
1499
|
+
* Both sides must be grouped identically or the per-series join has
|
|
1500
|
+
* nothing to line up on, and the difference stops being a difference.
|
|
1501
|
+
*/
|
|
1502
|
+
expect(queryConfig.metricQueryData.groupByAttributeKeys).toEqual([
|
|
1503
|
+
"pool_id",
|
|
1504
|
+
]);
|
|
1505
|
+
|
|
1506
|
+
/*
|
|
1507
|
+
* THE DEFECT: this shipped as ungrouped Sum/Sum. Sum preserves the
|
|
1508
|
+
* SIGN of the difference (k·Total - k·Active = k·Inactive), so the
|
|
1509
|
+
* "> 0" threshold still tripped correctly and no test caught it — but
|
|
1510
|
+
* the VALUE handed to the alert body was multiplied by the number of
|
|
1511
|
+
* scrapes in the bucket, so a cluster with 3 inactive PGs was paged as
|
|
1512
|
+
* 6. Grouped Max de-duplicates those scrapes.
|
|
1513
|
+
*/
|
|
1514
|
+
expect(queryConfig.metricQueryData.filterData.aggegationType).toBe(
|
|
1515
|
+
MetricsAggregationType.Max,
|
|
1516
|
+
);
|
|
1517
|
+
expect(queryConfig.metricQueryData.filterData.aggegationType).not.toBe(
|
|
1518
|
+
MetricsAggregationType.Sum,
|
|
1519
|
+
);
|
|
1520
|
+
}
|
|
1521
|
+
});
|
|
1522
|
+
|
|
1523
|
+
test("ratio formulas keep Sum on both sides — only differences moved to Max", () => {
|
|
1524
|
+
/*
|
|
1525
|
+
* The fix is scoped to DIFFERENCES. A ratio's scrape multiple cancels
|
|
1526
|
+
* between numerator and denominator, so Sum stays exactly right there;
|
|
1527
|
+
* flipping the capacity templates to Max would silently change them
|
|
1528
|
+
* from "the pool's share of its writable capacity" to "the largest
|
|
1529
|
+
* sample in the bucket".
|
|
1530
|
+
*/
|
|
1531
|
+
for (const templateId of [
|
|
1532
|
+
"ceph-cluster-near-full",
|
|
1533
|
+
"ceph-cluster-full",
|
|
1534
|
+
"ceph-pool-near-full",
|
|
1535
|
+
]) {
|
|
1536
|
+
for (const queryConfig of getQueryConfigs(templateId)) {
|
|
1537
|
+
expect(queryConfig.metricQueryData.filterData.aggegationType).toBe(
|
|
1538
|
+
MetricsAggregationType.Sum,
|
|
1539
|
+
);
|
|
1540
|
+
}
|
|
1541
|
+
}
|
|
1542
|
+
});
|
|
1543
|
+
});
|
|
1544
|
+
|
|
1545
|
+
describe("CephAlertTemplates - mon-disk severity split regression", () => {
|
|
1546
|
+
test("the two mon-disk tiers are separate templates with different severities", () => {
|
|
1547
|
+
/*
|
|
1548
|
+
* THE DEFECT: MON_DISK_CRIT and MON_DISK_LOW used to be two criteria
|
|
1549
|
+
* tiers inside ONE template declared "Critical".
|
|
1550
|
+
*
|
|
1551
|
+
* Severity is per-RECOMMENDATION, not per-criteria: the create flow
|
|
1552
|
+
* resolves one severity from the recommendation and stamps it onto every
|
|
1553
|
+
* criteria instance in the step
|
|
1554
|
+
* (MonitorRecommendationUtil.applyNotificationSettingsToMonitorStep), so
|
|
1555
|
+
* the MON_DISK_LOW tier — a mon disk merely below 30% free, with days of
|
|
1556
|
+
* headroom — opened incidents at the project's top severity and paged
|
|
1557
|
+
* whatever on-call policy is attached to Critical, while the
|
|
1558
|
+
* recommendation card promised Warning. Threading a second severity id
|
|
1559
|
+
* through the template args cannot fix it; two severities need two
|
|
1560
|
+
* templates.
|
|
1561
|
+
*/
|
|
1562
|
+
const critical: CephAlertTemplate | undefined = getCephAlertTemplateById(
|
|
1563
|
+
"ceph-mon-disk-space",
|
|
1564
|
+
);
|
|
1565
|
+
const warning: CephAlertTemplate | undefined =
|
|
1566
|
+
getCephAlertTemplateById("ceph-mon-disk-low");
|
|
1567
|
+
|
|
1568
|
+
expect(critical).toBeDefined();
|
|
1569
|
+
expect(warning).toBeDefined();
|
|
1570
|
+
expect(critical!.severity).toBe("Critical");
|
|
1571
|
+
expect(warning!.severity).toBe("Warning");
|
|
1572
|
+
|
|
1573
|
+
// Each watches exactly its own health check, and only its own.
|
|
1574
|
+
const readWatchedCheckNames: (
|
|
1575
|
+
template: CephAlertTemplate,
|
|
1576
|
+
) => Array<string> = (template: CephAlertTemplate): Array<string> => {
|
|
1577
|
+
const monitor: MonitorStepCephMonitor = getCephMonitor(
|
|
1578
|
+
template.getMonitorStep(buildArgs()),
|
|
1579
|
+
);
|
|
1580
|
+
|
|
1581
|
+
return (monitor.metricViewConfig.queryConfigs as Array<any>).map(
|
|
1582
|
+
(queryConfig: any) => {
|
|
1583
|
+
return queryConfig.metricQueryData.filterData.attributes["name"];
|
|
1584
|
+
},
|
|
1585
|
+
);
|
|
1586
|
+
};
|
|
1587
|
+
|
|
1588
|
+
expect(readWatchedCheckNames(critical!)).toEqual(["MON_DISK_CRIT"]);
|
|
1589
|
+
expect(readWatchedCheckNames(warning!)).toEqual(["MON_DISK_LOW"]);
|
|
1590
|
+
});
|
|
1591
|
+
|
|
1592
|
+
/*
|
|
1593
|
+
* The GENERAL form of this rule — "every recommendation ships exactly one
|
|
1594
|
+
* unhealthy criteria, because one severity is stamped across the whole
|
|
1595
|
+
* step" — is enumerated over the entire catalog in
|
|
1596
|
+
* MonitorRecommendationNotificationMode.test.ts, so it is not repeated per
|
|
1597
|
+
* resource type here. The test above pins the Ceph-specific instance of the
|
|
1598
|
+
* defect by name.
|
|
1599
|
+
*/
|
|
1600
|
+
});
|