Skip to content

Commit

Permalink
[APM] Create plugin for logs onboarding (#154728)
Browse files Browse the repository at this point in the history
Closes #154733

Creates a new plugin for logs onboarding with wizard to organize steps
into discrete views.

#### TODO:
- [x] rename plugin to observability_onboarding
- [x] configure: UI and server plugin
- [x] enable/disable new plugin
- [x] remove the link to it from Observability nav

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Yngrid Coello <yngrid.coello@elastic.co>
Co-authored-by: Yngrid Coello <yngrdyn@gmail.com>
  • Loading branch information
4 people authored Apr 25, 2023
1 parent 4dda8cf commit 0772456
Show file tree
Hide file tree
Showing 41 changed files with 2,280 additions and 0 deletions.
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,7 @@ x-pack/plugins/notifications @elastic/appex-sharedux
packages/kbn-object-versioning @elastic/appex-sharedux
x-pack/packages/observability/alert_details @elastic/actionable-observability
x-pack/test/cases_api_integration/common/plugins/observability @elastic/response-ops
x-pack/plugins/observability_onboarding @elastic/apm-ui
x-pack/plugins/observability @elastic/actionable-observability
x-pack/plugins/observability_shared @elastic/actionable-observability
x-pack/test/security_api_integration/plugins/oidc_provider @elastic/kibana-security
Expand Down
4 changes: 4 additions & 0 deletions docs/developer/plugin-list.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,10 @@ Elastic.
|This plugin provides shared components and services for use across observability solutions, as well as the observability landing page UI.
|{kib-repo}blob/{branch}/x-pack/plugins/observability_onboarding/README.md[observabilityOnboarding]
|This plugin provides an onboarding framework for observability solutions: Logs and APM.
|{kib-repo}blob/{branch}/x-pack/plugins/observability_shared/README.md[observabilityShared]
|A plugin that contains components and utilities shared by all Observability plugins.
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,7 @@
"@kbn/object-versioning": "link:packages/kbn-object-versioning",
"@kbn/observability-alert-details": "link:x-pack/packages/observability/alert_details",
"@kbn/observability-fixtures-plugin": "link:x-pack/test/cases_api_integration/common/plugins/observability",
"@kbn/observability-onboarding-plugin": "link:x-pack/plugins/observability_onboarding",
"@kbn/observability-plugin": "link:x-pack/plugins/observability",
"@kbn/observability-shared-plugin": "link:x-pack/plugins/observability_shared",
"@kbn/oidc-provider-plugin": "link:x-pack/test/security_api_integration/plugins/oidc_provider",
Expand Down
1 change: 1 addition & 0 deletions packages/kbn-optimizer/limits.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ pageLoadAssetSize:
navigation: 37269
newsfeed: 42228
observability: 95000
observabilityOnboarding: 19573
observabilityShared: 21266
osquery: 107090
painlessLab: 179748
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) {
'xpack.observability.unsafe.alertDetails.metrics.enabled (boolean)',
'xpack.observability.unsafe.alertDetails.logs.enabled (boolean)',
'xpack.observability.unsafe.alertDetails.uptime.enabled (boolean)',
'xpack.observability_onboarding.ui.enabled (boolean)',
];
// We don't assert that actualExposedConfigKeys and expectedExposedConfigKeys are equal, because test failure messages with large
// arrays are hard to grok. Instead, we take the difference between the two arrays and assert them separately, that way it's
Expand Down
2 changes: 2 additions & 0 deletions tsconfig.base.json
Original file line number Diff line number Diff line change
Expand Up @@ -952,6 +952,8 @@
"@kbn/observability-alert-details/*": ["x-pack/packages/observability/alert_details/*"],
"@kbn/observability-fixtures-plugin": ["x-pack/test/cases_api_integration/common/plugins/observability"],
"@kbn/observability-fixtures-plugin/*": ["x-pack/test/cases_api_integration/common/plugins/observability/*"],
"@kbn/observability-onboarding-plugin": ["x-pack/plugins/observability_onboarding"],
"@kbn/observability-onboarding-plugin/*": ["x-pack/plugins/observability_onboarding/*"],
"@kbn/observability-plugin": ["x-pack/plugins/observability"],
"@kbn/observability-plugin/*": ["x-pack/plugins/observability/*"],
"@kbn/observability-shared-plugin": ["x-pack/plugins/observability_shared"],
Expand Down
1 change: 1 addition & 0 deletions x-pack/.i18nrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"xpack.monitoring": ["plugins/monitoring"],
"xpack.observability": "plugins/observability",
"xpack.observabilityShared": "plugins/observability_shared",
"xpack.observability_onboarding": "plugins/observability_onboarding",
"xpack.osquery": ["plugins/osquery"],
"xpack.painlessLab": "plugins/painless_lab",
"xpack.profiling": ["plugins/profiling"],
Expand Down
4 changes: 4 additions & 0 deletions x-pack/plugins/observability_onboarding/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"singleQuote": true,
"semi": true
}
3 changes: 3 additions & 0 deletions x-pack/plugins/observability_onboarding/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Observability onboarding plugin

This plugin provides an onboarding framework for observability solutions: Logs and APM.
14 changes: 14 additions & 0 deletions x-pack/plugins/observability_onboarding/common/fetch_options.ts
Original file line number Diff line number Diff line change
@@ -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
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

import type { HttpFetchOptions } from '@kbn/core/public';

export type FetchOptions = Omit<HttpFetchOptions, 'body'> & {
pathname: string;
method?: string;
body?: any;
};
9 changes: 9 additions & 0 deletions x-pack/plugins/observability_onboarding/common/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/*
* 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.
*/

export const PLUGIN_ID = 'observabilityOnboarding';
export const PLUGIN_NAME = 'observabilityOnboarding';
14 changes: 14 additions & 0 deletions x-pack/plugins/observability_onboarding/jest.config.js
Original file line number Diff line number Diff line change
@@ -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
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

const path = require('path');

module.exports = {
preset: '@kbn/test',
rootDir: path.resolve(__dirname, '../../..'),
roots: ['<rootDir>/x-pack/plugins/observability_onboarding'],
};
23 changes: 23 additions & 0 deletions x-pack/plugins/observability_onboarding/kibana.jsonc
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"type": "plugin",
"id": "@kbn/observability-onboarding-plugin",
"owner": "@elastic/apm-ui",
"plugin": {
"id": "observabilityOnboarding",
"server": true,
"browser": true,
"configPath": ["xpack", "observability_onboarding"],
"requiredPlugins": [
"data",
"observability",
],
"optionalPlugins": [
"cloud",
"usageCollection",
],
"requiredBundles": [
"kibanaReact"
],
"extraPublicDirs": ["common"]
}
}
179 changes: 179 additions & 0 deletions x-pack/plugins/observability_onboarding/public/application/app.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
/*
* 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 { EuiErrorBoundary } from '@elastic/eui';
import { Theme, ThemeProvider } from '@emotion/react';
import {
APP_WRAPPER_CLASS,
AppMountParameters,
CoreStart,
} from '@kbn/core/public';
import { i18n } from '@kbn/i18n';
import {
KibanaContextProvider,
KibanaThemeProvider,
RedirectAppLinks,
useKibana,
useUiSetting$,
} from '@kbn/kibana-react-plugin/public';
import { useBreadcrumbs } from '@kbn/observability-plugin/public';
import { RouterProvider, createRouter } from '@kbn/typed-react-router-config';
import { euiDarkVars, euiLightVars } from '@kbn/ui-theme';
import React from 'react';
import ReactDOM from 'react-dom';
import { Redirect, RouteComponentProps, RouteProps } from 'react-router-dom';
import { Home } from '../components/app/home';
import {
ObservabilityOnboardingPluginSetupDeps,
ObservabilityOnboardingPluginStartDeps,
} from '../plugin';

export type BreadcrumbTitle<
T extends { [K in keyof T]?: string | undefined } = {}
> = string | ((props: RouteComponentProps<T>) => string) | null;

export interface RouteDefinition<
T extends { [K in keyof T]?: string | undefined } = any
> extends RouteProps {
breadcrumb: BreadcrumbTitle<T>;
}

export const onBoardingTitle = i18n.translate(
'xpack.observability_onboarding.breadcrumbs.onboarding',
{
defaultMessage: 'Onboarding',
}
);

export const onboardingRoutes: RouteDefinition[] = [
{
exact: true,
path: '/',
render: () => <Redirect to="/observabilityOnboarding" />,
breadcrumb: onBoardingTitle,
},
];

function ObservabilityOnboardingApp() {
const [darkMode] = useUiSetting$<boolean>('theme:darkMode');

const { http } = useKibana<ObservabilityOnboardingPluginStartDeps>().services;
const basePath = http.basePath.get();

useBreadcrumbs([
{
text: onBoardingTitle,
href: basePath + '/app/observabilityOnboarding',
},
{
text: i18n.translate('xpack.observability_onboarding.breadcrumbs.logs', {
defaultMessage: 'Logs',
}),
},
]);

return (
<ThemeProvider
theme={(outerTheme?: Theme) => ({
...outerTheme,
eui: darkMode ? euiDarkVars : euiLightVars,
darkMode,
})}
>
<div className={APP_WRAPPER_CLASS} data-test-subj="csmMainContainer">
<Home />
</div>
</ThemeProvider>
);
}

export const observabilityOnboardingRouter = createRouter({});

export function ObservabilityOnboardingAppRoot({
appMountParameters,
core,
deps,
corePlugins: { observability, data },
}: {
appMountParameters: AppMountParameters;
core: CoreStart;
deps: ObservabilityOnboardingPluginSetupDeps;
corePlugins: ObservabilityOnboardingPluginStartDeps;
}) {
const { history } = appMountParameters;
const i18nCore = core.i18n;
const plugins = { ...deps };

return (
<RedirectAppLinks
className={APP_WRAPPER_CLASS}
application={core.application}
>
<KibanaContextProvider
services={{
...core,
...plugins,
observability,
data,
}}
>
<KibanaThemeProvider
theme$={appMountParameters.theme$}
modify={{
breakpoint: {
xxl: 1600,
xxxl: 2000,
},
}}
>
<i18nCore.Context>
<RouterProvider
history={history}
router={observabilityOnboardingRouter}
>
<EuiErrorBoundary>
<ObservabilityOnboardingApp />
</EuiErrorBoundary>
</RouterProvider>
</i18nCore.Context>
</KibanaThemeProvider>
</KibanaContextProvider>
</RedirectAppLinks>
);
}

/**
* This module is rendered asynchronously in the Kibana platform.
*/

export const renderApp = ({
core,
deps,
appMountParameters,
corePlugins,
}: {
core: CoreStart;
deps: ObservabilityOnboardingPluginSetupDeps;
appMountParameters: AppMountParameters;
corePlugins: ObservabilityOnboardingPluginStartDeps;
}) => {
const { element } = appMountParameters;

ReactDOM.render(
<ObservabilityOnboardingAppRoot
appMountParameters={appMountParameters}
core={core}
deps={deps}
corePlugins={corePlugins}
/>,
element
);
return () => {
corePlugins.data.search.session.clear();
ReactDOM.unmountComponentAtNode(element);
};
};
Loading

0 comments on commit 0772456

Please sign in to comment.