Skip to content

Commit

Permalink
[#11982] URL stat > mini chart
Browse files Browse the repository at this point in the history
  • Loading branch information
jihea-park committed Jan 22, 2025
1 parent 3e6430d commit d8163d2
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ import { RxCross2 } from 'react-icons/rx';
import { Badge } from '../../ui';
import { ErrorAnalysisGroupedErrorList } from '@pinpoint-fe/ui/constants';
import { addCommas, format } from '@pinpoint-fe/ui/utils';
import { ErrorGroupedTableVolumneChart } from './ErrorGroupedTableVolumneChart';
// import { cn } from '../../../lib';
import { MiniChart } from '../../common/MiniChart';

interface ErrorGroupedTableColumnProps {
groupBy?: string[];
Expand Down Expand Up @@ -89,7 +88,7 @@ export const errorGroupedTableColumns = ({
header: 'Volume',
cell: (props) => {
const chart = props.getValue() as ErrorAnalysisGroupedErrorList.ErrorData['chart'];
return <ErrorGroupedTableVolumneChart chart={chart} />;
return <MiniChart chart={chart} />;
},
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,15 @@ import React from 'react';
import { ErrorBoundary } from '../../Error/ErrorBoundary';
import { UrlStatChartFetcher, UrlStatChartFetcherProps } from './UrlStatChartFetcher';
import { ChartSkeleton } from '../../Chart';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '../../ui';

export interface UrlStatChartProps extends UrlStatChartFetcherProps {}

export const UrlStatChart = ({ ...props }: UrlStatChartProps) => {
const tabList = [
{ id: 'total', display: 'Total Count' },
{ id: 'failure', display: 'Failure Count' },
{ id: 'apdex', display: 'Apdex' },
{ id: 'latency', display: 'Latency' },
];
return (
<Tabs defaultValue="total" className="p-3 bg-white border rounded">
<TabsList>
{tabList.map((tab) => (
<TabsTrigger key={tab.id} value={tab.id}>
{tab.display}
</TabsTrigger>
))}
</TabsList>
{tabList.map((tab) => (
<TabsContent key={tab.id} value={tab.id} className="h-72">
<ErrorBoundary>
<React.Suspense fallback={<ChartSkeleton />}>
<UrlStatChartFetcher {...props} type={tab.id} />
</React.Suspense>
</ErrorBoundary>
</TabsContent>
))}
</Tabs>
<ErrorBoundary>
<React.Suspense fallback={<ChartSkeleton />}>
<UrlStatChartFetcher {...props} />
</React.Suspense>
</ErrorBoundary>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { UrlStatSummary } from '@pinpoint-fe/ui/constants';
import { Button } from '../../ui';
import { addCommas, numberInDecimal, numberInInteger } from '@pinpoint-fe/ui/utils';
import { cn } from '../../../lib';
import { MiniChart } from '../../common/MiniChart';

interface SummaryColumnProps {
orderBy: string;
Expand Down Expand Up @@ -147,4 +148,16 @@ export const summaryColumns = ({
cellClassName: 'px-4 text-right',
},
},
{
accessorKey: 'chart',
header: 'Volume',
meta: {
headerClassName: 'w-40 text-sm font-medium text-center',
cellClassName: 'text-[-webkit-right]',
},
cell: (props) => {
const chart = props.getValue() as UrlStatSummary.SummaryData['chart'];
return <MiniChart chart={chart} />;
},
},
];
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ import { useGetUrlStatSummaryData } from '@pinpoint-fe/ui/hooks';
import { summaryColumns } from './UrlSummaryColumns';
import { DataTable, DataTableCountOfRows } from '../../DataTable';
import { cn } from '../../../lib';
import { UrlStatSummary } from '@pinpoint-fe/ui/constants';

export interface UrlSummaryFetcherProps {
type?: UrlStatSummary.Parameters['type'];
className?: string;
}

export const UrlSummaryFetcher = ({ className }: UrlSummaryFetcherProps) => {
export const UrlSummaryFetcher = ({ className, type }: UrlSummaryFetcherProps) => {
const [urlSelectedSummaryData, setUrlSelectedSummaryData] = useAtom(urlSelectedSummaryDataAtom);
const [count, setCount] = React.useState(50);
const [orderBy, setOrderBy] = React.useState('totalCount');
Expand All @@ -19,6 +21,7 @@ export const UrlSummaryFetcher = ({ className }: UrlSummaryFetcherProps) => {
count,
isDesc,
orderBy,
type,
});
const columns = summaryColumns({
orderBy,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { ErrorAnalysisGroupedErrorList } from '@pinpoint-fe/ui/constants';
import { Chart } from '@pinpoint-fe/ui/constants';
import { ComposedChart, ReferenceLine } from 'recharts';
import { useRechart } from '../../ReChart/useRechart';
import { useRechart } from '../ReChart/useRechart';

export interface ErrorGroupedTableVolumneChart {
chart: ErrorAnalysisGroupedErrorList.ErrorData['chart'];
export interface MiniChart {
chart: Chart;
}

export const ErrorGroupedTableVolumneChart = ({ chart }: ErrorGroupedTableVolumneChart) => {
export const MiniChart = ({ chart }: MiniChart) => {
const { data, maxValue, renderChartChildComponents } = useRechart(chart);

return (
Expand All @@ -17,7 +17,7 @@ export const ErrorGroupedTableVolumneChart = ({ chart }: ErrorGroupedTableVolumn
margin={{
top: 6,
right: 30,
bottom: 2,
bottom: 6,
left: 2,
}}
>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Chart } from './common/Chart';
export namespace UrlStatSummary {
export interface Parameters {
applicationName: string;
Expand All @@ -7,6 +8,7 @@ export namespace UrlStatSummary {
isDesc: boolean;
count: number;
agentId?: string;
type?: 'total' | 'failure' | 'apdex' | 'latency';
}

export type Response = SummaryData[];
Expand All @@ -17,5 +19,7 @@ export namespace UrlStatSummary {
apdex: number;
avgTimeMs: number;
maxTimeMs: number;
version: string;
chart: Chart;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ export const useGetUrlStatSummaryData = ({
orderBy,
isDesc,
count,
type,
}: {
orderBy?: string;
isDesc?: boolean;
count?: number;
type?: UrlStatSummary.Parameters['type'];
}) => {
const { application, dateRange, agentId } = useUrlStatSearchParameters();
const from = dateRange.from.getTime();
Expand All @@ -31,7 +33,7 @@ export const useGetUrlStatSummaryData = ({
agentId,
isDesc: isDesc ?? true,
count: count || 50,
// orderBy: orderBy || 'totalCount',
type,
orderby: orderBy || 'totalCount', // * url 통계 쪽 api에선 파라미터를 orderby로 쓰고있음
};
const queryString = getQueryString(queryParams);
Expand Down
41 changes: 36 additions & 5 deletions web-frontend/src/main/v3/packages/ui/src/pages/UrlStatistic.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,18 @@ import { convertParamsToQueryString, getUrlStatPath } from '@pinpoint-fe/ui/util
import { useUrlStatSearchParameters } from '@pinpoint-fe/ui/hooks';
import { useTranslation } from 'react-i18next';
import { PiChartBarDuotone } from 'react-icons/pi';
// import { ErrorBoundary } from '../../Error/ErrorBoundary';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@pinpoint-fe/ui/components';
import { UrlStatSummary } from '../constants';

const TAB_LIST = [
{ id: 'total', display: 'Total Count' },
{ id: 'failure', display: 'Failure Count' },
{ id: 'apdex', display: 'Apdex' },
{ id: 'latency', display: 'Latency' },
];

type TYPE = UrlStatSummary.Parameters['type'];

export interface UrlStatisticPageProps {
ApplicationList?: (props: ApplicationCombinedListProps) => JSX.Element;
Expand All @@ -26,6 +38,7 @@ export const UrlStatisticPage = ({
const navigate = useNavigate();
const { searchParameters, application, agentId } = useUrlStatSearchParameters();
const { t } = useTranslation();
const [type, setType] = React.useState<TYPE>('total');

const handleChangeDateRagePicker = React.useCallback(
(({ formattedDates: formattedDate }) => {
Expand Down Expand Up @@ -72,11 +85,29 @@ export const UrlStatisticPage = ({
<LayoutWithContentSidebar>
<UrlSidebar />
<>
<UrlStatChart
emptyMessage={t('COMMON.NO_DATA')}
guideMessage={t('URL_STAT.SELECT_URL_INFO')}
/>
<UrlSummary />
<Tabs
defaultValue="total"
className="p-3 bg-white border rounded"
onValueChange={(value) => setType(value as TYPE)}
>
<TabsList>
{TAB_LIST.map((tab) => (
<TabsTrigger key={tab.id} value={tab.id}>
{tab.display}
</TabsTrigger>
))}
</TabsList>
{TAB_LIST.map((tab) => (
<TabsContent key={tab.id} value={tab.id} className="h-72">
<UrlStatChart
type={tab.id}
emptyMessage={t('COMMON.NO_DATA')}
guideMessage={t('URL_STAT.SELECT_URL_INFO')}
/>
</TabsContent>
))}
</Tabs>
<UrlSummary type={type} />
</>
</LayoutWithContentSidebar>
)}
Expand Down

0 comments on commit d8163d2

Please sign in to comment.