From 42aca4e8db4508969520e6984e2922b0dcbf4793 Mon Sep 17 00:00:00 2001 From: Miriam <31922082+MiriamAparicio@users.noreply.github.com> Date: Fri, 28 Apr 2023 10:35:45 +0100 Subject: [PATCH] [APM] Fix query to mobile transactions main statistics (#155895) When splitting the query to mobile transactions main statistics, the sessions were left in the errors query and should have been retrieved in the transactions events. This PR fix this issue (cherry picked from commit 67b211001fe50d3d2f2430689402f1bab8224294) --- .../stats_list/get_columns.tsx | 2 - .../get_mobile_main_statistics_by_field.ts | 108 ++++++++++-------- 2 files changed, 63 insertions(+), 47 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/mobile/transaction_overview/transaction_overview_tabs/stats_list/get_columns.tsx b/x-pack/plugins/apm/public/components/app/mobile/transaction_overview/transaction_overview_tabs/stats_list/get_columns.tsx index 18ac252011357..9bea439931bed 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/transaction_overview/transaction_overview_tabs/stats_list/get_columns.tsx +++ b/x-pack/plugins/apm/public/components/app/mobile/transaction_overview/transaction_overview_tabs/stats_list/get_columns.tsx @@ -33,13 +33,11 @@ type MobileDetailedStatisticsByField = APIReturnType<'GET /internal/apm/mobile-services/{serviceName}/detailed_statistics'>; export function getColumns({ - agentName, detailedStatisticsLoading, detailedStatistics, comparisonEnabled, offset, }: { - agentName?: string; detailedStatisticsLoading: boolean; detailedStatistics: MobileDetailedStatisticsByField; comparisonEnabled?: boolean; diff --git a/x-pack/plugins/apm/server/routes/mobile/get_mobile_main_statistics_by_field.ts b/x-pack/plugins/apm/server/routes/mobile/get_mobile_main_statistics_by_field.ts index a5783997e391b..af345d52322bf 100644 --- a/x-pack/plugins/apm/server/routes/mobile/get_mobile_main_statistics_by_field.ts +++ b/x-pack/plugins/apm/server/routes/mobile/get_mobile_main_statistics_by_field.ts @@ -40,10 +40,18 @@ export interface MobileMainStatisticsResponse { name: string | number; latency: number | null; throughput: number; - crashRate?: number; + crashRate: number; }>; } +type MergedQueriesResponse = Array<{ + name: string | number; + latency: number | null; + throughput: number; + sessions: number; + crashes?: number; +}>; + export async function getMobileMainStatisticsByField({ kuery, apmEventClient, @@ -55,7 +63,7 @@ export async function getMobileMainStatisticsByField({ }: Props) { async function getMobileTransactionEventStatistics() { const response = await apmEventClient.search( - `get_mobile_main_statistics_by_field`, + `get_mobile_transaction_events_main_statistics_by_field`, { apm: { sources: [ @@ -90,6 +98,11 @@ export async function getMobileMainStatisticsByField({ field: TRANSACTION_DURATION, }, }, + sessions: { + cardinality: { + field: SESSION_ID, + }, + }, }, }, }, @@ -110,66 +123,59 @@ export async function getMobileMainStatisticsByField({ end, value: bucket.doc_count, }), + sessions: bucket.sessions.value, }; }) ?? [] ); } async function getMobileErrorEventStatistics() { - const response = await apmEventClient.search( - `get_mobile_transaction_events_main_statistics_by_field`, - { - apm: { - sources: [ - { - documentType: ApmDocumentType.ErrorEvent, - rollupInterval: RollupInterval.None, - }, - ], + const response = await apmEventClient.search(`get_mobile_crashes`, { + apm: { + sources: [ + { + documentType: ApmDocumentType.ErrorEvent, + rollupInterval: RollupInterval.None, + }, + ], + }, + body: { + track_total_hits: false, + size: 0, + query: { + bool: { + filter: [ + ...termQuery(SERVICE_NAME, serviceName), + ...rangeQuery(start, end), + ...environmentQuery(environment), + ...kqlQuery(kuery), + ], + }, }, - body: { - track_total_hits: false, - size: 0, - query: { - bool: { - filter: [ - ...termQuery(SERVICE_NAME, serviceName), - ...rangeQuery(start, end), - ...environmentQuery(environment), - ...kqlQuery(kuery), - ], + aggs: { + main_statistics: { + terms: { + field, + size: 1000, }, - }, - aggs: { - main_statistics: { - terms: { - field, - size: 1000, - }, - aggs: { - sessions: { - cardinality: { - field: SESSION_ID, - }, - }, - crashes: { - filter: { - term: { - [ERROR_TYPE]: 'crash', - }, + aggs: { + crashes: { + filter: { + term: { + [ERROR_TYPE]: 'crash', }, }, }, }, }, }, - } - ); + }, + }); return ( response.aggregations?.main_statistics.buckets.map((bucket) => { return { name: bucket.key, - crashRate: bucket.crashes.doc_count / bucket.sessions.value ?? 0, + crashes: bucket.crashes.doc_count ?? 0, }; }) ?? [] ); @@ -180,7 +186,19 @@ export async function getMobileMainStatisticsByField({ getMobileErrorEventStatistics(), ]); - const mainStatistics = merge(transactioEventStatistics, errorEventStatistics); + const mainStatisticsMerged: MergedQueriesResponse = merge( + transactioEventStatistics, + errorEventStatistics + ); + + const mainStatistics = mainStatisticsMerged.map((item) => { + return { + name: item.name, + latency: item.latency, + throughput: item.throughput, + crashRate: item.crashes ? item.crashes / item.sessions : 0, + }; + }); return { mainStatistics }; }