@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
|
@@ -9,24 +9,120 @@ import Typeof from "../../../../Types/Typeof";
|
|
|
9
9
|
import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
10
10
|
|
|
11
11
|
export default class CompareCriteria {
|
|
12
|
+
/*
|
|
13
|
+
* Reduce an evaluation window to the value(s) a threshold is actually
|
|
14
|
+
* compared against.
|
|
15
|
+
*
|
|
16
|
+
* Before this existed, every comparator branched on `AnyValue` and let
|
|
17
|
+
* EVERY other evaluation type fall through to `.every()`. That silently
|
|
18
|
+
* turned Average, Sum, Maximum Value and Minimum Value — all four
|
|
19
|
+
* offered in the criteria UI and all four stored on real monitors — into
|
|
20
|
+
* "All Values". A user who asked to be paged on the five-minute AVERAGE
|
|
21
|
+
* was instead paged only when every single sample breached, which is a
|
|
22
|
+
* strictly rarer event and never the one they asked for.
|
|
23
|
+
*
|
|
24
|
+
* Returns a single-element array for the reducing aggregations so the
|
|
25
|
+
* caller compares against the aggregate, and the untouched window for
|
|
26
|
+
* the two set-quantifier types.
|
|
27
|
+
*/
|
|
28
|
+
public static reduceWindow(data: {
|
|
29
|
+
values: Array<number>;
|
|
30
|
+
evaluationType?: EvaluateOverTimeType | undefined;
|
|
31
|
+
}): Array<number> {
|
|
32
|
+
const values: Array<number> = data.values;
|
|
33
|
+
|
|
34
|
+
if (values.length === 0) {
|
|
35
|
+
return values;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
switch (data.evaluationType) {
|
|
39
|
+
case EvaluateOverTimeType.Average: {
|
|
40
|
+
const sum: number = values.reduce((a: number, b: number) => {
|
|
41
|
+
return a + b;
|
|
42
|
+
}, 0);
|
|
43
|
+
return [sum / values.length];
|
|
44
|
+
}
|
|
45
|
+
case EvaluateOverTimeType.Sum:
|
|
46
|
+
return [
|
|
47
|
+
values.reduce((a: number, b: number) => {
|
|
48
|
+
return a + b;
|
|
49
|
+
}, 0),
|
|
50
|
+
];
|
|
51
|
+
case EvaluateOverTimeType.MaximumValue:
|
|
52
|
+
return [Math.max(...values)];
|
|
53
|
+
case EvaluateOverTimeType.MunimumValue:
|
|
54
|
+
return [Math.min(...values)];
|
|
55
|
+
default:
|
|
56
|
+
// AnyValue / AllValues quantify over the window itself.
|
|
57
|
+
return values;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/*
|
|
62
|
+
* The one place a numeric criteria filter decides whether it is met.
|
|
63
|
+
*
|
|
64
|
+
* `AnyValue` is an existential quantifier, everything else is universal
|
|
65
|
+
* once `reduceWindow` has collapsed the reducing aggregations to a
|
|
66
|
+
* single sample — so "Average > 90" is `[avg].every(v => v > 90)`, which
|
|
67
|
+
* is just `avg > 90`.
|
|
68
|
+
*/
|
|
69
|
+
private static evaluateWindow(data: {
|
|
70
|
+
value: number | Array<number>;
|
|
71
|
+
evaluationType?: EvaluateOverTimeType | undefined;
|
|
72
|
+
predicate: (value: number) => boolean;
|
|
73
|
+
}): boolean {
|
|
74
|
+
if (!Array.isArray(data.value)) {
|
|
75
|
+
return data.predicate(data.value);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const values: Array<number> = CompareCriteria.reduceWindow({
|
|
79
|
+
values: data.value,
|
|
80
|
+
evaluationType: data.evaluationType,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
if (values.length === 0) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (data.evaluationType === EvaluateOverTimeType.AnyValue) {
|
|
88
|
+
return values.some(data.predicate);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return values.every(data.predicate);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/*
|
|
95
|
+
* The samples that actually satisfied the filter.
|
|
96
|
+
*
|
|
97
|
+
* Only used to render the root cause. `getCompareMessage` used to print
|
|
98
|
+
* the WHOLE window and then assert every printed number breached the
|
|
99
|
+
* threshold, so a real alert read "is 72.35, 81.54, 79.95, 91.53, 87.73 %
|
|
100
|
+
* which is greater than 90 %" — four of those five are below 90.
|
|
101
|
+
*/
|
|
102
|
+
public static getBreachingValues(data: {
|
|
103
|
+
values: Array<number>;
|
|
104
|
+
evaluationType?: EvaluateOverTimeType | undefined;
|
|
105
|
+
predicate: (value: number) => boolean;
|
|
106
|
+
}): Array<number> {
|
|
107
|
+
return CompareCriteria.reduceWindow({
|
|
108
|
+
values: data.values,
|
|
109
|
+
evaluationType: data.evaluationType,
|
|
110
|
+
}).filter(data.predicate);
|
|
111
|
+
}
|
|
112
|
+
|
|
12
113
|
@CaptureSpan()
|
|
13
114
|
public static greaterThan(data: {
|
|
14
115
|
value: number | Array<number>;
|
|
15
116
|
evaluationType?: EvaluateOverTimeType | undefined;
|
|
16
117
|
threshold: number;
|
|
17
118
|
}): boolean {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
return data.value.every((value: number) => {
|
|
119
|
+
return CompareCriteria.evaluateWindow({
|
|
120
|
+
value: data.value,
|
|
121
|
+
evaluationType: data.evaluationType,
|
|
122
|
+
predicate: (value: number) => {
|
|
25
123
|
return value > data.threshold;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return data.value > data.threshold;
|
|
124
|
+
},
|
|
125
|
+
});
|
|
30
126
|
}
|
|
31
127
|
|
|
32
128
|
@CaptureSpan()
|
|
@@ -77,18 +173,13 @@ export default class CompareCriteria {
|
|
|
77
173
|
evaluationType?: EvaluateOverTimeType | undefined;
|
|
78
174
|
threshold: number;
|
|
79
175
|
}): boolean {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
return data.value.every((value: number) => {
|
|
176
|
+
return CompareCriteria.evaluateWindow({
|
|
177
|
+
value: data.value,
|
|
178
|
+
evaluationType: data.evaluationType,
|
|
179
|
+
predicate: (value: number) => {
|
|
87
180
|
return value < data.threshold;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return data.value < data.threshold;
|
|
181
|
+
},
|
|
182
|
+
});
|
|
92
183
|
}
|
|
93
184
|
|
|
94
185
|
@CaptureSpan()
|
|
@@ -97,18 +188,13 @@ export default class CompareCriteria {
|
|
|
97
188
|
evaluationType?: EvaluateOverTimeType | undefined;
|
|
98
189
|
threshold: number;
|
|
99
190
|
}): boolean {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
return data.value.every((value: number) => {
|
|
191
|
+
return CompareCriteria.evaluateWindow({
|
|
192
|
+
value: data.value,
|
|
193
|
+
evaluationType: data.evaluationType,
|
|
194
|
+
predicate: (value: number) => {
|
|
107
195
|
return value >= data.threshold;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return data.value >= data.threshold;
|
|
196
|
+
},
|
|
197
|
+
});
|
|
112
198
|
}
|
|
113
199
|
|
|
114
200
|
@CaptureSpan()
|
|
@@ -117,18 +203,13 @@ export default class CompareCriteria {
|
|
|
117
203
|
evaluationType?: EvaluateOverTimeType | undefined;
|
|
118
204
|
threshold: number;
|
|
119
205
|
}): boolean {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
return data.value.every((value: number) => {
|
|
206
|
+
return CompareCriteria.evaluateWindow({
|
|
207
|
+
value: data.value,
|
|
208
|
+
evaluationType: data.evaluationType,
|
|
209
|
+
predicate: (value: number) => {
|
|
127
210
|
return value <= data.threshold;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return data.value <= data.threshold;
|
|
211
|
+
},
|
|
212
|
+
});
|
|
132
213
|
}
|
|
133
214
|
|
|
134
215
|
@CaptureSpan()
|
|
@@ -137,18 +218,13 @@ export default class CompareCriteria {
|
|
|
137
218
|
evaluationType?: EvaluateOverTimeType | undefined;
|
|
138
219
|
threshold: number;
|
|
139
220
|
}): boolean {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
return data.value.every((value: number) => {
|
|
221
|
+
return CompareCriteria.evaluateWindow({
|
|
222
|
+
value: data.value,
|
|
223
|
+
evaluationType: data.evaluationType,
|
|
224
|
+
predicate: (value: number) => {
|
|
147
225
|
return value === data.threshold;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return data.value === data.threshold;
|
|
226
|
+
},
|
|
227
|
+
});
|
|
152
228
|
}
|
|
153
229
|
|
|
154
230
|
@CaptureSpan()
|
|
@@ -157,18 +233,13 @@ export default class CompareCriteria {
|
|
|
157
233
|
evaluationType?: EvaluateOverTimeType | undefined;
|
|
158
234
|
threshold: number;
|
|
159
235
|
}): boolean {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
return data.value.every((value: number) => {
|
|
236
|
+
return CompareCriteria.evaluateWindow({
|
|
237
|
+
value: data.value,
|
|
238
|
+
evaluationType: data.evaluationType,
|
|
239
|
+
predicate: (value: number) => {
|
|
167
240
|
return value !== data.threshold;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
return data.value !== data.threshold;
|
|
241
|
+
},
|
|
242
|
+
});
|
|
172
243
|
}
|
|
173
244
|
|
|
174
245
|
@CaptureSpan()
|
|
@@ -557,6 +628,7 @@ export default class CompareCriteria {
|
|
|
557
628
|
}): string {
|
|
558
629
|
// CPU Percent over the last 5 minutes is 10 which is less than the threshold of 20
|
|
559
630
|
let message: string = "";
|
|
631
|
+
let breachSummary: string = "";
|
|
560
632
|
|
|
561
633
|
let evaluationType: EvaluateOverTimeType | undefined =
|
|
562
634
|
data.criteriaFilter.evaluateOverTimeOptions?.evaluateOverTimeType;
|
|
@@ -566,12 +638,34 @@ export default class CompareCriteria {
|
|
|
566
638
|
data.criteriaFilter.metricMonitorOptions.metricAggregationType;
|
|
567
639
|
}
|
|
568
640
|
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
641
|
+
/*
|
|
642
|
+
* Name the quantifier or the aggregation. Before this, only the two
|
|
643
|
+
* set quantifiers were named and the four reducing aggregations
|
|
644
|
+
* produced a bare "Metric Value is 82.62 which is greater than 90",
|
|
645
|
+
* which reads as a contradiction unless you already know the number
|
|
646
|
+
* shown is a five-minute average.
|
|
647
|
+
*/
|
|
648
|
+
switch (evaluationType) {
|
|
649
|
+
case EvaluateOverTimeType.AnyValue:
|
|
650
|
+
message += "Any value of";
|
|
651
|
+
break;
|
|
652
|
+
case EvaluateOverTimeType.AllValues:
|
|
653
|
+
message += "All values of";
|
|
654
|
+
break;
|
|
655
|
+
case EvaluateOverTimeType.Average:
|
|
656
|
+
message += "The average of";
|
|
657
|
+
break;
|
|
658
|
+
case EvaluateOverTimeType.Sum:
|
|
659
|
+
message += "The sum of";
|
|
660
|
+
break;
|
|
661
|
+
case EvaluateOverTimeType.MaximumValue:
|
|
662
|
+
message += "The maximum of";
|
|
663
|
+
break;
|
|
664
|
+
case EvaluateOverTimeType.MunimumValue:
|
|
665
|
+
message += "The minimum of";
|
|
666
|
+
break;
|
|
667
|
+
default:
|
|
668
|
+
break;
|
|
575
669
|
}
|
|
576
670
|
|
|
577
671
|
/*
|
|
@@ -600,19 +694,86 @@ export default class CompareCriteria {
|
|
|
600
694
|
message += ` over the last ${data.criteriaFilter.evaluateOverTimeOptions.timeValueInMinutes} minutes`;
|
|
601
695
|
}
|
|
602
696
|
|
|
603
|
-
|
|
697
|
+
/*
|
|
698
|
+
* Suppress the units that read as noise — or as a wrong number —
|
|
699
|
+
* next to a value. OTel's dimensionless "1" marks ratio metrics
|
|
700
|
+
* whose samples are fractions in [0, 1]; rendering "0.06 1" is both
|
|
701
|
+
* ugly and misleading (it is not 1% — it is 6%), and a CLS breach
|
|
702
|
+
* read "is 0.31 1 which is greater than or equal to 0.25 1". UCUM
|
|
703
|
+
* annotation-only units ("{cpu}", "{packets}", "{errors}") are
|
|
704
|
+
* descriptive braces, not a unit a reader should be shown. Every
|
|
705
|
+
* real unit passes through unchanged, so "%" stays "%" and "ms"
|
|
706
|
+
* stays "ms".
|
|
707
|
+
*
|
|
708
|
+
* The dashboard side already applies the "1" half of this rule in
|
|
709
|
+
* MonitorCriteriaObservationBuilder.normalizeDisplayUnit, and
|
|
710
|
+
* ValueFormatter applies both halves when it formats a value. The
|
|
711
|
+
* email path never picked either up, so the same evaluation rendered
|
|
712
|
+
* worse in the alert than on the dashboard.
|
|
713
|
+
*/
|
|
714
|
+
const trimmedUnit: string = (data.unit || "").trim();
|
|
715
|
+
const annotationOnlyUnitPattern: RegExp = /^\{[^{}]*\}$/;
|
|
716
|
+
const unitSuffix: string =
|
|
717
|
+
trimmedUnit &&
|
|
718
|
+
trimmedUnit !== "1" &&
|
|
719
|
+
!annotationOnlyUnitPattern.test(trimmedUnit)
|
|
720
|
+
? ` ${trimmedUnit}`
|
|
721
|
+
: "";
|
|
604
722
|
|
|
605
723
|
if (
|
|
606
724
|
data.criteriaFilter.filterType !== FilterType.True &&
|
|
607
725
|
data.criteriaFilter.filterType !== FilterType.False
|
|
608
726
|
) {
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
727
|
+
/*
|
|
728
|
+
* Print the samples that actually breached, not the whole window.
|
|
729
|
+
*
|
|
730
|
+
* `AnyValue` is an existential quantifier: it is met when ONE sample
|
|
731
|
+
* crosses the threshold. Printing the entire window and then
|
|
732
|
+
* asserting "which is greater than 90" produced the sentence a real
|
|
733
|
+
* customer received — "is 72.35, 81.54, 79.95, 91.53, 87.73 % which
|
|
734
|
+
* is greater than 90 %" — in which four of the five listed numbers
|
|
735
|
+
* are below the threshold the sentence claims they all exceed.
|
|
736
|
+
*
|
|
737
|
+
* For every other evaluation type the reported set and the compared
|
|
738
|
+
* set are the same thing (a reducing aggregation collapses to one
|
|
739
|
+
* value; AllValues requires all of them), so this narrowing is a
|
|
740
|
+
* no-op and the existing wording is preserved exactly.
|
|
741
|
+
*/
|
|
742
|
+
const reportedValues:
|
|
743
|
+
| Array<number | boolean>
|
|
744
|
+
| number
|
|
745
|
+
| boolean
|
|
746
|
+
| string = CompareCriteria.getReportedValues({
|
|
747
|
+
values: data.values,
|
|
748
|
+
threshold: data.threshold,
|
|
749
|
+
filterType: data.criteriaFilter.filterType as FilterType,
|
|
750
|
+
evaluationType: evaluationType,
|
|
751
|
+
});
|
|
752
|
+
|
|
753
|
+
const formattedValues: string =
|
|
754
|
+
CompareCriteria.formatCriteriaValues(reportedValues);
|
|
612
755
|
|
|
613
756
|
message += ` is ${formattedValues}${unitSuffix}`;
|
|
614
757
|
|
|
615
758
|
message += " which is";
|
|
759
|
+
|
|
760
|
+
/*
|
|
761
|
+
* How much of the window actually breached.
|
|
762
|
+
*
|
|
763
|
+
* Without it "Any value ... is 91.53 % which is greater than 90 %"
|
|
764
|
+
* is true but hides the thing the reader needs in order to judge
|
|
765
|
+
* whether to get out of bed: whether that was one transient sample
|
|
766
|
+
* or the whole five minutes. One-in-five is a spike; five-in-five is
|
|
767
|
+
* an outage. Only added when the two counts differ, so a fully
|
|
768
|
+
* breaching window keeps the shorter sentence.
|
|
769
|
+
*/
|
|
770
|
+
if (
|
|
771
|
+
Array.isArray(data.values) &&
|
|
772
|
+
Array.isArray(reportedValues) &&
|
|
773
|
+
reportedValues.length < data.values.length
|
|
774
|
+
) {
|
|
775
|
+
breachSummary = ` ${reportedValues.length} of ${data.values.length} samples in the evaluation window breached this threshold.`;
|
|
776
|
+
}
|
|
616
777
|
}
|
|
617
778
|
|
|
618
779
|
switch (data.criteriaFilter.filterType) {
|
|
@@ -654,7 +815,107 @@ export default class CompareCriteria {
|
|
|
654
815
|
break;
|
|
655
816
|
}
|
|
656
817
|
|
|
657
|
-
return message.trim()
|
|
818
|
+
return `${message.trim()}${breachSummary}`;
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
/*
|
|
822
|
+
* Narrow the window down to what the message should quote.
|
|
823
|
+
*
|
|
824
|
+
* Only `AnyValue` needs narrowing — see the comment at the call site.
|
|
825
|
+
* A reducing aggregation is collapsed to its single aggregate so the
|
|
826
|
+
* sentence quotes the average it actually compared, not the raw samples.
|
|
827
|
+
* If nothing is found to breach (a caller rendering a message for a
|
|
828
|
+
* filter that did not match, or a non-numeric window) the original
|
|
829
|
+
* values are returned unchanged rather than an empty list, so the
|
|
830
|
+
* message degrades to its previous behaviour instead of to "is ".
|
|
831
|
+
*/
|
|
832
|
+
private static getReportedValues(data: {
|
|
833
|
+
values: Array<number | boolean> | number | boolean | string;
|
|
834
|
+
threshold: number | string | boolean;
|
|
835
|
+
filterType: FilterType;
|
|
836
|
+
evaluationType?: EvaluateOverTimeType | undefined;
|
|
837
|
+
}): Array<number | boolean> | number | boolean | string {
|
|
838
|
+
if (!Array.isArray(data.values)) {
|
|
839
|
+
return data.values;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
if (typeof data.threshold !== Typeof.Number) {
|
|
843
|
+
return data.values;
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
const numericValues: Array<number> = data.values.filter(
|
|
847
|
+
(value: number | boolean): value is number => {
|
|
848
|
+
return typeof value === Typeof.Number && Number.isFinite(value);
|
|
849
|
+
},
|
|
850
|
+
);
|
|
851
|
+
|
|
852
|
+
if (numericValues.length !== data.values.length) {
|
|
853
|
+
return data.values;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
const predicate: ((value: number) => boolean) | null =
|
|
857
|
+
CompareCriteria.getNumericPredicate({
|
|
858
|
+
filterType: data.filterType,
|
|
859
|
+
threshold: data.threshold as number,
|
|
860
|
+
});
|
|
861
|
+
|
|
862
|
+
if (!predicate) {
|
|
863
|
+
return data.values;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
const breaching: Array<number> = CompareCriteria.getBreachingValues({
|
|
867
|
+
values: numericValues,
|
|
868
|
+
evaluationType: data.evaluationType,
|
|
869
|
+
predicate: predicate,
|
|
870
|
+
});
|
|
871
|
+
|
|
872
|
+
if (breaching.length === 0) {
|
|
873
|
+
return data.values;
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
return breaching;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
/*
|
|
880
|
+
* The comparison a numeric filter type performs, as a predicate.
|
|
881
|
+
*
|
|
882
|
+
* Kept next to the comparator methods it mirrors so the two cannot
|
|
883
|
+
* drift: a filter type added to `compareCriteriaNumbers` without a case
|
|
884
|
+
* here falls back to quoting the whole window, which is the old
|
|
885
|
+
* behaviour rather than a wrong one.
|
|
886
|
+
*/
|
|
887
|
+
private static getNumericPredicate(data: {
|
|
888
|
+
filterType: FilterType;
|
|
889
|
+
threshold: number;
|
|
890
|
+
}): ((value: number) => boolean) | null {
|
|
891
|
+
switch (data.filterType) {
|
|
892
|
+
case FilterType.GreaterThan:
|
|
893
|
+
return (value: number) => {
|
|
894
|
+
return value > data.threshold;
|
|
895
|
+
};
|
|
896
|
+
case FilterType.GreaterThanOrEqualTo:
|
|
897
|
+
return (value: number) => {
|
|
898
|
+
return value >= data.threshold;
|
|
899
|
+
};
|
|
900
|
+
case FilterType.LessThan:
|
|
901
|
+
return (value: number) => {
|
|
902
|
+
return value < data.threshold;
|
|
903
|
+
};
|
|
904
|
+
case FilterType.LessThanOrEqualTo:
|
|
905
|
+
return (value: number) => {
|
|
906
|
+
return value <= data.threshold;
|
|
907
|
+
};
|
|
908
|
+
case FilterType.EqualTo:
|
|
909
|
+
return (value: number) => {
|
|
910
|
+
return value === data.threshold;
|
|
911
|
+
};
|
|
912
|
+
case FilterType.NotEqualTo:
|
|
913
|
+
return (value: number) => {
|
|
914
|
+
return value !== data.threshold;
|
|
915
|
+
};
|
|
916
|
+
default:
|
|
917
|
+
return null;
|
|
918
|
+
}
|
|
658
919
|
}
|
|
659
920
|
|
|
660
921
|
private static formatCriteriaValues(
|
|
@@ -199,6 +199,20 @@ export default class IncomingRequestCriteria {
|
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
+
/*
|
|
203
|
+
* Header names and values are compared case-insensitively, and BOTH
|
|
204
|
+
* sides are lower-cased for it.
|
|
205
|
+
*
|
|
206
|
+
* Only the observed side used to be: a filter typed as "X-Api-Key" (the
|
|
207
|
+
* spelling every HTTP client and every piece of documentation uses) was
|
|
208
|
+
* matched against a list that had already been lower-cased, so Contains
|
|
209
|
+
* could never fire and NotContains fired on every single request. The
|
|
210
|
+
* lower-casing of the observed side is what says the intent was
|
|
211
|
+
* case-insensitive; this is the other half of it.
|
|
212
|
+
*/
|
|
213
|
+
const criteriaValueLowerCase: string | null =
|
|
214
|
+
typeof value === Typeof.String ? (value as string).toLowerCase() : null;
|
|
215
|
+
|
|
202
216
|
if (input.criteriaFilter.checkOn === CheckOn.RequestHeader) {
|
|
203
217
|
const headerKeys: Array<string> = Object.keys(
|
|
204
218
|
(input.dataToProcess as IncomingMonitorRequest).requestHeaders || {},
|
|
@@ -208,14 +222,20 @@ export default class IncomingRequestCriteria {
|
|
|
208
222
|
|
|
209
223
|
// contains
|
|
210
224
|
if (input.criteriaFilter.filterType === FilterType.Contains) {
|
|
211
|
-
if (
|
|
225
|
+
if (
|
|
226
|
+
criteriaValueLowerCase &&
|
|
227
|
+
headerKeys.includes(criteriaValueLowerCase)
|
|
228
|
+
) {
|
|
212
229
|
return `Request header contains ${value}.`;
|
|
213
230
|
}
|
|
214
231
|
return null;
|
|
215
232
|
}
|
|
216
233
|
|
|
217
234
|
if (input.criteriaFilter.filterType === FilterType.NotContains) {
|
|
218
|
-
if (
|
|
235
|
+
if (
|
|
236
|
+
criteriaValueLowerCase &&
|
|
237
|
+
!headerKeys.includes(criteriaValueLowerCase)
|
|
238
|
+
) {
|
|
219
239
|
return `Request header does not contain ${value}.`;
|
|
220
240
|
}
|
|
221
241
|
return null;
|
|
@@ -231,14 +251,20 @@ export default class IncomingRequestCriteria {
|
|
|
231
251
|
|
|
232
252
|
// contains
|
|
233
253
|
if (input.criteriaFilter.filterType === FilterType.Contains) {
|
|
234
|
-
if (
|
|
254
|
+
if (
|
|
255
|
+
criteriaValueLowerCase &&
|
|
256
|
+
headerValues.includes(criteriaValueLowerCase)
|
|
257
|
+
) {
|
|
235
258
|
return `Request header value contains ${value}.`;
|
|
236
259
|
}
|
|
237
260
|
return null;
|
|
238
261
|
}
|
|
239
262
|
|
|
240
263
|
if (input.criteriaFilter.filterType === FilterType.NotContains) {
|
|
241
|
-
if (
|
|
264
|
+
if (
|
|
265
|
+
criteriaValueLowerCase &&
|
|
266
|
+
!headerValues.includes(criteriaValueLowerCase)
|
|
267
|
+
) {
|
|
242
268
|
return `Request header value does not contain ${value}.`;
|
|
243
269
|
}
|
|
244
270
|
return null;
|
|
@@ -26,6 +26,7 @@ import CaptureSpan from "../Telemetry/CaptureSpan";
|
|
|
26
26
|
import DataToProcess from "./DataToProcess";
|
|
27
27
|
import MonitorResourceContextUtil from "./MonitorResourceContext";
|
|
28
28
|
import MonitorTemplateUtil from "./MonitorTemplateUtil";
|
|
29
|
+
import SeriesContextEnricher from "./SeriesContextEnricher";
|
|
29
30
|
import SeriesResourceLinker, {
|
|
30
31
|
SeriesResolvedResourceIds,
|
|
31
32
|
} from "./SeriesResourceLinker";
|
|
@@ -534,13 +535,35 @@ export default class MonitorAlert {
|
|
|
534
535
|
seriesLabels,
|
|
535
536
|
});
|
|
536
537
|
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
538
|
+
/*
|
|
539
|
+
* Render the criteria's template, then make it say WHICH
|
|
540
|
+
* series it is about.
|
|
541
|
+
*
|
|
542
|
+
* The criteria title is one fixed string shared by every
|
|
543
|
+
* series on the monitor, so without the enricher a cluster
|
|
544
|
+
* with fifty saturated pods produced fifty alerts whose
|
|
545
|
+
* titles were character-for-character identical - and the
|
|
546
|
+
* alert list, the Slack message and the phone notification
|
|
547
|
+
* all showed the same undifferentiated line. The enricher is
|
|
548
|
+
* a no-op when the monitor is not grouped, and when the
|
|
549
|
+
* rendered text already names the series (because the user
|
|
550
|
+
* put `{{seriesResourceSuffix}}` or the raw label variables
|
|
551
|
+
* in their own template).
|
|
552
|
+
*/
|
|
553
|
+
alert.title = SeriesContextEnricher.enrichTitle({
|
|
554
|
+
title: MonitorTemplateUtil.processTemplateString({
|
|
555
|
+
value: criteriaAlert.title,
|
|
556
|
+
storageMap,
|
|
557
|
+
}),
|
|
558
|
+
seriesLabels,
|
|
540
559
|
});
|
|
541
|
-
alert.description =
|
|
542
|
-
|
|
543
|
-
|
|
560
|
+
alert.description = SeriesContextEnricher.enrichDescription({
|
|
561
|
+
description: MonitorTemplateUtil.processTemplateString({
|
|
562
|
+
value: criteriaAlert.description,
|
|
563
|
+
storageMap,
|
|
564
|
+
}),
|
|
565
|
+
seriesLabels,
|
|
566
|
+
monitorType: input.monitor.monitorType,
|
|
544
567
|
});
|
|
545
568
|
|
|
546
569
|
/*
|