@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
|
@@ -4,6 +4,7 @@ import React, {
|
|
|
4
4
|
useCallback,
|
|
5
5
|
useEffect,
|
|
6
6
|
useMemo,
|
|
7
|
+
useRef,
|
|
7
8
|
useState,
|
|
8
9
|
} from "react";
|
|
9
10
|
import {
|
|
@@ -16,6 +17,7 @@ import {
|
|
|
16
17
|
CartesianGrid,
|
|
17
18
|
AreaChart,
|
|
18
19
|
Area,
|
|
20
|
+
ReferenceArea,
|
|
19
21
|
} from "recharts";
|
|
20
22
|
import RangeStartAndEndDateTime, {
|
|
21
23
|
RangeStartAndEndDateTimeUtil,
|
|
@@ -44,6 +46,15 @@ import {
|
|
|
44
46
|
getAnalyticsSeriesLabel,
|
|
45
47
|
LogsEntityResolutionRequest,
|
|
46
48
|
} from "../LogsEntityNames";
|
|
49
|
+
import useHistogramRangeSelection, {
|
|
50
|
+
HistogramRangeSelectionState,
|
|
51
|
+
} from "../../Charts/Utils/useHistogramRangeSelection";
|
|
52
|
+
import {
|
|
53
|
+
ChartTimeRangeZoomContextValue,
|
|
54
|
+
ChartTimeRangeZoomHandlers,
|
|
55
|
+
resolveChartTimeRangeZoom,
|
|
56
|
+
useChartTimeRangeZoom,
|
|
57
|
+
} from "../../Charts/TimeRangeZoom/TimeRangeZoomContext";
|
|
47
58
|
|
|
48
59
|
type AnalyticsChartType = "timeseries" | "toplist" | "table";
|
|
49
60
|
type AnalyticsAggregation = "count" | "unique";
|
|
@@ -74,8 +85,21 @@ export interface LogsAnalyticsViewProps {
|
|
|
74
85
|
sessionIds?: Array<string> | undefined;
|
|
75
86
|
appliedFacetFilters: Map<string, Set<string>>;
|
|
76
87
|
logAttributes: Array<string>;
|
|
88
|
+
/*
|
|
89
|
+
* Drag-to-zoom for the timeseries chart. Without these the chart zooms
|
|
90
|
+
* whatever the enclosing viewer offers (the logs viewer hands it the same
|
|
91
|
+
* zoom its volume histogram uses), so a drag here retimes the viewer.
|
|
92
|
+
*/
|
|
93
|
+
onTimeRangeSelect?: ((startTime: Date, endTime: Date) => void) | undefined;
|
|
94
|
+
// Set only while there is a zoom to undo: it holds single clicks open.
|
|
95
|
+
onTimeRangeReset?: (() => void) | undefined;
|
|
77
96
|
}
|
|
78
97
|
|
|
98
|
+
export const LOGS_ANALYTICS_TIMESERIES_TEST_ID: string =
|
|
99
|
+
"logs-analytics-timeseries";
|
|
100
|
+
export const LOGS_ANALYTICS_ZOOM_HINT_TEST_ID: string =
|
|
101
|
+
"logs-analytics-zoom-hint";
|
|
102
|
+
|
|
79
103
|
const CHART_COLORS: Array<string> = [
|
|
80
104
|
"#6366f1", // indigo
|
|
81
105
|
"#ec4899", // pink
|
|
@@ -330,6 +354,15 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
330
354
|
const [timeseriesData, setTimeseriesData] = useState<
|
|
331
355
|
Array<AnalyticsTimeseriesRow>
|
|
332
356
|
>([]);
|
|
357
|
+
/*
|
|
358
|
+
* How much time one timeseries bucket covers, as the request that
|
|
359
|
+
* produced the rows on screen bucketed them. Kept next to the rows so a
|
|
360
|
+
* refetch in flight cannot pair these bars with another window's width;
|
|
361
|
+
* it is what lets a click on one bar zoom into that bar.
|
|
362
|
+
*/
|
|
363
|
+
const [timeseriesBucketMs, setTimeseriesBucketMs] = useState<
|
|
364
|
+
number | undefined
|
|
365
|
+
>(undefined);
|
|
333
366
|
const [topListData, setTopListData] = useState<Array<AnalyticsTopItem>>([]);
|
|
334
367
|
const [tableData, setTableData] = useState<Array<AnalyticsTableRow>>([]);
|
|
335
368
|
/*
|
|
@@ -341,6 +374,15 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
341
374
|
[],
|
|
342
375
|
);
|
|
343
376
|
|
|
377
|
+
/*
|
|
378
|
+
* Staleness guard. A zoom, its reset and the picker can change the window
|
|
379
|
+
* faster than an analytics request returns, and a wide window answers
|
|
380
|
+
* slower than a narrow one: without a sequence check the older response
|
|
381
|
+
* lands last and paints the window the reader just left under the one
|
|
382
|
+
* the picker, the list and the histogram show.
|
|
383
|
+
*/
|
|
384
|
+
const requestSequenceRef: React.MutableRefObject<number> = useRef<number>(0);
|
|
385
|
+
|
|
344
386
|
const allDimensionOptions: Array<{ value: string; label: string }> =
|
|
345
387
|
useMemo(() => {
|
|
346
388
|
const attributeOptions: Array<{ value: string; label: string }> =
|
|
@@ -359,6 +401,11 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
359
401
|
|
|
360
402
|
const fetchAnalytics: () => Promise<void> =
|
|
361
403
|
useCallback(async (): Promise<void> => {
|
|
404
|
+
const requestSequence: number = ++requestSequenceRef.current;
|
|
405
|
+
const isStale: () => boolean = (): boolean => {
|
|
406
|
+
return requestSequence !== requestSequenceRef.current;
|
|
407
|
+
};
|
|
408
|
+
|
|
362
409
|
try {
|
|
363
410
|
setIsLoading(true);
|
|
364
411
|
|
|
@@ -367,13 +414,17 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
367
414
|
|
|
368
415
|
const startTime: Date = dateRange.startValue;
|
|
369
416
|
const endTime: Date = dateRange.endValue;
|
|
417
|
+
const bucketSizeInMinutes: number = computeDefaultBucketSize(
|
|
418
|
+
startTime,
|
|
419
|
+
endTime,
|
|
420
|
+
);
|
|
370
421
|
|
|
371
422
|
const requestData: JSONObject = {
|
|
372
423
|
chartType,
|
|
373
424
|
aggregation,
|
|
374
425
|
startTime: startTime.toISOString(),
|
|
375
426
|
endTime: endTime.toISOString(),
|
|
376
|
-
bucketSizeInMinutes:
|
|
427
|
+
bucketSizeInMinutes: bucketSizeInMinutes,
|
|
377
428
|
} as JSONObject;
|
|
378
429
|
|
|
379
430
|
const requestGroupBy: Array<string> =
|
|
@@ -473,24 +524,42 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
473
524
|
throw response;
|
|
474
525
|
}
|
|
475
526
|
|
|
527
|
+
/*
|
|
528
|
+
* Superseded: drop it whole, labels included - a stale group-by
|
|
529
|
+
* would relabel the newer rows.
|
|
530
|
+
*/
|
|
531
|
+
if (isStale()) {
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
|
|
476
535
|
const data: unknown = response.data["data"] || [];
|
|
477
536
|
|
|
478
537
|
setResultGroupByFields(requestGroupBy);
|
|
479
538
|
|
|
480
539
|
if (chartType === "timeseries") {
|
|
481
540
|
setTimeseriesData(data as Array<AnalyticsTimeseriesRow>);
|
|
541
|
+
setTimeseriesBucketMs(bucketSizeInMinutes * 60 * 1000);
|
|
482
542
|
} else if (chartType === "toplist") {
|
|
483
543
|
setTopListData(data as Array<AnalyticsTopItem>);
|
|
484
544
|
} else {
|
|
485
545
|
setTableData(data as Array<AnalyticsTableRow>);
|
|
486
546
|
}
|
|
487
547
|
} catch {
|
|
548
|
+
// A late failure of a superseded request must not blank newer data.
|
|
549
|
+
if (isStale()) {
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
|
|
488
553
|
// Silently degrade
|
|
489
554
|
setTimeseriesData([]);
|
|
555
|
+
setTimeseriesBucketMs(undefined);
|
|
490
556
|
setTopListData([]);
|
|
491
557
|
setTableData([]);
|
|
492
558
|
} finally {
|
|
493
|
-
|
|
559
|
+
// Only the latest request may take the loader down.
|
|
560
|
+
if (!isStale()) {
|
|
561
|
+
setIsLoading(false);
|
|
562
|
+
}
|
|
494
563
|
}
|
|
495
564
|
}, [
|
|
496
565
|
chartType,
|
|
@@ -537,6 +606,43 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
537
606
|
return pivotTimeseriesData(timeseriesData, entityNameMap);
|
|
538
607
|
}, [timeseriesData, entityNameMap]);
|
|
539
608
|
|
|
609
|
+
/*
|
|
610
|
+
* Only the timeseries has a time axis: a window dragged across a top
|
|
611
|
+
* list or a table would not be a time range. Handlers the host passes win
|
|
612
|
+
* over the zoom the enclosing viewer offers.
|
|
613
|
+
*/
|
|
614
|
+
const pageZoom: ChartTimeRangeZoomContextValue | null =
|
|
615
|
+
useChartTimeRangeZoom();
|
|
616
|
+
const zoomHandlers: ChartTimeRangeZoomHandlers = resolveChartTimeRangeZoom({
|
|
617
|
+
onTimeRangeSelect: props.onTimeRangeSelect,
|
|
618
|
+
onTimeRangeReset: props.onTimeRangeReset,
|
|
619
|
+
isTimeAxis: chartType === "timeseries",
|
|
620
|
+
pageZoom: pageZoom,
|
|
621
|
+
});
|
|
622
|
+
|
|
623
|
+
/*
|
|
624
|
+
* The same click-or-drag selection the volume histogram above uses, over
|
|
625
|
+
* the same bucket-start labels: a drag zooms into every bucket it covered,
|
|
626
|
+
* a click into one bucket, and a double-click zooms back out.
|
|
627
|
+
*/
|
|
628
|
+
const selection: HistogramRangeSelectionState = useHistogramRangeSelection({
|
|
629
|
+
onTimeRangeSelect: zoomHandlers.onTimeRangeSelect,
|
|
630
|
+
onZoomOut: zoomHandlers.onTimeRangeReset,
|
|
631
|
+
bucketIntervalMs: timeseriesBucketMs,
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
const canZoom: boolean = Boolean(zoomHandlers.onTimeRangeSelect);
|
|
635
|
+
|
|
636
|
+
/*
|
|
637
|
+
* The crosshair goes on the chart root itself: recharts sets an inline
|
|
638
|
+
* `cursor: default` on the .recharts-wrapper that fills the plot, so a
|
|
639
|
+
* cursor on any element around it never shows over the chart. Left off
|
|
640
|
+
* entirely when nothing can be dragged, so recharts keeps its default.
|
|
641
|
+
*/
|
|
642
|
+
const chartRootCursorProps: { style?: React.CSSProperties } = canZoom
|
|
643
|
+
? { style: { cursor: "crosshair" } }
|
|
644
|
+
: {};
|
|
645
|
+
|
|
540
646
|
const renderSelectControl: (
|
|
541
647
|
label: string,
|
|
542
648
|
value: string | number,
|
|
@@ -682,9 +788,29 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
682
788
|
);
|
|
683
789
|
};
|
|
684
790
|
|
|
791
|
+
const renderZoomHint: () => ReactElement | null = (): ReactElement | null => {
|
|
792
|
+
if (!canZoom) {
|
|
793
|
+
return null;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
return (
|
|
797
|
+
<span
|
|
798
|
+
className="ml-auto shrink-0 whitespace-nowrap text-[10px] text-gray-400"
|
|
799
|
+
data-testid={LOGS_ANALYTICS_ZOOM_HINT_TEST_ID}
|
|
800
|
+
>
|
|
801
|
+
{selection.canClickToZoom ? "Click or drag to zoom" : "Drag to zoom"}
|
|
802
|
+
{zoomHandlers.onTimeRangeReset ? " · double-click to reset" : ""}
|
|
803
|
+
</span>
|
|
804
|
+
);
|
|
805
|
+
};
|
|
806
|
+
|
|
685
807
|
const renderLegend: () => ReactElement = (): ReactElement => {
|
|
686
808
|
if (seriesKeys.length <= 1) {
|
|
687
|
-
return
|
|
809
|
+
return canZoom ? (
|
|
810
|
+
<div className="flex items-center px-5 pb-2">{renderZoomHint()}</div>
|
|
811
|
+
) : (
|
|
812
|
+
<></>
|
|
813
|
+
);
|
|
688
814
|
}
|
|
689
815
|
|
|
690
816
|
return (
|
|
@@ -704,13 +830,58 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
704
830
|
</div>
|
|
705
831
|
);
|
|
706
832
|
})}
|
|
833
|
+
{renderZoomHint()}
|
|
707
834
|
</div>
|
|
708
835
|
);
|
|
709
836
|
};
|
|
710
837
|
|
|
838
|
+
/*
|
|
839
|
+
* The band a drag paints across the buckets it covers, in the same colours
|
|
840
|
+
* the volume histogram uses.
|
|
841
|
+
*/
|
|
842
|
+
const renderSelectionBand: () => ReactElement | null =
|
|
843
|
+
(): ReactElement | null => {
|
|
844
|
+
if (!selection.selectionStart || !selection.selectionEnd) {
|
|
845
|
+
return null;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
return (
|
|
849
|
+
<ReferenceArea
|
|
850
|
+
x1={selection.selectionStart}
|
|
851
|
+
x2={selection.selectionEnd}
|
|
852
|
+
fill="rgba(99,102,241,0.12)"
|
|
853
|
+
stroke="rgba(99,102,241,0.5)"
|
|
854
|
+
strokeWidth={1}
|
|
855
|
+
radius={2}
|
|
856
|
+
/>
|
|
857
|
+
);
|
|
858
|
+
};
|
|
859
|
+
|
|
860
|
+
/*
|
|
861
|
+
* The tooltip is pinned shut for the length of a drag: it would otherwise
|
|
862
|
+
* sit over the very buckets the reader is picking. Dropping the prop hands
|
|
863
|
+
* control back to recharts once the drag ends.
|
|
864
|
+
*/
|
|
865
|
+
const tooltipDragProps: { active?: boolean } = selection.isDragging
|
|
866
|
+
? { active: false }
|
|
867
|
+
: {};
|
|
868
|
+
|
|
711
869
|
const renderTimeseries: () => ReactElement = (): ReactElement => {
|
|
712
870
|
if (pivotedData.length === 0) {
|
|
713
|
-
|
|
871
|
+
/*
|
|
872
|
+
* A zoom into a quiet stretch lands here, with no chart left to
|
|
873
|
+
* double-click; the empty area takes the double-click instead, so the
|
|
874
|
+
* way back is where the reader's pointer already is. select-none: a
|
|
875
|
+
* double-click on the message would otherwise also select a word.
|
|
876
|
+
*/
|
|
877
|
+
return (
|
|
878
|
+
<div
|
|
879
|
+
className="select-none"
|
|
880
|
+
onDoubleClick={zoomHandlers.onTimeRangeReset}
|
|
881
|
+
>
|
|
882
|
+
{renderEmptyState()}
|
|
883
|
+
</div>
|
|
884
|
+
);
|
|
714
885
|
}
|
|
715
886
|
|
|
716
887
|
const useAreaChart: boolean = seriesKeys.length === 1;
|
|
@@ -718,12 +889,25 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
718
889
|
return (
|
|
719
890
|
<div className="px-2 pt-4 pb-2">
|
|
720
891
|
{renderLegend()}
|
|
721
|
-
<div
|
|
892
|
+
<div
|
|
893
|
+
className="select-none"
|
|
894
|
+
style={{
|
|
895
|
+
height: 320,
|
|
896
|
+
cursor: canZoom ? "crosshair" : "default",
|
|
897
|
+
}}
|
|
898
|
+
data-testid={LOGS_ANALYTICS_TIMESERIES_TEST_ID}
|
|
899
|
+
onDoubleClick={selection.onDoubleClick}
|
|
900
|
+
>
|
|
722
901
|
<ResponsiveContainer width="100%" height="100%">
|
|
723
902
|
{useAreaChart ? (
|
|
724
903
|
<AreaChart
|
|
725
904
|
data={pivotedData}
|
|
726
905
|
margin={{ top: 8, right: 20, bottom: 4, left: 0 }}
|
|
906
|
+
onMouseDown={selection.onMouseDown}
|
|
907
|
+
{...selection.chartRootProps}
|
|
908
|
+
onMouseMove={selection.onMouseMove}
|
|
909
|
+
onMouseUp={selection.onMouseUp}
|
|
910
|
+
{...chartRootCursorProps}
|
|
727
911
|
>
|
|
728
912
|
<defs>
|
|
729
913
|
<linearGradient
|
|
@@ -781,6 +965,7 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
781
965
|
strokeWidth: 1,
|
|
782
966
|
strokeDasharray: "4 4",
|
|
783
967
|
}}
|
|
968
|
+
{...tooltipDragProps}
|
|
784
969
|
/>
|
|
785
970
|
<Area
|
|
786
971
|
dataKey={seriesKeys[0] || "count"}
|
|
@@ -796,6 +981,7 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
796
981
|
}}
|
|
797
982
|
isAnimationActive={false}
|
|
798
983
|
/>
|
|
984
|
+
{renderSelectionBand()}
|
|
799
985
|
</AreaChart>
|
|
800
986
|
) : (
|
|
801
987
|
<BarChart
|
|
@@ -803,6 +989,11 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
803
989
|
margin={{ top: 8, right: 20, bottom: 4, left: 0 }}
|
|
804
990
|
barCategoryGap="20%"
|
|
805
991
|
barGap={0}
|
|
992
|
+
onMouseDown={selection.onMouseDown}
|
|
993
|
+
{...selection.chartRootProps}
|
|
994
|
+
onMouseMove={selection.onMouseMove}
|
|
995
|
+
onMouseUp={selection.onMouseUp}
|
|
996
|
+
{...chartRootCursorProps}
|
|
806
997
|
>
|
|
807
998
|
<CartesianGrid
|
|
808
999
|
strokeDasharray="none"
|
|
@@ -836,6 +1027,7 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
836
1027
|
<Tooltip
|
|
837
1028
|
content={<AnalyticsTooltip seriesLabels={seriesLabels} />}
|
|
838
1029
|
cursor={{ fill: "rgba(99,102,241,0.04)" }}
|
|
1030
|
+
{...tooltipDragProps}
|
|
839
1031
|
/>
|
|
840
1032
|
{seriesKeys.map((key: string, index: number) => {
|
|
841
1033
|
return (
|
|
@@ -854,6 +1046,7 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
854
1046
|
/>
|
|
855
1047
|
);
|
|
856
1048
|
})}
|
|
1049
|
+
{renderSelectionBand()}
|
|
857
1050
|
</BarChart>
|
|
858
1051
|
)}
|
|
859
1052
|
</ResponsiveContainer>
|
|
@@ -1069,8 +1262,18 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
|
|
|
1069
1262
|
|
|
1070
1263
|
const renderChart: () => ReactElement = (): ReactElement => {
|
|
1071
1264
|
if (isLoading) {
|
|
1265
|
+
/*
|
|
1266
|
+
* A zoom refetches, and until the new window lands the loader stands
|
|
1267
|
+
* where the timeseries was - just when a reader double-clicks to undo
|
|
1268
|
+
* the zoom (issue #4116). It takes that double-click as the chart
|
|
1269
|
+
* does, even when the chart replaces it mid-double-click (see
|
|
1270
|
+
* placeholderProps).
|
|
1271
|
+
*/
|
|
1072
1272
|
return (
|
|
1073
|
-
<div
|
|
1273
|
+
<div
|
|
1274
|
+
className="flex h-72 select-none items-center justify-center"
|
|
1275
|
+
{...(chartType === "timeseries" ? selection.placeholderProps : {})}
|
|
1276
|
+
>
|
|
1074
1277
|
<ComponentLoader />
|
|
1075
1278
|
</div>
|
|
1076
1279
|
);
|
|
@@ -95,6 +95,15 @@ const LogsHistogram: FunctionComponent<LogsHistogramProps> = (
|
|
|
95
95
|
bucketIntervalMs: props.bucketIntervalMs,
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
+
/*
|
|
99
|
+
* The crosshair goes on the chart root itself: recharts sets an inline
|
|
100
|
+
* `cursor: default` on the .recharts-wrapper that fills the plot, so the
|
|
101
|
+
* cursor on the box around it never shows over the bars. Left off
|
|
102
|
+
* entirely when nothing can be dragged, so recharts keeps its default.
|
|
103
|
+
*/
|
|
104
|
+
const chartRootCursorProps: { style?: React.CSSProperties } =
|
|
105
|
+
props.onTimeRangeSelect ? { style: { cursor: "crosshair" } } : {};
|
|
106
|
+
|
|
98
107
|
const pivotedData: Array<PivotedRow> = useMemo(() => {
|
|
99
108
|
return pivotBuckets(props.buckets);
|
|
100
109
|
}, [props.buckets]);
|
|
@@ -111,15 +120,32 @@ const LogsHistogram: FunctionComponent<LogsHistogramProps> = (
|
|
|
111
120
|
});
|
|
112
121
|
}, [props.buckets]);
|
|
113
122
|
|
|
114
|
-
|
|
123
|
+
/*
|
|
124
|
+
* The loader and the empty box below stand where the bars were, and take
|
|
125
|
+
* the double-click as the bars do: right after a zoom, while its window
|
|
126
|
+
* loads or when it holds nothing, is exactly when a reader double-clicks
|
|
127
|
+
* to go back (issue #4116), and the bars can replace them in the middle
|
|
128
|
+
* of that double-click (see placeholderProps). select-none: a
|
|
129
|
+
* double-click on the message would otherwise also select a word. A
|
|
130
|
+
* zoomed chart keeps its card while it loads (below), so the way back
|
|
131
|
+
* stays in the same place.
|
|
132
|
+
*/
|
|
133
|
+
if (props.isLoading && pivotedData.length === 0 && !props.onZoomOut) {
|
|
115
134
|
return (
|
|
116
|
-
<div
|
|
135
|
+
<div
|
|
136
|
+
className="flex h-32 select-none items-center justify-center rounded-lg border border-gray-200 bg-white"
|
|
137
|
+
{...selection.placeholderProps}
|
|
138
|
+
>
|
|
117
139
|
<ComponentLoader />
|
|
118
140
|
</div>
|
|
119
141
|
);
|
|
120
142
|
}
|
|
121
143
|
|
|
122
|
-
|
|
144
|
+
/*
|
|
145
|
+
* A window with no logs has nothing to chart - unless a zoom brought the
|
|
146
|
+
* reader there: then the card stays, and its empty box is the way back.
|
|
147
|
+
*/
|
|
148
|
+
if (pivotedData.length === 0 && !props.onZoomOut) {
|
|
123
149
|
return <></>;
|
|
124
150
|
}
|
|
125
151
|
|
|
@@ -129,7 +155,7 @@ const LogsHistogram: FunctionComponent<LogsHistogramProps> = (
|
|
|
129
155
|
<div className="flex items-center justify-between border-b border-gray-100 px-4 py-2">
|
|
130
156
|
<div className="flex items-center gap-2">
|
|
131
157
|
<span className="text-xs font-medium text-gray-500">Log Volume</span>
|
|
132
|
-
{props.onTimeRangeSelect && (
|
|
158
|
+
{props.onTimeRangeSelect && pivotedData.length > 0 && (
|
|
133
159
|
<span className="text-[10px] text-gray-300">
|
|
134
160
|
{selection.canClickToZoom
|
|
135
161
|
? "Click or drag to zoom"
|
|
@@ -138,7 +164,7 @@ const LogsHistogram: FunctionComponent<LogsHistogramProps> = (
|
|
|
138
164
|
)}
|
|
139
165
|
{props.onZoomOut && (
|
|
140
166
|
<span className="text-[10px] text-gray-300">
|
|
141
|
-
Double-click to
|
|
167
|
+
Double-click to reset
|
|
142
168
|
</span>
|
|
143
169
|
)}
|
|
144
170
|
</div>
|
|
@@ -158,87 +184,104 @@ const LogsHistogram: FunctionComponent<LogsHistogramProps> = (
|
|
|
158
184
|
</div>
|
|
159
185
|
</div>
|
|
160
186
|
|
|
187
|
+
{pivotedData.length === 0 && (
|
|
188
|
+
<div
|
|
189
|
+
className="flex h-[120px] select-none items-center justify-center text-xs text-gray-400"
|
|
190
|
+
{...selection.placeholderProps}
|
|
191
|
+
>
|
|
192
|
+
{props.isLoading ? (
|
|
193
|
+
<ComponentLoader />
|
|
194
|
+
) : (
|
|
195
|
+
"No logs in the selected range"
|
|
196
|
+
)}
|
|
197
|
+
</div>
|
|
198
|
+
)}
|
|
199
|
+
|
|
161
200
|
{/* Chart */}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
<
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
fontSize: 10,
|
|
196
|
-
fill: "var(--ou-chart-tick, #9ca3af)",
|
|
197
|
-
}}
|
|
198
|
-
axisLine={false}
|
|
199
|
-
tickLine={false}
|
|
200
|
-
width={48}
|
|
201
|
-
allowDecimals={false}
|
|
202
|
-
tickFormatter={formatYAxisTick}
|
|
203
|
-
/>
|
|
204
|
-
{/*
|
|
205
|
-
* The tooltip is pinned shut for the length of a drag: it would
|
|
206
|
-
* otherwise sit over the very bars the reader is trying to read
|
|
207
|
-
* while they pick the range. Dropping the prop hands control back
|
|
208
|
-
* to recharts once the drag ends.
|
|
209
|
-
*/}
|
|
210
|
-
<Tooltip
|
|
211
|
-
content={<HistogramTooltip />}
|
|
212
|
-
cursor={{ fill: "rgba(99,102,241,0.06)" }}
|
|
213
|
-
{...(selection.isDragging ? { active: false } : {})}
|
|
214
|
-
/>
|
|
215
|
-
{activeSeverities.map((severity: string, index: number) => {
|
|
216
|
-
const isLast: boolean = index === activeSeverities.length - 1;
|
|
217
|
-
return (
|
|
218
|
-
<Bar
|
|
219
|
-
key={severity}
|
|
220
|
-
dataKey={severity}
|
|
221
|
-
stackId="severity"
|
|
222
|
-
fill={getSeverityColor(severity).fill}
|
|
223
|
-
radius={isLast ? [1.5, 1.5, 0, 0] : [0, 0, 0, 0]}
|
|
224
|
-
isAnimationActive={false}
|
|
225
|
-
maxBarSize={24}
|
|
226
|
-
/>
|
|
227
|
-
);
|
|
228
|
-
})}
|
|
229
|
-
{selection.selectionStart && selection.selectionEnd && (
|
|
230
|
-
<ReferenceArea
|
|
231
|
-
x1={selection.selectionStart}
|
|
232
|
-
x2={selection.selectionEnd}
|
|
233
|
-
fill="rgba(99,102,241,0.12)"
|
|
234
|
-
stroke="rgba(99,102,241,0.5)"
|
|
235
|
-
strokeWidth={1}
|
|
236
|
-
radius={2}
|
|
201
|
+
{pivotedData.length > 0 && (
|
|
202
|
+
<div
|
|
203
|
+
className="select-none px-2 pb-1 pt-2"
|
|
204
|
+
style={{
|
|
205
|
+
height: 120,
|
|
206
|
+
cursor: props.onTimeRangeSelect ? "crosshair" : "default",
|
|
207
|
+
}}
|
|
208
|
+
onDoubleClick={selection.onDoubleClick}
|
|
209
|
+
>
|
|
210
|
+
<ResponsiveContainer width="100%" height="100%">
|
|
211
|
+
<BarChart
|
|
212
|
+
data={pivotedData}
|
|
213
|
+
margin={{ top: 4, right: 8, bottom: 0, left: -4 }}
|
|
214
|
+
onMouseDown={selection.onMouseDown}
|
|
215
|
+
{...selection.chartRootProps}
|
|
216
|
+
onMouseMove={selection.onMouseMove}
|
|
217
|
+
onMouseUp={selection.onMouseUp}
|
|
218
|
+
barCategoryGap="15%"
|
|
219
|
+
barGap={0}
|
|
220
|
+
{...chartRootCursorProps}
|
|
221
|
+
>
|
|
222
|
+
<XAxis
|
|
223
|
+
dataKey="time"
|
|
224
|
+
tickFormatter={formatTickTime}
|
|
225
|
+
tick={{
|
|
226
|
+
fontSize: 10,
|
|
227
|
+
fill: "var(--ou-chart-tick, #9ca3af)",
|
|
228
|
+
}}
|
|
229
|
+
axisLine={{ stroke: "var(--ou-chart-grid, #e5e7eb)" }}
|
|
230
|
+
tickLine={false}
|
|
231
|
+
minTickGap={40}
|
|
232
|
+
dy={4}
|
|
233
|
+
interval="preserveStartEnd"
|
|
237
234
|
/>
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
235
|
+
<YAxis
|
|
236
|
+
tick={{
|
|
237
|
+
fontSize: 10,
|
|
238
|
+
fill: "var(--ou-chart-tick, #9ca3af)",
|
|
239
|
+
}}
|
|
240
|
+
axisLine={false}
|
|
241
|
+
tickLine={false}
|
|
242
|
+
width={48}
|
|
243
|
+
allowDecimals={false}
|
|
244
|
+
tickFormatter={formatYAxisTick}
|
|
245
|
+
/>
|
|
246
|
+
{/*
|
|
247
|
+
* The tooltip is pinned shut for the length of a drag: it would
|
|
248
|
+
* otherwise sit over the very bars the reader is trying to read
|
|
249
|
+
* while they pick the range. Dropping the prop hands control back
|
|
250
|
+
* to recharts once the drag ends.
|
|
251
|
+
*/}
|
|
252
|
+
<Tooltip
|
|
253
|
+
content={<HistogramTooltip />}
|
|
254
|
+
cursor={{ fill: "rgba(99,102,241,0.06)" }}
|
|
255
|
+
{...(selection.isDragging ? { active: false } : {})}
|
|
256
|
+
/>
|
|
257
|
+
{activeSeverities.map((severity: string, index: number) => {
|
|
258
|
+
const isLast: boolean = index === activeSeverities.length - 1;
|
|
259
|
+
return (
|
|
260
|
+
<Bar
|
|
261
|
+
key={severity}
|
|
262
|
+
dataKey={severity}
|
|
263
|
+
stackId="severity"
|
|
264
|
+
fill={getSeverityColor(severity).fill}
|
|
265
|
+
radius={isLast ? [1.5, 1.5, 0, 0] : [0, 0, 0, 0]}
|
|
266
|
+
isAnimationActive={false}
|
|
267
|
+
maxBarSize={24}
|
|
268
|
+
/>
|
|
269
|
+
);
|
|
270
|
+
})}
|
|
271
|
+
{selection.selectionStart && selection.selectionEnd && (
|
|
272
|
+
<ReferenceArea
|
|
273
|
+
x1={selection.selectionStart}
|
|
274
|
+
x2={selection.selectionEnd}
|
|
275
|
+
fill="rgba(99,102,241,0.12)"
|
|
276
|
+
stroke="rgba(99,102,241,0.5)"
|
|
277
|
+
strokeWidth={1}
|
|
278
|
+
radius={2}
|
|
279
|
+
/>
|
|
280
|
+
)}
|
|
281
|
+
</BarChart>
|
|
282
|
+
</ResponsiveContainer>
|
|
283
|
+
</div>
|
|
284
|
+
)}
|
|
242
285
|
</div>
|
|
243
286
|
);
|
|
244
287
|
};
|
|
@@ -25,6 +25,8 @@ export interface LogsViewerToolbarProps {
|
|
|
25
25
|
liveOptions?: LiveLogsOptions;
|
|
26
26
|
timeRange?: RangeStartAndEndDateTime;
|
|
27
27
|
onTimeRangeChange?: (value: RangeStartAndEndDateTime) => void;
|
|
28
|
+
// Whether the picker offers "Reset zoom"; see LogTimeRangePicker.
|
|
29
|
+
showResetZoom?: boolean | undefined;
|
|
28
30
|
onCreateSavedView?: (() => void) | undefined;
|
|
29
31
|
savedViews?: Array<LogsSavedViewOption> | undefined;
|
|
30
32
|
selectedSavedViewId?: string | null | undefined;
|
|
@@ -355,6 +357,7 @@ const LogsViewerToolbar: FunctionComponent<LogsViewerToolbarProps> = (
|
|
|
355
357
|
<LogTimeRangePicker
|
|
356
358
|
value={props.timeRange}
|
|
357
359
|
onChange={props.onTimeRangeChange}
|
|
360
|
+
showResetZoom={props.showResetZoom}
|
|
358
361
|
/>
|
|
359
362
|
)}
|
|
360
363
|
|
|
@@ -25,7 +25,9 @@ import PermissionGate, {
|
|
|
25
25
|
} from "../../Utils/PermissionGate";
|
|
26
26
|
import ProjectUtil from "../../Utils/Project";
|
|
27
27
|
import User from "../../Utils/User";
|
|
28
|
-
import ActionButtonSchema
|
|
28
|
+
import ActionButtonSchema, {
|
|
29
|
+
ActionButtonPlacement,
|
|
30
|
+
} from "../ActionButton/ActionButtonSchema";
|
|
29
31
|
import {
|
|
30
32
|
BulkActionButtonSchema,
|
|
31
33
|
BulkActionFailed,
|
|
@@ -2830,6 +2832,8 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2830
2832
|
title: tx("Show ID"),
|
|
2831
2833
|
buttonStyleType: ButtonStyleType.OUTLINE,
|
|
2832
2834
|
hideOnMobile: true,
|
|
2835
|
+
// A utility every row carries - it belongs in the ⋯ menu, not on the row.
|
|
2836
|
+
placement: ActionButtonPlacement.MoreMenu,
|
|
2833
2837
|
onClick: async (
|
|
2834
2838
|
item: TBaseModel,
|
|
2835
2839
|
onCompleteAction: VoidFunction,
|
|
@@ -2863,6 +2867,13 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2863
2867
|
? tx(props.viewButtonText)
|
|
2864
2868
|
: `${tx("View")} ${tx(props.singularName || model.singularName || "")}`,
|
|
2865
2869
|
buttonStyleType: ButtonStyleType.NORMAL,
|
|
2870
|
+
/*
|
|
2871
|
+
* Opening the record is what a row is for, so View is the row's one
|
|
2872
|
+
* button and Edit, Delete and the rest go in the ⋯ menu beside it.
|
|
2873
|
+
* Custom actions are listed ahead of View, so a table that wants one
|
|
2874
|
+
* of its own on the row can still mark it Primary.
|
|
2875
|
+
*/
|
|
2876
|
+
placement: ActionButtonPlacement.Primary,
|
|
2866
2877
|
onClick: async (
|
|
2867
2878
|
item: TBaseModel,
|
|
2868
2879
|
onCompleteAction: VoidFunction,
|