Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: optimize monitor data fetching for large time ranges in overview… #10

Merged
merged 1 commit into from
Dec 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions web/src/components/Overview/Detail/Metrics/MetricLine.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,8 @@ export default (props) => {
},
};
return (
<div className={styles.lineWrapper}>
<div className={styles.chartTitle}>{props.title}</div>
<div className={styles.chartBody}>
<Line {...config} />
</div>
<div className={styles.chartBody}>
<Line {...config} />
</div>
);
};
97 changes: 55 additions & 42 deletions web/src/components/Overview/Detail/Metrics/MetricLineList.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,53 +3,66 @@ import { Line } from "@ant-design/plots";
import styles from "./index.scss";
import MetricLine from "./MetricLine";
import { formatMessage } from "umi/locale";
import { useState } from "react";
import request from "@/utils/request";
import MetricChart from "@/pages/Platform/Overview/components/MetricChart";

export default ({ metrics = {}, renderExtraMetric }) => {
let newMetrics = Object.values(metrics).map((item) => {
let key = item.key;
let units = "";
let newData = [];
item.lines.map((line) => {
let category = line.metric.label;
if (!units) {
if (line.metric.formatType.toLowerCase() == "bytes") {
units = line.metric.formatType;
} else {
units = line.metric.units;
}
}

return line.data.map((ld) => {
newData.push({
category: category,
x: formatter.dateUserDefined(parseInt(ld[0])),
y: ld[1],
});
});
});
return { key: key, data: newData, units: units, order: item.order };
});
newMetrics = newMetrics.sort((a, b) => a.order - b.order);
export default (props) => {
const { action, timeRange, timezone, timeout, overview, renderExtraMetric, metrics = [], queryParams } = props

return (
<div className={styles.metricChart}>
{newMetrics.map((item) => {
if(["node_health", "parent_breaker", "index_health"].includes(item.key)){
return null;
}
let config = {
data: item.data,
xField: "x",
yField: "y",
seriesField: "category",
title: `${formatMessage({
id: "cluster.metrics.axis." + item.key + ".title",
})} ${item.units ? "(" + item.units + ")" : ""}`,
yUnits: item.units,
};
return <MetricLine {...config} key={item.key} />;
{metrics.map((metricKey) => {
return (
<MetricChart
key={metricKey}
timezone={timezone}
timeRange={timeRange}
fetchUrl={action}
metricKey={metricKey}
title={formatMessage({id: "cluster.metrics.axis." + metricKey + ".title"})}
queryParams={queryParams}
timeout={timeout}
className={styles.lineWrapper}
formatMetric={(metric) => {
if (!metric) return metric;
let units = "";
const newData = [];
(metric.lines || []).map((line) => {
let category = line.metric.label;
if (!units) {
if (line.metric.formatType.toLowerCase() == "bytes") {
units = line.metric.formatType;
} else {
units = line.metric.units;
}
}

return line.data.map((ld) => {
newData.push({
category: category,
x: formatter.dateUserDefined(parseInt(ld[0])),
y: ld[1],
});
});
});
return { ...metric, data: newData, units };
}}
customRenderChart={(metric) => {
if (!metric) return null
const config = {
data: metric.data,
xField: "x",
yField: "y",
seriesField: "category",
yUnits: metric.units,
};
return <MetricLine {...config} key={metric.key} />
}}
/>
)
})}
{renderExtraMetric ? renderExtraMetric() : null}
</div>
);
};
};
45 changes: 14 additions & 31 deletions web/src/components/Overview/Detail/Metrics/MetricSeries.jsx
Original file line number Diff line number Diff line change
@@ -1,38 +1,21 @@
import React, { useMemo, useEffect } from "react";
import { ESPrefix } from "@/services/common";
import useFetch from "@/lib/hooks/use_fetch";
import { calculateBounds } from "@/components/vendor/data/common/query/timefilter";
import MetricLineList from "./MetricLineList";
import { formatTimeRange } from "@/lib/elasticsearch/util";

export default ({ action, timeRange, overview, setSpinning, renderExtraMetric }) => {
export default (props) => {

const queryParams = useMemo(() => {
const bounds = calculateBounds({
from: timeRange.min,
to: timeRange.max,
});
let params = {
min: bounds.min.valueOf(),
max: bounds.max.valueOf(),
};
params.overview = overview;
return params;
}, [timeRange]);

const { loading, error, value } = useFetch(
action,
{ queryParams },
[action, queryParams]
);

useEffect(() => {
setSpinning(loading);
}, [loading]);
const { action, bucketSize, timeRange, overview, setSpinning, renderExtraMetric, metrics = [] } = props

const metrics = useMemo(() => {
const { metrics = {} } = value || {};
return metrics;
}, [value]);
const queryParams = useMemo(() => {
const newParams = formatTimeRange(timeRange);
if (overview) {
newParams.overview = overview;
}
if (bucketSize) {
newParams.bucket_size = bucketSize
}
return newParams;
}, [timeRange, bucketSize]);

return <MetricLineList metrics={metrics} renderExtraMetric={renderExtraMetric}/>;
return <MetricLineList {...props} queryParams={queryParams} />;
};
28 changes: 23 additions & 5 deletions web/src/components/Overview/Detail/Metrics/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { formatMessage } from "umi/locale";
import DatePicker from "@/common/src/DatePicker";
import { getLocale } from "umi/locale";
import { getTimezone } from "@/utils/utils";
import { TIMEOUT_CACHE_KEY } from "../../Monitor";

const { TabPane } = Tabs;

Expand All @@ -26,6 +27,7 @@ export default (props) => {
linkMore,
overviews,
extra,
metrics = [],
} = props;

const [spinning, setSpinning] = useState(false);
Expand All @@ -35,12 +37,14 @@ export default (props) => {
max: "now",
timeFormatter: formatter.dates(1),
},
timeInterval: '',
timeout: localStorage.getItem(TIMEOUT_CACHE_KEY) || '120s',
});

const [refresh, setRefresh] = useState({ isRefreshPaused: false });
const [timeZone, setTimeZone] = useState(() => getTimezone());

const handleTimeChange = ({ start, end }) => {
const handleTimeChange = ({ start, end, timeInterval, timeout }) => {
const bounds = calculateBounds({
from: start,
to: end,
Expand All @@ -55,6 +59,8 @@ export default (props) => {
max: end,
timeFormatter: formatter.dates(intDay),
},
timeInterval: timeInterval || state.timeInterval,
timeout: timeout || state.timeout
});
setSpinning(true);
};
Expand Down Expand Up @@ -90,23 +96,35 @@ export default (props) => {
{...refresh}
onRefreshChange={setRefresh}
onRefresh={handleTimeChange}
showTimeSetting={true}
showTimeInterval={true}
showTimeout={true}
timeout={state.timeout}
onTimeSettingChange={(timeSetting) => {
localStorage.setItem(TIMEOUT_CACHE_KEY, timeSetting.timeout)
setState({
...state,
timeInterval: timeSetting.timeInterval,
timeout: timeSetting.timeout
});
}}
timeZone={timeZone}
onTimeZoneChange={setTimeZone}
recentlyUsedRangesKey={'overview-detail'}
/>
</div>
<Button onClick={() => {
handleTimeChange({ start: state.timeRange.min, end: state.timeRange.max})
}} loading={spinning} icon={"reload"} type="primary" />
</div>

<div className={styles.metricWrapper}>
<MetricSeries
action={metricAction}
timeRange={state.timeRange}
timeZone={timeZone}
overview={1}
setSpinning={setSpinning}
renderExtraMetric={renderExtraMetric}
metrics={metrics}
{...state}
bucketSize={state.timeInterval}
/>
</div>

Expand Down
3 changes: 1 addition & 2 deletions web/src/components/Overview/Monitor/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ const formatTimeout = (timeout) => {
return timeout
}

const TIMEOUT_CACHE_KEY = "monitor-timeout"
export const TIMEOUT_CACHE_KEY = "monitor-timeout"

const Monitor = (props) => {
const {
Expand Down Expand Up @@ -187,7 +187,6 @@ const Monitor = (props) => {
setSpinning={setSpinning}
{...extraParams}
bucketSize={state.timeInterval}
timeout={state.timeout}
/>
)
) : null}
Expand Down
1 change: 1 addition & 0 deletions web/src/pages/Platform/Overview/Cluster/Detail/Metrics.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export default (props) => {
params={{ clusterID, clusterName }}
linkMore={`/cluster/monitor/elasticsearch/${clusterID}`}
overviews={overviews}
metrics={['index_throughput', 'search_throughput', 'index_latency', 'search_latency']}
/>
)

Expand Down
2 changes: 2 additions & 0 deletions web/src/pages/Platform/Overview/Cluster/Monitor/advanced.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import IndexMetric from "../../components/index_metric";
import ClusterMetric from "../../components/cluster_metric";
import QueueMetric from "../../components/queue_metric";
import { ESPrefix } from "@/services/common";
import { SearchEngines } from "@/lib/search_engines";

const timezone = "local";

Expand All @@ -19,6 +20,7 @@ export default ({
}) => {

const isVersionGTE6 = useMemo(() => {
if ([SearchEngines.Easysearch, SearchEngines.Opensearch].includes(selectedCluster?.distribution)) return true;
const main = selectedCluster?.version?.split('.')[0]
if (main && parseInt(main) >= 6) {
return true
Expand Down
6 changes: 6 additions & 0 deletions web/src/pages/Platform/Overview/Indices/Detail/Metrics.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ export default (props) => {
params={{ clusterID, clusterName }}
linkMore={`/cluster/monitor/${clusterID}/indices/${indexName}?_g={"cluster_name":"${clusterName}"}`}
overviews={overviews}
metrics={[
"index_throughput",
"search_throughput",
"index_latency",
"search_latency",
]}
/>
)
};
8 changes: 8 additions & 0 deletions web/src/pages/Platform/Overview/Node/Detail/Metrics.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,14 @@ export default (props) => {
params={{ clusterID, clusterName }}
linkMore={`/cluster/monitor/${clusterID}/nodes/${nodeID}?_g={"cluster_name":"${clusterName}","node_name":"${nodeName}"}`}
overviews={overviews}
metrics={[
"cpu",
"jvm",
"index_throughput",
"search_throughput",
"index_latency",
"search_latency",
]}
/>
);
};
4 changes: 3 additions & 1 deletion web/src/pages/Platform/Overview/Node/Monitor/advanced.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Tabs } from "antd";
import NodeMetric from "../../components/node_metric";
import QueueMetric from "../../components/queue_metric";
import { formatMessage } from "umi/locale";
import { SearchEngines } from "@/lib/search_engines";

const timezone = "local";

Expand All @@ -17,12 +18,13 @@ export default ({
}) => {

const isVersionGTE6 = useMemo(() => {
if ([SearchEngines.Easysearch, SearchEngines.Opensearch].includes(selectedCluster?.distribution)) return true;
const main = selectedCluster?.version?.split('.')[0]
if (main && parseInt(main) >= 6) {
return true
}
return false
}, [selectedCluster?.version])
}, [selectedCluster])

const [param, setParam] = useState({
show_top: false,
Expand Down
Loading
Loading