Skip to content

Commit 5d6174d

Browse files
committed
[Profiling] Use collector and symbolizer integrations in the add data page
1 parent 55bc8cf commit 5d6174d

3 files changed

Lines changed: 140 additions & 88 deletions

File tree

x-pack/plugins/profiling/public/views/no_data_view/index.tsx

Lines changed: 66 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ export function NoDataView({ subTitle }: { subTitle: string }) {
4141
[setupDataCollectionInstructions]
4242
);
4343

44-
const secretToken = data?.variables.secretToken;
45-
const collectionAgentHostPort = data?.variables.apmServerUrl.replace('https://', '');
46-
const symbolUrl = data?.variables.apmServerUrl.replace(/\.apm\./, '.symbols.');
44+
const secretToken = data?.variables.collector.secretToken;
45+
const collectionAgentHost = data?.variables.collector.host.replace('https://', '');
46+
const symbolUrl = data?.variables.symbolizer.host.replace('https://', '');
4747
const hostAgentVersion = 'v3';
4848

4949
const tabs = [
@@ -71,7 +71,7 @@ export function NoDataView({ subTitle }: { subTitle: string }) {
7171
<EuiCodeBlock paddingSize="s" isCopyable>
7272
{`helm install --create-namespace -n=universal-profiling universal-profiling-agent \\
7373
--set "projectID=1,secretToken=${secretToken}" \\
74-
--set "collectionAgentHostPort=${collectionAgentHostPort}" \\
74+
--set "collectionAgentHostPort=${collectionAgentHost}" \\
7575
--set "version=${hostAgentVersion}" \\
7676
optimyze/pf-host-agent`}
7777
</EuiCodeBlock>
@@ -112,7 +112,7 @@ optimyze/pf-host-agent`}
112112
-v /var/run/docker.sock:/var/run/docker.sock -v /sys/kernel/debug:/sys/kernel/debug:ro \\
113113
docker.elastic.co/observability/profiling-agent:${hostAgentVersion} /root/pf-host-agent \\
114114
-project-id=1 -secret-token=${secretToken} \\
115-
-collection-agent=${collectionAgentHostPort}`}
115+
-collection-agent=${collectionAgentHost}`}
116116
</EuiCodeBlock>
117117
),
118118
},
@@ -150,7 +150,7 @@ docker.elastic.co/observability/profiling-agent:${hostAgentVersion} /root/pf-hos
150150
}),
151151
content: (
152152
<EuiCodeBlock paddingSize="s" isCopyable>
153-
{`sudo pf-host-agent/pf-host-agent -project-id=1 -secret-token=${secretToken} -collection-agent=${collectionAgentHostPort}`}
153+
{`sudo pf-host-agent/pf-host-agent -project-id=1 -secret-token=${secretToken} -collection-agent=${collectionAgentHost}`}
154154
</EuiCodeBlock>
155155
),
156156
},
@@ -192,7 +192,7 @@ docker.elastic.co/observability/profiling-agent:${hostAgentVersion} /root/pf-hos
192192
}),
193193
content: (
194194
<EuiCodeBlock paddingSize="s" isCopyable>
195-
{`echo -e "project-id 1\nsecret-token ${secretToken}\ncollection-agent ${collectionAgentHostPort}" | sudo tee -a /etc/prodfiler/prodfiler.conf`}
195+
{`echo -e "project-id 1\nsecret-token ${secretToken}\ncollection-agent ${collectionAgentHost}" | sudo tee -a /etc/prodfiler/prodfiler.conf`}
196196
</EuiCodeBlock>
197197
),
198198
},
@@ -245,7 +245,7 @@ docker.elastic.co/observability/profiling-agent:${hostAgentVersion} /root/pf-hos
245245
}),
246246
content: (
247247
<EuiCodeBlock paddingSize="s" isCopyable>
248-
{`echo -e "project-id 1\nsecret-token ${secretToken}\ncollection-agent ${collectionAgentHostPort}" | sudo tee -a /etc/prodfiler/prodfiler.conf`}
248+
{`echo -e "project-id 1\nsecret-token ${secretToken}\ncollection-agent ${collectionAgentHost}" | sudo tee -a /etc/prodfiler/prodfiler.conf`}
249249
</EuiCodeBlock>
250250
),
251251
},
@@ -262,6 +262,64 @@ docker.elastic.co/observability/profiling-agent:${hostAgentVersion} /root/pf-hos
262262
},
263263
],
264264
},
265+
{
266+
key: 'elasticAgentIntegration',
267+
title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.title', {
268+
defaultMessage: 'Elastic Agent Integration',
269+
}),
270+
steps: [
271+
{
272+
title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.step1', {
273+
defaultMessage: 'Copy credentials',
274+
}),
275+
content: (
276+
<>
277+
<EuiText>
278+
{i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.step1.hint', {
279+
defaultMessage:
280+
"You'll need these credentials to set up Universal Profiling. Please save them in a secure location, as they will be required in the subsequent step.",
281+
})}
282+
</EuiText>
283+
<EuiSpacer />
284+
<EuiCodeBlock paddingSize="s" isCopyable>
285+
{i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.step1.secretToken', {
286+
defaultMessage: 'Secret token: {secretToken}',
287+
values: { secretToken },
288+
})}
289+
</EuiCodeBlock>
290+
<EuiSpacer size="s" />
291+
<EuiCodeBlock paddingSize="s" isCopyable>
292+
{i18n.translate(
293+
'xpack.profiling.tabs.elasticAgentIntegrarion.step1.collectionAgentUrl',
294+
{
295+
defaultMessage: 'Universal Profiling Collector url: {collectionAgentHost}',
296+
values: { collectionAgentHost },
297+
}
298+
)}
299+
</EuiCodeBlock>
300+
</>
301+
),
302+
},
303+
{
304+
title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.step2', {
305+
defaultMessage: 'Fleet',
306+
}),
307+
content: (
308+
<EuiButton
309+
iconType="gear"
310+
fill
311+
href={`${core.http.basePath.prepend(
312+
'/app/integrations/detail/profiler_agent-8.8.0-preview/overview'
313+
)}`}
314+
>
315+
{i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.step2.button', {
316+
defaultMessage: 'Manage Universal Profiling agent in Fleet',
317+
})}
318+
</EuiButton>
319+
),
320+
},
321+
],
322+
},
265323
{
266324
key: 'symbols',
267325
title: i18n.translate('xpack.profiling.tabs.symbols.title', {
@@ -349,61 +407,6 @@ docker.elastic.co/observability/profiling-agent:${hostAgentVersion} /root/pf-hos
349407
},
350408
],
351409
},
352-
{
353-
key: 'elasticAgentIntegration',
354-
title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.title', {
355-
defaultMessage: 'Elastic Agent Integration',
356-
}),
357-
steps: [
358-
{
359-
title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.step1', {
360-
defaultMessage: 'Copy credentials',
361-
}),
362-
content: (
363-
<>
364-
<EuiText>
365-
{i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.step1.hint', {
366-
defaultMessage:
367-
"You'll need these credentials to set up Universal Profiling. Please save them in a secure location, as they will be required in the subsequent step.",
368-
})}
369-
</EuiText>
370-
<EuiSpacer />
371-
<EuiCodeBlock paddingSize="s" isCopyable>
372-
{i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.step1.secretToken', {
373-
defaultMessage: 'Secret token: {secretToken}',
374-
values: { secretToken },
375-
})}
376-
</EuiCodeBlock>
377-
<EuiSpacer size="s" />
378-
<EuiCodeBlock paddingSize="s" isCopyable>
379-
{i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.step1.apmServerUrl', {
380-
defaultMessage: 'APM server url: {apmServerUrl}',
381-
values: { apmServerUrl: collectionAgentHostPort },
382-
})}
383-
</EuiCodeBlock>
384-
</>
385-
),
386-
},
387-
{
388-
title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.step2', {
389-
defaultMessage: 'Fleet',
390-
}),
391-
content: (
392-
<EuiButton
393-
iconType="gear"
394-
fill
395-
href={`${core.http.basePath.prepend(
396-
'/app/integrations/detail/profiler_agent-8.8.0-preview/overview'
397-
)}`}
398-
>
399-
{i18n.translate('xpack.profiling.tabs.elasticAgentIntegrarion.step2.button', {
400-
defaultMessage: 'Manage Universal Profiling agent in Fleet',
401-
})}
402-
</EuiButton>
403-
),
404-
},
405-
],
406-
},
407410
];
408411

409412
const [selectedTab, setSelectedTab] = useState(tabs[0].key);

x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import { merge } from 'lodash';
99
import { ElasticsearchClient } from '@kbn/core/server';
1010
import { fetchFindLatestPackageOrThrow } from '@kbn/fleet-plugin/server/services/epm/registry';
11+
import { SavedObjectsClientContract } from '@kbn/core/server';
12+
import { PackagePolicyClient } from '@kbn/fleet-plugin/server';
1113
import { getApmPolicy } from './get_apm_policy';
1214
import { ProfilingSetupOptions } from './types';
1315
import { PartialSetupState } from '../../../common/setup';
@@ -112,18 +114,39 @@ const CLOUD_AGENT_POLICY_ID = 'policy-elastic-agent-on-cloud';
112114
const COLLECTOR_PACKAGE_POLICY_NAME = 'elastic-universal-profiling-collector';
113115
const SYMBOLIZER_PACKAGE_POLICY_NAME = 'elastic-universal-profiling-symbolizer';
114116

117+
async function getPackagePolicy({
118+
soClient,
119+
packagePolicyClient,
120+
packageName,
121+
}: {
122+
packagePolicyClient: PackagePolicyClient;
123+
soClient: SavedObjectsClientContract;
124+
packageName: string;
125+
}) {
126+
const packagePolicies = await packagePolicyClient.list(soClient, {});
127+
return packagePolicies.items.find((pkg) => pkg.name === packageName);
128+
}
129+
130+
export async function getCollectorPolicy({
131+
soClient,
132+
packagePolicyClient,
133+
}: {
134+
packagePolicyClient: PackagePolicyClient;
135+
soClient: SavedObjectsClientContract;
136+
}) {
137+
return getPackagePolicy({
138+
soClient,
139+
packagePolicyClient,
140+
packageName: COLLECTOR_PACKAGE_POLICY_NAME,
141+
});
142+
}
143+
115144
export async function validateCollectorPackagePolicy({
116145
soClient,
117146
packagePolicyClient,
118147
}: ProfilingSetupOptions): Promise<PartialSetupState> {
119-
const packagePolicies = await packagePolicyClient.list(soClient, {});
120-
return {
121-
policies: {
122-
collector: {
123-
installed: packagePolicies.items.some((pkg) => pkg.name === COLLECTOR_PACKAGE_POLICY_NAME),
124-
},
125-
},
126-
};
148+
const collectorPolicy = await getCollectorPolicy({ soClient, packagePolicyClient });
149+
return { policies: { collector: { installed: !!collectorPolicy } } };
127150
}
128151

129152
export function generateSecretToken() {
@@ -198,18 +221,26 @@ export async function createCollectorPackagePolicy({
198221
});
199222
}
200223

224+
export async function getSymbolizerPolicy({
225+
soClient,
226+
packagePolicyClient,
227+
}: {
228+
packagePolicyClient: PackagePolicyClient;
229+
soClient: SavedObjectsClientContract;
230+
}) {
231+
return getPackagePolicy({
232+
soClient,
233+
packagePolicyClient,
234+
packageName: SYMBOLIZER_PACKAGE_POLICY_NAME,
235+
});
236+
}
237+
201238
export async function validateSymbolizerPackagePolicy({
202239
soClient,
203240
packagePolicyClient,
204241
}: ProfilingSetupOptions): Promise<PartialSetupState> {
205-
const packagePolicies = await packagePolicyClient.list(soClient, {});
206-
return {
207-
policies: {
208-
symbolizer: {
209-
installed: packagePolicies.items.some((pkg) => pkg.name === SYMBOLIZER_PACKAGE_POLICY_NAME),
210-
},
211-
},
212-
};
242+
const symbolizerPackagePolicy = await getSymbolizerPolicy({ soClient, packagePolicyClient });
243+
return { policies: { symbolizer: { installed: !!symbolizerPackagePolicy } } };
213244
}
214245

215246
export async function createSymbolizerPackagePolicy({

x-pack/plugins/profiling/server/lib/setup/get_setup_instructions.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@
77

88
import { SavedObjectsClientContract } from '@kbn/core/server';
99
import { PackagePolicyClient } from '@kbn/fleet-plugin/server';
10-
import { getApmPolicy } from './get_apm_policy';
10+
import { getCollectorPolicy, getSymbolizerPolicy } from './fleet_policies';
1111

1212
export interface SetupDataCollectionInstructions {
1313
variables: {
14-
apmServerUrl: string;
15-
secretToken: string;
14+
collector: {
15+
secretToken: string;
16+
host: string;
17+
};
18+
symbolizer: {
19+
host: string;
20+
};
1621
};
1722
}
1823

@@ -23,18 +28,31 @@ export async function getSetupInstructions({
2328
packagePolicyClient: PackagePolicyClient;
2429
soClient: SavedObjectsClientContract;
2530
}): Promise<SetupDataCollectionInstructions> {
26-
const apmPolicy = await getApmPolicy({ packagePolicyClient, soClient });
31+
const [collectorPolicy, symbolizerPolicy] = await Promise.all([
32+
getCollectorPolicy({ packagePolicyClient, soClient }),
33+
getSymbolizerPolicy({ packagePolicyClient, soClient }),
34+
]);
2735

28-
if (!apmPolicy) {
29-
throw new Error('Could not find APM policy');
36+
if (!collectorPolicy) {
37+
throw new Error('Could not find Collector policy');
3038
}
3139

32-
const apmServerVars = apmPolicy.inputs[0].vars;
40+
if (!symbolizerPolicy) {
41+
throw new Error('Could not find Symbolizer policy');
42+
}
43+
44+
const collectorVars = collectorPolicy.inputs[0].vars;
45+
const symbolizerVars = symbolizerPolicy.inputs[0].vars;
3346

3447
return {
3548
variables: {
36-
apmServerUrl: apmServerVars!.url.value!,
37-
secretToken: apmServerVars!.secret_token.value!,
49+
collector: {
50+
secretToken: collectorVars!.secret_token.value!,
51+
host: collectorVars!.host.value,
52+
},
53+
symbolizer: {
54+
host: symbolizerVars!.host.value,
55+
},
3856
},
3957
};
4058
}

0 commit comments

Comments
 (0)