@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
|
@@ -53,7 +53,11 @@ import DatabaseMonitorResponse, {
|
|
|
53
53
|
DatabaseMetricGroupStatus,
|
|
54
54
|
} from "../../../Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse";
|
|
55
55
|
import MonitorType from "../../../Types/Monitor/MonitorType";
|
|
56
|
-
import {
|
|
56
|
+
import {
|
|
57
|
+
CheckOn,
|
|
58
|
+
CriteriaFilter,
|
|
59
|
+
FilterType,
|
|
60
|
+
} from "../../../Types/Monitor/CriteriaFilter";
|
|
57
61
|
import OneUptimeDate from "../../../Types/Date";
|
|
58
62
|
import { JSONObject } from "../../../Types/JSON";
|
|
59
63
|
import Dictionary from "../../../Types/Dictionary";
|
|
@@ -2677,10 +2681,73 @@ ${contextBlock}
|
|
|
2677
2681
|
return sections.length > 0 ? sections.join("\n") : null;
|
|
2678
2682
|
}
|
|
2679
2683
|
|
|
2684
|
+
/*
|
|
2685
|
+
* Which rows of the Ceph affected-resources table actually BREACHED.
|
|
2686
|
+
*
|
|
2687
|
+
* The blanket `metricValue > 0` below is right for every count- or
|
|
2688
|
+
* level-style criteria ("> 0 active health checks", "> 85 % used"), but
|
|
2689
|
+
* it is exactly backwards for the availability signals: the OSD Down /
|
|
2690
|
+
* OSD Out / Quorum Degraded criteria fire on `< 1` over ceph_osd_up /
|
|
2691
|
+
* ceph_osd_in / ceph_mon_quorum_status, so the ZERO rows are the down
|
|
2692
|
+
* daemons. Dropping them rendered a table of the HEALTHY daemons under
|
|
2693
|
+
* an incident that tells the reader to "check the root cause for the
|
|
2694
|
+
* affected ceph_daemon label".
|
|
2695
|
+
*
|
|
2696
|
+
* Invert only for a criteria that fires when the metric FALLS.
|
|
2697
|
+
* Everything else — every `> 0` health check, PG count, latency and
|
|
2698
|
+
* capacity ratio, and every `= 0` recovery criteria — keeps the
|
|
2699
|
+
* existing `> 0`, worst-highest-first table byte for byte.
|
|
2700
|
+
*/
|
|
2701
|
+
private static getCephBreachPredicate(
|
|
2702
|
+
criteriaInstance?: MonitorCriteriaInstance | undefined,
|
|
2703
|
+
): { matches: (value: number) => boolean; worstIsLowest: boolean } {
|
|
2704
|
+
const metricFilters: Array<CriteriaFilter> = (
|
|
2705
|
+
criteriaInstance?.data?.filters || []
|
|
2706
|
+
).filter((f: CriteriaFilter) => {
|
|
2707
|
+
return f.checkOn === CheckOn.MetricValue && typeof f.value === "number";
|
|
2708
|
+
});
|
|
2709
|
+
|
|
2710
|
+
const firesWhenMetricFalls: boolean =
|
|
2711
|
+
metricFilters.length > 0 &&
|
|
2712
|
+
metricFilters.every((f: CriteriaFilter) => {
|
|
2713
|
+
return (
|
|
2714
|
+
f.filterType === FilterType.LessThan ||
|
|
2715
|
+
f.filterType === FilterType.LessThanOrEqualTo
|
|
2716
|
+
);
|
|
2717
|
+
});
|
|
2718
|
+
|
|
2719
|
+
if (!firesWhenMetricFalls) {
|
|
2720
|
+
return {
|
|
2721
|
+
matches: (value: number): boolean => {
|
|
2722
|
+
return value > 0;
|
|
2723
|
+
},
|
|
2724
|
+
worstIsLowest: false,
|
|
2725
|
+
};
|
|
2726
|
+
}
|
|
2727
|
+
|
|
2728
|
+
return {
|
|
2729
|
+
matches: (value: number): boolean => {
|
|
2730
|
+
return metricFilters.some((f: CriteriaFilter) => {
|
|
2731
|
+
const threshold: number = f.value as number;
|
|
2732
|
+
|
|
2733
|
+
return f.filterType === FilterType.LessThan
|
|
2734
|
+
? value < threshold
|
|
2735
|
+
: value <= threshold;
|
|
2736
|
+
});
|
|
2737
|
+
},
|
|
2738
|
+
/*
|
|
2739
|
+
* A criteria that fires when the metric falls ranks the smallest
|
|
2740
|
+
* value worst, so "worst first" is ascending here.
|
|
2741
|
+
*/
|
|
2742
|
+
worstIsLowest: true,
|
|
2743
|
+
};
|
|
2744
|
+
}
|
|
2745
|
+
|
|
2680
2746
|
private static buildCephRootCauseContext(input: {
|
|
2681
2747
|
dataToProcess: DataToProcess;
|
|
2682
2748
|
monitorStep: MonitorStep;
|
|
2683
2749
|
monitor: Monitor;
|
|
2750
|
+
criteriaInstance?: MonitorCriteriaInstance | undefined;
|
|
2684
2751
|
}): string | null {
|
|
2685
2752
|
const metricResponse: MetricMonitorResponse =
|
|
2686
2753
|
input.dataToProcess as MetricMonitorResponse;
|
|
@@ -2736,21 +2803,28 @@ ${contextBlock}
|
|
|
2736
2803
|
|
|
2737
2804
|
if (breakdown && breakdown.affectedResources.length > 0) {
|
|
2738
2805
|
/*
|
|
2739
|
-
*
|
|
2740
|
-
* first, top 10
|
|
2741
|
-
*
|
|
2742
|
-
* zero
|
|
2743
|
-
* alerting through the per-series criteria evaluation; this
|
|
2744
|
-
* table is supplementary context only.
|
|
2806
|
+
* Keep the rows that satisfy the criteria that just matched, worst
|
|
2807
|
+
* first, top 10 — NOT simply the non-zero rows. For ceph_osd_up /
|
|
2808
|
+
* ceph_osd_in / ceph_mon_quorum_status the criteria is `< 1`, so
|
|
2809
|
+
* the zero rows are the whole point of the incident.
|
|
2745
2810
|
*/
|
|
2811
|
+
const breach: {
|
|
2812
|
+
matches: (value: number) => boolean;
|
|
2813
|
+
worstIsLowest: boolean;
|
|
2814
|
+
} = MonitorCriteriaEvaluator.getCephBreachPredicate(
|
|
2815
|
+
input.criteriaInstance,
|
|
2816
|
+
);
|
|
2817
|
+
|
|
2746
2818
|
const sortedResources: Array<CephAffectedResource> = [
|
|
2747
2819
|
...breakdown.affectedResources,
|
|
2748
2820
|
]
|
|
2749
2821
|
.filter((r: CephAffectedResource) => {
|
|
2750
|
-
return r.metricValue
|
|
2822
|
+
return breach.matches(r.metricValue);
|
|
2751
2823
|
})
|
|
2752
2824
|
.sort((a: CephAffectedResource, b: CephAffectedResource) => {
|
|
2753
|
-
return
|
|
2825
|
+
return breach.worstIsLowest
|
|
2826
|
+
? a.metricValue - b.metricValue
|
|
2827
|
+
: b.metricValue - a.metricValue;
|
|
2754
2828
|
});
|
|
2755
2829
|
|
|
2756
2830
|
/*
|
|
@@ -2858,10 +2932,17 @@ ${contextBlock}
|
|
|
2858
2932
|
lines.push(
|
|
2859
2933
|
`Recommended actions: Check container logs with \`kubectl logs ${topResource.podName || "<pod-name>"} -c ${topResource.containerName || "<container>"} --previous\` and inspect events with \`kubectl describe pod ${topResource.podName || "<pod-name>"}\`.`,
|
|
2860
2934
|
);
|
|
2861
|
-
} else if (
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2935
|
+
} else if (metricName === "k8s.pod.phase") {
|
|
2936
|
+
/*
|
|
2937
|
+
* The second half of this condition used to be
|
|
2938
|
+
* `breakdown.attributes["k8s.pod.phase"] === "Pending"`, which could
|
|
2939
|
+
* never be true. `breakdown.attributes` is the QUERY's attribute map
|
|
2940
|
+
* (MonitorTelemetryMonitor stamps `resource.`-prefixed keys into it),
|
|
2941
|
+
* and no receiver or processor in the shipped agent emits a pod
|
|
2942
|
+
* phase attribute at all — the phase is the metric's VALUE
|
|
2943
|
+
* (1 = Pending ... 5 = Unknown). So this branch never ran and every
|
|
2944
|
+
* pod-phase alert fell through to the generic Kubernetes text.
|
|
2945
|
+
*/
|
|
2865
2946
|
lines.push(`Pods are stuck in Pending phase and unable to be scheduled.`);
|
|
2866
2947
|
lines.push(
|
|
2867
2948
|
`Common causes: insufficient CPU/memory resources on nodes, node affinity/taint restrictions preventing scheduling, PersistentVolumeClaim pending, or resource quota exceeded.`,
|
|
@@ -2889,7 +2970,18 @@ ${contextBlock}
|
|
|
2889
2970
|
);
|
|
2890
2971
|
} else if (
|
|
2891
2972
|
metricName === "k8s.node.cpu.utilization" ||
|
|
2892
|
-
|
|
2973
|
+
/*
|
|
2974
|
+
* Node-scoped ONLY. The bare substring test used to swallow every
|
|
2975
|
+
* pod- and container-scoped CPU metric — `k8s.pod.cpu.utilization`,
|
|
2976
|
+
* and now `k8s.pod.cpu_limit_utilization` — and answer them with
|
|
2977
|
+
* "Node X is at N% CPU utilization... consider scaling the cluster",
|
|
2978
|
+
* directly contradicting the pod-limit template's own description,
|
|
2979
|
+
* which tells the reader NOT to add replicas, and naming a node for
|
|
2980
|
+
* a pod-scoped alert.
|
|
2981
|
+
*/
|
|
2982
|
+
(metricName.startsWith("k8s.node.") &&
|
|
2983
|
+
metricName.includes("cpu") &&
|
|
2984
|
+
metricName.includes("utilization"))
|
|
2893
2985
|
) {
|
|
2894
2986
|
lines.push(`Node CPU utilization has exceeded the configured threshold.`);
|
|
2895
2987
|
if (topResource.nodeName) {
|
|
@@ -2905,7 +2997,10 @@ ${contextBlock}
|
|
|
2905
2997
|
);
|
|
2906
2998
|
} else if (
|
|
2907
2999
|
metricName === "k8s.node.memory.usage" ||
|
|
2908
|
-
|
|
3000
|
+
// Node-scoped only — see the CPU branch above.
|
|
3001
|
+
(metricName.startsWith("k8s.node.") &&
|
|
3002
|
+
metricName.includes("memory") &&
|
|
3003
|
+
metricName.includes("usage"))
|
|
2909
3004
|
) {
|
|
2910
3005
|
lines.push(
|
|
2911
3006
|
`Node memory utilization has exceeded the configured threshold.`,
|
|
@@ -27,6 +27,7 @@ import logger, { LogAttributes } from "../Logger";
|
|
|
27
27
|
import CaptureSpan from "../Telemetry/CaptureSpan";
|
|
28
28
|
import DataToProcess from "./DataToProcess";
|
|
29
29
|
import MonitorTemplateUtil from "./MonitorTemplateUtil";
|
|
30
|
+
import SeriesContextEnricher from "./SeriesContextEnricher";
|
|
30
31
|
import MonitorDependencySuppression, {
|
|
31
32
|
DependencySuppressionResult,
|
|
32
33
|
} from "./MonitorDependencySuppression";
|
|
@@ -597,13 +598,28 @@ export default class MonitorIncident {
|
|
|
597
598
|
seriesLabels,
|
|
598
599
|
});
|
|
599
600
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
601
|
+
/*
|
|
602
|
+
* Render the criteria's template, then make it say WHICH
|
|
603
|
+
* series it is about. Mirrors MonitorAlert exactly - the two
|
|
604
|
+
* must agree, or the same breach reads differently depending
|
|
605
|
+
* on whether the criteria was configured to raise an alert or
|
|
606
|
+
* an incident. See SeriesContextEnricher for why this is not
|
|
607
|
+
* done inside the template itself.
|
|
608
|
+
*/
|
|
609
|
+
incident.title = SeriesContextEnricher.enrichTitle({
|
|
610
|
+
title: MonitorTemplateUtil.processTemplateString({
|
|
611
|
+
value: criteriaIncident.title,
|
|
612
|
+
storageMap,
|
|
613
|
+
}),
|
|
614
|
+
seriesLabels,
|
|
603
615
|
});
|
|
604
|
-
incident.description =
|
|
605
|
-
|
|
606
|
-
|
|
616
|
+
incident.description = SeriesContextEnricher.enrichDescription({
|
|
617
|
+
description: MonitorTemplateUtil.processTemplateString({
|
|
618
|
+
value: criteriaIncident.description,
|
|
619
|
+
storageMap,
|
|
620
|
+
}),
|
|
621
|
+
seriesLabels,
|
|
622
|
+
monitorType: input.monitor.monitorType,
|
|
607
623
|
});
|
|
608
624
|
|
|
609
625
|
/*
|
|
@@ -32,6 +32,8 @@ import ExternalStatusPageMonitorResponse, {
|
|
|
32
32
|
} from "../../../Types/Monitor/ExternalStatusPageMonitor/ExternalStatusPageMonitorResponse";
|
|
33
33
|
import MetricMonitorResponse from "../../../Types/Monitor/MetricMonitor/MetricMonitorResponse";
|
|
34
34
|
import Typeof from "../../../Types/Typeof";
|
|
35
|
+
import SeriesDebugHints from "../../../Types/Monitor/SeriesContext/SeriesDebugHints";
|
|
36
|
+
import SeriesLabelDisplay from "../../../Types/Monitor/SeriesContext/SeriesLabelDisplay";
|
|
35
37
|
import VMUtil from "../VM/VMAPI";
|
|
36
38
|
import DataToProcess from "./DataToProcess";
|
|
37
39
|
import logger from "../Logger";
|
|
@@ -627,6 +629,33 @@ export default class MonitorTemplateUtil {
|
|
|
627
629
|
storageMap["seriesLabels"] = data.seriesLabels;
|
|
628
630
|
}
|
|
629
631
|
|
|
632
|
+
/*
|
|
633
|
+
* Ready-made renderings of the series identity.
|
|
634
|
+
*
|
|
635
|
+
* These are set unconditionally - to "" when the monitor is not
|
|
636
|
+
* grouped, or when its labels carry no usable value - and that is
|
|
637
|
+
* the whole point. `VMUtil.replaceValueInPlace` leaves a placeholder
|
|
638
|
+
* it cannot resolve in the output verbatim, so a title written as
|
|
639
|
+
* `"Pod CPU high{{seriesResourceSuffix}}"` would otherwise render
|
|
640
|
+
* with the braces still in it on any monitor without a group-by.
|
|
641
|
+
* Always defining them makes the variables safe to use in a shipped
|
|
642
|
+
* template that has to work for grouped and ungrouped monitors
|
|
643
|
+
* alike.
|
|
644
|
+
*/
|
|
645
|
+
storageMap["seriesResourceSuffix"] = SeriesLabelDisplay.buildTitleSuffix(
|
|
646
|
+
data.seriesLabels,
|
|
647
|
+
);
|
|
648
|
+
storageMap["seriesResourceSummary"] = SeriesLabelDisplay.buildInlineSummary(
|
|
649
|
+
data.seriesLabels,
|
|
650
|
+
);
|
|
651
|
+
storageMap["seriesResourceBlock"] = SeriesLabelDisplay.buildMarkdownBlock(
|
|
652
|
+
data.seriesLabels,
|
|
653
|
+
);
|
|
654
|
+
storageMap["seriesDebugCommands"] = SeriesDebugHints.buildMarkdownBlock({
|
|
655
|
+
monitorType: data.monitorType,
|
|
656
|
+
seriesLabels: data.seriesLabels,
|
|
657
|
+
});
|
|
658
|
+
|
|
630
659
|
/*
|
|
631
660
|
* Monitor identity fields. Always exposed (when a monitor is provided),
|
|
632
661
|
* independent of monitorType, so templates like `{{monitorName}}` work
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import ColumnLength from "../../../Types/Database/ColumnLength";
|
|
2
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
3
|
+
import MonitorType from "../../../Types/Monitor/MonitorType";
|
|
4
|
+
import SeriesDebugHints from "../../../Types/Monitor/SeriesContext/SeriesDebugHints";
|
|
5
|
+
import SeriesLabelDisplay, {
|
|
6
|
+
DisplaySeriesLabel,
|
|
7
|
+
} from "../../../Types/Monitor/SeriesContext/SeriesLabelDisplay";
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* Make a per-series alert or incident say WHICH pod, container, node or
|
|
11
|
+
* mount it is about.
|
|
12
|
+
*
|
|
13
|
+
* A grouped metric monitor raises one alert per breaching series and
|
|
14
|
+
* stores that series' identity in `seriesLabels`. Until now the identity
|
|
15
|
+
* stopped there: the title came from the criteria template, which is one
|
|
16
|
+
* fixed string shared by every series, so a cluster with fifty saturated
|
|
17
|
+
* pods produced fifty alerts whose titles were character-for-character
|
|
18
|
+
* identical. The identity was reachable - in a table, at the bottom of
|
|
19
|
+
* the alert detail page - but the alert list, the Slack message, the
|
|
20
|
+
* email and the phone notification all showed the same undifferentiated
|
|
21
|
+
* line.
|
|
22
|
+
*
|
|
23
|
+
* This enricher runs at creation time, after the criteria template has
|
|
24
|
+
* been rendered, and appends the series identity to the title and a
|
|
25
|
+
* resource + first-commands block to the description.
|
|
26
|
+
*
|
|
27
|
+
* Two properties matter and are covered by tests:
|
|
28
|
+
*
|
|
29
|
+
* - It never fights the user's own template. A title that already
|
|
30
|
+
* names the series (because the user wrote `{{resource.k8s.pod.name}}`
|
|
31
|
+
* into it, or because the new `{{seriesResourceSuffix}}` variable
|
|
32
|
+
* expanded there) is left exactly as the user wrote it. The check is
|
|
33
|
+
* on the VALUES, not on the placeholders, so it works the same
|
|
34
|
+
* whether the identity arrived from a template variable or was typed
|
|
35
|
+
* literally.
|
|
36
|
+
*
|
|
37
|
+
* - It is a no-op for whole-monitor alerts. A monitor with no group-by
|
|
38
|
+
* has no series identity, and nothing is appended.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* Hoisted rather than written inline at its single use site: two lint
|
|
43
|
+
* rules disagree about parenthesising a regex literal in an expression
|
|
44
|
+
* and `--fix` oscillates between them (ESLintCircularFixesWarning). A
|
|
45
|
+
* named constant sidesteps the argument and reads better anyway.
|
|
46
|
+
*/
|
|
47
|
+
const WordCharacterPattern: RegExp = /[A-Za-z0-9]/;
|
|
48
|
+
|
|
49
|
+
export default class SeriesContextEnricher {
|
|
50
|
+
/**
|
|
51
|
+
* The `title` column's own limit, taken from the schema rather than
|
|
52
|
+
* restated as a number - `Alert.title` and `Incident.title` are both
|
|
53
|
+
* `ColumnType.LongText`.
|
|
54
|
+
*/
|
|
55
|
+
private static readonly MaxTitleLength: number = ColumnLength.LongText;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Shortest label value that may be matched as a bare substring.
|
|
59
|
+
*
|
|
60
|
+
* Ceph pool ids and Proxmox vmids are one or two characters, and
|
|
61
|
+
* "does the title contain 3?" is answered `true` by any title with a
|
|
62
|
+
* threshold in it ("Restarts > 3"). Below this length only this
|
|
63
|
+
* module's own `Name: value` rendering counts as a mention, which
|
|
64
|
+
* keeps idempotency without letting a coincidence swallow the
|
|
65
|
+
* identity.
|
|
66
|
+
*/
|
|
67
|
+
private static readonly MinimumMatchableValueLength: number = 4;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* What counts as "part of the same word" when deciding whether a
|
|
71
|
+
* value found in the text is really a mention of it.
|
|
72
|
+
*
|
|
73
|
+
* Deliberately narrower than `\w`: `-`, `.`, `/` and `_` all appear
|
|
74
|
+
* inside the values themselves (pod names, mountpoints, Ceph daemon
|
|
75
|
+
* ids), so treating them as word characters would make a value that
|
|
76
|
+
* IS present look like part of a longer token.
|
|
77
|
+
*/
|
|
78
|
+
private static isWordCharacter(character: string): boolean {
|
|
79
|
+
if (character === "") {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return WordCharacterPattern.test(character);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Whether `text` already names this label's value.
|
|
88
|
+
*
|
|
89
|
+
* Two ways to be already-named, and both matter:
|
|
90
|
+
*
|
|
91
|
+
* - This module's own rendering (`"Pod: web-1"`) is matched exactly.
|
|
92
|
+
* That is what makes the enricher idempotent, whatever the value
|
|
93
|
+
* looks like.
|
|
94
|
+
*
|
|
95
|
+
* - A distinctive value appearing anywhere on a token boundary. That
|
|
96
|
+
* is the user's own template - `{{resource.k8s.pod.name}}` has
|
|
97
|
+
* already expanded by the time this runs, so the check has to be
|
|
98
|
+
* on the VALUE, not on the placeholder. The boundary requirement
|
|
99
|
+
* stops a pod called `web` from counting as mentioned because the
|
|
100
|
+
* title happens to contain the word "website".
|
|
101
|
+
*/
|
|
102
|
+
private static isValueMentioned(input: {
|
|
103
|
+
text: string;
|
|
104
|
+
label: DisplaySeriesLabel;
|
|
105
|
+
}): boolean {
|
|
106
|
+
const { text, label } = input;
|
|
107
|
+
|
|
108
|
+
if (text.includes(`${label.name}: ${label.value}`)) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (
|
|
113
|
+
label.value.length < SeriesContextEnricher.MinimumMatchableValueLength
|
|
114
|
+
) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
let searchFrom: number = 0;
|
|
119
|
+
|
|
120
|
+
for (;;) {
|
|
121
|
+
const index: number = text.indexOf(label.value, searchFrom);
|
|
122
|
+
|
|
123
|
+
if (index === -1) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const before: string = index > 0 ? text.charAt(index - 1) : "";
|
|
128
|
+
const after: string = text.charAt(index + label.value.length);
|
|
129
|
+
|
|
130
|
+
if (
|
|
131
|
+
!SeriesContextEnricher.isWordCharacter(before) &&
|
|
132
|
+
!SeriesContextEnricher.isWordCharacter(after)
|
|
133
|
+
) {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
searchFrom = index + 1;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/*
|
|
142
|
+
* The identity labels not already present in `text`.
|
|
143
|
+
*
|
|
144
|
+
* Deliberately per-label rather than all-or-nothing: a title that
|
|
145
|
+
* mentions the pod by name but not the namespace still gets the
|
|
146
|
+
* namespace appended, because dropping the rest whenever a user's
|
|
147
|
+
* template happened to mention one identifier would lose exactly the
|
|
148
|
+
* context this exists to add.
|
|
149
|
+
*/
|
|
150
|
+
private static getUnmentionedLabels(input: {
|
|
151
|
+
text: string;
|
|
152
|
+
seriesLabels: JSONObject | undefined;
|
|
153
|
+
}): Array<DisplaySeriesLabel> {
|
|
154
|
+
const labels: Array<DisplaySeriesLabel> =
|
|
155
|
+
SeriesLabelDisplay.getDisplayLabels(input.seriesLabels);
|
|
156
|
+
|
|
157
|
+
if (labels.length === 0) {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const text: string = input.text || "";
|
|
162
|
+
|
|
163
|
+
return labels.filter((label: DisplaySeriesLabel) => {
|
|
164
|
+
return !SeriesContextEnricher.isValueMentioned({ text, label });
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/*
|
|
169
|
+
* `title` with the series identity appended, or `title` unchanged when
|
|
170
|
+
* there is no identity to add or the title already carries it.
|
|
171
|
+
*/
|
|
172
|
+
public static enrichTitle(input: {
|
|
173
|
+
title: string;
|
|
174
|
+
seriesLabels: JSONObject | undefined;
|
|
175
|
+
}): string {
|
|
176
|
+
const title: string = input.title || "";
|
|
177
|
+
|
|
178
|
+
const unmentioned: Array<DisplaySeriesLabel> =
|
|
179
|
+
SeriesContextEnricher.getUnmentionedLabels({
|
|
180
|
+
text: title,
|
|
181
|
+
seriesLabels: input.seriesLabels,
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
if (unmentioned.length === 0) {
|
|
185
|
+
return title;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/*
|
|
189
|
+
* Rebuild a label map from just the unmentioned labels so the
|
|
190
|
+
* shared formatter still applies its own ordering and title cap
|
|
191
|
+
* rather than this module reimplementing either.
|
|
192
|
+
*/
|
|
193
|
+
const remaining: JSONObject = {};
|
|
194
|
+
|
|
195
|
+
for (const label of unmentioned) {
|
|
196
|
+
remaining[label.key] = label.value;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const suffix: string = SeriesLabelDisplay.buildTitleSuffix(remaining);
|
|
200
|
+
|
|
201
|
+
if (!suffix) {
|
|
202
|
+
return title;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/*
|
|
206
|
+
* `Alert.title` and `Incident.title` are LongText, i.e. 500
|
|
207
|
+
* characters. Overflowing the column does not produce a shortened
|
|
208
|
+
* title - it fails the INSERT, and the alert does not exist at all.
|
|
209
|
+
* That would turn a labelling improvement into dropped pages, so the
|
|
210
|
+
* appended identity is bounded here as well as per-value inside
|
|
211
|
+
* SeriesLabelDisplay.
|
|
212
|
+
*
|
|
213
|
+
* A base title that is ALREADY at or over the limit is returned
|
|
214
|
+
* untouched: it was going to fail with or without this enricher, and
|
|
215
|
+
* silently truncating what the user wrote is not this module's call
|
|
216
|
+
* to make.
|
|
217
|
+
*/
|
|
218
|
+
if (title.length >= SeriesContextEnricher.MaxTitleLength) {
|
|
219
|
+
return title;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const room: number = SeriesContextEnricher.MaxTitleLength - title.length;
|
|
223
|
+
|
|
224
|
+
if (suffix.length <= room) {
|
|
225
|
+
return `${title}${suffix}`;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return `${title}${suffix.slice(0, room)}`;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/*
|
|
232
|
+
* `description` with an "Affected resource" block and the read-only
|
|
233
|
+
* commands worth running first appended.
|
|
234
|
+
*
|
|
235
|
+
* The description is what reaches Slack, email and the mobile push, so
|
|
236
|
+
* this is where the full identity goes - the title only has room for
|
|
237
|
+
* the top few labels.
|
|
238
|
+
*/
|
|
239
|
+
public static enrichDescription(input: {
|
|
240
|
+
description: string;
|
|
241
|
+
seriesLabels: JSONObject | undefined;
|
|
242
|
+
monitorType: MonitorType | undefined;
|
|
243
|
+
}): string {
|
|
244
|
+
const description: string = input.description || "";
|
|
245
|
+
|
|
246
|
+
const labels: Array<DisplaySeriesLabel> =
|
|
247
|
+
SeriesLabelDisplay.getDisplayLabels(input.seriesLabels);
|
|
248
|
+
|
|
249
|
+
if (labels.length === 0) {
|
|
250
|
+
return description;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const sections: Array<string> = [];
|
|
254
|
+
|
|
255
|
+
/*
|
|
256
|
+
* Only skip the resource block when the description already names
|
|
257
|
+
* EVERY label. A description mentioning the pod but not the node is
|
|
258
|
+
* still missing the thing the engineer needs.
|
|
259
|
+
*/
|
|
260
|
+
const unmentioned: Array<DisplaySeriesLabel> =
|
|
261
|
+
SeriesContextEnricher.getUnmentionedLabels({
|
|
262
|
+
text: description,
|
|
263
|
+
seriesLabels: input.seriesLabels,
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
const block: string = SeriesLabelDisplay.buildMarkdownBlock(
|
|
267
|
+
input.seriesLabels,
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
/*
|
|
271
|
+
* The exact-block check is the idempotency guarantee. Per-label
|
|
272
|
+
* matching alone cannot provide it: a one-character label value
|
|
273
|
+
* (a Ceph pool id, a Proxmox vmid) is deliberately not matched as a
|
|
274
|
+
* bare substring, so a second pass would append the block again.
|
|
275
|
+
*/
|
|
276
|
+
if (unmentioned.length > 0 && block && !description.includes(block)) {
|
|
277
|
+
sections.push(block);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const commandsBlock: string = SeriesDebugHints.buildMarkdownBlock({
|
|
281
|
+
monitorType: input.monitorType,
|
|
282
|
+
seriesLabels: input.seriesLabels,
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
/*
|
|
286
|
+
* The commands embed the label values, so a description that
|
|
287
|
+
* already carries them would otherwise get a near-duplicate block
|
|
288
|
+
* appended on top of a user's own runbook snippet.
|
|
289
|
+
*/
|
|
290
|
+
if (commandsBlock && !description.includes(commandsBlock)) {
|
|
291
|
+
sections.push(commandsBlock);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (sections.length === 0) {
|
|
295
|
+
return description;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if (!description.trim()) {
|
|
299
|
+
return sections.join("\n\n");
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return `${description}\n\n${sections.join("\n\n")}`;
|
|
303
|
+
}
|
|
304
|
+
}
|