Skip to content

Commit

Permalink
[APM] Allow calling createInternalESClient without context (elast…
Browse files Browse the repository at this point in the history
  • Loading branch information
sorenlouv committed Jan 24, 2023
1 parent 1dc5748 commit 048a65d
Show file tree
Hide file tree
Showing 8 changed files with 96 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,14 @@ export async function callAsyncWithDebug<T>({
getDebugMessage,
debug,
request,
requestType,
requestParams,
operationName,
isCalledWithInternalUser,
}: {
cb: () => Promise<T>;
getDebugMessage: () => { body: string; title: string };
debug: boolean;
request: KibanaRequest;
requestType: string;
request?: KibanaRequest;
requestParams: Record<string, any>;
operationName: string;
isCalledWithInternalUser: boolean; // only allow inspection of queries that were retrieved with credentials of the end user
Expand Down Expand Up @@ -70,19 +68,21 @@ export async function callAsyncWithDebug<T>({
console.log(body);
console.log(`\n`);

const inspectableEsQueries = inspectableEsQueriesMap.get(request);
if (!isCalledWithInternalUser && inspectableEsQueries) {
inspectableEsQueries.push(
getInspectResponse({
esError,
esRequestParams: requestParams,
esRequestStatus,
esResponse: res,
kibanaRequest: request,
operationName,
startTime,
})
);
if (request) {
const inspectableEsQueries = inspectableEsQueriesMap.get(request);
if (!isCalledWithInternalUser && inspectableEsQueries) {
inspectableEsQueries.push(
getInspectResponse({
esError,
esRequestParams: requestParams,
esRequestStatus,
esResponse: res,
kibanaRequest: request,
operationName,
startTime,
})
);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,6 @@ export class APMEventClient {
isCalledWithInternalUser: false,
debug: this.debug,
request: this.request,
requestType,
operationName,
requestParams: params,
cb: () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { unwrapEsResponse } from '@kbn/observability-plugin/server';
import type { ESSearchResponse, ESSearchRequest } from '@kbn/es-types';
import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server';
import { ElasticsearchClient } from '@kbn/core-elasticsearch-server';
import { APMConfig } from '../../../..';
import { APMRouteHandlerResources } from '../../../../routes/typings';
import {
callAsyncWithDebug,
Expand All @@ -20,48 +23,75 @@ import { getApmIndices } from '../../../../routes/settings/apm_indices/get_apm_i
export type APMIndexDocumentParams<T> = estypes.IndexRequest<T>;

export type APMInternalESClient = Awaited<
ReturnType<typeof createInternalESClient>
ReturnType<typeof createInternalESClientWithContext>
>;

export async function createInternalESClient({
context,
export async function createInternalESClientWithContext({
debug,
request,
config,
}: Pick<APMRouteHandlerResources, 'context' | 'request' | 'config'> & {
request,
context,
}: {
debug: boolean;
config: APMConfig;
request: APMRouteHandlerResources['request'];
context: APMRouteHandlerResources['context'];
}) {
const coreContext = await context.core;
const { asInternalUser } = coreContext.elasticsearch.client;
const savedObjectsClient = coreContext.savedObjects.client;

return createInternalESClient({
debug,
config,
request,
savedObjectsClient,
elasticsearchClient: asInternalUser,
});
}

export async function createInternalESClient({
debug,
config,
request,
savedObjectsClient,
elasticsearchClient,
}: {
debug: boolean;
config: APMConfig;
request?: APMRouteHandlerResources['request'];
savedObjectsClient: SavedObjectsClientContract;
elasticsearchClient: ElasticsearchClient;
}) {
function callEs<T extends { body: any }>(
operationName: string,
{
cb,
makeRequestWithSignal,
requestType,
params,
}: {
requestType: string;
cb: (signal: AbortSignal) => Promise<T>;
makeRequestWithSignal: (signal: AbortSignal) => Promise<T>;
params: Record<string, any>;
}
) {
return callAsyncWithDebug({
cb: () => {
const controller = new AbortController();
const res = makeRequestWithSignal(controller.signal);
return unwrapEsResponse(
cancelEsRequestOnAbort(cb(controller.signal), request, controller)
request ? cancelEsRequestOnAbort(res, request, controller) : res
);
},
getDebugMessage: () => ({
title: getDebugTitle(request),
body: getDebugBody({ params, requestType, operationName }),
}),
getDebugMessage: () => {
return {
title: request ? getDebugTitle(request) : 'Internal request',
body: getDebugBody({ params, requestType, operationName }),
};
},
debug,
isCalledWithInternalUser: true,
request,
requestType,
requestParams: params,
operationName,
});
Expand All @@ -78,8 +108,8 @@ export async function createInternalESClient({
): Promise<ESSearchResponse<TDocument, TSearchRequest>> => {
return callEs(operationName, {
requestType: 'search',
cb: (signal) =>
asInternalUser.search(params, {
makeRequestWithSignal: (signal) =>
elasticsearchClient.search(params, {
signal,
meta: true,
}) as Promise<{ body: any }>,
Expand All @@ -89,7 +119,8 @@ export async function createInternalESClient({
index: <T>(operationName: string, params: APMIndexDocumentParams<T>) => {
return callEs(operationName, {
requestType: 'index',
cb: (signal) => asInternalUser.index(params, { signal, meta: true }),
makeRequestWithSignal: (signal) =>
elasticsearchClient.index(params, { signal, meta: true }),
params,
});
},
Expand All @@ -99,7 +130,8 @@ export async function createInternalESClient({
): Promise<{ result: string }> => {
return callEs(operationName, {
requestType: 'delete',
cb: (signal) => asInternalUser.delete(params, { signal, meta: true }),
makeRequestWithSignal: (signal) =>
elasticsearchClient.delete(params, { signal, meta: true }),
params,
});
},
Expand All @@ -109,8 +141,8 @@ export async function createInternalESClient({
) => {
return callEs(operationName, {
requestType: 'indices.create',
cb: (signal) =>
asInternalUser.indices.create(params, { signal, meta: true }),
makeRequestWithSignal: (signal) =>
elasticsearchClient.indices.create(params, { signal, meta: true }),
params,
});
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@ import {
PutPackagePolicyUpdateCallback,
} from '@kbn/fleet-plugin/server';
import { get } from 'lodash';
import { APMPlugin, APMRouteHandlerResources } from '../..';
import { createInternalESClient } from '../../lib/helpers/create_es_client/create_internal_es_client';
import { APMConfig, APMPlugin, APMRouteHandlerResources } from '../..';
import { decoratePackagePolicyWithAgentConfigAndSourceMap } from './merge_package_policy_with_apm';
import { addApiKeysToPackagePolicyIfMissing } from './api_keys/add_api_keys_to_policies_if_missing';
import {
AGENT_CONFIG_API_KEY_PATH,
SOURCE_MAP_API_KEY_PATH,
} from './get_package_policy_decorators';
import { createInternalESClient } from '../../lib/helpers/create_es_client/create_internal_es_client';
import { getInternalSavedObjectsClient } from '../../lib/helpers/get_internal_saved_objects_client';

export async function registerFleetPolicyCallbacks({
logger,
Expand All @@ -43,12 +44,12 @@ export async function registerFleetPolicyCallbacks({

fleetPluginStart.registerExternalCallback(
'packagePolicyUpdate',
onPackagePolicyCreateOrUpdate({ fleetPluginStart, config })
onPackagePolicyCreateOrUpdate({ fleetPluginStart, config, coreStart })
);

fleetPluginStart.registerExternalCallback(
'packagePolicyCreate',
onPackagePolicyCreateOrUpdate({ fleetPluginStart, config })
onPackagePolicyCreateOrUpdate({ fleetPluginStart, config, coreStart })
);

fleetPluginStart.registerExternalCallback(
Expand Down Expand Up @@ -144,23 +145,27 @@ function onPackagePolicyPostCreate({
function onPackagePolicyCreateOrUpdate({
fleetPluginStart,
config,
coreStart,
}: {
fleetPluginStart: FleetStartContract;
config: NonNullable<APMPlugin['currentConfig']>;
config: APMConfig;
coreStart: CoreStart;
}): PutPackagePolicyUpdateCallback & PostPackagePolicyCreateCallback {
return async (packagePolicy, context, request) => {
return async (packagePolicy) => {
if (packagePolicy.package?.name !== 'apm') {
return packagePolicy;
}

const { asInternalUser } = coreStart.elasticsearch.client;
const savedObjectsClient = await getInternalSavedObjectsClient(coreStart);
const internalESClient = await createInternalESClient({
context: context as any,
debug: false,
request,
config,
savedObjectsClient,
elasticsearchClient: asInternalUser,
});

return await decoratePackagePolicyWithAgentConfigAndSourceMap({
return decoratePackagePolicyWithAgentConfigAndSourceMap({
internalESClient,
fleetPluginStart,
packagePolicy,
Expand Down
4 changes: 2 additions & 2 deletions x-pack/plugins/apm/server/routes/fleet/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import { getInternalSavedObjectsClient } from '../../lib/helpers/get_internal_sa
import { createApmServerRoute } from '../apm_routes/create_apm_server_route';
import { getLatestApmPackage } from './get_latest_apm_package';
import { getJavaAgentVersionsFromRegistry } from './get_java_agent_versions';
import { createInternalESClient } from '../../lib/helpers/create_es_client/create_internal_es_client';
import { createInternalESClientWithContext } from '../../lib/helpers/create_es_client/create_internal_es_client';

const hasFleetDataRoute = createApmServerRoute({
endpoint: 'GET /internal/apm/fleet/has_apm_policies',
Expand Down Expand Up @@ -249,7 +249,7 @@ const createCloudApmPackagePolicyRoute = createApmServerRoute({
throw Boom.forbidden(CLOUD_SUPERUSER_REQUIRED_MESSAGE);
}

const internalESClient = await createInternalESClient({
const internalESClient = await createInternalESClientWithContext({
context,
request,
debug: resources.params.query._inspect,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import {
import { getSearchTransactionsEvents } from '../../../lib/helpers/transactions';
import { syncAgentConfigsToApmPackagePolicies } from '../../fleet/sync_agent_configs_to_apm_package_policies';
import { getApmEventClient } from '../../../lib/helpers/get_apm_event_client';
import { createInternalESClient } from '../../../lib/helpers/create_es_client/create_internal_es_client';
import { createInternalESClientWithContext } from '../../../lib/helpers/create_es_client/create_internal_es_client';

// get list of configurations
const agentConfigurationRoute = createApmServerRoute({
Expand All @@ -39,7 +39,7 @@ const agentConfigurationRoute = createApmServerRoute({
>;
}> => {
const { context, request, params, config } = resources;
const internalESClient = await createInternalESClient({
const internalESClient = await createInternalESClientWithContext({
context,
request,
debug: params.query._inspect,
Expand Down Expand Up @@ -68,7 +68,7 @@ const getSingleAgentConfigurationRoute = createApmServerRoute({
const { name, environment, _inspect } = params.query;
const service = { name, environment };

const internalESClient = await createInternalESClient({
const internalESClient = await createInternalESClientWithContext({
context,
request,
debug: _inspect,
Expand Down Expand Up @@ -114,7 +114,7 @@ const deleteAgentConfigurationRoute = createApmServerRoute({
} = resources;
const { service } = params.body;

const internalESClient = await createInternalESClient({
const internalESClient = await createInternalESClientWithContext({
context,
request,
debug: params.query._inspect,
Expand Down Expand Up @@ -179,7 +179,7 @@ const createOrUpdateAgentConfigurationRoute = createApmServerRoute({
} = resources;
const { body, query } = params;

const internalESClient = await createInternalESClient({
const internalESClient = await createInternalESClientWithContext({
context,
request,
debug: params.query._inspect,
Expand Down Expand Up @@ -258,7 +258,7 @@ const agentConfigurationSearchRoute = createApmServerRoute({
mark_as_applied_by_agent: markAsAppliedByAgent,
} = params.body;

const internalESClient = await createInternalESClient({
const internalESClient = await createInternalESClientWithContext({
context,
request,
debug: params.query._inspect,
Expand Down Expand Up @@ -323,7 +323,7 @@ const listAgentConfigurationEnvironmentsRoute = createApmServerRoute({
}> => {
const { context, request, params, config } = resources;
const [internalESClient, apmEventClient] = await Promise.all([
createInternalESClient({
createInternalESClientWithContext({
context,
request,
debug: params.query._inspect,
Expand Down
10 changes: 5 additions & 5 deletions x-pack/plugins/apm/server/routes/settings/custom_link/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { getTransaction } from './get_transaction';
import { listCustomLinks } from './list_custom_links';
import { createApmServerRoute } from '../../apm_routes/create_apm_server_route';
import { getApmEventClient } from '../../../lib/helpers/get_apm_event_client';
import { createInternalESClient } from '../../../lib/helpers/create_es_client/create_internal_es_client';
import { createInternalESClientWithContext } from '../../../lib/helpers/create_es_client/create_internal_es_client';

const customLinkTransactionRoute = createApmServerRoute({
endpoint: 'GET /internal/apm/settings/custom_links/transaction',
Expand Down Expand Up @@ -63,7 +63,7 @@ const listCustomLinksRoute = createApmServerRoute({

const { query } = params;

const internalESClient = await createInternalESClient({
const internalESClient = await createInternalESClientWithContext({
context,
request,
debug: resources.params.query._inspect,
Expand Down Expand Up @@ -94,7 +94,7 @@ const createCustomLinkRoute = createApmServerRoute({
throw Boom.forbidden(INVALID_LICENSE);
}

const internalESClient = await createInternalESClient({
const internalESClient = await createInternalESClientWithContext({
context,
request,
debug: resources.params.query._inspect,
Expand Down Expand Up @@ -130,7 +130,7 @@ const updateCustomLinkRoute = createApmServerRoute({
throw Boom.forbidden(INVALID_LICENSE);
}

const internalESClient = await createInternalESClient({
const internalESClient = await createInternalESClientWithContext({
context,
request,
debug: resources.params.query._inspect,
Expand Down Expand Up @@ -166,7 +166,7 @@ const deleteCustomLinkRoute = createApmServerRoute({
throw Boom.forbidden(INVALID_LICENSE);
}

const internalESClient = await createInternalESClient({
const internalESClient = await createInternalESClientWithContext({
context,
request,
debug: resources.params.query._inspect,
Expand Down

0 comments on commit 048a65d

Please sign in to comment.