From bfd801078f6b7f9624c3c6e8adcd46a1f3259137 Mon Sep 17 00:00:00 2001 From: Oliver Gupte Date: Tue, 29 Jun 2021 12:03:54 -0400 Subject: [PATCH] [APM] Migrate to data streams - Fleet on Cloud (#102682) * [APM] Adds migration to fleet-managed APM server in APM UI Settings (#100657) * adds useStrictParams option to apm server routes to allow unknown record type in param.bopy * Adds checks for required roles, policies, and config before allowing user to initiate migration * refactored and cleaned up server-side code * i18n and link to Fleet * fixes linting issues and unit tests * updates the apm package policy to 0.3.0 and adds some missing config mappings * PR feedback * Handles case where the cloud policy doesn't exist * Reverts the addition of the useStrictParams option since strictKeysRt now supports records * fixes default input var values and uses correct published package version * displays reasons the switch to data streams is disabled * Store apm-server schema with the internal saved objects client --- .../apm/common/apm_saved_object_constants.ts | 4 + .../Settings/schema/blog-rocket-720x420.png | Bin 0 -> 116012 bytes .../Settings/schema/confirm_switch_modal.tsx | 143 +++++++ .../components/app/Settings/schema/index.tsx | 137 +++++++ .../app/Settings/schema/schema_overview.tsx | 355 ++++++++++++++++++ .../components/routing/apm_route_config.tsx | 19 + .../routing/templates/settings_template.tsx | 10 +- .../shared/Links/ElasticDocsLink.tsx | 10 +- .../public/components/shared/Links/kibana.ts | 9 + x-pack/plugins/apm/server/index.test.ts | 6 +- x-pack/plugins/apm/server/index.ts | 6 + .../fleet/create_cloud_apm_package_policy.ts | 50 +++ .../get_apm_package_policy_definition.ts | 176 +++++++++ .../lib/fleet/get_cloud_apm_package_policy.ts | 44 +++ .../get_unsupported_apm_server_schema.ts | 30 ++ .../apm/server/lib/fleet/is_superuser.ts | 20 + x-pack/plugins/apm/server/plugin.ts | 3 +- x-pack/plugins/apm/server/routes/fleet.ts | 137 ++++++- .../get_global_apm_server_route_repository.ts | 4 +- .../saved_objects/apm_server_settings.ts | 32 ++ .../plugins/apm/server/saved_objects/index.ts | 1 + 21 files changed, 1179 insertions(+), 17 deletions(-) create mode 100644 x-pack/plugins/apm/public/components/app/Settings/schema/blog-rocket-720x420.png create mode 100644 x-pack/plugins/apm/public/components/app/Settings/schema/confirm_switch_modal.tsx create mode 100644 x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx create mode 100644 x-pack/plugins/apm/public/components/app/Settings/schema/schema_overview.tsx create mode 100644 x-pack/plugins/apm/server/lib/fleet/create_cloud_apm_package_policy.ts create mode 100644 x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts create mode 100644 x-pack/plugins/apm/server/lib/fleet/get_cloud_apm_package_policy.ts create mode 100644 x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts create mode 100644 x-pack/plugins/apm/server/lib/fleet/is_superuser.ts create mode 100644 x-pack/plugins/apm/server/saved_objects/apm_server_settings.ts diff --git a/x-pack/plugins/apm/common/apm_saved_object_constants.ts b/x-pack/plugins/apm/common/apm_saved_object_constants.ts index c8e8f893ad3e..7d9e571242af 100644 --- a/x-pack/plugins/apm/common/apm_saved_object_constants.ts +++ b/x-pack/plugins/apm/common/apm_saved_object_constants.ts @@ -15,3 +15,7 @@ export const APM_INDICES_SAVED_OBJECT_ID = 'apm-indices'; // APM telemetry export const APM_TELEMETRY_SAVED_OBJECT_TYPE = 'apm-telemetry'; export const APM_TELEMETRY_SAVED_OBJECT_ID = 'apm-telemetry'; + +// APM Server schema +export const APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE = 'apm-server-schema'; +export const APM_SERVER_SCHEMA_SAVED_OBJECT_ID = 'apm-server-schema'; diff --git a/x-pack/plugins/apm/public/components/app/Settings/schema/blog-rocket-720x420.png b/x-pack/plugins/apm/public/components/app/Settings/schema/blog-rocket-720x420.png new file mode 100644 index 0000000000000000000000000000000000000000..c444e7641e3fb1e93e52fad27795425196390766 GIT binary patch literal 116012 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 z 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

{!OP-P!8{Fg0S%+hh|?Xf>%)M{ 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/apm/public/components/app/Settings/schema/confirm_switch_modal.tsx b/x-pack/plugins/apm/public/components/app/Settings/schema/confirm_switch_modal.tsx new file mode 100644 index 000000000000..47e83fa079e6 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/Settings/schema/confirm_switch_modal.tsx @@ -0,0 +1,143 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { + EuiConfirmModal, + EuiCallOut, + EuiCheckbox, + EuiSpacer, + EuiCodeBlock, + htmlIdGenerator, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ElasticDocsLink } from '../../../shared/Links/ElasticDocsLink'; + +interface Props { + onConfirm: () => void; + onCancel: () => void; + unsupportedConfigs: Array<{ key: string; value: string }>; + isLoading: boolean; +} +export function ConfirmSwitchModal({ + onConfirm, + onCancel, + unsupportedConfigs, + isLoading, +}: Props) { + const [isConfirmChecked, setIsConfirmChecked] = useState(false); + const hasUnsupportedConfigs = !!unsupportedConfigs.length; + return ( + +

+ {i18n.translate('xpack.apm.settings.schema.confirm.descriptionText', { + defaultMessage: + 'If you have custom dashboards, machine learning jobs, or source maps that use classic APM indices, you must reconfigure them for data streams. Stack monitoring is not currently supported with Fleet-managed APM.', + })} +

+ {!hasUnsupportedConfigs && ( +

+ {i18n.translate( + 'xpack.apm.settings.schema.confirm.unsupportedConfigs.descriptionText', + { + defaultMessage: `Compatible custom apm-server.yml user settings will be moved to Fleet Server settings for you. We'll let you know which settings are incompatible before removing them.`, + } + )} +

+ )} + +

+ {i18n.translate( + 'xpack.apm.settings.schema.confirm.irreversibleWarning.message', + { + defaultMessage: `It might temporarily affect your APM data collection while the migration is in progress. The process of migrating should only take a few minutes.`, + } + )} +

+
+ + {hasUnsupportedConfigs && ( + <> + + + {unsupportedConfigs + .map(({ key, value }) => `${key}: ${JSON.stringify(value)}`) + .join('\n')} + +

+ + {i18n.translate( + 'xpack.apm.settings.schema.confirm.apmServerSettingsCloudLinkText', + { defaultMessage: 'Go to APM Server settings in Cloud' } + )} + +

+
+ + + )} +

+ { + setIsConfirmChecked(e.target.checked); + }} + disabled={isLoading} + /> +

+ + ); +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx new file mode 100644 index 000000000000..fee072470f05 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx @@ -0,0 +1,137 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { NotificationsStart } from 'kibana/public'; +import { SchemaOverview } from './schema_overview'; +import { ConfirmSwitchModal } from './confirm_switch_modal'; +import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; +import { + callApmApi, + APIReturnType, +} from '../../../../services/rest/createCallApmApi'; +import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; + +type FleetMigrationCheckResponse = APIReturnType<'GET /api/apm/fleet/migration_check'>; + +export function Schema() { + const { toasts } = useApmPluginContext().core.notifications; + const [isSwitchActive, setIsSwitchActive] = useState(false); + const [isLoadingMigration, setIsLoadingMigration] = useState(false); + const [isLoadingConfirmation, setIsLoadingConfirmation] = useState(false); + const [unsupportedConfigs, setUnsupportedConfigs] = useState< + Array<{ key: string; value: any }> + >([]); + + const { + refetch, + data = {} as FleetMigrationCheckResponse, + status, + } = useFetcher( + (callApi) => callApi({ endpoint: 'GET /api/apm/fleet/migration_check' }), + [], + { preservePreviousData: false } + ); + const isLoading = status !== FETCH_STATUS.SUCCESS; + const cloudApmMigrationEnabled = !!data.cloud_apm_migration_enabled; + const hasCloudAgentPolicy = !!data.has_cloud_agent_policy; + const hasCloudApmPackagePolicy = !!data.has_cloud_apm_package_policy; + const hasRequiredRole = !!data.has_required_role; + return ( + <> + { + setIsLoadingConfirmation(true); + const unsupported = await getUnsupportedApmServerConfigs(toasts); + if (!unsupported) { + setIsLoadingConfirmation(false); + return; + } + setUnsupportedConfigs(unsupported); + setIsLoadingConfirmation(false); + setIsSwitchActive(true); + }} + isMigrated={hasCloudApmPackagePolicy} + isLoading={isLoading} + isLoadingConfirmation={isLoadingConfirmation} + cloudApmMigrationEnabled={cloudApmMigrationEnabled} + hasCloudAgentPolicy={hasCloudAgentPolicy} + hasRequiredRole={hasRequiredRole} + /> + {isSwitchActive && ( + { + setIsLoadingMigration(true); + const apmPackagePolicy = await createCloudApmPackagePolicy(toasts); + if (!apmPackagePolicy) { + setIsLoadingMigration(false); + return; + } + setIsSwitchActive(false); + refetch(); + }} + onCancel={() => { + if (isLoadingMigration) { + return; + } + setIsSwitchActive(false); + }} + unsupportedConfigs={unsupportedConfigs} + /> + )} + + ); +} + +async function getUnsupportedApmServerConfigs( + toasts: NotificationsStart['toasts'] +) { + try { + const { unsupported } = await callApmApi({ + endpoint: 'GET /api/apm/fleet/apm_server_schema/unsupported', + signal: null, + }); + return unsupported; + } catch (error) { + toasts.addDanger({ + title: i18n.translate( + 'xpack.apm.settings.unsupportedConfigs.errorToast.title', + { + defaultMessage: 'Unable to fetch APM Server settings', + } + ), + text: error.body?.message || error.message, + }); + } +} + +async function createCloudApmPackagePolicy( + toasts: NotificationsStart['toasts'] +) { + try { + const { + cloud_apm_package_policy: cloudApmPackagePolicy, + } = await callApmApi({ + endpoint: 'POST /api/apm/fleet/cloud_apm_package_policy', + signal: null, + }); + return cloudApmPackagePolicy; + } catch (error) { + toasts.addDanger({ + title: i18n.translate( + 'xpack.apm.settings.createApmPackagePolicy.errorToast.title', + { + defaultMessage: + 'Unable to create APM package policy on cloud agent policy', + } + ), + text: error.body?.message || error.message, + }); + } +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/schema/schema_overview.tsx b/x-pack/plugins/apm/public/components/app/Settings/schema/schema_overview.tsx new file mode 100644 index 000000000000..1005c09cb11b --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/Settings/schema/schema_overview.tsx @@ -0,0 +1,355 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiTitle, + EuiText, + EuiCard, + EuiIcon, + EuiButton, + EuiCallOut, + EuiLoadingSpinner, + EuiToolTip, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { ElasticDocsLink } from '../../../shared/Links/ElasticDocsLink'; +import rocketLaunchGraphic from './blog-rocket-720x420.png'; +import { APMLink } from '../../../shared/Links/apm/APMLink'; +import { useFleetCloudAgentPolicyHref } from '../../../shared/Links/kibana'; + +interface Props { + onSwitch: () => void; + isMigrated: boolean; + isLoading: boolean; + isLoadingConfirmation: boolean; + cloudApmMigrationEnabled: boolean; + hasCloudAgentPolicy: boolean; + hasRequiredRole: boolean; +} +export function SchemaOverview({ + onSwitch, + isMigrated, + isLoading, + isLoadingConfirmation, + cloudApmMigrationEnabled, + hasCloudAgentPolicy, + hasRequiredRole, +}: Props) { + const fleetCloudAgentPolicyHref = useFleetCloudAgentPolicyHref(); + const isDisabled = + !cloudApmMigrationEnabled || !hasCloudAgentPolicy || !hasRequiredRole; + + if (isLoading) { + return ( + <> + + + + + + ); + } + + if (isMigrated) { + return ( + <> + + + + + + } + title={i18n.translate('xpack.apm.settings.schema.success.title', { + defaultMessage: 'Data streams successfully setup!', + })} + description={i18n.translate( + 'xpack.apm.settings.schema.success.description', + { + defaultMessage: + 'Your APM integration is now setup and ready to receive data from your currently instrumented agents. Feel free to review the policies applied to your integtration.', + } + )} + footer={ +
+ + {i18n.translate( + 'xpack.apm.settings.schema.success.viewIntegrationInFleet.buttonText', + { defaultMessage: 'View the APM integration in Fleet' } + )} + + + +

+ + {i18n.translate( + 'xpack.apm.settings.schema.success.returnText.serviceInventoryLink', + { defaultMessage: 'Service inventory' } + )} + + ), + }} + /> +

+
+
+ } + /> +
+ +
+ + ); + } + + return ( + <> + + + + + } + title={i18n.translate( + 'xpack.apm.settings.schema.migrate.classicIndices.title', + { defaultMessage: 'Classic APM indices' } + )} + display="subdued" + description={i18n.translate( + 'xpack.apm.settings.schema.migrate.classicIndices.description', + { + defaultMessage: + 'You are currently using classic APM indices for your data. This data schema is going away and is being replaced by data streams in Elastic Stack version 8.0.', + } + )} + footer={ +
+ +

+ {i18n.translate( + 'xpack.apm.settings.schema.migrate.classicIndices.currentSetup', + { defaultMessage: 'Current setup' } + )} +

+
+
+ } + /> +
+ + + rocket launch + + } + title={i18n.translate( + 'xpack.apm.settings.schema.migrate.dataStreams.title', + { defaultMessage: 'Data streams' } + )} + description={i18n.translate( + 'xpack.apm.settings.schema.migrate.dataStreams.description', + { + defaultMessage: + 'Going forward, any newly ingested data gets stored in data streams. Previously ingested data remains in classic APM indices. The APM and UX apps will continue to support both indices.', + } + )} + footer={ +
+ + + {i18n.translate( + 'xpack.apm.settings.schema.migrate.dataStreams.buttonText', + { defaultMessage: 'Switch to data streams' } + )} + + +
+ } + onClick={onSwitch} + isDisabled={isDisabled} + /> +
+ +
+ + + + + +

+ {i18n.translate( + 'xpack.apm.settings.schema.migrate.calloutNote.message', + { + defaultMessage: + 'If you have custom dashboards, machine learning jobs, or source maps that use classic APM indices, you must reconfigure them for data streams.', + } + )} +

+
+
+ +
+ + ); +} + +export function SchemaOverviewHeading() { + return ( + <> + + + {i18n.translate( + 'xpack.apm.settings.schema.descriptionText.irreversibleEmphasisText', + { defaultMessage: 'irreversible' } + )} + + ), + superuserEmphasis: ( + + {i18n.translate( + 'xpack.apm.settings.schema.descriptionText.superuserEmphasisText', + { defaultMessage: 'superuser' } + )} + + ), + dataStreamsDocLink: ( + + {i18n.translate( + 'xpack.apm.settings.schema.descriptionText.dataStreamsDocLinkText', + { defaultMessage: 'data streams' } + )} + + ), + }} + /> + + + + + +

+ {i18n.translate('xpack.apm.settings.schema.title', { + defaultMessage: 'Schema', + })} +

+
+
+
+ + + ); +} + +function getDisabledReason({ + cloudApmMigrationEnabled, + hasCloudAgentPolicy, + hasRequiredRole, +}: { + cloudApmMigrationEnabled: boolean; + hasCloudAgentPolicy: boolean; + hasRequiredRole: boolean; +}) { + const reasons: string[] = []; + if (!cloudApmMigrationEnabled) { + reasons.push( + i18n.translate( + 'xpack.apm.settings.schema.disabledReason.cloudApmMigrationEnabled', + { defaultMessage: 'Cloud migration is not enabled' } + ) + ); + } + if (!hasCloudAgentPolicy) { + reasons.push( + i18n.translate( + 'xpack.apm.settings.schema.disabledReason.hasCloudAgentPolicy', + { defaultMessage: 'Cloud agent policy does not exist' } + ) + ); + } + if (!hasRequiredRole) { + reasons.push( + i18n.translate( + 'xpack.apm.settings.schema.disabledReason.hasRequiredRole', + { defaultMessage: 'User does not have superuser role' } + ) + ); + } + if (reasons.length) { + return ( + + {reasons.map((reasonText, index) => ( +
  • - {reasonText}
  • + ))} + + ), + }} + /> + ); + } +} diff --git a/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx b/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx index 36580d38e660..5214489c9142 100644 --- a/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx +++ b/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx @@ -19,6 +19,7 @@ import { AgentConfigurations } from '../app/Settings/AgentConfigurations'; import { AnomalyDetection } from '../app/Settings/anomaly_detection'; import { ApmIndices } from '../app/Settings/ApmIndices'; import { CustomizeUI } from '../app/Settings/CustomizeUI'; +import { Schema } from '../app/Settings/schema'; import { TraceLink } from '../app/TraceLink'; import { TransactionLink } from '../app/transaction_link'; import { TransactionDetails } from '../app/transaction_details'; @@ -250,6 +251,14 @@ function SettingsCustomizeUI() { ); } +function SettingsSchema() { + return ( + + + + ); +} + export function EditAgentConfigurationRouteView(props: RouteComponentProps) { const { search } = props.history.location; @@ -315,6 +324,10 @@ const SettingsCustomizeUITitle = i18n.translate( 'xpack.apm.views.settings.customizeUI.title', { defaultMessage: 'Customize app' } ); +const SettingsSchemaTitle = i18n.translate( + 'xpack.apm.views.settings.schema.title', + { defaultMessage: 'Schema' } +); const SettingsAnomalyDetectionTitle = i18n.translate( 'xpack.apm.views.settings.anomalyDetection.title', { defaultMessage: 'Anomaly detection' } @@ -395,6 +408,12 @@ export const apmRouteConfig: APMRouteDefinition[] = [ component: SettingsCustomizeUI, breadcrumb: SettingsCustomizeUITitle, }, + { + exact: true, + path: '/settings/schema', + component: SettingsSchema, + breadcrumb: SettingsSchemaTitle, + }, { exact: true, path: '/settings/anomaly-detection', diff --git a/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx index 0e610722a76e..a76b46473151 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx @@ -20,7 +20,8 @@ type Tab = NonNullable[0] & { | 'agent-configurations' | 'anomaly-detection' | 'apm-indices' - | 'customize-ui'; + | 'customize-ui' + | 'schema'; hidden?: boolean; }; @@ -100,6 +101,13 @@ function getTabs({ }), href: getAPMHref({ basePath, path: `/settings/apm-indices`, search }), }, + { + key: 'schema', + label: i18n.translate('xpack.apm.settings.schema', { + defaultMessage: 'Schema', + }), + href: getAPMHref({ basePath, path: `/settings/schema`, search }), + }, ]; return tabs diff --git a/x-pack/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx index 6d9d38328968..5a7cc4623ea7 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx @@ -10,7 +10,13 @@ import React from 'react'; import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; // union type constisting of valid guide sections that we link to -type DocsSection = '/apm/get-started' | '/x-pack' | '/apm/server' | '/kibana'; +type DocsSection = + | '/apm/get-started' + | '/x-pack' + | '/apm/server' + | '/kibana' + | '/elasticsearch/reference' + | '/cloud'; interface Props extends EuiLinkAnchorProps { section: DocsSection; @@ -20,7 +26,7 @@ interface Props extends EuiLinkAnchorProps { export function ElasticDocsLink({ section, path, children, ...rest }: Props) { const { docLinks } = useApmPluginContext().core; const baseUrl = docLinks.ELASTIC_WEBSITE_URL; - const version = docLinks.DOC_LINK_VERSION; + const version = section === '/cloud' ? 'current' : docLinks.DOC_LINK_VERSION; const href = `${baseUrl}guide/en${section}/${version}${path}`; return typeof children === 'function' ? ( diff --git a/x-pack/plugins/apm/public/components/shared/Links/kibana.ts b/x-pack/plugins/apm/public/components/shared/Links/kibana.ts index f974a7e29ae4..bfb7cf849f56 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/kibana.ts +++ b/x-pack/plugins/apm/public/components/shared/Links/kibana.ts @@ -17,3 +17,12 @@ export function useUpgradeAssistantHref() { return getUpgradeAssistantHref(core.http.basePath); } + +export function useFleetCloudAgentPolicyHref() { + const { + core: { + http: { basePath }, + }, + } = useApmPluginContext(); + return basePath.prepend('/app/fleet#/policies/policy-elastic-agent-on-cloud'); +} diff --git a/x-pack/plugins/apm/server/index.test.ts b/x-pack/plugins/apm/server/index.test.ts index 006a21b59745..226dfd6e95bd 100644 --- a/x-pack/plugins/apm/server/index.test.ts +++ b/x-pack/plugins/apm/server/index.test.ts @@ -25,6 +25,7 @@ describe('mergeConfigs', () => { ui: { enabled: false }, enabled: true, metricsInterval: 2000, + agent: { migrations: { enabled: true } }, } as APMXPackConfig; expect(mergeConfigs(apmOssConfig, apmConfig)).toEqual({ @@ -35,6 +36,7 @@ describe('mergeConfigs', () => { 'apm_oss.transactionIndices': 'apm-*-transaction-*', 'xpack.apm.metricsInterval': 2000, 'xpack.apm.ui.enabled': false, + 'xpack.apm.agent.migrations.enabled': true, }); }); @@ -47,7 +49,7 @@ describe('mergeConfigs', () => { fleetMode: true, } as APMOSSConfig; - const apmConfig = { ui: {} } as APMXPackConfig; + const apmConfig = { ui: {}, agent: { migrations: {} } } as APMXPackConfig; expect(mergeConfigs(apmOssConfig, apmConfig)).toEqual({ 'apm_oss.errorIndices': 'logs-apm*,apm-*-error-*', @@ -66,7 +68,7 @@ describe('mergeConfigs', () => { fleetMode: false, } as APMOSSConfig; - const apmConfig = { ui: {} } as APMXPackConfig; + const apmConfig = { ui: {}, agent: { migrations: {} } } as APMXPackConfig; expect(mergeConfigs(apmOssConfig, apmConfig)).toEqual({ 'apm_oss.errorIndices': 'apm-*-error-*', diff --git a/x-pack/plugins/apm/server/index.ts b/x-pack/plugins/apm/server/index.ts index 9ab56c1a303e..413efcdb7881 100644 --- a/x-pack/plugins/apm/server/index.ts +++ b/x-pack/plugins/apm/server/index.ts @@ -49,6 +49,11 @@ export const config = { maxServiceEnvironments: schema.number({ defaultValue: 100 }), maxServiceSelection: schema.number({ defaultValue: 50 }), profilingEnabled: schema.boolean({ defaultValue: false }), + agent: schema.object({ + migrations: schema.object({ + enabled: schema.boolean({ defaultValue: false }), + }), + }), }), }; @@ -94,6 +99,7 @@ export function mergeConfigs( 'xpack.apm.searchAggregatedTransactions': apmConfig.searchAggregatedTransactions, 'xpack.apm.metricsInterval': apmConfig.metricsInterval, + 'xpack.apm.agent.migrations.enabled': apmConfig.agent.migrations.enabled, }; if (apmOssConfig.fleetMode) { diff --git a/x-pack/plugins/apm/server/lib/fleet/create_cloud_apm_package_policy.ts b/x-pack/plugins/apm/server/lib/fleet/create_cloud_apm_package_policy.ts new file mode 100644 index 000000000000..9e3095a8d1bc --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/create_cloud_apm_package_policy.ts @@ -0,0 +1,50 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + ElasticsearchClient, + SavedObjectsClientContract, + Logger, +} from 'kibana/server'; +import { + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + APM_SERVER_SCHEMA_SAVED_OBJECT_ID, +} from '../../../common/apm_saved_object_constants'; +import { APMPluginStartDependencies } from '../../types'; +import { getApmPackagePolicyDefinition } from './get_apm_package_policy_definition'; + +export async function createCloudApmPackgePolicy({ + fleetPluginStart, + savedObjectsClient, + esClient, + logger, +}: { + fleetPluginStart: NonNullable; + savedObjectsClient: SavedObjectsClientContract; + esClient: ElasticsearchClient; + logger: Logger; +}) { + const { attributes } = await savedObjectsClient.get( + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + APM_SERVER_SCHEMA_SAVED_OBJECT_ID + ); + const apmServerSchema: Record = JSON.parse( + (attributes as { schemaJson: string }).schemaJson + ); + const apmPackagePolicyDefinition = getApmPackagePolicyDefinition( + apmServerSchema + ); + logger.info(`Fleet migration on Cloud - apmPackagePolicy create start`); + const apmPackagePolicy = await fleetPluginStart.packagePolicyService.create( + savedObjectsClient, + esClient, + apmPackagePolicyDefinition, + { force: true, bumpRevision: true } + ); + logger.info(`Fleet migration on Cloud - apmPackagePolicy create end`); + return apmPackagePolicy; +} diff --git a/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts new file mode 100644 index 000000000000..fb88a092cb26 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts @@ -0,0 +1,176 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + POLICY_ELASTIC_AGENT_ON_CLOUD, + APM_PACKAGE_NAME, +} from './get_cloud_apm_package_policy'; + +export function getApmPackagePolicyDefinition( + apmServerSchema: Record +) { + return { + name: 'apm', + namespace: 'default', + enabled: true, + policy_id: POLICY_ELASTIC_AGENT_ON_CLOUD, + output_id: '', + inputs: [ + { + type: 'apm', + enabled: true, + streams: [], + vars: getApmPackageInputVars(apmServerSchema), + }, + ], + package: { + name: APM_PACKAGE_NAME, + version: '0.3.0-dev.1', + title: 'Elastic APM', + }, + }; +} + +function getApmPackageInputVars(apmServerSchema: Record) { + const apmServerConfigs = Object.entries( + apmConfigMapping + ).map(([key, { name, type }]) => ({ key, name, type })); + + const inputVars: Record< + string, + { type: string; value: any } + > = apmServerConfigs.reduce((acc, { key, name, type }) => { + const value = apmServerSchema[key] ?? ''; // defaults to an empty string to be edited in Fleet UI + return { + ...acc, + [name]: { type, value }, + }; + }, {}); + return inputVars; +} + +export const apmConfigMapping: Record< + string, + { name: string; type: string } +> = { + 'apm-server.host': { + name: 'host', + type: 'text', + }, + 'apm-server.url': { + name: 'url', + type: 'text', + }, + 'apm-server.secret_token': { + name: 'secret_token', + type: 'text', + }, + 'apm-server.api_key.enabled': { + name: 'api_key_enabled', + type: 'bool', + }, + 'apm-server.rum.enabled': { + name: 'enable_rum', + type: 'bool', + }, + 'apm-server.default_service_environment': { + name: 'default_service_environment', + type: 'text', + }, + 'apm-server.rum.allow_service_names': { + name: 'rum_allow_service_names', + type: 'text', + }, + 'apm-server.rum.allow_origins': { + name: 'rum_allow_origins', + type: 'text', + }, + 'apm-server.rum.allow_headers': { + name: 'rum_allow_headers', + type: 'text', + }, + 'apm-server.rum.response_headers': { + name: 'rum_response_headers', + type: 'yaml', + }, + 'apm-server.rum.event_rate.limit': { + name: 'rum_event_rate_limit', + type: 'integer', + }, + 'apm-server.rum.event_rate.lru_size': { + name: 'rum_event_rate_lru_size', + type: 'integer', + }, + 'apm-server.api_key.limit': { + name: 'api_key_limit', + type: 'integer', + }, + 'apm-server.max_event_size': { + name: 'max_event_bytes', + type: 'integer', + }, + 'apm-server.capture_personal_data': { + name: 'capture_personal_data', + type: 'bool', + }, + 'apm-server.max_header_size': { + name: 'max_header_bytes', + type: 'integer', + }, + 'apm-server.idle_timeout': { + name: 'idle_timeout', + type: 'text', + }, + 'apm-server.read_timeout': { + name: 'read_timeout', + type: 'text', + }, + 'apm-server.shutdown_timeout': { + name: 'shutdown_timeout', + type: 'text', + }, + 'apm-server.write_timeout': { + name: 'write_timeout', + type: 'text', + }, + 'apm-server.max_connections': { + name: 'max_connections', + type: 'integer', + }, + 'apm-server.response_headers': { + name: 'response_headers', + type: 'yaml', + }, + 'apm-server.expvar.enabled': { + name: 'expvar_enabled', + type: 'bool', + }, + 'apm-server.ssl.enabled': { + name: 'tls_enabled', + type: 'bool', + }, + 'apm-server.ssl.certificate': { + name: 'tls_certificate', + type: 'text', + }, + 'apm-server.ssl.key': { + name: 'tls_key', + type: 'text', + }, + 'apm-server.ssl.supported_protocols': { + name: 'tls_supported_protocols', + type: 'text', + }, + 'apm-server.ssl.cipher_suites': { + name: 'tls_cipher_suites', + type: 'text', + }, + 'apm-server.ssl.curve_types': { + name: 'tls_curve_types', + type: 'text', + }, +}; diff --git a/x-pack/plugins/apm/server/lib/fleet/get_cloud_apm_package_policy.ts b/x-pack/plugins/apm/server/lib/fleet/get_cloud_apm_package_policy.ts new file mode 100644 index 000000000000..b0044701e402 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/get_cloud_apm_package_policy.ts @@ -0,0 +1,44 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SavedObjectsClientContract } from 'kibana/server'; +import { Maybe } from '../../../typings/common'; +import { AgentPolicy, PackagePolicy } from '../../../../fleet/common'; +import { APMPluginStartDependencies } from '../../types'; + +export const POLICY_ELASTIC_AGENT_ON_CLOUD = 'policy-elastic-agent-on-cloud'; +export const APM_PACKAGE_NAME = 'apm'; + +export async function getCloudAgentPolicy({ + fleetPluginStart, + savedObjectsClient, +}: { + fleetPluginStart: NonNullable; + savedObjectsClient: SavedObjectsClientContract; +}) { + try { + return await fleetPluginStart.agentPolicyService.get( + savedObjectsClient, + POLICY_ELASTIC_AGENT_ON_CLOUD + ); + } catch (error) { + if (error?.output.statusCode === 404) { + return; + } + throw error; + } +} + +export function getApmPackagePolicy(agentPolicy: Maybe) { + if (!agentPolicy) { + return; + } + const packagePolicies = agentPolicy.package_policies as PackagePolicy[]; + return packagePolicies.find( + (packagePolicy) => packagePolicy?.package?.name === APM_PACKAGE_NAME + ); +} diff --git a/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts b/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts new file mode 100644 index 000000000000..5fec3c94cf7a --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts @@ -0,0 +1,30 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SavedObjectsClientContract } from 'kibana/server'; +import { + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + APM_SERVER_SCHEMA_SAVED_OBJECT_ID, +} from '../../../common/apm_saved_object_constants'; +import { apmConfigMapping } from './get_apm_package_policy_definition'; + +export async function getUnsupportedApmServerSchema({ + savedObjectsClient, +}: { + savedObjectsClient: SavedObjectsClientContract; +}) { + const { attributes } = await savedObjectsClient.get( + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + APM_SERVER_SCHEMA_SAVED_OBJECT_ID + ); + const apmServerSchema: Record = JSON.parse( + (attributes as { schemaJson: string }).schemaJson + ); + return Object.entries(apmServerSchema) + .filter(([name]) => !(name in apmConfigMapping)) + .map(([key, value]) => ({ key, value })); +} diff --git a/x-pack/plugins/apm/server/lib/fleet/is_superuser.ts b/x-pack/plugins/apm/server/lib/fleet/is_superuser.ts new file mode 100644 index 000000000000..1e4e596ab76e --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/is_superuser.ts @@ -0,0 +1,20 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { KibanaRequest } from 'kibana/server'; +import { APMPluginStartDependencies } from '../../types'; + +export function isSuperuser({ + securityPluginStart, + request, +}: { + securityPluginStart: NonNullable; + request: KibanaRequest; +}) { + const user = securityPluginStart.authc.getCurrentUser(request); + return user?.roles.includes('superuser'); +} diff --git a/x-pack/plugins/apm/server/plugin.ts b/x-pack/plugins/apm/server/plugin.ts index c9391eba29f8..dd422e51550a 100644 --- a/x-pack/plugins/apm/server/plugin.ts +++ b/x-pack/plugins/apm/server/plugin.ts @@ -31,7 +31,7 @@ import { getInternalSavedObjectsClient } from './lib/helpers/get_internal_saved_ import { createApmAgentConfigurationIndex } from './lib/settings/agent_configuration/create_agent_config_index'; import { getApmIndices } from './lib/settings/apm_indices/get_apm_indices'; import { createApmCustomLinkIndex } from './lib/settings/custom_link/create_custom_link_index'; -import { apmIndices, apmTelemetry } from './saved_objects'; +import { apmIndices, apmTelemetry, apmServerSettings } from './saved_objects'; import { uiSettings } from './ui_settings'; import type { ApmPluginRequestHandlerContext, @@ -78,6 +78,7 @@ export class APMPlugin core.savedObjects.registerType(apmIndices); core.savedObjects.registerType(apmTelemetry); + core.savedObjects.registerType(apmServerSettings); core.uiSettings.register(uiSettings); diff --git a/x-pack/plugins/apm/server/routes/fleet.ts b/x-pack/plugins/apm/server/routes/fleet.ts index 01323add276d..7d2080c894ec 100644 --- a/x-pack/plugins/apm/server/routes/fleet.ts +++ b/x-pack/plugins/apm/server/routes/fleet.ts @@ -7,18 +7,24 @@ import { keyBy } from 'lodash'; import Boom from '@hapi/boom'; +import * as t from 'io-ts'; import { i18n } from '@kbn/i18n'; +import { + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + APM_SERVER_SCHEMA_SAVED_OBJECT_ID, +} from '../../common/apm_saved_object_constants'; import { getFleetAgents } from '../lib/fleet/get_agents'; import { getApmPackgePolicies } from '../lib/fleet/get_apm_package_policies'; import { createApmServerRoute } from './create_apm_server_route'; import { createApmServerRouteRepository } from './create_apm_server_route_repository'; - -const FLEET_REQUIRED_MESSAGE = i18n.translate( - 'xpack.apm.fleet_has_data.fleetRequired', - { - defaultMessage: `Fleet plugin is required`, - } -); +import { + getCloudAgentPolicy, + getApmPackagePolicy, +} from '../lib/fleet/get_cloud_apm_package_policy'; +import { createCloudApmPackgePolicy } from '../lib/fleet/create_cloud_apm_package_policy'; +import { getUnsupportedApmServerSchema } from '../lib/fleet/get_unsupported_apm_server_schema'; +import { isSuperuser } from '../lib/fleet/is_superuser'; +import { getInternalSavedObjectsClient } from '../lib/helpers/get_internal_saved_objects_client'; const hasFleetDataRoute = createApmServerRoute({ endpoint: 'GET /api/apm/fleet/has_data', @@ -84,6 +90,119 @@ const fleetAgentsRoute = createApmServerRoute({ }, }); -export const ApmFleetRouteRepository = createApmServerRouteRepository() +const saveApmServerSchemaRoute = createApmServerRoute({ + endpoint: 'POST /api/apm/fleet/apm_server_schema', + options: { tags: ['access:apm', 'access:apm_write'] }, + params: t.type({ + body: t.type({ + schema: t.record(t.string, t.unknown), + }), + }), + handler: async (resources) => { + const { params, logger, core } = resources; + const savedObjectsClient = await getInternalSavedObjectsClient(core.setup); + const { schema } = params.body; + await savedObjectsClient.create( + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + { schemaJson: JSON.stringify(schema) }, + { id: APM_SERVER_SCHEMA_SAVED_OBJECT_ID, overwrite: true } + ); + logger.info(`Stored apm-server schema.`); + }, +}); + +const getUnsupportedApmServerSchemaRoute = createApmServerRoute({ + endpoint: 'GET /api/apm/fleet/apm_server_schema/unsupported', + options: { tags: ['access:apm'] }, + handler: async (resources) => { + const { context } = resources; + const savedObjectsClient = context.core.savedObjects.client; + return { + unsupported: await getUnsupportedApmServerSchema({ savedObjectsClient }), + }; + }, +}); + +const getMigrationCheckRoute = createApmServerRoute({ + endpoint: 'GET /api/apm/fleet/migration_check', + options: { tags: ['access:apm'] }, + handler: async (resources) => { + const { plugins, context, config, request } = resources; + const cloudApmMigrationEnabled = + config['xpack.apm.agent.migrations.enabled']; + if (!plugins.fleet || !plugins.security) { + throw Boom.internal(FLEET_SECURITY_REQUIRED_MESSAGE); + } + const savedObjectsClient = context.core.savedObjects.client; + const fleetPluginStart = await plugins.fleet.start(); + const securityPluginStart = await plugins.security.start(); + const hasRequiredRole = isSuperuser({ securityPluginStart, request }); + const cloudAgentPolicy = await getCloudAgentPolicy({ + savedObjectsClient, + fleetPluginStart, + }); + return { + has_cloud_agent_policy: !!cloudAgentPolicy, + has_cloud_apm_package_policy: !!getApmPackagePolicy(cloudAgentPolicy), + cloud_apm_migration_enabled: cloudApmMigrationEnabled, + has_required_role: hasRequiredRole, + }; + }, +}); + +const createCloudApmPackagePolicyRoute = createApmServerRoute({ + endpoint: 'POST /api/apm/fleet/cloud_apm_package_policy', + options: { tags: ['access:apm', 'access:apm_write'] }, + handler: async (resources) => { + const { plugins, context, config, request, logger } = resources; + const cloudApmMigrationEnabled = + config['xpack.apm.agent.migrations.enabled']; + if (!plugins.fleet || !plugins.security) { + throw Boom.internal(FLEET_SECURITY_REQUIRED_MESSAGE); + } + const savedObjectsClient = context.core.savedObjects.client; + const coreStart = await resources.core.start(); + const esClient = coreStart.elasticsearch.client.asScoped(resources.request) + .asCurrentUser; + const fleetPluginStart = await plugins.fleet.start(); + const securityPluginStart = await plugins.security.start(); + const hasRequiredRole = isSuperuser({ securityPluginStart, request }); + if (!hasRequiredRole || !cloudApmMigrationEnabled) { + throw Boom.forbidden(CLOUD_SUPERUSER_REQUIRED_MESSAGE); + } + return { + cloud_apm_package_policy: await createCloudApmPackgePolicy({ + fleetPluginStart, + savedObjectsClient, + esClient, + logger, + }), + }; + }, +}); + +export const apmFleetRouteRepository = createApmServerRouteRepository() .add(hasFleetDataRoute) - .add(fleetAgentsRoute); + .add(fleetAgentsRoute) + .add(saveApmServerSchemaRoute) + .add(getUnsupportedApmServerSchemaRoute) + .add(getMigrationCheckRoute) + .add(createCloudApmPackagePolicyRoute); + +const FLEET_REQUIRED_MESSAGE = i18n.translate( + 'xpack.apm.fleet_has_data.fleetRequired', + { defaultMessage: `Fleet plugin is required` } +); + +const FLEET_SECURITY_REQUIRED_MESSAGE = i18n.translate( + 'xpack.apm.api.fleet.fleetSecurityRequired', + { defaultMessage: `Fleet and Security plugins are required` } +); + +const CLOUD_SUPERUSER_REQUIRED_MESSAGE = i18n.translate( + 'xpack.apm.api.fleet.cloud_apm_package_policy.requiredRoleOnCloud', + { + defaultMessage: + 'Operation only permitted by Elastic Cloud users with the superuser role.', + } +); diff --git a/x-pack/plugins/apm/server/routes/get_global_apm_server_route_repository.ts b/x-pack/plugins/apm/server/routes/get_global_apm_server_route_repository.ts index fa2f80f07395..4a277e2a4233 100644 --- a/x-pack/plugins/apm/server/routes/get_global_apm_server_route_repository.ts +++ b/x-pack/plugins/apm/server/routes/get_global_apm_server_route_repository.ts @@ -15,6 +15,7 @@ import { correlationsRouteRepository } from './correlations'; import { createApmServerRouteRepository } from './create_apm_server_route_repository'; import { environmentsRouteRepository } from './environments'; import { errorsRouteRepository } from './errors'; +import { apmFleetRouteRepository } from './fleet'; import { indexPatternRouteRepository } from './index_pattern'; import { metricsRouteRepository } from './metrics'; import { observabilityOverviewRouteRepository } from './observability_overview'; @@ -30,7 +31,6 @@ import { sourceMapsRouteRepository } from './source_maps'; import { traceRouteRepository } from './traces'; import { transactionRouteRepository } from './transactions'; import { APMRouteHandlerResources } from './typings'; -import { ApmFleetRouteRepository } from './fleet'; const getTypedGlobalApmServerRouteRepository = () => { const repository = createApmServerRouteRepository() @@ -52,7 +52,7 @@ const getTypedGlobalApmServerRouteRepository = () => { .merge(apmIndicesRouteRepository) .merge(customLinkRouteRepository) .merge(sourceMapsRouteRepository) - .merge(ApmFleetRouteRepository); + .merge(apmFleetRouteRepository); return repository; }; diff --git a/x-pack/plugins/apm/server/saved_objects/apm_server_settings.ts b/x-pack/plugins/apm/server/saved_objects/apm_server_settings.ts new file mode 100644 index 000000000000..84c52e85c439 --- /dev/null +++ b/x-pack/plugins/apm/server/saved_objects/apm_server_settings.ts @@ -0,0 +1,32 @@ +/* + * 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SavedObjectsType } from 'src/core/server'; +import { i18n } from '@kbn/i18n'; +import { APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE } from '../../common/apm_saved_object_constants'; + +export const apmServerSettings: SavedObjectsType = { + name: APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + hidden: false, + namespaceType: 'agnostic', + mappings: { + properties: { + schemaJson: { + type: 'text', + index: false, + }, + }, + }, + management: { + importableAndExportable: false, + icon: 'apmApp', + getTitle: () => + i18n.translate('xpack.apm.apmSchema.index', { + defaultMessage: 'APM Server Schema - Index', + }), + }, +}; diff --git a/x-pack/plugins/apm/server/saved_objects/index.ts b/x-pack/plugins/apm/server/saved_objects/index.ts index 370137af3dd4..ba4285a23896 100644 --- a/x-pack/plugins/apm/server/saved_objects/index.ts +++ b/x-pack/plugins/apm/server/saved_objects/index.ts @@ -7,3 +7,4 @@ export { apmIndices } from './apm_indices'; export { apmTelemetry } from './apm_telemetry'; +export { apmServerSettings } from './apm_server_settings';