"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.AddDataTabs = void 0; exports.AddDataView = AddDataView; var _i18n = require("@kbn/i18n"); var _react = _interopRequireDefault(require("react")); var _eui = require("@elastic/eui"); var _i18nReact = require("@kbn/i18n-react"); var _major = _interopRequireDefault(require("semver/functions/major")); var _use_profiling_params = require("../../hooks/use_profiling_params"); var _use_profiling_router = require("../../hooks/use_profiling_router"); var _use_profiling_route_path = require("../../hooks/use_profiling_route_path"); var _use_async = require("../../hooks/use_async"); var _use_profiling_dependencies = require("../../components/contexts/profiling_dependencies/use_profiling_dependencies"); var _profiling_app_page_template = require("../../components/profiling_app_page_template"); /* * 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. */ let AddDataTabs; exports.AddDataTabs = AddDataTabs; (function (AddDataTabs) { AddDataTabs["Kubernetes"] = "kubernetes"; AddDataTabs["Docker"] = "docker"; AddDataTabs["Binary"] = "binary"; AddDataTabs["Deb"] = "deb"; AddDataTabs["RPM"] = "rpm"; AddDataTabs["ElasticAgentIntegration"] = "elasticAgentIntegration"; AddDataTabs["Symbols"] = "symbols"; })(AddDataTabs || (exports.AddDataTabs = AddDataTabs = {})); function AddDataView() { var _data$collector, _data$collector2, _data$symbolizer, _displayedTab$steps; const { query } = (0, _use_profiling_params.useProfilingParams)('/add-data-instructions'); const { selectedTab } = query; const profilingRouter = (0, _use_profiling_router.useProfilingRouter)(); const routePath = (0, _use_profiling_route_path.useProfilingRoutePath)(); const { services: { setupDataCollectionInstructions }, start: { core } } = (0, _use_profiling_dependencies.useProfilingDependencies)(); const { data, status } = (0, _use_async.useAsync)(({ http }) => { return setupDataCollectionInstructions({ http }); }, [setupDataCollectionInstructions]); const secretToken = data === null || data === void 0 ? void 0 : (_data$collector = data.collector) === null || _data$collector === void 0 ? void 0 : _data$collector.secretToken; const collectionAgentHost = data === null || data === void 0 ? void 0 : (_data$collector2 = data.collector) === null || _data$collector2 === void 0 ? void 0 : _data$collector2.host; const symbolUrl = data === null || data === void 0 ? void 0 : (_data$symbolizer = data.symbolizer) === null || _data$symbolizer === void 0 ? void 0 : _data$symbolizer.host; const stackVersion = data === null || data === void 0 ? void 0 : data.stackVersion; const majorVersion = stackVersion ? (0, _major.default)(stackVersion).toString() : undefined; const tabs = [{ key: AddDataTabs.Kubernetes, title: _i18n.i18n.translate('xpack.profiling.tabs.kubernetesTitle', { defaultMessage: 'Kubernetes' }), steps: [{ title: _i18n.i18n.translate('xpack.profiling.tabs.kubernetesRepositoryStep', { defaultMessage: 'Configure the Universal Profiling host-agent Helm repository:' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, "helm repo add elastic https://helm.elastic.co") }, { title: _i18n.i18n.translate('xpack.profiling.tabs.kubernetesInstallStep', { defaultMessage: 'Install host-agent via Helm:' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `helm install --create-namespace -n=universal-profiling universal-profiling-agent \\ --set "projectID=1,secretToken=${secretToken}" \\ --set "collectionAgentHostPort=${collectionAgentHost}" \\ --set "version=${stackVersion}" \\ --version=${stackVersion} \\ elastic/pf-host-agent`) }, { title: _i18n.i18n.translate('xpack.profiling.tabs.kubernetesValidationStep', { defaultMessage: 'Validate the host-agent pods are running:' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, "kubectl -n universal-profiling get pods") }, { title: _i18n.i18n.translate('xpack.profiling.tabs.postValidationStep', { defaultMessage: 'Use the Helm install output to get host-agent logs and spot potential errors' }), content: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null) }] }, { key: AddDataTabs.Docker, title: _i18n.i18n.translate('xpack.profiling.tabs.dockerTitle', { defaultMessage: 'Docker' }), steps: [{ title: _i18n.i18n.translate('xpack.profiling.tabs.dockerRunContainerStep', { defaultMessage: 'Run the Universal Profiling container:' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `docker run --name pf-host-agent --privileged --pid=host -v /etc/machine-id:/etc/machine-id:ro \\ -v /var/run/docker.sock:/var/run/docker.sock -v /sys/kernel/debug:/sys/kernel/debug:ro \\ docker.elastic.co/observability/profiling-agent:${stackVersion} /root/pf-host-agent \\ -project-id=1 -secret-token=${secretToken} \\ -collection-agent=${collectionAgentHost}`) }] }, { key: AddDataTabs.Binary, title: _i18n.i18n.translate('xpack.profiling.tabs.binaryTitle', { defaultMessage: 'Binary' }), steps: [{ title: _i18n.i18n.translate('xpack.profiling.tabs.binaryDownloadStep', { defaultMessage: 'Download the binary for the right architecture:' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiText, null, /*#__PURE__*/_react.default.createElement("b", null, "For x86_64:"), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "s" }), /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `wget -O pf-host-agent.tgz "https://artifacts.elastic.co/downloads/prodfiler/pf-host-agent-${stackVersion}-linux-x86_64.tar.gz" && tar xzf pf-host-agent.tgz`), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "m" }), /*#__PURE__*/_react.default.createElement("b", null, "For ARM64:"), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "s" }), /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `wget -O pf-host-agent.tgz "https://artifacts.elastic.co/downloads/prodfiler/pf-host-agent-${stackVersion}-linux-arm64.tar.gz" && tar xzf pf-host-agent.tgz`)) }, { title: _i18n.i18n.translate('xpack.profiling.tabs.binaryGrantPermissionStep', { defaultMessage: 'Grant executable permissions:' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, "chmod +x pf-host-agent/pf-host-agent") }, { title: _i18n.i18n.translate('xpack.profiling.tabs.binaryRunHostAgentStep', { defaultMessage: 'Run the Universal Profiling host-agent (requires root privileges):' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `sudo pf-host-agent/pf-host-agent -project-id=1 -secret-token=${secretToken} -collection-agent=${collectionAgentHost}`) }] }, { key: AddDataTabs.Deb, title: _i18n.i18n.translate('xpack.profiling.tabs.debTitle', { defaultMessage: 'DEB Package' }), steps: [{ title: _i18n.i18n.translate('xpack.profiling.tabs.debConfigureRepoStep', { defaultMessage: 'Configure the apt repository (requires root privileges):' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - sudo apt-get install apt-transport-https echo "deb https://artifacts.elastic.co/packages/${majorVersion}.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-${majorVersion}.x.list `) }, { title: _i18n.i18n.translate('xpack.profiling.tabs.debInstallPackageStep', { defaultMessage: 'Install the DEB package (requires root privileges):' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `sudo apt-get update && sudo apt-get install pf-host-agent`) }, { title: _i18n.i18n.translate('xpack.profiling.tabs.debEditConfigStep', { defaultMessage: 'Edit the configuration (requires root privileges):' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `echo -e "project-id 1\nsecret-token ${secretToken}\ncollection-agent ${collectionAgentHost}" | sudo tee -a /etc/Elastic/universal-profiling/pf-host-agent.conf`) }, { title: _i18n.i18n.translate('xpack.profiling.tabs.debStartSystemdServiceStep', { defaultMessage: 'Start the Universal Profiling systemd service (requires root privileges):' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `sudo systemctl enable pf-host-agent && sudo systemctl restart pf-host-agent`) }] }, { key: AddDataTabs.RPM, title: _i18n.i18n.translate('xpack.profiling.tabs.rpmTitle', { defaultMessage: 'RPM Package' }), steps: [{ title: _i18n.i18n.translate('xpack.profiling.tabs.rpmConfigureRepoStep', { defaultMessage: 'Configure the yum repository (requires root privileges):' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch cat < /etc/yum.repos.d/elastic.repo [elastic-${majorVersion}.x] name=Elastic repository for ${majorVersion}.x packages baseurl=https://artifacts.elastic.co/packages/${majorVersion}.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md EOF`) }, { title: _i18n.i18n.translate('xpack.profiling.tabs.rpmInstallPackageStep', { defaultMessage: 'Install the RPM package (requires root privileges):' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `sudo yum install pf-host-agent`) }, { title: _i18n.i18n.translate('xpack.profiling.tabs.rpmEditConfigStep', { defaultMessage: 'Edit the configuration (requires root privileges):' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `echo -e "project-id 1\nsecret-token ${secretToken}\ncollection-agent ${collectionAgentHost}" | sudo tee -a /etc/Elastic/universal-profiling/pf-host-agent.conf`) }, { title: _i18n.i18n.translate('xpack.profiling.tabs.rpmStartSystemdServiceStep', { defaultMessage: 'Start the Universal Profiling systemd service (requires root privileges):' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `sudo systemctl enable pf-host-agent && sudo systemctl restart pf-host-agent`) }] }, { key: AddDataTabs.ElasticAgentIntegration, title: _i18n.i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.title', { defaultMessage: 'Elastic Agent Integration' }), steps: [{ title: _i18n.i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step1', { defaultMessage: 'Copy credentials' }), content: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_eui.EuiText, null, _i18n.i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step1.hint', { defaultMessage: "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." })), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, null), /*#__PURE__*/_react.default.createElement(_eui.EuiText, { style: { fontWeight: 'bold' }, size: "s" }, _i18n.i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step1.secretToken', { defaultMessage: 'Secret token:' })), /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, secretToken), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "s" }), /*#__PURE__*/_react.default.createElement(_eui.EuiText, { style: { fontWeight: 'bold' }, size: "s" }, _i18n.i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step1.collectionAgentUrl', { defaultMessage: 'Universal Profiling Collector URL:' })), /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, collectionAgentHost)) }, { title: _i18n.i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step2', { defaultMessage: 'Fleet' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiButton, { iconType: "gear", fill: true, href: `${core.http.basePath.prepend(`/app/integrations/detail/profiler_agent-${data === null || data === void 0 ? void 0 : data.profilerAgent.version}/overview`)}` }, _i18n.i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step2.button', { defaultMessage: 'Manage Universal Profiling agent in Fleet' })) }] }, { key: AddDataTabs.Symbols, title: _i18n.i18n.translate('xpack.profiling.tabs.symbols.title', { defaultMessage: 'Upload Symbols' }), steps: [{ title: _i18n.i18n.translate('xpack.profiling.tabs.symbols.step1', { defaultMessage: 'Download and extract symbtool' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiText, null, /*#__PURE__*/_react.default.createElement("b", null, "For x86_64:"), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "s" }), /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `wget -O symbtool-amd64.tgz "https://artifacts.elastic.co/downloads/prodfiler/symbtool-${stackVersion}-linux-x86_64.tar.gz" && tar xzf symbtool-amd64.tgz && cd symbtool-*-linux-x86_64`), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "m" }), /*#__PURE__*/_react.default.createElement("b", null, "For ARM64:"), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "s" }), /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `wget -O symbtool-arm64.tgz "https://artifacts.elastic.co/downloads/prodfiler/pf-host-agent-${stackVersion}-linux-arm64.tar.gz" && tar xzf symbtool-arm64.tgz && cd symbtool-*-linux-arm64`)) }, { title: _i18n.i18n.translate('xpack.profiling.tabs.symbols.step2', { defaultMessage: 'Generate an Elasticsearch token' }), content: /*#__PURE__*/_react.default.createElement(_eui.EuiText, null, /*#__PURE__*/_react.default.createElement(_eui.EuiLink, { target: "_blank", href: `https://www.elastic.co/guide/en/kibana/master/api-keys.html` }, _i18n.i18n.translate('xpack.profiling.tabs.symbols.step2.instructions', { defaultMessage: 'Instructions here' }))) }, { title: _i18n.i18n.translate('xpack.profiling.tabs.symbols.step3', { defaultMessage: 'Upload symbols' }), content: /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_eui.EuiCodeBlock, { paddingSize: "s", isCopyable: true }, `./symbtool push-symbols executable -u "${symbolUrl}" -t -e `), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "m" }), /*#__PURE__*/_react.default.createElement(_eui.EuiText, null, /*#__PURE__*/_react.default.createElement(_i18nReact.FormattedMessage, { id: "xpack.profiling.tabs.symbols.step3.replace", defaultMessage: "Replace {es_token} etc. with the actual values. You can pass {help} to obtain a list of other arguments.", values: { es_token: /*#__PURE__*/_react.default.createElement(_eui.EuiCode, null, ``), help: /*#__PURE__*/_react.default.createElement(_eui.EuiCode, null, "--help") } })), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "s" }), /*#__PURE__*/_react.default.createElement(_eui.EuiText, null, /*#__PURE__*/_react.default.createElement(_i18nReact.FormattedMessage, { id: "xpack.profiling.tabs.symbols.step3.doc-ref", defaultMessage: "Documentation for more advanced uses cases is available in {link}.", values: { link: /*#__PURE__*/_react.default.createElement(_eui.EuiLink, { target: "_blank", href: `${core.docLinks.ELASTIC_WEBSITE_URL}/guide/en/observability/${core.docLinks.DOC_LINK_VERSION}/profiling-add-symbols.html` }, _i18n.i18n.translate('xpack.profiling.tabs.symbols.step3.doc-ref.link', { defaultMessage: 'the corresponding documentation page' })) } }))) }] }]; const displayedTab = tabs.find(tab => tab.key === selectedTab); const displayedSteps = (_displayedTab$steps = displayedTab.steps) !== null && _displayedTab$steps !== void 0 ? _displayedTab$steps : []; const isLoading = status === _use_async.AsyncStatus.Loading; return /*#__PURE__*/_react.default.createElement(_profiling_app_page_template.ProfilingAppPageTemplate, { tabs: [], restrictWidth: true, hideSearchBar: true, pageTitle: /*#__PURE__*/_react.default.createElement(_eui.EuiFlexGroup, { direction: "row", alignItems: "center" }, /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: false }, /*#__PURE__*/_react.default.createElement(_eui.EuiIcon, { type: "logoObservability", size: "m" })), /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: false }, _i18n.i18n.translate('xpack.profiling.noDataPage.pageTitle', { defaultMessage: 'Add profiling data' })), isLoading ? /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, null, /*#__PURE__*/_react.default.createElement(_eui.EuiLoadingSpinner, null)) : null) }, isLoading ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_eui.EuiCallOut, { color: "warning", iconType: "help", title: /*#__PURE__*/_react.default.createElement(_i18nReact.FormattedMessage, { id: "xpack.profiling.tabs.debWarning", defaultMessage: "Due to a {linuxLink} which impacts stability, the profiling agent will refuse to run on kernel versions {versionFrom} to {versionTo}. Refer to {debianLink} and {fedoraLink} to learn more. If you are running such a kernel with a backported fix, please refer to {advancedLink} for instructions to override the precautionary measure.", values: { versionFrom: /*#__PURE__*/_react.default.createElement("strong", null, "5.19"), versionTo: /*#__PURE__*/_react.default.createElement("strong", null, "6.4"), linuxLink: /*#__PURE__*/_react.default.createElement(_eui.EuiLink, { target: "_blank", href: "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d319f344561de23e810515d109c7278919bff7b0" }, _i18n.i18n.translate('xpack.profiling.tabs.debWarning.linuxLink', { defaultMessage: 'Linux kernel bug' })), debianLink: /*#__PURE__*/_react.default.createElement(_eui.EuiLink, { target: "_blank", href: "https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1033398" }, _i18n.i18n.translate('xpack.profiling.tabs.debWarning.debianLink', { defaultMessage: 'Debian' })), fedoraLink: /*#__PURE__*/_react.default.createElement(_eui.EuiLink, { target: "_blank", href: "https://bugzilla.redhat.com/show_bug.cgi?id=2211455" }, _i18n.i18n.translate('xpack.profiling.tabs.debWarning.fedoraLink', { defaultMessage: 'Fedora/CentOS' })), advancedLink: /*#__PURE__*/_react.default.createElement(_eui.EuiLink, { target: "_blank", href: `${core.docLinks.ELASTIC_WEBSITE_URL}/guide/en/observability/${core.docLinks.DOC_LINK_VERSION}/profiling-advanced-configuration.html` }, _i18n.i18n.translate('xpack.profiling.tabs.debWarning.advancedLink', { defaultMessage: 'Advanced configuration' })) } }) }), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, null), /*#__PURE__*/_react.default.createElement(_eui.EuiText, null, _i18n.i18n.translate('xpack.profiling.noDataPage.addDataTitle', { defaultMessage: 'Select an option below to deploy the host-agent.' })), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, null), /*#__PURE__*/_react.default.createElement(_eui.EuiSplitPanel.Outer, null, /*#__PURE__*/_react.default.createElement(_eui.EuiPanel, { hasBorder: false, hasShadow: false, grow: false, paddingSize: "none" }, /*#__PURE__*/_react.default.createElement(_eui.EuiSplitPanel.Inner, { color: "subdued", paddingSize: "none" }, /*#__PURE__*/_react.default.createElement(_eui.EuiTabs, { style: { padding: '0 24px' } }, tabs.map(tab => { return /*#__PURE__*/_react.default.createElement(_eui.EuiTab, { key: tab.key, onClick: () => { profilingRouter.push(routePath, { path: {}, query: { selectedTab: tab.key } }); }, isSelected: tab.key === selectedTab }, tab.title); }))), /*#__PURE__*/_react.default.createElement(_eui.EuiSplitPanel.Inner, { style: { padding: '0 24px' } }, /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "xxl" }), /*#__PURE__*/_react.default.createElement(_eui.EuiSteps, { steps: displayedSteps.map(step => { return { title: step.title, children: step.content, status: 'incomplete' }; }) })))))); }