diff --git a/frontend/src/modules/Servicemap/ServiceMap.tsx b/frontend/src/modules/Servicemap/ServiceMap.tsx index b18151562e..d75003ce5e 100644 --- a/frontend/src/modules/Servicemap/ServiceMap.tsx +++ b/frontend/src/modules/Servicemap/ServiceMap.tsx @@ -44,10 +44,11 @@ const ServiceMap = (props: ServiceMapProps) => { getDetailedServiceMapItems(globalTime); }, []); - if (!serviceMap.items.length) { + if (!serviceMap.items.length || !serviceMap.services.length) { return "loading"; } - const { nodes, links } = getGraphData(serviceMap.items); + + const { nodes, links } = getGraphData(serviceMap); const graphData = { nodes, links }; return (
@@ -63,10 +64,11 @@ const ServiceMap = (props: ServiceMapProps) => { linkDirectionalParticleSpeed={(d) => d.value} nodeCanvasObject={(node, ctx, globalScale) => { const label = node.id; - const fontSize = 16 / globalScale; + const fontSize = node.fontSize; ctx.font = `${fontSize}px Sans-Serif`; const textWidth = ctx.measureText(label).width; - const bckgDimensions = [textWidth, fontSize].map((n) => n + fontSize); // some padding + const width = textWidth > node.width ? textWidth : node.width; + const bckgDimensions = [width, fontSize].map((n) => n + fontSize); // some padding ctx.fillStyle = node.color; ctx.fillRect( node.x - bckgDimensions[0] / 2, diff --git a/frontend/src/modules/Servicemap/utils.ts b/frontend/src/modules/Servicemap/utils.ts index d06961fde9..b97776e2fc 100644 --- a/frontend/src/modules/Servicemap/utils.ts +++ b/frontend/src/modules/Servicemap/utils.ts @@ -1,12 +1,31 @@ -import { uniqBy, uniq, maxBy, cloneDeep } from "lodash"; -import { servicesMapItem } from "Src/store/actions"; +import { uniqBy, uniq, maxBy, cloneDeep, find } from "lodash"; +import { serviceMapStore } from "Src/store/actions"; import { graphDataType } from "./ServiceMap"; -export const getGraphData = (item: servicesMapItem[]): graphDataType => { - const highestNum = maxBy(item, (e) => e.callCount).callCount; - const divNum = Number(String(1).padEnd(highestNum.toString().length, "0")); +export const getDimensions = (num, highest) => { + const MAX_WIDTH = 8; + const MIN_WIDTH = 5; + const MAX_FONT_SIZE = 8; + const MIN_FONT_SIZE = 5; + const percentage = (num / highest) * 100; + const width = (percentage * (MAX_WIDTH - MIN_WIDTH)) / 100 + MIN_WIDTH; + const fontSize = + (percentage * (MAX_FONT_SIZE - MIN_FONT_SIZE)) / 100 + MIN_FONT_SIZE; + return { + fontSize, + width, + }; +}; - const links = cloneDeep(item).map((node) => { +export const getGraphData = (serviceMap: serviceMapStore): graphDataType => { + const { items, services } = serviceMap; + const highestCallCount = maxBy(items, (e) => e.callCount).callCount; + const highestCallRate = maxBy(services, (e) => e.callRate).callRate; + const divNum = Number( + String(1).padEnd(highestCallCount.toString().length, "0"), + ); + + const links = cloneDeep(items).map((node) => { const { parent, child, callCount } = node; return { source: parent, @@ -14,13 +33,20 @@ export const getGraphData = (item: servicesMapItem[]): graphDataType => { value: (100 - callCount / divNum) * 0.01, }; }); - const uniqParent = uniqBy(cloneDeep(item), "parent").map((e) => e.parent); - const uniqChild = uniqBy(cloneDeep(item), "child").map((e) => e.child); + const uniqParent = uniqBy(cloneDeep(items), "parent").map((e) => e.parent); + const uniqChild = uniqBy(cloneDeep(items), "child").map((e) => e.child); const uniqNodes = uniq([...uniqParent, ...uniqChild]); - const nodes = uniqNodes.map((node, i) => ({ - id: node, - group: i + 1, - })); + const nodes = uniqNodes.map((node, i) => { + const service = find(services, (service) => service.serviceName === node); + let color = "#84ff00"; + if (service.errorRate > 0) { + color = "#f00a0a"; + } else if (service.fourXXRate > 0) { + color = "#ebeb15"; + } + const { fontSize, width } = getDimensions(service.callRate, highestCallRate); + return { id: node, group: i + 1, fontSize, width, color, nodeVal: width }; + }); return { nodes, links,