Skip to content

Commit f5f2edd

Browse files
committed
display empty UDNs
1 parent d9e4b4d commit f5f2edd

File tree

11 files changed

+69
-14
lines changed

11 files changed

+69
-14
lines changed

web/locales/en/plugin__netobserv-plugin.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"No information available for this content. Change scope to get more details.": "No information available for this content. Change scope to get more details.",
1111
"Cluster name": "Cluster name",
1212
"UDN": "UDN",
13+
"Can't find metrics for this element. Check your capture filters to ensure we can monitor it. Else it probably means there is no traffic here.": "Can't find metrics for this element. Check your capture filters to ensure we can monitor it. Else it probably means there is no traffic here.",
1314
"Source": "Source",
1415
"Destination": "Destination",
1516
"Stats": "Stats",

web/src/components/drawer/element/element-panel-content.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,25 @@ export const ElementPanelContent: React.FC<ElementPanelContentProps> = ({
103103
[filterDefinitions, filters, setFilters, t]
104104
);
105105

106+
const metricsInfo = React.useCallback(
107+
(d: NodeData) => {
108+
if (!d.noMetrics) {
109+
return <></>;
110+
}
111+
112+
return (
113+
<TextContent id="noMetrics" className="record-field-container">
114+
<Text component={TextVariants.p}>
115+
{t(
116+
"Can't find metrics for this element. Check your capture filters to ensure we can monitor it. Else it probably means there is no traffic here."
117+
)}
118+
</Text>
119+
</TextContent>
120+
);
121+
},
122+
[t]
123+
);
124+
106125
if (element instanceof BaseNode && data) {
107126
return (
108127
<>
@@ -116,6 +135,7 @@ export const ElementPanelContent: React.FC<ElementPanelContentProps> = ({
116135
setFilters={setFilters}
117136
filterDefinitions={filterDefinitions}
118137
/>
138+
{metricsInfo(data)}
119139
</>
120140
);
121141
} else if (element instanceof BaseEdge) {

web/src/components/drawer/element/element-panel.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export const ElementPanel: React.FC<ElementPanelProps> = ({
5757
const [activeTab, setActiveTab] = React.useState<string>('details');
5858

5959
const data = element.getData();
60+
const noMetrics = data && data.noMetrics === true;
6061
let aData: NodeData;
6162
let bData: NodeData | undefined;
6263
if (element instanceof BaseEdge) {
@@ -114,7 +115,7 @@ export const ElementPanel: React.FC<ElementPanelProps> = ({
114115
filterDefinitions={filterDefinitions}
115116
/>
116117
</Tab>
117-
{!_.isEmpty(metrics) && (
118+
{!noMetrics && !_.isEmpty(metrics) && (
118119
<Tab className="drawer-tab" eventKey={'metrics'} title={<TabTitleText>{t('Metrics')}</TabTitleText>}>
119120
<ElementPanelMetrics
120121
aData={aData}
@@ -127,7 +128,7 @@ export const ElementPanel: React.FC<ElementPanelProps> = ({
127128
/>
128129
</Tab>
129130
)}
130-
{!_.isEmpty(droppedMetrics) && (
131+
{!noMetrics && !_.isEmpty(droppedMetrics) && (
131132
<Tab className="drawer-tab" eventKey={'dropped'} title={<TabTitleText>{t('Drops')}</TabTitleText>}>
132133
<ElementPanelMetrics
133134
aData={aData}

web/src/components/drawer/netflow-traffic-drawer.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export interface NetflowTrafficDrawerProps {
7373
k8sModels: { [key: string]: K8sModel };
7474
topologyMetricFunction: StatFunction;
7575
topologyMetricType: MetricType;
76+
topologyUDNIds: string[];
7677
metricScope: FlowScope;
7778
setMetricScope: (ms: FlowScope) => void;
7879
topologyOptions: TopologyOptions;
@@ -293,6 +294,7 @@ export const NetflowTrafficDrawer: React.FC<NetflowTrafficDrawerProps> = React.f
293294
metricFunction={props.topologyMetricFunction}
294295
metricType={props.topologyMetricType}
295296
metricScope={props.metricScope}
297+
expectedNodes={[...props.topologyUDNIds]} // concat all expected nodes here
296298
setMetricScope={props.setMetricScope}
297299
metrics={getTopologyMetrics() || []}
298300
droppedMetrics={getTopologyDroppedMetrics() || []}

web/src/components/netflow-traffic.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,8 +438,20 @@ export const NetflowTraffic: React.FC<NetflowTrafficProps> = ({
438438
clearFlows
439439
);
440440

441-
// TODO: do something with UDN Ids to highlight empty / unused
442-
drawerRef.current?.getTopologyHandle()?.fetchUDNs();
441+
if (model.metricScope === 'udn') {
442+
drawerRef.current
443+
?.getTopologyHandle()
444+
?.fetchUDNs()
445+
.then(ids => {
446+
model.setTopologyUDNIds(ids);
447+
})
448+
.catch(err => {
449+
console.error('fetchUDNs error', err);
450+
model.setTopologyUDNIds([]);
451+
});
452+
} else {
453+
model.setTopologyUDNIds([]);
454+
}
443455
break;
444456
default:
445457
console.error('tick called on not implemented view Id', model.selectedViewId);

web/src/components/tabs/netflow-topology/2d/styles/styleNode.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
ClusterIcon,
33
CubeIcon,
44
CubesIcon,
5+
NetworkIcon,
56
OutlinedHddIcon,
67
QuestionCircleIcon,
78
ServiceIcon,
@@ -63,6 +64,8 @@ const getTypeIcon = (resourceKind?: string): React.ComponentClass<any, any> => {
6364
return ClusterIcon;
6465
case 'Zone':
6566
return ZoneIcon;
67+
case 'UDN':
68+
return NetworkIcon;
6669
case 'CatalogSource':
6770
case 'DaemonSet':
6871
case 'Deployment':

web/src/components/tabs/netflow-topology/2d/topology-content.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ const fitPadding = 80;
5555

5656
export interface TopologyContentProps {
5757
k8sModels: { [key: string]: K8sModel };
58+
expectedNodes: string[];
5859
metricFunction: StatFunction;
5960
metricType: MetricType;
6061
metricScope: FlowScope;
@@ -78,6 +79,7 @@ export interface TopologyContentProps {
7879

7980
export const TopologyContent: React.FC<TopologyContentProps> = ({
8081
k8sModels,
82+
expectedNodes,
8183
metricFunction,
8284
metricType,
8385
metricScope,
@@ -345,6 +347,7 @@ export const TopologyContent: React.FC<TopologyContentProps> = ({
345347
t,
346348
filterDefinitions,
347349
k8sModels,
350+
expectedNodes,
348351
isDark
349352
);
350353
const allIds = [...(updatedModel.nodes || []), ...(updatedModel.edges || [])].map(item => item.id);
@@ -387,6 +390,7 @@ export const TopologyContent: React.FC<TopologyContentProps> = ({
387390
t,
388391
filterDefinitions,
389392
k8sModels,
393+
expectedNodes,
390394
isDark
391395
]);
392396

web/src/components/tabs/netflow-topology/__tests__/netflow-topology.spec.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ describe('<NetflowTopology />', () => {
3737
onSelect: jest.fn(),
3838
searchHandle: null,
3939
searchEvent: undefined,
40-
scopes: ScopeDefSample
40+
scopes: ScopeDefSample,
41+
expectedNodes: []
4142
};
4243

4344
it('should render component', async () => {

web/src/components/tabs/netflow-topology/netflow-topology.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export type NetflowTopologyHandle = {
5353
setWarning: (v?: Warning) => void,
5454
initFunction: () => void
5555
) => Promise<Stats[]> | undefined;
56-
fetchUDNs: () => void;
56+
fetchUDNs: () => Promise<string[]>;
5757
};
5858

5959
export interface NetflowTopologyProps {
@@ -63,6 +63,7 @@ export interface NetflowTopologyProps {
6363
metricFunction: StatFunction;
6464
metricType: MetricType;
6565
metricScope: FlowScope;
66+
expectedNodes: string[];
6667
setMetricScope: (ms: FlowScope) => void;
6768
metrics: TopologyMetrics[];
6869
droppedMetrics: TopologyMetrics[];
@@ -185,13 +186,7 @@ export const NetflowTopology: React.FC<NetflowTopologyProps> = React.forwardRef(
185186
);
186187

187188
const fetchUDNs = React.useCallback(() => {
188-
getK8SUDNIds()
189-
.then(ids => {
190-
console.log('fetchUDNs', ids);
191-
})
192-
.catch(err => {
193-
console.error('fetchUDNs', err);
194-
});
189+
return getK8SUDNIds();
195190
}, []);
196191

197192
React.useImperativeHandle(ref, () => ({
@@ -237,6 +232,7 @@ export const NetflowTopology: React.FC<NetflowTopologyProps> = React.forwardRef(
237232
/>
238233
<TopologyContent
239234
k8sModels={props.k8sModels}
235+
expectedNodes={props.expectedNodes}
240236
metricFunction={props.metricFunction}
241237
metricType={props.metricType}
242238
metricScope={props.metricScope}

web/src/model/netflow-traffic.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* eslint-disable react-hooks/rules-of-hooks */
2-
import React from 'react';
2+
import React, { useState } from 'react';
33
import { Record } from '../api/ipfix';
44
import { defaultNetflowMetrics, NetflowMetrics, Stats } from '../api/loki';
55
import { rateMetricFunctions, timeMetricFunctions } from '../components/dropdowns/metric-function-dropdown';
@@ -91,6 +91,7 @@ export function netflowTrafficModel() {
9191
localStorageMetricTypeKey,
9292
defaultMetricType
9393
);
94+
const [topologyUDNIds, setTopologyUDNIds] = useState<string[]>([]);
9495
const [interval, setInterval] = useLocalStorage<number | undefined>(localStorageRefreshKey);
9596
const [showViewOptions, setShowViewOptions] = useLocalStorage<boolean>(localStorageShowOptionsKey, false);
9697
const [showHistogram, setShowHistogram] = useLocalStorage<boolean>(localStorageShowHistogramKey, false);
@@ -203,6 +204,8 @@ export function netflowTrafficModel() {
203204
setTopologyMetricFunction,
204205
topologyMetricType,
205206
setTopologyMetricType: updateTopologyMetricType,
207+
topologyUDNIds,
208+
setTopologyUDNIds,
206209
interval,
207210
setInterval,
208211
showViewOptions,

0 commit comments

Comments
 (0)