@marinoscar/platform-web 0.0.0-stage → 0.1.0-next.3
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/CHANGELOG.md +42 -0
- package/LICENSE +21 -0
- package/README.md +96 -2
- package/dist/core/api-client.d.ts +112 -0
- package/dist/core/api-client.d.ts.map +1 -0
- package/dist/core/api-client.js +24 -0
- package/dist/core/api-client.js.map +1 -0
- package/dist/core/host.d.ts +74 -0
- package/dist/core/host.d.ts.map +1 -0
- package/dist/core/host.js +84 -0
- package/dist/core/host.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/settings-page.d.ts +47 -0
- package/dist/core/settings-page.d.ts.map +1 -0
- package/dist/core/settings-page.js +5 -0
- package/dist/core/settings-page.js.map +1 -0
- package/dist/core/viewer.d.ts +14 -0
- package/dist/core/viewer.d.ts.map +1 -0
- package/dist/core/viewer.js +4 -0
- package/dist/core/viewer.js.map +1 -0
- package/dist/doctor/headless/categories.d.ts +31 -0
- package/dist/doctor/headless/categories.d.ts.map +1 -0
- package/dist/doctor/headless/categories.js +41 -0
- package/dist/doctor/headless/categories.js.map +1 -0
- package/dist/doctor/headless/client.d.ts +33 -0
- package/dist/doctor/headless/client.d.ts.map +1 -0
- package/dist/doctor/headless/client.js +31 -0
- package/dist/doctor/headless/client.js.map +1 -0
- package/dist/doctor/headless/contract.d.ts +18 -0
- package/dist/doctor/headless/contract.d.ts.map +1 -0
- package/dist/doctor/headless/contract.js +15 -0
- package/dist/doctor/headless/contract.js.map +1 -0
- package/dist/doctor/headless/index.d.ts +12 -0
- package/dist/doctor/headless/index.d.ts.map +1 -0
- package/dist/doctor/headless/index.js +8 -0
- package/dist/doctor/headless/index.js.map +1 -0
- package/dist/doctor/headless/use-doctor.d.ts +36 -0
- package/dist/doctor/headless/use-doctor.d.ts.map +1 -0
- package/dist/doctor/headless/use-doctor.js +80 -0
- package/dist/doctor/headless/use-doctor.js.map +1 -0
- package/dist/doctor/headless/use-support-bundle-download.d.ts +68 -0
- package/dist/doctor/headless/use-support-bundle-download.d.ts.map +1 -0
- package/dist/doctor/headless/use-support-bundle-download.js +135 -0
- package/dist/doctor/headless/use-support-bundle-download.js.map +1 -0
- package/dist/doctor/internal/relative-time.d.ts +2 -0
- package/dist/doctor/internal/relative-time.d.ts.map +1 -0
- package/dist/doctor/internal/relative-time.js +29 -0
- package/dist/doctor/internal/relative-time.js.map +1 -0
- package/dist/doctor/internal/status-colors.d.ts +5 -0
- package/dist/doctor/internal/status-colors.d.ts.map +1 -0
- package/dist/doctor/internal/status-colors.js +29 -0
- package/dist/doctor/internal/status-colors.js.map +1 -0
- package/dist/doctor/internal/use-is-mounted.d.ts +2 -0
- package/dist/doctor/internal/use-is-mounted.d.ts.map +1 -0
- package/dist/doctor/internal/use-is-mounted.js +15 -0
- package/dist/doctor/internal/use-is-mounted.js.map +1 -0
- package/dist/doctor/ui/check-row.d.ts +54 -0
- package/dist/doctor/ui/check-row.d.ts.map +1 -0
- package/dist/doctor/ui/check-row.js +100 -0
- package/dist/doctor/ui/check-row.js.map +1 -0
- package/dist/doctor/ui/copy.d.ts +3 -0
- package/dist/doctor/ui/copy.d.ts.map +1 -0
- package/dist/doctor/ui/copy.js +6 -0
- package/dist/doctor/ui/copy.js.map +1 -0
- package/dist/doctor/ui/doctor-page.d.ts +50 -0
- package/dist/doctor/ui/doctor-page.d.ts.map +1 -0
- package/dist/doctor/ui/doctor-page.js +152 -0
- package/dist/doctor/ui/doctor-page.js.map +1 -0
- package/dist/doctor/ui/index.d.ts +8 -0
- package/dist/doctor/ui/index.d.ts.map +1 -0
- package/dist/doctor/ui/index.js +7 -0
- package/dist/doctor/ui/index.js.map +1 -0
- package/dist/doctor/ui/settings-page.d.ts +20 -0
- package/dist/doctor/ui/settings-page.d.ts.map +1 -0
- package/dist/doctor/ui/settings-page.js +32 -0
- package/dist/doctor/ui/settings-page.js.map +1 -0
- package/dist/doctor/ui/support-bundle-button.d.ts +37 -0
- package/dist/doctor/ui/support-bundle-button.d.ts.map +1 -0
- package/dist/doctor/ui/support-bundle-button.js +39 -0
- package/dist/doctor/ui/support-bundle-button.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/telemetry/headless/adapters/TelemetryWebAdapters.d.ts +106 -0
- package/dist/telemetry/headless/adapters/TelemetryWebAdapters.d.ts.map +1 -0
- package/dist/telemetry/headless/adapters/TelemetryWebAdapters.js +58 -0
- package/dist/telemetry/headless/adapters/TelemetryWebAdapters.js.map +1 -0
- package/dist/telemetry/headless/context/TelemetryConfigProvider.d.ts +43 -0
- package/dist/telemetry/headless/context/TelemetryConfigProvider.d.ts.map +1 -0
- package/dist/telemetry/headless/context/TelemetryConfigProvider.js +24 -0
- package/dist/telemetry/headless/context/TelemetryConfigProvider.js.map +1 -0
- package/dist/telemetry/headless/context/telemetryConfig.d.ts +68 -0
- package/dist/telemetry/headless/context/telemetryConfig.d.ts.map +1 -0
- package/dist/telemetry/headless/context/telemetryConfig.js +119 -0
- package/dist/telemetry/headless/context/telemetryConfig.js.map +1 -0
- package/dist/telemetry/headless/guards/RequireTelemetryEnabled.d.ts +35 -0
- package/dist/telemetry/headless/guards/RequireTelemetryEnabled.d.ts.map +1 -0
- package/dist/telemetry/headless/guards/RequireTelemetryEnabled.js +44 -0
- package/dist/telemetry/headless/guards/RequireTelemetryEnabled.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAdmin.d.ts +40 -0
- package/dist/telemetry/headless/hooks/useTelemetryAdmin.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAdmin.js +111 -0
- package/dist/telemetry/headless/hooks/useTelemetryAdmin.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistant.d.ts +120 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistant.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistant.js +185 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistant.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.d.ts +12 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.js +36 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryConnection.d.ts +46 -0
- package/dist/telemetry/headless/hooks/useTelemetryConnection.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryConnection.js +133 -0
- package/dist/telemetry/headless/hooks/useTelemetryConnection.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts +147 -0
- package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryDashboard.js +231 -0
- package/dist/telemetry/headless/hooks/useTelemetryDashboard.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryExplorer.d.ts +95 -0
- package/dist/telemetry/headless/hooks/useTelemetryExplorer.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryExplorer.js +197 -0
- package/dist/telemetry/headless/hooks/useTelemetryExplorer.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryStack.d.ts +69 -0
- package/dist/telemetry/headless/hooks/useTelemetryStack.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryStack.js +129 -0
- package/dist/telemetry/headless/hooks/useTelemetryStack.js.map +1 -0
- package/dist/telemetry/headless/index.d.ts +34 -0
- package/dist/telemetry/headless/index.d.ts.map +1 -0
- package/dist/telemetry/headless/index.js +34 -0
- package/dist/telemetry/headless/index.js.map +1 -0
- package/dist/telemetry/headless/lib/assistantExport.d.ts +12 -0
- package/dist/telemetry/headless/lib/assistantExport.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/assistantExport.js +116 -0
- package/dist/telemetry/headless/lib/assistantExport.js.map +1 -0
- package/dist/telemetry/headless/lib/dashboard/assistantPrompt.d.ts +91 -0
- package/dist/telemetry/headless/lib/dashboard/assistantPrompt.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/dashboard/assistantPrompt.js +246 -0
- package/dist/telemetry/headless/lib/dashboard/assistantPrompt.js.map +1 -0
- package/dist/telemetry/headless/lib/dashboardState.d.ts +58 -0
- package/dist/telemetry/headless/lib/dashboardState.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/dashboardState.js +153 -0
- package/dist/telemetry/headless/lib/dashboardState.js.map +1 -0
- package/dist/telemetry/headless/lib/explorerHandoff.d.ts +62 -0
- package/dist/telemetry/headless/lib/explorerHandoff.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/explorerHandoff.js +77 -0
- package/dist/telemetry/headless/lib/explorerHandoff.js.map +1 -0
- package/dist/telemetry/headless/lib/format.d.ts +113 -0
- package/dist/telemetry/headless/lib/format.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/format.js +280 -0
- package/dist/telemetry/headless/lib/format.js.map +1 -0
- package/dist/telemetry/headless/lib/metrics/metricSections.d.ts +44 -0
- package/dist/telemetry/headless/lib/metrics/metricSections.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/metrics/metricSections.js +61 -0
- package/dist/telemetry/headless/lib/metrics/metricSections.js.map +1 -0
- package/dist/telemetry/headless/lib/metrics/topNPreference.d.ts +15 -0
- package/dist/telemetry/headless/lib/metrics/topNPreference.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/metrics/topNPreference.js +33 -0
- package/dist/telemetry/headless/lib/metrics/topNPreference.js.map +1 -0
- package/dist/telemetry/headless/lib/queryHistory.d.ts +20 -0
- package/dist/telemetry/headless/lib/queryHistory.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/queryHistory.js +53 -0
- package/dist/telemetry/headless/lib/queryHistory.js.map +1 -0
- package/dist/telemetry/headless/lib/starterQueries.d.ts +48 -0
- package/dist/telemetry/headless/lib/starterQueries.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/starterQueries.js +84 -0
- package/dist/telemetry/headless/lib/starterQueries.js.map +1 -0
- package/dist/telemetry/headless/lib/traceLink.d.ts +26 -0
- package/dist/telemetry/headless/lib/traceLink.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/traceLink.js +32 -0
- package/dist/telemetry/headless/lib/traceLink.js.map +1 -0
- package/dist/telemetry/headless/lib/unknownRoutes.d.ts +23 -0
- package/dist/telemetry/headless/lib/unknownRoutes.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/unknownRoutes.js +35 -0
- package/dist/telemetry/headless/lib/unknownRoutes.js.map +1 -0
- package/dist/telemetry/headless/services/client.d.ts +144 -0
- package/dist/telemetry/headless/services/client.d.ts.map +1 -0
- package/dist/telemetry/headless/services/client.js +144 -0
- package/dist/telemetry/headless/services/client.js.map +1 -0
- package/dist/telemetry/headless/services/telemetry.d.ts +483 -0
- package/dist/telemetry/headless/services/telemetry.d.ts.map +1 -0
- package/dist/telemetry/headless/services/telemetry.js +190 -0
- package/dist/telemetry/headless/services/telemetry.js.map +1 -0
- package/dist/telemetry/headless/services/telemetryDashboard.d.ts +321 -0
- package/dist/telemetry/headless/services/telemetryDashboard.d.ts.map +1 -0
- package/dist/telemetry/headless/services/telemetryDashboard.js +103 -0
- package/dist/telemetry/headless/services/telemetryDashboard.js.map +1 -0
- package/dist/telemetry/internal/useIsMounted.d.ts +9 -0
- package/dist/telemetry/internal/useIsMounted.d.ts.map +1 -0
- package/dist/telemetry/internal/useIsMounted.js +19 -0
- package/dist/telemetry/internal/useIsMounted.js.map +1 -0
- package/dist/telemetry/internal/useVisiblePolling.d.ts +55 -0
- package/dist/telemetry/internal/useVisiblePolling.d.ts.map +1 -0
- package/dist/telemetry/internal/useVisiblePolling.js +96 -0
- package/dist/telemetry/internal/useVisiblePolling.js.map +1 -0
- package/dist/telemetry/internal/visuallyHidden.d.ts +12 -0
- package/dist/telemetry/internal/visuallyHidden.d.ts.map +1 -0
- package/dist/telemetry/internal/visuallyHidden.js +15 -0
- package/dist/telemetry/internal/visuallyHidden.js.map +1 -0
- package/dist/telemetry/theme/augment.d.ts +65 -0
- package/dist/telemetry/theme/augment.d.ts.map +1 -0
- package/dist/telemetry/theme/augment.js +37 -0
- package/dist/telemetry/theme/augment.js.map +1 -0
- package/dist/telemetry/theme/telemetryTokens.d.ts +121 -0
- package/dist/telemetry/theme/telemetryTokens.d.ts.map +1 -0
- package/dist/telemetry/theme/telemetryTokens.js +129 -0
- package/dist/telemetry/theme/telemetryTokens.js.map +1 -0
- package/dist/telemetry/ui/admin.d.ts +35 -0
- package/dist/telemetry/ui/admin.d.ts.map +1 -0
- package/dist/telemetry/ui/admin.js +58 -0
- package/dist/telemetry/ui/admin.js.map +1 -0
- package/dist/telemetry/ui/components/AssistantContainer.d.ts +35 -0
- package/dist/telemetry/ui/components/AssistantContainer.d.ts.map +1 -0
- package/dist/telemetry/ui/components/AssistantContainer.js +83 -0
- package/dist/telemetry/ui/components/AssistantContainer.js.map +1 -0
- package/dist/telemetry/ui/components/AssistantPanel.d.ts +22 -0
- package/dist/telemetry/ui/components/AssistantPanel.d.ts.map +1 -0
- package/dist/telemetry/ui/components/AssistantPanel.js +150 -0
- package/dist/telemetry/ui/components/AssistantPanel.js.map +1 -0
- package/dist/telemetry/ui/components/AssistantReport.d.ts +13 -0
- package/dist/telemetry/ui/components/AssistantReport.d.ts.map +1 -0
- package/dist/telemetry/ui/components/AssistantReport.js +89 -0
- package/dist/telemetry/ui/components/AssistantReport.js.map +1 -0
- package/dist/telemetry/ui/components/AssistantTimeline.d.ts +10 -0
- package/dist/telemetry/ui/components/AssistantTimeline.d.ts.map +1 -0
- package/dist/telemetry/ui/components/AssistantTimeline.js +84 -0
- package/dist/telemetry/ui/components/AssistantTimeline.js.map +1 -0
- package/dist/telemetry/ui/components/ResultsGrid.d.ts +10 -0
- package/dist/telemetry/ui/components/ResultsGrid.d.ts.map +1 -0
- package/dist/telemetry/ui/components/ResultsGrid.js +71 -0
- package/dist/telemetry/ui/components/ResultsGrid.js.map +1 -0
- package/dist/telemetry/ui/components/SchemaPanel.d.ts +9 -0
- package/dist/telemetry/ui/components/SchemaPanel.d.ts.map +1 -0
- package/dist/telemetry/ui/components/SchemaPanel.js +42 -0
- package/dist/telemetry/ui/components/SchemaPanel.js.map +1 -0
- package/dist/telemetry/ui/components/SqlEditor.d.ts +21 -0
- package/dist/telemetry/ui/components/SqlEditor.d.ts.map +1 -0
- package/dist/telemetry/ui/components/SqlEditor.js +60 -0
- package/dist/telemetry/ui/components/SqlEditor.js.map +1 -0
- package/dist/telemetry/ui/components/TelemetryConnectionSection.d.ts +14 -0
- package/dist/telemetry/ui/components/TelemetryConnectionSection.d.ts.map +1 -0
- package/dist/telemetry/ui/components/TelemetryConnectionSection.js +243 -0
- package/dist/telemetry/ui/components/TelemetryConnectionSection.js.map +1 -0
- package/dist/telemetry/ui/components/TelemetryCrossLink.d.ts +12 -0
- package/dist/telemetry/ui/components/TelemetryCrossLink.d.ts.map +1 -0
- package/dist/telemetry/ui/components/TelemetryCrossLink.js +21 -0
- package/dist/telemetry/ui/components/TelemetryCrossLink.js.map +1 -0
- package/dist/telemetry/ui/components/TelemetryServicesSection.d.ts +23 -0
- package/dist/telemetry/ui/components/TelemetryServicesSection.d.ts.map +1 -0
- package/dist/telemetry/ui/components/TelemetryServicesSection.js +138 -0
- package/dist/telemetry/ui/components/TelemetryServicesSection.js.map +1 -0
- package/dist/telemetry/ui/components/TelemetrySpinner.d.ts +3 -0
- package/dist/telemetry/ui/components/TelemetrySpinner.d.ts.map +1 -0
- package/dist/telemetry/ui/components/TelemetrySpinner.js +14 -0
- package/dist/telemetry/ui/components/TelemetrySpinner.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.d.ts +17 -0
- package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.js +70 -0
- package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.d.ts +39 -0
- package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.js +143 -0
- package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/DashboardPanel.d.ts +58 -0
- package/dist/telemetry/ui/components/dashboard/DashboardPanel.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/DashboardPanel.js +62 -0
- package/dist/telemetry/ui/components/dashboard/DashboardPanel.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/EventsFeed.d.ts +21 -0
- package/dist/telemetry/ui/components/dashboard/EventsFeed.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/EventsFeed.js +96 -0
- package/dist/telemetry/ui/components/dashboard/EventsFeed.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/KpiTiles.d.ts +13 -0
- package/dist/telemetry/ui/components/dashboard/KpiTiles.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/KpiTiles.js +82 -0
- package/dist/telemetry/ui/components/dashboard/KpiTiles.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/LogSeverityChart.d.ts +8 -0
- package/dist/telemetry/ui/components/dashboard/LogSeverityChart.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/LogSeverityChart.js +34 -0
- package/dist/telemetry/ui/components/dashboard/LogSeverityChart.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/TopProblems.d.ts +19 -0
- package/dist/telemetry/ui/components/dashboard/TopProblems.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/TopProblems.js +61 -0
- package/dist/telemetry/ui/components/dashboard/TopProblems.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.d.ts +12 -0
- package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.js +36 -0
- package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/VerdictBanner.d.ts +35 -0
- package/dist/telemetry/ui/components/dashboard/VerdictBanner.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/VerdictBanner.js +68 -0
- package/dist/telemetry/ui/components/dashboard/VerdictBanner.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/ZoomBrush.d.ts +9 -0
- package/dist/telemetry/ui/components/dashboard/ZoomBrush.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/ZoomBrush.js +96 -0
- package/dist/telemetry/ui/components/dashboard/ZoomBrush.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts +75 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js +247 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.d.ts +19 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.js +64 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.d.ts +74 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.js +126 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/severity.d.ts +43 -0
- package/dist/telemetry/ui/components/dashboard/severity.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/severity.js +66 -0
- package/dist/telemetry/ui/components/dashboard/severity.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/timelineAxis.d.ts +11 -0
- package/dist/telemetry/ui/components/dashboard/timelineAxis.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/timelineAxis.js +20 -0
- package/dist/telemetry/ui/components/dashboard/timelineAxis.js.map +1 -0
- package/dist/telemetry/ui/dashboard-page.d.ts +2 -0
- package/dist/telemetry/ui/dashboard-page.d.ts.map +1 -0
- package/dist/telemetry/ui/dashboard-page.js +6 -0
- package/dist/telemetry/ui/dashboard-page.js.map +1 -0
- package/dist/telemetry/ui/explorer-page.d.ts +2 -0
- package/dist/telemetry/ui/explorer-page.d.ts.map +1 -0
- package/dist/telemetry/ui/explorer-page.js +6 -0
- package/dist/telemetry/ui/explorer-page.js.map +1 -0
- package/dist/telemetry/ui/index.d.ts +6 -0
- package/dist/telemetry/ui/index.d.ts.map +1 -0
- package/dist/telemetry/ui/index.js +10 -0
- package/dist/telemetry/ui/index.js.map +1 -0
- package/dist/telemetry/ui/pages/TelemetryDashboardPage.d.ts +14 -0
- package/dist/telemetry/ui/pages/TelemetryDashboardPage.d.ts.map +1 -0
- package/dist/telemetry/ui/pages/TelemetryDashboardPage.js +286 -0
- package/dist/telemetry/ui/pages/TelemetryDashboardPage.js.map +1 -0
- package/dist/telemetry/ui/pages/TelemetryExplorerPage.d.ts +15 -0
- package/dist/telemetry/ui/pages/TelemetryExplorerPage.d.ts.map +1 -0
- package/dist/telemetry/ui/pages/TelemetryExplorerPage.js +197 -0
- package/dist/telemetry/ui/pages/TelemetryExplorerPage.js.map +1 -0
- package/dist/telemetry/ui/pages/TelemetrySettingsPage.d.ts +28 -0
- package/dist/telemetry/ui/pages/TelemetrySettingsPage.d.ts.map +1 -0
- package/dist/telemetry/ui/pages/TelemetrySettingsPage.js +278 -0
- package/dist/telemetry/ui/pages/TelemetrySettingsPage.js.map +1 -0
- package/dist/telemetry/ui/settings-page.d.ts +2 -0
- package/dist/telemetry/ui/settings-page.d.ts.map +1 -0
- package/dist/telemetry/ui/settings-page.js +6 -0
- package/dist/telemetry/ui/settings-page.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +4 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/test-platform-host.d.ts +108 -0
- package/dist/testing/test-platform-host.d.ts.map +1 -0
- package/dist/testing/test-platform-host.js +101 -0
- package/dist/testing/test-platform-host.js.map +1 -0
- package/package.json +132 -4
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* API timeline — issue #578, epic #576.
|
|
4
|
+
*
|
|
5
|
+
* Server requests per bucket as bars stacked by status class (2xx, 3xx, 4xx,
|
|
6
|
+
* 5xx), with p95 latency as a line on a secondary (ms) axis. Composed from
|
|
7
|
+
* `@mui/x-charts` parts because a bar + line pair on two y axes is not one of
|
|
8
|
+
* the packaged charts. Bar colours are the theme's status tokens (#686:
|
|
9
|
+
* 2xx ok, 3xx info, 4xx warn, 5xx crit), so both modes work and an app can
|
|
10
|
+
* restyle them; the legend names every series, so colour is never the only key.
|
|
11
|
+
*
|
|
12
|
+
* Zoom: see `ZoomBrush` — the caller chooses drag and/or tap per layout.
|
|
13
|
+
*/
|
|
14
|
+
import { Box, useTheme } from '@mui/material';
|
|
15
|
+
import { ChartsDataProvider } from '@mui/x-charts/ChartsDataProvider';
|
|
16
|
+
import { ChartsWrapper } from '@mui/x-charts/ChartsWrapper';
|
|
17
|
+
import { ChartsSurface } from '@mui/x-charts/ChartsSurface';
|
|
18
|
+
import { ChartsLegend } from '@mui/x-charts/ChartsLegend';
|
|
19
|
+
import { ChartsGrid } from '@mui/x-charts/ChartsGrid';
|
|
20
|
+
import { BarPlot } from '@mui/x-charts/BarChart';
|
|
21
|
+
import { LinePlot } from '@mui/x-charts/LineChart';
|
|
22
|
+
import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis';
|
|
23
|
+
import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis';
|
|
24
|
+
import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip';
|
|
25
|
+
import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight';
|
|
26
|
+
import { formatDuration } from '../../../headless/lib/format.js';
|
|
27
|
+
import { TIMELINE_AXIS_ID, timelineXAxis } from './timelineAxis.js';
|
|
28
|
+
import { ZoomBrush } from './ZoomBrush.js';
|
|
29
|
+
import { useTelemetryTokens } from '../../../theme/telemetryTokens.js';
|
|
30
|
+
export function ApiTimelineChart({ buckets, height, spanMs, compact, zoom, onZoomBuckets }) {
|
|
31
|
+
const theme = useTheme();
|
|
32
|
+
const tokens = useTelemetryTokens();
|
|
33
|
+
const starts = buckets.map((bucket) => bucket.t);
|
|
34
|
+
const bar = (id, label, color) => ({
|
|
35
|
+
type: 'bar',
|
|
36
|
+
id,
|
|
37
|
+
label,
|
|
38
|
+
data: buckets.map((bucket) => bucket[id]),
|
|
39
|
+
stack: 'status',
|
|
40
|
+
color,
|
|
41
|
+
yAxisId: 'requests',
|
|
42
|
+
});
|
|
43
|
+
return (_jsx(Box, { role: "img", "aria-label": `API requests per bucket by status class (2xx, 3xx, 4xx, 5xx) with p95 latency, ${buckets.length} buckets`, sx: { minWidth: 0, width: '100%' }, children: _jsx(ChartsDataProvider, { height: height, skipAnimation: true, series: [
|
|
44
|
+
bar('s2xx', '2xx', tokens.status.ok),
|
|
45
|
+
bar('s3xx', '3xx', tokens.status.info),
|
|
46
|
+
bar('s4xx', '4xx', tokens.status.warn),
|
|
47
|
+
bar('s5xx', '5xx', tokens.status.crit),
|
|
48
|
+
{
|
|
49
|
+
type: 'line',
|
|
50
|
+
id: 'p95',
|
|
51
|
+
label: 'p95 latency',
|
|
52
|
+
data: buckets.map((bucket) => bucket.p95Ms),
|
|
53
|
+
yAxisId: 'latency',
|
|
54
|
+
color: theme.palette.text.primary,
|
|
55
|
+
connectNulls: false,
|
|
56
|
+
showMark: false,
|
|
57
|
+
valueFormatter: (value) => (value === null ? '—' : formatDuration(value)),
|
|
58
|
+
},
|
|
59
|
+
], xAxis: [timelineXAxis(starts, spanMs, compact ? 4 : undefined)], yAxis: [
|
|
60
|
+
{ id: 'requests', position: 'left', width: compact ? 44 : 48, min: 0 },
|
|
61
|
+
{
|
|
62
|
+
id: 'latency',
|
|
63
|
+
position: 'right',
|
|
64
|
+
width: compact ? 44 : 56,
|
|
65
|
+
min: 0,
|
|
66
|
+
valueFormatter: (value) => formatDuration(value),
|
|
67
|
+
},
|
|
68
|
+
], margin: { top: 8, right: 4, bottom: 4, left: 4 }, children: _jsxs(ChartsWrapper, { legendPosition: { vertical: compact ? 'bottom' : 'top', horizontal: 'center' }, children: [_jsx(ChartsLegend, {}), _jsxs(ChartsSurface, { children: [_jsx(ChartsGrid, { horizontal: true }), _jsx(BarPlot, {}), _jsx(LinePlot, {}), _jsx(ChartsAxisHighlight, { x: "band" }), _jsx(ChartsXAxis, { axisId: TIMELINE_AXIS_ID }), _jsx(ChartsYAxis, { axisId: "requests" }), _jsx(ChartsYAxis, { axisId: "latency" }), _jsx(ZoomBrush, { values: starts, drag: zoom.drag, tap: zoom.tap, onSelect: onZoomBuckets })] }), _jsx(ChartsTooltip, { trigger: "axis" })] }) }) }));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=ApiTimelineChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiTimelineChart.js","sourceRoot":"","sources":["../../../../../src/telemetry/ui/components/dashboard/ApiTimelineChart.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type DashboardState } from '../../../headless/lib/dashboardState.js';
|
|
2
|
+
export type DashboardLayout = 'phone' | 'tablet' | 'desktop';
|
|
3
|
+
export interface DashboardFilterBarProps {
|
|
4
|
+
state: DashboardState;
|
|
5
|
+
onChange: (patch: Partial<DashboardState>) => void;
|
|
6
|
+
services: string[];
|
|
7
|
+
instances: string[];
|
|
8
|
+
/** Host names from `/filters`; the Host select is offered when there are any (or one is set). */
|
|
9
|
+
hosts?: string[];
|
|
10
|
+
/** `Date.now()` of the latest summary, for "Updated Xs ago". */
|
|
11
|
+
updatedAt: number | null;
|
|
12
|
+
layout: DashboardLayout;
|
|
13
|
+
}
|
|
14
|
+
/** Re-renders itself once a second; the rest of the page does not. */
|
|
15
|
+
export declare function UpdatedAgo({ updatedAt }: {
|
|
16
|
+
updatedAt: number | null;
|
|
17
|
+
}): import("react").JSX.Element | null;
|
|
18
|
+
export declare function zoomLabel(state: DashboardState): string;
|
|
19
|
+
export declare function ResetZoomChip({ state, onChange }: Pick<DashboardFilterBarProps, 'state' | 'onChange'>): import("react").JSX.Element | null;
|
|
20
|
+
interface SelectProps {
|
|
21
|
+
label: string;
|
|
22
|
+
allLabel: string;
|
|
23
|
+
value: string | null;
|
|
24
|
+
options: string[];
|
|
25
|
+
onChange: (value: string | null) => void;
|
|
26
|
+
fullWidth?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function FilterSelect({ label, allLabel, value, options, onChange, fullWidth }: SelectProps): import("react").JSX.Element;
|
|
29
|
+
export declare function RefreshSwitch({ checked, onChange }: {
|
|
30
|
+
checked: boolean;
|
|
31
|
+
onChange: (next: boolean) => void;
|
|
32
|
+
}): import("react").JSX.Element;
|
|
33
|
+
export declare function RangeToggle({ state, onChange }: Pick<DashboardFilterBarProps, 'state' | 'onChange'>): import("react").JSX.Element;
|
|
34
|
+
export declare function RangeSelect({ state, onChange, fullWidth, }: Pick<DashboardFilterBarProps, 'state' | 'onChange'> & {
|
|
35
|
+
fullWidth?: boolean;
|
|
36
|
+
}): import("react").JSX.Element;
|
|
37
|
+
export declare function DashboardFilterBar(props: DashboardFilterBarProps): import("react").JSX.Element;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=DashboardFilterBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardFilterBar.d.ts","sourceRoot":"","sources":["../../../../../src/telemetry/ui/components/dashboard/DashboardFilterBar.tsx"],"names":[],"mappings":"AAgDA,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAGjH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACnD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,iGAAiG;IACjG,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gEAAgE;IAChE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,sCAcrE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAEvD;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,uBAAuB,EAAE,OAAO,GAAG,UAAU,CAAC,sCAcrG;AAED,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,WAAW,+BA2BjG;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,+BAQ3G;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,uBAAuB,EAAE,OAAO,GAAG,UAAU,CAAC,+BAmBnG;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,SAAS,GACV,EAAE,IAAI,CAAC,uBAAuB,EAAE,OAAO,GAAG,UAAU,CAAC,GAAG;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,+BA6B/E;AAmND,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,+BAIhE"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The Telemetry Dashboard's filter bar — issue #578, epic #576.
|
|
4
|
+
*
|
|
5
|
+
* Range (15m … 7d), service and instance (the values `/filters` reports for
|
|
6
|
+
* the window), host (#602: `/filters` `hosts`, applied by the infrastructure
|
|
7
|
+
* sections only; offered once the store has host metrics), auto-refresh, "Updated Xs ago", and — while zoomed — a
|
|
8
|
+
* "Reset zoom" chip that drops `from`/`to` and returns to the preset.
|
|
9
|
+
*
|
|
10
|
+
* - Desktop (≥ lg): everything inline, range as a ToggleButtonGroup.
|
|
11
|
+
* - Tablet (sm–md): range Select inline; service, instance and auto-refresh
|
|
12
|
+
* behind a "Filters" button in a popover.
|
|
13
|
+
* - Phone (below sm): a sticky compact bar (range chip + Filters) whose button
|
|
14
|
+
* opens a full-screen dialog with every control, applied on "Apply" (a
|
|
15
|
+
* draft, so a half-made choice never fires five requests) or "Reset".
|
|
16
|
+
*/
|
|
17
|
+
import { useEffect, useId, useState } from 'react';
|
|
18
|
+
import { Badge, Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Paper, Popover, FormControl, FormControlLabel, InputLabel, MenuItem, OutlinedInput, Select, Stack, Switch, ToggleButton, ToggleButtonGroup, Typography, } from '@mui/material';
|
|
19
|
+
import ZoomOutIcon from '@mui/icons-material/ZoomOut';
|
|
20
|
+
import TuneIcon from '@mui/icons-material/Tune';
|
|
21
|
+
import CloseIcon from '@mui/icons-material/Close';
|
|
22
|
+
import { DASHBOARD_RANGES, DASHBOARD_RANGE_LABELS, } from '../../../headless/services/telemetryDashboard.js';
|
|
23
|
+
import { DEFAULT_DASHBOARD_STATE, isZoomed } from '../../../headless/lib/dashboardState.js';
|
|
24
|
+
import { formatTimestamp } from '../../../headless/lib/format.js';
|
|
25
|
+
/** Re-renders itself once a second; the rest of the page does not. */
|
|
26
|
+
export function UpdatedAgo({ updatedAt }) {
|
|
27
|
+
const [now, setNow] = useState(() => Date.now());
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
const timer = setInterval(() => setNow(Date.now()), 1000);
|
|
30
|
+
return () => clearInterval(timer);
|
|
31
|
+
}, []);
|
|
32
|
+
if (updatedAt === null)
|
|
33
|
+
return null;
|
|
34
|
+
const seconds = Math.max(0, Math.round((now - updatedAt) / 1000));
|
|
35
|
+
const text = seconds < 60 ? `${seconds}s` : `${Math.floor(seconds / 60)}m`;
|
|
36
|
+
return (_jsxs(Typography, { variant: "caption", color: "text.secondary", "data-testid": "updated-ago", sx: { whiteSpace: 'nowrap' }, children: ["Updated ", text, " ago"] }));
|
|
37
|
+
}
|
|
38
|
+
export function zoomLabel(state) {
|
|
39
|
+
return `${formatTimestamp(state.from)} – ${formatTimestamp(state.to)}`;
|
|
40
|
+
}
|
|
41
|
+
export function ResetZoomChip({ state, onChange }) {
|
|
42
|
+
if (!isZoomed(state))
|
|
43
|
+
return null;
|
|
44
|
+
return (_jsx(Chip, { icon: _jsx(ZoomOutIcon, { "aria-hidden": true }), label: "Reset zoom", title: zoomLabel(state), onClick: () => onChange({ from: null, to: null }), onDelete: () => onChange({ from: null, to: null }), color: "primary", variant: "outlined", sx: { minHeight: 36 } }));
|
|
45
|
+
}
|
|
46
|
+
export function FilterSelect({ label, allLabel, value, options, onChange, fullWidth }) {
|
|
47
|
+
const id = `dashboard-${label.toLowerCase()}`;
|
|
48
|
+
// A value from the URL that `/filters` does not (yet) list is still shown.
|
|
49
|
+
const values = value && !options.includes(value) ? [value, ...options] : options;
|
|
50
|
+
return (_jsxs(FormControl, { size: "small", fullWidth: fullWidth, sx: { minWidth: 160, maxWidth: fullWidth ? undefined : 240 }, children: [_jsx(InputLabel, { id: `${id}-label`, shrink: true, children: label }), _jsxs(Select, { labelId: `${id}-label`, id: id, input: _jsx(OutlinedInput, { notched: true, label: label }), value: value ?? '', displayEmpty: true, onChange: (event) => onChange(event.target.value ? String(event.target.value) : null), renderValue: (selected) => (selected ? String(selected) : allLabel), children: [_jsx(MenuItem, { value: "", children: allLabel }), values.map((option) => (_jsx(MenuItem, { value: option, children: option }, option)))] })] }));
|
|
51
|
+
}
|
|
52
|
+
export function RefreshSwitch({ checked, onChange }) {
|
|
53
|
+
return (_jsx(FormControlLabel, { control: _jsx(Switch, { checked: checked, onChange: (event) => onChange(event.target.checked) }), label: "Auto-refresh", sx: { mr: 0, whiteSpace: 'nowrap' } }));
|
|
54
|
+
}
|
|
55
|
+
export function RangeToggle({ state, onChange }) {
|
|
56
|
+
return (_jsx(ToggleButtonGroup, { exclusive: true, size: "small", "aria-label": "Time range", value: isZoomed(state) ? null : state.range, onChange: (_event, next) => {
|
|
57
|
+
if (next)
|
|
58
|
+
onChange({ range: next, from: null, to: null });
|
|
59
|
+
else if (isZoomed(state))
|
|
60
|
+
onChange({ from: null, to: null });
|
|
61
|
+
}, children: DASHBOARD_RANGES.map((range) => (_jsx(ToggleButton, { value: range, "aria-label": DASHBOARD_RANGE_LABELS[range], sx: { px: 1.5, textTransform: 'none' }, children: range }, range))) }));
|
|
62
|
+
}
|
|
63
|
+
export function RangeSelect({ state, onChange, fullWidth, }) {
|
|
64
|
+
const id = useId();
|
|
65
|
+
return (_jsxs(FormControl, { size: "small", fullWidth: fullWidth, sx: { minWidth: 170 }, children: [_jsx(InputLabel, { id: `${id}-label`, shrink: true, children: "Range" }), _jsxs(Select, { labelId: `${id}-label`, input: _jsx(OutlinedInput, { notched: true, label: "Range" }), value: isZoomed(state) ? 'zoom' : state.range, onChange: (event) => {
|
|
66
|
+
const next = event.target.value;
|
|
67
|
+
if (next !== 'zoom')
|
|
68
|
+
onChange({ range: next, from: null, to: null });
|
|
69
|
+
}, children: [isZoomed(state) && (_jsx(MenuItem, { value: "zoom", disabled: true, children: "Zoomed window" })), DASHBOARD_RANGES.map((range) => (_jsx(MenuItem, { value: range, children: DASHBOARD_RANGE_LABELS[range] }, range)))] })] }));
|
|
70
|
+
}
|
|
71
|
+
/** How many non-default filters hide behind the Filters button. */
|
|
72
|
+
function hiddenFilterCount(state) {
|
|
73
|
+
return (state.service ? 1 : 0) + (state.instance ? 1 : 0) + (state.host ? 1 : 0) + (state.refresh ? 0 : 1);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The Host select (#602), shown once `/filters` reports a host (or the URL
|
|
77
|
+
* carries one): with no host metrics in the store it would filter nothing.
|
|
78
|
+
*/
|
|
79
|
+
function HostSelect({ value, hosts, onChange, fullWidth, }) {
|
|
80
|
+
if (hosts.length === 0 && !value)
|
|
81
|
+
return null;
|
|
82
|
+
return (_jsx(FilterSelect, { label: "Host", allLabel: "All hosts", value: value, options: hosts, onChange: onChange, fullWidth: fullWidth }));
|
|
83
|
+
}
|
|
84
|
+
function TabletFilterBar({ state, onChange, services, instances, hosts = [], updatedAt }) {
|
|
85
|
+
const [anchor, setAnchor] = useState(null);
|
|
86
|
+
const popoverId = useId();
|
|
87
|
+
return (_jsxs(Stack, { direction: "row", spacing: 1.5, useFlexGap: true, role: "toolbar", "aria-label": "Dashboard filters", sx: { alignItems: 'center', flexWrap: 'wrap', minWidth: 0 }, children: [_jsx(RangeSelect, { state: state, onChange: onChange }), _jsx(Badge, { color: "primary", badgeContent: hiddenFilterCount(state), children: _jsx(Button, { variant: "outlined", startIcon: _jsx(TuneIcon, {}), "aria-haspopup": "dialog", "aria-controls": anchor ? popoverId : undefined, "aria-expanded": anchor ? 'true' : 'false', onClick: (event) => setAnchor(event.currentTarget), sx: { minHeight: 40 }, children: "Filters" }) }), _jsx(ResetZoomChip, { state: state, onChange: onChange }), _jsx(Box, { sx: { ml: 'auto' }, children: _jsx(UpdatedAgo, { updatedAt: updatedAt }) }), _jsx(Popover, { id: popoverId, open: !!anchor, anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, slotProps: { paper: { role: 'dialog', 'aria-label': 'Filters', sx: { p: 2, width: 320 } } }, children: _jsxs(Stack, { spacing: 2, children: [_jsx(FilterSelect, { label: "Service", allLabel: "All services", value: state.service, options: services, onChange: (service) => onChange({ service }), fullWidth: true }), _jsx(FilterSelect, { label: "Instance", allLabel: "All instances", value: state.instance, options: instances, onChange: (instance) => onChange({ instance }), fullWidth: true }), _jsx(HostSelect, { value: state.host, hosts: hosts, onChange: (host) => onChange({ host }), fullWidth: true }), _jsx(RefreshSwitch, { checked: state.refresh, onChange: (refresh) => onChange({ refresh }) })] }) })] }));
|
|
88
|
+
}
|
|
89
|
+
function PhoneFilterBar({ state, onChange, services, instances, hosts = [], updatedAt }) {
|
|
90
|
+
const [open, setOpen] = useState(false);
|
|
91
|
+
const [draft, setDraft] = useState(state);
|
|
92
|
+
const titleId = useId();
|
|
93
|
+
const openDialog = () => {
|
|
94
|
+
setDraft(state);
|
|
95
|
+
setOpen(true);
|
|
96
|
+
};
|
|
97
|
+
const patchDraft = (patch) => setDraft((current) => ({ ...current, ...patch }));
|
|
98
|
+
const apply = () => {
|
|
99
|
+
onChange({
|
|
100
|
+
range: draft.range,
|
|
101
|
+
from: draft.from,
|
|
102
|
+
to: draft.to,
|
|
103
|
+
service: draft.service,
|
|
104
|
+
instance: draft.instance,
|
|
105
|
+
host: draft.host,
|
|
106
|
+
refresh: draft.refresh,
|
|
107
|
+
});
|
|
108
|
+
setOpen(false);
|
|
109
|
+
};
|
|
110
|
+
const reset = () => {
|
|
111
|
+
const { range, from, to, service, instance, host, refresh } = DEFAULT_DASHBOARD_STATE;
|
|
112
|
+
onChange({ range, from, to, service, instance, host, refresh });
|
|
113
|
+
setOpen(false);
|
|
114
|
+
};
|
|
115
|
+
const rangeText = isZoomed(state) ? 'Zoomed' : state.range;
|
|
116
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Paper, { square: true, elevation: 0, role: "toolbar", "aria-label": "Dashboard filters", "data-testid": "phone-filter-bar", sx: {
|
|
117
|
+
position: 'sticky',
|
|
118
|
+
// Below the sticky AppBar (56px on phones).
|
|
119
|
+
top: 56,
|
|
120
|
+
zIndex: (theme) => theme.zIndex.appBar - 1,
|
|
121
|
+
mx: -3,
|
|
122
|
+
px: 3,
|
|
123
|
+
py: 1,
|
|
124
|
+
bgcolor: 'background.default',
|
|
125
|
+
borderBottom: 1,
|
|
126
|
+
borderColor: 'divider',
|
|
127
|
+
display: 'flex',
|
|
128
|
+
alignItems: 'center',
|
|
129
|
+
gap: 1,
|
|
130
|
+
minWidth: 0,
|
|
131
|
+
}, children: [_jsx(Chip, { label: rangeText, onClick: openDialog, "aria-label": `Range: ${rangeText}. Change filters`, sx: { minHeight: 44 } }), isZoomed(state) && (_jsx(IconButton, { "aria-label": "Reset zoom", onClick: () => onChange({ from: null, to: null }), sx: { width: 44, height: 44 }, children: _jsx(ZoomOutIcon, {}) })), _jsx(Box, { sx: { flex: 1, minWidth: 0, overflow: 'hidden' }, children: _jsx(UpdatedAgo, { updatedAt: updatedAt }) }), _jsx(Badge, { color: "primary", badgeContent: hiddenFilterCount(state), children: _jsx(Button, { variant: "outlined", startIcon: _jsx(TuneIcon, {}), "aria-haspopup": "dialog", onClick: openDialog, sx: { minHeight: 44 }, children: "Filters" }) })] }), _jsxs(Dialog, { fullScreen: true, open: open, onClose: () => setOpen(false), "aria-labelledby": titleId, children: [_jsxs(DialogTitle, { id: titleId, sx: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' }, children: ["Filters", _jsx(IconButton, { "aria-label": "Close filters", onClick: () => setOpen(false), sx: { width: 44, height: 44 }, children: _jsx(CloseIcon, {}) })] }), _jsx(DialogContent, { dividers: true, children: _jsxs(Stack, { spacing: 3, sx: { pt: 1 }, children: [_jsx(RangeSelect, { state: draft, onChange: patchDraft, fullWidth: true }), _jsx(FilterSelect, { label: "Service", allLabel: "All services", value: draft.service, options: services, onChange: (service) => patchDraft({ service }), fullWidth: true }), _jsx(FilterSelect, { label: "Instance", allLabel: "All instances", value: draft.instance, options: instances, onChange: (instance) => patchDraft({ instance }), fullWidth: true }), _jsx(HostSelect, { value: draft.host, hosts: hosts, onChange: (host) => patchDraft({ host }), fullWidth: true }), _jsx(RefreshSwitch, { checked: draft.refresh, onChange: (refresh) => patchDraft({ refresh }) })] }) }), _jsxs(DialogActions, { sx: { p: 2, gap: 1 }, children: [_jsx(Button, { onClick: reset, sx: { minHeight: 44 }, children: "Reset" }), _jsx(Button, { variant: "contained", onClick: apply, sx: { minHeight: 44, flex: 1 }, children: "Apply" })] })] })] }));
|
|
132
|
+
}
|
|
133
|
+
export function DashboardFilterBar(props) {
|
|
134
|
+
if (props.layout === 'phone')
|
|
135
|
+
return _jsx(PhoneFilterBar, { ...props });
|
|
136
|
+
if (props.layout === 'tablet')
|
|
137
|
+
return _jsx(TabletFilterBar, { ...props });
|
|
138
|
+
return _jsx(DesktopFilterBar, { ...props });
|
|
139
|
+
}
|
|
140
|
+
function DesktopFilterBar({ state, onChange, services, instances, hosts = [], updatedAt }) {
|
|
141
|
+
return (_jsxs(Stack, { direction: "row", spacing: 1.5, useFlexGap: true, role: "toolbar", "aria-label": "Dashboard filters", sx: { alignItems: 'center', flexWrap: 'wrap', minWidth: 0 }, children: [_jsx(RangeToggle, { state: state, onChange: onChange }), _jsx(ResetZoomChip, { state: state, onChange: onChange }), _jsx(FilterSelect, { label: "Service", allLabel: "All services", value: state.service, options: services, onChange: (service) => onChange({ service }) }), _jsx(FilterSelect, { label: "Instance", allLabel: "All instances", value: state.instance, options: instances, onChange: (instance) => onChange({ instance }) }), _jsx(HostSelect, { value: state.host, hosts: hosts, onChange: (host) => onChange({ host }) }), _jsx(RefreshSwitch, { checked: state.refresh, onChange: (refresh) => onChange({ refresh }) }), _jsx(UpdatedAgo, { updatedAt: updatedAt })] }));
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=DashboardFilterBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardFilterBar.js","sourceRoot":"","sources":["../../../../../src/telemetry/ui/components/dashboard/DashboardFilterBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One Telemetry Dashboard panel — issue #578, epic #576.
|
|
3
|
+
*
|
|
4
|
+
* The frame every panel shares: a titled region, a header ACTIONS SLOT, and
|
|
5
|
+
* the loading / error / empty states, so a panel's own component only draws
|
|
6
|
+
* its data.
|
|
7
|
+
*
|
|
8
|
+
* Actions slot (the seam for #579 — "Open in Explorer", "Ask assistant"): a
|
|
9
|
+
* panel takes `actions`, each `{ key, label, icon, onClick }`. They render as
|
|
10
|
+
* icon buttons from `sm` up and fold into one ⋮ menu on phones. `onClick`
|
|
11
|
+
* receives the panel's `sql` — the statement(s) the API reports it ran for
|
|
12
|
+
* this panel, primary first — so an action never has to rebuild the query.
|
|
13
|
+
*
|
|
14
|
+
* Failure is PER PANEL: the error Alert shows the API's message and
|
|
15
|
+
* `details.reason`, with a Retry that refetches this panel only.
|
|
16
|
+
*/
|
|
17
|
+
import { type ReactNode } from 'react';
|
|
18
|
+
import { type TelemetryErrorInfo } from '../../../headless/hooks/useTelemetryExplorer.js';
|
|
19
|
+
export interface PanelAction {
|
|
20
|
+
key: string;
|
|
21
|
+
label: string;
|
|
22
|
+
icon: ReactNode;
|
|
23
|
+
/** Receives the panel's SQL, primary statement first. */
|
|
24
|
+
onClick: (sql: string[]) => void;
|
|
25
|
+
disabled?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface DashboardPanelProps {
|
|
28
|
+
title: string;
|
|
29
|
+
/** Panel id for tests and deep links. */
|
|
30
|
+
id: string;
|
|
31
|
+
/**
|
|
32
|
+
* DOM id of the panel's region, for in-page links (#602: a verdict reason
|
|
33
|
+
* scrolls to its section). The region is then focusable by script
|
|
34
|
+
* (`tabIndex=-1`), so moving focus there announces the section.
|
|
35
|
+
*/
|
|
36
|
+
anchorId?: string;
|
|
37
|
+
/** Beside the title: filters that belong to the panel (severity chips, a toggle). */
|
|
38
|
+
headerExtra?: ReactNode;
|
|
39
|
+
actions?: PanelAction[];
|
|
40
|
+
/** The `sql` of the panel's response(s); handed to every action. */
|
|
41
|
+
sql?: string | string[] | null;
|
|
42
|
+
isLoading?: boolean;
|
|
43
|
+
isRefreshing?: boolean;
|
|
44
|
+
error?: TelemetryErrorInfo | null;
|
|
45
|
+
onRetry?: () => void;
|
|
46
|
+
/** True when the data is present but holds nothing to show. */
|
|
47
|
+
isEmpty?: boolean;
|
|
48
|
+
emptyMessage?: string;
|
|
49
|
+
/** Skeleton height while the first result loads. */
|
|
50
|
+
skeletonHeight?: number;
|
|
51
|
+
children?: ReactNode;
|
|
52
|
+
}
|
|
53
|
+
export declare function PanelError({ error, onRetry }: {
|
|
54
|
+
error: TelemetryErrorInfo;
|
|
55
|
+
onRetry?: () => void;
|
|
56
|
+
}): import("react").JSX.Element;
|
|
57
|
+
export declare function DashboardPanel({ title, id, anchorId, headerExtra, actions, sql, isLoading, isRefreshing, error, onRetry, isEmpty, emptyMessage, skeletonHeight, children, }: DashboardPanelProps): import("react").JSX.Element;
|
|
58
|
+
//# sourceMappingURL=DashboardPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPanel.d.ts","sourceRoot":"","sources":["../../../../../src/telemetry/ui/components/dashboard/DashboardPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAqBxD,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAG/G,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,yDAAyD;IACzD,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,+BAuBjG;AAkED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,EAAE,EACF,QAAQ,EACR,WAAW,EACX,OAAY,EACZ,GAAG,EACH,SAAiB,EACjB,YAAoB,EACpB,KAAY,EACZ,OAAO,EACP,OAAe,EACf,YAAwC,EACxC,cAAoB,EACpB,QAAQ,GACT,EAAE,mBAAmB,+BAqErB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* One Telemetry Dashboard panel — issue #578, epic #576.
|
|
4
|
+
*
|
|
5
|
+
* The frame every panel shares: a titled region, a header ACTIONS SLOT, and
|
|
6
|
+
* the loading / error / empty states, so a panel's own component only draws
|
|
7
|
+
* its data.
|
|
8
|
+
*
|
|
9
|
+
* Actions slot (the seam for #579 — "Open in Explorer", "Ask assistant"): a
|
|
10
|
+
* panel takes `actions`, each `{ key, label, icon, onClick }`. They render as
|
|
11
|
+
* icon buttons from `sm` up and fold into one ⋮ menu on phones. `onClick`
|
|
12
|
+
* receives the panel's `sql` — the statement(s) the API reports it ran for
|
|
13
|
+
* this panel, primary first — so an action never has to rebuild the query.
|
|
14
|
+
*
|
|
15
|
+
* Failure is PER PANEL: the error Alert shows the API's message and
|
|
16
|
+
* `details.reason`, with a Retry that refetches this panel only.
|
|
17
|
+
*/
|
|
18
|
+
import { useId, useState } from 'react';
|
|
19
|
+
import { Alert, AlertTitle, Box, Button, IconButton, LinearProgress, ListItemIcon, ListItemText, Menu, MenuItem, Paper, Skeleton, Stack, Tooltip, Typography, useMediaQuery, useTheme, } from '@mui/material';
|
|
20
|
+
import MoreVertIcon from '@mui/icons-material/MoreVert';
|
|
21
|
+
import { telemetryErrorTitle } from '../../../headless/hooks/useTelemetryExplorer.js';
|
|
22
|
+
import { sqlList } from '../../../headless/services/telemetryDashboard.js';
|
|
23
|
+
export function PanelError({ error, onRetry }) {
|
|
24
|
+
return (_jsxs(Alert, { severity: error.reason === 'TELEMETRY_QUERY_TIMEOUT' ? 'warning' : 'error', action: onRetry ? (_jsx(Button, { color: "inherit", size: "small", onClick: onRetry, sx: { minHeight: 44 }, children: "Retry" })) : undefined, children: [_jsx(AlertTitle, { children: telemetryErrorTitle(error) }), _jsx(Box, { component: "span", sx: { wordBreak: 'break-word' }, children: error.message }), (error.reason ?? error.code) && (_jsx(Typography, { variant: "caption", component: "div", sx: { mt: 0.5, opacity: 0.8 }, children: error.reason ?? error.code }))] }));
|
|
25
|
+
}
|
|
26
|
+
function PanelActions({ actions, sql, title, isPhone, }) {
|
|
27
|
+
const [anchor, setAnchor] = useState(null);
|
|
28
|
+
const menuId = useId();
|
|
29
|
+
if (actions.length === 0)
|
|
30
|
+
return null;
|
|
31
|
+
if (isPhone) {
|
|
32
|
+
return (_jsxs(_Fragment, { children: [_jsx(IconButton, { "aria-label": `${title} actions`, "aria-haspopup": "menu", "aria-controls": anchor ? menuId : undefined, "aria-expanded": anchor ? 'true' : undefined, onClick: (event) => setAnchor(event.currentTarget), sx: { width: 44, height: 44 }, children: _jsx(MoreVertIcon, {}) }), _jsx(Menu, { id: menuId, anchorEl: anchor, open: !!anchor, onClose: () => setAnchor(null), children: actions.map((action) => (_jsxs(MenuItem, { disabled: action.disabled, sx: { minHeight: 44 }, onClick: () => {
|
|
33
|
+
setAnchor(null);
|
|
34
|
+
action.onClick(sql);
|
|
35
|
+
}, children: [_jsx(ListItemIcon, { children: action.icon }), _jsx(ListItemText, { children: action.label })] }, action.key))) })] }));
|
|
36
|
+
}
|
|
37
|
+
return (_jsx(Stack, { direction: "row", spacing: 0.5, children: actions.map((action) => (_jsx(Tooltip, { title: action.label, children: _jsx("span", { children: _jsx(IconButton, { "aria-label": action.label, disabled: action.disabled, onClick: () => action.onClick(sql), children: action.icon }) }) }, action.key))) }));
|
|
38
|
+
}
|
|
39
|
+
export function DashboardPanel({ title, id, anchorId, headerExtra, actions = [], sql, isLoading = false, isRefreshing = false, error = null, onRetry, isEmpty = false, emptyMessage = 'Nothing in this window.', skeletonHeight = 160, children, }) {
|
|
40
|
+
const theme = useTheme();
|
|
41
|
+
const isPhone = useMediaQuery(theme.breakpoints.down('sm'));
|
|
42
|
+
const headingId = `${id}-title`;
|
|
43
|
+
let body;
|
|
44
|
+
if (error)
|
|
45
|
+
body = _jsx(PanelError, { error: error, onRetry: onRetry });
|
|
46
|
+
else if (isLoading)
|
|
47
|
+
body = _jsx(Skeleton, { variant: "rounded", height: skeletonHeight, "data-testid": `${id}-skeleton` });
|
|
48
|
+
else if (isEmpty)
|
|
49
|
+
body = (_jsx(Typography, { variant: "body2", color: "text.secondary", sx: { py: 3, textAlign: 'center' }, children: emptyMessage }));
|
|
50
|
+
else
|
|
51
|
+
body = children;
|
|
52
|
+
return (_jsxs(Paper, { component: "section", variant: "outlined", "aria-labelledby": headingId, "data-testid": id, ...(anchorId ? { id: anchorId, tabIndex: -1 } : {}), sx: {
|
|
53
|
+
position: 'relative',
|
|
54
|
+
p: { xs: 1.5, sm: 2 },
|
|
55
|
+
minWidth: 0,
|
|
56
|
+
height: '100%',
|
|
57
|
+
overflow: 'hidden',
|
|
58
|
+
// Clear the sticky AppBar (and the phone filter bar) when scrolled to.
|
|
59
|
+
...(anchorId && { scrollMarginTop: { xs: 112, sm: 80 } }),
|
|
60
|
+
}, children: [isRefreshing && (_jsx(LinearProgress, { "aria-label": `Refreshing ${title}`, sx: { position: 'absolute', top: 0, left: 0, right: 0, height: 2 } })), _jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { alignItems: 'center', flexWrap: isPhone ? 'nowrap' : 'wrap', mb: 1.5, minHeight: 40 }, children: [_jsx(Typography, { id: headingId, variant: "h6", component: "h2", sx: { fontSize: '1rem', mr: 'auto', minWidth: 0, overflowWrap: 'anywhere' }, children: title }), !isPhone && headerExtra, _jsx(PanelActions, { actions: actions, sql: sqlList(sql), title: title, isPhone: isPhone })] }), isPhone && headerExtra && (_jsx(Box, { "data-testid": `${id}-header-extra`, sx: { mb: 1.5, minWidth: 0 }, children: headerExtra })), body] }));
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=DashboardPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPanel.js","sourceRoot":"","sources":["../../../../../src/telemetry/ui/components/dashboard/DashboardPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { DashboardEventsResource } from '../../../headless/hooks/useTelemetryDashboard.js';
|
|
2
|
+
import { type DashboardSeverity } from '../../../headless/services/telemetryDashboard.js';
|
|
3
|
+
import { type PanelAction } from './DashboardPanel.js';
|
|
4
|
+
import type { DashboardLayout } from './DashboardFilterBar.js';
|
|
5
|
+
export declare const SEARCH_DEBOUNCE_MS = 400;
|
|
6
|
+
export interface EventsFeedProps {
|
|
7
|
+
events: DashboardEventsResource;
|
|
8
|
+
sev: DashboardSeverity[];
|
|
9
|
+
q: string;
|
|
10
|
+
onChange: (patch: {
|
|
11
|
+
sev?: DashboardSeverity[];
|
|
12
|
+
q?: string;
|
|
13
|
+
}) => void;
|
|
14
|
+
layout: DashboardLayout;
|
|
15
|
+
actions?: PanelAction[];
|
|
16
|
+
/** Opens a trace (a validated 32-hex id) in the explorer (#579). Omitted: no link. */
|
|
17
|
+
onViewTrace?: (traceId: string) => void;
|
|
18
|
+
now?: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function EventsFeed({ events, sev, q, onChange, layout, actions, onViewTrace, now, }: EventsFeedProps): import("react").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=EventsFeed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventsFeed.d.ts","sourceRoot":"","sources":["../../../../../src/telemetry/ui/components/dashboard/EventsFeed.tsx"],"names":[],"mappings":"AA6CA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kDAAkD,CAAC;AAChG,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAA8B,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAK/D,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAkItC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,uBAAuB,CAAC;IAChC,GAAG,EAAE,iBAAiB,EAAE,CAAC;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,GAAG,CAAC,EAAE,iBAAiB,EAAE,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACrE,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,sFAAsF;IACtF,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,GAAG,EACH,CAAC,EACD,QAAQ,EACR,MAAM,EACN,OAAY,EACZ,WAAW,EACX,GAAgB,GACjB,EAAE,eAAe,+BAgJjB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Recent events — issue #578, epic #576.
|
|
4
|
+
*
|
|
5
|
+
* Log records newest first, filtered by the severity chips (`sev`, shared with
|
|
6
|
+
* the log timeline) and a body search (`q`, debounced 400 ms, ≤ 200
|
|
7
|
+
* characters — the API's limit). "Load more" follows the API's `nextCursor`.
|
|
8
|
+
*
|
|
9
|
+
* Desktop: a table (time, severity, service, one-line message). Tablet: the
|
|
10
|
+
* same without the service column. Phone: a list (severity chip + relative
|
|
11
|
+
* time, two-line message). Any row opens the full record in a dialog —
|
|
12
|
+
* full-screen on phones — with the body, exact timestamp, service, trace id
|
|
13
|
+
* and span id. MUI's Dialog traps focus and restores it to the row on close.
|
|
14
|
+
*
|
|
15
|
+
* "View trace" (#579): an event whose trace id is a real OpenTelemetry id (32
|
|
16
|
+
* lower-case hex digits, `traceLink.ts`) offers it in that detail, and opens
|
|
17
|
+
* the trace's spans in the Telemetry Explorer (loaded, not run). It lives in
|
|
18
|
+
* the detail rather than on the row because a row is itself a button, and a
|
|
19
|
+
* control nested in a control is unreachable for assistive technology. Any
|
|
20
|
+
* other id gets no link.
|
|
21
|
+
*/
|
|
22
|
+
import { useEffect, useId, useRef, useState } from 'react';
|
|
23
|
+
import { Box, Button, CircularProgress, Dialog, DialogContent, DialogTitle, IconButton, InputAdornment, List, ListItemButton, Stack, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, } from '@mui/material';
|
|
24
|
+
import SearchIcon from '@mui/icons-material/Search';
|
|
25
|
+
import CloseIcon from '@mui/icons-material/Close';
|
|
26
|
+
import AccountTreeOutlinedIcon from '@mui/icons-material/AccountTreeOutlined';
|
|
27
|
+
import { DASHBOARD_SEARCH_MAX_LENGTH, } from '../../../headless/services/telemetryDashboard.js';
|
|
28
|
+
import { DashboardPanel, PanelError } from './DashboardPanel.js';
|
|
29
|
+
import { SeverityChip, SeverityChips, SeverityLabel } from './severity.js';
|
|
30
|
+
import { formatRelative, formatTimestamp } from '../../../headless/lib/format.js';
|
|
31
|
+
import { isTraceId } from '../../../headless/lib/traceLink.js';
|
|
32
|
+
export const SEARCH_DEBOUNCE_MS = 400;
|
|
33
|
+
/** A search box that reports its value 400 ms after the last keystroke. */
|
|
34
|
+
function SearchField({ value, onChange }) {
|
|
35
|
+
const [draft, setDraft] = useState(value);
|
|
36
|
+
const onChangeRef = useRef(onChange);
|
|
37
|
+
onChangeRef.current = onChange;
|
|
38
|
+
const committed = useRef(value);
|
|
39
|
+
// An outside change (Reset, back button) replaces the draft.
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (value !== committed.current) {
|
|
42
|
+
committed.current = value;
|
|
43
|
+
setDraft(value);
|
|
44
|
+
}
|
|
45
|
+
}, [value]);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (draft === committed.current)
|
|
48
|
+
return;
|
|
49
|
+
const timer = setTimeout(() => {
|
|
50
|
+
committed.current = draft;
|
|
51
|
+
onChangeRef.current(draft);
|
|
52
|
+
}, SEARCH_DEBOUNCE_MS);
|
|
53
|
+
return () => clearTimeout(timer);
|
|
54
|
+
}, [draft]);
|
|
55
|
+
return (_jsx(TextField, { size: "small", fullWidth: true, type: "search", label: "Search messages", value: draft, onChange: (event) => setDraft(event.target.value.slice(0, DASHBOARD_SEARCH_MAX_LENGTH)), slotProps: {
|
|
56
|
+
htmlInput: { maxLength: DASHBOARD_SEARCH_MAX_LENGTH },
|
|
57
|
+
input: {
|
|
58
|
+
startAdornment: (_jsx(InputAdornment, { position: "start", children: _jsx(SearchIcon, { fontSize: "small", "aria-hidden": true }) })),
|
|
59
|
+
},
|
|
60
|
+
}, sx: { mb: 1.5 } }));
|
|
61
|
+
}
|
|
62
|
+
function DetailRow({ label, value, mono = false }) {
|
|
63
|
+
return (_jsxs(Box, { sx: { mb: 1.5 }, children: [_jsx(Typography, { variant: "caption", color: "text.secondary", component: "dt", children: label }), _jsx(Typography, { component: "dd", variant: "body2", sx: { m: 0, wordBreak: 'break-all', fontFamily: mono ? 'monospace' : undefined }, children: value ?? '—' })] }));
|
|
64
|
+
}
|
|
65
|
+
function EventDialog({ event, fullScreen, onClose, onViewTrace, }) {
|
|
66
|
+
const titleId = useId();
|
|
67
|
+
return (_jsx(Dialog, { open: event !== null, onClose: onClose, fullScreen: fullScreen, fullWidth: true, maxWidth: "md", "aria-labelledby": titleId, children: event && (_jsxs(_Fragment, { children: [_jsxs(DialogTitle, { id: titleId, sx: { display: 'flex', alignItems: 'center', gap: 1, pr: 1 }, children: [_jsx(SeverityLabel, { severity: event.severity }), _jsx(Box, { component: "span", sx: { flex: 1 }, children: "Log event" }), _jsx(IconButton, { "aria-label": "Close event", onClick: onClose, sx: { width: 44, height: 44 }, children: _jsx(CloseIcon, {}) })] }), _jsxs(DialogContent, { dividers: true, children: [_jsx(Box, { component: "pre", "data-testid": "event-body", sx: { m: 0, mb: 2, whiteSpace: 'pre-wrap', wordBreak: 'break-word', fontFamily: 'monospace', fontSize: 13 }, children: event.body ?? '(no message)' }), _jsxs(Box, { component: "dl", sx: { m: 0 }, children: [_jsx(DetailRow, { label: "Timestamp (UTC)", value: event.timestamp, mono: true }), _jsx(DetailRow, { label: "Service", value: event.service }), _jsx(DetailRow, { label: "Trace id", value: event.traceId, mono: true }), _jsx(DetailRow, { label: "Span id", value: event.spanId, mono: true })] }), onViewTrace && isTraceId(event.traceId) && (_jsx(Button, { variant: "outlined", startIcon: _jsx(AccountTreeOutlinedIcon, {}), onClick: () => onViewTrace(event.traceId), sx: { minHeight: 44 }, children: "View trace" }))] })] })) }));
|
|
68
|
+
}
|
|
69
|
+
/** Event timestamps carry nanoseconds; `Date.parse` needs at most milliseconds. */
|
|
70
|
+
function eventTime(timestamp) {
|
|
71
|
+
const match = /^(.*T\d{2}:\d{2}:\d{2})(\.\d+)?(Z|[+-]\d{2}:?\d{2})?$/.exec(timestamp.replace(' ', 'T'));
|
|
72
|
+
if (!match)
|
|
73
|
+
return timestamp;
|
|
74
|
+
const fraction = match[2] ? match[2].slice(0, 4) : '';
|
|
75
|
+
return `${match[1]}${fraction}${match[3] ?? 'Z'}`;
|
|
76
|
+
}
|
|
77
|
+
export function EventsFeed({ events, sev, q, onChange, layout, actions = [], onViewTrace, now = Date.now(), }) {
|
|
78
|
+
const [selected, setSelected] = useState(null);
|
|
79
|
+
const isPhone = layout === 'phone';
|
|
80
|
+
const showService = layout === 'desktop';
|
|
81
|
+
const openOnKey = (event, item) => {
|
|
82
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
83
|
+
event.preventDefault();
|
|
84
|
+
setSelected(item);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const rows = isPhone ? (_jsx(List, { disablePadding: true, "aria-label": "Recent events", children: events.items.map((item, index) => (_jsxs(ListItemButton, { divider: true, onClick: () => setSelected(item), sx: { px: 0.5, display: 'block', minHeight: 44 }, children: [_jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: 'center', mb: 0.5 }, children: [_jsx(SeverityChip, { severity: item.severity }), _jsx(Typography, { variant: "caption", color: "text.secondary", title: formatTimestamp(eventTime(item.timestamp)), children: formatRelative(eventTime(item.timestamp), now) })] }), _jsx(Typography, { variant: "body2", sx: {
|
|
88
|
+
display: '-webkit-box',
|
|
89
|
+
WebkitLineClamp: 2,
|
|
90
|
+
WebkitBoxOrient: 'vertical',
|
|
91
|
+
overflow: 'hidden',
|
|
92
|
+
wordBreak: 'break-word',
|
|
93
|
+
}, children: item.body ?? '(no message)' })] }, `${item.timestamp}-${item.spanId ?? ''}-${index}`))) })) : (_jsx(TableContainer, { children: _jsxs(Table, { size: "small", "aria-label": "Recent events", sx: { tableLayout: 'fixed' }, children: [_jsx(TableHead, { children: _jsxs(TableRow, { children: [_jsx(TableCell, { sx: { width: 96 }, children: "Time" }), _jsx(TableCell, { sx: { width: 96 }, children: "Severity" }), showService && _jsx(TableCell, { sx: { width: 160 }, children: "Service" }), _jsx(TableCell, { children: "Message" })] }) }), _jsx(TableBody, { children: events.items.map((item, index) => (_jsxs(TableRow, { hover: true, tabIndex: 0, role: "button", "aria-label": `Open event: ${item.body ?? 'no message'}`, onClick: () => setSelected(item), onKeyDown: (event) => openOnKey(event, item), sx: { cursor: 'pointer' }, children: [_jsx(TableCell, { sx: { whiteSpace: 'nowrap' }, title: formatTimestamp(eventTime(item.timestamp)), children: formatRelative(eventTime(item.timestamp), now) }), _jsx(TableCell, { children: _jsx(SeverityLabel, { severity: item.severity }) }), showService && (_jsx(TableCell, { sx: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: item.service ?? '—' })), _jsx(TableCell, { sx: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: item.body ?? '(no message)' })] }, `${item.timestamp}-${item.spanId ?? ''}-${index}`))) })] }) }));
|
|
94
|
+
return (_jsxs(DashboardPanel, { id: "panel-events", title: "Recent events", headerExtra: _jsx(SeverityChips, { value: sev, onChange: (next) => onChange({ sev: next }), large: isPhone, label: "Event severity filter" }), actions: actions, sql: events.data?.sql, isRefreshing: events.isRefreshing, children: [_jsx(SearchField, { value: q, onChange: (next) => onChange({ q: next }) }), events.error ? (_jsx(PanelError, { error: events.error, onRetry: events.reload })) : events.isLoading ? (_jsx(Stack, { sx: { alignItems: 'center', py: 4 }, children: _jsx(CircularProgress, { size: 28, "aria-label": "Loading events" }) })) : events.items.length === 0 ? (_jsx(Typography, { variant: "body2", color: "text.secondary", sx: { py: 3, textAlign: 'center' }, children: q ? 'No events match this search.' : 'No events of the selected severities in this window.' })) : (_jsxs(_Fragment, { children: [rows, events.loadMoreError && (_jsx(Box, { sx: { mt: 1.5 }, children: _jsx(PanelError, { error: events.loadMoreError, onRetry: events.loadMore }) })), events.hasMore && (_jsx(Stack, { sx: { alignItems: 'center', mt: 1.5 }, children: _jsx(Button, { variant: "outlined", onClick: events.loadMore, disabled: events.isLoadingMore, startIcon: events.isLoadingMore ? _jsx(CircularProgress, { size: 16 }) : undefined, sx: { minHeight: 44 }, children: "Load more" }) }))] })), _jsx(EventDialog, { event: selected, fullScreen: isPhone, onClose: () => setSelected(null), onViewTrace: onViewTrace })] }));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=EventsFeed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventsFeed.js","sourceRoot":"","sources":["../../../../../src/telemetry/ui/components/dashboard/EventsFeed.tsx"],"names":[],"mappings":"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"}
|