diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/fetcher.test.ts.snap b/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/fetcher.test.ts.snap index 07f8bf59f53a0..3701094ba818b 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/fetcher.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/fetcher.test.ts.snap @@ -37,11 +37,16 @@ Array [ ], }, }, + "sum": Object { + "sum": Object { + "field": "transaction.duration.us", + }, + }, }, "terms": Object { "field": "transaction.name.keyword", "order": Object { - "avg": "desc", + "sum": "desc", }, "size": 100, }, diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/transform.test.ts.snap b/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/transform.test.ts.snap index a68d7dc80338a..2d8b16e95f769 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/transform.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/transform.test.ts.snap @@ -4,7 +4,7 @@ exports[`transactionGroupsTransformer should match snapshot 1`] = ` Array [ Object { "averageResponseTime": 255966.30555555556, - "impact": 4.369340653255684, + "impact": 4.3693406535517445, "name": "POST /api/orders", "p95": 320238.5, "sample": Object { @@ -255,7 +255,7 @@ baz", }, Object { "averageResponseTime": 33265.03326147213, - "impact": 10.256357027900046, + "impact": 10.256357027376065, "name": "GET /api/orders", "p95": 58827.489999999976, "sample": Object { @@ -376,7 +376,7 @@ baz", }, Object { "averageResponseTime": 32900.72714285714, - "impact": 2.179120743402716, + "impact": 2.1791207411745854, "name": "GET /log-message", "p95": 40444, "sample": Object { @@ -497,7 +497,7 @@ baz", }, Object { "averageResponseTime": 32554.36257814184, - "impact": 14.344171564855404, + "impact": 14.344171563678346, "name": "GET /api/stats", "p95": 59356.73611111111, "sample": Object { @@ -624,7 +624,7 @@ baz", }, Object { "averageResponseTime": 32387.73641304348, - "impact": 2.2558112391673664, + "impact": 2.2558112380477584, "name": "GET /log-error", "p95": 40061.1, "sample": Object { @@ -745,7 +745,7 @@ baz", }, Object { "averageResponseTime": 32159.926322043968, - "impact": 10.279049521913821, + "impact": 10.27904952170656, "name": "GET /api/customers", "p95": 59845.85714285714, "sample": Object { @@ -872,7 +872,7 @@ baz", }, Object { "averageResponseTime": 27516.89144558744, - "impact": 9.651458993728006, + "impact": 9.651458992731666, "name": "GET /api/products/top", "p95": 56064.679999999986, "sample": Object { @@ -1000,7 +1000,7 @@ baz", }, Object { "averageResponseTime": 21331.714285714286, - "impact": 0.28817488008070574, + "impact": 0.28817487960409877, "name": "POST /api", "p95": 30938, "sample": Object { @@ -1123,7 +1123,7 @@ baz", }, Object { "averageResponseTime": 17189.329210275926, - "impact": 3.424381788267164, + "impact": 3.424381787142002, "name": "GET /api/products/:id/customers", "p95": 39284.79999999999, "sample": Object { @@ -1250,7 +1250,7 @@ baz", }, Object { "averageResponseTime": 12763.68806073154, - "impact": 1.747992435179465, + "impact": 1.7479924334286208, "name": "GET /api/types/:id", "p95": 30576.749999999996, "sample": Object { @@ -1371,7 +1371,7 @@ baz", }, Object { "averageResponseTime": 12683.190864600327, - "impact": 4.4239778511514745, + "impact": 4.4239778504968, "name": "GET /api/products", "p95": 35009.67999999999, "sample": Object { @@ -1492,7 +1492,7 @@ baz", }, Object { "averageResponseTime": 11257.757916666667, - "impact": 2.558180605423081, + "impact": 2.558180605569336, "name": "GET /api/types", "p95": 35222.944444444445, "sample": Object { @@ -1613,7 +1613,7 @@ baz", }, Object { "averageResponseTime": 10584.05144193297, - "impact": 1.2808106158729446, + "impact": 1.280810614916383, "name": "GET /api/orders/:id", "p95": 26555.399999999998, "sample": Object { @@ -1732,7 +1732,7 @@ baz", }, Object { "averageResponseTime": 10548.218597063622, - "impact": 1.8338764008269306, + "impact": 1.8338763992340905, "name": "GET /api/products/:id", "p95": 28413.383333333328, "sample": Object { @@ -1853,7 +1853,7 @@ baz", }, Object { "averageResponseTime": 9868.217894736843, - "impact": 1.7722323979309487, + "impact": 1.7722323960215767, "name": "GET /api/customers/:id", "p95": 27486.5, "sample": Object { @@ -2111,7 +2111,7 @@ baz", }, Object { "averageResponseTime": 4694.005586592179, - "impact": 0.1498514997591876, + "impact": 0.1498515000753004, "name": "GET /is-it-coffee-time", "p95": 11022.99999999992, "sample": Object { @@ -2233,7 +2233,7 @@ baz", }, Object { "averageResponseTime": 4549.889880952381, - "impact": 0.1354336505457395, + "impact": 0.13543365054509587, "name": "GET /throw-error", "p95": 7719.700000000001, "sample": Object { @@ -2355,7 +2355,7 @@ baz", }, Object { "averageResponseTime": 3504.5108924806746, - "impact": 2.36009934580083, + "impact": 2.3600993453143766, "name": "GET *", "p95": 11431.738095238095, "sample": Object { @@ -2482,7 +2482,7 @@ baz", }, Object { "averageResponseTime": 2742.4615384615386, - "impact": 0.08501029113483448, + "impact": 0.08501028923348058, "name": "OPTIONS unknown route", "p95": 4370.000000000002, "sample": Object { @@ -2605,7 +2605,7 @@ baz", }, Object { "averageResponseTime": 2651.8784461553205, - "impact": 15.770246498769827, + "impact": 15.770246496477105, "name": "GET static file", "p95": 6140.579335038363, "sample": Object { @@ -2713,7 +2713,7 @@ baz", }, Object { "averageResponseTime": 1422.926672899693, - "impact": 1.002712481568783, + "impact": 1.0027124806135428, "name": "GET unknown route", "p95": 2311.885238095238, "sample": Object { diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts b/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts index 2a534aa3315f1..ad0aa00d35bc9 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts @@ -16,14 +16,9 @@ import { Setup } from '../helpers/setup_request'; interface Bucket { key: string; doc_count: number; - avg: { - value: number; - }; - p95: { - values: { - '95.0': number; - }; - }; + avg: { value: number }; + p95: { values: { '95.0': number } }; + sum: { value: number }; sample: { hits: { total: number; @@ -57,7 +52,7 @@ export function transactionGroupsFetcher( transactions: { terms: { field: `${TRANSACTION_NAME}.keyword`, - order: { avg: 'desc' }, + order: { sum: 'desc' }, size: 100 }, aggs: { @@ -73,7 +68,8 @@ export function transactionGroupsFetcher( avg: { avg: { field: TRANSACTION_DURATION } }, p95: { percentiles: { field: TRANSACTION_DURATION, percents: [95] } - } + }, + sum: { sum: { field: TRANSACTION_DURATION } } } } } diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/mock-responses/transactionGroupsResponse.ts b/x-pack/plugins/apm/server/lib/transaction_groups/mock-responses/transactionGroupsResponse.ts index 08492ee7a7839..2632cc6e94b93 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/mock-responses/transactionGroupsResponse.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/mock-responses/transactionGroupsResponse.ts @@ -21,6 +21,7 @@ export const transactionGroupsResponse = ({ doc_count: 180, avg: { value: 255966.30555555556 }, p95: { values: { '95.0': 320238.5 } }, + sum: { value: 46073935 }, sample: { hits: { total: 180, @@ -140,6 +141,7 @@ export const transactionGroupsResponse = ({ doc_count: 21911, avg: { value: 48021.972616494 }, p95: { values: { '95.0': 67138.18364917398 } }, + sum: { value: 1052209442 }, sample: { hits: { total: 21911, @@ -259,6 +261,7 @@ export const transactionGroupsResponse = ({ doc_count: 3247, avg: { value: 33265.03326147213 }, p95: { values: { '95.0': 58827.489999999976 } }, + sum: { value: 108011563 }, sample: { hits: { total: 3247, @@ -374,6 +377,7 @@ export const transactionGroupsResponse = ({ doc_count: 700, avg: { value: 32900.72714285714 }, p95: { values: { '95.0': 40444 } }, + sum: { value: 23030509 }, sample: { hits: { total: 700, @@ -489,6 +493,7 @@ export const transactionGroupsResponse = ({ doc_count: 4639, avg: { value: 32554.36257814184 }, p95: { values: { '95.0': 59356.73611111111 } }, + sum: { value: 151019688 }, sample: { hits: { total: 4639, @@ -609,6 +614,7 @@ export const transactionGroupsResponse = ({ doc_count: 736, avg: { value: 32387.73641304348 }, p95: { values: { '95.0': 40061.1 } }, + sum: { value: 23837374 }, sample: { hits: { total: 736, @@ -724,6 +730,7 @@ export const transactionGroupsResponse = ({ doc_count: 3366, avg: { value: 32159.926322043968 }, p95: { values: { '95.0': 59845.85714285714 } }, + sum: { value: 108250312 }, sample: { hits: { total: 3366, @@ -844,6 +851,7 @@ export const transactionGroupsResponse = ({ doc_count: 3694, avg: { value: 27516.89144558744 }, p95: { values: { '95.0': 56064.679999999986 } }, + sum: { value: 101647397 }, sample: { hits: { total: 3694, @@ -965,6 +973,7 @@ export const transactionGroupsResponse = ({ doc_count: 147, avg: { value: 21331.714285714286 }, p95: { values: { '95.0': 30938 } }, + sum: { value: 3135762 }, sample: { hits: { total: 147, @@ -1082,6 +1091,7 @@ export const transactionGroupsResponse = ({ doc_count: 2102, avg: { value: 17189.329210275926 }, p95: { values: { '95.0': 39284.79999999999 } }, + sum: { value: 36131970 }, sample: { hits: { total: 2102, @@ -1203,6 +1213,7 @@ export const transactionGroupsResponse = ({ doc_count: 1449, avg: { value: 12763.68806073154 }, p95: { values: { '95.0': 30576.749999999996 } }, + sum: { value: 18494584 }, sample: { hits: { total: 1449, @@ -1318,6 +1329,7 @@ export const transactionGroupsResponse = ({ doc_count: 3678, avg: { value: 12683.190864600327 }, p95: { values: { '95.0': 35009.67999999999 } }, + sum: { value: 46648776 }, sample: { hits: { total: 3678, @@ -1433,6 +1445,7 @@ export const transactionGroupsResponse = ({ doc_count: 2400, avg: { value: 11257.757916666667 }, p95: { values: { '95.0': 35222.944444444445 } }, + sum: { value: 27018619 }, sample: { hits: { total: 2400, @@ -1548,6 +1561,7 @@ export const transactionGroupsResponse = ({ doc_count: 1283, avg: { value: 10584.05144193297 }, p95: { values: { '95.0': 26555.399999999998 } }, + sum: { value: 13579338 }, sample: { hits: { total: 1283, @@ -1661,6 +1675,7 @@ export const transactionGroupsResponse = ({ doc_count: 1839, avg: { value: 10548.218597063622 }, p95: { values: { '95.0': 28413.383333333328 } }, + sum: { value: 19398174 }, sample: { hits: { total: 1839, @@ -1776,6 +1791,7 @@ export const transactionGroupsResponse = ({ doc_count: 1900, avg: { value: 9868.217894736843 }, p95: { values: { '95.0': 27486.5 } }, + sum: { value: 18749614 }, sample: { hits: { total: 1900, @@ -1896,6 +1912,7 @@ export const transactionGroupsResponse = ({ doc_count: 20, avg: { value: 5192.9 }, p95: { values: { '95.0': 13230.5 } }, + sum: { value: 103858 }, sample: { hits: { total: 20, @@ -2021,6 +2038,7 @@ export const transactionGroupsResponse = ({ doc_count: 358, avg: { value: 4694.005586592179 }, p95: { values: { '95.0': 11022.99999999992 } }, + sum: { value: 1680454 }, sample: { hits: { total: 358, @@ -2137,6 +2155,7 @@ export const transactionGroupsResponse = ({ doc_count: 336, avg: { value: 4549.889880952381 }, p95: { values: { '95.0': 7719.700000000001 } }, + sum: { value: 1528763 }, sample: { hits: { total: 336, @@ -2253,6 +2272,7 @@ export const transactionGroupsResponse = ({ doc_count: 7115, avg: { value: 3504.5108924806746 }, p95: { values: { '95.0': 11431.738095238095 } }, + sum: { value: 24934595 }, sample: { hits: { total: 7115, @@ -2375,6 +2395,7 @@ export const transactionGroupsResponse = ({ doc_count: 364, avg: { value: 2742.4615384615386 }, p95: { values: { '95.0': 4370.000000000002 } }, + sum: { value: 998256 }, sample: { hits: { total: 364, @@ -2492,6 +2513,7 @@ export const transactionGroupsResponse = ({ doc_count: 62606, avg: { value: 2651.8784461553205 }, p95: { values: { '95.0': 6140.579335038363 } }, + sum: { value: 166023502 }, sample: { hits: { total: 62606, @@ -2596,6 +2618,7 @@ export const transactionGroupsResponse = ({ doc_count: 7487, avg: { value: 1422.926672899693 }, p95: { values: { '95.0': 2311.885238095238 } }, + sum: { value: 10653452 }, sample: { hits: { total: 7487, diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/transform.test.ts b/x-pack/plugins/apm/server/lib/transaction_groups/transform.test.ts index 73053aa04643d..6acd34af24353 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/transform.test.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/transform.test.ts @@ -19,12 +19,13 @@ describe('transactionGroupsTransformer', () => { ).toMatchSnapshot(); }); - fit('should transform response correctly', () => { + it('should transform response correctly', () => { const bucket = { key: 'POST /api/orders', doc_count: 180, avg: { value: 255966.30555555556 }, p95: { values: { '95.0': 320238.5 } }, + sum: { value: 3000000000 }, sample: { hits: { total: 180, @@ -54,4 +55,27 @@ describe('transactionGroupsTransformer', () => { } ]); }); + + it('should calculate impact from sum', () => { + const getBucket = (sum: number) => ({ + key: 'POST /api/orders', + doc_count: 180, + avg: { value: 300000 }, + p95: { values: { '95.0': 320000 } }, + sum: { value: sum }, + sample: { hits: { total: 180, hits: [{ _source: 'sample source' }] } } + }); + + const response = ({ + aggregations: { + transactions: { buckets: [getBucket(10), getBucket(20), getBucket(50)] } + } + } as unknown) as ESResponse; + + expect( + transactionGroupsTransformer({ response, start: 100, end: 20000 }).map( + bucket => bucket.impact + ) + ).toEqual([0, 25, 100]); + }); }); diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/transform.ts b/x-pack/plugins/apm/server/lib/transaction_groups/transform.ts index 229134025b18f..53f8ca04d4ee6 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/transform.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/transform.ts @@ -44,7 +44,7 @@ export function transactionGroupsTransformer({ const results = buckets.map(bucket => { const averageResponseTime = bucket.avg.value; const transactionsPerMinute = bucket.doc_count / minutes; - const impact = Math.round(averageResponseTime * transactionsPerMinute); + const impact = bucket.sum.value; const sample = bucket.sample.hits.hits[0]._source; return {