diff --git a/Common/Server/EnvironmentConfig.ts b/Common/Server/EnvironmentConfig.ts index 61d9cfe231..8eabec1862 100644 --- a/Common/Server/EnvironmentConfig.ts +++ b/Common/Server/EnvironmentConfig.ts @@ -397,12 +397,14 @@ export const StatusPageApiClientUrl: URL = new URL( new Route(StatusPageApiRoute.toString()), ); -// Internal URL for server-to-server communication (uses internal Docker hostname) -export const StatusPageApiInternalUrl: URL = new URL( - Protocol.HTTP, - AppApiHostname.toString(), - new Route(StatusPageApiRoute.toString()), -); +/* + *Internal URL for server-to-server communication (uses internal Docker hostname) + *Note: The internal path is /api/status-page (not /status-page-api) because + * /status-page-api is the external route that Nginx rewrites to /api/status-page + */ +export const StatusPageApiInternalUrl: URL = URL.fromString( + AppApiClientUrl.toString(), +).addRoute(new Route("/status-page")); export const DashboardClientUrl: URL = new URL( HttpProtocol, diff --git a/Common/Types/Icon/IconProp.ts b/Common/Types/Icon/IconProp.ts index 5a7127ae9c..8047da298a 100644 --- a/Common/Types/Icon/IconProp.ts +++ b/Common/Types/Icon/IconProp.ts @@ -143,6 +143,7 @@ enum IconProp { Brain = "Brain", FlowDiagram = "FlowDiagram", GitHub = "GitHub", + Bug = "Bug", } export default IconProp; diff --git a/Common/UI/Components/Icon/Icon.tsx b/Common/UI/Components/Icon/Icon.tsx index 1bbaf93b40..9bae8a152b 100644 --- a/Common/UI/Components/Icon/Icon.tsx +++ b/Common/UI/Components/Icon/Icon.tsx @@ -1319,6 +1319,17 @@ const Icon: FunctionComponent = ({ /> , ); + } else if (icon === IconProp.Bug) { + // Bug icon for exceptions - matching home page + return getSvgWrapper( + <> + + + , + ); } return <>; diff --git a/Common/UI/Components/Navbar/NavBarMenuItem.tsx b/Common/UI/Components/Navbar/NavBarMenuItem.tsx index a1b96b3503..3ffa6274cf 100644 --- a/Common/UI/Components/Navbar/NavBarMenuItem.tsx +++ b/Common/UI/Components/Navbar/NavBarMenuItem.tsx @@ -84,6 +84,24 @@ const NavBarMenuItem: FunctionComponent = ( hoverBg: "hover:bg-violet-50", hoverRing: "group-hover:ring-violet-300", }, + orange: { + bg: "bg-orange-50", + ring: "ring-orange-200", + hoverBg: "hover:bg-orange-50", + hoverRing: "group-hover:ring-orange-300", + }, + stone: { + bg: "bg-stone-100", + ring: "ring-stone-300", + hoverBg: "hover:bg-stone-50", + hoverRing: "group-hover:ring-stone-400", + }, + sky: { + bg: "bg-sky-50", + ring: "ring-sky-200", + hoverBg: "hover:bg-sky-50", + hoverRing: "group-hover:ring-sky-300", + }, }; const colors: { diff --git a/Dashboard/src/App.tsx b/Dashboard/src/App.tsx index b748a253ed..52c6f1c708 100644 --- a/Dashboard/src/App.tsx +++ b/Dashboard/src/App.tsx @@ -178,6 +178,11 @@ const AIAgentTasksRoutes: React.LazyExoticComponent< > = lazy(() => { return import("./Routes/AIAgentTasksRoutes"); }); +const ExceptionsRoutes: React.LazyExoticComponent< + React.FunctionComponent +> = lazy(() => { + return import("./Routes/ExceptionsRoutes"); +}); const PageNotFound: React.LazyExoticComponent< React.FunctionComponent > = lazy(() => { @@ -610,6 +615,13 @@ const App: () => JSX.Element = () => { element={} /> + {/** Exceptions */} + + } + /> + {/* 👇️ only match this when no other routes match */} = ( props: ComponentProps, ): ReactElement => { const viewRoute: Route = RouteUtil.populateRouteParams( - RouteMap[PageMap.TELEMETRY_EXCEPTIONS_ROOT]!, + RouteMap[PageMap.EXCEPTIONS_VIEW_ROOT]!, ); const getResolvedIcon: GetReactElementFunction = (): ReactElement => { diff --git a/Dashboard/src/Components/Exceptions/ExceptionExplorer.tsx b/Dashboard/src/Components/Exceptions/ExceptionExplorer.tsx index 90125d0cab..b9fd7e6009 100644 --- a/Dashboard/src/Components/Exceptions/ExceptionExplorer.tsx +++ b/Dashboard/src/Components/Exceptions/ExceptionExplorer.tsx @@ -503,7 +503,7 @@ const ExceptionExplorer: FunctionComponent = ( modelType={TelemetryException} modelId={props.telemetryExceptionId} onDeleteSuccess={() => { - Navigation.navigate(RouteMap[PageMap.TELEMETRY] as Route); + Navigation.navigate(RouteMap[PageMap.EXCEPTIONS] as Route); }} /> diff --git a/Dashboard/src/Components/Exceptions/ExceptionsTable.tsx b/Dashboard/src/Components/Exceptions/ExceptionsTable.tsx index 5aa1caf396..ef601bc6f1 100644 --- a/Dashboard/src/Components/Exceptions/ExceptionsTable.tsx +++ b/Dashboard/src/Components/Exceptions/ExceptionsTable.tsx @@ -11,7 +11,6 @@ import TelemetryExceptionElement from "./ExceptionElement"; import RouteMap, { RouteUtil } from "../../Utils/RouteMap"; import Route from "Common/Types/API/Route"; import PageMap from "../../Utils/PageMap"; -import User from "Common/Models/DatabaseModels/User"; import { BulkActionFailed, BulkActionOnClickProps, @@ -35,19 +34,10 @@ export interface ComponentProps { const TelemetryExceptionTable: FunctionComponent = ( props: ComponentProps, ): ReactElement => { - let viewRoute: Route = RouteUtil.populateRouteParams( - RouteMap[PageMap.TELEMETRY_EXCEPTIONS_ROOT]!, + const viewRoute: Route = RouteUtil.populateRouteParams( + RouteMap[PageMap.EXCEPTIONS_VIEW_ROOT]!, ); - if (props.telemetryServiceId) { - viewRoute = RouteUtil.populateRouteParams( - RouteMap[PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS]!, - { - modelId: props.telemetryServiceId, - }, - ); - } - return ( @@ -399,21 +389,6 @@ const TelemetryExceptionTable: FunctionComponent = ( title: "Marked As Resolved At", type: FieldType.Date, }, - { - field: { - markedAsResolvedByUser: true, - }, - title: "Marked As Resolved At", - type: FieldType.EntityArray, - filterEntityType: User, - filterQuery: { - projectId: ProjectUtil.getCurrentProjectId()!, - }, - filterDropdownField: { - label: "name", - value: "_id", - }, - }, { field: { isArchived: true, @@ -428,21 +403,6 @@ const TelemetryExceptionTable: FunctionComponent = ( title: "Marked As Archived At", type: FieldType.Date, }, - { - field: { - markedAsArchivedByUser: true, - }, - title: "Marked As Archived At", - type: FieldType.EntityArray, - filterEntityType: User, - filterQuery: { - projectId: ProjectUtil.getCurrentProjectId()!, - }, - filterDropdownField: { - label: "name", - value: "_id", - }, - }, ]} selectMoreFields={{ isResolved: true, diff --git a/Dashboard/src/Components/NavBar/NavBar.tsx b/Dashboard/src/Components/NavBar/NavBar.tsx index 584b0979d0..9b01743236 100644 --- a/Dashboard/src/Components/NavBar/NavBar.tsx +++ b/Dashboard/src/Components/NavBar/NavBar.tsx @@ -92,6 +92,15 @@ const DashboardNavbar: FunctionComponent = ( icon: IconProp.Brain, iconColor: "violet", }, + { + title: "Exceptions", + description: "Track and manage exceptions.", + route: RouteUtil.populateRouteParams( + RouteMap[PageMap.EXCEPTIONS] as Route, + ), + icon: IconProp.Bug, + iconColor: "orange", + }, { title: "Service Catalog", description: "Manage services and dependencies.", diff --git a/Dashboard/src/Pages/Telemetry/Exceptions/Archived.tsx b/Dashboard/src/Pages/Exceptions/Archived.tsx similarity index 77% rename from Dashboard/src/Pages/Telemetry/Exceptions/Archived.tsx rename to Dashboard/src/Pages/Exceptions/Archived.tsx index e45ba73d03..e8035d781f 100644 --- a/Dashboard/src/Pages/Telemetry/Exceptions/Archived.tsx +++ b/Dashboard/src/Pages/Exceptions/Archived.tsx @@ -1,9 +1,9 @@ -import PageComponentProps from "../../PageComponentProps"; +import PageComponentProps from "../PageComponentProps"; import ErrorMessage from "Common/UI/Components/ErrorMessage/ErrorMessage"; import React, { FunctionComponent, ReactElement } from "react"; -import ExceptionsTable from "../../../Components/Exceptions/ExceptionsTable"; +import ExceptionsTable from "../../Components/Exceptions/ExceptionsTable"; -const Services: FunctionComponent = ( +const ArchivedExceptionsPage: FunctionComponent = ( props: PageComponentProps, ): ReactElement => { const disableTelemetryForThisProject: boolean = @@ -26,4 +26,4 @@ const Services: FunctionComponent = ( ); }; -export default Services; +export default ArchivedExceptionsPage; diff --git a/Dashboard/src/Pages/Exceptions/Layout.tsx b/Dashboard/src/Pages/Exceptions/Layout.tsx new file mode 100644 index 0000000000..97ade5b2cb --- /dev/null +++ b/Dashboard/src/Pages/Exceptions/Layout.tsx @@ -0,0 +1,35 @@ +import { getExceptionsBreadcrumbs } from "../../Utils/Breadcrumbs"; +import PageMap from "../../Utils/PageMap"; +import RouteMap, { RouteUtil } from "../../Utils/RouteMap"; +import PageComponentProps from "../PageComponentProps"; +import SideMenu from "./SideMenu"; +import Page from "Common/UI/Components/Page/Page"; +import Navigation from "Common/UI/Utils/Navigation"; +import React, { FunctionComponent, ReactElement } from "react"; +import { Outlet } from "react-router-dom"; + +const ExceptionsLayout: FunctionComponent< + PageComponentProps +> = (): ReactElement => { + const path: string = Navigation.getRoutePath(RouteUtil.getRoutes()); + + if (path.endsWith("exceptions") || path.endsWith("exceptions/*")) { + Navigation.navigate( + RouteUtil.populateRouteParams(RouteMap[PageMap.EXCEPTIONS_UNRESOLVED]!), + ); + + return <>; + } + + return ( + } + > + + + ); +}; + +export default ExceptionsLayout; diff --git a/Dashboard/src/Pages/Telemetry/Exceptions/Resolved.tsx b/Dashboard/src/Pages/Exceptions/Resolved.tsx similarity index 76% rename from Dashboard/src/Pages/Telemetry/Exceptions/Resolved.tsx rename to Dashboard/src/Pages/Exceptions/Resolved.tsx index 3419c9837f..68f6326340 100644 --- a/Dashboard/src/Pages/Telemetry/Exceptions/Resolved.tsx +++ b/Dashboard/src/Pages/Exceptions/Resolved.tsx @@ -1,9 +1,9 @@ -import PageComponentProps from "../../PageComponentProps"; +import PageComponentProps from "../PageComponentProps"; import ErrorMessage from "Common/UI/Components/ErrorMessage/ErrorMessage"; import React, { FunctionComponent, ReactElement } from "react"; -import ExceptionsTable from "../../../Components/Exceptions/ExceptionsTable"; +import ExceptionsTable from "../../Components/Exceptions/ExceptionsTable"; -const Services: FunctionComponent = ( +const ResolvedExceptionsPage: FunctionComponent = ( props: PageComponentProps, ): ReactElement => { const disableTelemetryForThisProject: boolean = @@ -27,4 +27,4 @@ const Services: FunctionComponent = ( ); }; -export default Services; +export default ResolvedExceptionsPage; diff --git a/Dashboard/src/Pages/Exceptions/SideMenu.tsx b/Dashboard/src/Pages/Exceptions/SideMenu.tsx new file mode 100644 index 0000000000..85964e7730 --- /dev/null +++ b/Dashboard/src/Pages/Exceptions/SideMenu.tsx @@ -0,0 +1,59 @@ +import TelemetryException from "Common/Models/DatabaseModels/TelemetryException"; +import PageMap from "../../Utils/PageMap"; +import RouteMap, { RouteUtil } from "../../Utils/RouteMap"; +import Route from "Common/Types/API/Route"; +import IconProp from "Common/Types/Icon/IconProp"; +import SideMenu, { + SideMenuSectionProps, +} from "Common/UI/Components/SideMenu/SideMenu"; +import React, { FunctionComponent, ReactElement } from "react"; +import { BadgeType } from "Common/UI/Components/Badge/Badge"; +import ProjectUtil from "Common/UI/Utils/Project"; + +const DashboardSideMenu: FunctionComponent = (): ReactElement => { + const sections: SideMenuSectionProps[] = [ + { + title: "Exceptions", + items: [ + { + link: { + title: "Unresolved", + to: RouteUtil.populateRouteParams( + RouteMap[PageMap.EXCEPTIONS_UNRESOLVED] as Route, + ), + }, + badgeType: BadgeType.DANGER, + icon: IconProp.Alert, + modelType: TelemetryException, + countQuery: { + projectId: ProjectUtil.getCurrentProjectId()!, + isResolved: false, + isArchived: false, + } as any, + }, + { + link: { + title: "Resolved", + to: RouteUtil.populateRouteParams( + RouteMap[PageMap.EXCEPTIONS_RESOLVED] as Route, + ), + }, + icon: IconProp.Check, + }, + { + link: { + title: "Archived", + to: RouteUtil.populateRouteParams( + RouteMap[PageMap.EXCEPTIONS_ARCHIVED] as Route, + ), + }, + icon: IconProp.Archive, + }, + ], + }, + ]; + + return ; +}; + +export default DashboardSideMenu; diff --git a/Dashboard/src/Pages/Telemetry/Exceptions/Unresolved.tsx b/Dashboard/src/Pages/Exceptions/Unresolved.tsx similarity index 76% rename from Dashboard/src/Pages/Telemetry/Exceptions/Unresolved.tsx rename to Dashboard/src/Pages/Exceptions/Unresolved.tsx index 1d4be7934c..a97e695fdc 100644 --- a/Dashboard/src/Pages/Telemetry/Exceptions/Unresolved.tsx +++ b/Dashboard/src/Pages/Exceptions/Unresolved.tsx @@ -1,9 +1,9 @@ -import PageComponentProps from "../../PageComponentProps"; +import PageComponentProps from "../PageComponentProps"; import ErrorMessage from "Common/UI/Components/ErrorMessage/ErrorMessage"; import React, { FunctionComponent, ReactElement } from "react"; -import ExceptionsTable from "../../../Components/Exceptions/ExceptionsTable"; +import ExceptionsTable from "../../Components/Exceptions/ExceptionsTable"; -const Services: FunctionComponent = ( +const UnresolvedExceptionsPage: FunctionComponent = ( props: PageComponentProps, ): ReactElement => { const disableTelemetryForThisProject: boolean = @@ -27,4 +27,4 @@ const Services: FunctionComponent = ( ); }; -export default Services; +export default UnresolvedExceptionsPage; diff --git a/Dashboard/src/Pages/Telemetry/Exceptions/View/Index.tsx b/Dashboard/src/Pages/Exceptions/View/Index.tsx similarity index 63% rename from Dashboard/src/Pages/Telemetry/Exceptions/View/Index.tsx rename to Dashboard/src/Pages/Exceptions/View/Index.tsx index bd0585d6d2..cd957585c8 100644 --- a/Dashboard/src/Pages/Telemetry/Exceptions/View/Index.tsx +++ b/Dashboard/src/Pages/Exceptions/View/Index.tsx @@ -1,10 +1,10 @@ import Navigation from "Common/UI/Utils/Navigation"; -import ExceptionExplorer from "../../../../Components/Exceptions/ExceptionExplorer"; -import PageComponentProps from "../../../PageComponentProps"; +import ExceptionExplorer from "../../../Components/Exceptions/ExceptionExplorer"; +import PageComponentProps from "../../PageComponentProps"; import React, { Fragment, FunctionComponent, ReactElement } from "react"; import ObjectID from "Common/Types/ObjectID"; -const TelemetryMetricViewPage: FunctionComponent< +const ExceptionViewPage: FunctionComponent< PageComponentProps > = (): ReactElement => { const exceptionId: string = Navigation.getLastParamAsString(0); @@ -16,4 +16,4 @@ const TelemetryMetricViewPage: FunctionComponent< ); }; -export default TelemetryMetricViewPage; +export default ExceptionViewPage; diff --git a/Dashboard/src/Pages/Telemetry/Exceptions/View/Layout.tsx b/Dashboard/src/Pages/Exceptions/View/Layout.tsx similarity index 52% rename from Dashboard/src/Pages/Telemetry/Exceptions/View/Layout.tsx rename to Dashboard/src/Pages/Exceptions/View/Layout.tsx index 42e12cee2b..90a99e4144 100644 --- a/Dashboard/src/Pages/Telemetry/Exceptions/View/Layout.tsx +++ b/Dashboard/src/Pages/Exceptions/View/Layout.tsx @@ -1,22 +1,20 @@ -import { getTelemetryBreadcrumbs } from "../../../../Utils/Breadcrumbs"; -import RouteMap, { RouteUtil } from "../../../../Utils/RouteMap"; -import PageComponentProps from "../../../PageComponentProps"; +import { getExceptionsBreadcrumbs } from "../../../Utils/Breadcrumbs"; +import RouteMap, { RouteUtil } from "../../../Utils/RouteMap"; +import PageComponentProps from "../../PageComponentProps"; import Page from "Common/UI/Components/Page/Page"; import Navigation from "Common/UI/Utils/Navigation"; import React, { FunctionComponent, ReactElement } from "react"; import { Outlet } from "react-router-dom"; -import PageMap from "../../../../Utils/PageMap"; +import PageMap from "../../../Utils/PageMap"; -const MetricsLayout: FunctionComponent< +const ExceptionViewLayout: FunctionComponent< PageComponentProps > = (): ReactElement => { const path: string = Navigation.getRoutePath(RouteUtil.getRoutes()); if (path.endsWith("exceptions")) { Navigation.navigate( - RouteUtil.populateRouteParams( - RouteMap[PageMap.TELEMETRY_EXCEPTIONS_UNRESOLVED]!, - ), + RouteUtil.populateRouteParams(RouteMap[PageMap.EXCEPTIONS_UNRESOLVED]!), ); return <>; @@ -25,11 +23,11 @@ const MetricsLayout: FunctionComponent< return ( ); }; -export default MetricsLayout; +export default ExceptionViewLayout; diff --git a/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/Archived.tsx b/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/Archived.tsx deleted file mode 100644 index 505d9ff7fe..0000000000 --- a/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/Archived.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import PageComponentProps from "../../../../PageComponentProps"; -import ObjectID from "Common/Types/ObjectID"; -import Navigation from "Common/UI/Utils/Navigation"; -import React, { - FunctionComponent, - ReactElement, - useEffect, - useState, -} from "react"; -import TelemetryService from "Common/Models/DatabaseModels/TelemetryService"; -import ErrorMessage from "Common/UI/Components/ErrorMessage/ErrorMessage"; -import PageLoader from "Common/UI/Components/Loader/PageLoader"; -import ModelAPI from "Common/UI/Utils/ModelAPI/ModelAPI"; -import API from "Common/UI/Utils/API/API"; -import { PromiseVoidFunction } from "Common/Types/FunctionTypes"; -import ExceptionsTable from "../../../../../Components/Exceptions/ExceptionsTable"; - -const MetricsTablePage: FunctionComponent< - PageComponentProps -> = (): ReactElement => { - const modelId: ObjectID = Navigation.getLastParamAsObjectID(2); - - const [telemetryService, setTelemetryService] = - useState(null); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(""); - - useEffect(() => { - fetchTelemetryService().catch((err: Error) => { - setError(API.getFriendlyMessage(err)); - }); - }, []); - - const fetchTelemetryService: PromiseVoidFunction = - async (): Promise => { - try { - setIsLoading(true); - - const telemetryService: TelemetryService | null = - await ModelAPI.getItem({ - modelType: TelemetryService, - id: modelId, - select: { - name: true, - }, - }); - - if (!telemetryService) { - setIsLoading(false); - setError("Telemetry Service not found."); - return; - } - - setTelemetryService(telemetryService); - setIsLoading(false); - } catch (err) { - setIsLoading(false); - setError(API.getFriendlyMessage(err)); - } - }; - - if (error) { - return ; - } - - if (isLoading) { - return ; - } - - if (!telemetryService) { - return ; - } - - return ( - - ); -}; - -export default MetricsTablePage; diff --git a/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/Resolved.tsx b/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/Resolved.tsx deleted file mode 100644 index c0419e3b50..0000000000 --- a/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/Resolved.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import PageComponentProps from "../../../../PageComponentProps"; -import ObjectID from "Common/Types/ObjectID"; -import Navigation from "Common/UI/Utils/Navigation"; -import React, { - FunctionComponent, - ReactElement, - useEffect, - useState, -} from "react"; -import TelemetryService from "Common/Models/DatabaseModels/TelemetryService"; -import ErrorMessage from "Common/UI/Components/ErrorMessage/ErrorMessage"; -import PageLoader from "Common/UI/Components/Loader/PageLoader"; -import ModelAPI from "Common/UI/Utils/ModelAPI/ModelAPI"; -import API from "Common/UI/Utils/API/API"; -import { PromiseVoidFunction } from "Common/Types/FunctionTypes"; -import ExceptionsTable from "../../../../../Components/Exceptions/ExceptionsTable"; - -const MetricsTablePage: FunctionComponent< - PageComponentProps -> = (): ReactElement => { - const modelId: ObjectID = Navigation.getLastParamAsObjectID(2); - - const [telemetryService, setTelemetryService] = - useState(null); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(""); - - useEffect(() => { - fetchTelemetryService().catch((err: Error) => { - setError(API.getFriendlyMessage(err)); - }); - }, []); - - const fetchTelemetryService: PromiseVoidFunction = - async (): Promise => { - try { - setIsLoading(true); - - const telemetryService: TelemetryService | null = - await ModelAPI.getItem({ - modelType: TelemetryService, - id: modelId, - select: { - name: true, - }, - }); - - if (!telemetryService) { - setIsLoading(false); - setError("Telemetry Service not found."); - return; - } - - setTelemetryService(telemetryService); - setIsLoading(false); - } catch (err) { - setIsLoading(false); - setError(API.getFriendlyMessage(err)); - } - }; - - if (error) { - return ; - } - - if (isLoading) { - return ; - } - - if (!telemetryService) { - return ; - } - - return ( - - ); -}; - -export default MetricsTablePage; diff --git a/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/Unresolved.tsx b/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/Unresolved.tsx deleted file mode 100644 index 5edc7862b6..0000000000 --- a/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/Unresolved.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import PageComponentProps from "../../../../PageComponentProps"; -import ObjectID from "Common/Types/ObjectID"; -import Navigation from "Common/UI/Utils/Navigation"; -import React, { - FunctionComponent, - ReactElement, - useEffect, - useState, -} from "react"; -import TelemetryService from "Common/Models/DatabaseModels/TelemetryService"; -import ErrorMessage from "Common/UI/Components/ErrorMessage/ErrorMessage"; -import PageLoader from "Common/UI/Components/Loader/PageLoader"; -import ModelAPI from "Common/UI/Utils/ModelAPI/ModelAPI"; -import API from "Common/UI/Utils/API/API"; -import { PromiseVoidFunction } from "Common/Types/FunctionTypes"; -import ExceptionsTable from "../../../../../Components/Exceptions/ExceptionsTable"; - -const MetricsTablePage: FunctionComponent< - PageComponentProps -> = (): ReactElement => { - const modelId: ObjectID = Navigation.getLastParamAsObjectID(2); - - const [telemetryService, setTelemetryService] = - useState(null); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(""); - - useEffect(() => { - fetchTelemetryService().catch((err: Error) => { - setError(API.getFriendlyMessage(err)); - }); - }, []); - - const fetchTelemetryService: PromiseVoidFunction = - async (): Promise => { - try { - setIsLoading(true); - - const telemetryService: TelemetryService | null = - await ModelAPI.getItem({ - modelType: TelemetryService, - id: modelId, - select: { - name: true, - }, - }); - - if (!telemetryService) { - setIsLoading(false); - setError("Telemetry Service not found."); - return; - } - - setTelemetryService(telemetryService); - setIsLoading(false); - } catch (err) { - setIsLoading(false); - setError(API.getFriendlyMessage(err)); - } - }; - - if (error) { - return ; - } - - if (isLoading) { - return ; - } - - if (!telemetryService) { - return ; - } - - return ( - - ); -}; - -export default MetricsTablePage; diff --git a/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/View/Index.tsx b/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/View/Index.tsx deleted file mode 100644 index d1093408a4..0000000000 --- a/Dashboard/src/Pages/Telemetry/Services/View/Exceptions/View/Index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import PageComponentProps from "../../../../../PageComponentProps"; -import ObjectID from "Common/Types/ObjectID"; -import Navigation from "Common/UI/Utils/Navigation"; -import React, { Fragment, FunctionComponent, ReactElement } from "react"; -import ExceptionExplorer from "../../../../../../Components/Exceptions/ExceptionExplorer"; - -const ServiceDelete: FunctionComponent< - PageComponentProps -> = (): ReactElement => { - const modelId: ObjectID = Navigation.getLastParamAsObjectID(); - - return ( - - - - ); -}; - -export default ServiceDelete; diff --git a/Dashboard/src/Pages/Telemetry/Services/View/SideMenu.tsx b/Dashboard/src/Pages/Telemetry/Services/View/SideMenu.tsx index cbab219599..4aab48c413 100644 --- a/Dashboard/src/Pages/Telemetry/Services/View/SideMenu.tsx +++ b/Dashboard/src/Pages/Telemetry/Services/View/SideMenu.tsx @@ -3,14 +3,10 @@ import RouteMap, { RouteUtil } from "../../../../Utils/RouteMap"; import Route from "Common/Types/API/Route"; import IconProp from "Common/Types/Icon/IconProp"; import ObjectID from "Common/Types/ObjectID"; -import { BadgeType } from "Common/UI/Components/Badge/Badge"; import SideMenu from "Common/UI/Components/SideMenu/SideMenu"; import SideMenuItem from "Common/UI/Components/SideMenu/SideMenuItem"; import SideMenuSection from "Common/UI/Components/SideMenu/SideMenuSection"; import React, { FunctionComponent, ReactElement } from "react"; -import TelemetryException from "Common/Models/DatabaseModels/TelemetryException"; -import CountModelSideMenuItem from "Common/UI/Components/SideMenu/CountModelSideMenuItem"; -import ProjectUtil from "Common/UI/Utils/Project"; export interface ComponentProps { modelId: ObjectID; @@ -75,52 +71,6 @@ const DashboardSideMenu: FunctionComponent = ( icon={IconProp.ChartBar} /> - - - link={{ - title: "Unresolved", - to: RouteUtil.populateRouteParams( - RouteMap[ - PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_UNRESOLVED - ] as Route, - { modelId: props.modelId }, - ), - }} - badgeType={BadgeType.DANGER} - icon={IconProp.Alert} - countQuery={{ - projectId: ProjectUtil.getCurrentProjectId()!, - isResolved: false, - isArchived: false, - telemetryServiceId: props.modelId, - }} - modelType={TelemetryException} - /> - - - { const sections: SideMenuSectionProps[] = [ @@ -67,45 +64,6 @@ const DashboardSideMenu: FunctionComponent = (): ReactElement => { }, ], }, - { - title: "Exceptions", - items: [ - { - link: { - title: "Unresolved", - to: RouteUtil.populateRouteParams( - RouteMap[PageMap.TELEMETRY_EXCEPTIONS_UNRESOLVED] as Route, - ), - }, - badgeType: BadgeType.DANGER, - icon: IconProp.Alert, - modelType: TelemetryException, - countQuery: { - projectId: ProjectUtil.getCurrentProjectId()!, - isResolved: false, - isArchived: false, - } as any, - }, - { - link: { - title: "Resolved", - to: RouteUtil.populateRouteParams( - RouteMap[PageMap.TELEMETRY_EXCEPTIONS_RESOLVED] as Route, - ), - }, - icon: IconProp.Check, - }, - { - link: { - title: "Archived", - to: RouteUtil.populateRouteParams( - RouteMap[PageMap.TELEMETRY_EXCEPTIONS_ARCHIVED] as Route, - ), - }, - icon: IconProp.Archive, - }, - ], - }, ]; return ; diff --git a/Dashboard/src/Routes/ExceptionsRoutes.tsx b/Dashboard/src/Routes/ExceptionsRoutes.tsx new file mode 100644 index 0000000000..a27dd581ab --- /dev/null +++ b/Dashboard/src/Routes/ExceptionsRoutes.tsx @@ -0,0 +1,117 @@ +import Loader from "../Components/Loader/Loader"; +import ComponentProps from "../Pages/PageComponentProps"; +import ExceptionsLayout from "../Pages/Exceptions/Layout"; +import ExceptionViewLayout from "../Pages/Exceptions/View/Layout"; +import PageMap from "../Utils/PageMap"; +import RouteMap, { ExceptionsRoutePath } from "../Utils/RouteMap"; +import Route from "Common/Types/API/Route"; +import React, { + FunctionComponent, + LazyExoticComponent, + ReactElement, + Suspense, + lazy, +} from "react"; +import { Route as PageRoute, Routes } from "react-router-dom"; + +// Lazy Pages +const ExceptionsUnresolved: LazyExoticComponent< + FunctionComponent +> = lazy(() => { + return import("../Pages/Exceptions/Unresolved"); +}); + +const ExceptionsResolved: LazyExoticComponent< + FunctionComponent +> = lazy(() => { + return import("../Pages/Exceptions/Resolved"); +}); + +const ExceptionsArchived: LazyExoticComponent< + FunctionComponent +> = lazy(() => { + return import("../Pages/Exceptions/Archived"); +}); + +const ExceptionView: LazyExoticComponent> = + lazy(() => { + return import("../Pages/Exceptions/View/Index"); + }); + +const ExceptionsRoutes: FunctionComponent = ( + props: ComponentProps, +): ReactElement => { + return ( + + }> + + + + } + /> + + + + + } + /> + + + + + } + /> + + + + + } + /> + + + {/* Exception View - separate from main layout */} + } + > + + + + } + /> + + + ); +}; + +export default ExceptionsRoutes; diff --git a/Dashboard/src/Routes/TelemetryRoutes.tsx b/Dashboard/src/Routes/TelemetryRoutes.tsx index c537daeab1..7fef016930 100644 --- a/Dashboard/src/Routes/TelemetryRoutes.tsx +++ b/Dashboard/src/Routes/TelemetryRoutes.tsx @@ -2,7 +2,6 @@ import Loader from "../Components/Loader/Loader"; import ComponentProps from "../Pages/PageComponentProps"; import TelemetryServiceViewLayout from "../Pages/Telemetry/Services/View/Layout"; import TelemetryMetricLayout from "../Pages/Telemetry/Metrics/View/Layout"; -import TelemetryExceptionViewLayout from "../Pages/Telemetry/Exceptions/View/Layout"; import TelemetryTraceLayout from "../Pages/Telemetry/Traces/View/Layout"; import TelemetryViewLayout from "../Pages/Telemetry/Layout"; import PageMap from "../Utils/PageMap"; @@ -46,36 +45,6 @@ const TelemetryTraces: LazyExoticComponent> = return import("../Pages/Telemetry/Traces"); }); -const TelemetryExceptionsUnresolved: LazyExoticComponent< - FunctionComponent -> = lazy(() => { - return import("../Pages/Telemetry/Exceptions/Unresolved"); -}); - -const TelemetryExceptionsResolved: LazyExoticComponent< - FunctionComponent -> = lazy(() => { - return import("../Pages/Telemetry/Exceptions/Resolved"); -}); - -const TelemetryServiceViewException: LazyExoticComponent< - FunctionComponent -> = lazy(() => { - return import("../Pages/Telemetry/Services/View/Exceptions/View/Index"); -}); - -const TelemetryExceptionsArchived: LazyExoticComponent< - FunctionComponent -> = lazy(() => { - return import("../Pages/Telemetry/Exceptions/Archived"); -}); - -const TelemetryViewException: LazyExoticComponent< - FunctionComponent -> = lazy(() => { - return import("../Pages/Telemetry/Exceptions/View/Index"); -}); - const TelemetryMetrics: LazyExoticComponent> = lazy(() => { return import("../Pages/Telemetry/Metrics"); @@ -128,25 +97,6 @@ const TelemetryServiceViewMetrics: LazyExoticComponent< return import("../Pages/Telemetry/Services/View/Metrics/Index"); }); -// Exceptions Service -const TelemetryExceptionsServiceUnresolved: LazyExoticComponent< - FunctionComponent -> = lazy(() => { - return import("../Pages/Telemetry/Services/View/Exceptions/Unresolved"); -}); - -const TelemetryExceptionsServiceResolved: LazyExoticComponent< - FunctionComponent -> = lazy(() => { - return import("../Pages/Telemetry/Services/View/Exceptions/Resolved"); -}); - -const TelemetryExceptionsServiceArchived: LazyExoticComponent< - FunctionComponent -> = lazy(() => { - return import("../Pages/Telemetry/Services/View/Exceptions/Archived"); -}); - const TelemetryServicesViewSettings: LazyExoticComponent< FunctionComponent > = lazy(() => { @@ -213,54 +163,6 @@ const TelemetryRoutes: FunctionComponent = ( } /> - {/** Exceptions - Unresolved, Resolved, Archived */} - - - - - } - /> - - - - - } - /> - - - - - } - /> - - {/** ---- */} - = ( /> - {/** Exception View */} - - } - > - - - - } - /> - - - - - } - /> - - {/* Trace View */} = ( } /> - {/** Telemetry Service Exceptions */} - - - - - } - /> - - - - - } - /> - - - - - } - /> - - - - - } - /> - | undefined { + const breadcrumpLinksMap: Dictionary = { + ...BuildBreadcrumbLinksByTitles(PageMap.EXCEPTIONS, [ + "Project", + "Exceptions", + ]), + ...BuildBreadcrumbLinksByTitles(PageMap.EXCEPTIONS_UNRESOLVED, [ + "Project", + "Exceptions", + "Unresolved", + ]), + ...BuildBreadcrumbLinksByTitles(PageMap.EXCEPTIONS_RESOLVED, [ + "Project", + "Exceptions", + "Resolved", + ]), + ...BuildBreadcrumbLinksByTitles(PageMap.EXCEPTIONS_ARCHIVED, [ + "Project", + "Exceptions", + "Archived", + ]), + ...BuildBreadcrumbLinksByTitles(PageMap.EXCEPTIONS_VIEW, [ + "Project", + "Exceptions", + "View Exception", + ]), + }; + return breadcrumpLinksMap[path]; +} diff --git a/Dashboard/src/Utils/Breadcrumbs/TelemetryBreadcrumbs.ts b/Dashboard/src/Utils/Breadcrumbs/TelemetryBreadcrumbs.ts index 000498507e..3c85407e6e 100644 --- a/Dashboard/src/Utils/Breadcrumbs/TelemetryBreadcrumbs.ts +++ b/Dashboard/src/Utils/Breadcrumbs/TelemetryBreadcrumbs.ts @@ -26,34 +26,6 @@ export function getTelemetryBreadcrumbs(path: string): Array | undefined { "Metrics", ]), - ...BuildBreadcrumbLinksByTitles(PageMap.TELEMETRY_EXCEPTIONS_ARCHIVED, [ - "Project", - "Telemetry", - "Exceptions", - "Archived", - ]), - - ...BuildBreadcrumbLinksByTitles(PageMap.TELEMETRY_EXCEPTIONS_RESOLVED, [ - "Project", - "Telemetry", - "Exceptions", - "Resolved", - ]), - - ...BuildBreadcrumbLinksByTitles(PageMap.TELEMETRY_EXCEPTIONS_UNRESOLVED, [ - "Project", - "Telemetry", - "Exceptions", - "Unresolved", - ]), - - ...BuildBreadcrumbLinksByTitles(PageMap.TELEMETRY_EXCEPTIONS_VIEW, [ - "Project", - "Telemetry", - "Exceptions", - "View Exception", - ]), - ...BuildBreadcrumbLinksByTitles(PageMap.TELEMETRY_METRIC_VIEW, [ "Project", "Telemetry", @@ -97,55 +69,6 @@ export function getTelemetryBreadcrumbs(path: string): Array | undefined { "Metrics", ]), - // service exceptions. - ...BuildBreadcrumbLinksByTitles( - PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS, - ["Project", "Telemetry", "Services", "View Service", "Exceptions"], - ), - - // service exceptions. - ...BuildBreadcrumbLinksByTitles(PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTION, [ - "Project", - "Telemetry", - "Services", - "View Service", - "Exceptions", - "View Exception", - ]), - - ...BuildBreadcrumbLinksByTitles( - PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_UNRESOLVED, - [ - "Project", - "Telemetry", - "Services", - "View Service", - "Exceptions", - "Unresolved", - ], - ), - ...BuildBreadcrumbLinksByTitles( - PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_RESOLVED, - [ - "Project", - "Telemetry", - "Services", - "View Service", - "Exceptions", - "Resolved", - ], - ), - ...BuildBreadcrumbLinksByTitles( - PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_ARCHIVED, - [ - "Project", - "Telemetry", - "Services", - "View Service", - "Exceptions", - "Archived", - ], - ), ...BuildBreadcrumbLinksByTitles(PageMap.TELEMETRY_SERVICES_VIEW_TRACES, [ "Project", "Telemetry", diff --git a/Dashboard/src/Utils/Breadcrumbs/index.ts b/Dashboard/src/Utils/Breadcrumbs/index.ts index 3518f9b616..e70d5e750d 100644 --- a/Dashboard/src/Utils/Breadcrumbs/index.ts +++ b/Dashboard/src/Utils/Breadcrumbs/index.ts @@ -11,3 +11,4 @@ export * from "./ServiceCatalogBreadcrumbs"; export * from "./CodeRepositoryBreadcrumbs"; export * from "./DashboardBreadCrumbs"; export * from "./AIAgentTasksBreadcrumbs"; +export * from "./ExceptionsBreadcrumbs"; diff --git a/Dashboard/src/Utils/PageMap.ts b/Dashboard/src/Utils/PageMap.ts index e6fd809cb6..eda812d6b8 100644 --- a/Dashboard/src/Utils/PageMap.ts +++ b/Dashboard/src/Utils/PageMap.ts @@ -13,20 +13,12 @@ enum PageMap { TELEMETRY_METRIC_ROOT = "TELEMETRY_METRIC_ROOT", TELEMETRY_TRACE_ROOT = "TELEMETRY_TRACE_ROOT", TELEMETRY_LOG_ROOT = "TELEMETRY_LOG_ROOT", - TELEMETRY_EXCEPTIONS_ROOT = "TELEMETRY_EXCEPTIONS_ROOT", TELEMETRY_SERVICES_VIEW_ROOT = "TELEMETRY_SERVICES_VIEW_ROOT", TELEMETRY = "TELEMETRY", TELEMETRY_SERVICES = "TELEMETRY_SERVICES", TELEMETRY_DOCUMENTATION = "TELEMETRY_DOCUMENTATION", - TELEMETRY_EXCEPTIONS = "TELEMETRY_EXCEPTIONS", - TELEMETRY_EXCEPTIONS_UNRESOLVED = "TELEMETRY_EXCEPTIONS_UNRESOLVED", - TELEMETRY_EXCEPTIONS_RESOLVED = "TELEMETRY_EXCEPTIONS_RESOLVED", - TELEMETRY_EXCEPTIONS_ARCHIVED = "TELEMETRY_EXCEPTIONS_ARCHIVED", - TELEMETRY_EXCEPTIONS_VIEW = "TELEMETRY_EXCEPTIONS_VIEW", - TELEMETRY_EXCEPTIONS_VIEW_DELETE = "TELEMETRY_EXCEPTIONS_VIEW_DELETE", - TELEMETRY_TRACES = "TELEMETRY_TRACES", TELEMETRY_TRACE_VIEW = "TELEMETRY_TRACE_VIEW", @@ -42,16 +34,6 @@ enum PageMap { // Telemetry - LOGS TELEMETRY_SERVICES_VIEW_LOGS = "TELEMETRY_SERVICE_VIEW_LOGS", - // Exceptions - TELEMETRY_SERVICES_VIEW_EXCEPTIONS = "TELEMETRY_SERVICE_VIEW_EXCEPTIONS", - TELEMETRY_SERVICES_VIEW_EXCEPTION = "TELEMETRY_SERVICE_VIEW_EXCEPTION", - // Exceptions - Unresolved - TELEMETRY_SERVICES_VIEW_EXCEPTIONS_UNRESOLVED = "TELEMETRY_SERVICE_VIEW_EXCEPTIONS_UNRESOLVED", - // Exceptions - Resolved - TELEMETRY_SERVICES_VIEW_EXCEPTIONS_RESOLVED = "TELEMETRY_SERVICE_VIEW_EXCEPTIONS_RESOLVED", - // Exceptions - Archived - TELEMETRY_SERVICES_VIEW_EXCEPTIONS_ARCHIVED = "TELEMETRY_SERVICE_VIEW_EXCEPTIONS_ARCHIVED", - // Traces TELEMETRY_SERVICES_VIEW_TRACES = "TELEMETRY_SERVICE_VIEW_TRACES", TELEMETRY_SERVICES_VIEW_TRACE = "TELEMETRY_SERVICE_VIEW_TRACE", @@ -430,6 +412,15 @@ enum PageMap { AI_AGENT_TASK_VIEW_PULL_REQUESTS = "AI_AGENT_TASK_VIEW_PULL_REQUESTS", AI_AGENT_TASK_VIEW_DELETE = "AI_AGENT_TASK_VIEW_DELETE", + // Exceptions (standalone, not under Telemetry) + EXCEPTIONS_ROOT = "EXCEPTIONS_ROOT", + EXCEPTIONS = "EXCEPTIONS", + EXCEPTIONS_UNRESOLVED = "EXCEPTIONS_UNRESOLVED", + EXCEPTIONS_RESOLVED = "EXCEPTIONS_RESOLVED", + EXCEPTIONS_ARCHIVED = "EXCEPTIONS_ARCHIVED", + EXCEPTIONS_VIEW_ROOT = "EXCEPTIONS_VIEW_ROOT", + EXCEPTIONS_VIEW = "EXCEPTIONS_VIEW", + // Push Logs in resource views } diff --git a/Dashboard/src/Utils/RouteMap.ts b/Dashboard/src/Utils/RouteMap.ts index 9c9b2af966..25a9655b3d 100644 --- a/Dashboard/src/Utils/RouteMap.ts +++ b/Dashboard/src/Utils/RouteMap.ts @@ -78,10 +78,6 @@ export const TelemetryRoutePath: Dictionary = { [PageMap.TELEMETRY_LOGS]: "logs", [PageMap.TELEMETRY_TRACES]: "traces", [PageMap.TELEMETRY_METRICS]: "metrics", - [PageMap.TELEMETRY_EXCEPTIONS]: "exceptions/unresolved", - [PageMap.TELEMETRY_EXCEPTIONS_RESOLVED]: "exceptions/resolved", - [PageMap.TELEMETRY_EXCEPTIONS_UNRESOLVED]: "exceptions/unresolved", - [PageMap.TELEMETRY_EXCEPTIONS_ARCHIVED]: "exceptions/archived", [PageMap.TELEMETRY_SERVICES_VIEW_ROOT]: "services", [PageMap.TELEMETRY_METRIC_ROOT]: `metric`, @@ -90,27 +86,26 @@ export const TelemetryRoutePath: Dictionary = { [PageMap.TELEMETRY_TRACE_ROOT]: `traces/view`, [PageMap.TELEMETRY_TRACE_VIEW]: `traces/view/${RouteParams.ModelID}`, // modelID is spanId - [PageMap.TELEMETRY_EXCEPTIONS_ROOT]: `exceptions`, - [PageMap.TELEMETRY_EXCEPTIONS_VIEW]: `exceptions/${RouteParams.ModelID}`, - [PageMap.TELEMETRY_LOG_ROOT]: `logs`, [PageMap.TELEMETRY_SERVICES_VIEW]: `services/${RouteParams.ModelID}`, [PageMap.TELEMETRY_SERVICES_VIEW_DELETE]: `services/${RouteParams.ModelID}/delete`, [PageMap.TELEMETRY_SERVICES_VIEW_LOGS]: `services/${RouteParams.ModelID}/logs`, - [PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTION]: `services/${RouteParams.ModelID}/exceptions/${RouteParams.SubModelID}`, [PageMap.TELEMETRY_SERVICES_VIEW_TRACES]: `services/${RouteParams.ModelID}/traces`, [PageMap.TELEMETRY_SERVICES_VIEW_TRACE]: `services/${RouteParams.ModelID}/traces/${RouteParams.SubModelID}`, [PageMap.TELEMETRY_SERVICES_VIEW_METRICS]: `services/${RouteParams.ModelID}/metrics`, [PageMap.TELEMETRY_SERVICES_VIEW_METRIC]: `services/${RouteParams.ModelID}/metrics/view`, [PageMap.TELEMETRY_SERVICES_VIEW_SETTINGS]: `services/${RouteParams.ModelID}/settings`, [PageMap.TELEMETRY_SERVICES_VIEW_DOCUMENTATION]: `services/${RouteParams.ModelID}/documentation`, - [PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS]: `services/${RouteParams.ModelID}/exceptions`, +}; - // service exceptions. - [PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_ARCHIVED]: `services/${RouteParams.ModelID}/exceptions/archived`, - [PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_UNRESOLVED]: `services/${RouteParams.ModelID}/exceptions/unresolved`, - [PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_RESOLVED]: `services/${RouteParams.ModelID}/exceptions/resolved`, +export const ExceptionsRoutePath: Dictionary = { + [PageMap.EXCEPTIONS]: "unresolved", + [PageMap.EXCEPTIONS_UNRESOLVED]: "unresolved", + [PageMap.EXCEPTIONS_RESOLVED]: "resolved", + [PageMap.EXCEPTIONS_ARCHIVED]: "archived", + [PageMap.EXCEPTIONS_VIEW_ROOT]: "", + [PageMap.EXCEPTIONS_VIEW]: `${RouteParams.ModelID}`, }; export const DashboardsRoutePath: Dictionary = { @@ -1442,71 +1437,12 @@ const RouteMap: Dictionary = { }`, ), - [PageMap.TELEMETRY_EXCEPTIONS_ROOT]: new Route( - `/dashboard/${RouteParams.ProjectID}/telemetry/${ - TelemetryRoutePath[PageMap.TELEMETRY_EXCEPTIONS_ROOT] - }`, - ), - [PageMap.TELEMETRY_TRACES]: new Route( `/dashboard/${RouteParams.ProjectID}/telemetry/${ TelemetryRoutePath[PageMap.TELEMETRY_TRACES] }`, ), - // Exceptions - - [PageMap.TELEMETRY_EXCEPTIONS]: new Route( - `/dashboard/${RouteParams.ProjectID}/telemetry/${ - TelemetryRoutePath[PageMap.TELEMETRY_EXCEPTIONS] - }`, - ), - - [PageMap.TELEMETRY_EXCEPTIONS_VIEW]: new Route( - `/dashboard/${RouteParams.ProjectID}/telemetry/${ - TelemetryRoutePath[PageMap.TELEMETRY_EXCEPTIONS_VIEW] - }`, - ), - - // Exceptions - Unresolved, Resolved, Archived. - [PageMap.TELEMETRY_EXCEPTIONS_UNRESOLVED]: new Route( - `/dashboard/${RouteParams.ProjectID}/telemetry/${ - TelemetryRoutePath[PageMap.TELEMETRY_EXCEPTIONS_UNRESOLVED] - }`, - ), - - [PageMap.TELEMETRY_EXCEPTIONS_RESOLVED]: new Route( - `/dashboard/${RouteParams.ProjectID}/telemetry/${ - TelemetryRoutePath[PageMap.TELEMETRY_EXCEPTIONS_RESOLVED] - }`, - ), - - [PageMap.TELEMETRY_EXCEPTIONS_ARCHIVED]: new Route( - `/dashboard/${RouteParams.ProjectID}/telemetry/${ - TelemetryRoutePath[PageMap.TELEMETRY_EXCEPTIONS_ARCHIVED] - }`, - ), - - // Service Exceptions - Unresolved, Resolved, Archived. - - [PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_RESOLVED]: new Route( - `/dashboard/${RouteParams.ProjectID}/telemetry/${ - TelemetryRoutePath[PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_RESOLVED] - }`, - ), - - [PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_UNRESOLVED]: new Route( - `/dashboard/${RouteParams.ProjectID}/telemetry/${ - TelemetryRoutePath[PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_UNRESOLVED] - }`, - ), - - [PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_ARCHIVED]: new Route( - `/dashboard/${RouteParams.ProjectID}/telemetry/${ - TelemetryRoutePath[PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_ARCHIVED] - }`, - ), - [PageMap.TELEMETRY_SERVICES_VIEW_ROOT]: new Route( `/dashboard/${RouteParams.ProjectID}/telemetry/${ TelemetryRoutePath[PageMap.TELEMETRY_SERVICES_VIEW_ROOT] @@ -1556,19 +1492,6 @@ const RouteMap: Dictionary = { }`, ), - // view exceptions. - [PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS]: new Route( - `/dashboard/${RouteParams.ProjectID}/telemetry/${ - TelemetryRoutePath[PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS] - }`, - ), - - [PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTION]: new Route( - `/dashboard/${RouteParams.ProjectID}/telemetry/${ - TelemetryRoutePath[PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTION] - }`, - ), - //TELEMETRY_SERVICE_VIEW_TRACES [PageMap.TELEMETRY_SERVICES_VIEW_TRACES]: new Route( `/dashboard/${RouteParams.ProjectID}/telemetry/${ @@ -2145,6 +2068,45 @@ const RouteMap: Dictionary = { AIAgentTasksRoutePath[PageMap.AI_AGENT_TASK_VIEW_DELETE] }`, ), + + // Exceptions (standalone menu item) + [PageMap.EXCEPTIONS_ROOT]: new Route( + `/dashboard/${RouteParams.ProjectID}/exceptions/*`, + ), + + [PageMap.EXCEPTIONS]: new Route( + `/dashboard/${RouteParams.ProjectID}/exceptions/${ + ExceptionsRoutePath[PageMap.EXCEPTIONS] + }`, + ), + + [PageMap.EXCEPTIONS_UNRESOLVED]: new Route( + `/dashboard/${RouteParams.ProjectID}/exceptions/${ + ExceptionsRoutePath[PageMap.EXCEPTIONS_UNRESOLVED] + }`, + ), + + [PageMap.EXCEPTIONS_RESOLVED]: new Route( + `/dashboard/${RouteParams.ProjectID}/exceptions/${ + ExceptionsRoutePath[PageMap.EXCEPTIONS_RESOLVED] + }`, + ), + + [PageMap.EXCEPTIONS_ARCHIVED]: new Route( + `/dashboard/${RouteParams.ProjectID}/exceptions/${ + ExceptionsRoutePath[PageMap.EXCEPTIONS_ARCHIVED] + }`, + ), + + [PageMap.EXCEPTIONS_VIEW_ROOT]: new Route( + `/dashboard/${RouteParams.ProjectID}/exceptions`, + ), + + [PageMap.EXCEPTIONS_VIEW]: new Route( + `/dashboard/${RouteParams.ProjectID}/exceptions/${ + ExceptionsRoutePath[PageMap.EXCEPTIONS_VIEW] + }`, + ), }; export class RouteUtil { diff --git a/VERSION b/VERSION index 75dda5e44e..2b3e713313 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.3.6 \ No newline at end of file +9.3.7 \ No newline at end of file