Skip to content

Commit 39efa09

Browse files
authored
Merge pull request #172 from jpinsonneau/372_warnings
NETOBSERV-372 Warning messages
2 parents 6590b58 + 64e40b3 commit 39efa09

File tree

4 files changed

+103
-28
lines changed

4 files changed

+103
-28
lines changed

web/locales/en/plugin__network-observability-plugin.json

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,22 @@
6060
"Learn more": "Learn more",
6161
"Common": "Common",
6262
"Filter already exists": "Filter already exists",
63-
"Clear all filters": "Clear all filters",
63+
"Enable": "Enable",
64+
"Disable": "Disable",
65+
"group filter": "group filter",
66+
"filter": "filter",
6467
"Edit filters": "Edit filters",
68+
"Clear all filters": "Clear all filters",
6569
"Build info": "Build info",
6670
"Configuration limits": "Configuration limits",
6771
"Metrics": "Metrics",
72+
"Loki '/ready' endpoint returned the following error": "Loki '/ready' endpoint returned the following error",
6873
"You may consider the following query changes to avoid this error": "You may consider the following query changes to avoid this error",
74+
"Check if Loki is running correctly. '/ready' endpoint should respond \"ready\"": "Check if Loki is running correctly. '/ready' endpoint should respond \"ready\"",
6975
"Reduce the Query Options -> limit to reduce the number of results": "Reduce the Query Options -> limit to reduce the number of results",
7076
"Increase Loki \"max_entries_limit_per_query\" entry in configuration file": "Increase Loki \"max_entries_limit_per_query\" entry in configuration file",
71-
"Add some filters like Namespace or Name to reduce the number of results": "Add some filters like Namespace or Name to reduce the number of results",
77+
"Add Namespace, Owner or Resource filters (which use indexed fields) to improve the query performance": "Add Namespace, Owner or Resource filters (which use indexed fields) to improve the query performance",
78+
"Reduce limit and time range to decrease the number of results": "Reduce limit and time range to decrease the number of results",
7279
"Reduce the time range to decrease the number of results": "Reduce the time range to decrease the number of results",
7380
"Increase Loki \"max_query_length\" entry in configuration file": "Increase Loki \"max_query_length\" entry in configuration file",
7481
"Configuring Grafana Loki": "Configuring Grafana Loki",
@@ -140,13 +147,15 @@
140147
"Truncate labels": "Truncate labels",
141148
"Kind": "Kind",
142149
"Name": "Name",
150+
"Query is slow": "Query is slow",
143151
"Flow Table": "Flow Table",
144152
"Topology": "Topology",
145153
"Collapse": "Collapse",
146154
"Expand": "Expand",
147155
"Actions": "Actions",
148156
"View": "View",
149157
"Network Traffic": "Network Traffic",
158+
"Add more filters or decrease limit / range to improve the query performance": "Add more filters or decrease limit / range to improve the query performance",
150159
"Query limit reached": "Query limit reached",
151160
"Filtered flows count": "Filtered flows count",
152161
"{{count}} flows": "{{count}} flows",

web/src/components/netflow-traffic.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,11 @@ span.pf-c-button__icon.pf-m-start {
9494
.pf-c-dropdown__group>ul {
9595
list-style: none;
9696
padding-left: 10px;
97+
}
98+
99+
#netflow-warning {
100+
position: absolute;
101+
right: 2em;
102+
bottom: 3em;
103+
z-index: 999;
97104
}

web/src/components/netflow-traffic.tsx

Lines changed: 74 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { isModelFeatureFlag, ModelFeatureFlag, useResolvedExtensions } from '@openshift-console/dynamic-plugin-sdk';
22
import {
3+
Alert,
4+
AlertActionCloseButton,
35
Button,
46
Drawer,
57
DrawerContent,
@@ -45,7 +47,7 @@ import { DefaultOptions, TopologyGroupTypes, TopologyOptions } from '../model/to
4547
import { Column, getDefaultColumns } from '../utils/columns';
4648
import { TimeRange } from '../utils/datetime';
4749
import { getHTTPErrorDetails } from '../utils/errors';
48-
import { DisabledFilters, Filter, getDisabledFiltersRecord, getEnabledFilters } from '../model/filters';
50+
import { DisabledFilters, Filter, hasIndexFields, getDisabledFiltersRecord, getEnabledFilters } from '../model/filters';
4951
import {
5052
LOCAL_STORAGE_COLS_KEY,
5153
LOCAL_STORAGE_DISABLED_FILTERS_KEY,
@@ -119,6 +121,8 @@ export const NetflowTraffic: React.FC<{
119121
setURLParams(queryParams);
120122
}
121123

124+
const warningTimeOut = React.useRef<NodeJS.Timeout | undefined>();
125+
const [warningMessage, setWarningMessage] = React.useState<string | undefined>();
122126
const [isOverflowMenuOpen, setOverflowMenuOpen] = React.useState(false);
123127
const [isFullScreen, setFullScreen] = React.useState(false);
124128
const [loading, setLoading] = React.useState(true);
@@ -240,45 +244,67 @@ export const NetflowTraffic: React.FC<{
240244
topologyOptions.groupTypes
241245
]);
242246

247+
const manageWarnings = React.useCallback(
248+
(query: Promise<unknown>) => {
249+
Promise.race([query, new Promise((resolve, reject) => setTimeout(reject, 2000, 'slow'))]).then(
250+
null,
251+
(reason: string) => {
252+
if (reason === 'slow') {
253+
setWarningMessage(`${t('Query is slow')}`);
254+
}
255+
}
256+
);
257+
},
258+
// i18n t dependency kills jest
259+
// eslint-disable-next-line react-hooks/exhaustive-deps
260+
[]
261+
);
262+
243263
const tick = React.useCallback(() => {
244264
setLoading(true);
245265
setError(undefined);
246266
const fq = buildFlowQuery();
247267
switch (selectedViewId) {
248268
case 'table':
249-
getFlows(fq)
250-
.then(result => {
251-
setFlows(result.records);
252-
setStats(result.stats);
253-
})
254-
.catch(err => {
255-
setFlows([]);
256-
setError(getHTTPErrorDetails(err));
257-
})
258-
.finally(() => {
259-
setLoading(false);
260-
});
269+
manageWarnings(
270+
getFlows(fq)
271+
.then(result => {
272+
setFlows(result.records);
273+
setStats(result.stats);
274+
})
275+
.catch(err => {
276+
setFlows([]);
277+
setError(getHTTPErrorDetails(err));
278+
setWarningMessage(undefined);
279+
})
280+
.finally(() => {
281+
setLoading(false);
282+
})
283+
);
261284
break;
262285
case 'topology':
263-
getTopology(fq, range)
264-
.then(result => {
265-
setMetrics(result.metrics);
266-
setStats(result.stats);
267-
})
268-
.catch(err => {
269-
setMetrics([]);
270-
setError(getHTTPErrorDetails(err));
271-
})
272-
.finally(() => {
273-
setLoading(false);
274-
});
286+
manageWarnings(
287+
getTopology(fq, range)
288+
.then(result => {
289+
setMetrics(result.metrics);
290+
setStats(result.stats);
291+
})
292+
.catch(err => {
293+
setMetrics([]);
294+
setError(getHTTPErrorDetails(err));
295+
setWarningMessage(undefined);
296+
})
297+
.finally(() => {
298+
setLoading(false);
299+
})
300+
);
275301
break;
276302
default:
277303
console.error('tick called on not implemented view Id', selectedViewId);
278304
setLoading(false);
279305
break;
280306
}
281-
}, [buildFlowQuery, range, selectedViewId]);
307+
}, [buildFlowQuery, manageWarnings, range, selectedViewId]);
282308

283309
usePoll(tick, interval);
284310

@@ -333,11 +359,21 @@ export const NetflowTraffic: React.FC<{
333359
// eslint-disable-next-line react-hooks/exhaustive-deps
334360
}, [filters]);
335361

362+
//clear warning message after 10s
363+
React.useEffect(() => {
364+
if (warningTimeOut.current) {
365+
clearTimeout(warningTimeOut.current);
366+
}
367+
368+
warningTimeOut.current = setTimeout(() => setWarningMessage(undefined), 10000);
369+
}, [warningMessage]);
370+
336371
// updates table filters and clears up the table for proper visualization of the
337372
// updating process
338373
const updateTableFilters = (f: Filter[]) => {
339374
setFilters(f);
340375
setFlows([]);
376+
setWarningMessage(undefined);
341377
};
342378

343379
const clearFilters = () => {
@@ -711,6 +747,18 @@ export const NetflowTraffic: React.FC<{
711747
range={range}
712748
filters={forcedFilters ? forcedFilters : filters}
713749
/>
750+
{!_.isEmpty(warningMessage) && (
751+
<Alert
752+
id="netflow-warning"
753+
title={warningMessage}
754+
variant="warning"
755+
actionClose={<AlertActionCloseButton onClose={() => setWarningMessage(undefined)} />}
756+
>
757+
{hasIndexFields(filters)
758+
? t('Add more filters or decrease limit / range to improve the query performance')
759+
: t('Add Namespace, Owner or Resource filters (which use indexed fields) to improve the query performance')}
760+
</Alert>
761+
)}
714762
</PageSection>
715763
) : null;
716764
};

web/src/model/filters.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,14 @@ export const getDisabledFiltersRecord = (filters: Filter[]) => {
123123
});
124124
return disabledFilters;
125125
};
126+
127+
export const hasIndexFields = (filters: Filter[]) => {
128+
return (
129+
filters.find(
130+
f =>
131+
f.def.id.includes('namespace') ||
132+
f.def.id.includes('owner') ||
133+
['name', 'src_name', 'dst_name'].includes(f.def.id.toString())
134+
) !== undefined
135+
);
136+
};

0 commit comments

Comments
 (0)