Skip to content

Commit a2b71f8

Browse files
authored
[APM] Service overview: Add throughput chart (#84439)
1 parent 923a525 commit a2b71f8

File tree

26 files changed

+750
-161
lines changed

26 files changed

+750
-161
lines changed

x-pack/plugins/apm/common/agent_name.test.ts

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,9 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import {
8-
getFirstTransactionType,
9-
isJavaAgentName,
10-
isRumAgentName,
11-
} from './agent_name';
7+
import { isJavaAgentName, isRumAgentName } from './agent_name';
128

139
describe('agent name helpers', () => {
14-
describe('getFirstTransactionType', () => {
15-
describe('with no transaction types', () => {
16-
expect(getFirstTransactionType([])).toBeUndefined();
17-
});
18-
19-
describe('with a non-rum agent', () => {
20-
it('returns "request"', () => {
21-
expect(getFirstTransactionType(['worker', 'request'], 'java')).toEqual(
22-
'request'
23-
);
24-
});
25-
26-
describe('with no request types', () => {
27-
it('returns the first type', () => {
28-
expect(
29-
getFirstTransactionType(['worker', 'shirker'], 'java')
30-
).toEqual('worker');
31-
});
32-
});
33-
});
34-
35-
describe('with a rum agent', () => {
36-
it('returns "page-load"', () => {
37-
expect(
38-
getFirstTransactionType(['http-request', 'page-load'], 'js-base')
39-
).toEqual('page-load');
40-
});
41-
});
42-
});
43-
4410
describe('isJavaAgentName', () => {
4511
describe('when the agent name is java', () => {
4612
it('returns true', () => {

x-pack/plugins/apm/common/agent_name.ts

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@
55
*/
66

77
import { AgentName } from '../typings/es_schemas/ui/fields/agent';
8-
import {
9-
TRANSACTION_PAGE_LOAD,
10-
TRANSACTION_REQUEST,
11-
} from './transaction_types';
128

139
/*
1410
* Agent names can be any string. This list only defines the official agents
@@ -50,26 +46,6 @@ export const RUM_AGENT_NAMES: AgentName[] = [
5046
'opentelemetry/webjs',
5147
];
5248

53-
function getDefaultTransactionTypeForAgentName(agentName?: string) {
54-
return isRumAgentName(agentName)
55-
? TRANSACTION_PAGE_LOAD
56-
: TRANSACTION_REQUEST;
57-
}
58-
59-
export function getFirstTransactionType(
60-
transactionTypes: string[],
61-
agentName?: string
62-
) {
63-
const defaultTransactionType = getDefaultTransactionTypeForAgentName(
64-
agentName
65-
);
66-
67-
return (
68-
transactionTypes.find((type) => type === defaultTransactionType) ??
69-
transactionTypes[0]
70-
);
71-
}
72-
7349
export function isJavaAgentName(
7450
agentName: string | undefined
7551
): agentName is 'java' {

x-pack/plugins/apm/public/components/alerting/TransactionDurationAlertTrigger/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import React from 'react';
1111
import { ForLastExpression } from '../../../../../triggers_actions_ui/public';
1212
import { ALERT_TYPES_CONFIG } from '../../../../common/alert_types';
1313
import { useEnvironments } from '../../../hooks/useEnvironments';
14-
import { useServiceTransactionTypes } from '../../../hooks/useServiceTransactionTypes';
1514
import { useUrlParams } from '../../../hooks/useUrlParams';
1615
import { ServiceAlertTrigger } from '../ServiceAlertTrigger';
1716
import { PopoverExpression } from '../ServiceAlertTrigger/PopoverExpression';
@@ -22,6 +21,7 @@ import {
2221
TransactionTypeField,
2322
IsAboveField,
2423
} from '../fields';
24+
import { useApmService } from '../../../hooks/use_apm_service';
2525

2626
interface AlertParams {
2727
windowSize: number;
@@ -63,7 +63,7 @@ interface Props {
6363
export function TransactionDurationAlertTrigger(props: Props) {
6464
const { setAlertParams, alertParams, setAlertProperty } = props;
6565
const { urlParams } = useUrlParams();
66-
const transactionTypes = useServiceTransactionTypes(urlParams);
66+
const { transactionTypes } = useApmService();
6767
const { serviceName } = useParams<{ serviceName?: string }>();
6868
const { start, end, transactionType } = urlParams;
6969
const { environmentOptions } = useEnvironments({ serviceName, start, end });

x-pack/plugins/apm/public/components/alerting/TransactionDurationAnomalyAlertTrigger/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import React from 'react';
1010
import { ANOMALY_SEVERITY } from '../../../../../ml/common';
1111
import { ALERT_TYPES_CONFIG } from '../../../../common/alert_types';
1212
import { useEnvironments } from '../../../hooks/useEnvironments';
13-
import { useServiceTransactionTypes } from '../../../hooks/useServiceTransactionTypes';
1413
import { useUrlParams } from '../../../hooks/useUrlParams';
1514
import { ServiceAlertTrigger } from '../ServiceAlertTrigger';
1615
import { PopoverExpression } from '../ServiceAlertTrigger/PopoverExpression';
@@ -24,6 +23,7 @@ import {
2423
ServiceField,
2524
TransactionTypeField,
2625
} from '../fields';
26+
import { useApmService } from '../../../hooks/use_apm_service';
2727

2828
interface Params {
2929
windowSize: number;
@@ -47,7 +47,7 @@ interface Props {
4747
export function TransactionDurationAnomalyAlertTrigger(props: Props) {
4848
const { setAlertParams, alertParams, setAlertProperty } = props;
4949
const { urlParams } = useUrlParams();
50-
const transactionTypes = useServiceTransactionTypes(urlParams);
50+
const { transactionTypes } = useApmService();
5151
const { serviceName } = useParams<{ serviceName?: string }>();
5252
const { start, end, transactionType } = urlParams;
5353
const { environmentOptions } = useEnvironments({ serviceName, start, end });

x-pack/plugins/apm/public/components/alerting/TransactionErrorRateAlertTrigger/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import React from 'react';
88
import { ForLastExpression } from '../../../../../triggers_actions_ui/public';
99
import { ALERT_TYPES_CONFIG, AlertType } from '../../../../common/alert_types';
1010
import { useEnvironments } from '../../../hooks/useEnvironments';
11-
import { useServiceTransactionTypes } from '../../../hooks/useServiceTransactionTypes';
1211
import { useUrlParams } from '../../../hooks/useUrlParams';
1312
import { ServiceAlertTrigger } from '../ServiceAlertTrigger';
1413

@@ -19,6 +18,7 @@ import {
1918
EnvironmentField,
2019
IsAboveField,
2120
} from '../fields';
21+
import { useApmService } from '../../../hooks/use_apm_service';
2222

2323
interface AlertParams {
2424
windowSize: number;
@@ -38,7 +38,7 @@ interface Props {
3838
export function TransactionErrorRateAlertTrigger(props: Props) {
3939
const { setAlertParams, alertParams, setAlertProperty } = props;
4040
const { urlParams } = useUrlParams();
41-
const transactionTypes = useServiceTransactionTypes(urlParams);
41+
const { transactionTypes } = useApmService();
4242
const { serviceName } = useParams<{ serviceName?: string }>();
4343
const { start, end, transactionType } = urlParams;
4444
const { environmentOptions } = useEnvironments({ serviceName, start, end });

x-pack/plugins/apm/public/components/app/Main/route_config/index.tsx

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import { i18n } from '@kbn/i18n';
88
import React from 'react';
99
import { Redirect, RouteComponentProps } from 'react-router-dom';
10+
import { ApmServiceContextProvider } from '../../../../context/apm_service_context';
1011
import { UNIDENTIFIED_SERVICE_NODES_LABEL } from '../../../../../common/i18n';
1112
import { SERVICE_NODE_NAME_MISSING } from '../../../../../common/service_nodes';
1213
import { APMRouteDefinition } from '../../../../application/routes';
@@ -227,19 +228,19 @@ export const routes: APMRouteDefinition[] = [
227228
breadcrumb: i18n.translate('xpack.apm.breadcrumb.overviewTitle', {
228229
defaultMessage: 'Overview',
229230
}),
230-
component: ServiceDetailsOverview,
231+
component: withApmServiceContext(ServiceDetailsOverview),
231232
} as APMRouteDefinition<{ serviceName: string }>,
232233
// errors
233234
{
234235
exact: true,
235236
path: '/services/:serviceName/errors/:groupId',
236-
component: ErrorGroupDetails,
237+
component: withApmServiceContext(ErrorGroupDetails),
237238
breadcrumb: ({ match }) => match.params.groupId,
238239
} as APMRouteDefinition<{ groupId: string; serviceName: string }>,
239240
{
240241
exact: true,
241242
path: '/services/:serviceName/errors',
242-
component: ServiceDetailsErrors,
243+
component: withApmServiceContext(ServiceDetailsErrors),
243244
breadcrumb: i18n.translate('xpack.apm.breadcrumb.errorsTitle', {
244245
defaultMessage: 'Errors',
245246
}),
@@ -248,7 +249,7 @@ export const routes: APMRouteDefinition[] = [
248249
{
249250
exact: true,
250251
path: '/services/:serviceName/transactions',
251-
component: ServiceDetailsTransactions,
252+
component: withApmServiceContext(ServiceDetailsTransactions),
252253
breadcrumb: i18n.translate('xpack.apm.breadcrumb.transactionsTitle', {
253254
defaultMessage: 'Transactions',
254255
}),
@@ -257,7 +258,7 @@ export const routes: APMRouteDefinition[] = [
257258
{
258259
exact: true,
259260
path: '/services/:serviceName/metrics',
260-
component: ServiceDetailsMetrics,
261+
component: withApmServiceContext(ServiceDetailsMetrics),
261262
breadcrumb: i18n.translate('xpack.apm.breadcrumb.metricsTitle', {
262263
defaultMessage: 'Metrics',
263264
}),
@@ -266,7 +267,7 @@ export const routes: APMRouteDefinition[] = [
266267
{
267268
exact: true,
268269
path: '/services/:serviceName/nodes',
269-
component: ServiceDetailsNodes,
270+
component: withApmServiceContext(ServiceDetailsNodes),
270271
breadcrumb: i18n.translate('xpack.apm.breadcrumb.nodesTitle', {
271272
defaultMessage: 'JVMs',
272273
}),
@@ -275,7 +276,7 @@ export const routes: APMRouteDefinition[] = [
275276
{
276277
exact: true,
277278
path: '/services/:serviceName/nodes/:serviceNodeName/metrics',
278-
component: ServiceNodeMetrics,
279+
component: withApmServiceContext(ServiceNodeMetrics),
279280
breadcrumb: ({ match }) => {
280281
const { serviceNodeName } = match.params;
281282

@@ -289,12 +290,20 @@ export const routes: APMRouteDefinition[] = [
289290
{
290291
exact: true,
291292
path: '/services/:serviceName/transactions/view',
292-
component: TransactionDetails,
293+
component: withApmServiceContext(TransactionDetails),
293294
breadcrumb: ({ location }) => {
294295
const query = toQuery(location.search);
295296
return query.transactionName as string;
296297
},
297298
},
299+
{
300+
exact: true,
301+
path: '/services/:serviceName/service-map',
302+
component: withApmServiceContext(ServiceDetailsServiceMap),
303+
breadcrumb: i18n.translate('xpack.apm.breadcrumb.serviceMapTitle', {
304+
defaultMessage: 'Service Map',
305+
}),
306+
},
298307
{
299308
exact: true,
300309
path: '/link-to/trace/:traceId',
@@ -309,14 +318,6 @@ export const routes: APMRouteDefinition[] = [
309318
defaultMessage: 'Service Map',
310319
}),
311320
},
312-
{
313-
exact: true,
314-
path: '/services/:serviceName/service-map',
315-
component: ServiceDetailsServiceMap,
316-
breadcrumb: i18n.translate('xpack.apm.breadcrumb.serviceMapTitle', {
317-
defaultMessage: 'Service Map',
318-
}),
319-
},
320321
{
321322
exact: true,
322323
path: '/settings/customize-ui',
@@ -337,3 +338,13 @@ export const routes: APMRouteDefinition[] = [
337338
),
338339
},
339340
];
341+
342+
function withApmServiceContext(WrappedComponent: React.ComponentType<any>) {
343+
return (props: any) => {
344+
return (
345+
<ApmServiceContextProvider>
346+
<WrappedComponent {...props} />
347+
</ApmServiceContextProvider>
348+
);
349+
};
350+
}

x-pack/plugins/apm/public/components/app/service_details/service_detail_tabs.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { i18n } from '@kbn/i18n';
99
import React, { ReactNode } from 'react';
1010
import { isJavaAgentName, isRumAgentName } from '../../../../common/agent_name';
1111
import { enableServiceOverview } from '../../../../common/ui_settings_keys';
12-
import { useAgentName } from '../../../hooks/useAgentName';
1312
import { useApmPluginContext } from '../../../hooks/useApmPluginContext';
1413
import { useErrorOverviewHref } from '../../shared/Links/apm/ErrorOverviewLink';
1514
import { useMetricOverviewHref } from '../../shared/Links/apm/MetricOverviewLink';
@@ -24,6 +23,7 @@ import { ServiceMetrics } from '../service_metrics';
2423
import { ServiceNodeOverview } from '../ServiceNodeOverview';
2524
import { ServiceOverview } from '../service_overview';
2625
import { TransactionOverview } from '../transaction_overview';
26+
import { useApmService } from '../../../hooks/use_apm_service';
2727

2828
interface Tab {
2929
key: string;
@@ -44,7 +44,7 @@ interface Props {
4444
}
4545

4646
export function ServiceDetailTabs({ serviceName, tab }: Props) {
47-
const { agentName } = useAgentName();
47+
const { agentName } = useApmService();
4848
const { uiSettings } = useApmPluginContext().core;
4949

5050
const overviewTab = {

x-pack/plugins/apm/public/components/app/service_node_metrics/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ import { RouteComponentProps } from 'react-router-dom';
2323
import styled from 'styled-components';
2424
import { SERVICE_NODE_NAME_MISSING } from '../../../../common/service_nodes';
2525
import { ChartPointerEventContextProvider } from '../../../context/chart_pointer_event_context';
26-
import { useAgentName } from '../../../hooks/useAgentName';
2726
import { FETCH_STATUS, useFetcher } from '../../../hooks/useFetcher';
2827
import { useServiceMetricCharts } from '../../../hooks/useServiceMetricCharts';
2928
import { useUrlParams } from '../../../hooks/useUrlParams';
29+
import { useApmService } from '../../../hooks/use_apm_service';
3030
import { px, truncate, unit } from '../../../style/variables';
3131
import { ApmHeader } from '../../shared/ApmHeader';
3232
import { MetricsChart } from '../../shared/charts/metrics_chart';
@@ -58,7 +58,7 @@ type ServiceNodeMetricsProps = RouteComponentProps<{
5858
export function ServiceNodeMetrics({ match }: ServiceNodeMetricsProps) {
5959
const { urlParams, uiFilters } = useUrlParams();
6060
const { serviceName, serviceNodeName } = match.params;
61-
const { agentName } = useAgentName();
61+
const { agentName } = useApmService();
6262
const { data } = useServiceMetricCharts(
6363
urlParams,
6464
agentName,

x-pack/plugins/apm/public/components/app/service_overview/index.tsx

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { TransactionErrorRateChart } from '../../shared/charts/transaction_error
2121
import { ServiceMapLink } from '../../shared/Links/apm/ServiceMapLink';
2222
import { SearchBar } from '../../shared/search_bar';
2323
import { ServiceOverviewErrorsTable } from './service_overview_errors_table';
24+
import { ServiceOverviewThroughputChart } from './service_overview_throughput_chart';
2425
import { ServiceOverviewTransactionsTable } from './service_overview_transactions_table';
2526
import { TableLinkFlexItem } from './table_link_flex_item';
2627

@@ -64,18 +65,7 @@ export function ServiceOverview({
6465
<EuiFlexItem>
6566
<EuiFlexGroup gutterSize="s">
6667
<EuiFlexItem grow={4}>
67-
<EuiPanel>
68-
<EuiTitle size="xs">
69-
<h2>
70-
{i18n.translate(
71-
'xpack.apm.serviceOverview.trafficChartTitle',
72-
{
73-
defaultMessage: 'Traffic',
74-
}
75-
)}
76-
</h2>
77-
</EuiTitle>
78-
</EuiPanel>
68+
<ServiceOverviewThroughputChart height={chartHeight} />
7969
</EuiFlexItem>
8070
<EuiFlexItem grow={6}>
8171
<EuiPanel>

x-pack/plugins/apm/public/components/app/service_overview/service_overview.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ describe('ServiceOverview', () => {
7272
sort: { direction: 'desc', field: 'test field' },
7373
},
7474
totalItemCount: 0,
75+
throughput: [],
7576
},
7677
refetch: () => {},
7778
status: FETCH_STATUS.SUCCESS,

0 commit comments

Comments
 (0)