From 775af952516ae0240939cd7ded8903e01a7690c2 Mon Sep 17 00:00:00 2001 From: Gabriel Bernal Date: Wed, 11 Oct 2023 13:22:58 +0200 Subject: [PATCH 1/3] add observability ui operator proposal --- .../observability-ui-operator.md | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 enhancements/observability-ui/observability-ui-operator.md diff --git a/enhancements/observability-ui/observability-ui-operator.md b/enhancements/observability-ui/observability-ui-operator.md new file mode 100644 index 0000000000..7a51d85ea9 --- /dev/null +++ b/enhancements/observability-ui/observability-ui-operator.md @@ -0,0 +1,265 @@ +--- +title: observability-ui-operator +authors: + - "@jgbernalp" +reviewers: # Include a comment about what domain expertise a reviewer is expected to bring and what area of the enhancement you expect them to focus on. For example: - "@networkguru, for networking aspects, please look at IP bootstrapping aspect" + - "@kyoto" + - "@zhuje" + - "@alanconway" +approvers: # A single approver is preferred, the role of the approver is to raise important questions, help ensure the enhancement receives reviews from all applicable areas/SMEs, and determine when consensus is achieved such that the EP can move forward to implementation. Having multiple approvers makes it difficult to determine who is responsible for the actual approval. + - "@stleerh" + - "@eparis" +api-approvers: + - "@spadgett" +creation-date: 2023-09-18 +last-updated: 2023-10-11 +tracking-link: + - https://issues.redhat.com/browse/OU-204 +see-also: + - "" +replaces: + - "" +superseded-by: + - "" +--- + +title: observability-ui-operator + +# Observability UI Operator + +The Observability UI Operator aims to manage dynamic console plugins for observability signals inside the OpenShift console, ensuring a consistent user experience and efficient management of UI plugins. + +## Summary + +This proposal introduces the Observability UI Operator, a tool designed to manage UI plugins related to observability signals within the OpenShift console. By centralizing the management of such plugins, we can offer a unified observability experience in the console and accommodate new use cases, all while decoupling UI responsibilities from other operators. + +## Motivation + +### Why: + +The current state of observability signals in the OpenShift console has each operator responsible for its own console plugin. This sometimes results in operators deploying plugins outside their primary scope. As the requirements for the console's UI grow, there's a clear need for a centralized system that can manage diverse UI components spanning across various signals to offer a unified observability experience in the console. + +### User Stories + +- As an OpenShift user, I want an operator from the Red Hat catalog that can deploy various observability UI components so that all signals supported by the cluster are easily accessible and can be used for troubleshooting. + +- As an OpenShift administrator, I want a centralized operator for observability UI components so that I can streamline console requirements and integrate diverse signals effectively. + +- As an OpenShift user, I want to customize observability dashboards with various signals so that I can quickly identify and resolve issues. + +### Goals + +Provide a centralized operator to manage dynamic UI plugins for observability signals within the OpenShift console. + +Allow OpenShift users and administrators to access various observability signals through integrated console plugins. + +Decouple the responsibility of managing observability UI from operators, enabling each operator to focus solely on its primary functionalities. + +Enhance the observability experience on the console by providing components like [Perses](https://github.com/perses/perses) for customizable dashboards and [korrel8r](https://github.com/korrel8r/korrel8r) for correlation. + +Ensure that the Observability UI operator remains independent of the OpenShift Container Platform (OCP) release cycle, thus allowing more frequent updates with new features and fixes. + +### Non-Goals + +Deploying third-party Observability UI solutions like Grafana or Kibana. + +Supporting UIs coming from other observability projects such as Jaeger UI, Prometheus/Thanos UI, or AlertManager UI. + +Replacing or superseding the monitoring plugin deployed by the Cluster Monitoring Operator. + +## Proposal + +The proposal is to introduce an Observability UI Operator that primarily aims at centralizing the management of dynamic console plugins dedicated to observability signals for the OpenShift console. + +### Current State and Challenges: + +Currently, individual operators, each responsible for specific observability signals, deploy their own console plugins in OpenShift, allowing users to access related signal data. Some operators end up deploying plugins not related to their primary function. For example, the logging operator might deploy a plugin exclusively using services from the Loki operator. + +The current design sees a rapid expansion of the console's UI requirements, which now exceed just interfacing with the default signal sources. Users are demanding components that can work across various signals, encompassing features like customizable dashboards in Perses, and observability UIs that can read signals from multiple operators in a cluster, such as Advanced Cluster Management (ACM) or Service Telemetry Framework (STF). + +A significant drawback of the existing system is that, for advanced features like customizable dashboards, UI components require backend services that do not fit seamlessly within the current operators. + +### Design: + +The Observability UI Operator will be available in the Red Hat catalog. + +It will manage the deployment of several components which will be added incrementally based on priority, as shown in the table below: + +| Component | Component Type | Current features | Planned features | +| ---------------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| Dashboards console plugin | Console Dynamic Plugin | Allows the current dashboards to fetch data from other Prometheus services in the cluster, different from the cluster monitoring | Integrate Perses UI for dashboards
Allow new dashboards to consume data from several data sources
Allow new dashboards customization | +| Logging view plugin | Console Dynamic Plugin | Displays logs under the observe section for the admin perspective
Displays logs in the pod detail view
Displays logs as a tab in the observe menu for the dev perspective
Merges log-based alerts with monitoring alerts in the observe alerts view | Allow dev console users to see logs from several namespaces at the same time
Display log metrics | +| Perses Operator | Operator | N/A – not yet released | Allow dashboards definitions as CRDs
Manage dashboards authorization
Manage schema migrations from grafana | +| Distributed tracing console plugin | Console Dynamic Plugin | N/A – not yet released | Display a scatter plot with a list of traces
Display a gantt chart to display the detail of a trace | +| Korrel8r console plugin | Console Dynamic Plugin | N/A – not yet released | Display a side panel to allow navigate across observability signals present on the cluster | + +To maintain a level of flexibility and ensure compatibility, each plugin within this operator will come with a set of feature toggles. These toggles can be activated or deactivated based on the OCP version and the version of the respective signal operator. + +The release cycle for the Observability UI Operator will be distinct from the OpenShift Container Platform's minor version releases. With this approach, we anticipate more frequent updates with newer features and fixes. Tentatively, minor releases are planned every 3 months, subject to change based on the specific features targeted for each release. + +Migration plans will be crucial. Current plugins deployed by other signal operators are optional. These can be disabled and replaced by plugins from the Observability UI Operator. Existing operators deploying an observability plugin will need to direct customers towards migration to the Observability UI Operator and strategize for the phasing out of their plugin support. + +### Console plugin configuration + +The Observability UI Operator will be configured through a series of custom resource (CR) that will allow the user to enable or disable the console plugins and link them with the corresponding backend from signal operators. + +### Objective: + +The core intention behind this change is twofold: + +To streamline the observability experience on the OpenShift console, offering users a unified and adaptable approach. + +Decouple the UI responsibilities from specific operators, allowing them to focus exclusively on their main functions. + +By centralizing the observability UI components under one operator, we hope to minimize redundancy, improve user experience, and cater more efficiently to the expanding requirements of the console's UI. + +### Workflow Description + +The workflow for the Observability UI Operator focuses on enhancing the user experience when interfacing with the OpenShift console. This proposal targets a more unified and enhanced observability experience through a new Kubernetes operator. + +**OpenShift cluster administrator** is responsible for installing, enabling, configuring, and managing the plugins and operators within the OpenShift environment. +**OpenShift user** is the end-user interfacing with the OpenShift console and making use of the observability signals presented by the dynamic console plugins. + +1. The cluster administrator installs the ObservabilityUI operator from the RedHat Catalog. +2. If there is an existing observability UI plugin deployed by another operator, the cluster administrator disables it. +3. The cluster administrator configures the operator adding a custom resources (CR) to deploy the desired plugins and link them with the corresponding signal operators. +4. The operator will reconcile the necessary deployments for each enabled plugin, then it will reconcile the required [CRs for the console operator](https://github.com/openshift/enhancements/blob/master/enhancements/console/dynamic-plugins.md#delivering-plugins) so they become be available in the OpenShift console. +5. The user accesses the OpenShift console and interacts with the observability signals through the plugins deployed by the operator. + +### API Extensions + +This enhancement introduces a new CRD to represent observability UI console plugins. The `ObservabilityUIConsolePlugin` CR for a plugin will be defined as follows: + +```yaml +apiVersion: observability-ui.openshift.io/v1alpha1 +kind: ObservabilityUIConsolePlugin +metadata: + name: logging-view-plugin + namespace: openshift-observability-ui +spec: + displayName: "Logging View Plugin" + deployment: + containers: + - name: logging-view-plugin + image: "quay.io/gbernal/logging-view-plugin:latest" + ports: + - containerPort: 9443 + protocol: TCP + backend: + type: logs + sources: + - alias: logs-backend + caCertificate: '-----BEGIN CERTIFICATE-----\nMIID....' + authorize: true + endpoint: + type: Service + service: + name: lokistack-dev + namespace: openshift-logging + port: 8080 + settings: + timeout: 30s + logsLimit: 300 +``` + +#### Behavior Modification of Existing Resources: + +No existing resources are modified by this operator. However, operators that previously deployed their own UI plugins may need to consider to point their users to the Observability UI Operator docs so they can continue using the plugin in the console. + +#### Operational Aspects of API Extensions: + +- Labels and Annotations: Owner references will be added to the deployments and console operator CRs so resources are cleaned up when an observability UI component is deleted. + +- Compatibility and Feature Flags: The Observability UI operator will add a set of feature toggles to each plugin deployment to ensure that only compatible features are deployed. This compatibility is based on the OCP version and the signal operator version. See the [logging view plugin compatibility matrix](https://github.com/openshift/logging-view-plugin/tree/main#compatibility-matrix) + +### Risks and Mitigations + +| Risk | Description | Mitigation | +| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Compatibility Issues | Given that each plugin will have feature toggles based on the OCP version and signal operator version, there is a potential for compatibility issues to arise, especially as more plugins and features are introduced. | Ensure robust testing mechanisms that simulate different environments and configurations. Maintain a detailed compatibility matrix and ensure that it is updated regularly. Provide a mechanism for users to report compatibility issues, and prioritize addressing them. | +| Migration Challenges | Existing operators deploying observability plugins might face challenges when migrating to the new Observability UI Operator. | Develop a step-by-step migration guide. Offer dedicated support during the initial migration phase to help teams seamlessly transition. Provide tooling, if possible, to automate or simplify parts of the migration process. | + +Review Processes: + +- Security Review: Security will be reviewed by the ProdSec team. They will evaluate the architecture, perform vulnerability assessments, and validate the security practices adopted in the operator. + +- UX Review: The UX team will review the design and user experience of the observability UI plugins. Feedback will be incorporated to ensure a seamless and consistent user experience across the OpenShift console. + +- Stakeholder Engagement: Involve teams that work on Loki, Jaeger, Prometheus, and other related projects in the review process. Their feedback will be invaluable in understanding the broader implications and ensuring that the operator integrates well. + +### Drawbacks + +- An additional operator to install and upgrade might be a burden for users. However, the Observability UI Operator will be available in the Red Hat catalog, and it will be possible to install it and upgrade it within the console. +- There is an inherent dependence of the UI plugins with the signal operators. However, users will have the flexibility to choose which plugins they want to install and use. + +## Design Details + +### Open Questions + +- How does the operator enables the plugins from the Observability UI Operator without having to patch the console operator? Answer fom the console team: Plugins signed by Red Hat can be enabled by default. + +### Test Plan + +Alongside [Ginkgo](https://github.com/onsi/ginkgo) unit tests, we'll use [Cypress](https://github.com/cypress-io/cypress) for e2e tests on operator-created components, specifically the dynamic plugins toggles for a specific OpenShift console version from the [compatibility matrix](####operational-aspects-of-api-extensions). These e2e tests will run in a CI pipeline, and will verify plugin presence and correct toggles, while plugin functionality tests reside in their respective repositories. + +### Graduation Criteria + +The initial release offers a Dev preview of the operator, featuring: + +- Dashboards console plugin +- Plugin compatibility tests +- Operator deployment script +- Basic installation and CRD plugin-enabling documentation + +#### Dev Preview -> Tech Preview + +- End user documentation +- Gather feedback from users +- Allow installation from the console catalog +- Sufficient test coverage +- Logging view plugin + +#### Tech Preview -> GA + +- More testing (upgrade, downgrade, scale) +- Sufficient time for feedback +- User facing documentation created in [openshift-docs](https://github.com/openshift/openshift-docs/) + +#### Removing a deprecated feature + +N/A + +### Upgrade / Downgrade Strategy + +As plugins are managed by the console operator, during upgrade or downgrade operations, plugins might be unavailable for a window when the console version and operator are at different versions. + +The Observability UI Operator will redeploy the plugins when the console operator is updated as different versions of the console might enable different plugin features. + +### Version Skew Strategy + +To solve the version skew the Observability UI Operator will manage the plugin feature toggles based on the OCP version and the signal operator version. The compatibility between signal operators and the plugin is responsibility of the plugin. + +In the case feature toggles are not enough because a different version of the plugin image is required, The Observability UI Operator can contribute multiple plugins with different version ranges to support different OpenShift versions. If the version ranges don't overlap, the console will only load the correct plugin. + +### Operational Aspects of API Extensions + +- Each plugin managed by the operator is expected to create only one instance of a CRD. Therefore, it's anticipated that there will be no significant impact on the overall API throughput. + +#### Failure Modes + +- When the plugin deployment does not serve the plugin files the console will show a default error message but the console and cluster will continue to work as expected. +- If the plugin deployment fails, the operator will retry the deployment until it succeeds or the operator or the CR are deleted. + +#### Support Procedures + +- When deleting the ObservabilityUIConsolePlugin, the console CR and the plugin deployment will be deleted, with no impact on the cluster. +- When plugins are re enabled the deployment will be recreated and the console shows a message to refresh the page to see the changes. + +## Implementation History + +N/A + +## Alternatives + +- Deliver the plugins as part of the signal operators. This is the current behavior for some operators such as the logging operator, in which an unrelated plugin is deployed. This approach would require the signal operators to maintain the plugins and would increase the complexity of the signal operators. +- Include the plugins as part of the console operator. The console team created the dynamic plugins to give other teams the flexibility to extend the console without having to patch the console operator. This approach would require the console team to maintain the plugins and would increase the complexity of the console operator. From 2a5c02c0ab65b4438a71023165d62e3eb4d78b7f Mon Sep 17 00:00:00 2001 From: Gabriel Bernal Date: Mon, 30 Oct 2023 13:13:19 +0100 Subject: [PATCH 2/3] resolve comments --- .../observability-ui/observability-ui-operator.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/enhancements/observability-ui/observability-ui-operator.md b/enhancements/observability-ui/observability-ui-operator.md index 7a51d85ea9..1eeb30a63e 100644 --- a/enhancements/observability-ui/observability-ui-operator.md +++ b/enhancements/observability-ui/observability-ui-operator.md @@ -65,7 +65,10 @@ Deploying third-party Observability UI solutions like Grafana or Kibana. Supporting UIs coming from other observability projects such as Jaeger UI, Prometheus/Thanos UI, or AlertManager UI. -Replacing or superseding the monitoring plugin deployed by the Cluster Monitoring Operator. +Replacing or superseding plugins that have a clear 1:1 relationship with an existing operator such as: + +- the monitoring plugin deployed by the Cluster Monitoring Operator. This plugin is responsible for displaying and managing alerts coming from the cluster monitoring stack. +- the network observability plugin deployed by the Network Observability Operator ## Proposal @@ -85,7 +88,7 @@ The Observability UI Operator will be available in the Red Hat catalog. It will manage the deployment of several components which will be added incrementally based on priority, as shown in the table below: -| Component | Component Type | Current features | Planned features | +| Component | Component Type | Current functionality | Planned functionality | | ---------------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | | Dashboards console plugin | Console Dynamic Plugin | Allows the current dashboards to fetch data from other Prometheus services in the cluster, different from the cluster monitoring | Integrate Perses UI for dashboards
Allow new dashboards to consume data from several data sources
Allow new dashboards customization | | Logging view plugin | Console Dynamic Plugin | Displays logs under the observe section for the admin perspective
Displays logs in the pod detail view
Displays logs as a tab in the observe menu for the dev perspective
Merges log-based alerts with monitoring alerts in the observe alerts view | Allow dev console users to see logs from several namespaces at the same time
Display log metrics | @@ -121,7 +124,9 @@ The workflow for the Observability UI Operator focuses on enhancing the user exp **OpenShift user** is the end-user interfacing with the OpenShift console and making use of the observability signals presented by the dynamic console plugins. 1. The cluster administrator installs the ObservabilityUI operator from the RedHat Catalog. -2. If there is an existing observability UI plugin deployed by another operator, the cluster administrator disables it. +2. If there is an existing observability UI plugin deployed by another operator: + - If the new plugin defines console feature flag to disable the existing plugin extensions, only the new plugin extensions will be enabled. + - If the new plugin does not define console feature flag to disable the existing plugin extensions, the cluster administrator disables the existing plugin. 3. The cluster administrator configures the operator adding a custom resources (CR) to deploy the desired plugins and link them with the corresponding signal operators. 4. The operator will reconcile the necessary deployments for each enabled plugin, then it will reconcile the required [CRs for the console operator](https://github.com/openshift/enhancements/blob/master/enhancements/console/dynamic-plugins.md#delivering-plugins) so they become be available in the OpenShift console. 5. The user accesses the OpenShift console and interacts with the observability signals through the plugins deployed by the operator. @@ -196,7 +201,7 @@ Review Processes: ### Open Questions -- How does the operator enables the plugins from the Observability UI Operator without having to patch the console operator? Answer fom the console team: Plugins signed by Red Hat can be enabled by default. +- How does the operator enables the plugins from the Observability UI Operator without having to patch the console operator? On going discussion with the console team: Plugins signed by Red Hat could be enabled by default. ### Test Plan From 164c9a7c191ff4e93f0ef8df4f37d9f722dc1387 Mon Sep 17 00:00:00 2001 From: Gabriel Bernal Date: Mon, 11 Dec 2023 11:30:38 +0100 Subject: [PATCH 3/3] add observability UI hub --- .../observability-ui-hub-demo.png | Bin 0 -> 82022 bytes .../observability-ui-operator.md | 58 +++++++++--------- 2 files changed, 28 insertions(+), 30 deletions(-) create mode 100644 enhancements/observability-ui/observability-ui-hub-demo.png diff --git a/enhancements/observability-ui/observability-ui-hub-demo.png b/enhancements/observability-ui/observability-ui-hub-demo.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe56d0a30dfe688f425bd7450b22955d64a1f29 GIT binary patch literal 82022 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 BmHPky literal 0 HcmV?d00001 diff --git a/enhancements/observability-ui/observability-ui-operator.md b/enhancements/observability-ui/observability-ui-operator.md index 1eeb30a63e..273d4dabbd 100644 --- a/enhancements/observability-ui/observability-ui-operator.md +++ b/enhancements/observability-ui/observability-ui-operator.md @@ -45,8 +45,6 @@ The current state of observability signals in the OpenShift console has each ope - As an OpenShift administrator, I want a centralized operator for observability UI components so that I can streamline console requirements and integrate diverse signals effectively. -- As an OpenShift user, I want to customize observability dashboards with various signals so that I can quickly identify and resolve issues. - ### Goals Provide a centralized operator to manage dynamic UI plugins for observability signals within the OpenShift console. @@ -65,6 +63,8 @@ Deploying third-party Observability UI solutions like Grafana or Kibana. Supporting UIs coming from other observability projects such as Jaeger UI, Prometheus/Thanos UI, or AlertManager UI. +Define how customizable dashboards should be created or managed using Perses, this will be part of another enhancement proposal. + Replacing or superseding plugins that have a clear 1:1 relationship with an existing operator such as: - the monitoring plugin deployed by the Cluster Monitoring Operator. This plugin is responsible for displaying and managing alerts coming from the cluster monitoring stack. @@ -104,7 +104,7 @@ Migration plans will be crucial. Current plugins deployed by other signal operat ### Console plugin configuration -The Observability UI Operator will be configured through a series of custom resource (CR) that will allow the user to enable or disable the console plugins and link them with the corresponding backend from signal operators. +The Observability UI Operator will be configured through a series of custom resource (CR) that will allow administrators to enable or disable console plugins and link them with the corresponding backend from signal operators. To ease the process for administrators, the operator will provide a UI so plugins can be enabled or disabled from the console, this will also display plugins that can be enabled based on the OCP version and the signal operator version. ### Objective: @@ -120,49 +120,38 @@ By centralizing the observability UI components under one operator, we hope to m The workflow for the Observability UI Operator focuses on enhancing the user experience when interfacing with the OpenShift console. This proposal targets a more unified and enhanced observability experience through a new Kubernetes operator. -**OpenShift cluster administrator** is responsible for installing, enabling, configuring, and managing the plugins and operators within the OpenShift environment. +**OpenShift cluster administrator** is responsible for enabling plugins. **OpenShift user** is the end-user interfacing with the OpenShift console and making use of the observability signals presented by the dynamic console plugins. 1. The cluster administrator installs the ObservabilityUI operator from the RedHat Catalog. -2. If there is an existing observability UI plugin deployed by another operator: +2. The operator enables the ObservabilityUI Hub in the OpenShift console, adding a list of available plugins to the console based on the OCP version and the discovered signal operator version. +3. Using the Observability UI Hub, the cluster administrator enables the desired plugins, a CR is created for each plugin connecting it with the corresponding signal operator backend. +4. If there is an existing observability UI plugin deployed by another operator: - If the new plugin defines console feature flag to disable the existing plugin extensions, only the new plugin extensions will be enabled. - If the new plugin does not define console feature flag to disable the existing plugin extensions, the cluster administrator disables the existing plugin. -3. The cluster administrator configures the operator adding a custom resources (CR) to deploy the desired plugins and link them with the corresponding signal operators. -4. The operator will reconcile the necessary deployments for each enabled plugin, then it will reconcile the required [CRs for the console operator](https://github.com/openshift/enhancements/blob/master/enhancements/console/dynamic-plugins.md#delivering-plugins) so they become be available in the OpenShift console. -5. The user accesses the OpenShift console and interacts with the observability signals through the plugins deployed by the operator. +5. The operator will reconcile the necessary deployments and services for each enabled plugin, then it will reconcile the required [CRs for the console operator](https://github.com/openshift/enhancements/blob/master/enhancements/console/dynamic-plugins.md#delivering-plugins) so they become be available in the OpenShift console. +6. The user accesses the OpenShift console and interacts with the observability signals through the plugins deployed by the operator. ### API Extensions -This enhancement introduces a new CRD to represent observability UI console plugins. The `ObservabilityUIConsolePlugin` CR for a plugin will be defined as follows: +This enhancement introduces a new CRD to represent observability UI console plugins. The `ObservabilityUIPlugin` CR for a plugin will be defined as follows: ```yaml apiVersion: observability-ui.openshift.io/v1alpha1 -kind: ObservabilityUIConsolePlugin +kind: ObservabilityUIPlugin metadata: name: logging-view-plugin namespace: openshift-observability-ui spec: displayName: "Logging View Plugin" - deployment: - containers: - - name: logging-view-plugin - image: "quay.io/gbernal/logging-view-plugin:latest" - ports: - - containerPort: 9443 - protocol: TCP - backend: - type: logs - sources: - - alias: logs-backend - caCertificate: '-----BEGIN CERTIFICATE-----\nMIID....' - authorize: true - endpoint: - type: Service - service: - name: lokistack-dev - namespace: openshift-logging - port: 8080 - settings: + version: "dev" + type: logs + services: + - alias: backend + name: lokistack-dev + namespace: openshift-logging + port: 8080 + config: timeout: 30s logsLimit: 300 ``` @@ -199,6 +188,15 @@ Review Processes: ## Design Details +### Observability UI Hub design proposal + +![Observability UI Hub ](./observability-ui-hub-demo.png) + +#### TBD: + +- Catalog menu item location +- Details of versions and compatibility + ### Open Questions - How does the operator enables the plugins from the Observability UI Operator without having to patch the console operator? On going discussion with the console team: Plugins signed by Red Hat could be enabled by default.