@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
|
@@ -115,4 +115,193 @@ describe("KubernetesMetricCatalog", () => {
|
|
|
115
115
|
getKubernetesMetricByMetricName("k8s.pod.memory.usage"),
|
|
116
116
|
).toBeDefined();
|
|
117
117
|
});
|
|
118
|
+
|
|
119
|
+
/*
|
|
120
|
+
* The catalog's `unit` is rendered straight into the metric picker's
|
|
121
|
+
* dropdown label (`${friendlyName} (${unit})`), and its `description`
|
|
122
|
+
* into the help text below it. Both used to claim `k8s.*.cpu.utilization`
|
|
123
|
+
* was a percentage. It is not: kubeletstats emits it as CPU *cores in
|
|
124
|
+
* use* (UsageNanoCores / 1e9) carrying UCUM unit "1". A user who read
|
|
125
|
+
* "(%)" and typed 90 built a monitor comparing 90 against values around
|
|
126
|
+
* 0.18 — a silently dead monitor with no error surfaced anywhere.
|
|
127
|
+
*/
|
|
128
|
+
describe("the kubeletstats cores gauges are not labelled as percentages", () => {
|
|
129
|
+
const coresGaugeNamePattern: RegExp = /\.cpu\.utilization$/i;
|
|
130
|
+
|
|
131
|
+
const coresGauges: Array<KubernetesMetricDefinition> = allMetrics.filter(
|
|
132
|
+
(m: KubernetesMetricDefinition) => {
|
|
133
|
+
return coresGaugeNamePattern.test(m.metricName);
|
|
134
|
+
},
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
test("the catalog still carries both of them", () => {
|
|
138
|
+
expect(coresGauges.length).toBeGreaterThan(0);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test("no .cpu.utilization entry declares a percent unit", () => {
|
|
142
|
+
for (const metric of coresGauges) {
|
|
143
|
+
expect(metric.unit).not.toBe("%");
|
|
144
|
+
expect(metric.unit).not.toBe("percent");
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test("no .cpu.utilization description calls the value a percentage", () => {
|
|
149
|
+
/*
|
|
150
|
+
* The unit was only half the lie — the description said "CPU usage
|
|
151
|
+
* percentage for pods" too, and a unit-only assertion would miss it.
|
|
152
|
+
* The word may still appear while explaining how to DERIVE one, so
|
|
153
|
+
* the guard is on the claim, not the word.
|
|
154
|
+
*/
|
|
155
|
+
for (const metric of coresGauges) {
|
|
156
|
+
expect(metric.description.toLowerCase()).not.toContain(
|
|
157
|
+
"usage percentage",
|
|
158
|
+
);
|
|
159
|
+
expect(metric.description.toLowerCase()).toContain("cores");
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test("both cores gauges are declared in cores", () => {
|
|
164
|
+
expect(
|
|
165
|
+
getKubernetesMetricByMetricName("k8s.pod.cpu.utilization")?.unit,
|
|
166
|
+
).toBe("cores");
|
|
167
|
+
expect(
|
|
168
|
+
getKubernetesMetricByMetricName("k8s.node.cpu.utilization")?.unit,
|
|
169
|
+
).toBe("cores");
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test("the friendlyName does not repeat the unit the picker appends", () => {
|
|
173
|
+
/*
|
|
174
|
+
* KubernetesMetricPicker builds its label as
|
|
175
|
+
* `${friendlyName}${unit ? ` (${unit})` : ""}`. A friendlyName of
|
|
176
|
+
* "Pod CPU Usage (Cores)" would render "Pod CPU Usage (Cores) (cores)".
|
|
177
|
+
*/
|
|
178
|
+
for (const metric of allMetrics) {
|
|
179
|
+
if (!metric.unit) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
expect(metric.friendlyName.toLowerCase()).not.toContain(
|
|
183
|
+
`(${metric.unit.toLowerCase()})`,
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
/*
|
|
190
|
+
* "Node Disk I/O" was wired to `k8s.node.filesystem.available` — free
|
|
191
|
+
* space remaining, not I/O. A user alerting on node disk activity built
|
|
192
|
+
* a "greater than" monitor on headroom, which fires when the disk is
|
|
193
|
+
* EMPTY and stays silent as it fills.
|
|
194
|
+
*/
|
|
195
|
+
describe("entries are named for the metric they are actually wired to", () => {
|
|
196
|
+
test("the mislabelled Node Disk I/O entry is gone", () => {
|
|
197
|
+
expect(getKubernetesMetricById("node-disk-io")).toBeUndefined();
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test("it is replaced by an honest free-space entry", () => {
|
|
201
|
+
const entry: KubernetesMetricDefinition | undefined =
|
|
202
|
+
getKubernetesMetricById("node-filesystem-available");
|
|
203
|
+
|
|
204
|
+
expect(entry).toBeDefined();
|
|
205
|
+
expect(entry?.metricName).toBe("k8s.node.filesystem.available");
|
|
206
|
+
expect(entry?.friendlyName).toBe("Node Filesystem Available");
|
|
207
|
+
// Headroom alerts ask "how low did it get", not "what was the mean".
|
|
208
|
+
expect(entry?.defaultAggregation).toBe(AggregationType.Min);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test("no throughput-sounding name points at a level/limit gauge", () => {
|
|
212
|
+
/*
|
|
213
|
+
* The generalised guard: catches the NEXT entry named for one thing
|
|
214
|
+
* and wired to another, rather than just this one.
|
|
215
|
+
*/
|
|
216
|
+
const throughputSoundingName: RegExp = /disk i\/o|network|throughput/i;
|
|
217
|
+
|
|
218
|
+
for (const metric of allMetrics) {
|
|
219
|
+
if (throughputSoundingName.test(metric.friendlyName)) {
|
|
220
|
+
expect(metric.metricName).not.toMatch(
|
|
221
|
+
/\.(available|capacity|limit|request)$/,
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
* DashboardTemplates documents this trap after being bitten by it: these
|
|
230
|
+
* are per-resource gauges that re-emit on every scrape, so summing across
|
|
231
|
+
* the window multiplies (resources x scrapes) and produces numbers in the
|
|
232
|
+
* hundreds for a tiny cluster. `k8s.pod.phase` is worse still — its value
|
|
233
|
+
* is an enum code (1 = Pending ... 5 = Unknown), so a Sum is an arithmetic
|
|
234
|
+
* total of category labels.
|
|
235
|
+
*/
|
|
236
|
+
describe("categorical and cumulative gauges are never summed", () => {
|
|
237
|
+
test("k8s.pod.phase does not default to Sum", () => {
|
|
238
|
+
const phase: KubernetesMetricDefinition | undefined =
|
|
239
|
+
getKubernetesMetricByMetricName("k8s.pod.phase");
|
|
240
|
+
|
|
241
|
+
expect(phase).toBeDefined();
|
|
242
|
+
expect(phase?.defaultAggregation).not.toBe(AggregationType.Sum);
|
|
243
|
+
// A phase code is dimensionless; "count" was the wrong dimension.
|
|
244
|
+
expect(phase?.unit).not.toBe("count");
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
test("no state/phase/condition gauge defaults to Sum", () => {
|
|
248
|
+
const describesAState: RegExp = /\bphase\b|\bcondition\b|\bstate\b|1 = /i;
|
|
249
|
+
|
|
250
|
+
for (const metric of allMetrics) {
|
|
251
|
+
if (describesAState.test(metric.description)) {
|
|
252
|
+
expect(metric.defaultAggregation).not.toBe(AggregationType.Sum);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test("no cumulative counter defaults to Sum", () => {
|
|
258
|
+
const describesACounter: RegExp = /cumulative/i;
|
|
259
|
+
|
|
260
|
+
for (const metric of allMetrics) {
|
|
261
|
+
if (describesACounter.test(metric.description)) {
|
|
262
|
+
expect(metric.defaultAggregation).not.toBe(AggregationType.Sum);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
/*
|
|
269
|
+
* KubernetesMetricDefinition has no field for a datapoint-attribute
|
|
270
|
+
* filter, and KubernetesMonitorStepForm passes none, so every entry
|
|
271
|
+
* queries EVERY series of its metric. "Pod Network Receive" therefore
|
|
272
|
+
* summed receive AND transmit together over a cumulative counter —
|
|
273
|
+
* roughly double the real receive volume, and a chatty transmitter
|
|
274
|
+
* tripping a receive threshold it never crossed.
|
|
275
|
+
*/
|
|
276
|
+
describe("no entry promises a filter the definition cannot express", () => {
|
|
277
|
+
test("the undeliverable directional entry is gone", () => {
|
|
278
|
+
expect(getKubernetesMetricById("pod-network-io-receive")).toBeUndefined();
|
|
279
|
+
expect(getKubernetesMetricById("pod-network-io")).toBeDefined();
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
test("no friendlyName claims a direction while carrying no filter", () => {
|
|
283
|
+
/*
|
|
284
|
+
* Becomes a real per-entry filter check the moment an optional
|
|
285
|
+
* `attributes` field lands on KubernetesMetricDefinition.
|
|
286
|
+
*/
|
|
287
|
+
const hasAttributeFilterField: boolean = allMetrics.some(
|
|
288
|
+
(m: KubernetesMetricDefinition) => {
|
|
289
|
+
return (
|
|
290
|
+
(m as KubernetesMetricDefinition & { attributes?: unknown })
|
|
291
|
+
.attributes !== undefined
|
|
292
|
+
);
|
|
293
|
+
},
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
if (hasAttributeFilterField) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
for (const metric of allMetrics) {
|
|
301
|
+
expect(metric.friendlyName).not.toMatch(
|
|
302
|
+
/\b(receive|transmit|ingress|egress)\b/i,
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
});
|
|
118
307
|
});
|
|
@@ -30,6 +30,23 @@ import ObjectID from "../../../Types/ObjectID";
|
|
|
30
30
|
* - Cluster-scalar templates must stay UNGROUPED. etcd leadership, API
|
|
31
31
|
* server throttling and scheduler queue depth are one value for the
|
|
32
32
|
* cluster; splitting them invents series that do not exist.
|
|
33
|
+
*
|
|
34
|
+
* - The key set is also the ALERT'S VOCABULARY. Series labels are
|
|
35
|
+
* stored on the alert and rendered into its title and description
|
|
36
|
+
* (SeriesLabelDisplay / SeriesContextEnricher), so a key left out
|
|
37
|
+
* here is a fact the on-call engineer does not get. That is why the
|
|
38
|
+
* namespace-scoped objects group by namespace as well as their own
|
|
39
|
+
* name: `k8s.pod.name` alone is not a Kubernetes identity, and
|
|
40
|
+
* "Pod: checkout-7d9f-2xk" with no namespace is a `kubectl` guess.
|
|
41
|
+
*
|
|
42
|
+
* - A key that only ONE side of a RATIO template carries is worse than
|
|
43
|
+
* a missing label: the two queries join by series fingerprint, so
|
|
44
|
+
* the formula silently stops producing values and the monitor stops
|
|
45
|
+
* alerting entirely. `k8s.namespace.name` is stamped directly by
|
|
46
|
+
* both kubeletstats and the k8s_cluster receiver and is safe;
|
|
47
|
+
* `k8s.node.name` on the k8s_cluster side only arrives via the
|
|
48
|
+
* best-effort k8sattributes processor and is deliberately NOT in any
|
|
49
|
+
* ratio template's key set. See buildKubernetesRatioMonitorConfig.
|
|
33
50
|
*/
|
|
34
51
|
|
|
35
52
|
interface TemplateGroupByCase {
|
|
@@ -42,8 +59,12 @@ interface TemplateGroupByCase {
|
|
|
42
59
|
const EXPECTED_GROUP_BY: Array<TemplateGroupByCase> = [
|
|
43
60
|
{
|
|
44
61
|
id: "k8s-crashloopbackoff",
|
|
45
|
-
groupByKeys: [
|
|
46
|
-
|
|
62
|
+
groupByKeys: [
|
|
63
|
+
"resource.k8s.namespace.name",
|
|
64
|
+
"resource.k8s.pod.name",
|
|
65
|
+
"resource.k8s.container.name",
|
|
66
|
+
],
|
|
67
|
+
why: "restarts belong to one CONTAINER of one pod, and the alert has to name which",
|
|
47
68
|
},
|
|
48
69
|
{
|
|
49
70
|
id: "k8s-pod-pending",
|
|
@@ -67,13 +88,16 @@ const EXPECTED_GROUP_BY: Array<TemplateGroupByCase> = [
|
|
|
67
88
|
},
|
|
68
89
|
{
|
|
69
90
|
id: "k8s-deployment-replica-mismatch",
|
|
70
|
-
groupByKeys: [
|
|
71
|
-
|
|
91
|
+
groupByKeys: [
|
|
92
|
+
"resource.k8s.namespace.name",
|
|
93
|
+
"resource.k8s.deployment.name",
|
|
94
|
+
],
|
|
95
|
+
why: "a stuck rollout belongs to one Deployment object, which is namespace-scoped",
|
|
72
96
|
},
|
|
73
97
|
{
|
|
74
98
|
id: "k8s-job-failures",
|
|
75
|
-
groupByKeys: ["resource.k8s.job.name"],
|
|
76
|
-
why: "one failing Job must not hide the next",
|
|
99
|
+
groupByKeys: ["resource.k8s.namespace.name", "resource.k8s.job.name"],
|
|
100
|
+
why: "one failing Job must not hide the next; Job names repeat across namespaces",
|
|
77
101
|
},
|
|
78
102
|
{
|
|
79
103
|
id: "k8s-etcd-no-leader",
|
|
@@ -97,8 +121,8 @@ const EXPECTED_GROUP_BY: Array<TemplateGroupByCase> = [
|
|
|
97
121
|
},
|
|
98
122
|
{
|
|
99
123
|
id: "k8s-daemonset-unavailable",
|
|
100
|
-
groupByKeys: ["resource.k8s.daemonset.name"],
|
|
101
|
-
why: "the incident names one DaemonSet",
|
|
124
|
+
groupByKeys: ["resource.k8s.namespace.name", "resource.k8s.daemonset.name"],
|
|
125
|
+
why: "the incident names one DaemonSet, which is namespace-scoped",
|
|
102
126
|
},
|
|
103
127
|
{
|
|
104
128
|
id: "k8s-node-cpu-request-utilization",
|
|
@@ -112,18 +136,18 @@ const EXPECTED_GROUP_BY: Array<TemplateGroupByCase> = [
|
|
|
112
136
|
},
|
|
113
137
|
{
|
|
114
138
|
id: "k8s-hpa-at-max-replicas",
|
|
115
|
-
groupByKeys: ["resource.k8s.hpa.name"],
|
|
116
|
-
why: "saturation belongs to one HPA object",
|
|
139
|
+
groupByKeys: ["resource.k8s.namespace.name", "resource.k8s.hpa.name"],
|
|
140
|
+
why: "saturation belongs to one HPA object, which is namespace-scoped",
|
|
117
141
|
},
|
|
118
142
|
{
|
|
119
143
|
id: "k8s-pod-memory-limit-saturation",
|
|
120
|
-
groupByKeys: ["resource.k8s.pod.name"],
|
|
121
|
-
why: "the pod about to be OOMKilled is the one to page on",
|
|
144
|
+
groupByKeys: ["resource.k8s.namespace.name", "resource.k8s.pod.name"],
|
|
145
|
+
why: "the pod about to be OOMKilled is the one to page on, and a pod name alone is not an identity",
|
|
122
146
|
},
|
|
123
147
|
{
|
|
124
148
|
id: "k8s-pod-cpu-limit-saturation",
|
|
125
|
-
groupByKeys: ["resource.k8s.pod.name"],
|
|
126
|
-
why: "the throttled pod is the one to page on",
|
|
149
|
+
groupByKeys: ["resource.k8s.namespace.name", "resource.k8s.pod.name"],
|
|
150
|
+
why: "the throttled pod is the one to page on, and a pod name alone is not an identity",
|
|
127
151
|
},
|
|
128
152
|
];
|
|
129
153
|
|
|
@@ -205,6 +229,63 @@ describe("KubernetesAlertTemplates - per-series group-by keys", () => {
|
|
|
205
229
|
},
|
|
206
230
|
);
|
|
207
231
|
|
|
232
|
+
/*
|
|
233
|
+
* Kubernetes object names are unique per (namespace, kind), not
|
|
234
|
+
* globally. A template that groups by a namespace-scoped object's name
|
|
235
|
+
* alone therefore does two wrong things at once: two same-named
|
|
236
|
+
* objects in different namespaces collapse into one series (so the
|
|
237
|
+
* second one's breach is silenced behind the first one's open alert),
|
|
238
|
+
* and the alert it does raise cannot be acted on without guessing the
|
|
239
|
+
* namespace.
|
|
240
|
+
*/
|
|
241
|
+
const NAMESPACE_SCOPED_OBJECT_KEYS: Array<string> = [
|
|
242
|
+
"resource.k8s.pod.name",
|
|
243
|
+
"resource.k8s.container.name",
|
|
244
|
+
"resource.k8s.deployment.name",
|
|
245
|
+
"resource.k8s.statefulset.name",
|
|
246
|
+
"resource.k8s.daemonset.name",
|
|
247
|
+
"resource.k8s.job.name",
|
|
248
|
+
"resource.k8s.cronjob.name",
|
|
249
|
+
"resource.k8s.hpa.name",
|
|
250
|
+
];
|
|
251
|
+
|
|
252
|
+
test.each(
|
|
253
|
+
EXPECTED_GROUP_BY.filter((tc: TemplateGroupByCase) => {
|
|
254
|
+
return tc.groupByKeys.some((key: string) => {
|
|
255
|
+
return NAMESPACE_SCOPED_OBJECT_KEYS.includes(key);
|
|
256
|
+
});
|
|
257
|
+
}),
|
|
258
|
+
)(
|
|
259
|
+
"$id groups a namespace-scoped object and therefore also by namespace",
|
|
260
|
+
(tc: TemplateGroupByCase) => {
|
|
261
|
+
expect(tc.groupByKeys).toContain("resource.k8s.namespace.name");
|
|
262
|
+
},
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
test("every query of a template shares one group-by key set", () => {
|
|
266
|
+
/*
|
|
267
|
+
* Ratio templates join their two queries by series fingerprint,
|
|
268
|
+
* which is computed from this key set. Two queries with different
|
|
269
|
+
* key sets produce fingerprints that never meet, the formula
|
|
270
|
+
* evaluates against an empty operand, and the monitor stops
|
|
271
|
+
* alerting without any error anywhere.
|
|
272
|
+
*/
|
|
273
|
+
for (const template of getAllKubernetesAlertTemplates()) {
|
|
274
|
+
const step: MonitorStep = template.getMonitorStep(buildArgs());
|
|
275
|
+
|
|
276
|
+
const keySets: Array<string> = (
|
|
277
|
+
(step.data?.kubernetesMonitor?.metricViewConfig?.queryConfigs ||
|
|
278
|
+
[]) as Array<any>
|
|
279
|
+
).map((queryConfig: any) => {
|
|
280
|
+
return JSON.stringify(
|
|
281
|
+
queryConfig.metricQueryData.groupByAttributeKeys || [],
|
|
282
|
+
);
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
expect(new Set(keySets).size).toBeLessThanOrEqual(1);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
|
|
208
289
|
test("grouped templates are the majority of the shipped set", () => {
|
|
209
290
|
const grouped: number = EXPECTED_GROUP_BY.filter(
|
|
210
291
|
(tc: TemplateGroupByCase) => {
|
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
getPodmanAlertTemplatesByCategory,
|
|
8
8
|
} from "../../../Types/Monitor/PodmanAlertTemplates";
|
|
9
9
|
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
10
|
+
import { getPodmanMetricByMetricName } from "../../../Types/Monitor/PodmanMetricCatalog";
|
|
11
|
+
import { hasRecoveryDeadBand } from "./Utils/RecommendationCriteriaAssertions";
|
|
10
12
|
import MonitorStepPodmanMonitor from "../../../Types/Monitor/MonitorStepPodmanMonitor";
|
|
11
13
|
import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
|
|
12
14
|
import RollingTime from "../../../Types/RollingTime/RollingTime";
|
|
@@ -42,7 +44,7 @@ const PODMAN_TEMPLATES: Array<PodmanTemplateCase> = [
|
|
|
42
44
|
severity: "Warning",
|
|
43
45
|
metricName: "container.cpu.utilization",
|
|
44
46
|
metricAlias: "container_cpu",
|
|
45
|
-
aggregation: MetricsAggregationType.
|
|
47
|
+
aggregation: MetricsAggregationType.Avg,
|
|
46
48
|
rollingTime: RollingTime.Past5Minutes,
|
|
47
49
|
offlineFilterType: FilterType.GreaterThan,
|
|
48
50
|
onlineFilterType: FilterType.LessThanOrEqualTo,
|
|
@@ -54,7 +56,7 @@ const PODMAN_TEMPLATES: Array<PodmanTemplateCase> = [
|
|
|
54
56
|
severity: "Warning",
|
|
55
57
|
metricName: "container.memory.percent",
|
|
56
58
|
metricAlias: "container_memory",
|
|
57
|
-
aggregation: MetricsAggregationType.
|
|
59
|
+
aggregation: MetricsAggregationType.Avg,
|
|
58
60
|
rollingTime: RollingTime.Past5Minutes,
|
|
59
61
|
offlineFilterType: FilterType.GreaterThan,
|
|
60
62
|
onlineFilterType: FilterType.LessThanOrEqualTo,
|
|
@@ -72,19 +74,6 @@ const PODMAN_TEMPLATES: Array<PodmanTemplateCase> = [
|
|
|
72
74
|
onlineFilterType: FilterType.LessThanOrEqualTo,
|
|
73
75
|
threshold: 5,
|
|
74
76
|
},
|
|
75
|
-
{
|
|
76
|
-
id: "podman-cpu-throttling",
|
|
77
|
-
category: "Resource",
|
|
78
|
-
severity: "Warning",
|
|
79
|
-
metricName: "container.cpu.throttling_data.throttled_time",
|
|
80
|
-
metricAlias: "cpu_throttled",
|
|
81
|
-
aggregation: MetricsAggregationType.Max,
|
|
82
|
-
rollingTime: RollingTime.Past5Minutes,
|
|
83
|
-
// throttled_time is non-negative: (> 0) unhealthy, (= 0) healthy partitions it.
|
|
84
|
-
offlineFilterType: FilterType.GreaterThan,
|
|
85
|
-
onlineFilterType: FilterType.EqualTo,
|
|
86
|
-
threshold: 0,
|
|
87
|
-
},
|
|
88
77
|
{
|
|
89
78
|
id: "podman-high-pids",
|
|
90
79
|
category: "Container",
|
|
@@ -105,10 +94,15 @@ const PODMAN_TEMPLATES: Array<PodmanTemplateCase> = [
|
|
|
105
94
|
metricAlias: "container_uptime",
|
|
106
95
|
aggregation: MetricsAggregationType.Min,
|
|
107
96
|
rollingTime: RollingTime.Past1Minute,
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
97
|
+
/*
|
|
98
|
+
* uptime is never 0: the docker_stats receiver scrapes only RUNNING
|
|
99
|
+
* containers, so a stopped one emits nothing rather than a zero, and a
|
|
100
|
+
* running one is never sampled at the instant it started. The fire test
|
|
101
|
+
* is a low-uptime (restart) test, not an equality against zero.
|
|
102
|
+
*/
|
|
103
|
+
offlineFilterType: FilterType.LessThan,
|
|
104
|
+
onlineFilterType: FilterType.GreaterThanOrEqualTo,
|
|
105
|
+
threshold: 120,
|
|
112
106
|
},
|
|
113
107
|
];
|
|
114
108
|
|
|
@@ -217,7 +211,7 @@ describe("PodmanAlertTemplates", () => {
|
|
|
217
211
|
);
|
|
218
212
|
|
|
219
213
|
test.each(PODMAN_TEMPLATES)(
|
|
220
|
-
"$id unhealthy/healthy criteria
|
|
214
|
+
"$id unhealthy/healthy criteria leave a recovery dead band around $threshold",
|
|
221
215
|
(tc: PodmanTemplateCase) => {
|
|
222
216
|
const template: PodmanAlertTemplate = getPodmanAlertTemplateById(tc.id)!;
|
|
223
217
|
const step: MonitorStep = template.getMonitorStep(buildArgs());
|
|
@@ -237,7 +231,26 @@ describe("PodmanAlertTemplates", () => {
|
|
|
237
231
|
tc.metricAlias,
|
|
238
232
|
);
|
|
239
233
|
expect(offlineFilter.value).toBe(tc.threshold);
|
|
240
|
-
|
|
234
|
+
/*
|
|
235
|
+
* The healthy criteria recovers at a threshold strictly INSIDE the
|
|
236
|
+
* firing one, so a metric hovering at the boundary cannot satisfy
|
|
237
|
+
* both on consecutive evaluations. This assertion used to be
|
|
238
|
+
* `expect(onlineFilter.value).toBe(tc.threshold)` — the two criteria
|
|
239
|
+
* exactly partitioned the range, which is the flapping configuration
|
|
240
|
+
* this suite existed to lock in.
|
|
241
|
+
*/
|
|
242
|
+
expect(
|
|
243
|
+
hasRecoveryDeadBand(
|
|
244
|
+
{
|
|
245
|
+
filterType: offlineFilter.filterType,
|
|
246
|
+
value: offlineFilter.value as number,
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
filterType: onlineFilter.filterType,
|
|
250
|
+
value: onlineFilter.value as number,
|
|
251
|
+
},
|
|
252
|
+
),
|
|
253
|
+
).toBe(true);
|
|
241
254
|
|
|
242
255
|
expect(offlineFilter.filterType).toBe(tc.offlineFilterType);
|
|
243
256
|
expect(onlineFilter.filterType).toBe(tc.onlineFilterType);
|
|
@@ -268,4 +281,160 @@ describe("PodmanAlertTemplates", () => {
|
|
|
268
281
|
expect(offline.data.alerts[0].autoResolveAlert).toBe(true);
|
|
269
282
|
}
|
|
270
283
|
});
|
|
284
|
+
|
|
285
|
+
/*
|
|
286
|
+
* Lifetime, monotonic counters. Nothing between OTLP ingest and the
|
|
287
|
+
* criteria evaluator converts one to a delta or a rate — ingest keeps
|
|
288
|
+
* aggregationTemporality/isMonotonic only as catalog metadata for the
|
|
289
|
+
* dashboard's rate-view hint, AggregationType has no rate/increase member,
|
|
290
|
+
* and CompareCriteria.reduceWindow offers only Average/Sum/Max/Min. So a
|
|
291
|
+
* "> N" criteria on one of these fires the first time the container ever
|
|
292
|
+
* breaches and NEVER clears: the recovery comparison is unreachable until
|
|
293
|
+
* the container is recreated. `podman-cpu-throttling` did exactly that on
|
|
294
|
+
* throttled_time and was removed for it; this guard stops it, or an
|
|
295
|
+
* equivalent, being pasted back in from DockerAlertTemplates.
|
|
296
|
+
*/
|
|
297
|
+
const CUMULATIVE_METRICS: Array<string> = [
|
|
298
|
+
"container.cpu.throttling_data.throttled_time",
|
|
299
|
+
"container.cpu.throttling_data.throttled_periods",
|
|
300
|
+
"container.cpu.usage.total",
|
|
301
|
+
];
|
|
302
|
+
|
|
303
|
+
test("no template thresholds a cumulative counter it cannot recover from", () => {
|
|
304
|
+
for (const template of getAllPodmanAlertTemplates()) {
|
|
305
|
+
const monitor: MonitorStepPodmanMonitor = getPodmanMonitor(
|
|
306
|
+
template.getMonitorStep(buildArgs()),
|
|
307
|
+
);
|
|
308
|
+
for (const queryConfig of monitor.metricViewConfig
|
|
309
|
+
.queryConfigs as Array<any>) {
|
|
310
|
+
expect(CUMULATIVE_METRICS).not.toContain(
|
|
311
|
+
queryConfig.metricQueryData.filterData.metricName,
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
test("podman-cpu-throttling is not registered", () => {
|
|
318
|
+
// Removed deliberately — see the note in PodmanAlertTemplates.ts.
|
|
319
|
+
expect(getPodmanAlertTemplateById("podman-cpu-throttling")).toBeUndefined();
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
test("podman-container-down fires on a low uptime, not on an unreachable zero", () => {
|
|
323
|
+
const step: MonitorStep = getPodmanAlertTemplateById(
|
|
324
|
+
"podman-container-down",
|
|
325
|
+
)!.getMonitorStep(buildArgs());
|
|
326
|
+
const [offline, online]: Array<any> = step.data?.monitorCriteria.data
|
|
327
|
+
?.monitorCriteriaInstanceArray as Array<any>;
|
|
328
|
+
|
|
329
|
+
/*
|
|
330
|
+
* A stopped container emits no rows at all and a running one is never
|
|
331
|
+
* scraped at the instant it started, so an equality-to-zero comparison
|
|
332
|
+
* on container.uptime can never be satisfied in either direction.
|
|
333
|
+
*/
|
|
334
|
+
expect(offline.data.filters[0].filterType).not.toBe(FilterType.EqualTo);
|
|
335
|
+
expect(offline.data.filters[0].value).toBeGreaterThan(0);
|
|
336
|
+
|
|
337
|
+
// Wider than the 30s scrape and the 60s evaluation interval combined.
|
|
338
|
+
expect(offline.data.filters[0].value).toBeGreaterThanOrEqual(120);
|
|
339
|
+
|
|
340
|
+
// And recovery sits strictly outside the firing threshold.
|
|
341
|
+
expect(online.data.filters[0].filterType).toBe(
|
|
342
|
+
FilterType.GreaterThanOrEqualTo,
|
|
343
|
+
);
|
|
344
|
+
expect(online.data.filters[0].value).toBeGreaterThan(
|
|
345
|
+
offline.data.filters[0].value as number,
|
|
346
|
+
);
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
test("cumulative-counter templates do not claim windowed semantics", () => {
|
|
350
|
+
/*
|
|
351
|
+
* container.restarts is a running total kept by the container engine and
|
|
352
|
+
* nothing in the alerting path converts it to a delta, so copy promising
|
|
353
|
+
* a per-window count describes behaviour the query does not implement.
|
|
354
|
+
* The criteria description is what the on-call engineer reads in the
|
|
355
|
+
* Evaluation Logs, so the correction has to live there, not just in the
|
|
356
|
+
* template's own name.
|
|
357
|
+
*/
|
|
358
|
+
const step: MonitorStep = getPodmanAlertTemplateById(
|
|
359
|
+
"podman-restart-loop",
|
|
360
|
+
)!.getMonitorStep(buildArgs());
|
|
361
|
+
const offline: any = (
|
|
362
|
+
step.data?.monitorCriteria.data
|
|
363
|
+
?.monitorCriteriaInstanceArray as Array<any>
|
|
364
|
+
)[0];
|
|
365
|
+
|
|
366
|
+
expect(offline.data.description).toMatch(/running total|cumulative/i);
|
|
367
|
+
expect(offline.data.description).not.toMatch(/in the monitoring window/i);
|
|
368
|
+
expect(offline.data.incidents[0].description).toMatch(
|
|
369
|
+
/running total|cumulative/i,
|
|
370
|
+
);
|
|
371
|
+
expect(
|
|
372
|
+
getPodmanAlertTemplateById("podman-restart-loop")!.description,
|
|
373
|
+
).not.toMatch(/crash loop/i);
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
test("percentage gauges use the aggregation their catalog entry declares", () => {
|
|
377
|
+
/*
|
|
378
|
+
* container.cpu.utilization and container.memory.percent are already
|
|
379
|
+
* per-container percentages; PodmanMetricCatalog declares Avg for both
|
|
380
|
+
* and the Docker Swarm templates use Avg on the identical metrics at the
|
|
381
|
+
* identical thresholds. Max on a per-minute bucket turns a sub-minute
|
|
382
|
+
* burst into a whole minute above the threshold, which contradicts the
|
|
383
|
+
* word "sustained" in the copy — and with the fire side now evaluated
|
|
384
|
+
* over ALL values in the window, Max means "every minute's PEAK crossed",
|
|
385
|
+
* which is strictly weaker than sustained load.
|
|
386
|
+
*/
|
|
387
|
+
for (const id of ["podman-high-cpu", "podman-high-memory"]) {
|
|
388
|
+
const monitor: MonitorStepPodmanMonitor = getPodmanMonitor(
|
|
389
|
+
getPodmanAlertTemplateById(id)!.getMonitorStep(buildArgs()),
|
|
390
|
+
);
|
|
391
|
+
const filterData: any = (
|
|
392
|
+
monitor.metricViewConfig.queryConfigs as Array<any>
|
|
393
|
+
)[0].metricQueryData.filterData;
|
|
394
|
+
|
|
395
|
+
expect(filterData.aggegationType).toBe(MetricsAggregationType.Avg);
|
|
396
|
+
expect(filterData.aggegationType).toBe(
|
|
397
|
+
getPodmanMetricByMetricName(filterData.metricName)!.defaultAggregation,
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
test("podman-high-cpu states the percent-of-one-core scale", () => {
|
|
403
|
+
/*
|
|
404
|
+
* PodmanMetricCatalog: "100% = 1 full CPU core". A container spread over
|
|
405
|
+
* several cores sits permanently above 80 while healthy, so copy that
|
|
406
|
+
* reads as "80% of the container's CPU allowance" is wrong.
|
|
407
|
+
*/
|
|
408
|
+
const step: MonitorStep =
|
|
409
|
+
getPodmanAlertTemplateById("podman-high-cpu")!.getMonitorStep(
|
|
410
|
+
buildArgs(),
|
|
411
|
+
);
|
|
412
|
+
const offline: any = (
|
|
413
|
+
step.data?.monitorCriteria.data
|
|
414
|
+
?.monitorCriteriaInstanceArray as Array<any>
|
|
415
|
+
)[0];
|
|
416
|
+
|
|
417
|
+
expect(offline.data.incidents[0].description).toMatch(/core/i);
|
|
418
|
+
expect(offline.data.description).toMatch(/core/i);
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
test("podman-high-memory does not promise a limit the metric may not have", () => {
|
|
422
|
+
/*
|
|
423
|
+
* container.memory.percent falls back to a percentage of HOST total for a
|
|
424
|
+
* container started without --memory, which is Podman's default. Copy
|
|
425
|
+
* that says only "of its limit", and builds an OOM narrative on it, is
|
|
426
|
+
* wrong for exactly the container most able to take the host down.
|
|
427
|
+
*/
|
|
428
|
+
const step: MonitorStep =
|
|
429
|
+
getPodmanAlertTemplateById("podman-high-memory")!.getMonitorStep(
|
|
430
|
+
buildArgs(),
|
|
431
|
+
);
|
|
432
|
+
const offline: any = (
|
|
433
|
+
step.data?.monitorCriteria.data
|
|
434
|
+
?.monitorCriteriaInstanceArray as Array<any>
|
|
435
|
+
)[0];
|
|
436
|
+
|
|
437
|
+
expect(offline.data.incidents[0].description).toMatch(/host/i);
|
|
438
|
+
expect(offline.data.description).toMatch(/host/i);
|
|
439
|
+
});
|
|
271
440
|
});
|