-
Notifications
You must be signed in to change notification settings - Fork 8.2k
/
plugin.ts
120 lines (109 loc) · 4.41 KB
/
plugin.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
* 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.
*/
import { PluginInitializerContext, Plugin, CoreSetup } from 'src/core/server';
import { Observable, combineLatest, AsyncSubject } from 'rxjs';
import { map, take } from 'rxjs/operators';
import { Server } from 'hapi';
import { once } from 'lodash';
import { UsageCollectionSetup } from 'src/plugins/usage_collection/server';
import { APMOSSPluginSetup } from '../../../../src/plugins/apm_oss/server';
import { makeApmUsageCollector } from './lib/apm_telemetry';
import { createApmAgentConfigurationIndex } from './lib/settings/agent_configuration/create_agent_config_index';
import { createApmCustomLinkIndex } from './lib/settings/custom_link/create_custom_link_index';
import { createApmApi } from './routes/create_apm_api';
import { getApmIndices } from './lib/settings/apm_indices/get_apm_indices';
import { APMConfig, mergeConfigs, APMXPackConfig } from '.';
import { HomeServerPluginSetup } from '../../../../src/plugins/home/server';
import { tutorialProvider } from './tutorial';
import { CloudSetup } from '../../cloud/server';
import { getInternalSavedObjectsClient } from './lib/helpers/get_internal_saved_objects_client';
import { LicensingPluginSetup } from '../../licensing/public';
export interface LegacySetup {
server: Server;
}
export interface APMPluginContract {
config$: Observable<APMConfig>;
registerLegacyAPI: (__LEGACY: LegacySetup) => void;
getApmIndices: () => ReturnType<typeof getApmIndices>;
}
export class APMPlugin implements Plugin<APMPluginContract> {
legacySetup$: AsyncSubject<LegacySetup>;
constructor(private readonly initContext: PluginInitializerContext) {
this.initContext = initContext;
this.legacySetup$ = new AsyncSubject();
}
public async setup(
core: CoreSetup,
plugins: {
apm_oss: APMOSSPluginSetup;
home: HomeServerPluginSetup;
licensing: LicensingPluginSetup;
cloud?: CloudSetup;
usageCollection?: UsageCollectionSetup;
}
) {
const logger = this.initContext.logger.get('apm');
const config$ = this.initContext.config.create<APMXPackConfig>();
const mergedConfig$ = combineLatest(plugins.apm_oss.config$, config$).pipe(
map(([apmOssConfig, apmConfig]) => mergeConfigs(apmOssConfig, apmConfig))
);
this.legacySetup$.subscribe(__LEGACY => {
createApmApi().init(core, { config$: mergedConfig$, logger, __LEGACY });
});
const currentConfig = await mergedConfig$.pipe(take(1)).toPromise();
// create agent configuration index without blocking setup lifecycle
createApmAgentConfigurationIndex({
esClient: core.elasticsearch.dataClient,
config: currentConfig,
logger
});
// create custom action index without blocking setup lifecycle
createApmCustomLinkIndex({
esClient: core.elasticsearch.dataClient,
config: currentConfig,
logger
});
plugins.home.tutorials.registerTutorial(
tutorialProvider({
isEnabled: currentConfig['xpack.apm.ui.enabled'],
indexPatternTitle: currentConfig['apm_oss.indexPattern'],
cloud: plugins.cloud,
indices: {
errorIndices: currentConfig['apm_oss.errorIndices'],
metricsIndices: currentConfig['apm_oss.metricsIndices'],
onboardingIndices: currentConfig['apm_oss.onboardingIndices'],
sourcemapIndices: currentConfig['apm_oss.sourcemapIndices'],
transactionIndices: currentConfig['apm_oss.transactionIndices']
}
})
);
const usageCollection = plugins.usageCollection;
if (usageCollection) {
getInternalSavedObjectsClient(core)
.then(savedObjectsClient => {
makeApmUsageCollector(usageCollection, savedObjectsClient);
})
.catch(error => {
logger.error('Unable to initialize use collection');
logger.error(error.message);
});
}
return {
config$: mergedConfig$,
registerLegacyAPI: once((__LEGACY: LegacySetup) => {
this.legacySetup$.next(__LEGACY);
this.legacySetup$.complete();
}),
getApmIndices: async () =>
getApmIndices({
savedObjectsClient: await getInternalSavedObjectsClient(core),
config: currentConfig
})
};
}
public start() {}
public stop() {}
}