kibana/packages/react/kibana_context/root
Tim Sullivan 704e080c93
Integrate Event-Based Telemetry in KibanaErrorBoundary (#169895)
## Summary

Part of https://github.com/elastic/kibana-team/issues/646
Depends on https://github.com/elastic/kibana/pull/169324

Implements telemetry for fatal errors caught by KibanaErrorBoundary in:
-
`packages/core/application/core-application-browser-internal/src/ui/app_router.tsx`
- `packages/kbn-shared-ux-utility/src/with_suspense.tsx` [*]
- `packages/react/kibana_context/render/render_provider.tsx` [*]
-
`src/plugins/management/public/components/management_app/management_router.tsx`
-
`x-pack/plugins/observability_shared/public/components/page_template/page_template.tsx`
- `x-pack/plugins/security_solution/public/app/app.tsx`

[*] The changes made to these allowed the `analytics` dependency to be
provided optionally, to avoid a breaking API change for maintainers.

## Logging screenshot
You can trigger a fatal error in the new error boundary component in
most places in Kibana by adding a TypeError to a React component:
`<p>{breakHere()}</p>`
<img width="1586" alt="fatal error telemetry console log"
src="97f973ac-bb25-41f2-bfe2-547a23f2f450">

## Telemetry work info
Dashboard:
<img width="1382" alt="image"
src="4fe5353a-61ba-405a-ac18-0dd6a044c182">
Discover:
<img width="1331" alt="image"
src="2161b552-c441-4b7c-adef-25896147c08a">

### Checklist

- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
2023-11-03 12:55:00 -07:00
..
eui_provider.test.tsx
eui_provider.tsx Upgrade EUI to v89.1.0 (#169135) 2023-10-19 11:41:06 -07:00
index.ts [regression] Handle deprecated KibanaThemeProvider uses to include KibanaRenderContextProvider (#163103) 2023-08-04 09:11:31 -07:00
jest.config.js
kibana.jsonc
package.json
README.mdx Integrate Event-Based Telemetry in KibanaErrorBoundary (#169895) 2023-11-03 12:55:00 -07:00
root_provider.test.tsx Integrate Event-Based Telemetry in KibanaErrorBoundary (#169895) 2023-11-03 12:55:00 -07:00
root_provider.tsx Integrate Event-Based Telemetry in KibanaErrorBoundary (#169895) 2023-11-03 12:55:00 -07:00
tsconfig.json Integrate Event-Based Telemetry in KibanaErrorBoundary (#169895) 2023-11-03 12:55:00 -07:00

---
id: react/context/root
slug: /react/context/root
title: React Context - Root
description: This context provider is used only used by the very base root of Kibana.  Unless you're writing tests, a Storybook, or working in core code, you likely don't need this.
tags: ['shared-ux', 'react', 'context']
date: 2023-07-25
---

## Description

This package contains a root context provider for Kibana rendering.  It handles operations that should only happen _once_ when the browser loads a page.

While it would be safer to isolate this in a `core` package, we need to use it in other contexts-- like Storybook and Jest.

```ts
import React, { useEffect } from 'react';
import { BehaviorSubject } from 'rxjs';

import { I18nProvider } from '@kbn/i18n-react';
import { KibanaRootContextProvider } from '@kbn/react-kibana-context-root';
import { action } from '@storybook/addon-actions';

import type { DecoratorFn } from '@storybook/react';
import type { CoreTheme } from '@kbn/core-theme-browser';
import type { I18nStart } from '@kbn/core-i18n-browser';

const theme$ = new BehaviorSubject<CoreTheme>({ darkMode: false });

const analytics = {
  reportEvent: action('telemetry-report-event'),
};

const i18n: I18nStart = {
  Context: ({ children }) => <I18nProvider>{children}</I18nProvider>,
};

export const KibanaContextDecorator: DecoratorFn = (storyFn, { globals }) => {
  const colorMode = globals.euiTheme === 'v8.dark' ? 'dark' : 'light';

  useEffect(() => {
    theme$.next({ darkMode: colorMode === 'dark' });
  }, [colorMode]);

  return (
    <KibanaRootContextProvider {...{ theme: { theme$ }, analytics, i18n }}>
      {storyFn()}
    </KibanaRootContextProvider>
  );
};
```