mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-12 22:39:10 +08:00
adds selection of service and zoom into node feature
This commit is contained in:
parent
bc02aa5eef
commit
6f12d06a32
34
frontend/src/modules/Servicemap/SelectService.tsx
Normal file
34
frontend/src/modules/Servicemap/SelectService.tsx
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import React, { useState } from "react";
|
||||||
|
import { servicesItem } from "Src/store/actions";
|
||||||
|
import { Select } from "antd";
|
||||||
|
const { Option } = Select;
|
||||||
|
|
||||||
|
interface SelectServiceProps {
|
||||||
|
services: servicesItem[];
|
||||||
|
zoomToService: (arg0: string) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SelectService = (props: SelectServiceProps) => {
|
||||||
|
const [selectedVal, setSelectedVal] = useState<string>();
|
||||||
|
const { services, zoomToService } = props;
|
||||||
|
const handleSelect = (value: string) => {
|
||||||
|
setSelectedVal(value);
|
||||||
|
zoomToService(value);
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<Select
|
||||||
|
style={{ width: 270, marginBottom: "56px" }}
|
||||||
|
placeholder="Select a service"
|
||||||
|
onChange={handleSelect}
|
||||||
|
value={selectedVal}
|
||||||
|
>
|
||||||
|
{services.map(({ serviceName }) => (
|
||||||
|
<Option key={serviceName} value={serviceName}>
|
||||||
|
{serviceName}
|
||||||
|
</Option>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SelectService;
|
@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect, useRef } from "react";
|
import React, { useEffect, useRef, useState } from "react";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { RouteComponentProps } from "react-router-dom";
|
import { RouteComponentProps } from "react-router-dom";
|
||||||
import {
|
import {
|
||||||
@ -7,10 +7,12 @@ import {
|
|||||||
getServiceMapItems,
|
getServiceMapItems,
|
||||||
getDetailedServiceMapItems,
|
getDetailedServiceMapItems,
|
||||||
} from "Src/store/actions";
|
} from "Src/store/actions";
|
||||||
|
import { Spin } from "antd";
|
||||||
|
|
||||||
import { StoreState } from "../../store/reducers";
|
import { StoreState } from "../../store/reducers";
|
||||||
import { getGraphData } from "./utils";
|
import { getGraphData } from "./utils";
|
||||||
|
import SelectService from "./SelectService";
|
||||||
import { ForceGraph2D } from "react-force-graph";
|
import { ForceGraph2D } from "react-force-graph";
|
||||||
|
|
||||||
interface ServiceMapProps extends RouteComponentProps<any> {
|
interface ServiceMapProps extends RouteComponentProps<any> {
|
||||||
serviceMap: serviceMapStore;
|
serviceMap: serviceMapStore;
|
||||||
globalTime: GlobalTime;
|
globalTime: GlobalTime;
|
||||||
@ -39,26 +41,34 @@ const ServiceMap = (props: ServiceMapProps) => {
|
|||||||
globalTime,
|
globalTime,
|
||||||
serviceMap,
|
serviceMap,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getServiceMapItems(globalTime);
|
getServiceMapItems(globalTime);
|
||||||
getDetailedServiceMapItems(globalTime);
|
getDetailedServiceMapItems(globalTime);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
if (!serviceMap.items.length || !serviceMap.services.length) {
|
if (!serviceMap.items.length || !serviceMap.services.length) {
|
||||||
return "loading";
|
return <Spin />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const zoomToService = (value: string) => {
|
||||||
|
fgRef && fgRef.current.zoomToFit(700, 350, (e) => e.id === value);
|
||||||
|
};
|
||||||
|
|
||||||
const { nodes, links } = getGraphData(serviceMap);
|
const { nodes, links } = getGraphData(serviceMap);
|
||||||
const graphData = { nodes, links };
|
const graphData = { nodes, links };
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
<SelectService
|
||||||
|
services={serviceMap.services}
|
||||||
|
zoomToService={zoomToService}
|
||||||
|
/>
|
||||||
<ForceGraph2D
|
<ForceGraph2D
|
||||||
ref={fgRef}
|
ref={fgRef}
|
||||||
cooldownTicks={100}
|
cooldownTicks={100}
|
||||||
onEngineStop={() => fgRef.current.zoomToFit(100, 100)}
|
onEngineStop={() => fgRef.current.zoomToFit(100, 200)}
|
||||||
graphData={graphData}
|
graphData={graphData}
|
||||||
nodeLabel="id"
|
nodeLabel="id"
|
||||||
nodeAutoColorBy={(d) => d.id}
|
|
||||||
linkAutoColorBy={(d) => d.target}
|
linkAutoColorBy={(d) => d.target}
|
||||||
linkDirectionalParticles="value"
|
linkDirectionalParticles="value"
|
||||||
linkDirectionalParticleSpeed={(d) => d.value}
|
linkDirectionalParticleSpeed={(d) => d.value}
|
||||||
@ -83,6 +93,17 @@ const ServiceMap = (props: ServiceMapProps) => {
|
|||||||
|
|
||||||
node.__bckgDimensions = bckgDimensions; // to re-use in nodePointerAreaPaint
|
node.__bckgDimensions = bckgDimensions; // to re-use in nodePointerAreaPaint
|
||||||
}}
|
}}
|
||||||
|
onNodeClick={(node) => {
|
||||||
|
const tooltip = document.querySelector(".graph-tooltip");
|
||||||
|
if (tooltip && node) {
|
||||||
|
tooltip.innerHTML = `<div style="padding:12px;background: black;border: 1px solid #BDBDBD;border-radius: 2px;">
|
||||||
|
<div style="color:white; font-weight:bold; margin-bottom:8px;">${node.id}</div>
|
||||||
|
<div style="color:white">P99 latency: ${node.p99 / 1000000}</div>
|
||||||
|
<div style="color:white">Error Rate: ${node.errorRate}%</div>
|
||||||
|
<div style="color:white">Request Per Sec: ${node.callRate}</div>
|
||||||
|
</div>`;
|
||||||
|
}
|
||||||
|
}}
|
||||||
nodePointerAreaPaint={(node, color, ctx) => {
|
nodePointerAreaPaint={(node, color, ctx) => {
|
||||||
ctx.fillStyle = color;
|
ctx.fillStyle = color;
|
||||||
const bckgDimensions = node.__bckgDimensions;
|
const bckgDimensions = node.__bckgDimensions;
|
||||||
|
@ -45,7 +45,17 @@ export const getGraphData = (serviceMap: serviceMapStore): graphDataType => {
|
|||||||
color = "#ebeb15";
|
color = "#ebeb15";
|
||||||
}
|
}
|
||||||
const { fontSize, width } = getDimensions(service.callRate, highestCallRate);
|
const { fontSize, width } = getDimensions(service.callRate, highestCallRate);
|
||||||
return { id: node, group: i + 1, fontSize, width, color, nodeVal: width };
|
return {
|
||||||
|
id: node,
|
||||||
|
group: i + 1,
|
||||||
|
fontSize,
|
||||||
|
width,
|
||||||
|
color,
|
||||||
|
nodeVal: width,
|
||||||
|
callRate: service.callRate,
|
||||||
|
errorRate: service.errorRate,
|
||||||
|
p99: service.p99,
|
||||||
|
};
|
||||||
});
|
});
|
||||||
return {
|
return {
|
||||||
nodes,
|
nodes,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user