@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
|
@@ -7,10 +7,16 @@ import {
|
|
|
7
7
|
getDockerAlertTemplatesByCategory,
|
|
8
8
|
} from "../../../Types/Monitor/DockerAlertTemplates";
|
|
9
9
|
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
10
|
+
import { hasRecoveryDeadBand } from "./Utils/RecommendationCriteriaAssertions";
|
|
10
11
|
import MonitorStepDockerMonitor from "../../../Types/Monitor/MonitorStepDockerMonitor";
|
|
11
12
|
import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
|
|
12
13
|
import RollingTime from "../../../Types/RollingTime/RollingTime";
|
|
13
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
CriteriaFilter,
|
|
16
|
+
EvaluateOverTimeType,
|
|
17
|
+
FilterType,
|
|
18
|
+
} from "../../../Types/Monitor/CriteriaFilter";
|
|
19
|
+
import CompareCriteria from "../../../Server/Utils/Monitor/Criteria/CompareCriteria";
|
|
14
20
|
import ObjectID from "../../../Types/ObjectID";
|
|
15
21
|
|
|
16
22
|
/*
|
|
@@ -30,9 +36,19 @@ import ObjectID from "../../../Types/ObjectID";
|
|
|
30
36
|
* (a value matching neither leaves the monitor stuck in its previous
|
|
31
37
|
* status) and no overlap (a value matching both makes the status depend
|
|
32
38
|
* on evaluation order). The failure mode is a strict/non-strict slip.
|
|
33
|
-
* The
|
|
34
|
-
* the non-negative domain with
|
|
39
|
+
* The one remaining zero-boundary template (container-down) partitions
|
|
40
|
+
* the non-negative domain with `= 0` / `> 0`, so it is pinned per case
|
|
35
41
|
* rather than by a generic complement rule.
|
|
42
|
+
*
|
|
43
|
+
* 4. The CUMULATIVE-COUNTER templates. `container.restarts` and
|
|
44
|
+
* `container.cpu.throttling_data.throttled_time` are monotonic LIFETIME
|
|
45
|
+
* counters. Both used to be compared to a static threshold, which fires
|
|
46
|
+
* on ancient history and can never recover — the counter cannot come
|
|
47
|
+
* back down, so the complementary healthy comparison is unreachable by
|
|
48
|
+
* construction. They now threshold the counter's per-minute GROWTH
|
|
49
|
+
* (`max - min`, summed over the window) via a two-query + formula
|
|
50
|
+
* config, and the tests below pin every part of that shape whose
|
|
51
|
+
* breakage would be SILENT.
|
|
36
52
|
*/
|
|
37
53
|
|
|
38
54
|
interface DockerTemplateCase {
|
|
@@ -46,6 +62,13 @@ interface DockerTemplateCase {
|
|
|
46
62
|
offlineFilterType: FilterType;
|
|
47
63
|
onlineFilterType: FilterType;
|
|
48
64
|
threshold: number;
|
|
65
|
+
/*
|
|
66
|
+
* Query/formula shape. A single-metric threshold template has exactly one
|
|
67
|
+
* query and no formula, which is the default; a template that differences a
|
|
68
|
+
* cumulative counter pins its own counts.
|
|
69
|
+
*/
|
|
70
|
+
queryCount?: number;
|
|
71
|
+
formulaCount?: number;
|
|
49
72
|
}
|
|
50
73
|
|
|
51
74
|
const DOCKER_TEMPLATES: Array<DockerTemplateCase> = [
|
|
@@ -77,26 +100,42 @@ const DOCKER_TEMPLATES: Array<DockerTemplateCase> = [
|
|
|
77
100
|
id: "docker-restart-loop",
|
|
78
101
|
category: "Container",
|
|
79
102
|
severity: "Critical",
|
|
103
|
+
// queryConfigs[0] is the Max half of the per-minute delta pair.
|
|
80
104
|
metricName: "container.restarts",
|
|
105
|
+
// The criteria threshold the FORMULA, not either query.
|
|
81
106
|
metricAlias: "container_restarts",
|
|
82
107
|
aggregation: MetricsAggregationType.Max,
|
|
83
|
-
|
|
108
|
+
/*
|
|
109
|
+
* A lifetime counter, so the template alerts on its growth over a window
|
|
110
|
+
* wide enough for the 30s-scrape delta to see a real loop.
|
|
111
|
+
*/
|
|
112
|
+
rollingTime: RollingTime.Past15Minutes,
|
|
113
|
+
queryCount: 2,
|
|
114
|
+
formulaCount: 1,
|
|
84
115
|
offlineFilterType: FilterType.GreaterThan,
|
|
85
116
|
onlineFilterType: FilterType.LessThanOrEqualTo,
|
|
86
|
-
threshold:
|
|
117
|
+
threshold: 3,
|
|
87
118
|
},
|
|
88
119
|
{
|
|
89
120
|
id: "docker-cpu-throttling",
|
|
90
121
|
category: "Resource",
|
|
91
122
|
severity: "Warning",
|
|
123
|
+
// queryConfigs[0] is the Max half of the per-minute delta pair.
|
|
92
124
|
metricName: "container.cpu.throttling_data.throttled_time",
|
|
125
|
+
// The criteria threshold the FORMULA, not either query.
|
|
93
126
|
metricAlias: "cpu_throttled",
|
|
94
127
|
aggregation: MetricsAggregationType.Max,
|
|
95
128
|
rollingTime: RollingTime.Past5Minutes,
|
|
96
|
-
|
|
129
|
+
/*
|
|
130
|
+
* A lifetime NANOSECOND counter, so the template alerts on its growth
|
|
131
|
+
* (max - min per minute, summed): milliseconds of throttling per five
|
|
132
|
+
* minutes, not the container's lifetime total.
|
|
133
|
+
*/
|
|
134
|
+
queryCount: 2,
|
|
135
|
+
formulaCount: 1,
|
|
97
136
|
offlineFilterType: FilterType.GreaterThan,
|
|
98
|
-
onlineFilterType: FilterType.
|
|
99
|
-
threshold:
|
|
137
|
+
onlineFilterType: FilterType.LessThanOrEqualTo,
|
|
138
|
+
threshold: 1000,
|
|
100
139
|
},
|
|
101
140
|
{
|
|
102
141
|
id: "docker-high-pids",
|
|
@@ -108,7 +147,12 @@ const DOCKER_TEMPLATES: Array<DockerTemplateCase> = [
|
|
|
108
147
|
rollingTime: RollingTime.Past5Minutes,
|
|
109
148
|
offlineFilterType: FilterType.GreaterThan,
|
|
110
149
|
onlineFilterType: FilterType.LessThanOrEqualTo,
|
|
111
|
-
|
|
150
|
+
/*
|
|
151
|
+
* The cgroup pids controller counts TASKS (threads included), so 500 was
|
|
152
|
+
* ordinary for a JVM or a Go binary and the alert asserted a fork bomb
|
|
153
|
+
* against a container working as designed.
|
|
154
|
+
*/
|
|
155
|
+
threshold: 2000,
|
|
112
156
|
},
|
|
113
157
|
{
|
|
114
158
|
id: "docker-container-down",
|
|
@@ -222,9 +266,16 @@ describe("DockerAlertTemplates", () => {
|
|
|
222
266
|
|
|
223
267
|
const queryConfigs: Array<any> = monitor.metricViewConfig
|
|
224
268
|
.queryConfigs as Array<any>;
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
269
|
+
/*
|
|
270
|
+
* A single-metric threshold template has exactly one query and no
|
|
271
|
+
* formula; a cumulative-counter template carries two queries (Max and
|
|
272
|
+
* Min over the same metric) and a difference formula, and pins its own
|
|
273
|
+
* counts in the case table above.
|
|
274
|
+
*/
|
|
275
|
+
expect(queryConfigs).toHaveLength(tc.queryCount ?? 1);
|
|
276
|
+
expect(monitor.metricViewConfig.formulaConfigs).toHaveLength(
|
|
277
|
+
tc.formulaCount ?? 0,
|
|
278
|
+
);
|
|
228
279
|
|
|
229
280
|
const filterData: any = queryConfigs[0].metricQueryData.filterData;
|
|
230
281
|
expect(filterData.metricName).toBe(tc.metricName);
|
|
@@ -234,7 +285,7 @@ describe("DockerAlertTemplates", () => {
|
|
|
234
285
|
);
|
|
235
286
|
|
|
236
287
|
test.each(DOCKER_TEMPLATES)(
|
|
237
|
-
"$id unhealthy/healthy criteria
|
|
288
|
+
"$id unhealthy/healthy criteria leave a recovery dead band around $threshold",
|
|
238
289
|
(tc: DockerTemplateCase) => {
|
|
239
290
|
const template: DockerAlertTemplate = getDockerAlertTemplateById(tc.id)!;
|
|
240
291
|
const step: MonitorStep = template.getMonitorStep(buildArgs());
|
|
@@ -248,7 +299,7 @@ describe("DockerAlertTemplates", () => {
|
|
|
248
299
|
const offlineFilter: any = offline.data.filters[0];
|
|
249
300
|
const onlineFilter: any = online.data.filters[0];
|
|
250
301
|
|
|
251
|
-
// Both criteria evaluate the
|
|
302
|
+
// Both criteria evaluate the same metric alias, at different thresholds.
|
|
252
303
|
expect(offlineFilter.metricMonitorOptions.metricAlias).toBe(
|
|
253
304
|
tc.metricAlias,
|
|
254
305
|
);
|
|
@@ -256,7 +307,26 @@ describe("DockerAlertTemplates", () => {
|
|
|
256
307
|
tc.metricAlias,
|
|
257
308
|
);
|
|
258
309
|
expect(offlineFilter.value).toBe(tc.threshold);
|
|
259
|
-
|
|
310
|
+
/*
|
|
311
|
+
* The healthy criteria recovers at a threshold strictly INSIDE the
|
|
312
|
+
* firing one, so a metric hovering at the boundary cannot satisfy
|
|
313
|
+
* both on consecutive evaluations. This assertion used to be
|
|
314
|
+
* `expect(onlineFilter.value).toBe(tc.threshold)` — the two criteria
|
|
315
|
+
* exactly partitioned the range, which is the flapping configuration
|
|
316
|
+
* this suite existed to lock in.
|
|
317
|
+
*/
|
|
318
|
+
expect(
|
|
319
|
+
hasRecoveryDeadBand(
|
|
320
|
+
{
|
|
321
|
+
filterType: offlineFilter.filterType,
|
|
322
|
+
value: offlineFilter.value as number,
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
filterType: onlineFilter.filterType,
|
|
326
|
+
value: onlineFilter.value as number,
|
|
327
|
+
},
|
|
328
|
+
),
|
|
329
|
+
).toBe(true);
|
|
260
330
|
|
|
261
331
|
// Only the comparison DIRECTION differs — pinned per template.
|
|
262
332
|
expect(offlineFilter.filterType).toBe(tc.offlineFilterType);
|
|
@@ -290,4 +360,414 @@ describe("DockerAlertTemplates", () => {
|
|
|
290
360
|
expect(offline.data.alerts[0].autoResolveAlert).toBe(true);
|
|
291
361
|
}
|
|
292
362
|
});
|
|
363
|
+
|
|
364
|
+
/*
|
|
365
|
+
* ---------------------------------------------------------------------
|
|
366
|
+
* Cumulative-counter guards.
|
|
367
|
+
*
|
|
368
|
+
* `container.restarts` is Docker's lifetime RestartCount and
|
|
369
|
+
* `container.cpu.throttling_data.throttled_time` is the cgroup's lifetime
|
|
370
|
+
* throttled nanoseconds. Both are monotonic: the value only ever goes up.
|
|
371
|
+
* Nothing between ingest and alerting differences them —
|
|
372
|
+
* OtelMetricsIngestService records aggregationTemporality/isMonotonic as
|
|
373
|
+
* catalog metadata for the browser's rate-view hint and stores the raw
|
|
374
|
+
* value, `transformAsRate` is read only by the chart code, and
|
|
375
|
+
* CompareCriteria.reduceWindow offers only Average/Sum/Max/Min.
|
|
376
|
+
*
|
|
377
|
+
* So a "> N" criteria on the RAW counter fires the first time the
|
|
378
|
+
* container ever breaches and never clears: the complementary healthy
|
|
379
|
+
* comparison is unreachable until the container is recreated. Both
|
|
380
|
+
* templates shipped exactly that. Every assertion below fails if someone
|
|
381
|
+
* points a criteria back at the raw counter.
|
|
382
|
+
* ---------------------------------------------------------------------
|
|
383
|
+
*/
|
|
384
|
+
|
|
385
|
+
const CUMULATIVE_METRICS: Array<string> = [
|
|
386
|
+
"container.restarts",
|
|
387
|
+
"container.cpu.throttling_data.throttled_time",
|
|
388
|
+
"container.cpu.throttling_data.throttled_periods",
|
|
389
|
+
"container.cpu.usage.total",
|
|
390
|
+
];
|
|
391
|
+
|
|
392
|
+
interface DeltaTemplateCase {
|
|
393
|
+
id: string;
|
|
394
|
+
metricName: string;
|
|
395
|
+
maxAlias: string;
|
|
396
|
+
minAlias: string;
|
|
397
|
+
resultAlias: string;
|
|
398
|
+
formula: string;
|
|
399
|
+
// A formula's legendUnit is a LABEL; it must be unset for a bare count.
|
|
400
|
+
legendUnit: string | undefined;
|
|
401
|
+
/*
|
|
402
|
+
* Per-minute GROWTH samples, the shape the formula produces. The busy
|
|
403
|
+
* window deliberately contains zeros and no single breaching minute:
|
|
404
|
+
* that is what makes it prove the window aggregation is Sum rather than
|
|
405
|
+
* the shared builder's AllValues default.
|
|
406
|
+
*/
|
|
407
|
+
busyWindow: Array<number>;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
const DELTA_TEMPLATES: Array<DeltaTemplateCase> = [
|
|
411
|
+
{
|
|
412
|
+
id: "docker-cpu-throttling",
|
|
413
|
+
metricName: "container.cpu.throttling_data.throttled_time",
|
|
414
|
+
maxAlias: "cpu_throttled_max",
|
|
415
|
+
minAlias: "cpu_throttled_min",
|
|
416
|
+
resultAlias: "cpu_throttled",
|
|
417
|
+
formula: "(cpu_throttled_max - cpu_throttled_min) / 1000000",
|
|
418
|
+
legendUnit: "ms",
|
|
419
|
+
// ms of throttling per minute: 1200 ms across five minutes, > 1000.
|
|
420
|
+
busyWindow: [0, 400, 0, 500, 300],
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
id: "docker-restart-loop",
|
|
424
|
+
metricName: "container.restarts",
|
|
425
|
+
maxAlias: "container_restarts_max",
|
|
426
|
+
minAlias: "container_restarts_min",
|
|
427
|
+
resultAlias: "container_restarts",
|
|
428
|
+
formula: "container_restarts_max - container_restarts_min",
|
|
429
|
+
legendUnit: undefined,
|
|
430
|
+
// Restarts per minute: 4 across the window, > 3, none in one minute.
|
|
431
|
+
busyWindow: [0, 1, 2, 0, 1],
|
|
432
|
+
},
|
|
433
|
+
];
|
|
434
|
+
|
|
435
|
+
test("no criteria compares a cumulative lifetime counter directly", () => {
|
|
436
|
+
/*
|
|
437
|
+
* The broad guard: if a template queries one of these counters at all,
|
|
438
|
+
* the alias its criteria threshold must name a FORMULA, never one of the
|
|
439
|
+
* raw queries. This is the single assertion that stops either template
|
|
440
|
+
* regressing, and stops a third being pasted in from the same mistake.
|
|
441
|
+
*/
|
|
442
|
+
for (const template of getAllDockerAlertTemplates()) {
|
|
443
|
+
const step: MonitorStep = template.getMonitorStep(buildArgs());
|
|
444
|
+
const monitor: MonitorStepDockerMonitor = getDockerMonitor(step);
|
|
445
|
+
|
|
446
|
+
const cumulativeQueryAliases: Array<string> = (
|
|
447
|
+
monitor.metricViewConfig.queryConfigs as Array<any>
|
|
448
|
+
)
|
|
449
|
+
.filter((q: any) => {
|
|
450
|
+
return CUMULATIVE_METRICS.includes(
|
|
451
|
+
q.metricQueryData.filterData.metricName,
|
|
452
|
+
);
|
|
453
|
+
})
|
|
454
|
+
.map((q: any) => {
|
|
455
|
+
return q.metricAliasData.metricVariable;
|
|
456
|
+
});
|
|
457
|
+
|
|
458
|
+
if (cumulativeQueryAliases.length === 0) {
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
const formulaAliases: Array<string> = (
|
|
463
|
+
(monitor.metricViewConfig.formulaConfigs as Array<any>) || []
|
|
464
|
+
).map((f: any) => {
|
|
465
|
+
return f.metricAliasData.metricVariable;
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
for (const instance of step.data?.monitorCriteria.data
|
|
469
|
+
?.monitorCriteriaInstanceArray as Array<any>) {
|
|
470
|
+
for (const filter of instance.data.filters as Array<any>) {
|
|
471
|
+
const alias: string = filter.metricMonitorOptions.metricAlias;
|
|
472
|
+
expect(cumulativeQueryAliases).not.toContain(alias);
|
|
473
|
+
expect(formulaAliases).toContain(alias);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
test.each(DELTA_TEMPLATES)(
|
|
480
|
+
"$id subtracts a Min query from a Max query over the same counter",
|
|
481
|
+
(dc: DeltaTemplateCase) => {
|
|
482
|
+
/*
|
|
483
|
+
* Both halves must read the SAME metric, differ ONLY in aggregation,
|
|
484
|
+
* and group identically. Max/Max makes the delta identically zero, and
|
|
485
|
+
* mismatched group-by keys split the two into series fingerprints that
|
|
486
|
+
* never meet (buildSeriesBreakdown joins by fingerprint) so the formula
|
|
487
|
+
* evaluates against an empty operand. Either slip makes the monitor
|
|
488
|
+
* stop alerting with no error at all.
|
|
489
|
+
*/
|
|
490
|
+
const monitor: MonitorStepDockerMonitor = getDockerMonitor(
|
|
491
|
+
getDockerAlertTemplateById(dc.id)!.getMonitorStep(buildArgs()),
|
|
492
|
+
);
|
|
493
|
+
|
|
494
|
+
const [maxQuery, minQuery] = monitor.metricViewConfig
|
|
495
|
+
.queryConfigs as Array<any>;
|
|
496
|
+
|
|
497
|
+
expect(maxQuery.metricQueryData.filterData.metricName).toBe(
|
|
498
|
+
dc.metricName,
|
|
499
|
+
);
|
|
500
|
+
expect(minQuery.metricQueryData.filterData.metricName).toBe(
|
|
501
|
+
dc.metricName,
|
|
502
|
+
);
|
|
503
|
+
expect(maxQuery.metricQueryData.filterData.aggegationType).toBe(
|
|
504
|
+
MetricsAggregationType.Max,
|
|
505
|
+
);
|
|
506
|
+
expect(minQuery.metricQueryData.filterData.aggegationType).toBe(
|
|
507
|
+
MetricsAggregationType.Min,
|
|
508
|
+
);
|
|
509
|
+
expect(minQuery.metricQueryData.groupByAttributeKeys).toEqual(
|
|
510
|
+
maxQuery.metricQueryData.groupByAttributeKeys,
|
|
511
|
+
);
|
|
512
|
+
expect(maxQuery.metricAliasData.metricVariable).toBe(dc.maxAlias);
|
|
513
|
+
expect(minQuery.metricAliasData.metricVariable).toBe(dc.minAlias);
|
|
514
|
+
|
|
515
|
+
/*
|
|
516
|
+
* Neither query carries a legendUnit, so MetricResultUnitConverter —
|
|
517
|
+
* which converts QUERY results only, from the MetricType native unit
|
|
518
|
+
* into legendUnit — passes the raw counter through untouched. Setting
|
|
519
|
+
* one here would convert BEFORE the formula subtracts.
|
|
520
|
+
*/
|
|
521
|
+
expect(maxQuery.metricAliasData.legendUnit).toBeUndefined();
|
|
522
|
+
expect(minQuery.metricAliasData.legendUnit).toBeUndefined();
|
|
523
|
+
|
|
524
|
+
const formula: any = (
|
|
525
|
+
monitor.metricViewConfig.formulaConfigs as Array<any>
|
|
526
|
+
)[0];
|
|
527
|
+
expect(formula.metricAliasData.metricVariable).toBe(dc.resultAlias);
|
|
528
|
+
expect(formula.metricFormulaData.metricFormula).toBe(dc.formula);
|
|
529
|
+
/*
|
|
530
|
+
* ns -> ms happens INSIDE the formula, never via legendUnit, because
|
|
531
|
+
* MetricResultUnitConverter does not touch formula results. The unit
|
|
532
|
+
* here is only a label — it is what makes the alert sentence read
|
|
533
|
+
* "... ms" — and it must stay unset for a dimensionless count, because
|
|
534
|
+
* MetricMonitorCriteria reads a formula's legendUnit as the sample
|
|
535
|
+
* unit to convert FROM.
|
|
536
|
+
*/
|
|
537
|
+
expect(formula.metricAliasData.legendUnit).toBe(dc.legendUnit);
|
|
538
|
+
},
|
|
539
|
+
);
|
|
540
|
+
|
|
541
|
+
test.each(DELTA_TEMPLATES)(
|
|
542
|
+
"$id sums the per-minute deltas on BOTH criteria",
|
|
543
|
+
(dc: DeltaTemplateCase) => {
|
|
544
|
+
/*
|
|
545
|
+
* Each sample is one minute's GROWTH of a cumulative counter, so the
|
|
546
|
+
* threshold only means "N per window" under Sum. The shared builder's
|
|
547
|
+
* AllValues default would instead demand a breach in every single
|
|
548
|
+
* minute — unreachable, because the first and last minute of a rolling
|
|
549
|
+
* window are partial and most minutes of a crash loop are zero. And
|
|
550
|
+
* the two criteria must agree, or the fire/recover pair is not
|
|
551
|
+
* comparing the same quantity.
|
|
552
|
+
*/
|
|
553
|
+
const step: MonitorStep = getDockerAlertTemplateById(
|
|
554
|
+
dc.id,
|
|
555
|
+
)!.getMonitorStep(buildArgs());
|
|
556
|
+
|
|
557
|
+
const instances: Array<any> = step.data?.monitorCriteria.data
|
|
558
|
+
?.monitorCriteriaInstanceArray as Array<any>;
|
|
559
|
+
|
|
560
|
+
expect(instances).toHaveLength(2);
|
|
561
|
+
for (const instance of instances) {
|
|
562
|
+
for (const filter of instance.data.filters as Array<any>) {
|
|
563
|
+
expect(filter.metricMonitorOptions.metricAggregationType).toBe(
|
|
564
|
+
EvaluateOverTimeType.Sum,
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
},
|
|
569
|
+
);
|
|
570
|
+
|
|
571
|
+
test.each(DELTA_TEMPLATES)(
|
|
572
|
+
"$id can actually recover — a quiet container clears, a busy one fires",
|
|
573
|
+
(dc: DeltaTemplateCase) => {
|
|
574
|
+
/*
|
|
575
|
+
* The defect this pins: with the raw lifetime counter, a container
|
|
576
|
+
* that misbehaved once reported a permanently non-zero value, so the
|
|
577
|
+
* fire comparison stayed true forever and the healthy comparison
|
|
578
|
+
* ("= 0", or a dead band below it) was unreachable by construction —
|
|
579
|
+
* a Critical/Warning alert no recovery could ever close.
|
|
580
|
+
*
|
|
581
|
+
* Driven through the real comparator, with the templates' own filters,
|
|
582
|
+
* over the per-minute DELTA samples the formula produces.
|
|
583
|
+
*/
|
|
584
|
+
const step: MonitorStep = getDockerAlertTemplateById(
|
|
585
|
+
dc.id,
|
|
586
|
+
)!.getMonitorStep(buildArgs());
|
|
587
|
+
const [offline, online]: Array<any> = step.data?.monitorCriteria.data
|
|
588
|
+
?.monitorCriteriaInstanceArray as Array<any>;
|
|
589
|
+
|
|
590
|
+
const fireFilter: CriteriaFilter = offline.data.filters[0];
|
|
591
|
+
const recoverFilter: CriteriaFilter = online.data.filters[0];
|
|
592
|
+
|
|
593
|
+
const evaluate: (
|
|
594
|
+
filter: CriteriaFilter,
|
|
595
|
+
samples: Array<number>,
|
|
596
|
+
) => string | null = (
|
|
597
|
+
filter: CriteriaFilter,
|
|
598
|
+
samples: Array<number>,
|
|
599
|
+
): string | null => {
|
|
600
|
+
return CompareCriteria.compareCriteriaNumbers({
|
|
601
|
+
value: samples,
|
|
602
|
+
threshold: filter.value as number,
|
|
603
|
+
criteriaFilter: filter,
|
|
604
|
+
});
|
|
605
|
+
};
|
|
606
|
+
|
|
607
|
+
/*
|
|
608
|
+
* A container that crash-looped / was throttled long ago and is idle
|
|
609
|
+
* now: the LIFETIME counter is still huge, but it stopped growing, so
|
|
610
|
+
* every per-minute delta is zero. Before the fix this window still
|
|
611
|
+
* fired and could never recover.
|
|
612
|
+
*/
|
|
613
|
+
const quietWindow: Array<number> = [0, 0, 0, 0, 0];
|
|
614
|
+
expect(evaluate(fireFilter, quietWindow)).toBeNull();
|
|
615
|
+
expect(evaluate(recoverFilter, quietWindow)).not.toBeNull();
|
|
616
|
+
|
|
617
|
+
/*
|
|
618
|
+
* A container misbehaving right now. Most minutes are zero and no
|
|
619
|
+
* single minute reaches the threshold on its own — which is exactly
|
|
620
|
+
* why the window aggregation has to be Sum and not AllValues. Under
|
|
621
|
+
* AllValues this window would NOT fire, and this assertion is what
|
|
622
|
+
* catches a revert to the shared default.
|
|
623
|
+
*/
|
|
624
|
+
expect(
|
|
625
|
+
dc.busyWindow.every((sample: number) => {
|
|
626
|
+
return sample <= (fireFilter.value as number);
|
|
627
|
+
}),
|
|
628
|
+
).toBe(true);
|
|
629
|
+
expect(evaluate(fireFilter, dc.busyWindow)).not.toBeNull();
|
|
630
|
+
expect(evaluate(recoverFilter, dc.busyWindow)).toBeNull();
|
|
631
|
+
|
|
632
|
+
/*
|
|
633
|
+
* And structurally: recovery must be an INEQUALITY strictly inside the
|
|
634
|
+
* firing threshold. "Recovery requires a monotonic counter to return
|
|
635
|
+
* to exactly zero" is the shape that cannot come back.
|
|
636
|
+
*/
|
|
637
|
+
expect(recoverFilter.filterType).toBe(FilterType.LessThanOrEqualTo);
|
|
638
|
+
expect(fireFilter.filterType).toBe(FilterType.GreaterThan);
|
|
639
|
+
expect(recoverFilter.value as number).toBeLessThan(
|
|
640
|
+
fireFilter.value as number,
|
|
641
|
+
);
|
|
642
|
+
},
|
|
643
|
+
);
|
|
644
|
+
|
|
645
|
+
/*
|
|
646
|
+
* ---------------------------------------------------------------------
|
|
647
|
+
* Copy guards. An alert sentence that names a wrong cause costs an
|
|
648
|
+
* engineer an investigation, so the claims each template makes are
|
|
649
|
+
* pinned the same way its thresholds are.
|
|
650
|
+
* ---------------------------------------------------------------------
|
|
651
|
+
*/
|
|
652
|
+
|
|
653
|
+
function getOfflineCopy(id: string, args?: DockerAlertTemplateArgs): string {
|
|
654
|
+
const step: MonitorStep = getDockerAlertTemplateById(id)!.getMonitorStep(
|
|
655
|
+
args || buildArgs(),
|
|
656
|
+
);
|
|
657
|
+
const offline: any = (
|
|
658
|
+
step.data?.monitorCriteria.data
|
|
659
|
+
?.monitorCriteriaInstanceArray as Array<any>
|
|
660
|
+
)[0];
|
|
661
|
+
return offline.data.incidents[0].description as string;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
test("no incident description promises an exit code the pipeline never carries", () => {
|
|
665
|
+
/*
|
|
666
|
+
* docker_stats emits no exit-code attribute and the criteria root cause
|
|
667
|
+
* is built purely from metric samples, so "check the exit code" sent the
|
|
668
|
+
* reader looking for data that is not there.
|
|
669
|
+
*/
|
|
670
|
+
for (const tc of DOCKER_TEMPLATES) {
|
|
671
|
+
expect(getOfflineCopy(tc.id).toLowerCase()).not.toContain("exit code");
|
|
672
|
+
}
|
|
673
|
+
});
|
|
674
|
+
|
|
675
|
+
test("docker-high-pids describes a TASK count, not a bare process count", () => {
|
|
676
|
+
/*
|
|
677
|
+
* The cgroup pids controller counts tasks — kernel threads included — so
|
|
678
|
+
* a JVM or a Go binary sits far above its process count. Keeping the
|
|
679
|
+
* threshold honest is what stops the alert asserting "fork bomb" at a
|
|
680
|
+
* container working as designed.
|
|
681
|
+
*/
|
|
682
|
+
const template: DockerAlertTemplate =
|
|
683
|
+
getDockerAlertTemplateById("docker-high-pids")!;
|
|
684
|
+
const copy: string = `${template.description} ${getOfflineCopy(
|
|
685
|
+
"docker-high-pids",
|
|
686
|
+
)}`.toLowerCase();
|
|
687
|
+
expect(copy).toContain("thread");
|
|
688
|
+
expect(copy).toContain("task");
|
|
689
|
+
});
|
|
690
|
+
|
|
691
|
+
test("docker-high-memory does not promise an OOM kill it cannot know is coming", () => {
|
|
692
|
+
/*
|
|
693
|
+
* `container.memory.percent` divides by the container's limit when one
|
|
694
|
+
* is set and by HOST total memory when it is not, so an unlimited
|
|
695
|
+
* container at 86% will not be OOM-killed for exceeding a limit that
|
|
696
|
+
* does not exist. The copy has to name that denominator.
|
|
697
|
+
*/
|
|
698
|
+
const copy: string = getOfflineCopy("docker-high-memory").toLowerCase();
|
|
699
|
+
expect(copy).toContain("host");
|
|
700
|
+
expect(copy).toContain("--memory");
|
|
701
|
+
});
|
|
702
|
+
|
|
703
|
+
test("docker-high-cpu states the per-CORE denominator", () => {
|
|
704
|
+
/*
|
|
705
|
+
* `container.cpu.utilization` is what `docker stats` prints: 100% is one
|
|
706
|
+
* full core, not 100% of the host. Without that sentence, "> 80%" reads
|
|
707
|
+
* as a share of the machine and is wrong by the host's core count.
|
|
708
|
+
*/
|
|
709
|
+
const template: DockerAlertTemplate =
|
|
710
|
+
getDockerAlertTemplateById("docker-high-cpu")!;
|
|
711
|
+
expect(template.description.toLowerCase()).toContain("core");
|
|
712
|
+
expect(getOfflineCopy("docker-high-cpu").toLowerCase()).toContain("core");
|
|
713
|
+
});
|
|
714
|
+
|
|
715
|
+
/*
|
|
716
|
+
* ---------------------------------------------------------------------
|
|
717
|
+
* Title guards.
|
|
718
|
+
*
|
|
719
|
+
* MonitorRecommendationUtil.getMonitorName returns
|
|
720
|
+
* "<resource> - <template name>", and the templates used to append THAT
|
|
721
|
+
* to every title, so the rendered alert stated the same fact twice:
|
|
722
|
+
* "[Docker] High CPU Usage (>80%) - docker-host-01 - High Container CPU Usage"
|
|
723
|
+
* SeriesContextEnricher then appends the container identity on top, which
|
|
724
|
+
* pushes the one thing that differs between two alerts off the end of a
|
|
725
|
+
* phone notification.
|
|
726
|
+
* ---------------------------------------------------------------------
|
|
727
|
+
*/
|
|
728
|
+
|
|
729
|
+
test("no incident or alert title repeats the monitor name", () => {
|
|
730
|
+
for (const tc of DOCKER_TEMPLATES) {
|
|
731
|
+
const template: DockerAlertTemplate = getDockerAlertTemplateById(tc.id)!;
|
|
732
|
+
// The exact shape MonitorRecommendationUtil.getMonitorName produces.
|
|
733
|
+
const args: DockerAlertTemplateArgs = {
|
|
734
|
+
...buildArgs(),
|
|
735
|
+
monitorName: `docker-host-01 - ${template.name}`,
|
|
736
|
+
};
|
|
737
|
+
|
|
738
|
+
const offline: any = (
|
|
739
|
+
template.getMonitorStep(args).data?.monitorCriteria.data
|
|
740
|
+
?.monitorCriteriaInstanceArray as Array<any>
|
|
741
|
+
)[0];
|
|
742
|
+
|
|
743
|
+
expect(offline.data.incidents[0].title).not.toContain(args.monitorName);
|
|
744
|
+
expect(offline.data.alerts[0].title).not.toContain(args.monitorName);
|
|
745
|
+
// The host is the half worth keeping — the alert email renders nothing else that names it.
|
|
746
|
+
expect(offline.data.incidents[0].title).toContain(args.hostIdentifier);
|
|
747
|
+
expect(offline.data.alerts[0].title).toContain(args.hostIdentifier);
|
|
748
|
+
}
|
|
749
|
+
});
|
|
750
|
+
|
|
751
|
+
test("a title built before a host is chosen does not end in a bare dash", () => {
|
|
752
|
+
/*
|
|
753
|
+
* DockerMonitorStepForm builds a step with `hostIdentifier || ""` while
|
|
754
|
+
* the picker is still empty, so the suffix has to disappear rather than
|
|
755
|
+
* render "... - ".
|
|
756
|
+
*/
|
|
757
|
+
for (const tc of DOCKER_TEMPLATES) {
|
|
758
|
+
const args: DockerAlertTemplateArgs = {
|
|
759
|
+
...buildArgs(),
|
|
760
|
+
hostIdentifier: "",
|
|
761
|
+
};
|
|
762
|
+
const offline: any = (
|
|
763
|
+
getDockerAlertTemplateById(tc.id)!.getMonitorStep(args).data
|
|
764
|
+
?.monitorCriteria.data?.monitorCriteriaInstanceArray as Array<any>
|
|
765
|
+
)[0];
|
|
766
|
+
|
|
767
|
+
const title: string = offline.data.incidents[0].title as string;
|
|
768
|
+
expect(title.trim()).toBe(title);
|
|
769
|
+
expect(title.endsWith("-")).toBe(false);
|
|
770
|
+
expect(title.length).toBeGreaterThan(0);
|
|
771
|
+
}
|
|
772
|
+
});
|
|
293
773
|
});
|