Skip to content

Commit

Permalink
Updated APM Indices endpoints to use the SavedObjectsClient from the …
Browse files Browse the repository at this point in the history
…legacy request context, and set the apm-indices schema object to be namspace-agnostic

- rename apm-telemetry save object mapping -> apm-services-telemetry (#49994)
- move saved object types and document IDs to constants file
- Updated APM Indices endpoints to use the SavedObjectsClient from the
  legacy request context, and set the apm-indices schema object to be
  namspace-agnostic.
  • Loading branch information
ogupte committed Nov 14, 2019
1 parent bf795de commit a85f678
Show file tree
Hide file tree
Showing 19 changed files with 190 additions and 147 deletions.
14 changes: 14 additions & 0 deletions x-pack/legacy/plugins/apm/common/apm_saved_object_constants.ts
@@ -0,0 +1,14 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

// APM Services telemetry
export const APM_SERVICES_TELEMETRY_SAVED_OBJECT_TYPE =
'apm-services-telemetry';
export const APM_SERVICES_TELEMETRY_SAVED_OBJECT_ID = 'apm-services-telemetry';

// APM indices
export const APM_INDICES_SAVED_OBJECT_TYPE = 'apm-indices';
export const APM_INDICES_SAVED_OBJECT_ID = 'apm-indices';
5 changes: 4 additions & 1 deletion x-pack/legacy/plugins/apm/index.ts
Expand Up @@ -45,7 +45,10 @@ export const apm: LegacyPluginInitializer = kibana => {
},
hacks: ['plugins/apm/hacks/toggle_app_link_in_nav'],
savedObjectSchemas: {
'apm-telemetry': {
'apm-services-telemetry': {
isNamespaceAgnostic: true
},
'apm-indices': {
isNamespaceAgnostic: true
}
},
Expand Down
2 changes: 1 addition & 1 deletion x-pack/legacy/plugins/apm/mappings.json
@@ -1,5 +1,5 @@
{
"apm-telemetry": {
"apm-services-telemetry": {
"properties": {
"has_any_services": {
"type": "boolean"
Expand Down
Expand Up @@ -5,11 +5,11 @@
*/

import { SavedObjectAttributes } from 'src/core/server';
import { createApmTelementry, storeApmServicesTelemetry } from '../index';
import {
APM_TELEMETRY_DOC_ID,
createApmTelementry,
storeApmTelemetry
} from '../apm_telemetry';
APM_SERVICES_TELEMETRY_SAVED_OBJECT_TYPE,
APM_SERVICES_TELEMETRY_SAVED_OBJECT_ID
} from '../../../../common/apm_saved_object_constants';

describe('apm_telemetry', () => {
describe('createApmTelementry', () => {
Expand Down Expand Up @@ -44,7 +44,7 @@ describe('apm_telemetry', () => {
});
});

describe('storeApmTelemetry', () => {
describe('storeApmServicesTelemetry', () => {
let server: any;
let apmTelemetry: SavedObjectAttributes;
let savedObjectsClientInstance: any;
Expand Down Expand Up @@ -75,24 +75,24 @@ describe('apm_telemetry', () => {
});

it('should call savedObjectsClient create with the given ApmTelemetry object', () => {
storeApmTelemetry(server, apmTelemetry);
storeApmServicesTelemetry(server, apmTelemetry);
expect(savedObjectsClientInstance.create.mock.calls[0][1]).toBe(
apmTelemetry
);
});

it('should call savedObjectsClient create with the apm-telemetry document type and ID', () => {
storeApmTelemetry(server, apmTelemetry);
storeApmServicesTelemetry(server, apmTelemetry);
expect(savedObjectsClientInstance.create.mock.calls[0][0]).toBe(
'apm-telemetry'
APM_SERVICES_TELEMETRY_SAVED_OBJECT_TYPE
);
expect(savedObjectsClientInstance.create.mock.calls[0][2].id).toBe(
APM_TELEMETRY_DOC_ID
APM_SERVICES_TELEMETRY_SAVED_OBJECT_ID
);
});

it('should call savedObjectsClient create with overwrite: true', () => {
storeApmTelemetry(server, apmTelemetry);
storeApmServicesTelemetry(server, apmTelemetry);
expect(savedObjectsClientInstance.create.mock.calls[0][2].overwrite).toBe(
true
);
Expand Down

This file was deleted.

80 changes: 74 additions & 6 deletions x-pack/legacy/plugins/apm/server/lib/apm_telemetry/index.ts
Expand Up @@ -4,9 +4,77 @@
* you may not use this file except in compliance with the Elastic License.
*/

export {
storeApmTelemetry,
createApmTelementry,
APM_TELEMETRY_DOC_ID
} from './apm_telemetry';
export { makeApmUsageCollector } from './make_apm_usage_collector';
import { Server } from 'hapi';
import { countBy } from 'lodash';
import { SavedObjectAttributes } from 'src/core/server';
import { CoreSetup } from 'src/core/server';
import { isAgentName } from '../../../common/agent_name';
import { getInternalSavedObjectsClient } from '../helpers/saved_objects_client';
import {
APM_SERVICES_TELEMETRY_SAVED_OBJECT_TYPE,
APM_SERVICES_TELEMETRY_SAVED_OBJECT_ID
} from '../../../common/apm_saved_object_constants';
import { LegacySetup } from '../../new-platform/plugin';

export function createApmTelementry(
agentNames: string[] = []
): SavedObjectAttributes {
const validAgentNames = agentNames.filter(isAgentName);
return {
has_any_services: validAgentNames.length > 0,
services_per_agent: countBy(validAgentNames)
};
}

export async function storeApmServicesTelemetry(
server: Server,
apmTelemetry: SavedObjectAttributes
) {
try {
const internalSavedObjectsClient = getInternalSavedObjectsClient(server);
await internalSavedObjectsClient.create(
APM_SERVICES_TELEMETRY_SAVED_OBJECT_TYPE,
apmTelemetry,
{
id: APM_SERVICES_TELEMETRY_SAVED_OBJECT_ID,
overwrite: true
}
);
} catch (e) {
server.log(['error'], `Unable to save APM telemetry data: ${e.message}`);
}
}

interface LegacySetupWithUsageCollector extends LegacySetup {
server: LegacySetup['server'] & {
usage: {
collectorSet: {
makeUsageCollector: (options: unknown) => unknown;
register: (options: unknown) => unknown;
};
};
};
}

export function makeApmUsageCollector(
core: CoreSetup,
{ server }: LegacySetupWithUsageCollector
) {
const apmUsageCollector = server.usage.collectorSet.makeUsageCollector({
type: 'apm',
fetch: async () => {
const internalSavedObjectsClient = getInternalSavedObjectsClient(server);
try {
const apmTelemetrySavedObject = await internalSavedObjectsClient.get(
APM_SERVICES_TELEMETRY_SAVED_OBJECT_TYPE,
APM_SERVICES_TELEMETRY_SAVED_OBJECT_ID
);
return apmTelemetrySavedObject.attributes;
} catch (err) {
return createApmTelementry();
}
},
isReady: () => true
});
server.usage.collectorSet.register(apmUsageCollector);
}

This file was deleted.

6 changes: 5 additions & 1 deletion x-pack/legacy/plugins/apm/server/lib/helpers/es_client.ts
Expand Up @@ -66,8 +66,12 @@ async function getParamsForSearchRequest(
apmOptions?: APMOptions
) {
const uiSettings = req.getUiSettingsService();
const { server } = req;
const [indices, includeFrozen] = await Promise.all([
getApmIndices(req.server),
getApmIndices({
config: server.config(),
savedObjectsClient: server.savedObjects.getScopedSavedObjectsClient(req)
}),
uiSettings.get('search:includeFrozen')
]);

Expand Down
Expand Up @@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/

import { getSavedObjectsClient } from './saved_objects_client';
import { getInternalSavedObjectsClient } from './saved_objects_client';

describe('saved_objects/client', () => {
describe('getSavedObjectsClient', () => {
Expand All @@ -31,25 +31,25 @@ describe('saved_objects/client', () => {
});

it('should use internal user "admin"', () => {
getSavedObjectsClient(server);
getInternalSavedObjectsClient(server);

expect(server.plugins.elasticsearch.getCluster).toHaveBeenCalledWith(
'admin'
);
});

it('should call getSavedObjectsRepository with a cluster using the internal user context', () => {
getSavedObjectsClient(server);
getInternalSavedObjectsClient(server);

expect(
server.savedObjects.getSavedObjectsRepository
).toHaveBeenCalledWith(callWithInternalUser);
});

it('should return a SavedObjectsClient initialized with the saved objects internal repository', () => {
const result = getSavedObjectsClient(server);
const internalSavedObjectsClient = getInternalSavedObjectsClient(server);

expect(result).toBe(savedObjectsClientInstance);
expect(internalSavedObjectsClient).toBe(savedObjectsClientInstance);
expect(server.savedObjects.SavedObjectsClient).toHaveBeenCalledWith(
internalRepository
);
Expand Down
Expand Up @@ -6,7 +6,10 @@

import { Server } from 'hapi';

export function getSavedObjectsClient(server: Server, clusterName = 'admin') {
export function getInternalSavedObjectsClient(
server: Server,
clusterName = 'admin'
) {
const { SavedObjectsClient, getSavedObjectsRepository } = server.savedObjects;
const { callWithInternalUser } = server.plugins.elasticsearch.getCluster(
clusterName
Expand Down
Expand Up @@ -34,6 +34,9 @@ function getMockRequest() {
callWithInternalUser: callWithInternalUserSpy
})
}
},
savedObjects: {
getScopedSavedObjectsClient: () => ({ get: async () => false })
}
},
getUiSettingsService: () => ({ get: async () => false })
Expand Down
Expand Up @@ -31,10 +31,13 @@ export type Setup = PromiseReturnType<typeof setupRequest>;
export async function setupRequest(req: Legacy.Request) {
const query = (req.query as unknown) as APMRequestQuery;
const { server } = req;
const savedObjectsClient = server.savedObjects.getScopedSavedObjectsClient(
req
);
const config = server.config();
const [uiFiltersES, indices] = await Promise.all([
decodeUiFilters(server, query.uiFilters),
getApmIndices(server)
getApmIndices({ config, savedObjectsClient })
]);

return {
Expand Down
11 changes: 7 additions & 4 deletions x-pack/legacy/plugins/apm/server/lib/index_pattern/index.ts
Expand Up @@ -4,18 +4,21 @@
* you may not use this file except in compliance with the Elastic License.
*/
import { Server } from 'hapi';
import { getSavedObjectsClient } from '../helpers/saved_objects_client';
import { getInternalSavedObjectsClient } from '../helpers/saved_objects_client';
import apmIndexPattern from '../../../../../../../src/legacy/core_plugins/kibana/server/tutorials/apm/index_pattern.json';

export async function getAPMIndexPattern(server: Server) {
const config = server.config();
const apmIndexPatternTitle = config.get('apm_oss.indexPattern');
const savedObjectsClient = getSavedObjectsClient(server);
const internalSavedObjectsClient = getInternalSavedObjectsClient(server);
try {
return await savedObjectsClient.get('index-pattern', apmIndexPattern.id);
return await internalSavedObjectsClient.get(
'index-pattern',
apmIndexPattern.id
);
} catch (error) {
// if GET fails, then create a new index pattern saved object
return await savedObjectsClient.create(
return await internalSavedObjectsClient.create(
'index-pattern',
{
...apmIndexPattern.attributes,
Expand Down
Expand Up @@ -8,13 +8,19 @@ import { CoreSetup } from 'src/core/server';
import { CallCluster } from '../../../../../../../../src/legacy/core_plugins/elasticsearch';
import { getApmIndices } from '../apm_indices/get_apm_indices';
import { LegacySetup } from '../../../new-platform/plugin';
import { getInternalSavedObjectsClient } from '../../helpers/saved_objects_client';

export async function createApmAgentConfigurationIndex(
core: CoreSetup,
{ server }: LegacySetup
) {
try {
const indices = await getApmIndices(server);
const config = server.config();
const internalSavedObjectsClient = getInternalSavedObjectsClient(server);
const indices = await getApmIndices({
savedObjectsClient: internalSavedObjectsClient,
config
});
const index = indices['apm_oss.apmAgentConfigurationIndex'];
const { callWithInternalUser } = server.plugins.elasticsearch.getCluster(
'admin'
Expand Down

0 comments on commit a85f678

Please sign in to comment.