@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
|
@@ -18,8 +18,10 @@ import MetricFormulaConfigData from "../../../Types/Metrics/MetricFormulaConfigD
|
|
|
18
18
|
import {
|
|
19
19
|
CheckOn,
|
|
20
20
|
CriteriaFilter,
|
|
21
|
+
EvaluateOverTimeType,
|
|
21
22
|
FilterType,
|
|
22
23
|
} from "../../../Types/Monitor/CriteriaFilter";
|
|
24
|
+
import SeriesLabelDisplay from "../../../Types/Monitor/SeriesContext/SeriesLabelDisplay";
|
|
23
25
|
import { ServiceLanguage } from "../../../Types/Service/ServiceLanguage";
|
|
24
26
|
import ObjectID from "../../../Types/ObjectID";
|
|
25
27
|
|
|
@@ -593,6 +595,215 @@ describe("ServiceAlertTemplates", () => {
|
|
|
593
595
|
expect(new Set<string>(aliases).size).toBe(aliases.length);
|
|
594
596
|
}
|
|
595
597
|
});
|
|
598
|
+
|
|
599
|
+
/*
|
|
600
|
+
* `MetricMonitorCriteria.evaluateAllSeries` writes its `AnyValue` default
|
|
601
|
+
* back THROUGH this object when `metricAggregationType` is unset, and the
|
|
602
|
+
* criteria edit form spreads and re-assigns it. Sharing one object between
|
|
603
|
+
* the two filters makes either of those flip the healthy criteria as a
|
|
604
|
+
* side effect of touching the unhealthy one — which is how you get both
|
|
605
|
+
* criteria reporting Met on different value sets in one evaluation.
|
|
606
|
+
*/
|
|
607
|
+
it("gives each criteria filter its own metricMonitorOptions object", () => {
|
|
608
|
+
for (const template of ALL_TEMPLATES) {
|
|
609
|
+
const filters: Array<CriteriaFilter> = getFilters(buildStep(template));
|
|
610
|
+
|
|
611
|
+
expect(filters.length).toBe(2);
|
|
612
|
+
|
|
613
|
+
const unhealthy: CriteriaFilter = filters[0]!;
|
|
614
|
+
const healthy: CriteriaFilter = filters[1]!;
|
|
615
|
+
|
|
616
|
+
if (!unhealthy.metricMonitorOptions) {
|
|
617
|
+
expect(healthy.metricMonitorOptions).toBeUndefined();
|
|
618
|
+
continue;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// Same content...
|
|
622
|
+
expect(healthy.metricMonitorOptions).toEqual(
|
|
623
|
+
unhealthy.metricMonitorOptions,
|
|
624
|
+
);
|
|
625
|
+
// ...different object.
|
|
626
|
+
expect(healthy.metricMonitorOptions).not.toBe(
|
|
627
|
+
unhealthy.metricMonitorOptions,
|
|
628
|
+
);
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
|
|
632
|
+
/*
|
|
633
|
+
* Guards the in-place write at `MetricMonitorCriteria.evaluateAllSeries`
|
|
634
|
+
* from ever being reachable: an unset aggregation is what triggers it.
|
|
635
|
+
*/
|
|
636
|
+
it("keeps both filters on the sustained aggregation", () => {
|
|
637
|
+
let checked: number = 0;
|
|
638
|
+
|
|
639
|
+
for (const template of ALL_TEMPLATES) {
|
|
640
|
+
for (const filter of getFilters(buildStep(template))) {
|
|
641
|
+
if (!filter.metricMonitorOptions) {
|
|
642
|
+
continue;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
expect(filter.metricMonitorOptions.metricAggregationType).toBe(
|
|
646
|
+
EvaluateOverTimeType.AllValues,
|
|
647
|
+
);
|
|
648
|
+
checked++;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
expect(checked).toBeGreaterThan(0);
|
|
653
|
+
});
|
|
654
|
+
});
|
|
655
|
+
|
|
656
|
+
/*
|
|
657
|
+
* Without a group-by every replica collapses into one number: an Avg heap
|
|
658
|
+
* template on three JVMs at 95/20/20 reads 45 and stays green while one
|
|
659
|
+
* OOM-kills, and a Max template fires without being able to name the
|
|
660
|
+
* replica. The two latency percentiles are service-level on purpose and are
|
|
661
|
+
* the only exemptions.
|
|
662
|
+
*/
|
|
663
|
+
describe("per-instance grouping", () => {
|
|
664
|
+
const INSTANCE_KEY: string = "resource.service.instance.id";
|
|
665
|
+
|
|
666
|
+
const SERVICE_LEVEL_METRIC_TEMPLATE_IDS: Array<string> = [
|
|
667
|
+
"service-latency-p95",
|
|
668
|
+
"service-latency-p99",
|
|
669
|
+
];
|
|
670
|
+
|
|
671
|
+
function getQueryConfigs(
|
|
672
|
+
template: ServiceAlertTemplate,
|
|
673
|
+
): Array<MetricQueryConfigData> {
|
|
674
|
+
return (
|
|
675
|
+
buildStep(template).data?.metricMonitor?.metricViewConfig
|
|
676
|
+
?.queryConfigs || []
|
|
677
|
+
);
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
it("groups every per-process metric template by the service instance", () => {
|
|
681
|
+
let grouped: number = 0;
|
|
682
|
+
|
|
683
|
+
for (const template of ALL_TEMPLATES) {
|
|
684
|
+
if (template.monitorType !== MonitorType.Metrics) {
|
|
685
|
+
continue;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
const expected: Array<string> =
|
|
689
|
+
SERVICE_LEVEL_METRIC_TEMPLATE_IDS.includes(template.id)
|
|
690
|
+
? []
|
|
691
|
+
: [INSTANCE_KEY];
|
|
692
|
+
|
|
693
|
+
const queryConfigs: Array<MetricQueryConfigData> =
|
|
694
|
+
getQueryConfigs(template);
|
|
695
|
+
|
|
696
|
+
expect(queryConfigs.length).toBeGreaterThan(0);
|
|
697
|
+
|
|
698
|
+
for (const queryConfig of queryConfigs) {
|
|
699
|
+
expect(
|
|
700
|
+
queryConfig.metricQueryData?.groupByAttributeKeys || [],
|
|
701
|
+
).toEqual(expected);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
if (expected.length > 0) {
|
|
705
|
+
grouped++;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
// The canary: if grouping is reverted wholesale this drops to zero.
|
|
710
|
+
expect(grouped).toBeGreaterThan(20);
|
|
711
|
+
});
|
|
712
|
+
|
|
713
|
+
/*
|
|
714
|
+
* The two SLO percentiles opt out by passing `[]`, and `buildQueryConfig`
|
|
715
|
+
* must then omit the field rather than serialize an empty array — so an
|
|
716
|
+
* ungrouped template's stored payload is byte-identical to what it was
|
|
717
|
+
* before grouping existed.
|
|
718
|
+
*/
|
|
719
|
+
it.each(SERVICE_LEVEL_METRIC_TEMPLATE_IDS)(
|
|
720
|
+
"%s stays service-level, with no group-by key written at all",
|
|
721
|
+
(templateId: string) => {
|
|
722
|
+
for (const queryConfig of getQueryConfigs(
|
|
723
|
+
getServiceAlertTemplateById(templateId)!,
|
|
724
|
+
)) {
|
|
725
|
+
expect(
|
|
726
|
+
queryConfig.metricQueryData?.groupByAttributeKeys,
|
|
727
|
+
).toBeUndefined();
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
expect(
|
|
731
|
+
MonitorStep.getGroupByAttributeKeys(
|
|
732
|
+
buildStep(getServiceAlertTemplateById(templateId)!),
|
|
733
|
+
),
|
|
734
|
+
).toEqual([]);
|
|
735
|
+
},
|
|
736
|
+
);
|
|
737
|
+
|
|
738
|
+
/*
|
|
739
|
+
* The query config is only half of it: the worker reads the keys back
|
|
740
|
+
* through `MonitorStep.getGroupByAttributeKeys`, and that is what decides
|
|
741
|
+
* whether the evaluation fans out per series at all.
|
|
742
|
+
*/
|
|
743
|
+
it("surfaces the instance key through the accessor the worker reads", () => {
|
|
744
|
+
for (const template of ALL_TEMPLATES) {
|
|
745
|
+
if (
|
|
746
|
+
template.monitorType !== MonitorType.Metrics ||
|
|
747
|
+
SERVICE_LEVEL_METRIC_TEMPLATE_IDS.includes(template.id)
|
|
748
|
+
) {
|
|
749
|
+
continue;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
expect(
|
|
753
|
+
MonitorStep.getGroupByAttributeKeys(buildStep(template)),
|
|
754
|
+
).toEqual([INSTANCE_KEY]);
|
|
755
|
+
}
|
|
756
|
+
});
|
|
757
|
+
|
|
758
|
+
/*
|
|
759
|
+
* A key nobody registered renders as "Service Instance Id: ..." from the
|
|
760
|
+
* prettified-key fallback instead of "Instance: ...", and the
|
|
761
|
+
* catalog-level debuggability suite fails on it.
|
|
762
|
+
*/
|
|
763
|
+
it("groups only by keys SeriesLabelDisplay can name", () => {
|
|
764
|
+
for (const template of ALL_TEMPLATES) {
|
|
765
|
+
for (const key of MonitorStep.getGroupByAttributeKeys(
|
|
766
|
+
buildStep(template),
|
|
767
|
+
)) {
|
|
768
|
+
expect(SeriesLabelDisplay.isKnownLabelKey(key)).toBe(true);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
});
|
|
772
|
+
|
|
773
|
+
it("names the instance key 'Instance', prefixed or not", () => {
|
|
774
|
+
expect(SeriesLabelDisplay.getFriendlyLabelName(INSTANCE_KEY)).toBe(
|
|
775
|
+
"Instance",
|
|
776
|
+
);
|
|
777
|
+
expect(
|
|
778
|
+
SeriesLabelDisplay.getFriendlyLabelName("service.instance.id"),
|
|
779
|
+
).toBe("Instance");
|
|
780
|
+
});
|
|
781
|
+
|
|
782
|
+
it("ranks the instance above the service it belongs to", () => {
|
|
783
|
+
// The monitor name already says which service; the replica does not.
|
|
784
|
+
expect(SeriesLabelDisplay.getLabelPriority(INSTANCE_KEY)).toBeLessThan(
|
|
785
|
+
SeriesLabelDisplay.getLabelPriority("service.name"),
|
|
786
|
+
);
|
|
787
|
+
});
|
|
788
|
+
|
|
789
|
+
/*
|
|
790
|
+
* `service.instance.id` is optional in the resource semantic conventions.
|
|
791
|
+
* An SDK that omits it produces one series whose label value is the empty
|
|
792
|
+
* string, and the display layer must drop it rather than render
|
|
793
|
+
* "Instance: " — which is what makes grouping safe to default on.
|
|
794
|
+
*/
|
|
795
|
+
it("renders nothing for a service that does not report an instance", () => {
|
|
796
|
+
expect(
|
|
797
|
+
SeriesLabelDisplay.getDisplayLabels({ [INSTANCE_KEY]: "" }),
|
|
798
|
+
).toEqual([]);
|
|
799
|
+
expect(
|
|
800
|
+
SeriesLabelDisplay.getDisplayLabels({ [INSTANCE_KEY]: "worker-7" }).map(
|
|
801
|
+
(label: { name: string; value: string }) => {
|
|
802
|
+
return `${label.name}: ${label.value}`;
|
|
803
|
+
},
|
|
804
|
+
),
|
|
805
|
+
).toEqual(["Instance: worker-7"]);
|
|
806
|
+
});
|
|
596
807
|
});
|
|
597
808
|
|
|
598
809
|
describe("the two ratio templates", () => {
|
|
@@ -651,6 +862,29 @@ describe("ServiceAlertTemplates", () => {
|
|
|
651
862
|
}
|
|
652
863
|
},
|
|
653
864
|
);
|
|
865
|
+
|
|
866
|
+
/*
|
|
867
|
+
* The formula divides one query by the other. Both sides must carry the
|
|
868
|
+
* same group-by key, or the "Grouped By" root-cause block — which
|
|
869
|
+
* `MetricMonitorCriteria.buildContext` reads off a SINGLE query config —
|
|
870
|
+
* renders empty for whichever side it happened to read.
|
|
871
|
+
*/
|
|
872
|
+
it.each(RATIO_TEMPLATE_IDS)(
|
|
873
|
+
"%s groups both queries on the same key, so the formula divides one instance's usage by its own limit",
|
|
874
|
+
(templateId: string) => {
|
|
875
|
+
const queryConfigs: Array<MetricQueryConfigData> =
|
|
876
|
+
buildStep(getServiceAlertTemplateById(templateId)!).data
|
|
877
|
+
?.metricMonitor?.metricViewConfig?.queryConfigs || [];
|
|
878
|
+
|
|
879
|
+
expect(queryConfigs.length).toBe(2);
|
|
880
|
+
expect(queryConfigs[0]!.metricQueryData?.groupByAttributeKeys).toEqual([
|
|
881
|
+
"resource.service.instance.id",
|
|
882
|
+
]);
|
|
883
|
+
expect(queryConfigs[1]!.metricQueryData?.groupByAttributeKeys).toEqual(
|
|
884
|
+
queryConfigs[0]!.metricQueryData?.groupByAttributeKeys,
|
|
885
|
+
);
|
|
886
|
+
},
|
|
887
|
+
);
|
|
654
888
|
});
|
|
655
889
|
|
|
656
890
|
describe("the metric names each template reads", () => {
|
|
@@ -694,6 +928,42 @@ describe("ServiceAlertTemplates", () => {
|
|
|
694
928
|
"service-go-scheduler-latency-p99": ["go.schedule.duration"],
|
|
695
929
|
};
|
|
696
930
|
|
|
931
|
+
/*
|
|
932
|
+
* Constraint 3 in the module header: a monitor holds exactly ONE metric
|
|
933
|
+
* name, so a template pointed at a pre-stabilization name must at least
|
|
934
|
+
* SAY so — otherwise a team on a current SDK gets a monitor that is green
|
|
935
|
+
* forever and indistinguishable from a healthy service.
|
|
936
|
+
*/
|
|
937
|
+
it("names the metric it reads whenever that metric is a pre-stabilization name", () => {
|
|
938
|
+
let checked: number = 0;
|
|
939
|
+
|
|
940
|
+
for (const template of ALL_TEMPLATES) {
|
|
941
|
+
if (template.monitorType !== MonitorType.Metrics) {
|
|
942
|
+
continue;
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
const queryConfigs: Array<MetricQueryConfigData> =
|
|
946
|
+
buildStep(template).data?.metricMonitor?.metricViewConfig
|
|
947
|
+
?.queryConfigs || [];
|
|
948
|
+
|
|
949
|
+
for (const queryConfig of queryConfigs) {
|
|
950
|
+
const metricName: string = String(
|
|
951
|
+
queryConfig.metricQueryData?.filterData?.["metricName"] || "",
|
|
952
|
+
);
|
|
953
|
+
|
|
954
|
+
if (!metricName.startsWith("process.runtime.")) {
|
|
955
|
+
continue;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
expect(template.description).toContain(metricName);
|
|
959
|
+
checked++;
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
// Both Python templates read a `process.runtime.cpython.*` name today.
|
|
964
|
+
expect(checked).toBe(2);
|
|
965
|
+
});
|
|
966
|
+
|
|
697
967
|
it("covers every metric template", () => {
|
|
698
968
|
const metricTemplateIds: Array<string> = ALL_TEMPLATES.filter(
|
|
699
969
|
(template: ServiceAlertTemplate) => {
|
|
@@ -50,8 +50,9 @@ import ObjectID from "../../../Types/ObjectID";
|
|
|
50
50
|
* nothing. Filesystem utilization is per-mountpoint, so it groups by the
|
|
51
51
|
* unprefixed `mountpoint` datapoint label the hostmetrics receiver sets
|
|
52
52
|
* (read the same way in App/FeatureSet/Dashboard/src/Pages/Host/View/
|
|
53
|
-
* Overview.tsx)
|
|
54
|
-
*
|
|
53
|
+
* Overview.tsx), plus the `device` label the same datapoint carries.
|
|
54
|
+
* Host templates for per-device disk I/O or network interfaces do not
|
|
55
|
+
* exist yet; when one is added it groups by `device`.
|
|
55
56
|
*
|
|
56
57
|
* Each table is exhaustive both ways — a new template with no row here fails
|
|
57
58
|
* loudly, which forces the group-by decision to be made deliberately.
|
|
@@ -86,6 +87,14 @@ const EXPECTED_DOCKER_GROUP_BY: Array<GroupByExpectation> = [
|
|
|
86
87
|
},
|
|
87
88
|
];
|
|
88
89
|
|
|
90
|
+
/*
|
|
91
|
+
* `podman-cpu-throttling` was REMOVED from the catalog, not from this list by
|
|
92
|
+
* oversight. It thresholded `container.cpu.throttling.throttled_time` — a
|
|
93
|
+
* LIFETIME cumulative counter — at `> 0`, so any container that had ever been
|
|
94
|
+
* throttled since it started pinned the monitor unhealthy forever, and the
|
|
95
|
+
* healthy criteria could never match. Nothing in the ingest or criteria path
|
|
96
|
+
* deltas a counter, so there was no threshold that would have made it work.
|
|
97
|
+
*/
|
|
89
98
|
const EXPECTED_PODMAN_GROUP_BY: Array<GroupByExpectation> = [
|
|
90
99
|
{ id: "podman-high-cpu", groupByAttributeKeys: [CONTAINER_NAME_ATTRIBUTE] },
|
|
91
100
|
{
|
|
@@ -96,10 +105,6 @@ const EXPECTED_PODMAN_GROUP_BY: Array<GroupByExpectation> = [
|
|
|
96
105
|
id: "podman-restart-loop",
|
|
97
106
|
groupByAttributeKeys: [CONTAINER_NAME_ATTRIBUTE],
|
|
98
107
|
},
|
|
99
|
-
{
|
|
100
|
-
id: "podman-cpu-throttling",
|
|
101
|
-
groupByAttributeKeys: [CONTAINER_NAME_ATTRIBUTE],
|
|
102
|
-
},
|
|
103
108
|
{ id: "podman-high-pids", groupByAttributeKeys: [CONTAINER_NAME_ATTRIBUTE] },
|
|
104
109
|
{
|
|
105
110
|
id: "podman-container-down",
|
|
@@ -113,8 +118,17 @@ const EXPECTED_HOST_GROUP_BY: Array<GroupByExpectation> = [
|
|
|
113
118
|
{ id: "host-high-memory", groupByAttributeKeys: [] },
|
|
114
119
|
{ id: "host-high-load-average", groupByAttributeKeys: [] },
|
|
115
120
|
{ id: "host-high-processes", groupByAttributeKeys: [] },
|
|
116
|
-
|
|
117
|
-
|
|
121
|
+
/*
|
|
122
|
+
* Per-entity within the host: one series (and one incident) per mount.
|
|
123
|
+
* `device` rides along as identity the alert can NAME - it is constant
|
|
124
|
+
* for a mount so it adds no series, and "/var is 95% full on
|
|
125
|
+
* /dev/nvme0n1p2" is a materially different page from "/var is 95%
|
|
126
|
+
* full" when / sits on the same device.
|
|
127
|
+
*/
|
|
128
|
+
{
|
|
129
|
+
id: "host-high-filesystem",
|
|
130
|
+
groupByAttributeKeys: ["mountpoint", "device"],
|
|
131
|
+
},
|
|
118
132
|
];
|
|
119
133
|
|
|
120
134
|
function buildDockerArgs(): DockerAlertTemplateArgs {
|
|
@@ -280,7 +294,7 @@ describe("Alert template group-by keys", () => {
|
|
|
280
294
|
}
|
|
281
295
|
});
|
|
282
296
|
|
|
283
|
-
test("the host filesystem template is grouped per mountpoint", () => {
|
|
297
|
+
test("the host filesystem template is grouped per mountpoint, and names its device", () => {
|
|
284
298
|
const filesystemTemplate: HostAlertTemplate | undefined =
|
|
285
299
|
HOST_TEMPLATES.find((template: HostAlertTemplate) => {
|
|
286
300
|
return template.id === "host-high-filesystem";
|
|
@@ -291,6 +305,20 @@ describe("Alert template group-by keys", () => {
|
|
|
291
305
|
const step: MonitorStep =
|
|
292
306
|
filesystemTemplate!.getMonitorStep(buildHostArgs());
|
|
293
307
|
|
|
294
|
-
|
|
308
|
+
const keys: Array<string> = MonitorStep.getGroupByAttributeKeys(step);
|
|
309
|
+
|
|
310
|
+
/*
|
|
311
|
+
* `mountpoint` is the identity - one incident per mount, which is
|
|
312
|
+
* what stops a second mount filling up from being silenced behind
|
|
313
|
+
* the first one's open incident.
|
|
314
|
+
*
|
|
315
|
+
* `device` is identity the ALERT CAN NAME. The hostmetrics receiver
|
|
316
|
+
* puts it on the same datapoint and it is constant for a given
|
|
317
|
+
* mount, so it costs no extra series, and "/var is 95% full on
|
|
318
|
+
* /dev/nvme0n1p2" is a materially different page from "/var is 95%
|
|
319
|
+
* full" when / sits on the same device. See SeriesLabelDisplay,
|
|
320
|
+
* which renders both onto the alert title and description.
|
|
321
|
+
*/
|
|
322
|
+
expect(keys).toEqual(["mountpoint", "device"]);
|
|
295
323
|
});
|
|
296
324
|
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { FilterType } from "../../../../Types/Monitor/CriteriaFilter";
|
|
2
|
+
import { getRecoveryThreshold } from "../../../../Types/Monitor/Recommendation/RecommendationCriteriaBuilder";
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* The invariant every recommendation template's fire/recover pair must hold.
|
|
6
|
+
*
|
|
7
|
+
* These suites used to assert the OPPOSITE — that the two thresholds were
|
|
8
|
+
* the identical number and exactly partitioned the range ("disjoint
|
|
9
|
+
* complement"). That is a textbook flapping configuration, and it was
|
|
10
|
+
* load-bearing in the tests, so the bug could not be fixed without them
|
|
11
|
+
* failing. A metric parked at the threshold satisfied "> 90" on one
|
|
12
|
+
* evaluation and "<= 90" on the next, forever; one customer cluster
|
|
13
|
+
* produced 39 alert emails from a single monitor in under two hours.
|
|
14
|
+
*
|
|
15
|
+
* The invariant is now a DEAD BAND: the recover comparison is still the
|
|
16
|
+
* complement of the fire comparison, but its threshold sits strictly
|
|
17
|
+
* inside the fire threshold, so a metric has to move a real distance back
|
|
18
|
+
* before the monitor is called healthy.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export interface CriteriaThreshold {
|
|
22
|
+
filterType: FilterType;
|
|
23
|
+
value: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function getComplementFilterType(
|
|
27
|
+
filterType: FilterType,
|
|
28
|
+
): FilterType | null {
|
|
29
|
+
switch (filterType) {
|
|
30
|
+
case FilterType.GreaterThan:
|
|
31
|
+
return FilterType.LessThanOrEqualTo;
|
|
32
|
+
case FilterType.GreaterThanOrEqualTo:
|
|
33
|
+
return FilterType.LessThan;
|
|
34
|
+
case FilterType.LessThan:
|
|
35
|
+
return FilterType.GreaterThanOrEqualTo;
|
|
36
|
+
case FilterType.LessThanOrEqualTo:
|
|
37
|
+
return FilterType.GreaterThan;
|
|
38
|
+
default:
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/*
|
|
44
|
+
* Whether a fire/recover pair leaves a gap the metric must cross.
|
|
45
|
+
*
|
|
46
|
+
* A threshold of exactly 0 gets no dead band — 10% of 0 is 0, and a
|
|
47
|
+
* count-based criterion ("> 0 failed jobs") recovers correctly at exactly
|
|
48
|
+
* 0 — so an equal-valued pair is accepted there and only there. The same
|
|
49
|
+
* applies to the `> 0` / `= 0` pair Ceph uses for health-check series.
|
|
50
|
+
*/
|
|
51
|
+
export function hasRecoveryDeadBand(
|
|
52
|
+
fire: CriteriaThreshold,
|
|
53
|
+
recover: CriteriaThreshold,
|
|
54
|
+
): boolean {
|
|
55
|
+
const expectedComplement: FilterType | null = getComplementFilterType(
|
|
56
|
+
fire.filterType,
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const isComplement: boolean =
|
|
60
|
+
recover.filterType === expectedComplement ||
|
|
61
|
+
// Ceph health-check series: fire when the count is > 0, recover at = 0.
|
|
62
|
+
(fire.value === 0 &&
|
|
63
|
+
fire.filterType === FilterType.GreaterThan &&
|
|
64
|
+
recover.filterType === FilterType.EqualTo) ||
|
|
65
|
+
// Docker Swarm task-down: fire when uptime == 0, recover when uptime > 0.
|
|
66
|
+
(fire.value === 0 &&
|
|
67
|
+
fire.filterType === FilterType.EqualTo &&
|
|
68
|
+
recover.filterType === FilterType.GreaterThan);
|
|
69
|
+
|
|
70
|
+
if (!isComplement) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const expectedRecoveryValue: number | undefined = getRecoveryThreshold({
|
|
75
|
+
filterType: fire.filterType,
|
|
76
|
+
value: fire.value,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
if (expectedRecoveryValue === undefined) {
|
|
80
|
+
// No meaningful dead band exists; the thresholds must match exactly.
|
|
81
|
+
return recover.value === fire.value;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (recover.value !== expectedRecoveryValue) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/*
|
|
89
|
+
* And the band must point the right way: a ceiling recovers BELOW its
|
|
90
|
+
* firing threshold, a floor recovers ABOVE it. Checked independently of
|
|
91
|
+
* getRecoveryThreshold so a sign error in that function cannot make this
|
|
92
|
+
* assertion vacuously true.
|
|
93
|
+
*/
|
|
94
|
+
if (
|
|
95
|
+
fire.filterType === FilterType.GreaterThan ||
|
|
96
|
+
fire.filterType === FilterType.GreaterThanOrEqualTo
|
|
97
|
+
) {
|
|
98
|
+
return recover.value < fire.value;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return recover.value > fire.value;
|
|
102
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import NotificationSettingEventType from "../../../Types/NotificationSetting/NotificationSettingEventType";
|
|
2
|
+
import { ROUTINE_EMAIL_EVENT_TYPES } from "../../../Types/NotificationSetting/RoutineEmailEvents";
|
|
3
|
+
|
|
4
|
+
describe("routine email preset allowlist", () => {
|
|
5
|
+
test("contains only known, unique event types and cannot be mutated", () => {
|
|
6
|
+
expect(ROUTINE_EMAIL_EVENT_TYPES).toHaveLength(21);
|
|
7
|
+
expect(new Set(ROUTINE_EMAIL_EVENT_TYPES).size).toBe(21);
|
|
8
|
+
expect(Object.isFrozen(ROUTINE_EMAIL_EVENT_TYPES)).toBe(true);
|
|
9
|
+
for (const eventType of ROUTINE_EMAIL_EVENT_TYPES) {
|
|
10
|
+
expect(Object.values(NotificationSettingEventType)).toContain(eventType);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test.each([
|
|
15
|
+
NotificationSettingEventType.SEND_INCIDENT_CREATED_OWNER_NOTIFICATION,
|
|
16
|
+
NotificationSettingEventType.SEND_INCIDENT_STATE_CHANGED_OWNER_NOTIFICATION,
|
|
17
|
+
NotificationSettingEventType.SEND_INCIDENT_REMINDER_OWNER_NOTIFICATION,
|
|
18
|
+
NotificationSettingEventType.SEND_INCIDENT_MEMBER_ADDED_NOTIFICATION,
|
|
19
|
+
NotificationSettingEventType.SEND_ALERT_CREATED_OWNER_NOTIFICATION,
|
|
20
|
+
NotificationSettingEventType.SEND_ALERT_STATE_CHANGED_OWNER_NOTIFICATION,
|
|
21
|
+
NotificationSettingEventType.SEND_ALERT_REMINDER_OWNER_NOTIFICATION,
|
|
22
|
+
NotificationSettingEventType.SEND_INCIDENT_EPISODE_CREATED_OWNER_NOTIFICATION,
|
|
23
|
+
NotificationSettingEventType.SEND_INCIDENT_EPISODE_STATE_CHANGED_OWNER_NOTIFICATION,
|
|
24
|
+
NotificationSettingEventType.SEND_ALERT_EPISODE_CREATED_OWNER_NOTIFICATION,
|
|
25
|
+
NotificationSettingEventType.SEND_ALERT_EPISODE_STATE_CHANGED_OWNER_NOTIFICATION,
|
|
26
|
+
NotificationSettingEventType.SEND_MONITOR_STATUS_CHANGED_OWNER_NOTIFICATION,
|
|
27
|
+
NotificationSettingEventType.SEND_MONITOR_NOTIFICATION_WHEN_PORBE_STATUS_CHANGES,
|
|
28
|
+
NotificationSettingEventType.SEND_MONITOR_NOTIFICATION_WHEN_NO_PROBES_ARE_MONITORING_THE_MONITOR,
|
|
29
|
+
NotificationSettingEventType.SEND_PROBE_STATUS_CHANGED_OWNER_NOTIFICATION,
|
|
30
|
+
NotificationSettingEventType.SEND_AI_AGENT_STATUS_CHANGED_OWNER_NOTIFICATION,
|
|
31
|
+
NotificationSettingEventType.SEND_SLO_OWNER_STATUS_CHANGE_NOTIFICATION,
|
|
32
|
+
NotificationSettingEventType.SEND_SCHEDULED_MAINTENANCE_CREATED_OWNER_NOTIFICATION,
|
|
33
|
+
NotificationSettingEventType.SEND_SCHEDULED_MAINTENANCE_STATE_CHANGED_OWNER_NOTIFICATION,
|
|
34
|
+
NotificationSettingEventType.SEND_SCHEDULED_MAINTENANCE_REMINDER_OWNER_NOTIFICATION,
|
|
35
|
+
NotificationSettingEventType.SEND_WHEN_USER_IS_ON_CALL_ROSTER,
|
|
36
|
+
NotificationSettingEventType.SEND_WHEN_USER_IS_NEXT_ON_CALL_ROSTER,
|
|
37
|
+
NotificationSettingEventType.SEND_WHEN_USER_IS_NO_LONGER_ACTIVE_ON_ON_CALL_ROSTER,
|
|
38
|
+
NotificationSettingEventType.SEND_BEFORE_USER_ON_CALL_SHIFT_STARTS,
|
|
39
|
+
NotificationSettingEventType.SEND_WHEN_USER_ON_CALL_SHIFT_IS_REASSIGNED,
|
|
40
|
+
NotificationSettingEventType.SEND_STATUS_PAGE_ANNOUNCEMENT_CREATED_OWNER_NOTIFICATION,
|
|
41
|
+
])(
|
|
42
|
+
"preserves email preferences for %s",
|
|
43
|
+
(eventType: NotificationSettingEventType) => {
|
|
44
|
+
expect(ROUTINE_EMAIL_EVENT_TYPES).not.toContain(eventType);
|
|
45
|
+
},
|
|
46
|
+
);
|
|
47
|
+
});
|