@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
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Turning a metric series' raw label map into something an on-call
|
|
3
|
+
* engineer can read at 3am.
|
|
4
|
+
*
|
|
5
|
+
* A grouped metric monitor stores the breaching series' identity on the
|
|
6
|
+
* alert/incident as `seriesLabels` - a map of ClickHouse attribute key
|
|
7
|
+
* to value, e.g.
|
|
8
|
+
*
|
|
9
|
+
* { "resource.k8s.namespace.name": "prod",
|
|
10
|
+
* "resource.k8s.pod.name": "checkout-7d9f-2xk",
|
|
11
|
+
* "resource.k8s.container.name": "app",
|
|
12
|
+
* "resource.k8s.node.name": "ip-10-0-3-14" }
|
|
13
|
+
*
|
|
14
|
+
* Those keys are correct but unreadable, and - more importantly - they
|
|
15
|
+
* used to live ONLY in a table on the alert detail page. The alert
|
|
16
|
+
* title, which is what shows up in the alert list, in Slack, in email
|
|
17
|
+
* and on a phone at 3am, carried none of it, so fifty alerts from one
|
|
18
|
+
* monitor rendered as fifty identical lines of text.
|
|
19
|
+
*
|
|
20
|
+
* This module is the shared, presentation-layer answer to that: given a
|
|
21
|
+
* label map it produces a stable, deduplicated, human-ordered rendering
|
|
22
|
+
* of the resource identity, in three shapes (inline summary, title
|
|
23
|
+
* suffix, markdown block). It lives in Types (not Server) because the
|
|
24
|
+
* dashboard renders the same identity next to alerts and must not
|
|
25
|
+
* reimplement the naming.
|
|
26
|
+
*/
|
|
27
|
+
/*
|
|
28
|
+
* Friendly names for the label keys OneUptime's own agents and the
|
|
29
|
+
* shipped recommendation templates actually group by.
|
|
30
|
+
*
|
|
31
|
+
* Keys are matched twice: once verbatim, and once with the ClickHouse
|
|
32
|
+
* `resource.` prefix stripped - OtelMetricsIngestService stamps that
|
|
33
|
+
* prefix onto OTel *resource* attributes, so the very same concept
|
|
34
|
+
* arrives as `resource.k8s.pod.name` from a resource attribute and as
|
|
35
|
+
* `k8s.pod.name` from a datapoint label. Registering the unprefixed
|
|
36
|
+
* spelling once covers both.
|
|
37
|
+
*/
|
|
38
|
+
const FriendlyLabelNames = {
|
|
39
|
+
// --- Kubernetes ---
|
|
40
|
+
"k8s.cluster.name": "Cluster",
|
|
41
|
+
"k8s.namespace.name": "Namespace",
|
|
42
|
+
"k8s.pod.name": "Pod",
|
|
43
|
+
"k8s.pod.uid": "Pod UID",
|
|
44
|
+
"k8s.container.name": "Container",
|
|
45
|
+
"k8s.node.name": "Node",
|
|
46
|
+
"k8s.deployment.name": "Deployment",
|
|
47
|
+
"k8s.replicaset.name": "ReplicaSet",
|
|
48
|
+
"k8s.statefulset.name": "StatefulSet",
|
|
49
|
+
"k8s.daemonset.name": "DaemonSet",
|
|
50
|
+
"k8s.job.name": "Job",
|
|
51
|
+
"k8s.cronjob.name": "CronJob",
|
|
52
|
+
"k8s.hpa.name": "HPA",
|
|
53
|
+
"k8s.persistentvolumeclaim.name": "PVC",
|
|
54
|
+
"k8s.volume.name": "Volume",
|
|
55
|
+
// --- Containers (Docker / Podman / Swarm) ---
|
|
56
|
+
"container.name": "Container",
|
|
57
|
+
"container.id": "Container ID",
|
|
58
|
+
"container.image.name": "Image",
|
|
59
|
+
"container.runtime": "Runtime",
|
|
60
|
+
"docker.swarm.service.name": "Swarm Service",
|
|
61
|
+
"docker.swarm.node.name": "Swarm Node",
|
|
62
|
+
"docker.swarm.cluster.name": "Swarm Cluster",
|
|
63
|
+
"oneuptime.docker.host.name": "Docker Host",
|
|
64
|
+
"oneuptime.podman.host.name": "Podman Host",
|
|
65
|
+
// --- Hosts / OS ---
|
|
66
|
+
"host.name": "Host",
|
|
67
|
+
"oneuptime.host.name": "Host",
|
|
68
|
+
"host.id": "Host ID",
|
|
69
|
+
mountpoint: "Mount",
|
|
70
|
+
device: "Device",
|
|
71
|
+
"system.device": "Device",
|
|
72
|
+
"disk.path": "Disk",
|
|
73
|
+
"network.interface": "Interface",
|
|
74
|
+
interfaceName: "Interface",
|
|
75
|
+
interfaceAlias: "Interface Alias",
|
|
76
|
+
diskPath: "Disk",
|
|
77
|
+
cpu: "CPU",
|
|
78
|
+
direction: "Direction",
|
|
79
|
+
state: "State",
|
|
80
|
+
process: "Process",
|
|
81
|
+
/*
|
|
82
|
+
* --- Proxmox ---
|
|
83
|
+
*
|
|
84
|
+
* pve-exporter encodes identity in a single `id` datapoint label
|
|
85
|
+
* ("qemu/100", "node/pve1", "storage/local"), and the agent's transform
|
|
86
|
+
* splits it into `pve.scope` / `pve.type` / `pve.id` (see
|
|
87
|
+
* ProxmoxAgent/otel-collector-config.yaml). Both spellings are named
|
|
88
|
+
* here because templates group by the raw `id` while a user's own
|
|
89
|
+
* monitor may group by the derived parts.
|
|
90
|
+
*/
|
|
91
|
+
"proxmox.cluster.name": "Proxmox Cluster",
|
|
92
|
+
"proxmox.node.name": "Proxmox Node",
|
|
93
|
+
"proxmox.vm.name": "VM",
|
|
94
|
+
id: "Object",
|
|
95
|
+
"pve.id": "Object ID",
|
|
96
|
+
"pve.type": "Object Type",
|
|
97
|
+
"pve.scope": "Scope",
|
|
98
|
+
vmid: "VM ID",
|
|
99
|
+
node: "Node",
|
|
100
|
+
storage: "Storage",
|
|
101
|
+
// --- Ceph ---
|
|
102
|
+
"ceph.cluster.name": "Ceph Cluster",
|
|
103
|
+
ceph_daemon: "Ceph Daemon",
|
|
104
|
+
pool_id: "Pool",
|
|
105
|
+
pool: "Pool",
|
|
106
|
+
osd: "OSD",
|
|
107
|
+
// --- IoT ---
|
|
108
|
+
"iot.fleet.name": "Fleet",
|
|
109
|
+
"device.id": "Device",
|
|
110
|
+
"device.name": "Device",
|
|
111
|
+
// --- Services / RUM / telemetry ---
|
|
112
|
+
"service.name": "Service",
|
|
113
|
+
"oneuptime.service.name": "Service",
|
|
114
|
+
/*
|
|
115
|
+
* One process/task/replica of a service. What the ServiceAlertTemplates
|
|
116
|
+
* per-instance metric templates group by, so a "Thread Count Explosion"
|
|
117
|
+
* alert on a 40-replica service can say which replica. (The two request
|
|
118
|
+
* latency percentiles are deliberately ungrouped — they are service-level.)
|
|
119
|
+
*/
|
|
120
|
+
"service.instance.id": "Instance",
|
|
121
|
+
"service.namespace": "Service Namespace",
|
|
122
|
+
"service.version": "Version",
|
|
123
|
+
"deployment.environment": "Environment",
|
|
124
|
+
"telemetry.sdk.language": "Language",
|
|
125
|
+
"url.path": "Path",
|
|
126
|
+
"http.route": "Route",
|
|
127
|
+
"browser.name": "Browser",
|
|
128
|
+
"os.name": "OS",
|
|
129
|
+
region: "Region",
|
|
130
|
+
"cloud.region": "Region",
|
|
131
|
+
"cloud.availability_zone": "Zone",
|
|
132
|
+
};
|
|
133
|
+
/*
|
|
134
|
+
* Ordering. An alert title has room for a couple of identifiers, and
|
|
135
|
+
* which couple it gets decides whether the title is useful: "Pod:
|
|
136
|
+
* checkout-7d9f-2xk" answers "what broke", "Namespace: prod" on its own
|
|
137
|
+
* does not. Lower number = more identifying = shown first and kept when
|
|
138
|
+
* the title is truncated.
|
|
139
|
+
*
|
|
140
|
+
* Container beats Pod deliberately for container-scoped metrics: a CPU
|
|
141
|
+
* *limit* is a property of one container, so when both labels are
|
|
142
|
+
* present the container is the thing that breached. Scope-setting
|
|
143
|
+
* labels (namespace, cluster, node) rank after the object itself - they
|
|
144
|
+
* qualify the answer rather than being it.
|
|
145
|
+
*/
|
|
146
|
+
const LabelPriority = {
|
|
147
|
+
"k8s.container.name": 10,
|
|
148
|
+
"container.name": 10,
|
|
149
|
+
"k8s.pod.name": 20,
|
|
150
|
+
"k8s.deployment.name": 25,
|
|
151
|
+
"k8s.statefulset.name": 25,
|
|
152
|
+
"k8s.daemonset.name": 25,
|
|
153
|
+
"k8s.job.name": 25,
|
|
154
|
+
"k8s.cronjob.name": 25,
|
|
155
|
+
"k8s.hpa.name": 25,
|
|
156
|
+
"k8s.persistentvolumeclaim.name": 25,
|
|
157
|
+
"k8s.volume.name": 25,
|
|
158
|
+
"docker.swarm.service.name": 25,
|
|
159
|
+
ceph_daemon: 25,
|
|
160
|
+
pool_id: 25,
|
|
161
|
+
"device.id": 25,
|
|
162
|
+
"device.name": 25,
|
|
163
|
+
"proxmox.vm.name": 25,
|
|
164
|
+
vmid: 25,
|
|
165
|
+
id: 30,
|
|
166
|
+
"pve.id": 32,
|
|
167
|
+
"pve.type": 55,
|
|
168
|
+
"pve.scope": 90,
|
|
169
|
+
mountpoint: 30,
|
|
170
|
+
diskPath: 30,
|
|
171
|
+
"disk.path": 30,
|
|
172
|
+
interfaceName: 30,
|
|
173
|
+
device: 35,
|
|
174
|
+
"system.device": 35,
|
|
175
|
+
storage: 35,
|
|
176
|
+
/*
|
|
177
|
+
* Above `service.name`: the service is already named by the monitor, the
|
|
178
|
+
* instance is the part the reader does not know.
|
|
179
|
+
*/
|
|
180
|
+
"service.instance.id": 22,
|
|
181
|
+
"service.name": 40,
|
|
182
|
+
"oneuptime.service.name": 40,
|
|
183
|
+
"k8s.namespace.name": 50,
|
|
184
|
+
"service.namespace": 50,
|
|
185
|
+
"k8s.node.name": 60,
|
|
186
|
+
"proxmox.node.name": 60,
|
|
187
|
+
"docker.swarm.node.name": 60,
|
|
188
|
+
node: 60,
|
|
189
|
+
"host.name": 65,
|
|
190
|
+
"oneuptime.host.name": 65,
|
|
191
|
+
"oneuptime.docker.host.name": 65,
|
|
192
|
+
"oneuptime.podman.host.name": 65,
|
|
193
|
+
"k8s.cluster.name": 80,
|
|
194
|
+
"docker.swarm.cluster.name": 80,
|
|
195
|
+
"proxmox.cluster.name": 80,
|
|
196
|
+
"ceph.cluster.name": 80,
|
|
197
|
+
"iot.fleet.name": 80,
|
|
198
|
+
"k8s.pod.uid": 95,
|
|
199
|
+
"container.id": 95,
|
|
200
|
+
};
|
|
201
|
+
const DefaultLabelPriority = 70;
|
|
202
|
+
/*
|
|
203
|
+
* How many identifiers a title carries before it stops being scannable.
|
|
204
|
+
* Three is enough for the two shapes that matter in practice -
|
|
205
|
+
* container/pod/namespace and pod/namespace/node - and the full set is
|
|
206
|
+
* always one click away in the description block and the alert's
|
|
207
|
+
* Affected Resource table.
|
|
208
|
+
*/
|
|
209
|
+
export const MaxLabelsInTitle = 3;
|
|
210
|
+
/*
|
|
211
|
+
* Longest label value the inline (title) rendering will print in full.
|
|
212
|
+
*
|
|
213
|
+
* Kubernetes object names go up to 253 characters, and a generated pod
|
|
214
|
+
* name in a deeply-nested naming scheme really can get long. Three of
|
|
215
|
+
* those would overflow the 500-character `title` column and fail the
|
|
216
|
+
* alert INSERT outright - the alert would not exist at all, which is a
|
|
217
|
+
* far worse outcome than a shortened name. The full value is always
|
|
218
|
+
* present untruncated in the markdown block and in the alert's
|
|
219
|
+
* seriesLabels.
|
|
220
|
+
*/
|
|
221
|
+
export const MaxLabelValueLengthInTitle = 64;
|
|
222
|
+
const Ellipsis = "...";
|
|
223
|
+
export default class SeriesLabelDisplay {
|
|
224
|
+
/*
|
|
225
|
+
* Strip the ClickHouse `resource.` prefix so a resource attribute and
|
|
226
|
+
* the same attribute arriving as a datapoint label resolve to one
|
|
227
|
+
* entry in the tables above.
|
|
228
|
+
*/
|
|
229
|
+
static normalizeKey(key) {
|
|
230
|
+
if (key.startsWith("resource.")) {
|
|
231
|
+
return key.slice("resource.".length);
|
|
232
|
+
}
|
|
233
|
+
return key;
|
|
234
|
+
}
|
|
235
|
+
/*
|
|
236
|
+
* "Pod", "Container", "Node" - or, for a key nobody registered, a
|
|
237
|
+
* best-effort prettified form of the key itself. An unknown key is
|
|
238
|
+
* still far more useful spelled out than dropped: a user who groups
|
|
239
|
+
* by `tenant_id` should see "Tenant Id: acme", not silence.
|
|
240
|
+
*/
|
|
241
|
+
static getFriendlyLabelName(key) {
|
|
242
|
+
const normalized = SeriesLabelDisplay.normalizeKey(key);
|
|
243
|
+
const known = FriendlyLabelNames[normalized] || FriendlyLabelNames[key];
|
|
244
|
+
if (known) {
|
|
245
|
+
return known;
|
|
246
|
+
}
|
|
247
|
+
return SeriesLabelDisplay.prettifyKey(normalized);
|
|
248
|
+
}
|
|
249
|
+
static prettifyKey(key) {
|
|
250
|
+
const words = key
|
|
251
|
+
.split(/[._\-/]+/)
|
|
252
|
+
.filter((part) => {
|
|
253
|
+
return part.length > 0;
|
|
254
|
+
})
|
|
255
|
+
.map((part) => {
|
|
256
|
+
return part.charAt(0).toUpperCase() + part.slice(1);
|
|
257
|
+
});
|
|
258
|
+
if (words.length === 0) {
|
|
259
|
+
return key;
|
|
260
|
+
}
|
|
261
|
+
return words.join(" ");
|
|
262
|
+
}
|
|
263
|
+
/*
|
|
264
|
+
* Whether this key has a deliberately-registered name, as opposed to
|
|
265
|
+
* falling through to the prettified-key fallback.
|
|
266
|
+
*
|
|
267
|
+
* The fallback is right for a user's own attribute - nobody can
|
|
268
|
+
* enumerate what `oneuptime.captureMetric()` might emit - but a key a
|
|
269
|
+
* SHIPPED template groups by should always be registered, and there
|
|
270
|
+
* is no way to tell the two apart from the returned string alone
|
|
271
|
+
* (`device` prettifies to "Device", which is also its registered
|
|
272
|
+
* name). The recommendation-catalog tests use this to hold that line.
|
|
273
|
+
*/
|
|
274
|
+
static isKnownLabelKey(key) {
|
|
275
|
+
const normalized = SeriesLabelDisplay.normalizeKey(key);
|
|
276
|
+
return (FriendlyLabelNames[normalized] !== undefined ||
|
|
277
|
+
FriendlyLabelNames[key] !== undefined);
|
|
278
|
+
}
|
|
279
|
+
static getLabelPriority(key) {
|
|
280
|
+
var _a;
|
|
281
|
+
const normalized = SeriesLabelDisplay.normalizeKey(key);
|
|
282
|
+
const priority = (_a = LabelPriority[normalized]) !== null && _a !== void 0 ? _a : LabelPriority[key];
|
|
283
|
+
return priority === undefined ? DefaultLabelPriority : priority;
|
|
284
|
+
}
|
|
285
|
+
/*
|
|
286
|
+
* Coerce one label value to the string a human should read.
|
|
287
|
+
*
|
|
288
|
+
* Multi-valued labels (a series grouped on an attribute that carries
|
|
289
|
+
* an array) join with ", ". Objects are refused rather than
|
|
290
|
+
* JSON-dumped into an alert title.
|
|
291
|
+
*/
|
|
292
|
+
static toDisplayValue(value) {
|
|
293
|
+
if (value === undefined || value === null) {
|
|
294
|
+
return "";
|
|
295
|
+
}
|
|
296
|
+
if (Array.isArray(value)) {
|
|
297
|
+
return value
|
|
298
|
+
.map((entry) => {
|
|
299
|
+
return SeriesLabelDisplay.toDisplayValue(entry);
|
|
300
|
+
})
|
|
301
|
+
.filter((entry) => {
|
|
302
|
+
return entry.length > 0;
|
|
303
|
+
})
|
|
304
|
+
.join(", ");
|
|
305
|
+
}
|
|
306
|
+
if (typeof value === "object") {
|
|
307
|
+
return "";
|
|
308
|
+
}
|
|
309
|
+
return `${value}`.trim();
|
|
310
|
+
}
|
|
311
|
+
/*
|
|
312
|
+
* The display-ready labels for one series, most identifying first.
|
|
313
|
+
*
|
|
314
|
+
* Empty values are dropped, not rendered blank. A grouped series
|
|
315
|
+
* always carries every group-by key - `MetricSeriesFingerprint`
|
|
316
|
+
* deliberately preserves a key whose attribute was missing as `""` so
|
|
317
|
+
* the fingerprint stays stable across evaluations - so without this
|
|
318
|
+
* filter a pod whose node attribute happened to be absent would title
|
|
319
|
+
* itself "Pod: web-1 - Node: ".
|
|
320
|
+
*
|
|
321
|
+
* Values that are duplicates of an already-included value are dropped
|
|
322
|
+
* too: several spellings of the same identity routinely ride along
|
|
323
|
+
* (`k8s.pod.name` and `resource.k8s.pod.name`, `host.name` and
|
|
324
|
+
* `oneuptime.host.name`), and repeating them buys nothing.
|
|
325
|
+
*/
|
|
326
|
+
static getDisplayLabels(seriesLabels) {
|
|
327
|
+
if (!seriesLabels) {
|
|
328
|
+
return [];
|
|
329
|
+
}
|
|
330
|
+
const labels = [];
|
|
331
|
+
const seenNameValuePairs = new Set();
|
|
332
|
+
const keys = Object.keys(seriesLabels);
|
|
333
|
+
// Stable order: priority first, then key, so equal-priority keys never flip.
|
|
334
|
+
keys.sort((a, b) => {
|
|
335
|
+
const priorityDifference = SeriesLabelDisplay.getLabelPriority(a) -
|
|
336
|
+
SeriesLabelDisplay.getLabelPriority(b);
|
|
337
|
+
if (priorityDifference !== 0) {
|
|
338
|
+
return priorityDifference;
|
|
339
|
+
}
|
|
340
|
+
return a.localeCompare(b);
|
|
341
|
+
});
|
|
342
|
+
for (const key of keys) {
|
|
343
|
+
const value = SeriesLabelDisplay.toDisplayValue(seriesLabels[key]);
|
|
344
|
+
if (!value) {
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
const name = SeriesLabelDisplay.getFriendlyLabelName(key);
|
|
348
|
+
const dedupeKey = `${name}${value}`;
|
|
349
|
+
if (seenNameValuePairs.has(dedupeKey)) {
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
seenNameValuePairs.add(dedupeKey);
|
|
353
|
+
labels.push({ key, name, value });
|
|
354
|
+
}
|
|
355
|
+
return labels;
|
|
356
|
+
}
|
|
357
|
+
/*
|
|
358
|
+
* "Pod: checkout-7d9f-2xk / Namespace: prod / Node: ip-10-0-3-14".
|
|
359
|
+
*
|
|
360
|
+
* Returns "" when the series carries no usable identity, so callers
|
|
361
|
+
* can concatenate unconditionally.
|
|
362
|
+
*/
|
|
363
|
+
static buildInlineSummary(seriesLabels, options) {
|
|
364
|
+
var _a, _b;
|
|
365
|
+
const maxLabels = (_a = options === null || options === void 0 ? void 0 : options.maxLabels) !== null && _a !== void 0 ? _a : MaxLabelsInTitle;
|
|
366
|
+
const maxValueLength = (_b = options === null || options === void 0 ? void 0 : options.maxValueLength) !== null && _b !== void 0 ? _b : MaxLabelValueLengthInTitle;
|
|
367
|
+
const labels = SeriesLabelDisplay.getDisplayLabels(seriesLabels);
|
|
368
|
+
if (labels.length === 0) {
|
|
369
|
+
return "";
|
|
370
|
+
}
|
|
371
|
+
return labels
|
|
372
|
+
.slice(0, Math.max(maxLabels, 1))
|
|
373
|
+
.map((label) => {
|
|
374
|
+
return `${label.name}: ${SeriesLabelDisplay.truncateValue(label.value, maxValueLength)}`;
|
|
375
|
+
})
|
|
376
|
+
.join(" | ");
|
|
377
|
+
}
|
|
378
|
+
static truncateValue(value, maxLength) {
|
|
379
|
+
if (maxLength <= 0 || value.length <= maxLength) {
|
|
380
|
+
return value;
|
|
381
|
+
}
|
|
382
|
+
/*
|
|
383
|
+
* Keep the END of the value, not the start. Generated names put the
|
|
384
|
+
* distinguishing part last (`checkout-7d9f-2xk`), so a head-truncated
|
|
385
|
+
* `checkout-checkout-web-fro...` tells the reader nothing that the
|
|
386
|
+
* rest of the alert did not already.
|
|
387
|
+
*/
|
|
388
|
+
if (maxLength <= Ellipsis.length) {
|
|
389
|
+
return value.slice(value.length - maxLength);
|
|
390
|
+
}
|
|
391
|
+
return `${Ellipsis}${value.slice(value.length - (maxLength - Ellipsis.length))}`;
|
|
392
|
+
}
|
|
393
|
+
/*
|
|
394
|
+
* The same summary, prefixed with the separator used in titles, or ""
|
|
395
|
+
* when there is nothing to say. Templates append this unconditionally:
|
|
396
|
+
* `"[K8s] Pod CPU Saturating Container Limit{{seriesResourceSuffix}}"`.
|
|
397
|
+
*/
|
|
398
|
+
static buildTitleSuffix(seriesLabels, options) {
|
|
399
|
+
const summary = SeriesLabelDisplay.buildInlineSummary(seriesLabels, options);
|
|
400
|
+
if (!summary) {
|
|
401
|
+
return "";
|
|
402
|
+
}
|
|
403
|
+
return ` - ${summary}`;
|
|
404
|
+
}
|
|
405
|
+
/*
|
|
406
|
+
* A markdown block naming every identifier the series carries, for
|
|
407
|
+
* alert/incident descriptions (which is what Slack, email and the
|
|
408
|
+
* mobile push actually show).
|
|
409
|
+
*/
|
|
410
|
+
static buildMarkdownBlock(seriesLabels, options) {
|
|
411
|
+
const labels = SeriesLabelDisplay.getDisplayLabels(seriesLabels);
|
|
412
|
+
if (labels.length === 0) {
|
|
413
|
+
return "";
|
|
414
|
+
}
|
|
415
|
+
const heading = (options === null || options === void 0 ? void 0 : options.heading) || "Affected resource";
|
|
416
|
+
const lines = labels.map((label) => {
|
|
417
|
+
return `- **${label.name}:** \`${label.value}\``;
|
|
418
|
+
});
|
|
419
|
+
return `**${heading}**\n${lines.join("\n")}`;
|
|
420
|
+
}
|
|
421
|
+
/*
|
|
422
|
+
* Look up one logical identity across every spelling it can arrive
|
|
423
|
+
* under. Callers pass unprefixed keys ("k8s.pod.name"); both the bare
|
|
424
|
+
* and the `resource.`-prefixed spelling are checked.
|
|
425
|
+
*/
|
|
426
|
+
static findLabelValue(seriesLabels, keys) {
|
|
427
|
+
if (!seriesLabels) {
|
|
428
|
+
return "";
|
|
429
|
+
}
|
|
430
|
+
for (const key of keys) {
|
|
431
|
+
for (const candidate of [key, `resource.${key}`]) {
|
|
432
|
+
const value = SeriesLabelDisplay.toDisplayValue(seriesLabels[candidate]);
|
|
433
|
+
if (value) {
|
|
434
|
+
return value;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return "";
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=SeriesLabelDisplay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SeriesLabelDisplay.js","sourceRoot":"","sources":["../../../../../Types/Monitor/SeriesContext/SeriesLabelDisplay.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,16 +9,19 @@ import MonitorType from "./MonitorType";
|
|
|
9
9
|
import RollingTime from "../RollingTime/RollingTime";
|
|
10
10
|
import MetricsAggregationType from "../Metrics/MetricsAggregationType";
|
|
11
11
|
/*
|
|
12
|
-
* `EvaluateOverTimeType` names the window collapse
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* `EvaluateOverTimeType` names the window collapse. The two members these
|
|
13
|
+
* templates use are worth stating once, here, rather than being rediscovered
|
|
14
|
+
* per template:
|
|
15
15
|
*
|
|
16
16
|
* AnyValue -> ANY bucket in the rolling window breaching is a breach.
|
|
17
17
|
* Right for spikes.
|
|
18
|
-
* AllValues -> EVERY bucket must breach. Right for sustained pressure
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* AllValues -> EVERY bucket must breach. Right for sustained pressure.
|
|
19
|
+
*
|
|
20
|
+
* The reducing members (`Average`, `Sum`, `MaximumValue`, `MunimumValue`) do
|
|
21
|
+
* now collapse the window to one sample before the comparison —
|
|
22
|
+
* `CompareCriteria.reduceWindow` — so they mean what they say. `AllValues` is
|
|
23
|
+
* still the right default here: a reduced window hides the shape, and a metric
|
|
24
|
+
* that spends half the window fine is not under sustained pressure.
|
|
22
25
|
*
|
|
23
26
|
* A window with no samples at all never reaches the comparator — the
|
|
24
27
|
* evaluator's no-data guard returns "not breaching" under the default
|
|
@@ -32,6 +35,33 @@ import MetricsAggregationType from "../Metrics/MetricsAggregationType";
|
|
|
32
35
|
* team to mute it.
|
|
33
36
|
*/
|
|
34
37
|
const SUSTAINED = EvaluateOverTimeType.AllValues;
|
|
38
|
+
/*
|
|
39
|
+
* The resource attribute that identifies ONE process of a service.
|
|
40
|
+
*
|
|
41
|
+
* Every metric template here except the two request-latency percentiles
|
|
42
|
+
* thresholds a property of a single process — a heap, an event loop, a
|
|
43
|
+
* goroutine count, a thread pool. Without a group-by the ClickHouse
|
|
44
|
+
* aggregation collapses every replica of the service into one number, so an
|
|
45
|
+
* `Avg` template on three replicas at 95/20/20 reads 45 and stays green while
|
|
46
|
+
* one of them OOM-kills, and a `Max` template fires on the worst replica with
|
|
47
|
+
* no way to say which. Grouping fixes both at once: the worker emits one
|
|
48
|
+
* series per instance and the alert carries that instance in `seriesLabels`,
|
|
49
|
+
* which `SeriesLabelDisplay` renders into the title and the description block.
|
|
50
|
+
*
|
|
51
|
+
* `service.instance.id` is OPTIONAL in the resource semantic conventions, and
|
|
52
|
+
* this degrades safely when it is absent: the query returns one series whose
|
|
53
|
+
* label value is the empty string (ClickHouse `attributes[k]` on a missing key
|
|
54
|
+
* yields ""), `MetricSeriesFingerprint.extractSeriesLabels` keeps the key so
|
|
55
|
+
* the fingerprint stays stable across evaluations, and
|
|
56
|
+
* `SeriesLabelDisplay.getDisplayLabels` drops empty values rather than
|
|
57
|
+
* rendering "Instance: ". A service that does not report it therefore gets
|
|
58
|
+
* exactly today's single-series behaviour, not silence.
|
|
59
|
+
*
|
|
60
|
+
* The `resource.` prefix is the one OtelMetricsIngestService stamps onto OTel
|
|
61
|
+
* resource attributes (`prefixKeysWithString: "resource"`), the same spelling
|
|
62
|
+
* KubernetesAlertTemplates uses for `resource.k8s.pod.name`.
|
|
63
|
+
*/
|
|
64
|
+
const PER_INSTANCE_GROUP_BY = ["resource.service.instance.id"];
|
|
35
65
|
/*
|
|
36
66
|
* The unhealthy/healthy criteria pair every template ships.
|
|
37
67
|
*
|
|
@@ -58,7 +88,16 @@ function buildCriteriaPair(data) {
|
|
|
58
88
|
checkOn: data.checkOn,
|
|
59
89
|
filterType: data.unhealthyFilterType,
|
|
60
90
|
value: data.threshold,
|
|
61
|
-
|
|
91
|
+
/*
|
|
92
|
+
* A copy per filter, not the shared object. `MetricMonitorCriteria`
|
|
93
|
+
* writes its `AnyValue` default straight back through this reference
|
|
94
|
+
* when `metricAggregationType` is unset, and the criteria form spreads
|
|
95
|
+
* and re-assigns it on edit — either of which, on a shared object,
|
|
96
|
+
* changes the healthy criteria as a side effect of touching the
|
|
97
|
+
* unhealthy one.
|
|
98
|
+
*/
|
|
99
|
+
metricMonitorOptions: metricMonitorOptions
|
|
100
|
+
? Object.assign({}, metricMonitorOptions) : undefined,
|
|
62
101
|
},
|
|
63
102
|
],
|
|
64
103
|
incidents: [
|
|
@@ -97,7 +136,9 @@ function buildCriteriaPair(data) {
|
|
|
97
136
|
checkOn: data.checkOn,
|
|
98
137
|
filterType: data.healthyFilterType,
|
|
99
138
|
value: data.threshold,
|
|
100
|
-
|
|
139
|
+
// A copy per filter — see the unhealthy filter above.
|
|
140
|
+
metricMonitorOptions: metricMonitorOptions
|
|
141
|
+
? Object.assign({}, metricMonitorOptions) : undefined,
|
|
101
142
|
},
|
|
102
143
|
],
|
|
103
144
|
incidents: [],
|
|
@@ -168,14 +209,14 @@ function buildQueryConfig(data) {
|
|
|
168
209
|
legend: data.title,
|
|
169
210
|
legendUnit: data.legendUnit,
|
|
170
211
|
},
|
|
171
|
-
metricQueryData: {
|
|
172
|
-
filterData: {
|
|
212
|
+
metricQueryData: Object.assign({ filterData: {
|
|
173
213
|
metricName: data.metricName,
|
|
174
214
|
attributes: data.attributes || {},
|
|
175
215
|
aggegationType: data.aggregationType,
|
|
176
216
|
aggregateBy: {},
|
|
177
|
-
},
|
|
178
|
-
|
|
217
|
+
} }, (data.groupByAttributeKeys && data.groupByAttributeKeys.length > 0
|
|
218
|
+
? { groupByAttributeKeys: data.groupByAttributeKeys }
|
|
219
|
+
: {})),
|
|
179
220
|
};
|
|
180
221
|
}
|
|
181
222
|
/*
|
|
@@ -211,6 +252,7 @@ function buildMetricTemplate(data) {
|
|
|
211
252
|
aggregationType: data.aggregationType,
|
|
212
253
|
attributes: data.attributes,
|
|
213
254
|
legendUnit: data.legendUnit,
|
|
255
|
+
groupByAttributeKeys: data.groupByAttributeKeys || PER_INSTANCE_GROUP_BY,
|
|
214
256
|
}),
|
|
215
257
|
],
|
|
216
258
|
formulaConfigs: [],
|
|
@@ -293,6 +335,17 @@ function buildRatioTemplate(data) {
|
|
|
293
335
|
title: `${data.name} (used)`,
|
|
294
336
|
aggregationType: MetricsAggregationType.Sum,
|
|
295
337
|
attributes: data.numeratorAttributes,
|
|
338
|
+
/*
|
|
339
|
+
* The SAME key set on both queries. The worker splits every
|
|
340
|
+
* query on the UNION of their keys, so the split itself cannot
|
|
341
|
+
* go wrong from setting only one side — but
|
|
342
|
+
* `MetricMonitorCriteria.buildContext` reads
|
|
343
|
+
* `groupByAttributeKeys` off a SINGLE query config when it
|
|
344
|
+
* builds the alert's "Grouped By" root-cause block, and a
|
|
345
|
+
* one-sided setting renders that block empty for whichever side
|
|
346
|
+
* it read.
|
|
347
|
+
*/
|
|
348
|
+
groupByAttributeKeys: data.groupByAttributeKeys || PER_INSTANCE_GROUP_BY,
|
|
296
349
|
}),
|
|
297
350
|
buildQueryConfig({
|
|
298
351
|
metricName: data.denominatorMetricName,
|
|
@@ -300,6 +353,7 @@ function buildRatioTemplate(data) {
|
|
|
300
353
|
title: `${data.name} (limit)`,
|
|
301
354
|
aggregationType: MetricsAggregationType.Sum,
|
|
302
355
|
attributes: data.denominatorAttributes,
|
|
356
|
+
groupByAttributeKeys: data.groupByAttributeKeys || PER_INSTANCE_GROUP_BY,
|
|
303
357
|
}),
|
|
304
358
|
],
|
|
305
359
|
formulaConfigs: [formulaConfig],
|
|
@@ -511,6 +565,14 @@ const latencyP95Template = buildMetricTemplate({
|
|
|
511
565
|
metricAlias: "service_latency_p95",
|
|
512
566
|
aggregationType: MetricsAggregationType.P95,
|
|
513
567
|
legendUnit: "ms",
|
|
568
|
+
/*
|
|
569
|
+
* Not grouped, unlike every other metric template here. A request latency
|
|
570
|
+
* percentile is a property of the SERVICE — it is the number the SLO is
|
|
571
|
+
* written against — and splitting it per instance would turn "the service's
|
|
572
|
+
* p95 is above a second" into "one replica's p95 is above a second", which
|
|
573
|
+
* fires on a single slow pod and means something else.
|
|
574
|
+
*/
|
|
575
|
+
groupByAttributeKeys: [],
|
|
514
576
|
threshold: 1000,
|
|
515
577
|
thresholdLabel: "1,000 ms",
|
|
516
578
|
incidentDescription: "One in twenty requests is now taking a second or more. Break the latency down by route and by downstream call to find where the time is going.",
|
|
@@ -525,6 +587,8 @@ const latencyP99Template = buildMetricTemplate({
|
|
|
525
587
|
metricAlias: "service_latency_p99",
|
|
526
588
|
aggregationType: MetricsAggregationType.P99,
|
|
527
589
|
legendUnit: "ms",
|
|
590
|
+
// Service-level, not per instance — see latencyP95Template.
|
|
591
|
+
groupByAttributeKeys: [],
|
|
528
592
|
threshold: 2500,
|
|
529
593
|
thresholdLabel: "2,500 ms",
|
|
530
594
|
incidentDescription: "The slowest one percent of requests are taking 2.5 seconds or more. Look for a saturated dependency, a lock, or a slow query on the affected route.",
|
|
@@ -849,7 +913,7 @@ const pythonTemplates = [
|
|
|
849
913
|
buildMetricTemplate({
|
|
850
914
|
id: "service-python-rss-memory",
|
|
851
915
|
name: "Resident Memory High",
|
|
852
|
-
description: "Alert when resident memory stays above 1 GB
|
|
916
|
+
description: "Alert when a worker's resident memory stays above 1 GB — the signal that precedes an OOM kill. Needs the system-metrics instrumentation enabled. Reads process.runtime.cpython.memory with type=rss; newer opentelemetry-python releases report this as process.memory.usage, which the language-agnostic Process Memory High template already covers.",
|
|
853
917
|
category: "Python Runtime",
|
|
854
918
|
severity: "Warning",
|
|
855
919
|
language: "python",
|
|
@@ -866,7 +930,7 @@ const pythonTemplates = [
|
|
|
866
930
|
buildMetricTemplate({
|
|
867
931
|
id: "service-python-thread-growth",
|
|
868
932
|
name: "Thread Count Growth",
|
|
869
|
-
description: "Alert when thread count stays above 200, which usually means a leaked executor or an unclosed client pool. Needs the system-metrics instrumentation enabled.",
|
|
933
|
+
description: "Alert when thread count stays above 200, which usually means a leaked executor or an unclosed client pool. Needs the system-metrics instrumentation enabled. Reads process.runtime.cpython.thread_count; newer opentelemetry-python releases report this as process.thread.count — retarget the created monitor in one edit if your SDK emits that instead.",
|
|
870
934
|
category: "Python Runtime",
|
|
871
935
|
severity: "Warning",
|
|
872
936
|
language: "python",
|