@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
|
@@ -2,22 +2,27 @@ import {
|
|
|
2
2
|
IoTAlertTemplate,
|
|
3
3
|
IoTAlertTemplateArgs,
|
|
4
4
|
IoTAlertTemplateCategory,
|
|
5
|
+
buildIoTMonitorConfig,
|
|
5
6
|
getAllIoTAlertTemplates,
|
|
6
7
|
getIoTAlertTemplateById,
|
|
7
8
|
getIoTAlertTemplatesByCategory,
|
|
8
9
|
} from "../../../Types/Monitor/IotAlertTemplates";
|
|
9
10
|
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
11
|
+
import { hasRecoveryDeadBand } from "./Utils/RecommendationCriteriaAssertions";
|
|
10
12
|
import MonitorStepIoTMonitor from "../../../Types/Monitor/MonitorStepIoTMonitor";
|
|
11
13
|
import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
|
|
12
14
|
import {
|
|
15
|
+
EvaluateOverTimeType,
|
|
13
16
|
FilterType,
|
|
14
17
|
NoDataPolicy,
|
|
15
18
|
} from "../../../Types/Monitor/CriteriaFilter";
|
|
19
|
+
import { getIoTMetricByMetricName } from "../../../Types/Monitor/IotMetricCatalog";
|
|
20
|
+
import RollingTime from "../../../Types/RollingTime/RollingTime";
|
|
16
21
|
import ObjectID from "../../../Types/ObjectID";
|
|
17
22
|
|
|
18
23
|
/*
|
|
19
|
-
* The IoT templates carry
|
|
20
|
-
*
|
|
24
|
+
* The IoT templates carry decisions the container templates don't, and each
|
|
25
|
+
* one is the point of this suite:
|
|
21
26
|
*
|
|
22
27
|
* 1. INVERTED thresholds. "Bad" for a device is a value that is too LOW —
|
|
23
28
|
* no heartbeat (iot_device_up < 1), a draining battery (< 20%), a fading
|
|
@@ -38,6 +43,16 @@ import ObjectID from "../../../Types/ObjectID";
|
|
|
38
43
|
* to 0 and trips `Min(iot_device_up) < 1`. Enabling that on a battery or
|
|
39
44
|
* temperature threshold would false-alarm for any silent device, so the
|
|
40
45
|
* other templates must NOT carry it.
|
|
46
|
+
*
|
|
47
|
+
* 4. Device Offline is also the only template that is BINARY, the only one
|
|
48
|
+
* with a window wider than five minutes, and the only one that fires on
|
|
49
|
+
* AnyValue. Those three are one decision seen from three sides, and each
|
|
50
|
+
* of them is a bug the moment it appears on a second template — so every
|
|
51
|
+
* one is pinned per template AND counted at the catalog level below.
|
|
52
|
+
*
|
|
53
|
+
* 5. Every template labels its series with the unit IotMetricCatalog already
|
|
54
|
+
* declares, because the criteria root cause prints that unit next to both
|
|
55
|
+
* the sample and the threshold.
|
|
41
56
|
*/
|
|
42
57
|
|
|
43
58
|
interface IoTTemplateCase {
|
|
@@ -51,6 +66,34 @@ interface IoTTemplateCase {
|
|
|
51
66
|
onlineFilterType: FilterType;
|
|
52
67
|
threshold: number;
|
|
53
68
|
treatNoDataAsZero: boolean;
|
|
69
|
+
/*
|
|
70
|
+
* The metric only ever takes two values, so the fire/recover pair has no
|
|
71
|
+
* "slightly better" state to sit in and must partition the range exactly.
|
|
72
|
+
* A dead band here would be UNREACHABLE — `iot_device_up >= 1.1` can never
|
|
73
|
+
* match — which is the regression this flag pins.
|
|
74
|
+
*/
|
|
75
|
+
isBinaryMetric: boolean;
|
|
76
|
+
/*
|
|
77
|
+
* The rolling window. For Device Offline this is the silence grace period a
|
|
78
|
+
* duty-cycled device is allowed, not a detection latency — see the sweep
|
|
79
|
+
* below.
|
|
80
|
+
*/
|
|
81
|
+
rollingTime: RollingTime;
|
|
82
|
+
/*
|
|
83
|
+
* The quantifier on the FIRING side. AllValues (sustained) everywhere except
|
|
84
|
+
* Device Offline, whose signal is an explicit event rather than a level.
|
|
85
|
+
*/
|
|
86
|
+
fireAggregation: EvaluateOverTimeType;
|
|
87
|
+
// The unit IotMetricCatalog declares for `metricName`, if any.
|
|
88
|
+
legendUnit: string | undefined;
|
|
89
|
+
// The threshold as the incident title states it, in the unit it compares.
|
|
90
|
+
incidentTitleFragment: string;
|
|
91
|
+
/*
|
|
92
|
+
* The complete set of values the metric can take, for the templates whose
|
|
93
|
+
* metric has a finite domain. Set only for Device Offline today; a future
|
|
94
|
+
* binary template must set it too, so the reachability sweep covers it.
|
|
95
|
+
*/
|
|
96
|
+
metricValueDomain?: Array<number> | undefined;
|
|
54
97
|
}
|
|
55
98
|
|
|
56
99
|
const IOT_TEMPLATES: Array<IoTTemplateCase> = [
|
|
@@ -66,6 +109,13 @@ const IOT_TEMPLATES: Array<IoTTemplateCase> = [
|
|
|
66
109
|
onlineFilterType: FilterType.GreaterThanOrEqualTo,
|
|
67
110
|
threshold: 1,
|
|
68
111
|
treatNoDataAsZero: true,
|
|
112
|
+
isBinaryMetric: true,
|
|
113
|
+
rollingTime: RollingTime.Past30Minutes,
|
|
114
|
+
fireAggregation: EvaluateOverTimeType.AnyValue,
|
|
115
|
+
// iot_device_up carries no unit in the catalog — it is a bare 0/1 gauge.
|
|
116
|
+
legendUnit: undefined,
|
|
117
|
+
incidentTitleFragment: "Device Offline",
|
|
118
|
+
metricValueDomain: [0, 1],
|
|
69
119
|
},
|
|
70
120
|
{
|
|
71
121
|
id: "iot-low-battery",
|
|
@@ -78,6 +128,11 @@ const IOT_TEMPLATES: Array<IoTTemplateCase> = [
|
|
|
78
128
|
onlineFilterType: FilterType.GreaterThanOrEqualTo,
|
|
79
129
|
threshold: 20,
|
|
80
130
|
treatNoDataAsZero: false,
|
|
131
|
+
isBinaryMetric: false,
|
|
132
|
+
rollingTime: RollingTime.Past5Minutes,
|
|
133
|
+
fireAggregation: EvaluateOverTimeType.AllValues,
|
|
134
|
+
legendUnit: "%",
|
|
135
|
+
incidentTitleFragment: "Low Battery (<20%)",
|
|
81
136
|
},
|
|
82
137
|
{
|
|
83
138
|
id: "iot-weak-signal",
|
|
@@ -91,6 +146,11 @@ const IOT_TEMPLATES: Array<IoTTemplateCase> = [
|
|
|
91
146
|
// dBm is negative; -100 is a real threshold, not a placeholder.
|
|
92
147
|
threshold: -100,
|
|
93
148
|
treatNoDataAsZero: false,
|
|
149
|
+
isBinaryMetric: false,
|
|
150
|
+
rollingTime: RollingTime.Past5Minutes,
|
|
151
|
+
fireAggregation: EvaluateOverTimeType.AllValues,
|
|
152
|
+
legendUnit: "dBm",
|
|
153
|
+
incidentTitleFragment: "Weak Signal (<-100 dBm)",
|
|
94
154
|
},
|
|
95
155
|
{
|
|
96
156
|
id: "iot-high-temperature",
|
|
@@ -104,6 +164,11 @@ const IOT_TEMPLATES: Array<IoTTemplateCase> = [
|
|
|
104
164
|
onlineFilterType: FilterType.LessThanOrEqualTo,
|
|
105
165
|
threshold: 70,
|
|
106
166
|
treatNoDataAsZero: false,
|
|
167
|
+
isBinaryMetric: false,
|
|
168
|
+
rollingTime: RollingTime.Past5Minutes,
|
|
169
|
+
fireAggregation: EvaluateOverTimeType.AllValues,
|
|
170
|
+
legendUnit: "°C",
|
|
171
|
+
incidentTitleFragment: "High Temperature (>70°C)",
|
|
107
172
|
},
|
|
108
173
|
{
|
|
109
174
|
id: "iot-high-cpu",
|
|
@@ -117,6 +182,15 @@ const IOT_TEMPLATES: Array<IoTTemplateCase> = [
|
|
|
117
182
|
// iot_cpu_usage_ratio is a 0-1 ratio, so 0.9 == 90%.
|
|
118
183
|
threshold: 0.9,
|
|
119
184
|
treatNoDataAsZero: false,
|
|
185
|
+
isBinaryMetric: false,
|
|
186
|
+
rollingTime: RollingTime.Past5Minutes,
|
|
187
|
+
fireAggregation: EvaluateOverTimeType.AllValues,
|
|
188
|
+
legendUnit: "ratio",
|
|
189
|
+
/*
|
|
190
|
+
* The title states the ratio, not the percentage, because the criteria
|
|
191
|
+
* compares 0.9 and the root cause prints "ratio".
|
|
192
|
+
*/
|
|
193
|
+
incidentTitleFragment: "High CPU Usage (ratio >0.9)",
|
|
120
194
|
},
|
|
121
195
|
];
|
|
122
196
|
|
|
@@ -139,6 +213,21 @@ function getIoTMonitor(step: MonitorStep): MonitorStepIoTMonitor {
|
|
|
139
213
|
return iotMonitor;
|
|
140
214
|
}
|
|
141
215
|
|
|
216
|
+
function getCriteriaInstances(id: string): Array<any> {
|
|
217
|
+
const step: MonitorStep =
|
|
218
|
+
getIoTAlertTemplateById(id)!.getMonitorStep(buildArgs());
|
|
219
|
+
return step.data?.monitorCriteria.data
|
|
220
|
+
?.monitorCriteriaInstanceArray as Array<any>;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function getUnhealthyFilter(id: string): any {
|
|
224
|
+
return getCriteriaInstances(id)[0].data.filters[0];
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function getHealthyFilter(id: string): any {
|
|
228
|
+
return getCriteriaInstances(id)[1].data.filters[0];
|
|
229
|
+
}
|
|
230
|
+
|
|
142
231
|
describe("IotAlertTemplates", () => {
|
|
143
232
|
test("every documented template id is registered and the suite is exhaustive", () => {
|
|
144
233
|
const ids: Array<string> = getAllIoTAlertTemplates().map(
|
|
@@ -223,6 +312,13 @@ describe("IotAlertTemplates", () => {
|
|
|
223
312
|
expect(queryData.filterData.metricName).toBe(tc.metricName);
|
|
224
313
|
expect(queryData.filterData.aggegationType).toBe(tc.aggregation);
|
|
225
314
|
|
|
315
|
+
/*
|
|
316
|
+
* The window each template evaluates over. Left unpinned, Device
|
|
317
|
+
* Offline's silence grace period could be narrowed back to five minutes
|
|
318
|
+
* without a single test noticing.
|
|
319
|
+
*/
|
|
320
|
+
expect(monitor.rollingTime).toBe(tc.rollingTime);
|
|
321
|
+
|
|
226
322
|
/*
|
|
227
323
|
* Decision (2): one incident per device — group by the raw datapoint
|
|
228
324
|
* label, which is NOT resource-prefixed.
|
|
@@ -235,13 +331,9 @@ describe("IotAlertTemplates", () => {
|
|
|
235
331
|
);
|
|
236
332
|
|
|
237
333
|
test.each(IOT_TEMPLATES)(
|
|
238
|
-
"$id unhealthy/healthy criteria partition
|
|
334
|
+
"$id unhealthy/healthy criteria partition $threshold, with a dead band wherever one is meaningful",
|
|
239
335
|
(tc: IoTTemplateCase) => {
|
|
240
|
-
const
|
|
241
|
-
const step: MonitorStep = template.getMonitorStep(buildArgs());
|
|
242
|
-
|
|
243
|
-
const instances: Array<any> = step.data?.monitorCriteria.data
|
|
244
|
-
?.monitorCriteriaInstanceArray as Array<any>;
|
|
336
|
+
const instances: Array<any> = getCriteriaInstances(tc.id);
|
|
245
337
|
expect(instances).toHaveLength(2);
|
|
246
338
|
const [offline, online] = instances;
|
|
247
339
|
|
|
@@ -255,7 +347,36 @@ describe("IotAlertTemplates", () => {
|
|
|
255
347
|
tc.metricAlias,
|
|
256
348
|
);
|
|
257
349
|
expect(offlineFilter.value).toBe(tc.threshold);
|
|
258
|
-
|
|
350
|
+
|
|
351
|
+
if (tc.isBinaryMetric) {
|
|
352
|
+
/*
|
|
353
|
+
* iot_device_up is 0 or 1. There is no "slightly better" value to sit
|
|
354
|
+
* in, so the pair partitions the range exactly — and a dead band ABOVE
|
|
355
|
+
* 1 would be unreachable, which is the bug this pins.
|
|
356
|
+
*/
|
|
357
|
+
expect(onlineFilter.value).toBe(tc.threshold);
|
|
358
|
+
} else {
|
|
359
|
+
/*
|
|
360
|
+
* The healthy criteria recovers at a threshold strictly INSIDE the
|
|
361
|
+
* firing one, so a metric hovering at the boundary cannot satisfy
|
|
362
|
+
* both on consecutive evaluations. This assertion used to be
|
|
363
|
+
* `expect(onlineFilter.value).toBe(tc.threshold)` — the two criteria
|
|
364
|
+
* exactly partitioned the range, which is the flapping configuration
|
|
365
|
+
* this suite existed to lock in.
|
|
366
|
+
*/
|
|
367
|
+
expect(
|
|
368
|
+
hasRecoveryDeadBand(
|
|
369
|
+
{
|
|
370
|
+
filterType: offlineFilter.filterType,
|
|
371
|
+
value: offlineFilter.value as number,
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
filterType: onlineFilter.filterType,
|
|
375
|
+
value: onlineFilter.value as number,
|
|
376
|
+
},
|
|
377
|
+
),
|
|
378
|
+
).toBe(true);
|
|
379
|
+
}
|
|
259
380
|
|
|
260
381
|
/*
|
|
261
382
|
* Decision (1): pin the exact comparison direction per template — the
|
|
@@ -271,20 +392,229 @@ describe("IotAlertTemplates", () => {
|
|
|
271
392
|
},
|
|
272
393
|
);
|
|
273
394
|
|
|
395
|
+
test("iot-device-offline's healthy threshold is reachable by a 0/1 metric", () => {
|
|
396
|
+
const filter: any = getHealthyFilter("iot-device-offline");
|
|
397
|
+
|
|
398
|
+
expect(filter.filterType).toBe(FilterType.GreaterThanOrEqualTo);
|
|
399
|
+
/*
|
|
400
|
+
* A 10% dead band would put this at 1.1. iot_device_up only ever takes 0
|
|
401
|
+
* or 1 (MqttTelemetryMapper emits exactly 1/0; IoTSnapshotScan reads it
|
|
402
|
+
* as `isUp = rawValue >= 1`; the per-minute bucket reducer is Min, so it
|
|
403
|
+
* cannot lift a sample above 1 either). Anything above 1 makes the
|
|
404
|
+
* healthy criteria unmatchable: MonitorResource then takes its "no
|
|
405
|
+
* criteria met" branch every evaluation, the configured Online status is
|
|
406
|
+
* dead code, and a device that comes back up never produces an Online
|
|
407
|
+
* transition.
|
|
408
|
+
*/
|
|
409
|
+
expect(filter.value).toBeLessThanOrEqual(1);
|
|
410
|
+
expect(filter.value).toBe(1);
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
test.each(
|
|
414
|
+
IOT_TEMPLATES.filter((tc: IoTTemplateCase) => {
|
|
415
|
+
return Boolean(tc.metricValueDomain);
|
|
416
|
+
}),
|
|
417
|
+
)(
|
|
418
|
+
"$id healthy criteria is satisfiable somewhere in its metric's value domain",
|
|
419
|
+
(tc: IoTTemplateCase) => {
|
|
420
|
+
/*
|
|
421
|
+
* Generalises the guard above so the next template over a finite-domain
|
|
422
|
+
* metric cannot ship the same defect: at least one value the metric can
|
|
423
|
+
* actually emit has to satisfy the recovery comparison.
|
|
424
|
+
*/
|
|
425
|
+
const filter: any = getHealthyFilter(tc.id);
|
|
426
|
+
|
|
427
|
+
const satisfied: Array<number> = tc.metricValueDomain!.filter(
|
|
428
|
+
(v: number) => {
|
|
429
|
+
return filter.filterType === FilterType.GreaterThanOrEqualTo
|
|
430
|
+
? v >= filter.value
|
|
431
|
+
: v <= filter.value;
|
|
432
|
+
},
|
|
433
|
+
);
|
|
434
|
+
|
|
435
|
+
expect(satisfied.length).toBeGreaterThan(0);
|
|
436
|
+
},
|
|
437
|
+
);
|
|
438
|
+
|
|
274
439
|
test.each(IOT_TEMPLATES)(
|
|
275
|
-
"$id
|
|
440
|
+
"$id fires with $fireAggregation and recovers with AllValues",
|
|
276
441
|
(tc: IoTTemplateCase) => {
|
|
277
|
-
|
|
278
|
-
|
|
442
|
+
expect(
|
|
443
|
+
getUnhealthyFilter(tc.id).metricMonitorOptions.metricAggregationType,
|
|
444
|
+
).toBe(tc.fireAggregation);
|
|
445
|
+
|
|
446
|
+
// Recovery is always strictly the stronger quantifier.
|
|
447
|
+
expect(
|
|
448
|
+
getHealthyFilter(tc.id).metricMonitorOptions.metricAggregationType,
|
|
449
|
+
).toBe(EvaluateOverTimeType.AllValues);
|
|
450
|
+
},
|
|
451
|
+
);
|
|
452
|
+
|
|
453
|
+
test("iot-device-offline tolerates a duty cycle longer than five minutes", () => {
|
|
454
|
+
/*
|
|
455
|
+
* A registered device that is silent for the whole window reaches the
|
|
456
|
+
* comparator as the SCALAR 0 (MetricMonitorCriteria's TreatAsZero path
|
|
457
|
+
* passes `0`, not `[0]`), and CompareCriteria short-circuits a scalar
|
|
458
|
+
* before any quantifier runs — so sustained evaluation gives absence no
|
|
459
|
+
* protection at all and the rolling window is the only silence grace
|
|
460
|
+
* period there is. At five minutes every battery-powered device on a
|
|
461
|
+
* 10/15/30-minute push interval was declared Offline in every window it
|
|
462
|
+
* skipped and resolved in the window it pushed: one incident and one
|
|
463
|
+
* alert per window, forever.
|
|
464
|
+
*/
|
|
465
|
+
const step: MonitorStep =
|
|
466
|
+
getIoTAlertTemplateById("iot-device-offline")!.getMonitorStep(
|
|
467
|
+
buildArgs(),
|
|
468
|
+
);
|
|
469
|
+
expect(getIoTMonitor(step).rollingTime).toBe(RollingTime.Past30Minutes);
|
|
470
|
+
|
|
471
|
+
/*
|
|
472
|
+
* ...and the MQTT Last Will path must still page on the next evaluation.
|
|
473
|
+
* Under AllValues an explicit `iot_device_up = 0` could not fire until
|
|
474
|
+
* every healthy bucket had aged out, turning a documented next-scrape
|
|
475
|
+
* detection into a 30-minute one.
|
|
476
|
+
*/
|
|
477
|
+
expect(
|
|
478
|
+
getUnhealthyFilter("iot-device-offline").metricMonitorOptions
|
|
479
|
+
.metricAggregationType,
|
|
480
|
+
).toBe(EvaluateOverTimeType.AnyValue);
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
test("exactly one template departs from sustained evaluation", () => {
|
|
484
|
+
/*
|
|
485
|
+
* AnyValue is the escape hatch RecommendationCriteriaBuilder sanctions
|
|
486
|
+
* only for a signal that genuinely is an event rather than a level. If a
|
|
487
|
+
* second template ever claims it, this fails and forces a review rather
|
|
488
|
+
* than letting the flapping default creep back in.
|
|
489
|
+
*/
|
|
490
|
+
const anyValue: Array<IoTTemplateCase> = IOT_TEMPLATES.filter(
|
|
491
|
+
(tc: IoTTemplateCase) => {
|
|
492
|
+
return tc.fireAggregation === EvaluateOverTimeType.AnyValue;
|
|
493
|
+
},
|
|
494
|
+
);
|
|
495
|
+
expect(anyValue).toHaveLength(1);
|
|
496
|
+
expect(anyValue[0]!.id).toBe("iot-device-offline");
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
test("exactly one template widens its window past five minutes", () => {
|
|
500
|
+
/*
|
|
501
|
+
* The counterpart of the TreatAsZero canary: a wide window is only
|
|
502
|
+
* justified for the template that treats absence as a value. Anything
|
|
503
|
+
* else adopting it would just delay real alerts.
|
|
504
|
+
*/
|
|
505
|
+
const widened: Array<IoTTemplateCase> = IOT_TEMPLATES.filter(
|
|
506
|
+
(tc: IoTTemplateCase) => {
|
|
507
|
+
return tc.rollingTime !== RollingTime.Past5Minutes;
|
|
508
|
+
},
|
|
509
|
+
);
|
|
510
|
+
expect(widened).toHaveLength(1);
|
|
511
|
+
expect(widened[0]!.id).toBe("iot-device-offline");
|
|
512
|
+
expect(widened[0]!.treatNoDataAsZero).toBe(true);
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
test.each(IOT_TEMPLATES)(
|
|
516
|
+
"$id labels its series with the unit the IoT metric catalog declares",
|
|
517
|
+
(tc: IoTTemplateCase) => {
|
|
518
|
+
const monitor: MonitorStepIoTMonitor = getIoTMonitor(
|
|
519
|
+
getIoTAlertTemplateById(tc.id)!.getMonitorStep(buildArgs()),
|
|
520
|
+
);
|
|
521
|
+
const alias: any = (
|
|
522
|
+
monitor.metricViewConfig.queryConfigs as Array<any>
|
|
523
|
+
)[0].metricAliasData;
|
|
524
|
+
|
|
525
|
+
expect(alias.legendUnit).toBe(tc.legendUnit);
|
|
526
|
+
/*
|
|
527
|
+
* Pinned against the catalog too, so the two cannot drift: the criteria
|
|
528
|
+
* root cause prints this unit next to both the sample and the threshold
|
|
529
|
+
* (MetricMonitorCriteria defaults thresholdUnit to it), so dropping it
|
|
530
|
+
* silently produces "is -103.2 which is less than -100".
|
|
531
|
+
*/
|
|
532
|
+
expect(alias.legendUnit).toBe(
|
|
533
|
+
getIoTMetricByMetricName(tc.metricName)?.unit,
|
|
534
|
+
);
|
|
535
|
+
},
|
|
536
|
+
);
|
|
537
|
+
|
|
538
|
+
test("buildIoTMonitorConfig defaults legendUnit from the catalog and lets a caller override it", () => {
|
|
539
|
+
const fromCatalog: MonitorStepIoTMonitor = buildIoTMonitorConfig({
|
|
540
|
+
fleetIdentifier: "f",
|
|
541
|
+
metricName: "iot_temperature_celsius",
|
|
542
|
+
metricAlias: "t",
|
|
543
|
+
rollingTime: RollingTime.Past5Minutes,
|
|
544
|
+
aggregationType: MetricsAggregationType.Max,
|
|
545
|
+
});
|
|
546
|
+
expect(
|
|
547
|
+
(fromCatalog.metricViewConfig.queryConfigs as Array<any>)[0]
|
|
548
|
+
.metricAliasData.legendUnit,
|
|
549
|
+
).toBe("°C");
|
|
550
|
+
|
|
551
|
+
const overridden: MonitorStepIoTMonitor = buildIoTMonitorConfig({
|
|
552
|
+
fleetIdentifier: "f",
|
|
553
|
+
metricName: "iot_temperature_celsius",
|
|
554
|
+
metricAlias: "t",
|
|
555
|
+
rollingTime: RollingTime.Past5Minutes,
|
|
556
|
+
aggregationType: MetricsAggregationType.Max,
|
|
557
|
+
legendUnit: "°F",
|
|
558
|
+
});
|
|
559
|
+
expect(
|
|
560
|
+
(overridden.metricViewConfig.queryConfigs as Array<any>)[0]
|
|
561
|
+
.metricAliasData.legendUnit,
|
|
562
|
+
).toBe("°F");
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
test("a metric the catalog does not know stays unitless", () => {
|
|
566
|
+
/*
|
|
567
|
+
* The custom-metric picker path shares this builder, so an unknown metric
|
|
568
|
+
* name must not invent a unit — a wrong unit would be converted against
|
|
569
|
+
* the native one and change the number the threshold compares.
|
|
570
|
+
*/
|
|
571
|
+
const cfg: MonitorStepIoTMonitor = buildIoTMonitorConfig({
|
|
572
|
+
fleetIdentifier: "f",
|
|
573
|
+
metricName: "custom_thing",
|
|
574
|
+
metricAlias: "c",
|
|
575
|
+
rollingTime: RollingTime.Past5Minutes,
|
|
576
|
+
aggregationType: MetricsAggregationType.Avg,
|
|
577
|
+
});
|
|
578
|
+
expect(
|
|
579
|
+
(cfg.metricViewConfig.queryConfigs as Array<any>)[0].metricAliasData
|
|
580
|
+
.legendUnit,
|
|
581
|
+
).toBeUndefined();
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
test.each(IOT_TEMPLATES)(
|
|
585
|
+
"$id states its own threshold in the incident title, in the unit it actually compares",
|
|
586
|
+
(tc: IoTTemplateCase) => {
|
|
587
|
+
const offline: any = getCriteriaInstances(tc.id)[0];
|
|
588
|
+
|
|
589
|
+
expect(offline.data.incidents[0].title).toContain(
|
|
590
|
+
tc.incidentTitleFragment,
|
|
591
|
+
);
|
|
592
|
+
expect(offline.data.alerts[0].title).toBe(
|
|
593
|
+
offline.data.incidents[0].title,
|
|
594
|
+
);
|
|
595
|
+
},
|
|
596
|
+
);
|
|
279
597
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
598
|
+
test("iot-high-cpu does not promise a percentage it never prints", () => {
|
|
599
|
+
/*
|
|
600
|
+
* iot_cpu_usage_ratio is stored as a raw 0-1 ratio (IoTSnapshotScan scales
|
|
601
|
+
* it to percent only for the device inventory column), so the criteria
|
|
602
|
+
* compares 0.9 and the root cause prints "0.94 ratio". A title that says
|
|
603
|
+
* ">90%" leaves the reader converting in their head — and the threshold
|
|
604
|
+
* itself must stay 0.9, because rewriting it as 90 would break every MQTT
|
|
605
|
+
* device whose samples have no native unit to convert from.
|
|
606
|
+
*/
|
|
607
|
+
const offline: any = getCriteriaInstances("iot-high-cpu")[0];
|
|
608
|
+
|
|
609
|
+
expect(offline.data.filters[0].value).toBe(0.9);
|
|
610
|
+
expect(offline.data.incidents[0].title).not.toContain("90%");
|
|
611
|
+
expect(offline.data.alerts[0].title).not.toContain("90%");
|
|
612
|
+
});
|
|
613
|
+
|
|
614
|
+
test.each(IOT_TEMPLATES)(
|
|
615
|
+
"$id applies TreatAsZero only when it is the Device Offline template",
|
|
616
|
+
(tc: IoTTemplateCase) => {
|
|
617
|
+
const [offline, online]: Array<any> = getCriteriaInstances(tc.id);
|
|
288
618
|
|
|
289
619
|
const offlineNoDataPolicy: NoDataPolicy | undefined =
|
|
290
620
|
offline.data.filters[0].metricMonitorOptions.onNoDataPolicy;
|
|
@@ -317,4 +647,29 @@ describe("IotAlertTemplates", () => {
|
|
|
317
647
|
expect(withTreatAsZero).toHaveLength(1);
|
|
318
648
|
expect(withTreatAsZero[0]!.id).toBe("iot-device-offline");
|
|
319
649
|
});
|
|
650
|
+
|
|
651
|
+
test("exactly one template is a binary metric, and it is the one that opts out of the dead band", () => {
|
|
652
|
+
/*
|
|
653
|
+
* The dead band and the binary carve-out are one decision. If a template
|
|
654
|
+
* is added over another 0/1 gauge and forgets `isBinaryMetric`, its
|
|
655
|
+
* recovery threshold lands at 1.1 and the monitor can never report
|
|
656
|
+
* healthy — the exact regression the flag exists to prevent.
|
|
657
|
+
*/
|
|
658
|
+
const binary: Array<IoTTemplateCase> = IOT_TEMPLATES.filter(
|
|
659
|
+
(tc: IoTTemplateCase) => {
|
|
660
|
+
return tc.isBinaryMetric;
|
|
661
|
+
},
|
|
662
|
+
);
|
|
663
|
+
expect(binary).toHaveLength(1);
|
|
664
|
+
expect(binary[0]!.id).toBe("iot-device-offline");
|
|
665
|
+
|
|
666
|
+
for (const tc of IOT_TEMPLATES) {
|
|
667
|
+
const healthyValue: number = getHealthyFilter(tc.id).value as number;
|
|
668
|
+
if (tc.isBinaryMetric) {
|
|
669
|
+
expect(healthyValue).toBe(tc.threshold);
|
|
670
|
+
} else {
|
|
671
|
+
expect(healthyValue).not.toBe(tc.threshold);
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
});
|
|
320
675
|
});
|