diff --git a/x-pack/plugins/apm/public/services/rest/apm.ts b/x-pack/plugins/apm/public/services/rest/apm.ts index f893d2d8e426d..cddd07bf46031 100644 --- a/x-pack/plugins/apm/public/services/rest/apm.ts +++ b/x-pack/plugins/apm/public/services/rest/apm.ts @@ -128,6 +128,7 @@ export async function loadTransactionDistribution({ start, end, transactionName, + transactionId, kuery }: IUrlParams) { return callApi({ @@ -136,6 +137,7 @@ export async function loadTransactionDistribution({ start, end, transaction_name: transactionName, + transaction_id: transactionId, esFilterQuery: await getEncodedEsQuery(kuery) } }); diff --git a/x-pack/plugins/apm/public/store/reactReduxRequest/transactionDistribution.tsx b/x-pack/plugins/apm/public/store/reactReduxRequest/transactionDistribution.tsx index bf2e803b2c46c..d7b40ad87821f 100644 --- a/x-pack/plugins/apm/public/store/reactReduxRequest/transactionDistribution.tsx +++ b/x-pack/plugins/apm/public/store/reactReduxRequest/transactionDistribution.tsx @@ -39,7 +39,14 @@ export function TransactionDistributionRequest({ urlParams: IUrlParams; render: RRRRender; }) { - const { serviceName, start, end, transactionName, kuery } = urlParams; + const { + serviceName, + transactionId, + start, + end, + transactionName, + kuery + } = urlParams; if (!(serviceName && start && end && transactionName)) { return null; @@ -49,7 +56,9 @@ export function TransactionDistributionRequest({ diff --git a/x-pack/plugins/apm/server/lib/traces/get_top_traces.ts b/x-pack/plugins/apm/server/lib/traces/get_top_traces.ts index a75f69e3369cb..96eaa76373077 100644 --- a/x-pack/plugins/apm/server/lib/traces/get_top_traces.ts +++ b/x-pack/plugins/apm/server/lib/traces/get_top_traces.ts @@ -7,7 +7,8 @@ import { PARENT_ID, PROCESSOR_EVENT, - TRACE_ID + TRACE_ID, + TRANSACTION_SAMPLED } from '../../../common/constants'; import { Setup } from '../helpers/setup_request'; import { getTransactionGroups } from '../transaction_groups'; @@ -48,7 +49,8 @@ export async function getTopTraces( } }, { term: { [PROCESSOR_EVENT]: 'transaction' } } - ] + ], + should: [{ term: { [TRANSACTION_SAMPLED]: true } }] } }; diff --git a/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/fetcher.ts b/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/fetcher.ts index c7334fc233591..55212f7163166 100644 --- a/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/fetcher.ts +++ b/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/fetcher.ts @@ -38,6 +38,7 @@ export type ESResponse = AggregationSearchResponse; export function bucketFetcher( serviceName: string, transactionName: string, + transactionId: string, bucketSize: number, setup: Setup ): Promise { @@ -62,7 +63,10 @@ export function bucketFetcher( } } ], - should: [{ term: { [TRANSACTION_SAMPLED]: true } }] + should: [ + { term: { [TRANSACTION_ID]: transactionId } }, + { term: { [TRANSACTION_SAMPLED]: true } } + ] } }, aggs: { diff --git a/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/index.ts b/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/index.ts index 80ad247edf9f5..debc639104d92 100644 --- a/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/index.ts @@ -11,12 +11,14 @@ import { bucketTransformer } from './transform'; export async function getBuckets( serviceName: string, transactionName: string, + transactionId: string, bucketSize: number, setup: Setup ) { const response = await bucketFetcher( serviceName, transactionName, + transactionId, bucketSize, setup ); diff --git a/x-pack/plugins/apm/server/lib/transactions/distribution/index.ts b/x-pack/plugins/apm/server/lib/transactions/distribution/index.ts index 4ad022ef911ee..25c19f11d58c0 100644 --- a/x-pack/plugins/apm/server/lib/transactions/distribution/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/distribution/index.ts @@ -19,6 +19,7 @@ export interface ITransactionDistributionAPIResponse { export async function getDistribution( serviceName: string, transactionName: string, + transactionId: string, setup: Setup ): Promise { const bucketSize = await calculateBucketSize( @@ -30,6 +31,7 @@ export async function getDistribution( const { defaultSample, buckets, totalHits } = await getBuckets( serviceName, transactionName, + transactionId, bucketSize, setup ); diff --git a/x-pack/plugins/apm/server/routes/transactions.ts b/x-pack/plugins/apm/server/routes/transactions.ts index c03ec64726a74..f891d2b937341 100644 --- a/x-pack/plugins/apm/server/routes/transactions.ts +++ b/x-pack/plugins/apm/server/routes/transactions.ts @@ -121,19 +121,27 @@ export function initTransactionsApi(server: Server) { options: { validate: { query: withDefaultValidators({ - transaction_name: Joi.string().required() + transaction_name: Joi.string().required(), + transaction_id: Joi.string().default('') }) } }, handler: req => { const setup = setupRequest(req); const { serviceName } = req.params; - const { transaction_name: transactionName } = req.query as { + const { + transaction_name: transactionName, + transaction_id: transactionId + } = req.query as { transaction_name: string; + transaction_id: string; }; - return getDistribution(serviceName, transactionName, setup).catch( - defaultErrorHandler - ); + return getDistribution( + serviceName, + transactionName, + transactionId, + setup + ).catch(defaultErrorHandler); } }); }