diff --git a/web-frontend/src/main/v3/packages/server-map/src/constants/style/theme.ts b/web-frontend/src/main/v3/packages/server-map/src/constants/style/theme.ts index a37a9e7d1e9d..473378918aaf 100644 --- a/web-frontend/src/main/v3/packages/server-map/src/constants/style/theme.ts +++ b/web-frontend/src/main/v3/packages/server-map/src/constants/style/theme.ts @@ -71,7 +71,7 @@ export const defaultTheme: DeepNonNullable = { 'text-halign': 'center', 'text-margin-y': 4, 'overlay-opacity': 0, - 'font-family': 'Helvetica, Arial, avn85, NanumGothic, ng, dotum, AppleGothic, sans-serif', + 'font-family': 'Arial, Helvetica, sans-serif', 'font-size': 12, 'font-weight': 'normal', 'text-wrap': 'wrap', @@ -92,8 +92,9 @@ export const defaultTheme: DeepNonNullable = { edge: { default: { width: 1.5, - 'font-size': '12px', + 'font-size': 12, 'font-weight': 'normal', + 'font-family': 'Arial, Helvetica, sans-serif', 'line-color': '#C0C3C8', 'target-arrow-color': '#C0C3C8', 'target-arrow-shape': 'triangle', diff --git a/web-frontend/src/main/v3/packages/server-map/src/core/merge.ts b/web-frontend/src/main/v3/packages/server-map/src/core/merge.ts index 99d8b01cbc9d..44da4827452b 100644 --- a/web-frontend/src/main/v3/packages/server-map/src/core/merge.ts +++ b/web-frontend/src/main/v3/packages/server-map/src/core/merge.ts @@ -1,6 +1,7 @@ import _ from 'lodash'; import { Node, Edge, MergedNode, MergedEdge } from '../types'; -import { getTransactionStatusSVGString } from '../ui/template/node'; +import { getNodeSVGString } from '../ui/template/node'; +import { ServerMapProps } from '../ui'; type GroupBySource = { [key: string]: string[] }; const mergeNodes = ({ nodes, edges }: { nodes: Node[]; edges: Edge[] }) => { @@ -105,7 +106,10 @@ const groupByType = (groupBySource: GroupBySource, nodes: Node[]) => { ); }; -export const getMergedData = (data: { nodes: Node[]; edges: Edge[] }) => { +export const getMergedData = ( + data: { nodes: Node[]; edges: Edge[] }, + renderNode?: ServerMapProps['renderNode'], +) => { const { edges, nodes } = data; const mergedTypes = new Set(); const targetNodeIds = edges.map((edge) => edge.target); @@ -314,7 +318,7 @@ export const getMergedData = (data: { nodes: Node[]; edges: Edge[] }) => { return { data: { ...node, - imgArr: [node?.imgPath, getTransactionStatusSVGString(node)], + imgArr: [node?.imgPath, getNodeSVGString(node, renderNode)], }, }; }), diff --git a/web-frontend/src/main/v3/packages/server-map/src/ui/ServerMap.tsx b/web-frontend/src/main/v3/packages/server-map/src/ui/ServerMap.tsx index 87e089788648..4f0ae531a34e 100644 --- a/web-frontend/src/main/v3/packages/server-map/src/ui/ServerMap.tsx +++ b/web-frontend/src/main/v3/packages/server-map/src/ui/ServerMap.tsx @@ -29,6 +29,7 @@ export interface ServerMapProps extends Pick, 'c onDataMerged?: (mergeInfo: MergeInfo) => void; renderNodeLabel?: (node: MergedNode) => string | undefined; renderEdgeLabel?: (edge: MergedEdge) => string | undefined; + renderNode?: (node: MergedNode, transactionStatusSVGString: string) => string; cy?: (cy: cytoscape.Core) => void; } @@ -42,6 +43,7 @@ export const ServerMap = ({ onDataMerged, renderNodeLabel, renderEdgeLabel, + renderNode, className, style, cy, @@ -110,7 +112,7 @@ export const ServerMap = ({ if (data) { const cy = cyRef.current; if (cy) { - const { nodes: newNodes, edges: newEdges, mergeInfo } = getMergedData(data); + const { nodes: newNodes, edges: newEdges, mergeInfo } = getMergedData(data, renderNode); let addedNodes: cytoscape.CollectionReturnValue[] | undefined; onDataMerged?.(mergeInfo); diff --git a/web-frontend/src/main/v3/packages/server-map/src/ui/template/node.ts b/web-frontend/src/main/v3/packages/server-map/src/ui/template/node.ts index 992582557f66..677f4ebadfaf 100644 --- a/web-frontend/src/main/v3/packages/server-map/src/ui/template/node.ts +++ b/web-frontend/src/main/v3/packages/server-map/src/ui/template/node.ts @@ -1,5 +1,6 @@ import { Node } from '../../types'; import { defaultTheme } from '../../constants/style/theme'; +import { ServerMapProps } from '../ServerMap'; type TransactionInfo = Node['transactionInfo']; @@ -7,13 +8,15 @@ const MIN_ARC_RATIO = 0.05; const RADIUS = 47; const DIAMETER = 2 * Math.PI * RADIUS; -export const getTransactionStatusSVGString = (nodeData: Node): string => { +export const getNodeSVGString = (nodeData: Node, renderNode?: ServerMapProps['renderNode']) => { const { transactionInfo } = nodeData; + const transactionStatusSVGString = getTransactionStatusSVGCircle(transactionInfo, !transactionInfo); + return ( 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(` - ${getTransactionStatusSVGCircle(transactionInfo, !transactionInfo)} + ${renderNode ? renderNode(nodeData, transactionStatusSVGString) : transactionStatusSVGString} `) ); diff --git a/web-frontend/src/main/v3/packages/ui/src/components/ServerMap/ServerMapCore.tsx b/web-frontend/src/main/v3/packages/ui/src/components/ServerMap/ServerMapCore.tsx index bbc922487035..4084be9d7964 100644 --- a/web-frontend/src/main/v3/packages/ui/src/components/ServerMap/ServerMapCore.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/components/ServerMap/ServerMapCore.tsx @@ -5,9 +5,10 @@ import { Edge, ServerMap as ServerMapComponent, ServerMapProps as ServerMapComponentProps, + MergedEdge, } from '@pinpoint-fe/server-map'; import { FilteredMap, GetServerMap } from '@pinpoint-fe/constants'; -import { getServerImagePath } from '@pinpoint-fe/utils'; +import { addCommas, getServerImagePath } from '@pinpoint-fe/utils'; import { ServerMapMenu, SERVERMAP_MENU_CONTENT_TYPE, @@ -114,6 +115,7 @@ export const ServerMapCore = ({ target: link.to, transactionInfo: { totalCount: link.totalCount, + avgResponseTime: link.responseStatistics.Avg, }, })); @@ -134,6 +136,7 @@ export const ServerMapCore = ({ }, 0), slow: node.histogram?.Slow, bad: node.histogram?.Error, + instanceCount: node.instanceCount, }; } }; @@ -363,8 +366,28 @@ export const ServerMapCore = ({ { - return edge?.transactionInfo?.totalCount; + renderNode={(node, transactionStatusSVGString) => { + return ` + ${transactionStatusSVGString} + ${ + node.transactionInfo?.instanceCount && + `${node.transactionInfo?.instanceCount}` + } + `; + }} + renderEdgeLabel={(edge: MergedEdge) => { + if (edge?.transactionInfo?.totalCount) { + return `${addCommas(edge?.transactionInfo?.totalCount)}${edge.transactionInfo?.avgResponseTime ? ` (${edge.transactionInfo.avgResponseTime} ms)` : ''}`; + } else if (edge?.edges) { + return `${edge.edges.reduce((acc, curr) => acc + curr.transactionInfo?.totalCount, 0)}`; + } + return ''; }} onClickBackground={handleClickBackground} onClickNode={handleClickNode}