import "@mantine/core/styles.css"; import "@mantine/code-highlight/styles.css"; import "@mantine/notifications/styles.css"; import "@mantine/dates/styles.css"; import "./mantine-overrides.css"; import classes from "./App.module.css"; import PrometheusLogo from "./images/prometheus-logo.svg"; import { ActionIcon, AppShell, Box, Burger, Button, Group, MantineProvider, Menu, Skeleton, Text, createTheme, rem, } from "@mantine/core"; import { useDisclosure } from "@mantine/hooks"; import { IconBell, IconBellFilled, IconBook, IconChevronDown, IconChevronRight, IconCloudDataConnection, IconDatabase, IconDeviceDesktopAnalytics, IconFlag, IconHeartRateMonitor, IconInfoCircle, IconSearch, IconServer, IconServerCog, } from "@tabler/icons-react"; import { BrowserRouter, Link, NavLink, Navigate, Route, Routes, } from "react-router-dom"; import { IconTable } from "@tabler/icons-react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import QueryPage from "./pages/query/QueryPage"; import AlertsPage from "./pages/AlertsPage"; import RulesPage from "./pages/RulesPage"; import TargetsPage from "./pages/targets/TargetsPage"; import StatusPage from "./pages/StatusPage"; import TSDBStatusPage from "./pages/TSDBStatusPage"; import FlagsPage from "./pages/FlagsPage"; import ConfigPage from "./pages/ConfigPage"; import AgentPage from "./pages/AgentPage"; import { Suspense } from "react"; import ErrorBoundary from "./components/ErrorBoundary"; import { ThemeSelector } from "./components/ThemeSelector"; import { Notifications } from "@mantine/notifications"; import { useSettings } from "./state/settingsSlice"; import SettingsMenu from "./components/SettingsMenu"; import ReadinessWrapper from "./components/ReadinessWrapper"; import NotificationsProvider from "./components/NotificationsProvider"; import NotificationsIcon from "./components/NotificationsIcon"; import { QueryParamProvider } from "use-query-params"; import { ReactRouter6Adapter } from "use-query-params/adapters/react-router-6"; import ServiceDiscoveryPage from "./pages/service-discovery/ServiceDiscoveryPage"; import AlertmanagerDiscoveryPage from "./pages/AlertmanagerDiscoveryPage"; import { actionIconStyle, navIconStyle } from "./styles"; const queryClient = new QueryClient(); const mainNavPages = [ { title: "Query", path: "/query", icon: , element: , inAgentMode: false, }, { title: "Alerts", path: "/alerts", icon: , element: , inAgentMode: false, }, ]; const monitoringStatusPages = [ { title: "Target health", path: "/targets", icon: , element: , inAgentMode: true, }, { title: "Rule health", path: "/rules", icon: , element: , inAgentMode: false, }, { title: "Service discovery", path: "/service-discovery", icon: , element: , inAgentMode: true, }, ]; const serverStatusPages = [ { title: "Runtime & build information", path: "/status", icon: , element: , inAgentMode: true, }, { title: "TSDB status", path: "/tsdb-status", icon: , element: , inAgentMode: false, }, { title: "Command-line flags", path: "/flags", icon: , element: , inAgentMode: true, }, { title: "Configuration", path: "/config", icon: , element: , inAgentMode: true, }, { title: "Alertmanager discovery", path: "/alertmanager-discovery", icon: , element: , inAgentMode: false, }, ]; const allStatusPages = [...monitoringStatusPages, ...serverStatusPages]; const theme = createTheme({ colors: { "codebox-bg": [ "#f5f5f5", "#e7e7e7", "#cdcdcd", "#b2b2b2", "#9a9a9a", "#8b8b8b", "#848484", "#717171", "#656565", "#575757", ], }, }); const navLinkXPadding = "md"; function App() { const [opened, { toggle }] = useDisclosure(); const { agentMode, consolesLink, pathPrefix } = useSettings(); const navLinks = ( <> {consolesLink && ( )} {mainNavPages .filter((p) => !agentMode || p.inAgentMode) .map((p) => ( ))} {allStatusPages .filter((p) => !agentMode || p.inAgentMode) .map((p) => ( } /> ))} } /> Monitoring status {monitoringStatusPages .filter((p) => !agentMode || p.inAgentMode) .map((p) => ( {p.title} ))} Server status {serverStatusPages .filter((p) => !agentMode || p.inAgentMode) .map((p) => ( {p.title} ))} ); const navActionIcons = ( <> ); return ( Prometheus{agentMode && " Agent"} {navLinks} {navActionIcons} {navLinks} {navActionIcons} {Array.from(Array(10), (_, i) => ( ))} } > } /> {agentMode ? ( } /> ) : ( <> } /> } /> )} {allStatusPages.map((p) => ( {p.element} } /> ))} {/* */} ); } export default App;