@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,10 @@ import {
|
|
|
5
5
|
getAllHostAlertTemplates,
|
|
6
6
|
getHostAlertTemplateById,
|
|
7
7
|
getHostAlertTemplatesByCategory,
|
|
8
|
+
hostTitleSuffix,
|
|
8
9
|
} from "../../../Types/Monitor/HostAlertTemplates";
|
|
9
10
|
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
11
|
+
import { hasRecoveryDeadBand } from "./Utils/RecommendationCriteriaAssertions";
|
|
10
12
|
import MonitorStepHostMonitor from "../../../Types/Monitor/MonitorStepHostMonitor";
|
|
11
13
|
import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
|
|
12
14
|
import { FilterType } from "../../../Types/Monitor/CriteriaFilter";
|
|
@@ -19,26 +21,58 @@ import ObjectID from "../../../Types/ObjectID";
|
|
|
19
21
|
* system.memory.utilization, ...). A rename in the host receiver would
|
|
20
22
|
* make the template match nothing while staying "registered".
|
|
21
23
|
*
|
|
22
|
-
* 2.
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* count
|
|
24
|
+
* 2. The per-state ATTRIBUTE FILTER on the utilization metrics. Both
|
|
25
|
+
* `system.cpu.utilization` and `system.memory.utilization` are reported
|
|
26
|
+
* once per state, and a state set sums to 1, so an UNFILTERED average
|
|
27
|
+
* lands at ~1/(state count) — about 0.125 for CPU on Linux — no matter
|
|
28
|
+
* how loaded the host is. Dropping the filter would silently make these
|
|
29
|
+
* templates unable to fire at all, which is exactly what they did
|
|
30
|
+
* before. The derivation matches the host Overview page: CPU busy =
|
|
31
|
+
* state user + state system, memory = state used.
|
|
26
32
|
*
|
|
27
|
-
* 3.
|
|
28
|
-
*
|
|
29
|
-
*
|
|
33
|
+
* 3. The utilization templates carry an explicit `* 100` formula with
|
|
34
|
+
* `legendUnit: "%"`, so the compared value AND the root-cause line are
|
|
35
|
+
* in percent and the threshold is the literal 80 / 85 / 90 the title
|
|
36
|
+
* quotes. Doing this with a query-level `legendUnit` instead would push
|
|
37
|
+
* the conversion into MetricResultUnitConverter, which is a no-op when
|
|
38
|
+
* the metric's native unit was never recorded at ingest — the template
|
|
39
|
+
* would then compare a [0, 1] sample against 80 and never fire.
|
|
30
40
|
*
|
|
31
|
-
* 4.
|
|
32
|
-
*
|
|
41
|
+
* 4. Aggregation: filesystem usage and process count use `Max` so a single
|
|
42
|
+
* full mount is not diluted by averaging the host's other mounts; the
|
|
43
|
+
* rest use `Avg` for a representative sustained reading. NOTE that
|
|
44
|
+
* `system.processes.count` is partitioned by status, so ungrouped `Max`
|
|
45
|
+
* compares the LARGEST STATUS BUCKET, not the host's total process
|
|
46
|
+
* count — the template description says so deliberately.
|
|
47
|
+
*
|
|
48
|
+
* 5. The unhealthy criteria fires above the threshold and the healthy one
|
|
49
|
+
* recovers at a threshold strictly INSIDE it — a dead band, not a
|
|
50
|
+
* partition.
|
|
51
|
+
*
|
|
52
|
+
* 6. Incident titles name the HOST, not the monitor. The recommendation
|
|
53
|
+
* flow rewrites monitorName to "<host> - <template name>" before the
|
|
54
|
+
* template ever sees it, so interpolating it repeated the template name.
|
|
33
55
|
*/
|
|
34
56
|
|
|
57
|
+
interface HostQueryCase {
|
|
58
|
+
metricName: string;
|
|
59
|
+
metricAlias: string;
|
|
60
|
+
aggregation: MetricsAggregationType;
|
|
61
|
+
// {} for a metric that is a single series per host.
|
|
62
|
+
attributes: Record<string, string>;
|
|
63
|
+
}
|
|
64
|
+
|
|
35
65
|
interface HostTemplateCase {
|
|
36
66
|
id: string;
|
|
37
67
|
category: HostAlertTemplateCategory;
|
|
38
68
|
severity: "Critical" | "Warning";
|
|
39
|
-
|
|
69
|
+
queries: Array<HostQueryCase>;
|
|
70
|
+
// The alias the criteria compare on: a formula alias where one exists.
|
|
40
71
|
metricAlias: string;
|
|
41
|
-
|
|
72
|
+
// The formula that produces `metricAlias`, or null for a bare query.
|
|
73
|
+
formula: string | null;
|
|
74
|
+
// The display unit the alert renders. "%" wherever a formula scales.
|
|
75
|
+
legendUnit: string | undefined;
|
|
42
76
|
threshold: number;
|
|
43
77
|
}
|
|
44
78
|
|
|
@@ -47,52 +81,104 @@ const HOST_TEMPLATES: Array<HostTemplateCase> = [
|
|
|
47
81
|
id: "host-high-cpu",
|
|
48
82
|
category: "Resource",
|
|
49
83
|
severity: "Warning",
|
|
50
|
-
|
|
84
|
+
/*
|
|
85
|
+
* user + system, each its own state series. NOT the unfiltered metric:
|
|
86
|
+
* averaging every (cpu, state) datapoint sits near 1/(state count).
|
|
87
|
+
*/
|
|
88
|
+
queries: [
|
|
89
|
+
{
|
|
90
|
+
metricName: "system.cpu.utilization",
|
|
91
|
+
metricAlias: "host_cpu_user",
|
|
92
|
+
aggregation: MetricsAggregationType.Avg,
|
|
93
|
+
attributes: { state: "user" },
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
metricName: "system.cpu.utilization",
|
|
97
|
+
metricAlias: "host_cpu_system",
|
|
98
|
+
aggregation: MetricsAggregationType.Avg,
|
|
99
|
+
attributes: { state: "system" },
|
|
100
|
+
},
|
|
101
|
+
],
|
|
51
102
|
metricAlias: "host_cpu",
|
|
52
|
-
|
|
53
|
-
|
|
103
|
+
formula: "(host_cpu_user + host_cpu_system) * 100",
|
|
104
|
+
legendUnit: "%",
|
|
105
|
+
threshold: 80,
|
|
54
106
|
},
|
|
55
107
|
{
|
|
56
108
|
id: "host-high-memory",
|
|
57
109
|
category: "Resource",
|
|
58
110
|
severity: "Warning",
|
|
59
|
-
|
|
111
|
+
queries: [
|
|
112
|
+
{
|
|
113
|
+
metricName: "system.memory.utilization",
|
|
114
|
+
metricAlias: "host_memory_used",
|
|
115
|
+
aggregation: MetricsAggregationType.Avg,
|
|
116
|
+
attributes: { state: "used" },
|
|
117
|
+
},
|
|
118
|
+
],
|
|
60
119
|
metricAlias: "host_memory",
|
|
61
|
-
|
|
62
|
-
|
|
120
|
+
formula: "host_memory_used * 100",
|
|
121
|
+
legendUnit: "%",
|
|
122
|
+
threshold: 85,
|
|
63
123
|
},
|
|
64
124
|
{
|
|
65
125
|
id: "host-high-filesystem",
|
|
66
126
|
category: "Resource",
|
|
67
127
|
severity: "Critical",
|
|
68
|
-
|
|
128
|
+
queries: [
|
|
129
|
+
{
|
|
130
|
+
metricName: "system.filesystem.utilization",
|
|
131
|
+
metricAlias: "host_filesystem_ratio",
|
|
132
|
+
// Max so a single full filesystem is not diluted by averaging mounts.
|
|
133
|
+
aggregation: MetricsAggregationType.Max,
|
|
134
|
+
attributes: {},
|
|
135
|
+
},
|
|
136
|
+
],
|
|
69
137
|
metricAlias: "host_filesystem",
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
threshold:
|
|
138
|
+
formula: "host_filesystem_ratio * 100",
|
|
139
|
+
legendUnit: "%",
|
|
140
|
+
threshold: 90,
|
|
73
141
|
},
|
|
74
142
|
{
|
|
75
143
|
id: "host-high-load-average",
|
|
76
144
|
category: "Resource",
|
|
77
145
|
severity: "Warning",
|
|
78
|
-
|
|
146
|
+
queries: [
|
|
147
|
+
{
|
|
148
|
+
metricName: "system.cpu.load_average.1m",
|
|
149
|
+
metricAlias: "host_load_1m",
|
|
150
|
+
aggregation: MetricsAggregationType.Avg,
|
|
151
|
+
attributes: {},
|
|
152
|
+
},
|
|
153
|
+
],
|
|
79
154
|
metricAlias: "host_load_1m",
|
|
80
|
-
|
|
81
|
-
|
|
155
|
+
formula: null,
|
|
156
|
+
legendUnit: undefined,
|
|
157
|
+
// Load average is a raw run-queue length, not a ratio - threshold is 4.
|
|
82
158
|
threshold: 4,
|
|
83
159
|
},
|
|
84
160
|
{
|
|
85
161
|
id: "host-high-processes",
|
|
86
162
|
category: "Host",
|
|
87
163
|
severity: "Warning",
|
|
88
|
-
|
|
164
|
+
queries: [
|
|
165
|
+
{
|
|
166
|
+
metricName: "system.processes.count",
|
|
167
|
+
metricAlias: "host_processes",
|
|
168
|
+
aggregation: MetricsAggregationType.Max,
|
|
169
|
+
attributes: {},
|
|
170
|
+
},
|
|
171
|
+
],
|
|
89
172
|
metricAlias: "host_processes",
|
|
90
|
-
|
|
173
|
+
formula: null,
|
|
174
|
+
legendUnit: undefined,
|
|
91
175
|
threshold: 2000,
|
|
92
176
|
},
|
|
93
177
|
];
|
|
94
178
|
|
|
95
|
-
function buildArgs(
|
|
179
|
+
function buildArgs(
|
|
180
|
+
overrides?: Partial<HostAlertTemplateArgs>,
|
|
181
|
+
): HostAlertTemplateArgs {
|
|
96
182
|
return {
|
|
97
183
|
hostIdentifier: "host-01",
|
|
98
184
|
onlineMonitorStatusId: ObjectID.generate(),
|
|
@@ -100,6 +186,7 @@ function buildArgs(): HostAlertTemplateArgs {
|
|
|
100
186
|
defaultIncidentSeverityId: ObjectID.generate(),
|
|
101
187
|
defaultAlertSeverityId: ObjectID.generate(),
|
|
102
188
|
monitorName: "Test Host Monitor",
|
|
189
|
+
...(overrides || {}),
|
|
103
190
|
};
|
|
104
191
|
}
|
|
105
192
|
|
|
@@ -112,6 +199,12 @@ function getHostMonitor(step: MonitorStep): MonitorStepHostMonitor {
|
|
|
112
199
|
return hostMonitor;
|
|
113
200
|
}
|
|
114
201
|
|
|
202
|
+
function getOfflineInstance(step: MonitorStep): any {
|
|
203
|
+
return (
|
|
204
|
+
step.data?.monitorCriteria.data?.monitorCriteriaInstanceArray as Array<any>
|
|
205
|
+
)[0];
|
|
206
|
+
}
|
|
207
|
+
|
|
115
208
|
describe("HostAlertTemplates", () => {
|
|
116
209
|
test("every documented template id is registered and the suite is exhaustive", () => {
|
|
117
210
|
const ids: Array<string> = getAllHostAlertTemplates().map(
|
|
@@ -173,7 +266,7 @@ describe("HostAlertTemplates", () => {
|
|
|
173
266
|
);
|
|
174
267
|
|
|
175
268
|
test.each(HOST_TEMPLATES)(
|
|
176
|
-
"$id queries
|
|
269
|
+
"$id queries the intended metrics, states and aggregations",
|
|
177
270
|
(tc: HostTemplateCase) => {
|
|
178
271
|
const template: HostAlertTemplate = getHostAlertTemplateById(tc.id)!;
|
|
179
272
|
const step: MonitorStep = template.getMonitorStep(buildArgs());
|
|
@@ -183,17 +276,115 @@ describe("HostAlertTemplates", () => {
|
|
|
183
276
|
|
|
184
277
|
const queryConfigs: Array<any> = monitor.metricViewConfig
|
|
185
278
|
.queryConfigs as Array<any>;
|
|
186
|
-
expect(queryConfigs).toHaveLength(
|
|
187
|
-
|
|
279
|
+
expect(queryConfigs).toHaveLength(tc.queries.length);
|
|
280
|
+
|
|
281
|
+
tc.queries.forEach((expected: HostQueryCase, index: number) => {
|
|
282
|
+
const queryConfig: any = queryConfigs[index];
|
|
283
|
+
const filterData: any = queryConfig.metricQueryData.filterData;
|
|
284
|
+
|
|
285
|
+
expect(queryConfig.metricAliasData.metricVariable).toBe(
|
|
286
|
+
expected.metricAlias,
|
|
287
|
+
);
|
|
288
|
+
expect(filterData.metricName).toBe(expected.metricName);
|
|
289
|
+
expect(filterData.aggegationType).toBe(expected.aggregation);
|
|
290
|
+
/*
|
|
291
|
+
* The state filter is the whole reason the utilization templates
|
|
292
|
+
* can fire at all. Asserted exactly, not just "non-empty": a wrong
|
|
293
|
+
* state value is as fatal as a missing one.
|
|
294
|
+
*/
|
|
295
|
+
expect(filterData.attributes).toEqual(expected.attributes);
|
|
296
|
+
});
|
|
188
297
|
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
298
|
+
const formulaConfigs: Array<any> = (monitor.metricViewConfig
|
|
299
|
+
.formulaConfigs || []) as Array<any>;
|
|
300
|
+
|
|
301
|
+
if (tc.formula === null) {
|
|
302
|
+
expect(formulaConfigs).toHaveLength(0);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
expect(formulaConfigs).toHaveLength(1);
|
|
307
|
+
expect(formulaConfigs[0].metricAliasData.metricVariable).toBe(
|
|
308
|
+
tc.metricAlias,
|
|
309
|
+
);
|
|
310
|
+
expect(formulaConfigs[0].metricFormulaData.metricFormula).toBe(
|
|
311
|
+
tc.formula,
|
|
312
|
+
);
|
|
313
|
+
/*
|
|
314
|
+
* The unit the root-cause line renders, and the formula alias is the
|
|
315
|
+
* ONLY place it can come from. MetricMonitorCriteria resolves a
|
|
316
|
+
* criteria's unit as: the matched QUERY's legendUnit, then the matched
|
|
317
|
+
* FORMULA's, then the metric's native unit. These criteria compare on
|
|
318
|
+
* the formula alias, so no query matches; and the native-unit fallback
|
|
319
|
+
* keys off the matched query's metric name, so it is never reached
|
|
320
|
+
* either. Drop this legendUnit and the body reads a bare "87.30" under
|
|
321
|
+
* a title that says 85%.
|
|
322
|
+
*/
|
|
323
|
+
expect(formulaConfigs[0].metricAliasData.legendUnit).toBe(tc.legendUnit);
|
|
324
|
+
},
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
test.each(HOST_TEMPLATES)(
|
|
328
|
+
"$id never puts a legendUnit on an operand query",
|
|
329
|
+
(tc: HostTemplateCase) => {
|
|
330
|
+
/*
|
|
331
|
+
* MetricResultUnitConverter converts query results into the query
|
|
332
|
+
* alias's legendUnit, and MetricUnitUtil treats OTel's dimensionless
|
|
333
|
+
* "1" and "%" as one family — so a "%" on an operand would scale it by
|
|
334
|
+
* 100 BEFORE the formula's own `* 100`, reporting 8730 % instead of
|
|
335
|
+
* 87.30 %. Formula configs are never converted, which is why the unit
|
|
336
|
+
* belongs there and only there.
|
|
337
|
+
*/
|
|
338
|
+
const template: HostAlertTemplate = getHostAlertTemplateById(tc.id)!;
|
|
339
|
+
const step: MonitorStep = template.getMonitorStep(buildArgs());
|
|
340
|
+
const monitor: MonitorStepHostMonitor = getHostMonitor(step);
|
|
341
|
+
|
|
342
|
+
for (const queryConfig of monitor.metricViewConfig
|
|
343
|
+
.queryConfigs as Array<any>) {
|
|
344
|
+
expect(queryConfig.metricAliasData.legendUnit).toBeUndefined();
|
|
345
|
+
}
|
|
192
346
|
},
|
|
193
347
|
);
|
|
194
348
|
|
|
195
349
|
test.each(HOST_TEMPLATES)(
|
|
196
|
-
"$id
|
|
350
|
+
"$id names the host, not the monitor, in its incident title",
|
|
351
|
+
(tc: HostTemplateCase) => {
|
|
352
|
+
const template: HostAlertTemplate = getHostAlertTemplateById(tc.id)!;
|
|
353
|
+
const step: MonitorStep = template.getMonitorStep(buildArgs());
|
|
354
|
+
|
|
355
|
+
const title: string = getOfflineInstance(step).data.incidents[0]
|
|
356
|
+
.title as string;
|
|
357
|
+
|
|
358
|
+
/*
|
|
359
|
+
* The recommendation flow passes monitorName as
|
|
360
|
+
* "<host> - <template name>", so interpolating it produced
|
|
361
|
+
* "[Host] High CPU Utilization (>80%) - web-01 - High CPU
|
|
362
|
+
* Utilization". The host identifier is the identity the reader needs
|
|
363
|
+
* and this says it exactly once.
|
|
364
|
+
*/
|
|
365
|
+
expect(title).toContain("host-01");
|
|
366
|
+
expect(title).not.toContain("Test Host Monitor");
|
|
367
|
+
expect(title.endsWith(" - host-01")).toBe(true);
|
|
368
|
+
},
|
|
369
|
+
);
|
|
370
|
+
|
|
371
|
+
test("hostTitleSuffix degrades to no suffix rather than an empty one", () => {
|
|
372
|
+
/*
|
|
373
|
+
* HostMonitorStepForm passes `hostIdentifier || ""`. A blank identifier
|
|
374
|
+
* must not produce a title ending in a dangling " - ".
|
|
375
|
+
*/
|
|
376
|
+
expect(hostTitleSuffix(buildArgs({ hostIdentifier: "web-01" }))).toBe(
|
|
377
|
+
" - web-01",
|
|
378
|
+
);
|
|
379
|
+
expect(hostTitleSuffix(buildArgs({ hostIdentifier: " web-01 " }))).toBe(
|
|
380
|
+
" - web-01",
|
|
381
|
+
);
|
|
382
|
+
expect(hostTitleSuffix(buildArgs({ hostIdentifier: "" }))).toBe("");
|
|
383
|
+
expect(hostTitleSuffix(buildArgs({ hostIdentifier: " " }))).toBe("");
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
test.each(HOST_TEMPLATES)(
|
|
387
|
+
"$id unhealthy/healthy criteria leave a recovery dead band below $threshold",
|
|
197
388
|
(tc: HostTemplateCase) => {
|
|
198
389
|
const template: HostAlertTemplate = getHostAlertTemplateById(tc.id)!;
|
|
199
390
|
const step: MonitorStep = template.getMonitorStep(buildArgs());
|
|
@@ -213,7 +404,26 @@ describe("HostAlertTemplates", () => {
|
|
|
213
404
|
tc.metricAlias,
|
|
214
405
|
);
|
|
215
406
|
expect(offlineFilter.value).toBe(tc.threshold);
|
|
216
|
-
|
|
407
|
+
/*
|
|
408
|
+
* The healthy criteria recovers at a threshold strictly INSIDE the
|
|
409
|
+
* firing one, so a metric hovering at the boundary cannot satisfy
|
|
410
|
+
* both on consecutive evaluations. This assertion used to be
|
|
411
|
+
* `expect(onlineFilter.value).toBe(tc.threshold)` — the two criteria
|
|
412
|
+
* exactly partitioned the range, which is the flapping configuration
|
|
413
|
+
* this suite existed to lock in.
|
|
414
|
+
*/
|
|
415
|
+
expect(
|
|
416
|
+
hasRecoveryDeadBand(
|
|
417
|
+
{
|
|
418
|
+
filterType: offlineFilter.filterType,
|
|
419
|
+
value: offlineFilter.value as number,
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
filterType: onlineFilter.filterType,
|
|
423
|
+
value: onlineFilter.value as number,
|
|
424
|
+
},
|
|
425
|
+
),
|
|
426
|
+
).toBe(true);
|
|
217
427
|
|
|
218
428
|
// Host ceilings are all "> threshold" unhealthy / "<= threshold" healthy.
|
|
219
429
|
expect(offlineFilter.filterType).toBe(FilterType.GreaterThan);
|
|
@@ -226,24 +436,142 @@ describe("HostAlertTemplates", () => {
|
|
|
226
436
|
},
|
|
227
437
|
);
|
|
228
438
|
|
|
229
|
-
test("
|
|
439
|
+
test("percent-scaled templates threshold on the 0-100 scale their formula produces", () => {
|
|
230
440
|
/*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
441
|
+
* The utilization metrics arrive as a [0, 1] ratio and each of these
|
|
442
|
+
* templates multiplies by 100 in its formula, so the threshold must be
|
|
443
|
+
* the percent number the title quotes. A slip back to 0.8 / 0.85 / 0.9
|
|
444
|
+
* against the percent-scaled formula would fire on any host above 1%
|
|
445
|
+
* busy; dropping the `* 100` while keeping 80 / 85 / 90 would make them
|
|
446
|
+
* unreachable. The two halves have to move together, so both are pinned
|
|
447
|
+
* here on the same case.
|
|
233
448
|
*/
|
|
234
|
-
const
|
|
449
|
+
const percentIds: Array<string> = [
|
|
235
450
|
"host-high-cpu",
|
|
236
451
|
"host-high-memory",
|
|
237
452
|
"host-high-filesystem",
|
|
238
453
|
];
|
|
239
|
-
for (const id of
|
|
454
|
+
for (const id of percentIds) {
|
|
240
455
|
const tc: HostTemplateCase = HOST_TEMPLATES.find(
|
|
241
456
|
(t: HostTemplateCase) => {
|
|
242
457
|
return t.id === id;
|
|
243
458
|
},
|
|
244
459
|
)!;
|
|
245
|
-
expect(tc.
|
|
246
|
-
expect(tc.
|
|
460
|
+
expect(tc.formula).toContain("* 100");
|
|
461
|
+
expect(tc.legendUnit).toBe("%");
|
|
462
|
+
expect(tc.threshold).toBeGreaterThan(1);
|
|
463
|
+
expect(tc.threshold).toBeLessThanOrEqual(100);
|
|
464
|
+
|
|
465
|
+
// And the template really does ship what the table claims.
|
|
466
|
+
const template: HostAlertTemplate = getHostAlertTemplateById(id)!;
|
|
467
|
+
const monitor: MonitorStepHostMonitor = getHostMonitor(
|
|
468
|
+
template.getMonitorStep(buildArgs()),
|
|
469
|
+
);
|
|
470
|
+
expect(
|
|
471
|
+
(monitor.metricViewConfig.formulaConfigs as Array<any>)[0]
|
|
472
|
+
.metricFormulaData.metricFormula,
|
|
473
|
+
).toContain("* 100");
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
test("host-high-cpu derives busy time from the user and system states only", () => {
|
|
478
|
+
/*
|
|
479
|
+
* The regression this pins: an unfiltered Avg over system.cpu.utilization
|
|
480
|
+
* averages `idle` in with `user` and `system`. A cpu's states sum to 1,
|
|
481
|
+
* so the answer is ~1/(state count) — about 0.125 on Linux — however busy
|
|
482
|
+
* the host is, and a "> 80" criteria can never be met. `1 - idle` is the
|
|
483
|
+
* other derivation and is deliberately not used: it breaks if a platform
|
|
484
|
+
* stops emitting `idle`.
|
|
485
|
+
*/
|
|
486
|
+
const template: HostAlertTemplate =
|
|
487
|
+
getHostAlertTemplateById("host-high-cpu")!;
|
|
488
|
+
const monitor: MonitorStepHostMonitor = getHostMonitor(
|
|
489
|
+
template.getMonitorStep(buildArgs()),
|
|
490
|
+
);
|
|
491
|
+
|
|
492
|
+
const states: Array<string> = (
|
|
493
|
+
monitor.metricViewConfig.queryConfigs as Array<any>
|
|
494
|
+
).map((q: any) => {
|
|
495
|
+
return q.metricQueryData.filterData.attributes["state"];
|
|
496
|
+
});
|
|
497
|
+
expect(states.slice().sort()).toEqual(["system", "user"]);
|
|
498
|
+
|
|
499
|
+
// Both operands must appear in the formula or one series is dead weight.
|
|
500
|
+
const formula: string = (
|
|
501
|
+
monitor.metricViewConfig.formulaConfigs as Array<any>
|
|
502
|
+
)[0].metricFormulaData.metricFormula;
|
|
503
|
+
for (const alias of (
|
|
504
|
+
monitor.metricViewConfig.queryConfigs as Array<any>
|
|
505
|
+
).map((q: any) => {
|
|
506
|
+
return q.metricAliasData.metricVariable;
|
|
507
|
+
})) {
|
|
508
|
+
expect(formula).toContain(alias);
|
|
247
509
|
}
|
|
248
510
|
});
|
|
511
|
+
|
|
512
|
+
test("host-high-memory measures used memory, not the mean of every memory state", () => {
|
|
513
|
+
const template: HostAlertTemplate =
|
|
514
|
+
getHostAlertTemplateById("host-high-memory")!;
|
|
515
|
+
const monitor: MonitorStepHostMonitor = getHostMonitor(
|
|
516
|
+
template.getMonitorStep(buildArgs()),
|
|
517
|
+
);
|
|
518
|
+
|
|
519
|
+
const queryConfigs: Array<any> = monitor.metricViewConfig
|
|
520
|
+
.queryConfigs as Array<any>;
|
|
521
|
+
expect(queryConfigs).toHaveLength(1);
|
|
522
|
+
expect(queryConfigs[0].metricQueryData.filterData.attributes).toEqual({
|
|
523
|
+
state: "used",
|
|
524
|
+
});
|
|
525
|
+
});
|
|
526
|
+
|
|
527
|
+
test("host-high-filesystem still raises one alert per mount", () => {
|
|
528
|
+
/*
|
|
529
|
+
* The group-by is the identity of the alert. Moving the query behind a
|
|
530
|
+
* formula must not drop it, or one full mount silences every other mount
|
|
531
|
+
* on the host for as long as its incident stays open.
|
|
532
|
+
*/
|
|
533
|
+
const template: HostAlertTemplate = getHostAlertTemplateById(
|
|
534
|
+
"host-high-filesystem",
|
|
535
|
+
)!;
|
|
536
|
+
const monitor: MonitorStepHostMonitor = getHostMonitor(
|
|
537
|
+
template.getMonitorStep(buildArgs()),
|
|
538
|
+
);
|
|
539
|
+
|
|
540
|
+
expect(
|
|
541
|
+
(monitor.metricViewConfig.queryConfigs as Array<any>)[0].metricQueryData
|
|
542
|
+
.groupByAttributeKeys,
|
|
543
|
+
).toEqual(["mountpoint", "device"]);
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
test("host-high-processes copy does not claim a total process count", () => {
|
|
547
|
+
/*
|
|
548
|
+
* `system.processes.count` is one datapoint per process status, and this
|
|
549
|
+
* query is ungrouped and unfiltered, so Max compares the largest single
|
|
550
|
+
* status bucket. The old copy said "a monitored host has an unusually
|
|
551
|
+
* high number of processes", which no one could reconcile with a process
|
|
552
|
+
* listing.
|
|
553
|
+
*/
|
|
554
|
+
const template: HostAlertTemplate = getHostAlertTemplateById(
|
|
555
|
+
"host-high-processes",
|
|
556
|
+
)!;
|
|
557
|
+
const step: MonitorStep = template.getMonitorStep(buildArgs());
|
|
558
|
+
const description: string = getOfflineInstance(step).data.incidents[0]
|
|
559
|
+
.description as string;
|
|
560
|
+
|
|
561
|
+
expect(description).toContain("largest single process-state bucket");
|
|
562
|
+
expect(description).toContain("NOT the host's total process count");
|
|
563
|
+
// The scraper is Linux-only; a silent monitor elsewhere needs saying.
|
|
564
|
+
expect(description.toLowerCase()).toContain("linux only");
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
test("host-high-load-average admits its threshold is not core-normalized", () => {
|
|
568
|
+
const template: HostAlertTemplate = getHostAlertTemplateById(
|
|
569
|
+
"host-high-load-average",
|
|
570
|
+
)!;
|
|
571
|
+
const step: MonitorStep = template.getMonitorStep(buildArgs());
|
|
572
|
+
const description: string = getOfflineInstance(step).data.incidents[0]
|
|
573
|
+
.description as string;
|
|
574
|
+
|
|
575
|
+
expect(description).toContain("NOT normalized by core count");
|
|
576
|
+
});
|
|
249
577
|
});
|