diff --git a/src/plugins/data/common/search/expressions/esdsl.ts b/src/plugins/data/common/search/expressions/esdsl.ts index cc0a84cd4a908..34a67223b4be5 100644 --- a/src/plugins/data/common/search/expressions/esdsl.ts +++ b/src/plugins/data/common/search/expressions/esdsl.ts @@ -126,7 +126,7 @@ export const getEsdslFn = ({ }); try { - const finalResponse = await lastValueFrom( + const { rawResponse } = await lastValueFrom( search( { params: { @@ -141,14 +141,14 @@ export const getEsdslFn = ({ const stats: RequestStatistics = {}; - if (finalResponse.rawResponse?.took) { + if (rawResponse?.took) { stats.queryTime = { label: i18n.translate('data.search.es_search.queryTimeLabel', { defaultMessage: 'Query time', }), value: i18n.translate('data.search.es_search.queryTimeValue', { defaultMessage: '{queryTime}ms', - values: { queryTime: finalResponse.rawResponse.took }, + values: { queryTime: rawResponse.took }, }), description: i18n.translate('data.search.es_search.queryTimeDescription', { defaultMessage: @@ -158,12 +158,12 @@ export const getEsdslFn = ({ }; } - if (finalResponse.rawResponse?.hits) { + if (rawResponse?.hits) { stats.hitsTotal = { label: i18n.translate('data.search.es_search.hitsTotalLabel', { defaultMessage: 'Hits (total)', }), - value: `${finalResponse.rawResponse.hits.total}`, + value: `${rawResponse.hits.total}`, description: i18n.translate('data.search.es_search.hitsTotalDescription', { defaultMessage: 'The number of documents that match the query.', }), @@ -173,19 +173,19 @@ export const getEsdslFn = ({ label: i18n.translate('data.search.es_search.hitsLabel', { defaultMessage: 'Hits', }), - value: `${finalResponse.rawResponse.hits.hits.length}`, + value: `${rawResponse.hits.hits.length}`, description: i18n.translate('data.search.es_search.hitsDescription', { defaultMessage: 'The number of documents returned by the query.', }), }; } - request.stats(stats).ok({ json: finalResponse }); + request.stats(stats).ok({ json: rawResponse }); request.json(dsl); return { type: 'es_raw_response', - body: finalResponse.rawResponse, + body: rawResponse, }; } catch (e) { request.error({ json: e }); diff --git a/src/plugins/data/common/search/expressions/esql.ts b/src/plugins/data/common/search/expressions/esql.ts index b2d6a0458c63b..8ef0f49588303 100644 --- a/src/plugins/data/common/search/expressions/esql.ts +++ b/src/plugins/data/common/search/expressions/esql.ts @@ -210,24 +210,24 @@ export const getEsqlFn = ({ getStartDependencies }: EsqlFnArguments) => { return throwError(() => error); }), tap({ - next(finalResponse) { + next({ rawResponse }) { logInspectorRequest() .stats({ hits: { label: i18n.translate('data.search.es_search.hitsLabel', { defaultMessage: 'Hits', }), - value: `${finalResponse.rawResponse.values.length}`, + value: `${rawResponse.values.length}`, description: i18n.translate('data.search.es_search.hitsDescription', { defaultMessage: 'The number of documents returned by the query.', }), }, }) .json(params) - .ok({ json: finalResponse }); + .ok({ json: rawResponse }); }, error(error) { - logInspectorRequest().json(params).error({ json: error }); + logInspectorRequest().error({ json: error }); }, }) ); diff --git a/src/plugins/data/common/search/expressions/essql.ts b/src/plugins/data/common/search/expressions/essql.ts index e93ee85441a22..a5db4674a7d14 100644 --- a/src/plugins/data/common/search/expressions/essql.ts +++ b/src/plugins/data/common/search/expressions/essql.ts @@ -217,14 +217,14 @@ export const getEssqlFn = ({ getStartDependencies }: EssqlFnArguments) => { return throwError(() => error); }), tap({ - next(finalResponse) { + next({ rawResponse, took }) { logInspectorRequest() .stats({ hits: { label: i18n.translate('data.search.es_search.hitsLabel', { defaultMessage: 'Hits', }), - value: `${finalResponse.rawResponse.rows.length}`, + value: `${rawResponse.rows.length}`, description: i18n.translate('data.search.es_search.hitsDescription', { defaultMessage: 'The number of documents returned by the query.', }), @@ -235,7 +235,7 @@ export const getEssqlFn = ({ getStartDependencies }: EssqlFnArguments) => { }), value: i18n.translate('data.search.es_search.queryTimeValue', { defaultMessage: '{queryTime}ms', - values: { queryTime: finalResponse.took }, + values: { queryTime: took }, }), description: i18n.translate('data.search.es_search.queryTimeDescription', { defaultMessage: @@ -245,10 +245,10 @@ export const getEssqlFn = ({ getStartDependencies }: EssqlFnArguments) => { }, }) .json(params) - .ok({ json: finalResponse }); + .ok({ json: rawResponse }); }, error(error) { - logInspectorRequest().json(params).error({ json: error }); + logInspectorRequest().error({ json: error }); }, }) ); diff --git a/src/plugins/data/common/search/types.ts b/src/plugins/data/common/search/types.ts index b2f818acaa0ac..cedfa3ee02274 100644 --- a/src/plugins/data/common/search/types.ts +++ b/src/plugins/data/common/search/types.ts @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import type { ConnectionRequestParams } from '@elastic/transport'; import type { TransportRequestOptions } from '@elastic/elasticsearch'; import type { KibanaExecutionContext } from '@kbn/core/public'; import type { DataView } from '@kbn/data-views-plugin/common'; @@ -87,11 +86,6 @@ export interface IKibanaSearchResponse { * The raw response returned by the internal search method (usually the raw ES response) */ rawResponse: RawResponse; - - /** - * HTTP request parameters from elasticsearch transport client t - */ - requestParams?: ConnectionRequestParams; } export interface IKibanaSearchRequest { diff --git a/src/plugins/data/public/search/search_interceptor/search_interceptor.ts b/src/plugins/data/public/search/search_interceptor/search_interceptor.ts index 414230b7e5add..00ed4226fea3d 100644 --- a/src/plugins/data/public/search/search_interceptor/search_interceptor.ts +++ b/src/plugins/data/public/search/search_interceptor/search_interceptor.ts @@ -29,7 +29,6 @@ import { takeUntil, tap, } from 'rxjs/operators'; -import type { ConnectionRequestParams } from '@elastic/transport'; import { PublicMethodsOf } from '@kbn/utility-types'; import type { HttpSetup, IHttpFetchError } from '@kbn/core-http-browser'; import { BfetchRequestError } from '@kbn/bfetch-plugin/public'; @@ -305,38 +304,18 @@ export class SearchInterceptor { const cancel = () => id && !isSavedToBackground && sendCancelRequest(); - // Async search requires a series of requests - // 1) POST //_async_search/ - // 2..n) GET /_async_search/ - // - // First request contains useful request params for tools like Inspector. - // Preserve and project first request params into responses. - let firstRequestParams: ConnectionRequestParams; - return pollSearch(search, cancel, { pollInterval: this.deps.searchConfig.asyncSearch.pollInterval, ...options, abortSignal: searchAbortController.getSignal(), }).pipe( tap((response) => { - if (!firstRequestParams && response.requestParams) { - firstRequestParams = response.requestParams; - } - id = response.id; if (isCompleteResponse(response)) { searchTracker?.complete(); } }), - map((response) => { - return firstRequestParams - ? { - ...response, - requestParams: firstRequestParams, - } - : response; - }), catchError((e: Error) => { searchTracker?.error(); cancel(); diff --git a/src/plugins/data/server/search/routes/bsearch.ts b/src/plugins/data/server/search/routes/bsearch.ts index 7248206c8ee95..581920feef89d 100644 --- a/src/plugins/data/server/search/routes/bsearch.ts +++ b/src/plugins/data/server/search/routes/bsearch.ts @@ -8,7 +8,6 @@ import { firstValueFrom } from 'rxjs'; import { catchError } from 'rxjs/operators'; -import { errors } from '@elastic/elasticsearch'; import { BfetchServerSetup } from '@kbn/bfetch-plugin/server'; import type { ExecutionContextSetup } from '@kbn/core/server'; import apm from 'elastic-apm-node'; @@ -48,12 +47,6 @@ export function registerBsearchRoute( message: err.message, statusCode: err.statusCode, attributes: err.errBody?.error, - // TODO remove 'instanceof errors.ResponseError' check when - // eql strategy throws KbnServerError (like all of the other strategies) - requestParams: - err instanceof errors.ResponseError - ? err.meta?.meta?.request?.params - : err.requestParams, }; }) ) diff --git a/src/plugins/data/server/search/strategies/eql_search/eql_search_strategy.ts b/src/plugins/data/server/search/strategies/eql_search/eql_search_strategy.ts index 45a7b4d90cd41..d6f5d948c784a 100644 --- a/src/plugins/data/server/search/strategies/eql_search/eql_search_strategy.ts +++ b/src/plugins/data/server/search/strategies/eql_search/eql_search_strategy.ts @@ -77,10 +77,7 @@ export const eqlSearchStrategyProvider = ( meta: true, }); - return toEqlKibanaSearchResponse( - response as TransportResult, - (response as TransportResult).meta?.request?.params - ); + return toEqlKibanaSearchResponse(response as TransportResult); }; const cancel = async () => { diff --git a/src/plugins/data/server/search/strategies/eql_search/response_utils.ts b/src/plugins/data/server/search/strategies/eql_search/response_utils.ts index 48c19c996fd52..f9bdf5bc7de30 100644 --- a/src/plugins/data/server/search/strategies/eql_search/response_utils.ts +++ b/src/plugins/data/server/search/strategies/eql_search/response_utils.ts @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import type { ConnectionRequestParams } from '@elastic/transport'; import type { TransportResult } from '@elastic/elasticsearch'; import { EqlSearchResponse } from './types'; import { EqlSearchStrategyResponse } from '../../../../common'; @@ -16,14 +15,12 @@ import { EqlSearchStrategyResponse } from '../../../../common'; * (EQL does not provide _shard info, so total/loaded cannot be calculated.) */ export function toEqlKibanaSearchResponse( - response: TransportResult, - requestParams?: ConnectionRequestParams + response: TransportResult ): EqlSearchStrategyResponse { return { id: response.body.id, rawResponse: response, isPartial: response.body.is_partial, isRunning: response.body.is_running, - ...(requestParams ? { requestParams } : {}), }; } diff --git a/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts b/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts index 679bb5ae2a699..15a6a4df7eed8 100644 --- a/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts +++ b/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts @@ -113,7 +113,7 @@ describe('ES search strategy', () => { ) ); const [, searchOptions] = esClient.search.mock.calls[0]; - expect(searchOptions).toEqual({ signal: undefined, maxRetries: 5, meta: true }); + expect(searchOptions).toEqual({ signal: undefined, maxRetries: 5 }); }); it('can be aborted', async () => { @@ -131,10 +131,7 @@ describe('ES search strategy', () => { ...params, track_total_hits: true, }); - expect(esClient.search.mock.calls[0][1]).toEqual({ - signal: expect.any(AbortSignal), - meta: true, - }); + expect(esClient.search.mock.calls[0][1]).toEqual({ signal: expect.any(AbortSignal) }); }); it('throws normalized error if ResponseError is thrown', async () => { diff --git a/src/plugins/data/server/search/strategies/es_search/es_search_strategy.ts b/src/plugins/data/server/search/strategies/es_search/es_search_strategy.ts index 1dc9beb565c79..b2aed5804f248 100644 --- a/src/plugins/data/server/search/strategies/es_search/es_search_strategy.ts +++ b/src/plugins/data/server/search/strategies/es_search/es_search_strategy.ts @@ -50,13 +50,12 @@ export const esSearchStrategyProvider = ( ...(terminateAfter ? { terminate_after: terminateAfter } : {}), ...requestParams, }; - const { body, meta } = await esClient.asCurrentUser.search(params, { + const body = await esClient.asCurrentUser.search(params, { signal: abortSignal, ...transport, - meta: true, }); const response = shimHitsTotal(body, options); - return toKibanaSearchResponse(response, meta?.request?.params); + return toKibanaSearchResponse(response); } catch (e) { throw getKbnServerError(e); } diff --git a/src/plugins/data/server/search/strategies/es_search/response_utils.ts b/src/plugins/data/server/search/strategies/es_search/response_utils.ts index 6e364cbbc40bd..4773b6df3bbaf 100644 --- a/src/plugins/data/server/search/strategies/es_search/response_utils.ts +++ b/src/plugins/data/server/search/strategies/es_search/response_utils.ts @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import type { ConnectionRequestParams } from '@elastic/transport'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { ISearchOptions } from '../../../../common'; @@ -25,15 +24,11 @@ export function getTotalLoaded(response: estypes.SearchResponse) { * Get the Kibana representation of this response (see `IKibanaSearchResponse`). * @internal */ -export function toKibanaSearchResponse( - rawResponse: estypes.SearchResponse, - requestParams?: ConnectionRequestParams -) { +export function toKibanaSearchResponse(rawResponse: estypes.SearchResponse) { return { rawResponse, isPartial: false, isRunning: false, - ...(requestParams ? { requestParams } : {}), ...getTotalLoaded(rawResponse), }; } diff --git a/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts b/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts index c8322d3083995..298933907b8bb 100644 --- a/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts +++ b/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts @@ -65,7 +65,7 @@ export const enhancedEsSearchStrategyProvider = ( ...(await getDefaultAsyncSubmitParams(uiSettingsClient, searchConfig, options)), ...request.params, }; - const { body, headers, meta } = id + const { body, headers } = id ? await client.asyncSearch.get( { ...params, id }, { ...options.transport, signal: options.abortSignal, meta: true } @@ -78,11 +78,7 @@ export const enhancedEsSearchStrategyProvider = ( const response = shimHitsTotal(body.response, options); - return toAsyncKibanaSearchResponse( - { ...body, response }, - headers?.warning, - meta?.request?.params - ); + return toAsyncKibanaSearchResponse({ ...body, response }, headers?.warning); }; const cancel = async () => { @@ -135,10 +131,8 @@ export const enhancedEsSearchStrategyProvider = ( ); const response = esResponse.body as estypes.SearchResponse; - const requestParams = esResponse.meta?.request?.params; return { rawResponse: shimHitsTotal(response, options), - ...(requestParams ? { requestParams } : {}), ...getTotalLoaded(response), }; } catch (e) { diff --git a/src/plugins/data/server/search/strategies/ese_search/response_utils.ts b/src/plugins/data/server/search/strategies/ese_search/response_utils.ts index 5439e8a618dae..c9390a1b381d5 100644 --- a/src/plugins/data/server/search/strategies/ese_search/response_utils.ts +++ b/src/plugins/data/server/search/strategies/ese_search/response_utils.ts @@ -6,25 +6,19 @@ * Side Public License, v 1. */ -import type { ConnectionRequestParams } from '@elastic/transport'; import type { AsyncSearchResponse } from './types'; import { getTotalLoaded } from '../es_search'; /** * Get the Kibana representation of an async search response (see `IKibanaSearchResponse`). */ -export function toAsyncKibanaSearchResponse( - response: AsyncSearchResponse, - warning?: string, - requestParams?: ConnectionRequestParams -) { +export function toAsyncKibanaSearchResponse(response: AsyncSearchResponse, warning?: string) { return { id: response.id, rawResponse: response.response, isPartial: response.is_partial, isRunning: response.is_running, ...(warning ? { warning } : {}), - ...(requestParams ? { requestParams } : {}), ...getTotalLoaded(response.response), }; } diff --git a/src/plugins/data/server/search/strategies/esql_search/esql_search_strategy.ts b/src/plugins/data/server/search/strategies/esql_search/esql_search_strategy.ts index e61feaba15668..7f3f6f521853d 100644 --- a/src/plugins/data/server/search/strategies/esql_search/esql_search_strategy.ts +++ b/src/plugins/data/server/search/strategies/esql_search/esql_search_strategy.ts @@ -32,7 +32,7 @@ export const esqlSearchStrategyProvider = ( const search = async () => { try { const { terminateAfter, ...requestParams } = request.params ?? {}; - const { headers, body, meta } = await esClient.asCurrentUser.transport.request( + const { headers, body } = await esClient.asCurrentUser.transport.request( { method: 'POST', path: '/_query', @@ -45,12 +45,10 @@ export const esqlSearchStrategyProvider = ( meta: true, } ); - const transportRequestParams = meta?.request?.params; return { rawResponse: body, isPartial: false, isRunning: false, - ...(transportRequestParams ? { requestParams: transportRequestParams } : {}), warning: headers?.warning, }; } catch (e) { diff --git a/src/plugins/data/server/search/strategies/sql_search/response_utils.ts b/src/plugins/data/server/search/strategies/sql_search/response_utils.ts index 0f4fb3e275f0e..b859df9db4237 100644 --- a/src/plugins/data/server/search/strategies/sql_search/response_utils.ts +++ b/src/plugins/data/server/search/strategies/sql_search/response_utils.ts @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import type { ConnectionRequestParams } from '@elastic/transport'; import { SqlQueryResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { SqlSearchStrategyResponse } from '../../../../common'; @@ -16,8 +15,7 @@ import { SqlSearchStrategyResponse } from '../../../../common'; export function toAsyncKibanaSearchResponse( response: SqlQueryResponse, startTime: number, - warning?: string, - requestParams?: ConnectionRequestParams + warning?: string ): SqlSearchStrategyResponse { return { id: response.id, @@ -26,6 +24,5 @@ export function toAsyncKibanaSearchResponse( isRunning: response.is_running, took: Date.now() - startTime, ...(warning ? { warning } : {}), - ...(requestParams ? { requestParams } : {}), }; } diff --git a/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.ts b/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.ts index b6207787d8fbb..c8928a343eec5 100644 --- a/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.ts +++ b/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.ts @@ -9,7 +9,6 @@ import type { IncomingHttpHeaders } from 'http'; import type { IScopedClusterClient, Logger } from '@kbn/core/server'; import { catchError, tap } from 'rxjs/operators'; -import type { DiagnosticResult } from '@elastic/transport'; import { SqlQueryResponse } from '@elastic/elasticsearch/lib/api/types'; import { getKbnServerError } from '@kbn/kibana-utils-plugin/server'; import type { ISearchStrategy, SearchStrategyDependencies } from '../../types'; @@ -49,10 +48,9 @@ export const sqlSearchStrategyProvider = ( const { keep_cursor: keepCursor, ...params } = request.params ?? {}; let body: SqlQueryResponse; let headers: IncomingHttpHeaders; - let meta: DiagnosticResult['meta']; if (id) { - ({ body, headers, meta } = await client.sql.getAsync( + ({ body, headers } = await client.sql.getAsync( { format: params?.format ?? 'json', ...getDefaultAsyncGetParams(searchConfig, options), @@ -61,7 +59,7 @@ export const sqlSearchStrategyProvider = ( { ...options.transport, signal: options.abortSignal, meta: true } )); } else { - ({ headers, body, meta } = await client.sql.query( + ({ headers, body } = await client.sql.query( { format: params.format ?? 'json', ...getDefaultAsyncSubmitParams(searchConfig, options), @@ -81,7 +79,7 @@ export const sqlSearchStrategyProvider = ( } } - return toAsyncKibanaSearchResponse(body, startTime, headers?.warning, meta?.request?.params); + return toAsyncKibanaSearchResponse(body, startTime, headers?.warning); }; const cancel = async () => { diff --git a/src/plugins/inspector/common/adapters/request/move_request_params_to_top_level.test.ts b/src/plugins/inspector/common/adapters/request/move_request_params_to_top_level.test.ts deleted file mode 100644 index 37b7a8dd6f283..0000000000000 --- a/src/plugins/inspector/common/adapters/request/move_request_params_to_top_level.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { moveRequestParamsToTopLevel } from './move_request_params_to_top_level'; -import { RequestStatus } from './types'; - -describe('moveRequestParamsToTopLevel', () => { - test('should move request meta from error response', () => { - expect( - moveRequestParamsToTopLevel(RequestStatus.ERROR, { - json: { - attributes: {}, - err: { - message: 'simulated error', - requestParams: { - method: 'POST', - path: '/_query', - }, - }, - }, - time: 1, - }) - ).toEqual({ - json: { - attributes: {}, - err: { - message: 'simulated error', - }, - }, - requestParams: { - method: 'POST', - path: '/_query', - }, - time: 1, - }); - }); - - test('should move request meta from ok response', () => { - expect( - moveRequestParamsToTopLevel(RequestStatus.OK, { - json: { - rawResponse: {}, - requestParams: { - method: 'POST', - path: '/_query', - }, - }, - time: 1, - }) - ).toEqual({ - json: { - rawResponse: {}, - }, - requestParams: { - method: 'POST', - path: '/_query', - }, - time: 1, - }); - }); -}); diff --git a/src/plugins/inspector/common/adapters/request/move_request_params_to_top_level.ts b/src/plugins/inspector/common/adapters/request/move_request_params_to_top_level.ts deleted file mode 100644 index a00a2d90559c7..0000000000000 --- a/src/plugins/inspector/common/adapters/request/move_request_params_to_top_level.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import type { ConnectionRequestParams } from '@elastic/transport'; -import { RequestStatus, Response } from './types'; - -interface ErrorResponse { - [key: string]: unknown; - err?: { - [key: string]: unknown; - requestParams?: ConnectionRequestParams; - }; -} - -interface OkResponse { - [key: string]: unknown; - requestParams?: ConnectionRequestParams; -} - -export function moveRequestParamsToTopLevel(status: RequestStatus, response: Response) { - if (status === RequestStatus.ERROR) { - const requestParams = (response.json as ErrorResponse)?.err?.requestParams; - if (!requestParams) { - return response; - } - - const json = { - ...response.json, - err: { ...(response.json as ErrorResponse).err }, - }; - delete json.err.requestParams; - return { - ...response, - json, - requestParams, - }; - } - - const requestParams = (response.json as OkResponse)?.requestParams; - if (!requestParams) { - return response; - } - - const json = { ...response.json } as OkResponse; - delete json.requestParams; - return { - ...response, - json, - requestParams, - }; -} diff --git a/src/plugins/inspector/common/adapters/request/request_responder.ts b/src/plugins/inspector/common/adapters/request/request_responder.ts index cf3a4b6c223da..1d3a999e4834d 100644 --- a/src/plugins/inspector/common/adapters/request/request_responder.ts +++ b/src/plugins/inspector/common/adapters/request/request_responder.ts @@ -8,7 +8,6 @@ import { i18n } from '@kbn/i18n'; import { Request, RequestStatistics, RequestStatus, Response } from './types'; -import { moveRequestParamsToTopLevel } from './move_request_params_to_top_level'; /** * An API to specify information about a specific request that will be logged. @@ -54,7 +53,7 @@ export class RequestResponder { public finish(status: RequestStatus, response: Response): void { this.request.time = response.time ?? Date.now() - this.request.startTime; this.request.status = status; - this.request.response = moveRequestParamsToTopLevel(status, response); + this.request.response = response; this.onChange(); } diff --git a/src/plugins/inspector/common/adapters/request/types.ts b/src/plugins/inspector/common/adapters/request/types.ts index d00e1304f74f5..4e6a8d324559f 100644 --- a/src/plugins/inspector/common/adapters/request/types.ts +++ b/src/plugins/inspector/common/adapters/request/types.ts @@ -6,8 +6,6 @@ * Side Public License, v 1. */ -import type { ConnectionRequestParams } from '@elastic/transport'; - /** * The status a request can have. */ @@ -54,8 +52,6 @@ export interface RequestStatistic { } export interface Response { - // TODO replace object with IKibanaSearchResponse once IKibanaSearchResponse is seperated from data plugin. json?: object; - requestParams?: ConnectionRequestParams; time?: number; } diff --git a/src/plugins/inspector/public/views/requests/components/details/req_code_viewer.tsx b/src/plugins/inspector/public/views/requests/components/details/req_code_viewer.tsx index 58f5dd44f3f11..5ab50ba33a514 100644 --- a/src/plugins/inspector/public/views/requests/components/details/req_code_viewer.tsx +++ b/src/plugins/inspector/public/views/requests/components/details/req_code_viewer.tsx @@ -12,7 +12,6 @@ /* eslint-disable @elastic/eui/href-or-on-click */ import { EuiButtonEmpty, EuiCopy, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import type { ConnectionRequestParams } from '@elastic/transport'; import { i18n } from '@kbn/i18n'; import { XJsonLang } from '@kbn/monaco'; import { compressToEncodedURIComponent } from 'lz-string'; @@ -22,7 +21,6 @@ import { InspectorPluginStartDeps } from '../../../../plugin'; interface RequestCodeViewerProps { indexPattern?: string; - requestParams?: ConnectionRequestParams; json: string; } @@ -41,37 +39,19 @@ const openInSearchProfilerLabel = i18n.translate('inspector.requests.openInSearc /** * @internal */ -export const RequestCodeViewer = ({ - indexPattern, - requestParams, - json, -}: RequestCodeViewerProps) => { +export const RequestCodeViewer = ({ indexPattern, json }: RequestCodeViewerProps) => { const { services } = useKibana(); const navigateToUrl = services.application?.navigateToUrl; - function getValue() { - if (!requestParams) { - return json; - } - - const fullPath = requestParams.querystring - ? `${requestParams.path}?${requestParams.querystring}` - : requestParams.path; - - return `${requestParams.method} ${fullPath}\n${json}`; - } - - const value = getValue(); - - const devToolsDataUri = compressToEncodedURIComponent(value); + const devToolsDataUri = compressToEncodedURIComponent(`GET ${indexPattern}/_search\n${json}`); const consoleHref = services.share.url.locators .get('CONSOLE_APP_LOCATOR') ?.useUrl({ loadFrom: `data:text/plain,${devToolsDataUri}` }); // Check if both the Dev Tools UI and the Console UI are enabled. const canShowDevTools = services.application?.capabilities?.dev_tools.show && consoleHref !== undefined; - const shouldShowDevToolsLink = !!(requestParams && canShowDevTools); + const shouldShowDevToolsLink = !!(indexPattern && canShowDevTools); const handleDevToolsLinkClick = useCallback( () => consoleHref && navigateToUrl && navigateToUrl(consoleHref), [consoleHref, navigateToUrl] @@ -155,7 +135,7 @@ export const RequestCodeViewer = ({ { return ( ); diff --git a/src/plugins/kibana_utils/server/report_server_error.ts b/src/plugins/kibana_utils/server/report_server_error.ts index a9fd5d9265bd3..0fcc0c34cc4a9 100644 --- a/src/plugins/kibana_utils/server/report_server_error.ts +++ b/src/plugins/kibana_utils/server/report_server_error.ts @@ -7,22 +7,14 @@ */ import { errors } from '@elastic/elasticsearch'; -import type { ConnectionRequestParams } from '@elastic/transport'; import { KibanaResponseFactory } from '@kbn/core/server'; import { KbnError } from '../common'; export class KbnServerError extends KbnError { public errBody?: Record; - public requestParams?: ConnectionRequestParams; - constructor( - message: string, - public readonly statusCode: number, - errBody?: Record, - requestParams?: ConnectionRequestParams - ) { + constructor(message: string, public readonly statusCode: number, errBody?: Record) { super(message); this.errBody = errBody; - this.requestParams = requestParams; } } @@ -36,8 +28,7 @@ export function getKbnServerError(e: Error) { return new KbnServerError( e.message ?? 'Unknown error', e instanceof errors.ResponseError ? e.statusCode! : 500, - e instanceof errors.ResponseError ? e.body : undefined, - e instanceof errors.ResponseError ? e.meta?.meta?.request?.params : undefined + e instanceof errors.ResponseError ? e.body : undefined ); } @@ -52,7 +43,6 @@ export function reportServerError(res: KibanaResponseFactory, err: KbnServerErro body: { message: err.message, attributes: err.errBody?.error, - ...(err.requestParams ? { requestParams: err.requestParams } : {}), }, }); } diff --git a/test/api_integration/apis/search/bsearch.ts b/test/api_integration/apis/search/bsearch.ts index 58f0765a53913..9ce10dc38a643 100644 --- a/test/api_integration/apis/search/bsearch.ts +++ b/test/api_integration/apis/search/bsearch.ts @@ -232,351 +232,6 @@ export default function ({ getService }: FtrProviderContext) { }); }); }); - - describe('request meta', () => { - describe('es', () => { - it(`should return request meta`, async () => { - const resp = await supertest - .post(`/internal/bsearch`) - .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) - .send({ - batch: [ - { - request: { - params: { - index: '.kibana', - body: { - query: { - match_all: {}, - }, - }, - }, - }, - options: { - strategy: 'es', - }, - }, - ], - }); - - const jsonBody = parseBfetchResponse(resp); - - expect(resp.status).to.be(200); - expect(jsonBody[0].result).to.have.property('requestParams'); - expect(jsonBody[0].result.requestParams.method).to.be('POST'); - expect(jsonBody[0].result.requestParams.path).to.be('/.kibana/_search'); - expect(jsonBody[0].result.requestParams.querystring).to.be('ignore_unavailable=true'); - }); - - it(`should return request meta when request fails`, async () => { - const resp = await supertest - .post(`/internal/bsearch`) - .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) - .send({ - batch: [ - { - request: { - params: { - index: '.kibana', - body: { - query: { - bool: { - filter: [ - { - error_query: { - indices: [ - { - error_type: 'exception', - message: 'simulated failure', - name: '.kibana', - }, - ], - }, - }, - ], - }, - }, - }, - }, - }, - options: { - strategy: 'es', - }, - }, - ], - }); - - const jsonBody = parseBfetchResponse(resp); - - expect(resp.status).to.be(200); - expect(jsonBody[0].error).to.have.property('requestParams'); - expect(jsonBody[0].error.requestParams.method).to.be('POST'); - expect(jsonBody[0].error.requestParams.path).to.be('/.kibana/_search'); - expect(jsonBody[0].error.requestParams.querystring).to.be('ignore_unavailable=true'); - }); - }); - - describe('ese', () => { - it(`should return request meta`, async () => { - const resp = await supertest - .post(`/internal/bsearch`) - .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) - .send({ - batch: [ - { - request: { - params: { - index: '.kibana', - body: { - query: { - match_all: {}, - }, - }, - }, - }, - options: { - strategy: 'ese', - }, - }, - ], - }); - - const jsonBody = parseBfetchResponse(resp); - - expect(resp.status).to.be(200); - expect(jsonBody[0].result).to.have.property('requestParams'); - expect(jsonBody[0].result.requestParams.method).to.be('POST'); - expect(jsonBody[0].result.requestParams.path).to.be('/.kibana/_async_search'); - expect(jsonBody[0].result.requestParams.querystring).to.be( - 'batched_reduce_size=64&ccs_minimize_roundtrips=true&wait_for_completion_timeout=200ms&keep_on_completion=false&keep_alive=60000ms&ignore_unavailable=true' - ); - }); - - it(`should return request meta when request fails`, async () => { - const resp = await supertest - .post(`/internal/bsearch`) - .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) - .send({ - batch: [ - { - request: { - params: { - index: '.kibana', - body: { - bool: { - filter: [ - { - error_query: { - indices: [ - { - error_type: 'exception', - message: 'simulated failure', - name: '.kibana', - }, - ], - }, - }, - ], - }, - }, - }, - }, - options: { - strategy: 'ese', - }, - }, - ], - }); - - const jsonBody = parseBfetchResponse(resp); - - expect(resp.status).to.be(200); - expect(jsonBody[0].error).to.have.property('requestParams'); - expect(jsonBody[0].error.requestParams.method).to.be('POST'); - expect(jsonBody[0].error.requestParams.path).to.be('/.kibana/_async_search'); - expect(jsonBody[0].error.requestParams.querystring).to.be( - 'batched_reduce_size=64&ccs_minimize_roundtrips=true&wait_for_completion_timeout=200ms&keep_on_completion=false&keep_alive=60000ms&ignore_unavailable=true' - ); - }); - }); - - describe('esql', () => { - it(`should return request meta`, async () => { - const resp = await supertest - .post(`/internal/bsearch`) - .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) - .send({ - batch: [ - { - request: { - params: { - query: 'from .kibana | limit 1', - }, - }, - options: { - strategy: 'esql', - }, - }, - ], - }); - - const jsonBody = parseBfetchResponse(resp); - - expect(resp.status).to.be(200); - expect(jsonBody[0].result).to.have.property('requestParams'); - expect(jsonBody[0].result.requestParams.method).to.be('POST'); - expect(jsonBody[0].result.requestParams.path).to.be('/_query'); - expect(jsonBody[0].result.requestParams.querystring).to.be(''); - }); - - it(`should return request meta when request fails`, async () => { - const resp = await supertest - .post(`/internal/bsearch`) - .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) - .send({ - batch: [ - { - request: { - params: { - query: 'fro .kibana | limit 1', - }, - }, - options: { - strategy: 'esql', - }, - }, - ], - }); - - const jsonBody = parseBfetchResponse(resp); - - expect(resp.status).to.be(200); - expect(jsonBody[0].error).to.have.property('requestParams'); - expect(jsonBody[0].error.requestParams.method).to.be('POST'); - expect(jsonBody[0].error.requestParams.path).to.be('/_query'); - expect(jsonBody[0].error.requestParams.querystring).to.be(''); - }); - }); - - describe('sql', () => { - it(`should return request meta`, async () => { - const resp = await supertest - .post(`/internal/bsearch`) - .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) - .send({ - batch: [ - { - request: { - params: { - query: 'SELECT * FROM ".kibana" LIMIT 1', - }, - }, - options: { - strategy: 'sql', - }, - }, - ], - }); - - const jsonBody = parseBfetchResponse(resp); - - expect(resp.status).to.be(200); - expect(jsonBody[0].result).to.have.property('requestParams'); - expect(jsonBody[0].result.requestParams.method).to.be('POST'); - expect(jsonBody[0].result.requestParams.path).to.be('/_sql'); - expect(jsonBody[0].result.requestParams.querystring).to.be('format=json'); - }); - - it(`should return request meta when request fails`, async () => { - const resp = await supertest - .post(`/internal/bsearch`) - .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) - .send({ - batch: [ - { - request: { - params: { - query: 'SELEC * FROM ".kibana" LIMIT 1', - }, - }, - options: { - strategy: 'sql', - }, - }, - ], - }); - - const jsonBody = parseBfetchResponse(resp); - - expect(resp.status).to.be(200); - expect(jsonBody[0].error).to.have.property('requestParams'); - expect(jsonBody[0].error.requestParams.method).to.be('POST'); - expect(jsonBody[0].error.requestParams.path).to.be('/_sql'); - expect(jsonBody[0].error.requestParams.querystring).to.be('format=json'); - }); - }); - - describe('eql', () => { - it(`should return request meta`, async () => { - const resp = await supertest - .post(`/internal/bsearch`) - .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) - .send({ - batch: [ - { - request: { - params: { - index: '.kibana', - query: 'any where true', - timestamp_field: 'created_at', - }, - }, - options: { - strategy: 'eql', - }, - }, - ], - }); - - const jsonBody = parseBfetchResponse(resp); - - expect(resp.status).to.be(200); - expect(jsonBody[0].result).to.have.property('requestParams'); - expect(jsonBody[0].result.requestParams.method).to.be('POST'); - expect(jsonBody[0].result.requestParams.path).to.be('/.kibana/_eql/search'); - expect(jsonBody[0].result.requestParams.querystring).to.be('ignore_unavailable=true'); - }); - - it(`should return request meta when request fails`, async () => { - const resp = await supertest - .post(`/internal/bsearch`) - .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) - .send({ - batch: [ - { - request: { - params: { - index: '.kibana', - query: 'any where true', - }, - }, - options: { - strategy: 'eql', - }, - }, - ], - }); - - const jsonBody = parseBfetchResponse(resp); - - expect(resp.status).to.be(200); - expect(jsonBody[0].error).to.have.property('requestParams'); - expect(jsonBody[0].error.requestParams.method).to.be('POST'); - expect(jsonBody[0].error.requestParams.path).to.be('/.kibana/_eql/search'); - expect(jsonBody[0].error.requestParams.querystring).to.be('ignore_unavailable=true'); - }); - }); - }); }); }); } diff --git a/test/functional/apps/visualize/group2/_inspector.ts b/test/functional/apps/visualize/group2/_inspector.ts index 077a37a90c06c..80cfc42ab3cd6 100644 --- a/test/functional/apps/visualize/group2/_inspector.ts +++ b/test/functional/apps/visualize/group2/_inspector.ts @@ -14,6 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const log = getService('log'); const inspector = getService('inspector'); const filterBar = getService('filterBar'); + const monacoEditor = getService('monacoEditor'); const PageObjects = getPageObjects(['visualize', 'visEditor', 'visChart', 'timePicker']); describe('inspector', function describeIndexTests() { @@ -40,8 +41,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await inspector.open(); await inspector.openInspectorRequestsView(); - const { body } = await inspector.getRequest(1); - expect(body.aggs['2'].max).property('missing', 10); + const requestTab = await inspector.getOpenRequestDetailRequestButton(); + await requestTab.click(); + const requestJSON = JSON.parse(await monacoEditor.getCodeEditorValue(1)); + + expect(requestJSON.aggs['2'].max).property('missing', 10); }); after(async () => { diff --git a/test/functional/services/inspector.ts b/test/functional/services/inspector.ts index 7313187047a18..6222405aa6dae 100644 --- a/test/functional/services/inspector.ts +++ b/test/functional/services/inspector.ts @@ -299,21 +299,6 @@ export class InspectorService extends FtrService { return this.testSubjects.find('inspectorRequestDetailResponse'); } - public async getRequest( - codeEditorIndex: number = 0 - ): Promise<{ command: string; body: Record }> { - await (await this.getOpenRequestDetailRequestButton()).click(); - - await this.monacoEditor.waitCodeEditorReady('inspectorRequestCodeViewerContainer'); - const requestString = await this.monacoEditor.getCodeEditorValue(codeEditorIndex); - this.log.debug('Request string from inspector:', requestString); - const openBraceIndex = requestString.indexOf('{'); - return { - command: openBraceIndex >= 0 ? requestString.substring(0, openBraceIndex).trim() : '', - body: openBraceIndex >= 0 ? JSON.parse(requestString.substring(openBraceIndex)) : {}, - }; - } - public async getResponse(): Promise> { await (await this.getOpenRequestDetailResponseButton()).click();