From 88bf54a6156f6a4231552a56dc42edb7ee63bdcd Mon Sep 17 00:00:00 2001 From: liugq Date: Tue, 30 Nov 2021 19:46:19 +0800 Subject: [PATCH] add queue mertic --- .../pages/Cluster/components/queue_metric.jsx | 274 ++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 web/src/pages/Cluster/components/queue_metric.jsx diff --git a/web/src/pages/Cluster/components/queue_metric.jsx b/web/src/pages/Cluster/components/queue_metric.jsx new file mode 100644 index 00000000..9a42d63e --- /dev/null +++ b/web/src/pages/Cluster/components/queue_metric.jsx @@ -0,0 +1,274 @@ +import * as React from "react"; +import { + Axis, + Chart, + CurveType, + LineSeries, + niceTimeFormatByDay, + Position, + ScaleType, + Settings, + timeFormatter, +} from "@elastic/charts"; +import useFetch from "@/lib/hooks/use_fetch"; +import { ESPrefix } from "@/services/common"; +import styles from "../Metrics.less"; +import { Spin, Radio, Select, Skeleton, Row, Col } from "antd"; +import { formatter, getFormatter, getNumFormatter } from "../format"; +import "./node_metric.scss"; +import { calculateBounds } from "@/components/kibana/data/common/query/timefilter"; +import moment from "moment"; +import { formatMessage } from "umi/locale"; +import MetricContainer from "./metric_container"; +import _ from "lodash"; + +const gorupOrder = ["system"]; + +export default ({ clusterID, timezone, timeRange, handleTimeChange }) => { + const [filter, setFilter] = React.useState({ + top: "5", + node_name: undefined, + }); + + const topChange = React.useCallback( + (e) => { + setFilter({ + node_name: undefined, + top: e.target.value, + }); + }, + [setFilter] + ); + + const nodeValueChange = React.useCallback( + (value) => { + setFilter({ + top: undefined, + node_name: value, + }); + }, + [setFilter] + ); + const queryParams = React.useMemo(() => { + const bounds = calculateBounds({ + from: timeRange.min, + to: timeRange.max, + }); + return { + ...filter, + min: bounds.min.valueOf(), + max: bounds.max.valueOf(), + }; + }, [filter, timeRange]); + const { loading, error, value } = useFetch( + `${ESPrefix}/${clusterID}/queue_metrics`, + { + queryParams: queryParams, + }, + [clusterID, queryParams] + ); + + const metrics = React.useMemo(() => { + return _.groupBy(value?.metrics, "group"); + // return Object.values(value?.metrics || {}).sort( + // (a, b) => a.order - b.order + // ); + }, [value]); + + const chartRefs = React.useRef(); + React.useEffect(() => { + let refs = []; + Object.values(metrics).map((m) => { + m.forEach(() => { + refs.push(React.createRef()); + }); + }); + chartRefs.current = refs; + }, [metrics]); + + const { value: nodes } = useFetch(`${ESPrefix}/${clusterID}/nodes`, {}, [ + clusterID, + ]); + const nodeNames = React.useMemo(() => { + return Object.keys(nodes || {}).map((k) => nodes[k].transport_address); + }, [nodes]); + + const pointerUpdate = (event) => { + chartRefs.current.forEach((ref) => { + if (ref.current) { + ref.current.dispatchExternalPointerEvent(event); + } + }); + }; + + const handleChartBrush = ({ x }) => { + if (!x) { + return; + } + const [from, to] = x; + if (typeof handleTimeChange == "function") { + handleTimeChange({ + start: moment(from).toISOString(), + end: moment(to).toISOString(), + }); + } + }; + + let refIdx = 0; + if (Object.keys(metrics).length == 0) { + return null; + } + return ( +
+
+
+
+
+ + + Top5 + + + Top10 + + + Top15 + + + Top20 + + +
+
+ +
+
+
+
+
+ + {//Object.keys(metrics) + gorupOrder.map((e, i) => { + return ( +
+ +
+ {metrics[e].map((metric) => { + let axis = metric.axis; + let lines = metric.lines; + if (lines && lines[0]?.data?.length == 0) { + return null; + } + let disableHeaderFormat = false; + let headerUnit = ""; + return ( +
+ + + `${formatter.full_dates(value)}${ + headerUnit ? ` ${headerUnit}` : "" + }`, + }} + debug={false} + /> + + {axis.map((item) => { + return ( + + ); + })} + + {lines.map((item) => { + return ( + + ); + })} + +
+ ); + })} +
+
+
+ ); + })} +
+
+
+ ); +};