Skip to content

Commit 00d0541

Browse files
[7.11] [Uptime] Display networks requests total (#88672) (#89171)
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
1 parent 87aca3a commit 00d0541

File tree

12 files changed

+183
-53
lines changed

12 files changed

+183
-53
lines changed

x-pack/plugins/uptime/common/runtime_types/network_events.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export type NetworkEvent = t.TypeOf<typeof NetworkEventType>;
4141

4242
export const SyntheticsNetworkEventsApiResponseType = t.type({
4343
events: t.array(NetworkEventType),
44+
total: t.number,
4445
});
4546

4647
export type SyntheticsNetworkEventsApiResponse = t.TypeOf<

x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_container.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ export const WaterfallChartContainer: React.FC<Props> = ({ checkGroup, stepIndex
5959
</EuiFlexGroup>
6060
)}
6161
{networkEvents && !networkEvents.loading && networkEvents.events.length > 0 && (
62-
<WaterfallChartWrapper data={extractItems(networkEvents.events)} />
62+
<WaterfallChartWrapper
63+
data={extractItems(networkEvents.events)}
64+
total={networkEvents.total}
65+
/>
6366
)}
6467
</>
6568
);

x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_wrapper.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,11 @@ export const renderLegendItem: RenderItem<LegendItem> = (item) => {
4848
};
4949

5050
interface Props {
51+
total: number;
5152
data: NetworkItems;
5253
}
5354

54-
export const WaterfallChartWrapper: React.FC<Props> = ({ data }) => {
55+
export const WaterfallChartWrapper: React.FC<Props> = ({ data, total }) => {
5556
const [networkData] = useState<NetworkItems>(data);
5657

5758
const { series, domain } = useMemo(() => {
@@ -66,6 +67,8 @@ export const WaterfallChartWrapper: React.FC<Props> = ({ data }) => {
6667

6768
return (
6869
<WaterfallProvider
70+
totalNetworkRequests={total}
71+
fetchedNetworkRequests={networkData.length}
6972
data={series}
7073
sidebarItems={sidebarItems}
7174
legendItems={legendItems}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import React from 'react';
8+
import { NetworkRequestsTotal } from './network_requests_total';
9+
import { render } from '../../../../../lib/helper/rtl_helpers';
10+
11+
describe('NetworkRequestsTotal', () => {
12+
it('message in case total is greater than fetched', () => {
13+
const { getByText, getByLabelText } = render(
14+
<NetworkRequestsTotal fetchedNetworkRequests={1000} totalNetworkRequests={1100} />
15+
);
16+
17+
expect(getByText('First 1000/1100 network requests')).toBeInTheDocument();
18+
expect(getByLabelText('Info')).toBeInTheDocument();
19+
});
20+
21+
it('message in case total is equal to fetched requests', () => {
22+
const { getByText } = render(
23+
<NetworkRequestsTotal fetchedNetworkRequests={500} totalNetworkRequests={500} />
24+
);
25+
26+
expect(getByText('500 network requests')).toBeInTheDocument();
27+
});
28+
});
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import React from 'react';
8+
import { i18n } from '@kbn/i18n';
9+
import { EuiIconTip } from '@elastic/eui';
10+
import { NetworkRequestsTotalStyle } from './styles';
11+
12+
interface Props {
13+
totalNetworkRequests: number;
14+
fetchedNetworkRequests: number;
15+
}
16+
17+
export const NetworkRequestsTotal = ({ totalNetworkRequests, fetchedNetworkRequests }: Props) => {
18+
return (
19+
<NetworkRequestsTotalStyle size="xs" color="subdued">
20+
<strong>
21+
{i18n.translate('xpack.uptime.synthetics.waterfall.requestsTotalMessage', {
22+
defaultMessage: '{numNetworkRequests} network requests',
23+
values: {
24+
numNetworkRequests:
25+
totalNetworkRequests > fetchedNetworkRequests
26+
? i18n.translate('xpack.uptime.synthetics.waterfall.requestsTotalMessage.first', {
27+
defaultMessage: 'First {count}',
28+
values: { count: `${fetchedNetworkRequests}/${totalNetworkRequests}` },
29+
})
30+
: totalNetworkRequests,
31+
},
32+
})}
33+
</strong>
34+
{totalNetworkRequests > fetchedNetworkRequests && (
35+
<EuiIconTip
36+
type={'iInCircle'}
37+
content={i18n.translate('xpack.uptime.synthetics.waterfall.requestsTotalMessage.info', {
38+
defaultMessage: 'Waterfall view only shows up to 1000 requests',
39+
})}
40+
/>
41+
)}
42+
</NetworkRequestsTotalStyle>
43+
);
44+
};

x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/styles.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import { EuiPanel, EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
7+
import { EuiPanel, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui';
88
import { rgba } from 'polished';
99
import { euiStyled } from '../../../../../../../observability/public';
1010
import { FIXED_AXIS_HEIGHT } from './constants';
@@ -103,3 +103,8 @@ export const WaterfallChartTooltip = euiStyled.div`
103103
color: ${(props) => props.theme.eui.euiColorLightestShade};
104104
padding: ${(props) => props.theme.eui.paddingSizes.s};
105105
`;
106+
107+
export const NetworkRequestsTotalStyle = euiStyled(EuiText)`
108+
line-height: ${FIXED_AXIS_HEIGHT}px;
109+
margin-left: ${(props) => props.theme.eui.paddingSizes.m}
110+
`;

x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_chart.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { BAR_HEIGHT, CANVAS_MAX_ITEMS, MAIN_GROW_SIZE, SIDEBAR_GROW_SIZE } from
3737
import { Sidebar } from './sidebar';
3838
import { Legend } from './legend';
3939
import { useBarCharts } from './use_bar_charts';
40+
import { NetworkRequestsTotal } from './network_requests_total';
4041

4142
const Tooltip = (tooltipInfo: TooltipInfo) => {
4243
const { data, renderTooltipItem } = useWaterfallContext();
@@ -84,7 +85,13 @@ export const WaterfallChart = ({
8485
maxHeight = '800px',
8586
fullHeight = false,
8687
}: WaterfallChartProps) => {
87-
const { data, sidebarItems, legendItems } = useWaterfallContext();
88+
const {
89+
data,
90+
sidebarItems,
91+
legendItems,
92+
totalNetworkRequests,
93+
fetchedNetworkRequests,
94+
} = useWaterfallContext();
8895

8996
const [darkMode] = useUiSetting$<boolean>('theme:darkMode');
9097

@@ -115,7 +122,12 @@ export const WaterfallChart = ({
115122
<EuiFlexGroup gutterSize="none" responsive={false}>
116123
{shouldRenderSidebar && (
117124
<EuiFlexItem grow={SIDEBAR_GROW_SIZE}>
118-
<WaterfallChartFixedTopContainerSidebarCover paddingSize="none" hasShadow={false} />
125+
<WaterfallChartFixedTopContainerSidebarCover paddingSize="none" hasShadow={false}>
126+
<NetworkRequestsTotal
127+
totalNetworkRequests={totalNetworkRequests}
128+
fetchedNetworkRequests={fetchedNetworkRequests}
129+
/>
130+
</WaterfallChartFixedTopContainerSidebarCover>
119131
</EuiFlexItem>
120132
)}
121133
<EuiFlexItem grow={shouldRenderSidebar ? MAIN_GROW_SIZE : true}>

x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/context/waterfall_chart.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import React, { createContext, useContext, Context } from 'react';
88
import { WaterfallData, WaterfallDataEntry } from '../types';
99

1010
export interface IWaterfallContext {
11+
totalNetworkRequests: number;
12+
fetchedNetworkRequests: number;
1113
data: WaterfallData;
1214
sidebarItems?: unknown[];
1315
legendItems?: unknown[];
@@ -20,6 +22,8 @@ export interface IWaterfallContext {
2022
export const WaterfallContext = createContext<Partial<IWaterfallContext>>({});
2123

2224
interface ProviderProps {
25+
totalNetworkRequests: number;
26+
fetchedNetworkRequests: number;
2327
data: IWaterfallContext['data'];
2428
sidebarItems?: IWaterfallContext['sidebarItems'];
2529
legendItems?: IWaterfallContext['legendItems'];
@@ -32,9 +36,20 @@ export const WaterfallProvider: React.FC<ProviderProps> = ({
3236
sidebarItems,
3337
legendItems,
3438
renderTooltipItem,
39+
totalNetworkRequests,
40+
fetchedNetworkRequests,
3541
}) => {
3642
return (
37-
<WaterfallContext.Provider value={{ data, sidebarItems, legendItems, renderTooltipItem }}>
43+
<WaterfallContext.Provider
44+
value={{
45+
data,
46+
sidebarItems,
47+
legendItems,
48+
renderTooltipItem,
49+
totalNetworkRequests,
50+
fetchedNetworkRequests,
51+
}}
52+
>
3853
{children}
3954
</WaterfallContext.Provider>
4055
);

x-pack/plugins/uptime/public/state/reducers/network_events.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export interface NetworkEventsState {
1818
[checkGroup: string]: {
1919
[stepIndex: number]: {
2020
events: NetworkEvent[];
21+
total: number;
2122
loading: boolean;
2223
error?: Error;
2324
};
@@ -45,24 +46,27 @@ export const networkEventsReducer = handleActions<NetworkEventsState, Payload>(
4546
...state[checkGroup][stepIndex],
4647
loading: true,
4748
events: [],
49+
total: 0,
4850
}
4951
: {
5052
loading: true,
5153
events: [],
54+
total: 0,
5255
},
5356
}
5457
: {
5558
[stepIndex]: {
5659
loading: true,
5760
events: [],
61+
total: 0,
5862
},
5963
},
6064
}),
6165

6266
[String(getNetworkEventsSuccess)]: (
6367
state: NetworkEventsState,
6468
{
65-
payload: { events, checkGroup, stepIndex },
69+
payload: { events, total, checkGroup, stepIndex },
6670
}: Action<SyntheticsNetworkEventsApiResponse & FetchNetworkEventsParams>
6771
) => {
6872
return {
@@ -74,16 +78,19 @@ export const networkEventsReducer = handleActions<NetworkEventsState, Payload>(
7478
...state[checkGroup][stepIndex],
7579
loading: false,
7680
events,
81+
total,
7782
}
7883
: {
7984
loading: false,
8085
events,
86+
total,
8187
},
8288
}
8389
: {
8490
[stepIndex]: {
8591
loading: false,
8692
events,
93+
total,
8794
},
8895
},
8996
};
@@ -101,18 +108,21 @@ export const networkEventsReducer = handleActions<NetworkEventsState, Payload>(
101108
...state[checkGroup][stepIndex],
102109
loading: false,
103110
events: [],
111+
total: 0,
104112
error,
105113
}
106114
: {
107115
loading: false,
108116
events: [],
117+
total: 0,
109118
error,
110119
},
111120
}
112121
: {
113122
[stepIndex]: {
114123
loading: false,
115124
events: [],
125+
total: 0,
116126
error,
117127
},
118128
},

x-pack/plugins/uptime/server/lib/requests/get_network_events.test.ts

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ describe('getNetworkEvents', () => {
158158
esClient.search.mockResolvedValueOnce({
159159
body: {
160160
hits: {
161+
total: { value: 1 },
161162
hits: mockHits,
162163
},
163164
},
@@ -196,6 +197,7 @@ describe('getNetworkEvents', () => {
196197
},
197198
},
198199
"size": 1000,
200+
"track_total_hits": true,
199201
},
200202
"index": "heartbeat-7*",
201203
},
@@ -210,6 +212,7 @@ describe('getNetworkEvents', () => {
210212
esClient.search.mockResolvedValueOnce({
211213
body: {
212214
hits: {
215+
total: { value: 1 },
213216
hits: mockHits,
214217
},
215218
},
@@ -222,30 +225,33 @@ describe('getNetworkEvents', () => {
222225
});
223226

224227
expect(result).toMatchInlineSnapshot(`
225-
Array [
226-
Object {
227-
"loadEndTime": 3287298.251,
228-
"method": "GET",
229-
"mimeType": "image/gif",
230-
"requestSentTime": 3287154.973,
231-
"requestStartTime": 3287155.502,
232-
"status": 200,
233-
"timestamp": "2020-12-14T10:46:39.183Z",
234-
"timings": Object {
235-
"blocked": 0.21400000014182297,
236-
"connect": -1,
237-
"dns": -1,
238-
"proxy": -1,
239-
"queueing": 0.5289999999149586,
240-
"receive": 0.5340000002433953,
241-
"send": 0.18799999998009298,
242-
"ssl": -1,
243-
"total": 143.27800000000934,
244-
"wait": 141.81299999972907,
228+
Object {
229+
"events": Array [
230+
Object {
231+
"loadEndTime": 3287298.251,
232+
"method": "GET",
233+
"mimeType": "image/gif",
234+
"requestSentTime": 3287154.973,
235+
"requestStartTime": 3287155.502,
236+
"status": 200,
237+
"timestamp": "2020-12-14T10:46:39.183Z",
238+
"timings": Object {
239+
"blocked": 0.21400000014182297,
240+
"connect": -1,
241+
"dns": -1,
242+
"proxy": -1,
243+
"queueing": 0.5289999999149586,
244+
"receive": 0.5340000002433953,
245+
"send": 0.18799999998009298,
246+
"ssl": -1,
247+
"total": 143.27800000000934,
248+
"wait": 141.81299999972907,
249+
},
250+
"url": "www.test.com",
245251
},
246-
"url": "www.test.com",
247-
},
248-
]
252+
],
253+
"total": 1,
254+
}
249255
`);
250256
});
251257
});

0 commit comments

Comments
 (0)