@oneuptime/common 14.0.8 → 14.0.9
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/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/KubernetesAiAgent.ts +364 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +3 -3
- package/Models/DatabaseModels/Project.ts +55 -5
- package/Models/DatabaseModels/ProxmoxResource.ts +49 -1
- package/Models/DatabaseModels/RunnerJob.ts +75 -0
- package/Models/DatabaseModels/TeamComplianceSetting.ts +143 -2
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +17 -0
- package/Server/API/AIChatAPI.ts +6 -3
- package/Server/API/AIInvestigationAPI.ts +17 -10
- package/Server/API/AutoRemediationAPI.ts +207 -25
- package/Server/API/KubernetesClusterAiAccessAPI.ts +623 -21
- package/Server/API/MicrosoftTeamsAPI.ts +93 -14
- package/Server/API/ProxmoxResourceAPI.ts +244 -14
- package/Server/Infrastructure/GlobalCache.ts +32 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.ts +99 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.ts +137 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.ts +42 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/TelemetryIngest.ts +41 -18
- package/Server/Services/AIService.ts +70 -1
- package/Server/Services/AlertService.ts +352 -11
- package/Server/Services/AlertSeverityService.ts +65 -15
- package/Server/Services/AutoRemediationRuleService.ts +1 -1
- package/Server/Services/IncidentService.ts +280 -104
- package/Server/Services/IncidentSeverityService.ts +66 -15
- package/Server/Services/KubernetesAiAgentJobService.ts +185 -0
- package/Server/Services/KubernetesAiAgentService.ts +1634 -0
- package/Server/Services/KubernetesClusterAiAccessService.ts +1118 -451
- package/Server/Services/KubernetesClusterService.ts +129 -21
- package/Server/Services/ProjectService.ts +32 -0
- package/Server/Services/ProxmoxResourceService.ts +322 -5
- package/Server/Services/RunnerJobService.ts +241 -104
- package/Server/Services/RunnerService.ts +1 -1
- package/Server/Services/ScheduledMaintenanceService.ts +737 -1
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +414 -56
- package/Server/Services/TeamComplianceSettingService.ts +1125 -9
- package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +67 -9
- package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +39 -10
- package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +14 -3
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +37 -15
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +67 -24
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +48 -5
- package/Server/Utils/AI/SRE/IncidentPostmortemRunner.ts +40 -8
- package/Server/Utils/AI/SRE/InvestigationEligibility.ts +13 -2
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +1 -1
- package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +6 -1
- package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +133 -7
- package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +58 -4
- package/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.ts +447 -0
- package/Server/Utils/Telemetry/ProxmoxNativePush.ts +903 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +87 -27
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +684 -47
- package/Tests/App/AdminDashboard/RowActionPlacementOverrides.test.tsx +278 -0
- package/Tests/App/Dashboard/AIChatChartWidgetZoom.test.tsx +738 -0
- package/Tests/App/Dashboard/AIFeaturesSettingsPointers.test.tsx +147 -0
- package/Tests/App/Dashboard/AIInsightsKubernetesClusterPage.test.tsx +1523 -0
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +463 -3
- package/Tests/App/Dashboard/AffectedResourcesPickerDropdownPlacement.test.tsx +958 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +595 -0
- package/Tests/App/Dashboard/AskAiAvailability.test.ts +20 -3
- package/Tests/App/Dashboard/AskAiDisabled.test.tsx +8 -3
- package/Tests/App/Dashboard/CephRateChartReload.test.tsx +1456 -0
- package/Tests/App/Dashboard/CephTimeRangeZoom.test.tsx +1229 -0
- package/Tests/App/Dashboard/ChartCardTimeRangeZoom.test.tsx +151 -0
- package/Tests/App/Dashboard/ChartCardZoomAffordances.test.tsx +257 -0
- package/Tests/App/Dashboard/ChartRefetchFrame.test.tsx +141 -0
- package/Tests/App/Dashboard/ChartZoomHarness.tsx +249 -0
- package/Tests/App/Dashboard/ChartZoomStandIn.tsx +131 -0
- package/Tests/App/Dashboard/CloudServerlessSlowLoads.test.tsx +628 -0
- package/Tests/App/Dashboard/CloudServerlessTimeRangeZoom.test.tsx +607 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +91 -19
- package/Tests/App/Dashboard/CompanionMetricsTabZoom.test.tsx +632 -0
- package/Tests/App/Dashboard/ContainerChartZoomStandIn.tsx +195 -0
- package/Tests/App/Dashboard/ContainerHostOverviewSlowLoads.test.tsx +542 -0
- package/Tests/App/Dashboard/ContainerHostOverviewTimeRangeZoom.test.tsx +848 -0
- package/Tests/App/Dashboard/ContainerMetricsTimeRangeZoom.test.tsx +561 -0
- package/Tests/App/Dashboard/DashboardBoardWideZoomShell.test.tsx +1147 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +3 -2
- package/Tests/App/Dashboard/DashboardHistogramWidgetDragCursor.test.tsx +399 -0
- package/Tests/App/Dashboard/DashboardHistogramWidgetZoom.test.tsx +985 -0
- package/Tests/App/Dashboard/DashboardHistogramWidgetZoomHint.test.tsx +803 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +1 -0
- package/Tests/App/Dashboard/DashboardSettingsPreviewZoom.test.tsx +679 -0
- package/Tests/App/Dashboard/DashboardSloAndDataSourceChartZoom.test.tsx +881 -0
- package/Tests/App/Dashboard/DashboardTraceStatusWidgets.test.tsx +878 -0
- package/Tests/App/Dashboard/DatabaseMetricChartModalTimeRangeZoom.test.tsx +442 -0
- package/Tests/App/Dashboard/DatabaseOverviewTimeRangeZoom.test.tsx +831 -0
- package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +43 -0
- package/Tests/App/Dashboard/DockerSwarmInsightsTimeRangeZoom.test.tsx +524 -0
- package/Tests/App/Dashboard/DockerSwarmRateChartRefresh.test.tsx +259 -0
- package/Tests/App/Dashboard/EdgeDetailPanelHistory.test.tsx +763 -0
- package/Tests/App/Dashboard/EdgeDetailPanelTimeRangeZoom.test.tsx +547 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsCases.tsx +565 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsKathmandu.test.tsx +73 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsKolkata.test.tsx +74 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsNewYork.test.tsx +72 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsUtc.test.tsx +72 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardRefresh.test.tsx +310 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardTimeRangeZoom.test.tsx +536 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +3 -1
- package/Tests/App/Dashboard/EscalationRuleRowActions.test.tsx +660 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +2 -2
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +587 -13
- package/Tests/App/Dashboard/EventOverviewSnapshotExplorerZoom.test.tsx +1139 -0
- package/Tests/App/Dashboard/EventOverviewSnapshotZoomAcrossTabs.test.tsx +1057 -0
- package/Tests/App/Dashboard/EventOverviewTelemetrySnapshotZoom.test.tsx +757 -0
- package/Tests/App/Dashboard/ExceptionOccurrenceTrendZoom.test.tsx +675 -0
- package/Tests/App/Dashboard/ExceptionOccurrencesZoomSurvivesViewSwitch.test.tsx +405 -0
- package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +67 -3
- package/Tests/App/Dashboard/ExceptionTablesSpanStatus.test.tsx +515 -0
- package/Tests/App/Dashboard/ExplorerOwnZoomRegression.test.tsx +739 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisCases.tsx +461 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisKathmandu.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisKolkata.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisNewYork.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisUtc.test.tsx +24 -0
- package/Tests/App/Dashboard/FlowTopTalkersZoomRefetch.test.tsx +722 -0
- package/Tests/App/Dashboard/FlowViewportGuard.test.tsx +2526 -0
- package/Tests/App/Dashboard/HostPagesSlowLoads.test.tsx +872 -0
- package/Tests/App/Dashboard/HostPagesTimeRangeZoom.test.tsx +1208 -0
- package/Tests/App/Dashboard/IncidentRootCauseTimeRangeZoom.test.tsx +358 -0
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +100 -9
- package/Tests/App/Dashboard/InfrastructureMetricsTabTimeRangeZoom.test.tsx +485 -0
- package/Tests/App/Dashboard/InvestigationDrawerCompanionZoom.test.tsx +655 -0
- package/Tests/App/Dashboard/InvestigationDrawerZoom.test.tsx +830 -0
- package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +338 -2
- package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +454 -16
- package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +799 -819
- package/Tests/App/Dashboard/KubernetesClusterAiAgentOverviewCard.test.tsx +367 -0
- package/Tests/App/Dashboard/KubernetesClusterAiAgentStatus.test.ts +1202 -0
- package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +106 -0
- package/Tests/App/Dashboard/KubernetesClusterAiNavigation.test.tsx +354 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +1884 -2054
- package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +478 -179
- package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +50 -0
- package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +2 -1
- package/Tests/App/Dashboard/KubernetesClusterOverviewZoom.test.tsx +1217 -0
- package/Tests/App/Dashboard/KubernetesClusterPagesZoom.test.tsx +731 -0
- package/Tests/App/Dashboard/KubernetesCostsLoadRecovery.test.tsx +869 -0
- package/Tests/App/Dashboard/KubernetesCostsZoom.test.tsx +1214 -0
- package/Tests/App/Dashboard/KubernetesCostsZoomExactHours.test.tsx +692 -0
- package/Tests/App/Dashboard/KubernetesNetworkThroughputReload.test.tsx +902 -0
- package/Tests/App/Dashboard/KubernetesNetworkZoomBucketEdges.test.tsx +571 -0
- package/Tests/App/Dashboard/KubernetesOverviewZoomBucketEdges.test.tsx +697 -0
- package/Tests/App/Dashboard/KubernetesResourceMetricsTabZoom.test.tsx +633 -0
- package/Tests/App/Dashboard/LogsExplorerTimeRangeZoom.test.tsx +470 -0
- package/Tests/App/Dashboard/LogsInsightsTimeRangeZoom.test.tsx +948 -0
- package/Tests/App/Dashboard/LogsViewerPinnedWindowZoom.test.tsx +486 -0
- package/Tests/App/Dashboard/MetricChartsBucketInspectorDoubleClick.test.tsx +1001 -0
- package/Tests/App/Dashboard/MetricExplorerInvestigationAutoRefresh.test.tsx +514 -0
- package/Tests/App/Dashboard/MetricExplorerSavedViewZoomRoundTrip.test.tsx +581 -0
- package/Tests/App/Dashboard/MetricExplorerTimeRangeZoom.test.tsx +1162 -0
- package/Tests/App/Dashboard/MetricMonitorPreviewZoomLabel.test.ts +72 -0
- package/Tests/App/Dashboard/MetricRowSparklineTimeRangeZoom.test.tsx +204 -0
- package/Tests/App/Dashboard/MetricViewFirstResultLands.test.tsx +408 -0
- package/Tests/App/Dashboard/MetricViewOwnZoomResetPlacement.test.tsx +952 -0
- package/Tests/App/Dashboard/MetricViewTimeRange.test.ts +139 -0
- package/Tests/App/Dashboard/MetricViewTimeRangeZoom.test.tsx +556 -0
- package/Tests/App/Dashboard/MonitorMetricsChartWrappersZoom.test.tsx +552 -0
- package/Tests/App/Dashboard/MonitorMetricsTabsTimeRangeZoom.test.tsx +740 -0
- package/Tests/App/Dashboard/MonitorOverviewChartsTimeRangeZoom.test.tsx +735 -0
- package/Tests/App/Dashboard/MonitorStepPreviewsTimeRangeZoom.test.tsx +835 -0
- package/Tests/App/Dashboard/NetworkDeviceTimeRangeZoom.test.tsx +1115 -0
- package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +186 -17
- package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +155 -46
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +87 -2
- package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +884 -0
- package/Tests/App/Dashboard/ProxmoxNodeRemove.test.tsx +621 -0
- package/Tests/App/Dashboard/ProxmoxOverviewSlowLoads.test.tsx +584 -0
- package/Tests/App/Dashboard/ProxmoxPagesTimeRangeZoom.test.tsx +823 -0
- package/Tests/App/Dashboard/ProxmoxRateChartReload.test.tsx +1253 -0
- package/Tests/App/Dashboard/PublicDashboardBoardWideZoom.test.tsx +605 -0
- package/Tests/App/Dashboard/RealRowsLineChart.tsx +250 -0
- package/Tests/App/Dashboard/RechartsHostsPlotCursor.test.tsx +513 -0
- package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +865 -0
- package/Tests/App/Dashboard/RumOverviewTimeRangeZoom.test.tsx +877 -0
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +20 -4
- package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +296 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +146 -36
- package/Tests/App/Dashboard/ServiceDatabaseSlowLoads.test.tsx +1166 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +1243 -104
- package/Tests/App/Dashboard/ServiceOverviewTimeRangeZoom.test.tsx +792 -0
- package/Tests/App/Dashboard/SloBudgetBurnDownZoom.test.tsx +771 -0
- package/Tests/App/Dashboard/SloBudgetBurnDownZoomAffordances.test.tsx +380 -0
- package/Tests/App/Dashboard/SloEventMetricsBarChartZoom.test.tsx +369 -0
- package/Tests/App/Dashboard/SloHistoryChartsTimeRangeZoom.test.tsx +694 -0
- package/Tests/App/Dashboard/SloHistoryChartsZoomAffordances.test.tsx +497 -0
- package/Tests/App/Dashboard/SloMetricsTimeRangeZoom.test.tsx +541 -0
- package/Tests/App/Dashboard/SlowLoadHarness.ts +123 -0
- package/Tests/App/Dashboard/SnapshotExplorerPrimaryZoom.test.tsx +1194 -0
- package/Tests/App/Dashboard/SnapshotViewerPinnedWindow.test.tsx +620 -0
- package/Tests/App/Dashboard/TelemetrySnapshotPanelTimeRangeZoom.test.tsx +765 -0
- package/Tests/App/Dashboard/TelemetrySnapshotZoom.test.tsx +516 -0
- package/Tests/App/Dashboard/TelemetrySnapshotZoomAcrossTabs.test.tsx +827 -0
- package/Tests/App/Dashboard/TimeRangeZoomPageHarness.tsx +463 -0
- package/Tests/App/Dashboard/TraceChartEditorStatusSplit.test.tsx +543 -0
- package/Tests/App/Dashboard/TraceStatusPresentation.test.tsx +967 -0
- package/Tests/App/Dashboard/TraceTimelineMinimapZoom.test.tsx +315 -0
- package/Tests/App/Dashboard/TracesAnalyticsStatusSplit.test.tsx +778 -0
- package/Tests/App/Dashboard/TracesAnalyticsViewZoom.test.tsx +349 -0
- package/Tests/App/Dashboard/TracesExplorerTimeRangeZoom.test.tsx +551 -0
- package/Tests/App/Dashboard/TracesStatusChartAndFacet.test.tsx +687 -0
- package/Tests/App/Dashboard/TracesViewerStaleResponses.test.tsx +458 -0
- package/Tests/App/Dashboard/UptimeStripsExcludedFromZoom.test.tsx +406 -0
- package/Tests/App/Dashboard/VMwareOverviewSlowLoads.test.tsx +535 -0
- package/Tests/App/Dashboard/VMwarePagesTimeRangeZoom.test.tsx +606 -0
- package/Tests/App/Dashboard/ValueWidgetSparklineStaleHover.test.tsx +1292 -0
- package/Tests/App/Dashboard/ValueWidgetSparklineZoom.test.tsx +765 -0
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +98 -0
- package/Tests/Models/DatabaseModels/KubernetesAiAgentModel.test.ts +295 -0
- package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +347 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +58 -0
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +1 -1
- package/Tests/Server/API/AIInvestigationAPI.test.ts +123 -45
- package/Tests/Server/API/AutoRemediationApproveClusterRound.test.ts +1329 -0
- package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +25 -2
- package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPIAgent.test.ts +903 -0
- package/Tests/Server/API/MicrosoftTeamsChatsRefreshRoute.test.ts +667 -0
- package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +294 -6
- package/Tests/Server/API/ProxmoxResourceAPIRemoveNode.test.ts +1932 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +195 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesAiAgentAndAiDefaultsMigration.test.ts +623 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +87 -10
- package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleScopeMigration.test.ts +622 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +61 -4
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +98 -2
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +105 -2
- package/Tests/Server/Services/AIServiceBalanceBlocker.test.ts +282 -0
- package/Tests/Server/Services/AlertMonitorClearWritesNull.test.ts +409 -0
- package/Tests/Server/Services/AlertMonitorEditFeed.test.ts +474 -0
- package/Tests/Server/Services/AlertMonitorEditGuard.test.ts +610 -0
- package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +2 -0
- package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +2 -1
- package/Tests/Server/Services/IncidentAffectedMonitorsEdit.test.ts +1360 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +3 -1
- package/Tests/Server/Services/IncidentSeverityDeletePausesComplianceRules.test.ts +488 -0
- package/Tests/Server/Services/KubernetesAiAgentJobService.test.ts +329 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceHelpers.test.ts +618 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceLifecycle.test.ts +1444 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceRegister.test.ts +1666 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +140 -111
- package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +267 -105
- package/Tests/Server/Services/KubernetesClusterAiAccessLegacySuperseded.test.ts +440 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +567 -411
- package/Tests/Server/Services/KubernetesClusterAiAccessTarget.test.ts +1168 -0
- package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +410 -12
- package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +55 -0
- package/Tests/Server/Services/ProjectServiceNewProjectAiDefaults.test.ts +288 -0
- package/Tests/Server/Services/ProxmoxResourcePostgres.test.ts +5633 -0
- package/Tests/Server/Services/ProxmoxResourceService.test.ts +6458 -5
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +48 -15
- package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +620 -0
- package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +170 -3
- package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +72 -0
- package/Tests/Server/Services/RunnerServiceAgentName.test.ts +6 -4
- package/Tests/Server/Services/ScheduledMaintenanceAttachmentEdit.test.ts +2113 -0
- package/Tests/Server/Services/ScheduledMaintenanceMonitorRelease.test.ts +972 -0
- package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +2237 -0
- package/Tests/Server/Services/TeamComplianceSettingService.test.ts +3988 -138
- package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +107 -1
- package/Tests/Server/Utils/AI/IncidentPostmortemRunner.test.ts +351 -0
- package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +2 -0
- package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +310 -0
- package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +70 -0
- package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +58 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +125 -1
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +252 -3
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerProjectGates.test.ts +240 -0
- package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +2 -0
- package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +68 -0
- package/Tests/Server/Utils/Telemetry/InventoryMirrorPostgres.test.ts +370 -0
- package/Tests/Server/Utils/Telemetry/NetworkDeviceInventoryAttributes.test.ts +522 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +155 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.test.ts +8631 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxNativePush.test.ts +2852 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +367 -1
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +45 -3
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +25 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNames.test.ts +3119 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNamesPostgres.test.ts +1721 -0
- package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +581 -113
- package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +510 -0
- package/Tests/Types/Team/ComplianceRule.test.ts +1029 -0
- package/Tests/Types/Team/TeamComplianceStatus.test.ts +176 -0
- package/Tests/UI/Components/ActionButton/RowActions.test.tsx +641 -0
- package/Tests/UI/Components/ActionButton/RowActionsAccessibility.test.tsx +414 -0
- package/Tests/UI/Components/ActionButton/SplitActionButtons.test.ts +565 -0
- package/Tests/UI/Components/Charts/BarChartDragToSelect.test.tsx +386 -0
- package/Tests/UI/Components/Charts/ChartDoubleClickResetWithoutDblclick.test.tsx +1025 -0
- package/Tests/UI/Components/Charts/ChartGroupPageZoomHint.test.tsx +196 -0
- package/Tests/UI/Components/Charts/ChartPlaceholdersTakeDoubleClick.test.tsx +1861 -0
- package/Tests/UI/Components/Charts/ChartPlotClicksWhileResetArmed.test.tsx +382 -0
- package/Tests/UI/Components/Charts/ChartRangeSelection.test.tsx +704 -0
- package/Tests/UI/Components/Charts/ChartRangeSelectionDoubleClickReset.test.tsx +1481 -0
- package/Tests/UI/Components/Charts/ChartRangeSelectionRealRecharts.test.tsx +918 -0
- package/Tests/UI/Components/Charts/ChartRowBucketStart.test.ts +350 -0
- package/Tests/UI/Components/Charts/DoubleClickReset.test.tsx +996 -0
- package/Tests/UI/Components/Charts/HistogramDoubleClickResetRealRecharts.test.tsx +965 -0
- package/Tests/UI/Components/Charts/HistogramDriftThenRefetch.test.tsx +277 -0
- package/Tests/UI/Components/Charts/HistogramRangeSelectionDataChange.test.tsx +1757 -0
- package/Tests/UI/Components/Charts/HistogramRangeSelectionRealRecharts.test.tsx +560 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/ChartPageTimeRangeZoom.test.tsx +513 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.test.tsx +845 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.test.tsx +119 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHintTailwind.test.tsx +274 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.test.ts +433 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.test.tsx +863 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/ZoomDocsPromises.test.tsx +1147 -0
- package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +14 -3
- package/Tests/UI/Components/EntityDropdownEscape.test.tsx +454 -0
- package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +420 -0
- package/Tests/UI/Components/Forms/FormFieldDropdownDisabled.test.tsx +233 -0
- package/Tests/UI/Components/Input.test.tsx +80 -1
- package/Tests/UI/Components/LogsAnalyticsViewZoom.test.tsx +947 -0
- package/Tests/UI/Components/LogsHistogramDragTooltip.test.tsx +17 -5
- package/Tests/UI/Components/LogsViewerAnalyticsZoom.test.tsx +501 -0
- package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +6 -4
- package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +60 -8
- package/Tests/UI/Components/ModelTable/BaseModelTableRowActions.test.tsx +476 -0
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +7 -5
- package/Tests/UI/Components/MoreMenuPortal.test.tsx +623 -0
- package/Tests/UI/Components/StatusPage/ResourceGridActions.test.tsx +538 -0
- package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +14 -4
- package/Tests/UI/Components/TableCellWrapping.test.tsx +3 -3
- package/Tests/UI/Components/TableRowActions.test.tsx +472 -0
- package/Tests/UI/Components/TelemetryHistogramDragTooltip.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerZoomScope.test.tsx +470 -0
- package/Tests/UI/Components/TelemetryViewer/UseViewerTimeRangeZoom.test.tsx +571 -0
- package/Tests/UI/Components/TelemetryViewer/ViewerDoubleClickResetUnderDataChange.test.tsx +928 -0
- package/Tests/UI/Components/TelemetryViewer/ViewerFollowsEnclosingZoom.test.tsx +1569 -0
- package/Tests/UI/Components/Toggle.test.tsx +66 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardRefreshNames.test.tsx +1023 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +201 -0
- package/Tests/UI/Rum/FidelityNotices.test.ts +54 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +72 -0
- package/Tests/UI/Rum/ReplayFrameCapture.test.ts +1009 -9
- package/Tests/UI/Rum/ReplayRecordedAssets.test.ts +1069 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +913 -2
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +443 -8
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +439 -9
- package/Tests/UI/Rum/UserFlowTablesRowActions.test.tsx +501 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +47 -19
- package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +2 -0
- package/Tests/Utils/AiRemediation/KubernetesAiAgentPolicyCopyParity.test.ts +396 -0
- package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +104 -1
- package/Types/AI/AIRunType.ts +9 -4
- package/Types/AI/InvestigationNotStartedReason.ts +6 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +14 -16
- package/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.ts +28 -0
- package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +4 -2
- package/Types/Kubernetes/KubernetesClusterAiAccess.ts +263 -32
- package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +20 -16
- package/Types/Kubernetes/KubernetesClusterAiInsights.ts +81 -0
- package/Types/Monitor/ProxmoxAlertTemplates.ts +4 -4
- package/Types/Team/ComplianceNotificationChannel.ts +22 -0
- package/Types/Team/ComplianceRule.ts +434 -0
- package/Types/Team/ComplianceRuleType.ts +21 -0
- package/Types/Team/TeamComplianceStatus.ts +81 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +28 -0
- package/UI/Components/ActionButton/ActionButtonSchema.ts +21 -0
- package/UI/Components/ActionButton/RowActions.tsx +238 -0
- package/UI/Components/ActionButton/SplitActionButtons.ts +173 -0
- package/UI/Components/Charts/Area/AreaChart.tsx +32 -2
- package/UI/Components/Charts/Bar/BarChart.tsx +40 -3
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +37 -11
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +80 -243
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +122 -31
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +95 -244
- package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +214 -0
- package/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.ts +32 -0
- package/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.ts +599 -0
- package/UI/Components/Charts/Line/LineChart.tsx +32 -2
- package/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.tsx +70 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.tsx +226 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.tsx +73 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.ts +163 -0
- package/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.ts +215 -0
- package/UI/Components/Charts/Utils/DataPoint.ts +20 -8
- package/UI/Components/Charts/Utils/XAxis.ts +75 -0
- package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +493 -59
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +107 -11
- package/UI/Components/Forms/Fields/FormField.tsx +10 -0
- package/UI/Components/Input/Input.tsx +90 -57
- package/UI/Components/List/ListRow.tsx +8 -74
- package/UI/Components/LogsViewer/LogsViewer.tsx +40 -11
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +22 -6
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +209 -6
- package/UI/Components/LogsViewer/components/LogsHistogram.tsx +127 -84
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +3 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +12 -1
- package/UI/Components/MoreMenu/MoreMenu.tsx +365 -30
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +70 -17
- package/UI/Components/OrderedStatesList/Item.tsx +7 -72
- package/UI/Components/StatusPage/ResourceGrid.tsx +126 -77
- package/UI/Components/Table/TableBody.tsx +8 -2
- package/UI/Components/Table/TableRow.tsx +20 -140
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +41 -10
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +47 -9
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +25 -6
- package/UI/Components/TelemetryViewer/types.ts +2 -0
- package/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.ts +448 -0
- package/UI/Components/Toggle/Toggle.tsx +26 -0
- package/UI/Components/Tooltip/Tooltip.tsx +8 -1
- package/UI/Styles/Theme.css +14 -2
- package/Utils/AiRemediation/CommandPolicy.ts +1 -1
- package/Utils/AiRemediation/KubectlPolicy.ts +1 -1
- package/Utils/Dashboard/DashboardTimeRangeZoom.ts +46 -2
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js +385 -0
- package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js.map +1 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +3 -3
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +56 -5
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxResource.js +51 -1
- package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerJob.js +74 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +134 -3
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +6 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +17 -10
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +144 -24
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +436 -22
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +69 -13
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ProxmoxResourceAPI.js +187 -14
- package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +27 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js +84 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js +31 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +34 -19
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +59 -1
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +248 -13
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AlertSeverityService.js +51 -15
- package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +199 -72
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSeverityService.js +51 -15
- package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesAiAgentJobService.js +158 -0
- package/build/dist/Server/Services/KubernetesAiAgentJobService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesAiAgentService.js +1145 -0
- package/build/dist/Server/Services/KubernetesAiAgentService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +842 -371
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +86 -17
- package/build/dist/Server/Services/KubernetesClusterService.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/ProxmoxResourceService.js +258 -3
- package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -1
- package/build/dist/Server/Services/RunnerJobService.js +178 -92
- package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
- package/build/dist/Server/Services/RunnerService.js +1 -1
- package/build/dist/Server/Services/RunnerService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +535 -3
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +316 -46
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/TeamComplianceSettingService.js +833 -7
- package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +52 -9
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +13 -9
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +7 -3
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +29 -15
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +56 -20
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +39 -5
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js +30 -3
- package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +13 -2
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +1 -1
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +4 -2
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +111 -6
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +40 -4
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js +296 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js +699 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +77 -19
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +505 -42
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/AI/AIRunType.js +9 -4
- package/build/dist/Types/AI/AIRunType.js.map +1 -1
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +10 -16
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js +28 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +72 -16
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +20 -16
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js +17 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js.map +1 -0
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +4 -4
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
- package/build/dist/Types/Team/ComplianceNotificationChannel.js +23 -0
- package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -0
- package/build/dist/Types/Team/ComplianceRule.js +304 -0
- package/build/dist/Types/Team/ComplianceRule.js.map +1 -0
- package/build/dist/Types/Team/ComplianceRuleType.js +21 -0
- package/build/dist/Types/Team/ComplianceRuleType.js.map +1 -1
- package/build/dist/Types/Team/TeamComplianceStatus.js +2 -0
- package/build/dist/Types/Team/TeamComplianceStatus.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +25 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
- package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js +20 -1
- package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js.map +1 -1
- package/build/dist/UI/Components/ActionButton/RowActions.js +113 -0
- package/build/dist/UI/Components/ActionButton/RowActions.js.map +1 -0
- package/build/dist/UI/Components/ActionButton/SplitActionButtons.js +71 -0
- package/build/dist/UI/Components/ActionButton/SplitActionButtons.js.map +1 -0
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +16 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +16 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +27 -5
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +61 -194
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +84 -26
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +75 -196
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +133 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js +26 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js +371 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +16 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js +35 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js +107 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js +41 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js +117 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js +121 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -7
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +70 -0
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +305 -38
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +89 -14
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +11 -2
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +69 -54
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/List/ListRow.js +4 -39
- package/build/dist/UI/Components/List/ListRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +31 -8
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +10 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +139 -21
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +30 -8
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +10 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +253 -14
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +43 -13
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/Item.js +2 -38
- package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +53 -15
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
- package/build/dist/UI/Components/Table/TableBody.js +6 -2
- package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +12 -75
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +32 -7
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +27 -9
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +11 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js +272 -0
- package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js.map +1 -0
- package/build/dist/UI/Components/Toggle/Toggle.js +14 -1
- package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/Utils/AiRemediation/CommandPolicy.js +1 -1
- package/build/dist/Utils/AiRemediation/CommandPolicy.js.map +1 -1
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js +1 -1
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -1
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +27 -1
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,699 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ------------------------------------------------------------------
|
|
3
|
+
* Proxmox VE native OpenTelemetry push — translate to the pve_* model
|
|
4
|
+
* ------------------------------------------------------------------
|
|
5
|
+
*
|
|
6
|
+
* Proxmox VE 9+ can push metrics itself (Datacenter → Metric Server →
|
|
7
|
+
* OpenTelemetry, PVE::Status::OpenTelemetry in pve-manager). Everything
|
|
8
|
+
* OneUptime builds for Proxmox — cluster discovery, the node / guest /
|
|
9
|
+
* storage inventory, the overview charts, the metric catalog and the
|
|
10
|
+
* alert templates — is written against the shape the Proxmox Agent
|
|
11
|
+
* ships (prometheus-pve-exporter series): `pve_*` names, resource
|
|
12
|
+
* identity in one `id` datapoint label (`node/pve1`, `qemu/100`,
|
|
13
|
+
* `lxc/101`, `storage/pve1/local`) plus the `pve.scope` / `pve.type` /
|
|
14
|
+
* `pve.id` attributes the agent's transform derives from it, and the
|
|
15
|
+
* cluster in the `proxmox.cluster.name` resource attribute.
|
|
16
|
+
*
|
|
17
|
+
* The native push differs in more than the prefix, which is why a
|
|
18
|
+
* per-cluster "series prefix" setting could not make it work:
|
|
19
|
+
*
|
|
20
|
+
* - names follow the PVE status hash keys: `proxmox_node_cpustat_cpu`,
|
|
21
|
+
* `proxmox_vm_maxmem`, `proxmox_storage_used`, …;
|
|
22
|
+
* - identity is spread over `node` / `vmid` / `type` / `storage`
|
|
23
|
+
* datapoint attributes, with no `id`;
|
|
24
|
+
* - there is no up/info series — a guest's run state only shows as a
|
|
25
|
+
* non-zero uptime;
|
|
26
|
+
* - the resource carries `service.name=proxmox-ve` and
|
|
27
|
+
* `proxmox.cluster` (not `proxmox.cluster.name`), so batches were
|
|
28
|
+
* routed to a phantom "proxmox-ve" Service and no cluster appeared
|
|
29
|
+
* unless the user added a resource attribute by hand.
|
|
30
|
+
*
|
|
31
|
+
* So each native-push resource block is rewritten in place, before
|
|
32
|
+
* anything reads it: the cluster identity is filled in from what PVE
|
|
33
|
+
* already sends, and the pve_* series the product reads are derived and
|
|
34
|
+
* appended next to the originals. The original proxmox_* series are left
|
|
35
|
+
* untouched — they stay available in Metrics Explorer, and anything a
|
|
36
|
+
* user already built on them keeps working.
|
|
37
|
+
*
|
|
38
|
+
* What the native push does not carry (HA state, start-on-boot, backup
|
|
39
|
+
* coverage, replication) cannot be derived and is not invented here.
|
|
40
|
+
* The one thing a node cannot say about itself — that it is down — is
|
|
41
|
+
* said for it by the nodes still alive: see
|
|
42
|
+
* appendProxmoxSiblingReportsInPlace below and ProxmoxNativeNodeLiveness.
|
|
43
|
+
*/
|
|
44
|
+
// The service.name every PVE native push stamps on its resource.
|
|
45
|
+
export const PROXMOX_NATIVE_PUSH_SERVICE_NAME = "proxmox-ve";
|
|
46
|
+
/*
|
|
47
|
+
* `proxmox.cluster` value PVE falls back to when the node is not part of
|
|
48
|
+
* a cluster (PVE::Cluster::get_clinfo has no cluster name).
|
|
49
|
+
*/
|
|
50
|
+
export const PROXMOX_NATIVE_PUSH_STANDALONE_CLUSTER = "single-node";
|
|
51
|
+
/*
|
|
52
|
+
* Native series → canonical pve_* series. Counters are pushed with a
|
|
53
|
+
* `_total` suffix (PVE's _classify_metric_type); the bare spelling is
|
|
54
|
+
* accepted too so an older or future plugin revision still maps.
|
|
55
|
+
* pve-exporter reports the byte counters as gauges, so the derived
|
|
56
|
+
* series are gauges — that keeps the rate charts identical on both paths.
|
|
57
|
+
*/
|
|
58
|
+
const NODE_SERIES = new Map([
|
|
59
|
+
["proxmox_node_uptime", "pve_uptime_seconds"],
|
|
60
|
+
// read_proc_stat: `cpu` is already a 0..1 ratio across all cores.
|
|
61
|
+
["proxmox_node_cpustat_cpu", "pve_cpu_usage_ratio"],
|
|
62
|
+
["proxmox_node_cpustat_cpus", "pve_cpu_usage_limit"],
|
|
63
|
+
["proxmox_node_memory_memused", "pve_memory_usage_bytes"],
|
|
64
|
+
["proxmox_node_memory_memtotal", "pve_memory_size_bytes"],
|
|
65
|
+
// blockstat is df('/') in bytes — the node's root filesystem.
|
|
66
|
+
["proxmox_node_blockstat_used", "pve_disk_usage_bytes"],
|
|
67
|
+
["proxmox_node_blockstat_total", "pve_disk_size_bytes"],
|
|
68
|
+
]);
|
|
69
|
+
const GUEST_SERIES = new Map([
|
|
70
|
+
["proxmox_vm_uptime", "pve_uptime_seconds"],
|
|
71
|
+
// vmstatus: `cpu` is a 0..1 ratio of the guest's allocated vCPUs.
|
|
72
|
+
["proxmox_vm_cpu", "pve_cpu_usage_ratio"],
|
|
73
|
+
["proxmox_vm_cpus", "pve_cpu_usage_limit"],
|
|
74
|
+
["proxmox_vm_mem", "pve_memory_usage_bytes"],
|
|
75
|
+
["proxmox_vm_maxmem", "pve_memory_size_bytes"],
|
|
76
|
+
["proxmox_vm_disk", "pve_disk_usage_bytes"],
|
|
77
|
+
["proxmox_vm_maxdisk", "pve_disk_size_bytes"],
|
|
78
|
+
["proxmox_vm_netin_total", "pve_network_receive_bytes"],
|
|
79
|
+
["proxmox_vm_netin", "pve_network_receive_bytes"],
|
|
80
|
+
["proxmox_vm_netout_total", "pve_network_transmit_bytes"],
|
|
81
|
+
["proxmox_vm_netout", "pve_network_transmit_bytes"],
|
|
82
|
+
["proxmox_vm_diskread_total", "pve_disk_read_bytes"],
|
|
83
|
+
["proxmox_vm_diskread", "pve_disk_read_bytes"],
|
|
84
|
+
["proxmox_vm_diskwrite_total", "pve_disk_write_bytes"],
|
|
85
|
+
["proxmox_vm_diskwrite", "pve_disk_write_bytes"],
|
|
86
|
+
]);
|
|
87
|
+
const STORAGE_SERIES = new Map([
|
|
88
|
+
["proxmox_storage_used", "pve_disk_usage_bytes"],
|
|
89
|
+
["proxmox_storage_total", "pve_disk_size_bytes"],
|
|
90
|
+
/*
|
|
91
|
+
* pve-exporter reports a storage as up when PVE lists it available;
|
|
92
|
+
* the native push's `active` flag is the same signal.
|
|
93
|
+
*/
|
|
94
|
+
["proxmox_storage_active", "pve_up"],
|
|
95
|
+
]);
|
|
96
|
+
function scopeOfNativeSeries(metricName) {
|
|
97
|
+
if (NODE_SERIES.has(metricName)) {
|
|
98
|
+
return "node";
|
|
99
|
+
}
|
|
100
|
+
if (GUEST_SERIES.has(metricName)) {
|
|
101
|
+
return "guest";
|
|
102
|
+
}
|
|
103
|
+
if (STORAGE_SERIES.has(metricName)) {
|
|
104
|
+
return "storage";
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
function canonicalNameOf(metricName, scope) {
|
|
109
|
+
const table = scope === "node"
|
|
110
|
+
? NODE_SERIES
|
|
111
|
+
: scope === "guest"
|
|
112
|
+
? GUEST_SERIES
|
|
113
|
+
: STORAGE_SERIES;
|
|
114
|
+
return table.get(metricName);
|
|
115
|
+
}
|
|
116
|
+
function readAttributeString(attributes, key) {
|
|
117
|
+
var _a, _b;
|
|
118
|
+
if (!Array.isArray(attributes)) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
for (const attribute of attributes) {
|
|
122
|
+
const attr = attribute && typeof attribute === "object"
|
|
123
|
+
? attribute
|
|
124
|
+
: null;
|
|
125
|
+
if (!attr || attr["key"] !== key) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const value = attr["value"];
|
|
129
|
+
if (!value || typeof value !== "object") {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const raw = (_b = (_a = value["stringValue"]) !== null && _a !== void 0 ? _a : value["intValue"]) !== null && _b !== void 0 ? _b : value["doubleValue"];
|
|
133
|
+
if (typeof raw === "string" && raw.trim()) {
|
|
134
|
+
return raw.trim();
|
|
135
|
+
}
|
|
136
|
+
if (typeof raw === "number" && Number.isFinite(raw)) {
|
|
137
|
+
return String(raw);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
function stringAttribute(key, value) {
|
|
143
|
+
return { key, value: { stringValue: value } };
|
|
144
|
+
}
|
|
145
|
+
function readNumber(datapoint) {
|
|
146
|
+
var _a;
|
|
147
|
+
const raw = (_a = datapoint["asDouble"]) !== null && _a !== void 0 ? _a : datapoint["asInt"];
|
|
148
|
+
if (typeof raw === "number") {
|
|
149
|
+
return Number.isFinite(raw) ? raw : null;
|
|
150
|
+
}
|
|
151
|
+
if (typeof raw === "string" && raw.trim()) {
|
|
152
|
+
const parsed = Number(raw);
|
|
153
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
function metricDataPoints(metric) {
|
|
158
|
+
const gauge = metric["gauge"];
|
|
159
|
+
const sum = metric["sum"];
|
|
160
|
+
const points = (gauge && gauge["dataPoints"]) || (sum && sum["dataPoints"]) || [];
|
|
161
|
+
return Array.isArray(points) ? points : [];
|
|
162
|
+
}
|
|
163
|
+
/*
|
|
164
|
+
* True for a resource block pushed by Proxmox VE itself. PVE always
|
|
165
|
+
* stamps both `proxmox.cluster` and `proxmox.node`; neither is set by the
|
|
166
|
+
* Proxmox Agent (which uses `proxmox.cluster.name`), so the pair tells
|
|
167
|
+
* the two paths apart before and after the rewrite below.
|
|
168
|
+
*/
|
|
169
|
+
export function isProxmoxNativePushResource(resourceAttributes) {
|
|
170
|
+
return Boolean(readAttributeString(resourceAttributes, "proxmox.cluster") &&
|
|
171
|
+
readAttributeString(resourceAttributes, "proxmox.node"));
|
|
172
|
+
}
|
|
173
|
+
/*
|
|
174
|
+
* The cluster name a native push belongs to. An explicit
|
|
175
|
+
* `proxmox.cluster.name` (the old documented workaround, or a user's own
|
|
176
|
+
* choice) always wins, so existing clusters keep their identity. A
|
|
177
|
+
* standalone node reports the placeholder "single-node", which would
|
|
178
|
+
* merge every standalone host of a project into one cluster — the node
|
|
179
|
+
* name is used instead.
|
|
180
|
+
*/
|
|
181
|
+
export function resolveProxmoxNativePushClusterName(resourceAttributes) {
|
|
182
|
+
const explicit = readAttributeString(resourceAttributes, "proxmox.cluster.name");
|
|
183
|
+
if (explicit) {
|
|
184
|
+
return explicit;
|
|
185
|
+
}
|
|
186
|
+
const cluster = readAttributeString(resourceAttributes, "proxmox.cluster");
|
|
187
|
+
const node = readAttributeString(resourceAttributes, "proxmox.node");
|
|
188
|
+
if (cluster && cluster !== PROXMOX_NATIVE_PUSH_STANDALONE_CLUSTER) {
|
|
189
|
+
return cluster;
|
|
190
|
+
}
|
|
191
|
+
return node || cluster;
|
|
192
|
+
}
|
|
193
|
+
function identityOf(data) {
|
|
194
|
+
const node = readAttributeString(data.datapointAttributes, "node") || data.resourceNode;
|
|
195
|
+
if (data.scope === "node") {
|
|
196
|
+
if (!node) {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
id: `node/${node}`,
|
|
201
|
+
scope: "node",
|
|
202
|
+
type: "node",
|
|
203
|
+
labels: [stringAttribute("name", node)],
|
|
204
|
+
infoMetricName: "pve_node_info",
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
if (data.scope === "guest") {
|
|
208
|
+
const vmid = readAttributeString(data.datapointAttributes, "vmid");
|
|
209
|
+
const type = readAttributeString(data.datapointAttributes, "type");
|
|
210
|
+
if (!vmid || (type !== "qemu" && type !== "lxc")) {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
const labels = [stringAttribute("type", type)];
|
|
214
|
+
const name = readAttributeString(data.datapointAttributes, "name");
|
|
215
|
+
if (name) {
|
|
216
|
+
labels.push(stringAttribute("name", name));
|
|
217
|
+
}
|
|
218
|
+
if (node) {
|
|
219
|
+
labels.push(stringAttribute("node", node));
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
id: `${type}/${vmid}`,
|
|
223
|
+
scope: "guest",
|
|
224
|
+
type,
|
|
225
|
+
labels,
|
|
226
|
+
infoMetricName: "pve_guest_info",
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
const storage = readAttributeString(data.datapointAttributes, "storage");
|
|
230
|
+
if (!storage || !node) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
id: `storage/${node}/${storage}`,
|
|
235
|
+
scope: "storage",
|
|
236
|
+
type: "storage",
|
|
237
|
+
labels: [
|
|
238
|
+
stringAttribute("node", node),
|
|
239
|
+
stringAttribute("storage", storage),
|
|
240
|
+
],
|
|
241
|
+
infoMetricName: "pve_storage_info",
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// The attributes the agent's transform/pve-identity processor stamps.
|
|
245
|
+
function identityAttributes(identity) {
|
|
246
|
+
return [
|
|
247
|
+
stringAttribute("id", identity.id),
|
|
248
|
+
stringAttribute("pve.scope", identity.scope),
|
|
249
|
+
stringAttribute("pve.type", identity.type),
|
|
250
|
+
stringAttribute("pve.id", identity.id.substring(identity.id.indexOf("/") + 1)),
|
|
251
|
+
];
|
|
252
|
+
}
|
|
253
|
+
function gaugePoint(data) {
|
|
254
|
+
const point = {
|
|
255
|
+
[data.valueKey]: data.value,
|
|
256
|
+
attributes: data.attributes,
|
|
257
|
+
};
|
|
258
|
+
if (data.timeUnixNano !== undefined && data.timeUnixNano !== null) {
|
|
259
|
+
point["timeUnixNano"] = data.timeUnixNano;
|
|
260
|
+
}
|
|
261
|
+
return point;
|
|
262
|
+
}
|
|
263
|
+
/*
|
|
264
|
+
* Accumulates the derived datapoints of one resource block, keyed by
|
|
265
|
+
* canonical metric name, plus one info/up series per resource seen.
|
|
266
|
+
*/
|
|
267
|
+
class DerivedSeries {
|
|
268
|
+
constructor() {
|
|
269
|
+
this.points = new Map();
|
|
270
|
+
this.resourcesSeen = new Set();
|
|
271
|
+
// Timestamp of the first node seen — undefined when the block has none.
|
|
272
|
+
this.nodeTimeUnixNano = undefined;
|
|
273
|
+
}
|
|
274
|
+
add(metricName, point) {
|
|
275
|
+
let list = this.points.get(metricName);
|
|
276
|
+
if (!list) {
|
|
277
|
+
list = [];
|
|
278
|
+
this.points.set(metricName, list);
|
|
279
|
+
}
|
|
280
|
+
list.push(point);
|
|
281
|
+
}
|
|
282
|
+
// First sighting of a resource in this block → emit its info series.
|
|
283
|
+
markSeen(identity, timeUnixNano) {
|
|
284
|
+
const key = `${identity.scope}|${identity.id}`;
|
|
285
|
+
if (this.resourcesSeen.has(key)) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
this.resourcesSeen.add(key);
|
|
289
|
+
this.add(identity.infoMetricName, gaugePoint({
|
|
290
|
+
value: "1",
|
|
291
|
+
valueKey: "asInt",
|
|
292
|
+
timeUnixNano,
|
|
293
|
+
attributes: [...identityAttributes(identity), ...identity.labels],
|
|
294
|
+
}));
|
|
295
|
+
/*
|
|
296
|
+
* A node that pushes is up — pve-exporter reports its own view the
|
|
297
|
+
* same way. A node that is down pushes nothing at all; its live
|
|
298
|
+
* siblings report it (appendProxmoxSiblingReportsInPlace).
|
|
299
|
+
*/
|
|
300
|
+
if (identity.scope === "node") {
|
|
301
|
+
if (this.nodeTimeUnixNano === undefined) {
|
|
302
|
+
this.nodeTimeUnixNano = timeUnixNano !== null && timeUnixNano !== void 0 ? timeUnixNano : null;
|
|
303
|
+
}
|
|
304
|
+
this.add("pve_up", gaugePoint({
|
|
305
|
+
value: "1",
|
|
306
|
+
valueKey: "asInt",
|
|
307
|
+
timeUnixNano,
|
|
308
|
+
attributes: identityAttributes(identity),
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
hasAny() {
|
|
313
|
+
return this.points.size > 0;
|
|
314
|
+
}
|
|
315
|
+
toMetrics() {
|
|
316
|
+
const metrics = [];
|
|
317
|
+
for (const [name, dataPoints] of this.points) {
|
|
318
|
+
metrics.push({ name, gauge: { dataPoints } });
|
|
319
|
+
}
|
|
320
|
+
return metrics;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function blockAlreadyHasPveSeries(scopeMetrics) {
|
|
324
|
+
for (const scopeMetric of scopeMetrics) {
|
|
325
|
+
const metrics = scopeMetric === null || scopeMetric === void 0 ? void 0 : scopeMetric["metrics"];
|
|
326
|
+
if (!Array.isArray(metrics)) {
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
for (const metric of metrics) {
|
|
330
|
+
const name = metric === null || metric === void 0 ? void 0 : metric["name"];
|
|
331
|
+
if (typeof name === "string" && name.startsWith("pve_")) {
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
function upsertResourceAttribute(attributes, key, value) {
|
|
339
|
+
for (const attribute of attributes) {
|
|
340
|
+
const attr = attribute;
|
|
341
|
+
if (attr && attr["key"] === key) {
|
|
342
|
+
attr["value"] = { stringValue: value };
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
attributes.push(stringAttribute(key, value));
|
|
347
|
+
}
|
|
348
|
+
/*
|
|
349
|
+
* Drop the `service.name=proxmox-ve` PVE stamps, so the batch routes to
|
|
350
|
+
* the discovered Proxmox cluster (per-cluster retention, no phantom
|
|
351
|
+
* Service) exactly like the agent — whose collector config deletes
|
|
352
|
+
* service.name for the same reason. A service.name the user set to
|
|
353
|
+
* something else through the metric server's resource attributes is a
|
|
354
|
+
* deliberate choice and is kept.
|
|
355
|
+
*/
|
|
356
|
+
function removeNativeServiceName(attributes) {
|
|
357
|
+
for (let i = attributes.length - 1; i >= 0; i--) {
|
|
358
|
+
const attr = attributes[i];
|
|
359
|
+
if (attr &&
|
|
360
|
+
attr["key"] === "service.name" &&
|
|
361
|
+
readAttributeString([attr], "service.name") ===
|
|
362
|
+
PROXMOX_NATIVE_PUSH_SERVICE_NAME) {
|
|
363
|
+
attributes.splice(i, 1);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/*
|
|
368
|
+
* `service.version` is PVE's version_text(): "<version>/<repoid>", e.g.
|
|
369
|
+
* "9.0.10/deb1ca707ec72a89". pve-exporter reports them as the `version`
|
|
370
|
+
* and `repoid` labels of pve_version_info.
|
|
371
|
+
*/
|
|
372
|
+
function versionInfoLabels(resourceAttributes) {
|
|
373
|
+
const text = readAttributeString(resourceAttributes, "service.version");
|
|
374
|
+
if (!text) {
|
|
375
|
+
return [];
|
|
376
|
+
}
|
|
377
|
+
const slash = text.indexOf("/");
|
|
378
|
+
const version = (slash >= 0 ? text.substring(0, slash) : text).trim();
|
|
379
|
+
const repoid = slash >= 0 ? text.substring(slash + 1).trim() : "";
|
|
380
|
+
if (!version) {
|
|
381
|
+
return [];
|
|
382
|
+
}
|
|
383
|
+
const labels = [stringAttribute("version", version)];
|
|
384
|
+
if (repoid) {
|
|
385
|
+
labels.push(stringAttribute("repoid", repoid));
|
|
386
|
+
}
|
|
387
|
+
return labels;
|
|
388
|
+
}
|
|
389
|
+
/*
|
|
390
|
+
* Derive the pve_* series of one scopeMetrics entry and append them to
|
|
391
|
+
* it. Returns what was derived, for the version-info decision.
|
|
392
|
+
*/
|
|
393
|
+
function deriveScopeMetrics(data) {
|
|
394
|
+
const derived = new DerivedSeries();
|
|
395
|
+
const metrics = data.scopeMetric["metrics"];
|
|
396
|
+
if (!Array.isArray(metrics)) {
|
|
397
|
+
return derived;
|
|
398
|
+
}
|
|
399
|
+
for (const metricValue of metrics) {
|
|
400
|
+
const metric = metricValue && typeof metricValue === "object"
|
|
401
|
+
? metricValue
|
|
402
|
+
: null;
|
|
403
|
+
const metricName = metric === null || metric === void 0 ? void 0 : metric["name"];
|
|
404
|
+
if (!metric || typeof metricName !== "string") {
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
const scope = scopeOfNativeSeries(metricName);
|
|
408
|
+
if (!scope) {
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
const canonicalName = canonicalNameOf(metricName, scope);
|
|
412
|
+
for (const datapointValue of metricDataPoints(metric)) {
|
|
413
|
+
const datapoint = datapointValue && typeof datapointValue === "object"
|
|
414
|
+
? datapointValue
|
|
415
|
+
: null;
|
|
416
|
+
if (!datapoint) {
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
const value = readNumber(datapoint);
|
|
420
|
+
if (value === null) {
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
const identity = identityOf({
|
|
424
|
+
scope,
|
|
425
|
+
datapointAttributes: datapoint["attributes"],
|
|
426
|
+
resourceNode: data.resourceNode,
|
|
427
|
+
});
|
|
428
|
+
if (!identity) {
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
const timeUnixNano = datapoint["timeUnixNano"];
|
|
432
|
+
derived.markSeen(identity, timeUnixNano);
|
|
433
|
+
const hasDouble = datapoint["asDouble"] !== undefined && datapoint["asDouble"] !== null;
|
|
434
|
+
derived.add(canonicalName, gaugePoint({
|
|
435
|
+
value: hasDouble ? datapoint["asDouble"] : datapoint["asInt"],
|
|
436
|
+
valueKey: hasDouble ? "asDouble" : "asInt",
|
|
437
|
+
timeUnixNano,
|
|
438
|
+
attributes: identityAttributes(identity),
|
|
439
|
+
}));
|
|
440
|
+
/*
|
|
441
|
+
* PVE has no run-state series for guests; a running guest is the
|
|
442
|
+
* one with a non-zero uptime (vmstatus zeroes it when stopped).
|
|
443
|
+
* pve-exporter's pve_up is the same "status == running" signal.
|
|
444
|
+
*/
|
|
445
|
+
if (identity.scope === "guest" && metricName === "proxmox_vm_uptime") {
|
|
446
|
+
derived.add("pve_up", gaugePoint({
|
|
447
|
+
value: value > 0 ? "1" : "0",
|
|
448
|
+
valueKey: "asInt",
|
|
449
|
+
timeUnixNano,
|
|
450
|
+
attributes: identityAttributes(identity),
|
|
451
|
+
}));
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
return derived;
|
|
456
|
+
}
|
|
457
|
+
/*
|
|
458
|
+
* Rewrite every Proxmox VE native-push block of an OTLP metrics payload
|
|
459
|
+
* in place (see the header). Blocks from any other source — including
|
|
460
|
+
* the Proxmox Agent — are left exactly as they are. Idempotent: a block
|
|
461
|
+
* that already carries pve_* series (translated upstream, or already
|
|
462
|
+
* rewritten) only gets its cluster identity filled in.
|
|
463
|
+
*/
|
|
464
|
+
export function normalizeProxmoxNativePushInPlace(resourceEnvelopes) {
|
|
465
|
+
if (!Array.isArray(resourceEnvelopes)) {
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
for (const envelopeValue of resourceEnvelopes) {
|
|
469
|
+
const envelope = envelopeValue && typeof envelopeValue === "object"
|
|
470
|
+
? envelopeValue
|
|
471
|
+
: null;
|
|
472
|
+
const resource = envelope === null || envelope === void 0 ? void 0 : envelope["resource"];
|
|
473
|
+
const attributes = resource === null || resource === void 0 ? void 0 : resource["attributes"];
|
|
474
|
+
if (!envelope || !Array.isArray(attributes)) {
|
|
475
|
+
continue;
|
|
476
|
+
}
|
|
477
|
+
const resourceAttributes = attributes;
|
|
478
|
+
if (!isProxmoxNativePushResource(resourceAttributes)) {
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
const clusterName = resolveProxmoxNativePushClusterName(resourceAttributes);
|
|
482
|
+
if (clusterName) {
|
|
483
|
+
upsertResourceAttribute(resourceAttributes, "proxmox.cluster.name", clusterName);
|
|
484
|
+
}
|
|
485
|
+
removeNativeServiceName(resourceAttributes);
|
|
486
|
+
const scopeMetricsValue = envelope["scopeMetrics"];
|
|
487
|
+
if (!Array.isArray(scopeMetricsValue)) {
|
|
488
|
+
continue;
|
|
489
|
+
}
|
|
490
|
+
const scopeMetrics = scopeMetricsValue;
|
|
491
|
+
if (blockAlreadyHasPveSeries(scopeMetrics)) {
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
const resourceNode = readAttributeString(resourceAttributes, "proxmox.node");
|
|
495
|
+
for (const scopeMetricValue of scopeMetrics) {
|
|
496
|
+
if (!scopeMetricValue || typeof scopeMetricValue !== "object") {
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
const scopeMetric = scopeMetricValue;
|
|
500
|
+
const derived = deriveScopeMetrics({
|
|
501
|
+
scopeMetric,
|
|
502
|
+
resourceNode,
|
|
503
|
+
});
|
|
504
|
+
if (!derived.hasAny()) {
|
|
505
|
+
continue;
|
|
506
|
+
}
|
|
507
|
+
/*
|
|
508
|
+
* One version series per node push (PVE flushes node, qemu, lxc
|
|
509
|
+
* and storage status as separate requests) — the node's own push
|
|
510
|
+
* is the one that carries it.
|
|
511
|
+
*/
|
|
512
|
+
if (derived.nodeTimeUnixNano !== undefined) {
|
|
513
|
+
const labels = versionInfoLabels(resourceAttributes);
|
|
514
|
+
if (labels.length > 0) {
|
|
515
|
+
derived.add("pve_version_info", gaugePoint({
|
|
516
|
+
value: "1",
|
|
517
|
+
valueKey: "asInt",
|
|
518
|
+
timeUnixNano: derived.nodeTimeUnixNano,
|
|
519
|
+
attributes: labels,
|
|
520
|
+
}));
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
scopeMetric["metrics"].push(...derived.toMetrics());
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
/*
|
|
528
|
+
* ------------------------------------------------------------------
|
|
529
|
+
* Reporting the nodes that have stopped reporting
|
|
530
|
+
* ------------------------------------------------------------------
|
|
531
|
+
*
|
|
532
|
+
* A native-push node that dies goes quiet — nothing ever says pve_up = 0
|
|
533
|
+
* for it. The nodes still alive speak for it: a live node's own status
|
|
534
|
+
* push carries, next to its own pve_up = 1, a pve_up = 0 for every
|
|
535
|
+
* sibling that has gone quiet (ProxmoxNativeNodeLiveness decides which).
|
|
536
|
+
* That is what pve-exporter does for the agent — one node's view reports
|
|
537
|
+
* the dead ones — so the unchanged Node Offline and Cluster Quorum at
|
|
538
|
+
* Risk monitors now fire on a native push too.
|
|
539
|
+
*
|
|
540
|
+
* The reports sit in their own scopeMetrics entry, named
|
|
541
|
+
* PROXMOX_SIBLING_REPORT_SCOPE_NAME, and every datapoint carries
|
|
542
|
+
* `oneuptime.proxmox.inferred = not-reporting`, so they can always be
|
|
543
|
+
* told apart from what a node said itself. The inventory fold skips
|
|
544
|
+
* them: a report must never refresh the silent node's "last seen".
|
|
545
|
+
*
|
|
546
|
+
* Quorum at Risk is Σ pve_up ÷ Σ pve_node_info over every row of a
|
|
547
|
+
* minute, so each node must weigh the same in the denominator. Every
|
|
548
|
+
* live node contributes one pve_node_info = 1 per push, and every live
|
|
549
|
+
* node reports (ProxmoxNativeNodeLiveness): with L live nodes and D
|
|
550
|
+
* silent ones, each report carries pve_node_info = D ÷ L in total (split
|
|
551
|
+
* across the silent nodes). A minute in which the live nodes land P
|
|
552
|
+
* pushes between them then sums to P in the numerator and P + P·D/L in
|
|
553
|
+
* the denominator — the ratio is L ÷ (L + D), as with the agent, however
|
|
554
|
+
* unevenly the pushes fall into the minute. The weights are multiples of
|
|
555
|
+
* 2^-16, so any sum of them is exact in floating point, whatever order
|
|
556
|
+
* ClickHouse adds them in, and rounded UP, so a cluster exactly half
|
|
557
|
+
* down never reads a hair above 50 %.
|
|
558
|
+
* ------------------------------------------------------------------
|
|
559
|
+
*/
|
|
560
|
+
export const PROXMOX_SIBLING_REPORT_SCOPE_NAME = "oneuptime.proxmox.sibling-report";
|
|
561
|
+
// Marks every reported datapoint as inferred, not measured.
|
|
562
|
+
export const PROXMOX_INFERRED_ATTRIBUTE = "oneuptime.proxmox.inferred";
|
|
563
|
+
export const PROXMOX_INFERRED_NOT_REPORTING = "not-reporting";
|
|
564
|
+
const WEIGHT_UNITS_PER_NODE = 65536; // 2^16
|
|
565
|
+
export function isProxmoxSiblingReportScope(scopeMetric) {
|
|
566
|
+
const scope = scopeMetric && typeof scopeMetric === "object"
|
|
567
|
+
? scopeMetric["scope"]
|
|
568
|
+
: undefined;
|
|
569
|
+
return Boolean(scope &&
|
|
570
|
+
typeof scope === "object" &&
|
|
571
|
+
scope["name"] === PROXMOX_SIBLING_REPORT_SCOPE_NAME);
|
|
572
|
+
}
|
|
573
|
+
/*
|
|
574
|
+
* The node a native-push block is the own status push of, and the
|
|
575
|
+
* timestamps of its own pve_up points — or null for anything else
|
|
576
|
+
* (guest / storage pushes, agent blocks, other telemetry). Reads the
|
|
577
|
+
* block after normalizeProxmoxNativePushInPlace.
|
|
578
|
+
*/
|
|
579
|
+
export function readProxmoxNativeNodeStatus(envelope) {
|
|
580
|
+
var _a;
|
|
581
|
+
if (!envelope || typeof envelope !== "object") {
|
|
582
|
+
return null;
|
|
583
|
+
}
|
|
584
|
+
const resource = envelope["resource"];
|
|
585
|
+
const attributes = resource === null || resource === void 0 ? void 0 : resource["attributes"];
|
|
586
|
+
if (!isProxmoxNativePushResource(attributes)) {
|
|
587
|
+
return null;
|
|
588
|
+
}
|
|
589
|
+
const nodeName = readAttributeString(attributes, "proxmox.node");
|
|
590
|
+
const scopeMetrics = envelope["scopeMetrics"];
|
|
591
|
+
if (!nodeName || !Array.isArray(scopeMetrics)) {
|
|
592
|
+
return null;
|
|
593
|
+
}
|
|
594
|
+
const ownId = `node/${nodeName}`;
|
|
595
|
+
const timeUnixNanos = [];
|
|
596
|
+
for (const scopeMetric of scopeMetrics) {
|
|
597
|
+
if (isProxmoxSiblingReportScope(scopeMetric)) {
|
|
598
|
+
continue;
|
|
599
|
+
}
|
|
600
|
+
const metrics = scopeMetric === null || scopeMetric === void 0 ? void 0 : scopeMetric["metrics"];
|
|
601
|
+
if (!Array.isArray(metrics)) {
|
|
602
|
+
continue;
|
|
603
|
+
}
|
|
604
|
+
for (const metric of metrics) {
|
|
605
|
+
if ((metric === null || metric === void 0 ? void 0 : metric["name"]) !== "pve_up") {
|
|
606
|
+
continue;
|
|
607
|
+
}
|
|
608
|
+
for (const point of metricDataPoints(metric)) {
|
|
609
|
+
const datapoint = point && typeof point === "object" ? point : null;
|
|
610
|
+
if (datapoint &&
|
|
611
|
+
readAttributeString(datapoint["attributes"], "id") === ownId) {
|
|
612
|
+
timeUnixNanos.push((_a = datapoint["timeUnixNano"]) !== null && _a !== void 0 ? _a : null);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
return timeUnixNanos.length > 0 ? { nodeName, timeUnixNanos } : null;
|
|
618
|
+
}
|
|
619
|
+
/*
|
|
620
|
+
* Each silent node's pve_node_info weight in one report: D ÷ L in total,
|
|
621
|
+
* rounded up to whole 2^-16 units, split as evenly as possible (the first
|
|
622
|
+
* nodes in the given order take the remainder). With L = D the weights
|
|
623
|
+
* add up to exactly 1. Rounding up can only ever lower the ratio by a
|
|
624
|
+
* negligible amount — too little to take a cluster with more live than
|
|
625
|
+
* silent nodes down to 50 %.
|
|
626
|
+
*/
|
|
627
|
+
export function splitProxmoxSiblingInfoWeights(silentNodes, reporterCount) {
|
|
628
|
+
if (silentNodes.length === 0 || reporterCount < 1) {
|
|
629
|
+
return [];
|
|
630
|
+
}
|
|
631
|
+
const totalUnits = Math.ceil((silentNodes.length * WEIGHT_UNITS_PER_NODE) / reporterCount);
|
|
632
|
+
const baseUnits = Math.floor(totalUnits / silentNodes.length);
|
|
633
|
+
const remainder = totalUnits - baseUnits * silentNodes.length;
|
|
634
|
+
return silentNodes.map((nodeName, index) => {
|
|
635
|
+
return {
|
|
636
|
+
nodeName,
|
|
637
|
+
weight: (baseUnits + (index < remainder ? 1 : 0)) / WEIGHT_UNITS_PER_NODE,
|
|
638
|
+
};
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
/*
|
|
642
|
+
* Append the "not reporting" reports to a node's own status push: per
|
|
643
|
+
* own pve_up point, pve_up = 0 and a pve_node_info weight for every
|
|
644
|
+
* silent sibling, at that point's timestamp, with the exact labels the
|
|
645
|
+
* sibling's own push would carry. Idempotent.
|
|
646
|
+
*/
|
|
647
|
+
export function appendProxmoxSiblingReportsInPlace(envelope, report) {
|
|
648
|
+
const scopeMetrics = envelope["scopeMetrics"];
|
|
649
|
+
if (!Array.isArray(scopeMetrics) ||
|
|
650
|
+
report.silentNodes.length === 0 ||
|
|
651
|
+
report.timeUnixNanos.length === 0 ||
|
|
652
|
+
scopeMetrics.some((scopeMetric) => {
|
|
653
|
+
return isProxmoxSiblingReportScope(scopeMetric);
|
|
654
|
+
})) {
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
const upPoints = [];
|
|
658
|
+
const infoPoints = [];
|
|
659
|
+
const inferred = stringAttribute(PROXMOX_INFERRED_ATTRIBUTE, PROXMOX_INFERRED_NOT_REPORTING);
|
|
660
|
+
for (const { nodeName, weight } of splitProxmoxSiblingInfoWeights(report.silentNodes, report.reporterCount)) {
|
|
661
|
+
const identity = identityOf({
|
|
662
|
+
scope: "node",
|
|
663
|
+
datapointAttributes: [],
|
|
664
|
+
resourceNode: nodeName,
|
|
665
|
+
});
|
|
666
|
+
if (!identity) {
|
|
667
|
+
continue;
|
|
668
|
+
}
|
|
669
|
+
for (const timeUnixNano of report.timeUnixNanos) {
|
|
670
|
+
upPoints.push(gaugePoint({
|
|
671
|
+
value: "0",
|
|
672
|
+
valueKey: "asInt",
|
|
673
|
+
timeUnixNano,
|
|
674
|
+
attributes: [...identityAttributes(identity), inferred],
|
|
675
|
+
}));
|
|
676
|
+
infoPoints.push(gaugePoint({
|
|
677
|
+
value: weight,
|
|
678
|
+
valueKey: "asDouble",
|
|
679
|
+
timeUnixNano,
|
|
680
|
+
attributes: [
|
|
681
|
+
...identityAttributes(identity),
|
|
682
|
+
...identity.labels,
|
|
683
|
+
inferred,
|
|
684
|
+
],
|
|
685
|
+
}));
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
if (upPoints.length === 0) {
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
scopeMetrics.push({
|
|
692
|
+
scope: { name: PROXMOX_SIBLING_REPORT_SCOPE_NAME, version: "1" },
|
|
693
|
+
metrics: [
|
|
694
|
+
{ name: "pve_up", gauge: { dataPoints: upPoints } },
|
|
695
|
+
{ name: "pve_node_info", gauge: { dataPoints: infoPoints } },
|
|
696
|
+
],
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
//# sourceMappingURL=ProxmoxNativePush.js.map
|