@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
|
@@ -0,0 +1,691 @@
|
|
|
1
|
+
/** @timezone UTC */
|
|
2
|
+
|
|
3
|
+
import { describe, expect, test } from "@jest/globals";
|
|
4
|
+
|
|
5
|
+
import AggregationInterval from "../../../../Types/BaseDatabase/AggregationInterval";
|
|
6
|
+
import ChartDataPoint, {
|
|
7
|
+
CHART_DATA_POINT_DATE_KEY,
|
|
8
|
+
CHART_DATA_POINT_X_AXIS_KEY,
|
|
9
|
+
} from "../../../../UI/Components/Charts/ChartLibrary/Types/ChartDataPoint";
|
|
10
|
+
import DataPoint from "../../../../UI/Components/Charts/Types/DataPoint";
|
|
11
|
+
import DataPointUtil from "../../../../UI/Components/Charts/Utils/DataPoint";
|
|
12
|
+
import FormattedTimeReferenceLine from "../../../../UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine";
|
|
13
|
+
import SeriesPoints from "../../../../UI/Components/Charts/Types/SeriesPoints";
|
|
14
|
+
import TimeAnnotationUtil from "../../../../UI/Components/Charts/Utils/TimeAnnotation";
|
|
15
|
+
import XAxisUtil from "../../../../UI/Components/Charts/Utils/XAxis";
|
|
16
|
+
import {
|
|
17
|
+
XAxis,
|
|
18
|
+
XAxisAggregateType,
|
|
19
|
+
} from "../../../../UI/Components/Charts/Types/XAxis/XAxis";
|
|
20
|
+
import XAxisPrecision from "../../../../UI/Components/Charts/Types/XAxis/XAxisPrecision";
|
|
21
|
+
import XAxisType from "../../../../UI/Components/Charts/Types/XAxis/XAxisType";
|
|
22
|
+
import YAxis, {
|
|
23
|
+
YAxisPrecision,
|
|
24
|
+
} from "../../../../UI/Components/Charts/Types/YAxis/YAxis";
|
|
25
|
+
import YAxisType from "../../../../UI/Components/Charts/Types/YAxis/YAxisType";
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
* The reported bug: an alert's Metrics tab drew each chart with roughly a
|
|
29
|
+
* fifth of its width blank on the right, the plotted area stopping a whole
|
|
30
|
+
* minute before the axis did.
|
|
31
|
+
*
|
|
32
|
+
* Two independent defects produced it, and the captured request shows both.
|
|
33
|
+
* The window was 2026-09-04T13:37:00.000Z .. 13:42:00.243Z — five minutes
|
|
34
|
+
* plus 243 ms, because a telemetry snapshot window ends at the instant the
|
|
35
|
+
* alert was declared, and that instant happened to fall just past a minute
|
|
36
|
+
* boundary. The server bucketed it by Minute and returned five rows
|
|
37
|
+
* (13:37..13:41).
|
|
38
|
+
*
|
|
39
|
+
* 1. The chart built its grid from a SECOND ladder keyed on the window's
|
|
40
|
+
* duration, whose finest tiers are sub-minute even though no analytics
|
|
41
|
+
* bucket is. 300.243 s landed on the 30-second tier: eleven slots over
|
|
42
|
+
* five one-minute rows, so every other slot was structurally empty.
|
|
43
|
+
* 2. The grid walks inclusively to the window end, so its last slot is the
|
|
44
|
+
* start of the bucket CONTAINING that end. Here that bucket is
|
|
45
|
+
* [13:42:00, 13:43:00) and the window reaches 243 ms into it — the
|
|
46
|
+
* server could only fill it from a sample inside that sliver, and did
|
|
47
|
+
* not. Because the recharts x-axis is categorical over exactly these
|
|
48
|
+
* slots, the empty one stretched the axis a full bucket past the last
|
|
49
|
+
* real point.
|
|
50
|
+
*
|
|
51
|
+
* Pinned to UTC via the docblock pragma: bucket labels come from local-time
|
|
52
|
+
* formatters, so an unpinned run would assert against the machine's zone.
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
const SERIES_NAME: string = "resource.k8s.pod.name=kubernetes-agent-logs-7t88f";
|
|
56
|
+
|
|
57
|
+
const MINUTE_IN_MS: number = 60 * 1000;
|
|
58
|
+
const HOUR_IN_MS: number = 60 * MINUTE_IN_MS;
|
|
59
|
+
const DAY_IN_MS: number = 24 * HOUR_IN_MS;
|
|
60
|
+
|
|
61
|
+
/** The captured alert-snapshot window, verbatim. */
|
|
62
|
+
const ALERT_WINDOW_START: Date = new Date("2026-09-04T13:37:00.000Z");
|
|
63
|
+
const ALERT_WINDOW_END: Date = new Date("2026-09-04T13:42:00.243Z");
|
|
64
|
+
|
|
65
|
+
const Y_AXIS: YAxis = {
|
|
66
|
+
legend: "%",
|
|
67
|
+
options: {
|
|
68
|
+
type: YAxisType.Number,
|
|
69
|
+
min: "auto",
|
|
70
|
+
max: "auto",
|
|
71
|
+
precision: YAxisPrecision.TwoDecimals,
|
|
72
|
+
formatter: (value: number): string => {
|
|
73
|
+
return String(value);
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
type BuildXAxisFunction = (data: {
|
|
79
|
+
min: Date;
|
|
80
|
+
max: Date;
|
|
81
|
+
precision?: XAxisPrecision | undefined;
|
|
82
|
+
aggregateType?: XAxisAggregateType | undefined;
|
|
83
|
+
}) => XAxis;
|
|
84
|
+
|
|
85
|
+
const buildXAxis: BuildXAxisFunction = (data: {
|
|
86
|
+
min: Date;
|
|
87
|
+
max: Date;
|
|
88
|
+
precision?: XAxisPrecision | undefined;
|
|
89
|
+
aggregateType?: XAxisAggregateType | undefined;
|
|
90
|
+
}): XAxis => {
|
|
91
|
+
return {
|
|
92
|
+
legend: "Time",
|
|
93
|
+
options: {
|
|
94
|
+
type: XAxisType.Time,
|
|
95
|
+
min: data.min,
|
|
96
|
+
max: data.max,
|
|
97
|
+
aggregateType: data.aggregateType ?? XAxisAggregateType.Average,
|
|
98
|
+
precision: data.precision,
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
type ChartRowsFunction = (
|
|
104
|
+
xAxis: XAxis,
|
|
105
|
+
seriesPoints: Array<SeriesPoints>,
|
|
106
|
+
) => Array<ChartDataPoint>;
|
|
107
|
+
|
|
108
|
+
const chartRows: ChartRowsFunction = (
|
|
109
|
+
xAxis: XAxis,
|
|
110
|
+
seriesPoints: Array<SeriesPoints>,
|
|
111
|
+
): Array<ChartDataPoint> => {
|
|
112
|
+
return DataPointUtil.getChartDataPoints({
|
|
113
|
+
seriesPoints,
|
|
114
|
+
xAxis,
|
|
115
|
+
yAxis: Y_AXIS,
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
type HasValueFunction = (row: ChartDataPoint | undefined) => boolean;
|
|
120
|
+
|
|
121
|
+
/*
|
|
122
|
+
* A row "carries data" when it holds any key beyond the two reserved ones
|
|
123
|
+
* the grid itself writes (the formatted label and the raw bucket start).
|
|
124
|
+
*/
|
|
125
|
+
const hasValue: HasValueFunction = (
|
|
126
|
+
row: ChartDataPoint | undefined,
|
|
127
|
+
): boolean => {
|
|
128
|
+
if (!row) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
return Object.keys(row).some((key: string): boolean => {
|
|
132
|
+
return (
|
|
133
|
+
key !== CHART_DATA_POINT_X_AXIS_KEY && key !== CHART_DATA_POINT_DATE_KEY
|
|
134
|
+
);
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
type SeriesEveryFunction = (data: {
|
|
139
|
+
from: Date;
|
|
140
|
+
count: number;
|
|
141
|
+
stepMs: number;
|
|
142
|
+
value?: number | undefined;
|
|
143
|
+
seriesName?: string | undefined;
|
|
144
|
+
}) => Array<SeriesPoints>;
|
|
145
|
+
|
|
146
|
+
/** `count` points on a fixed step, i.e. what the server returns for buckets. */
|
|
147
|
+
const seriesEvery: SeriesEveryFunction = (data: {
|
|
148
|
+
from: Date;
|
|
149
|
+
count: number;
|
|
150
|
+
stepMs: number;
|
|
151
|
+
value?: number | undefined;
|
|
152
|
+
seriesName?: string | undefined;
|
|
153
|
+
}): Array<SeriesPoints> => {
|
|
154
|
+
const points: Array<DataPoint> = [];
|
|
155
|
+
for (let index: number = 0; index < data.count; index++) {
|
|
156
|
+
points.push({
|
|
157
|
+
x: new Date(data.from.getTime() + index * data.stepMs),
|
|
158
|
+
y: data.value ?? 1,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return [{ seriesName: data.seriesName ?? SERIES_NAME, data: points }];
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
describe("the reported alert-snapshot chart", () => {
|
|
165
|
+
/*
|
|
166
|
+
* MetricCharts pins the grid to the interval the query was bucketed at,
|
|
167
|
+
* which for this window is Minute.
|
|
168
|
+
*/
|
|
169
|
+
const ALERT_X_AXIS: XAxis = buildXAxis({
|
|
170
|
+
min: ALERT_WINDOW_START,
|
|
171
|
+
max: ALERT_WINDOW_END,
|
|
172
|
+
precision: XAxisPrecision.EVERY_MINUTE,
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
/** The five rows the server actually returned, replayed. */
|
|
176
|
+
const ALERT_SERIES: Array<SeriesPoints> = seriesEvery({
|
|
177
|
+
from: ALERT_WINDOW_START,
|
|
178
|
+
count: 5,
|
|
179
|
+
stepMs: MINUTE_IN_MS,
|
|
180
|
+
value: 0.17,
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("plots every slot on the axis — no trailing gap at all", () => {
|
|
184
|
+
const rows: Array<ChartDataPoint> = chartRows(ALERT_X_AXIS, ALERT_SERIES);
|
|
185
|
+
|
|
186
|
+
/*
|
|
187
|
+
* This is the whole bug in one assertion. Before the fix the chart drew
|
|
188
|
+
* eleven slots and filled five, so the series ended at 80% of the plot
|
|
189
|
+
* width. Every slot now carries a value, so the area reaches the right
|
|
190
|
+
* edge.
|
|
191
|
+
*/
|
|
192
|
+
expect(rows).toHaveLength(5);
|
|
193
|
+
for (const row of rows) {
|
|
194
|
+
expect(hasValue(row)).toBe(true);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test("the last plotted bucket is 13:41, the last one the query could fill", () => {
|
|
199
|
+
const rows: Array<ChartDataPoint> = chartRows(ALERT_X_AXIS, ALERT_SERIES);
|
|
200
|
+
const lastRow: ChartDataPoint = rows[rows.length - 1]!;
|
|
201
|
+
|
|
202
|
+
expect(lastRow[CHART_DATA_POINT_DATE_KEY]).toBe(
|
|
203
|
+
new Date("2026-09-04T13:41:00.000Z").getTime(),
|
|
204
|
+
);
|
|
205
|
+
expect(lastRow[SERIES_NAME]).toBe(0.17);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
test("never emits a 13:42 slot, which only a sample inside 243ms could fill", () => {
|
|
209
|
+
const rows: Array<ChartDataPoint> = chartRows(ALERT_X_AXIS, ALERT_SERIES);
|
|
210
|
+
|
|
211
|
+
const bucketStarts: Array<number> = rows.map(
|
|
212
|
+
(row: ChartDataPoint): number => {
|
|
213
|
+
return Number(row[CHART_DATA_POINT_DATE_KEY]);
|
|
214
|
+
},
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
expect(bucketStarts).not.toContain(
|
|
218
|
+
new Date("2026-09-04T13:42:00.000Z").getTime(),
|
|
219
|
+
);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
test("pinning the grid removes the half-empty 30-second comb", () => {
|
|
223
|
+
/*
|
|
224
|
+
* Defect 1 on its own. Unpinned, 300.243 s falls on the sub-minute tier
|
|
225
|
+
* and the grid is twice as fine as anything the server can return, so
|
|
226
|
+
* five of the eleven slots are interior blanks the curve interpolates
|
|
227
|
+
* across.
|
|
228
|
+
*/
|
|
229
|
+
const unpinned: Array<ChartDataPoint> = chartRows(
|
|
230
|
+
buildXAxis({ min: ALERT_WINDOW_START, max: ALERT_WINDOW_END }),
|
|
231
|
+
ALERT_SERIES,
|
|
232
|
+
);
|
|
233
|
+
const unpinnedBlanks: number = unpinned.filter(
|
|
234
|
+
(row: ChartDataPoint): boolean => {
|
|
235
|
+
return !hasValue(row);
|
|
236
|
+
},
|
|
237
|
+
).length;
|
|
238
|
+
|
|
239
|
+
expect(
|
|
240
|
+
XAxisUtil.getPrecision({
|
|
241
|
+
xAxisMin: ALERT_WINDOW_START,
|
|
242
|
+
xAxisMax: ALERT_WINDOW_END,
|
|
243
|
+
}),
|
|
244
|
+
).toBe(XAxisPrecision.EVERY_THIRTY_SECONDS);
|
|
245
|
+
expect(unpinnedBlanks).toBeGreaterThan(0);
|
|
246
|
+
|
|
247
|
+
const pinned: Array<ChartDataPoint> = chartRows(ALERT_X_AXIS, ALERT_SERIES);
|
|
248
|
+
const pinnedBlanks: number = pinned.filter(
|
|
249
|
+
(row: ChartDataPoint): boolean => {
|
|
250
|
+
return !hasValue(row);
|
|
251
|
+
},
|
|
252
|
+
).length;
|
|
253
|
+
|
|
254
|
+
expect(pinnedBlanks).toBe(0);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test("the declared-at marker still renders, on the last bucket on the axis", () => {
|
|
258
|
+
/*
|
|
259
|
+
* The marker sits at the window end, which is inside the bucket the grid
|
|
260
|
+
* no longer draws. Trimming a slot must not push a marker off the chart
|
|
261
|
+
* it exists to annotate — it resolves to the last bucket still on the
|
|
262
|
+
* axis, which is where its data is.
|
|
263
|
+
*/
|
|
264
|
+
const rows: Array<ChartDataPoint> = chartRows(ALERT_X_AXIS, ALERT_SERIES);
|
|
265
|
+
const formatted: Array<FormattedTimeReferenceLine> =
|
|
266
|
+
TimeAnnotationUtil.formatTimeReferenceLines({
|
|
267
|
+
timeReferenceLines: [{ date: ALERT_WINDOW_END, label: "Declared" }],
|
|
268
|
+
xAxis: ALERT_X_AXIS,
|
|
269
|
+
seriesPoints: ALERT_SERIES,
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
expect(formatted).toHaveLength(1);
|
|
273
|
+
expect(formatted[0]!.bucketIndex).toBe(rows.length - 1);
|
|
274
|
+
expect(formatted[0]!.formattedX).toBe(
|
|
275
|
+
String(rows[rows.length - 1]![CHART_DATA_POINT_X_AXIS_KEY]),
|
|
276
|
+
);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
test("annotations index into the same array the rows were built from", () => {
|
|
280
|
+
/*
|
|
281
|
+
* The invariant that makes trimming safe to do in the shared walker.
|
|
282
|
+
* Markers are resolved to an INDEX, so the two sides must agree on the
|
|
283
|
+
* slot count exactly — a marker one bucket in has to sit on the row one
|
|
284
|
+
* bucket in.
|
|
285
|
+
*/
|
|
286
|
+
const rows: Array<ChartDataPoint> = chartRows(ALERT_X_AXIS, ALERT_SERIES);
|
|
287
|
+
|
|
288
|
+
for (let index: number = 0; index < rows.length; index++) {
|
|
289
|
+
const at: Date = new Date(
|
|
290
|
+
ALERT_WINDOW_START.getTime() + index * MINUTE_IN_MS,
|
|
291
|
+
);
|
|
292
|
+
const formatted: Array<FormattedTimeReferenceLine> =
|
|
293
|
+
TimeAnnotationUtil.formatTimeReferenceLines({
|
|
294
|
+
timeReferenceLines: [{ date: at, label: "event" }],
|
|
295
|
+
xAxis: ALERT_X_AXIS,
|
|
296
|
+
seriesPoints: ALERT_SERIES,
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
expect(formatted).toHaveLength(1);
|
|
300
|
+
expect(formatted[0]!.bucketIndex).toBe(index);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
describe("which trailing slot gets dropped", () => {
|
|
306
|
+
test("a window ending exactly on a bucket boundary drops its empty tail slot", () => {
|
|
307
|
+
/*
|
|
308
|
+
* Zero coverage rather than the alert's 243 ms, and the same conclusion:
|
|
309
|
+
* [14:00:00, 14:01:00) is not in a window that ends at 14:00:00.000.
|
|
310
|
+
*/
|
|
311
|
+
const start: Date = new Date("2026-09-04T13:00:00.000Z");
|
|
312
|
+
const end: Date = new Date("2026-09-04T14:00:00.000Z");
|
|
313
|
+
const rows: Array<ChartDataPoint> = chartRows(
|
|
314
|
+
buildXAxis({
|
|
315
|
+
min: start,
|
|
316
|
+
max: end,
|
|
317
|
+
precision: XAxisPrecision.EVERY_MINUTE,
|
|
318
|
+
}),
|
|
319
|
+
seriesEvery({ from: start, count: 60, stepMs: MINUTE_IN_MS }),
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
expect(rows).toHaveLength(60);
|
|
323
|
+
expect(hasValue(rows[rows.length - 1])).toBe(true);
|
|
324
|
+
expect(rows[rows.length - 1]![CHART_DATA_POINT_DATE_KEY]).toBe(
|
|
325
|
+
new Date("2026-09-04T13:59:00.000Z").getTime(),
|
|
326
|
+
);
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
test("a populated in-progress bucket is kept, so live charts stay live", () => {
|
|
330
|
+
/*
|
|
331
|
+
* The opposite failure, and the reason the rule is not simply "drop any
|
|
332
|
+
* slot whose bucket runs past the window end". A now-anchored chart's
|
|
333
|
+
* newest bucket is always partial; dropping it would make every live
|
|
334
|
+
* chart lag by a whole bucket.
|
|
335
|
+
*/
|
|
336
|
+
const start: Date = new Date("2026-09-04T13:42:00.000Z");
|
|
337
|
+
const end: Date = new Date("2026-09-04T14:42:37.000Z");
|
|
338
|
+
const series: Array<SeriesPoints> = seriesEvery({
|
|
339
|
+
from: start,
|
|
340
|
+
count: 61,
|
|
341
|
+
stepMs: MINUTE_IN_MS,
|
|
342
|
+
});
|
|
343
|
+
const rows: Array<ChartDataPoint> = chartRows(
|
|
344
|
+
buildXAxis({
|
|
345
|
+
min: start,
|
|
346
|
+
max: end,
|
|
347
|
+
precision: XAxisPrecision.EVERY_MINUTE,
|
|
348
|
+
}),
|
|
349
|
+
series,
|
|
350
|
+
);
|
|
351
|
+
|
|
352
|
+
expect(rows).toHaveLength(61);
|
|
353
|
+
expect(hasValue(rows[rows.length - 1])).toBe(true);
|
|
354
|
+
expect(rows[rows.length - 1]![CHART_DATA_POINT_DATE_KEY]).toBe(
|
|
355
|
+
new Date("2026-09-04T14:42:00.000Z").getTime(),
|
|
356
|
+
);
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
test("an EMPTY bucket the window mostly spans is kept — an empty bar is information", () => {
|
|
360
|
+
/*
|
|
361
|
+
* "Last 7 days" of incident counts, read mid-afternoon. Today's bucket
|
|
362
|
+
* has nothing in it, which means "nothing today" — a fact the chart has
|
|
363
|
+
* to keep showing. Only a bucket the window barely touches is dropped.
|
|
364
|
+
*
|
|
365
|
+
* This is also the case that catches measuring coverage off the slot's
|
|
366
|
+
* DATE. The grid is anchored at the window start, so the final slot is
|
|
367
|
+
* dated 4 Sep 14:42 and sits a hair below the window end — 0% coverage
|
|
368
|
+
* by that reading, and the bar would be dropped. Its LABEL is "04 Sep",
|
|
369
|
+
* the bucket [4 Sep 00:00, 5 Sep 00:00), of which the window really does
|
|
370
|
+
* cover nearly fifteen hours.
|
|
371
|
+
*/
|
|
372
|
+
const end: Date = new Date("2026-09-04T14:42:00.000Z");
|
|
373
|
+
const start: Date = new Date(end.getTime() - 7 * DAY_IN_MS);
|
|
374
|
+
const series: Array<SeriesPoints> = seriesEvery({
|
|
375
|
+
from: start,
|
|
376
|
+
count: 7,
|
|
377
|
+
stepMs: DAY_IN_MS,
|
|
378
|
+
seriesName: "Incidents",
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
const rows: Array<ChartDataPoint> = chartRows(
|
|
382
|
+
buildXAxis({
|
|
383
|
+
min: start,
|
|
384
|
+
max: end,
|
|
385
|
+
precision: XAxisPrecision.EVERY_DAY,
|
|
386
|
+
aggregateType: XAxisAggregateType.Sum,
|
|
387
|
+
}),
|
|
388
|
+
series,
|
|
389
|
+
);
|
|
390
|
+
|
|
391
|
+
// 8 day labels, and today's — empty — is still one of them.
|
|
392
|
+
expect(rows).toHaveLength(8);
|
|
393
|
+
expect(hasValue(rows[rows.length - 1])).toBe(false);
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
test("a BOUNDARY-aligned daily grid still keeps a mostly-covered empty day", () => {
|
|
397
|
+
/*
|
|
398
|
+
* The aligned twin of the case above, so "keep" is not an accident of
|
|
399
|
+
* mid-bucket anchoring. Starting the window at midnight puts every slot
|
|
400
|
+
* on a real day boundary, so the final slot's coverage is measured
|
|
401
|
+
* directly — and 14h42m of a 24-hour day is well over half, so an empty
|
|
402
|
+
* "today" is still a day the chart is entitled to show.
|
|
403
|
+
*/
|
|
404
|
+
const start: Date = new Date("2026-08-28T00:00:00.000Z");
|
|
405
|
+
const end: Date = new Date("2026-09-04T14:42:00.000Z");
|
|
406
|
+
const series: Array<SeriesPoints> = seriesEvery({
|
|
407
|
+
from: start,
|
|
408
|
+
count: 7,
|
|
409
|
+
stepMs: DAY_IN_MS,
|
|
410
|
+
seriesName: "Incidents",
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
const rows: Array<ChartDataPoint> = chartRows(
|
|
414
|
+
buildXAxis({
|
|
415
|
+
min: start,
|
|
416
|
+
max: end,
|
|
417
|
+
precision: XAxisPrecision.EVERY_DAY,
|
|
418
|
+
aggregateType: XAxisAggregateType.Sum,
|
|
419
|
+
}),
|
|
420
|
+
series,
|
|
421
|
+
);
|
|
422
|
+
|
|
423
|
+
expect(rows).toHaveLength(8);
|
|
424
|
+
expect(hasValue(rows[rows.length - 1])).toBe(false);
|
|
425
|
+
expect(rows[rows.length - 1]![CHART_DATA_POINT_DATE_KEY]).toBe(
|
|
426
|
+
new Date("2026-09-04T00:00:00.000Z").getTime(),
|
|
427
|
+
);
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
test("a boundary-aligned day the window BARELY enters is dropped", () => {
|
|
431
|
+
/*
|
|
432
|
+
* The same aligned daily grid read just after midnight: today's bucket is
|
|
433
|
+
* minutes old, empty, and nothing but a blank bar stretching the axis a
|
|
434
|
+
* whole day past the last real one.
|
|
435
|
+
*/
|
|
436
|
+
const start: Date = new Date("2026-08-28T00:00:00.000Z");
|
|
437
|
+
const end: Date = new Date("2026-09-04T00:04:00.000Z");
|
|
438
|
+
const series: Array<SeriesPoints> = seriesEvery({
|
|
439
|
+
from: start,
|
|
440
|
+
count: 7,
|
|
441
|
+
stepMs: DAY_IN_MS,
|
|
442
|
+
seriesName: "Incidents",
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
const rows: Array<ChartDataPoint> = chartRows(
|
|
446
|
+
buildXAxis({
|
|
447
|
+
min: start,
|
|
448
|
+
max: end,
|
|
449
|
+
precision: XAxisPrecision.EVERY_DAY,
|
|
450
|
+
aggregateType: XAxisAggregateType.Sum,
|
|
451
|
+
}),
|
|
452
|
+
series,
|
|
453
|
+
);
|
|
454
|
+
|
|
455
|
+
expect(rows).toHaveLength(7);
|
|
456
|
+
expect(hasValue(rows[rows.length - 1])).toBe(true);
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
test("a real trailing outage stays visible — at most one slot is ever dropped", () => {
|
|
460
|
+
/*
|
|
461
|
+
* The safety property. A source that stopped reporting well before the
|
|
462
|
+
* window end must not have its silence tidied away: shrinking the axis to
|
|
463
|
+
* the last datapoint would turn an outage into a chart that looks
|
|
464
|
+
* complete.
|
|
465
|
+
*/
|
|
466
|
+
const start: Date = new Date("2026-09-04T13:00:00.000Z");
|
|
467
|
+
const end: Date = new Date("2026-09-04T14:00:00.000Z");
|
|
468
|
+
// Reports stop at 13:50 — the last ten minutes of the window are dead.
|
|
469
|
+
const series: Array<SeriesPoints> = seriesEvery({
|
|
470
|
+
from: start,
|
|
471
|
+
count: 51,
|
|
472
|
+
stepMs: MINUTE_IN_MS,
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
const rows: Array<ChartDataPoint> = chartRows(
|
|
476
|
+
buildXAxis({
|
|
477
|
+
min: start,
|
|
478
|
+
max: end,
|
|
479
|
+
precision: XAxisPrecision.EVERY_MINUTE,
|
|
480
|
+
}),
|
|
481
|
+
series,
|
|
482
|
+
);
|
|
483
|
+
|
|
484
|
+
const blanks: Array<ChartDataPoint> = rows.filter(
|
|
485
|
+
(row: ChartDataPoint): boolean => {
|
|
486
|
+
return !hasValue(row);
|
|
487
|
+
},
|
|
488
|
+
);
|
|
489
|
+
|
|
490
|
+
// 61 slots, one uncoverable tail slot dropped; nine blanks are the outage.
|
|
491
|
+
expect(rows).toHaveLength(60);
|
|
492
|
+
expect(blanks).toHaveLength(9);
|
|
493
|
+
expect(hasValue(rows[rows.length - 1])).toBe(false);
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
test("a chart with no data anywhere keeps the whole window on the axis", () => {
|
|
497
|
+
/*
|
|
498
|
+
* Nothing to align the axis to, so there is nothing to trim towards —
|
|
499
|
+
* an empty chart should still show the range the user asked for.
|
|
500
|
+
*/
|
|
501
|
+
const start: Date = new Date("2026-09-04T13:00:00.000Z");
|
|
502
|
+
const end: Date = new Date("2026-09-04T14:00:00.000Z");
|
|
503
|
+
|
|
504
|
+
const rows: Array<ChartDataPoint> = chartRows(
|
|
505
|
+
buildXAxis({
|
|
506
|
+
min: start,
|
|
507
|
+
max: end,
|
|
508
|
+
precision: XAxisPrecision.EVERY_MINUTE,
|
|
509
|
+
}),
|
|
510
|
+
[{ seriesName: SERIES_NAME, data: [] as Array<DataPoint> }],
|
|
511
|
+
);
|
|
512
|
+
|
|
513
|
+
expect(rows).toHaveLength(61);
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
test("a single-slot grid is never trimmed away to nothing", () => {
|
|
517
|
+
const start: Date = new Date("2026-09-04T13:00:00.000Z");
|
|
518
|
+
const end: Date = new Date("2026-09-04T13:00:30.000Z");
|
|
519
|
+
|
|
520
|
+
const rows: Array<ChartDataPoint> = chartRows(
|
|
521
|
+
buildXAxis({
|
|
522
|
+
min: start,
|
|
523
|
+
max: end,
|
|
524
|
+
precision: XAxisPrecision.EVERY_MINUTE,
|
|
525
|
+
}),
|
|
526
|
+
seriesEvery({ from: start, count: 1, stepMs: MINUTE_IN_MS }),
|
|
527
|
+
);
|
|
528
|
+
|
|
529
|
+
expect(rows.length).toBeGreaterThanOrEqual(1);
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
test("callers that pass no series get the raw grid, unchanged", () => {
|
|
533
|
+
/*
|
|
534
|
+
* getPrecisionIntervals is a shared primitive with its own contract
|
|
535
|
+
* (XAxis.test.ts pins its counts). Trimming is opt-in through
|
|
536
|
+
* getRenderableIntervals, so nothing that walks the grid alone moves.
|
|
537
|
+
*/
|
|
538
|
+
const raw: Array<Date> = XAxisUtil.getPrecisionIntervals({
|
|
539
|
+
xAxisMin: ALERT_WINDOW_START,
|
|
540
|
+
xAxisMax: ALERT_WINDOW_END,
|
|
541
|
+
precision: XAxisPrecision.EVERY_MINUTE,
|
|
542
|
+
});
|
|
543
|
+
const renderable: Array<Date> = XAxisUtil.getRenderableIntervals({
|
|
544
|
+
xAxisMin: ALERT_WINDOW_START,
|
|
545
|
+
xAxisMax: ALERT_WINDOW_END,
|
|
546
|
+
precision: XAxisPrecision.EVERY_MINUTE,
|
|
547
|
+
});
|
|
548
|
+
|
|
549
|
+
expect(raw).toHaveLength(6);
|
|
550
|
+
expect(renderable).toHaveLength(6);
|
|
551
|
+
});
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
describe("the grid step follows the interval the data was bucketed at", () => {
|
|
555
|
+
test.each([
|
|
556
|
+
[AggregationInterval.Minute, XAxisPrecision.EVERY_MINUTE],
|
|
557
|
+
[AggregationInterval.FiveMinutes, XAxisPrecision.EVERY_FIVE_MINUTES],
|
|
558
|
+
[AggregationInterval.FifteenMinutes, XAxisPrecision.EVERY_FIFTEEN_MINUTES],
|
|
559
|
+
[AggregationInterval.ThirtyMinutes, XAxisPrecision.EVERY_THIRTY_MINUTES],
|
|
560
|
+
[AggregationInterval.Hour, XAxisPrecision.EVERY_HOUR],
|
|
561
|
+
[AggregationInterval.Day, XAxisPrecision.EVERY_DAY],
|
|
562
|
+
[AggregationInterval.Week, XAxisPrecision.EVERY_WEEK],
|
|
563
|
+
[AggregationInterval.Month, XAxisPrecision.EVERY_MONTH],
|
|
564
|
+
[AggregationInterval.Year, XAxisPrecision.EVERY_YEAR],
|
|
565
|
+
])(
|
|
566
|
+
"%s buckets are drawn one slot each",
|
|
567
|
+
(
|
|
568
|
+
interval: AggregationInterval,
|
|
569
|
+
expected: XAxisPrecision | undefined,
|
|
570
|
+
): void => {
|
|
571
|
+
expect(XAxisUtil.getPrecisionForAggregationInterval(interval)).toBe(
|
|
572
|
+
expected,
|
|
573
|
+
);
|
|
574
|
+
},
|
|
575
|
+
);
|
|
576
|
+
|
|
577
|
+
test("Total pins nothing — it has no grid to pin", () => {
|
|
578
|
+
/*
|
|
579
|
+
* Total collapses the window into one aggregate whose timestamp is the
|
|
580
|
+
* earliest sample, not a bucket start, so there is no bucket grid to
|
|
581
|
+
* mirror and the duration ladder applies.
|
|
582
|
+
*/
|
|
583
|
+
expect(
|
|
584
|
+
XAxisUtil.getPrecisionForAggregationInterval(AggregationInterval.Total),
|
|
585
|
+
).toBeUndefined();
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
test("a pin overrides the duration ladder in the COARSER direction too", () => {
|
|
589
|
+
/*
|
|
590
|
+
* The second way the two ladders drift. Aligning a window to the bucket
|
|
591
|
+
* grid floors its start, which widens it — enough to tip a 3h preset past
|
|
592
|
+
* the duration ladder's 3h threshold and onto the five-minute tier while
|
|
593
|
+
* the query is still pinned to Minute. Unpinned, the chart would then
|
|
594
|
+
* re-average five one-minute rows into each slot: an average of averages.
|
|
595
|
+
*/
|
|
596
|
+
const start: Date = new Date("2026-09-04T10:59:00.000Z");
|
|
597
|
+
const end: Date = new Date("2026-09-04T14:00:00.000Z");
|
|
598
|
+
|
|
599
|
+
expect(XAxisUtil.getPrecision({ xAxisMin: start, xAxisMax: end })).toBe(
|
|
600
|
+
XAxisPrecision.EVERY_FIVE_MINUTES,
|
|
601
|
+
);
|
|
602
|
+
expect(
|
|
603
|
+
XAxisUtil.getPrecision({
|
|
604
|
+
xAxisMin: start,
|
|
605
|
+
xAxisMax: end,
|
|
606
|
+
precision: XAxisPrecision.EVERY_MINUTE,
|
|
607
|
+
}),
|
|
608
|
+
).toBe(XAxisPrecision.EVERY_MINUTE);
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
test("a pinned axis labels its slots at the pinned step", () => {
|
|
612
|
+
/*
|
|
613
|
+
* The grid step and the formatter have to move together: DataPointUtil
|
|
614
|
+
* places a datapoint by matching FORMATTED LABELS, so a grid stepped one
|
|
615
|
+
* way and labelled another matches nothing and the series vanishes
|
|
616
|
+
* entirely rather than degrading.
|
|
617
|
+
*/
|
|
618
|
+
const rows: Array<ChartDataPoint> = chartRows(
|
|
619
|
+
buildXAxis({
|
|
620
|
+
min: ALERT_WINDOW_START,
|
|
621
|
+
max: ALERT_WINDOW_END,
|
|
622
|
+
precision: XAxisPrecision.EVERY_MINUTE,
|
|
623
|
+
}),
|
|
624
|
+
seriesEvery({
|
|
625
|
+
from: ALERT_WINDOW_START,
|
|
626
|
+
count: 5,
|
|
627
|
+
stepMs: MINUTE_IN_MS,
|
|
628
|
+
value: 0.17,
|
|
629
|
+
}),
|
|
630
|
+
);
|
|
631
|
+
|
|
632
|
+
expect(
|
|
633
|
+
rows.map((row: ChartDataPoint): string => {
|
|
634
|
+
return String(row[CHART_DATA_POINT_X_AXIS_KEY]);
|
|
635
|
+
}),
|
|
636
|
+
).toEqual(["13:37", "13:38", "13:39", "13:40", "13:41"]);
|
|
637
|
+
});
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
describe("trimming respects wall-clock bucket widths", () => {
|
|
641
|
+
test("a daylight-saving day is as wide as the grid says it is, not 24h", () => {
|
|
642
|
+
/*
|
|
643
|
+
* The trailing bucket's width is read off the grid rather than recomputed
|
|
644
|
+
* from the precision, so the coverage test stays correct on the days that
|
|
645
|
+
* are not 24 hours long. Europe/London springs forward on 2026-03-29, so
|
|
646
|
+
* that day is 23 hours.
|
|
647
|
+
*
|
|
648
|
+
* The window ends 20 hours into the 29th — over half of a 23-hour day, so
|
|
649
|
+
* the empty final bucket is kept. Computed against a fixed 24h width it
|
|
650
|
+
* would be 83% of a day and kept too, so this asserts the specific thing
|
|
651
|
+
* that differs: the grid's own step is what is measured.
|
|
652
|
+
*/
|
|
653
|
+
const previousTimezone: string | undefined = process.env["TZ"];
|
|
654
|
+
process.env["TZ"] = "Europe/London";
|
|
655
|
+
|
|
656
|
+
try {
|
|
657
|
+
const start: Date = new Date("2026-03-25T00:00:00.000Z");
|
|
658
|
+
const end: Date = new Date("2026-03-29T20:00:00.000Z");
|
|
659
|
+
|
|
660
|
+
const intervals: Array<Date> = XAxisUtil.getPrecisionIntervals({
|
|
661
|
+
xAxisMin: start,
|
|
662
|
+
xAxisMax: end,
|
|
663
|
+
precision: XAxisPrecision.EVERY_DAY,
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
// The walk steps in wall-clock days, so every step is one calendar day.
|
|
667
|
+
expect(intervals.length).toBeGreaterThan(1);
|
|
668
|
+
|
|
669
|
+
const renderable: Array<Date> = XAxisUtil.getRenderableIntervals({
|
|
670
|
+
xAxisMin: start,
|
|
671
|
+
xAxisMax: end,
|
|
672
|
+
precision: XAxisPrecision.EVERY_DAY,
|
|
673
|
+
seriesPoints: [
|
|
674
|
+
{
|
|
675
|
+
seriesName: SERIES_NAME,
|
|
676
|
+
data: [{ x: start, y: 1 }],
|
|
677
|
+
},
|
|
678
|
+
],
|
|
679
|
+
});
|
|
680
|
+
|
|
681
|
+
// Well over half the final bucket is inside the window, so it stays.
|
|
682
|
+
expect(renderable).toHaveLength(intervals.length);
|
|
683
|
+
} finally {
|
|
684
|
+
if (previousTimezone === undefined) {
|
|
685
|
+
delete process.env["TZ"];
|
|
686
|
+
} else {
|
|
687
|
+
process.env["TZ"] = previousTimezone;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
});
|
|
691
|
+
});
|