1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Handle invalid metric response properly (#464)

* catch undefined and return default empty in normalizeMetrics

* fix crash on drilldown

Signed-off-by: Sebastian Malton <smalton@mirantis.com>

Co-authored-by: Sebastian Malton <smalton@mirantis.com>
This commit is contained in:
Sebastian Malton 2020-06-16 13:47:01 -04:00 committed by GitHub
parent b9ddb503ee
commit 1752b8d3d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 35 additions and 18 deletions

View File

@ -56,7 +56,21 @@ export const metricsApi = {
};
export function normalizeMetrics(metrics: IMetrics, frames = 60): IMetrics {
if (!metrics?.data?.result) {
return {
data: {
resultType: "",
result: [{
metric: {},
values: []
} as IMetricsResult],
},
status: "",
}
}
const { result } = metrics.data;
if (result.length) {
if (frames > 0) {
// fill the gaps
@ -80,13 +94,16 @@ export function normalizeMetrics(metrics: IMetrics, frames = 60): IMetrics {
}
export function isMetricsEmpty(metrics: { [key: string]: IMetrics }) {
return Object.values(metrics).every(metric => !metric.data.result.length);
return Object.values(metrics).every(metric => !metric?.data?.result?.length);
}
export function getItemMetrics(metrics: { [key: string]: IMetrics }, itemName: string) {
export function getItemMetrics(metrics: { [key: string]: IMetrics }, itemName: string): { [key: string]: IMetrics } {
if (!metrics) return;
const itemMetrics = { ...metrics };
for (const metric in metrics) {
if (!metrics[metric]?.data?.result) {
continue
}
const results = metrics[metric].data.result;
const result = results.find(res => Object.values(res.metric)[0] == itemName);
itemMetrics[metric].data.result = result ? [result] : [];

View File

@ -82,15 +82,15 @@ export class ClusterStore extends KubeObjectStore<Cluster> {
this.liveMetrics = await this.loadMetrics({ start, end, step, range });
}
getMetricsValues(source: Partial<IClusterMetrics>) {
const metrics =
this.metricType === MetricType.CPU ? source.cpuUsage :
this.metricType === MetricType.MEMORY ? source.memoryUsage
: null;
if (!metrics) {
getMetricsValues(source: Partial<IClusterMetrics>): [number, string][] {
switch (this.metricType) {
case MetricType.CPU:
return normalizeMetrics(source.cpuUsage).data.result[0].values
case MetricType.MEMORY:
return normalizeMetrics(source.memoryUsage).data.result[0].values
default:
return [];
}
return normalizeMetrics(metrics).data.result[0].values;
}
resetMetrics() {

View File

@ -18,9 +18,9 @@ export const IngressCharts = observer(() => {
if (!metrics) return null;
if (isMetricsEmpty(metrics)) return <NoMetrics/>;
const values = Object.values(metrics).map(metric =>
normalizeMetrics(metric).data.result[0].values
);
const values = Object.values(metrics)
.map(normalizeMetrics)
.map(({ data }) => data.result[0].values);
const [
bytesSentSuccess,
bytesSentFailure,

View File

@ -17,9 +17,9 @@ export const ContainerCharts = () => {
if (!metrics) return null;
if (isMetricsEmpty(metrics)) return <NoMetrics/>;
const values = Object.values(metrics).map(metric =>
normalizeMetrics(metric).data.result[0].values
);
const values = Object.values(metrics)
.map(normalizeMetrics)
.map(({ data }) => data.result[0].values);
const [
cpuUsage,
cpuRequests,

View File

@ -28,9 +28,9 @@ export const PodCharts = observer(() => {
if (isMetricsEmpty(metrics)) return <NoMetrics/>;
const options = tabId == 0 ? cpuOptions : memoryOptions;
const values = Object.values(metrics).map(metric =>
normalizeMetrics(metric).data.result[0].values
);
const values = Object.values(metrics)
.map(normalizeMetrics)
.map(({ data }) => data.result[0].values);
const [
cpuUsage,
cpuRequests,