Merge pull request #2213 from OneUptime/exception-refactor
Some checks are pending
Push Release Images to Docker Hub and GitHub Container Registry / generate-build-number (push) Waiting to run
Push Release Images to Docker Hub and GitHub Container Registry / read-version (push) Waiting to run
Push Release Images to Docker Hub and GitHub Container Registry / helm-chart-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / mcp-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / nginx-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / ai-agent-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / publish-npm-packages (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / docs-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / worker-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / workflow-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / e2e-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / isolated-vm-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / home-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / test-server-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / otel-collector-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / status-page-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / test-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / probe-ingest-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / server-monitor-ingest-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / telemetry-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / incoming-request-ingest-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / probe-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / admin-dashboard-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / dashboard-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / app-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / accounts-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / infrastructure-agent-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / Publish GitHub release (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / publish-terraform-provider (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / api-reference-docker-image-deploy (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / Push release tags before GitHub release (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / test-e2e-release-saas (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / test-e2e-release-self-hosted (push) Blocked by required conditions
Push Release Images to Docker Hub and GitHub Container Registry / Create draft GitHub release (push) Blocked by required conditions

Exception refactor
This commit is contained in:
Simon Larsen 2026-01-08 20:28:01 +00:00 committed by GitHub
commit da4f5f6c03
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
30 changed files with 392 additions and 833 deletions

View file

@ -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,

View file

@ -143,6 +143,7 @@ enum IconProp {
Brain = "Brain",
FlowDiagram = "FlowDiagram",
GitHub = "GitHub",
Bug = "Bug",
}
export default IconProp;

View file

@ -1319,6 +1319,17 @@ const Icon: FunctionComponent<ComponentProps> = ({
/>
</>,
);
} else if (icon === IconProp.Bug) {
// Bug icon for exceptions - matching home page
return getSvgWrapper(
<>
<ellipse cx="12" cy="14" rx="5" ry="6" />
<path
strokeLinecap="round"
d="M9 8.5C9 6.5 10.5 5 12 5s3 1.5 3 3.5M4 11l3 1m10-1 3 1M4 17l3-1m10 1 3-1M12 8v12M9 14h6"
/>
</>,
);
}
return <></>;

View file

@ -84,6 +84,24 @@ const NavBarMenuItem: FunctionComponent<ComponentProps> = (
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: {

View file

@ -178,6 +178,11 @@ const AIAgentTasksRoutes: React.LazyExoticComponent<
> = lazy(() => {
return import("./Routes/AIAgentTasksRoutes");
});
const ExceptionsRoutes: React.LazyExoticComponent<
React.FunctionComponent<PageComponentProps>
> = lazy(() => {
return import("./Routes/ExceptionsRoutes");
});
const PageNotFound: React.LazyExoticComponent<
React.FunctionComponent<PageComponentProps>
> = lazy(() => {
@ -610,6 +615,13 @@ const App: () => JSX.Element = () => {
element={<AIAgentTasksRoutes {...commonPageProps} />}
/>
{/** Exceptions */}
<PageRoute
path={RouteMap[PageMap.EXCEPTIONS_ROOT]?.toString() || ""}
element={<ExceptionsRoutes {...commonPageProps} />}
/>
{/* 👇️ only match this when no other routes match */}
<PageRoute
path="*"

View file

@ -20,7 +20,7 @@ const TelemetryExceptionElement: FunctionComponent<ComponentProps> = (
props: ComponentProps,
): ReactElement => {
const viewRoute: Route = RouteUtil.populateRouteParams(
RouteMap[PageMap.TELEMETRY_EXCEPTIONS_ROOT]!,
RouteMap[PageMap.EXCEPTIONS_VIEW_ROOT]!,
);
const getResolvedIcon: GetReactElementFunction = (): ReactElement => {

View file

@ -503,7 +503,7 @@ const ExceptionExplorer: FunctionComponent<ComponentProps> = (
modelType={TelemetryException}
modelId={props.telemetryExceptionId}
onDeleteSuccess={() => {
Navigation.navigate(RouteMap[PageMap.TELEMETRY] as Route);
Navigation.navigate(RouteMap[PageMap.EXCEPTIONS] as Route);
}}
/>
</div>

View file

@ -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<ComponentProps> = (
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 (
<Fragment>
<ModelTable<TelemetryException>
@ -399,21 +389,6 @@ const TelemetryExceptionTable: FunctionComponent<ComponentProps> = (
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<ComponentProps> = (
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,

View file

@ -92,6 +92,15 @@ const DashboardNavbar: FunctionComponent<ComponentProps> = (
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.",

View file

@ -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<PageComponentProps> = (
const ArchivedExceptionsPage: FunctionComponent<PageComponentProps> = (
props: PageComponentProps,
): ReactElement => {
const disableTelemetryForThisProject: boolean =
@ -26,4 +26,4 @@ const Services: FunctionComponent<PageComponentProps> = (
);
};
export default Services;
export default ArchivedExceptionsPage;

View file

@ -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 (
<Page
title="Exceptions"
breadcrumbLinks={getExceptionsBreadcrumbs(path)}
sideMenu={<SideMenu />}
>
<Outlet />
</Page>
);
};
export default ExceptionsLayout;

View file

@ -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<PageComponentProps> = (
const ResolvedExceptionsPage: FunctionComponent<PageComponentProps> = (
props: PageComponentProps,
): ReactElement => {
const disableTelemetryForThisProject: boolean =
@ -27,4 +27,4 @@ const Services: FunctionComponent<PageComponentProps> = (
);
};
export default Services;
export default ResolvedExceptionsPage;

View file

@ -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 <SideMenu sections={sections} />;
};
export default DashboardSideMenu;

View file

@ -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<PageComponentProps> = (
const UnresolvedExceptionsPage: FunctionComponent<PageComponentProps> = (
props: PageComponentProps,
): ReactElement => {
const disableTelemetryForThisProject: boolean =
@ -27,4 +27,4 @@ const Services: FunctionComponent<PageComponentProps> = (
);
};
export default Services;
export default UnresolvedExceptionsPage;

View file

@ -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;

View file

@ -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 (
<Page
title="Exception Explorer"
breadcrumbLinks={getTelemetryBreadcrumbs(path)}
breadcrumbLinks={getExceptionsBreadcrumbs(path)}
>
<Outlet />
</Page>
);
};
export default MetricsLayout;
export default ExceptionViewLayout;

View file

@ -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<TelemetryService | null>(null);
const [isLoading, setIsLoading] = useState<boolean>(false);
const [error, setError] = useState<string>("");
useEffect(() => {
fetchTelemetryService().catch((err: Error) => {
setError(API.getFriendlyMessage(err));
});
}, []);
const fetchTelemetryService: PromiseVoidFunction =
async (): Promise<void> => {
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 <ErrorMessage message={error} />;
}
if (isLoading) {
return <PageLoader isVisible={true} />;
}
if (!telemetryService) {
return <ErrorMessage message="Telemetry Service not found." />;
}
return (
<ExceptionsTable
query={{
isArchived: true,
}}
telemetryServiceId={telemetryService.id!}
title="Archived Exceptions"
description="All the exceptions that have been archived. You will not be notified about these exceptions."
/>
);
};
export default MetricsTablePage;

View file

@ -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<TelemetryService | null>(null);
const [isLoading, setIsLoading] = useState<boolean>(false);
const [error, setError] = useState<string>("");
useEffect(() => {
fetchTelemetryService().catch((err: Error) => {
setError(API.getFriendlyMessage(err));
});
}, []);
const fetchTelemetryService: PromiseVoidFunction =
async (): Promise<void> => {
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 <ErrorMessage message={error} />;
}
if (isLoading) {
return <PageLoader isVisible={true} />;
}
if (!telemetryService) {
return <ErrorMessage message="Telemetry Service not found." />;
}
return (
<ExceptionsTable
telemetryServiceId={telemetryService.id!}
query={{
isResolved: true,
isArchived: false,
}}
title="Resolved Exceptions"
description="All the exceptions that have been resolved."
/>
);
};
export default MetricsTablePage;

View file

@ -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<TelemetryService | null>(null);
const [isLoading, setIsLoading] = useState<boolean>(false);
const [error, setError] = useState<string>("");
useEffect(() => {
fetchTelemetryService().catch((err: Error) => {
setError(API.getFriendlyMessage(err));
});
}, []);
const fetchTelemetryService: PromiseVoidFunction =
async (): Promise<void> => {
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 <ErrorMessage message={error} />;
}
if (isLoading) {
return <PageLoader isVisible={true} />;
}
if (!telemetryService) {
return <ErrorMessage message="Telemetry Service not found." />;
}
return (
<ExceptionsTable
query={{
isResolved: false,
isArchived: false,
}}
telemetryServiceId={telemetryService.id!}
title="Unresolved Exceptions"
description="All the exceptions that have not been resolved."
/>
);
};
export default MetricsTablePage;

View file

@ -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 (
<Fragment>
<ExceptionExplorer telemetryExceptionId={modelId} />
</Fragment>
);
};
export default ServiceDelete;

View file

@ -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<ComponentProps> = (
icon={IconProp.ChartBar}
/>
</SideMenuSection>
<SideMenuSection title="Exceptions">
<CountModelSideMenuItem<TelemetryException>
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}
/>
<SideMenuItem
link={{
title: "Resolved",
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_RESOLVED
] as Route,
{ modelId: props.modelId },
),
}}
icon={IconProp.Check}
/>
<SideMenuItem
link={{
title: "Archived",
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_ARCHIVED
] as Route,
{ modelId: props.modelId },
),
}}
icon={IconProp.Archive}
/>
</SideMenuSection>
<SideMenuSection title="Advanced">
<SideMenuItem
link={{

View file

@ -1,4 +1,3 @@
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";
@ -7,8 +6,6 @@ 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[] = [
@ -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 <SideMenu sections={sections} />;

View file

@ -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<ComponentProps>
> = lazy(() => {
return import("../Pages/Exceptions/Unresolved");
});
const ExceptionsResolved: LazyExoticComponent<
FunctionComponent<ComponentProps>
> = lazy(() => {
return import("../Pages/Exceptions/Resolved");
});
const ExceptionsArchived: LazyExoticComponent<
FunctionComponent<ComponentProps>
> = lazy(() => {
return import("../Pages/Exceptions/Archived");
});
const ExceptionView: LazyExoticComponent<FunctionComponent<ComponentProps>> =
lazy(() => {
return import("../Pages/Exceptions/View/Index");
});
const ExceptionsRoutes: FunctionComponent<ComponentProps> = (
props: ComponentProps,
): ReactElement => {
return (
<Routes>
<PageRoute path="/" element={<ExceptionsLayout {...props} />}>
<PageRoute
index
element={
<Suspense fallback={Loader}>
<ExceptionsUnresolved
{...props}
pageRoute={RouteMap[PageMap.EXCEPTIONS] as Route}
/>
</Suspense>
}
/>
<PageRoute
path={ExceptionsRoutePath[PageMap.EXCEPTIONS_UNRESOLVED] || ""}
element={
<Suspense fallback={Loader}>
<ExceptionsUnresolved
{...props}
pageRoute={RouteMap[PageMap.EXCEPTIONS_UNRESOLVED] as Route}
/>
</Suspense>
}
/>
<PageRoute
path={ExceptionsRoutePath[PageMap.EXCEPTIONS_RESOLVED] || ""}
element={
<Suspense fallback={Loader}>
<ExceptionsResolved
{...props}
pageRoute={RouteMap[PageMap.EXCEPTIONS_RESOLVED] as Route}
/>
</Suspense>
}
/>
<PageRoute
path={ExceptionsRoutePath[PageMap.EXCEPTIONS_ARCHIVED] || ""}
element={
<Suspense fallback={Loader}>
<ExceptionsArchived
{...props}
pageRoute={RouteMap[PageMap.EXCEPTIONS_ARCHIVED] as Route}
/>
</Suspense>
}
/>
</PageRoute>
{/* Exception View - separate from main layout */}
<PageRoute
path={ExceptionsRoutePath[PageMap.EXCEPTIONS_VIEW] || ""}
element={<ExceptionViewLayout {...props} />}
>
<PageRoute
index
element={
<Suspense fallback={Loader}>
<ExceptionView
{...props}
pageRoute={RouteMap[PageMap.EXCEPTIONS_VIEW] as Route}
/>
</Suspense>
}
/>
</PageRoute>
</Routes>
);
};
export default ExceptionsRoutes;

View file

@ -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<FunctionComponent<ComponentProps>> =
return import("../Pages/Telemetry/Traces");
});
const TelemetryExceptionsUnresolved: LazyExoticComponent<
FunctionComponent<ComponentProps>
> = lazy(() => {
return import("../Pages/Telemetry/Exceptions/Unresolved");
});
const TelemetryExceptionsResolved: LazyExoticComponent<
FunctionComponent<ComponentProps>
> = lazy(() => {
return import("../Pages/Telemetry/Exceptions/Resolved");
});
const TelemetryServiceViewException: LazyExoticComponent<
FunctionComponent<ComponentProps>
> = lazy(() => {
return import("../Pages/Telemetry/Services/View/Exceptions/View/Index");
});
const TelemetryExceptionsArchived: LazyExoticComponent<
FunctionComponent<ComponentProps>
> = lazy(() => {
return import("../Pages/Telemetry/Exceptions/Archived");
});
const TelemetryViewException: LazyExoticComponent<
FunctionComponent<ComponentProps>
> = lazy(() => {
return import("../Pages/Telemetry/Exceptions/View/Index");
});
const TelemetryMetrics: LazyExoticComponent<FunctionComponent<ComponentProps>> =
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<ComponentProps>
> = lazy(() => {
return import("../Pages/Telemetry/Services/View/Exceptions/Unresolved");
});
const TelemetryExceptionsServiceResolved: LazyExoticComponent<
FunctionComponent<ComponentProps>
> = lazy(() => {
return import("../Pages/Telemetry/Services/View/Exceptions/Resolved");
});
const TelemetryExceptionsServiceArchived: LazyExoticComponent<
FunctionComponent<ComponentProps>
> = lazy(() => {
return import("../Pages/Telemetry/Services/View/Exceptions/Archived");
});
const TelemetryServicesViewSettings: LazyExoticComponent<
FunctionComponent<ComponentProps>
> = lazy(() => {
@ -213,54 +163,6 @@ const TelemetryRoutes: FunctionComponent<ComponentProps> = (
}
/>
{/** Exceptions - Unresolved, Resolved, Archived */}
<PageRoute
path={
TelemetryRoutePath[PageMap.TELEMETRY_EXCEPTIONS_UNRESOLVED] || ""
}
element={
<Suspense fallback={Loader}>
<TelemetryExceptionsUnresolved
{...props}
pageRoute={
RouteMap[PageMap.TELEMETRY_EXCEPTIONS_UNRESOLVED] as Route
}
/>
</Suspense>
}
/>
<PageRoute
path={TelemetryRoutePath[PageMap.TELEMETRY_EXCEPTIONS_RESOLVED] || ""}
element={
<Suspense fallback={Loader}>
<TelemetryExceptionsResolved
{...props}
pageRoute={
RouteMap[PageMap.TELEMETRY_EXCEPTIONS_RESOLVED] as Route
}
/>
</Suspense>
}
/>
<PageRoute
path={TelemetryRoutePath[PageMap.TELEMETRY_EXCEPTIONS_ARCHIVED] || ""}
element={
<Suspense fallback={Loader}>
<TelemetryExceptionsArchived
{...props}
pageRoute={
RouteMap[PageMap.TELEMETRY_EXCEPTIONS_ARCHIVED] as Route
}
/>
</Suspense>
}
/>
{/** ---- */}
<PageRoute
path={TelemetryRoutePath[PageMap.TELEMETRY_SERVICES] || ""}
element={
@ -317,37 +219,6 @@ const TelemetryRoutes: FunctionComponent<ComponentProps> = (
/>
</PageRoute>
{/** Exception View */}
<PageRoute
path={TelemetryRoutePath[PageMap.TELEMETRY_EXCEPTIONS_ROOT] || ""}
element={<TelemetryExceptionViewLayout {...props} />}
>
<PageRoute
index
element={
<Suspense fallback={Loader}>
<TelemetryExceptionsUnresolved
{...props}
pageRoute={RouteMap[PageMap.TELEMETRY_EXCEPTIONS_ROOT] as Route}
/>
</Suspense>
}
/>
<PageRoute
path={RouteUtil.getLastPathForKey(PageMap.TELEMETRY_EXCEPTIONS_VIEW)}
element={
<Suspense fallback={Loader}>
<TelemetryViewException
{...props}
pageRoute={RouteMap[PageMap.TELEMETRY_EXCEPTIONS_VIEW] as Route}
/>
</Suspense>
}
/>
</PageRoute>
{/* Trace View */}
<PageRoute
@ -427,82 +298,6 @@ const TelemetryRoutes: FunctionComponent<ComponentProps> = (
}
/>
{/** Telemetry Service Exceptions */}
<PageRoute
path={RouteUtil.getLastPathForKey(
PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_UNRESOLVED,
2,
)}
element={
<Suspense fallback={Loader}>
<TelemetryExceptionsServiceUnresolved
{...props}
pageRoute={
RouteMap[
PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_UNRESOLVED
] as Route
}
/>
</Suspense>
}
/>
<PageRoute
path={RouteUtil.getLastPathForKey(
PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_RESOLVED,
2,
)}
element={
<Suspense fallback={Loader}>
<TelemetryExceptionsServiceResolved
{...props}
pageRoute={
RouteMap[
PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_RESOLVED
] as Route
}
/>
</Suspense>
}
/>
<PageRoute
path={RouteUtil.getLastPathForKey(
PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTION,
2,
)}
element={
<Suspense fallback={Loader}>
<TelemetryServiceViewException
{...props}
pageRoute={
RouteMap[PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTION] as Route
}
/>
</Suspense>
}
/>
<PageRoute
path={RouteUtil.getLastPathForKey(
PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_ARCHIVED,
2,
)}
element={
<Suspense fallback={Loader}>
<TelemetryExceptionsServiceArchived
{...props}
pageRoute={
RouteMap[
PageMap.TELEMETRY_SERVICES_VIEW_EXCEPTIONS_ARCHIVED
] as Route
}
/>
</Suspense>
}
/>
<PageRoute
path={RouteUtil.getLastPathForKey(
PageMap.TELEMETRY_SERVICES_VIEW_TRACE,

View file

@ -0,0 +1,36 @@
import PageMap from "../PageMap";
import { BuildBreadcrumbLinksByTitles } from "./Helper";
import Dictionary from "Common/Types/Dictionary";
import Link from "Common/Types/Link";
export function getExceptionsBreadcrumbs(
path: string,
): Array<Link> | undefined {
const breadcrumpLinksMap: Dictionary<Link[]> = {
...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];
}

View file

@ -26,34 +26,6 @@ export function getTelemetryBreadcrumbs(path: string): Array<Link> | 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<Link> | 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",

View file

@ -11,3 +11,4 @@ export * from "./ServiceCatalogBreadcrumbs";
export * from "./CodeRepositoryBreadcrumbs";
export * from "./DashboardBreadCrumbs";
export * from "./AIAgentTasksBreadcrumbs";
export * from "./ExceptionsBreadcrumbs";

View file

@ -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
}

View file

@ -78,10 +78,6 @@ export const TelemetryRoutePath: Dictionary<string> = {
[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<string> = {
[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<string> = {
[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<string> = {
@ -1442,71 +1437,12 @@ const RouteMap: Dictionary<Route> = {
}`,
),
[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<Route> = {
}`,
),
// 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<Route> = {
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 {

View file

@ -1 +1 @@
9.3.6
9.3.7