mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-12 02:19:02 +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 { RouteComponentProps } from "react-router-dom";
|
||||
import {
|
||||
@ -7,10 +7,12 @@ import {
|
||||
getServiceMapItems,
|
||||
getDetailedServiceMapItems,
|
||||
} from "Src/store/actions";
|
||||
import { Spin } from "antd";
|
||||
|
||||
import { StoreState } from "../../store/reducers";
|
||||
import { getGraphData } from "./utils";
|
||||
import SelectService from "./SelectService";
|
||||
import { ForceGraph2D } from "react-force-graph";
|
||||
|
||||
interface ServiceMapProps extends RouteComponentProps<any> {
|
||||
serviceMap: serviceMapStore;
|
||||
globalTime: GlobalTime;
|
||||
@ -39,26 +41,34 @@ const ServiceMap = (props: ServiceMapProps) => {
|
||||
globalTime,
|
||||
serviceMap,
|
||||
} = props;
|
||||
|
||||
useEffect(() => {
|
||||
getServiceMapItems(globalTime);
|
||||
getDetailedServiceMapItems(globalTime);
|
||||
}, []);
|
||||
|
||||
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 graphData = { nodes, links };
|
||||
return (
|
||||
<div>
|
||||
<SelectService
|
||||
services={serviceMap.services}
|
||||
zoomToService={zoomToService}
|
||||
/>
|
||||
<ForceGraph2D
|
||||
ref={fgRef}
|
||||
cooldownTicks={100}
|
||||
onEngineStop={() => fgRef.current.zoomToFit(100, 100)}
|
||||
onEngineStop={() => fgRef.current.zoomToFit(100, 200)}
|
||||
graphData={graphData}
|
||||
nodeLabel="id"
|
||||
nodeAutoColorBy={(d) => d.id}
|
||||
linkAutoColorBy={(d) => d.target}
|
||||
linkDirectionalParticles="value"
|
||||
linkDirectionalParticleSpeed={(d) => d.value}
|
||||
@ -83,6 +93,17 @@ const ServiceMap = (props: ServiceMapProps) => {
|
||||
|
||||
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) => {
|
||||
ctx.fillStyle = color;
|
||||
const bckgDimensions = node.__bckgDimensions;
|
||||
|
@ -45,7 +45,17 @@ export const getGraphData = (serviceMap: serviceMapStore): graphDataType => {
|
||||
color = "#ebeb15";
|
||||
}
|
||||
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 {
|
||||
nodes,
|
||||
|
Loading…
x
Reference in New Issue
Block a user