Skip to main content
Version: Next

Entity views

OpenChoreo ships entity-page tabs for Domain, System, and Component entities. They mirror what the in-tree OpenChoreo portal shows, so a user navigating from the OpenChoreo UI into your Backstage instance sees the same tabs they're used to.

Under NFS, tabs auto-mount

If you followed the install guide Section 4 — Core on the default NFS scaffold, every tab in the table below is contributed by the plugin's /alpha export as an EntityContentBlueprint extension and mounts automatically on the correct entity kind. You do not need to edit EntityPage.tsx (the NFS scaffold does not even create one). The wiring example further down applies only to legacy hosts.

Tab catalog

Every tab below ships in one of three "tab packs". Install only the packs whose tabs you want; tabs whose pack is not installed simply won't appear in the layout.

KindTabComponent / PathPackageNotes
DomainOverview(built-in)@openchoreo/backstage-pluginCards: NamespaceProjectsCard, NamespaceResourcesCard.
DomainDefinitionResourceDefinitionTab (/definition)@openchoreo/backstage-pluginRaw OpenChoreo resource manifest.
SystemOverview(built-in)@openchoreo/backstage-pluginCards: ProjectComponentsCard, DeploymentPipelineCard.
SystemDefinitionResourceDefinitionTab (/definition)@openchoreo/backstage-plugin
SystemCell DiagramCellDiagram (/cell-diagram)@openchoreo/backstage-pluginProject-level architecture view.
SystemLogsObservabilityProjectRuntimeLogs (/logs)@openchoreo/backstage-plugin-openchoreo-observabilityProject-scoped runtime logs.
SystemTracesObservabilityTraces (/traces)@openchoreo/backstage-plugin-openchoreo-observability
SystemIncidentsObservabilityProjectIncidents (/incidents)@openchoreo/backstage-plugin-openchoreo-observability
SystemRCA ReportsObservabilityRCA (/rca-reports)@openchoreo/backstage-plugin-openchoreo-observabilityRoot-cause analysis agent reports.
SystemCost AnalysisObservabilityCostAnalysis (/cost-analysis)@openchoreo/backstage-plugin-openchoreo-observabilityFinOps agent reports.
ComponentOverview(built-in)@openchoreo/backstage-pluginCards: DeploymentStatusCard, RuntimeHealthCard, Deployments widget.
ComponentDefinitionResourceDefinitionTab (/definition)@openchoreo/backstage-plugin
ComponentBuildWorkflows (/workflows)@openchoreo/backstage-plugin-openchoreo-ciWorkflow runs / triggers.
ComponentDeployEnvironments (/environments)@openchoreo/backstage-pluginPer-environment runtime status.
ComponentLogsObservabilityRuntimeLogs (/runtime-logs)@openchoreo/backstage-plugin-openchoreo-observabilityComponent-scoped runtime logs.
ComponentEventsObservabilityRuntimeEvents (/runtime-events)@openchoreo/backstage-plugin-openchoreo-observabilityComponent-scoped runtime events.
ComponentMetricsObservabilityMetrics (/metrics)@openchoreo/backstage-plugin-openchoreo-observability
ComponentAlertsObservabilityAlerts (/alerts)@openchoreo/backstage-plugin-openchoreo-observability
ComponentWirelogsObservabilityWirelogs (/wirelogs)@openchoreo/backstage-plugin-openchoreo-observabilityService-mesh wire-level logs.
Workflow / ClusterWorkflowRunsWorkflowRuns (/runs)@openchoreo/backstage-plugin-openchoreo-workflowsOnly for spec.type === 'Generic'.

Each openchoreo-observability / openchoreo-ci / openchoreo-workflows frontend package has a matching backend package (-backend suffix) — install both. The frontend talks to the backend at a Backstage discovery endpoint; the backend talks to OpenChoreo at ${openchoreo.baseUrl} and /resolve-urls for observability.

Cards on the Overview tab

@openchoreo/backstage-plugin's /alpha export contributes a wide set of EntityCardBlueprint extensions:

  • Domain Overview: NamespaceProjectsCard, NamespaceResourcesCard.
  • System Overview: ProjectComponentsCard, DeploymentPipelineCard, CellTopologyCard.
  • Component Overview: DeploymentStatusCard, RuntimeHealthCard, Deployments widget linking to the Deploy tab.
  • Environment / DataPlane / WorkflowPlane / ObservabilityPlane / DeploymentPipeline Overview: kind-specific status and configuration cards (30+ in total covering every OpenChoreo platform kind).

Under NFS the cards auto-mount into the default Overview Grid alongside the upstream About / Links / Labels cards. Under the legacy install you compose them by hand in your EntityPage.tsx.

What the views actually render

<Environments /> issues authenticated calls to ${openchoreo.baseUrl} via the Backstage backend proxy at /api/openchoreo/*. It reads the entity's annotations to determine which OpenChoreo project and component to query. Components synced by the catalog provider already have these annotations — for components imported from your own catalog-info.yaml, the tab renders an "OpenChoreo metadata not found" empty state.

<CellDiagram /> does the same against ${openchoreo.baseUrl}/projects/{name}/cell-diagram for the project the system corresponds to.

Observability tabs first call the observability backend's /resolve-urls endpoint to discover the per-environment Observer/RCA/FinOps URLs, then call those services directly with the IDP token attached (header x-openchoreo-direct: true to bypass any intermediate proxies).

The Build tab (Workflows) calls the CI backend, which proxies to OpenChoreo's workflow API.

Hiding or moving tabs under NFS

If you want to suppress a tab on a specific kind, or move it to a different path, override the contributed EntityContentBlueprint extension. Each tab is registered with a stable extension ID — find the ID in the plugin's alpha.tsx (e.g. componentDeployEntityContent) and override its attachTo or disabled in your customAppModule:

import { openchoreoPluginAlphaBase } from "@openchoreo/backstage-plugin/alpha";

const customised = openchoreoPluginAlphaBase.withOverrides({
extensions: [
openchoreoPluginAlphaBase
.getExtension("entity-content:openchoreo/component-deploy")
.override({
// hide on a specific kind, or change the route, etc.
disabled: true,
}),
],
});

Then add customised to createApp({ features: [...] }) instead of openchoreoPluginAlpha.

Legacy wiring example

For hosts on the legacy frontend system (see install guide Section 9), tabs must be mounted by hand in packages/app/src/components/catalog/EntityPage.tsx:

packages/app/src/components/catalog/EntityPage.tsx (legacy)
import {
Environments,
CellDiagram,
ResourceDefinitionTab,
} from '@openchoreo/backstage-plugin';
import { Workflows } from '@openchoreo/backstage-plugin-openchoreo-ci';
import {
ObservabilityMetrics,
ObservabilityAlerts,
ObservabilityRuntimeLogs,
ObservabilityRuntimeEvents,
ObservabilityWirelogs,
ObservabilityProjectRuntimeLogs,
ObservabilityTraces,
ObservabilityProjectIncidents,
ObservabilityRCA,
ObservabilityCostAnalysis,
} from '@openchoreo/backstage-plugin-openchoreo-observability';

// componentEntityPage / defaultEntityPage:
<EntityLayout.Route path="/environments" title="Deploy">
<Environments />
</EntityLayout.Route>
<EntityLayout.Route path="/definition" title="Definition">
<ResourceDefinitionTab />
</EntityLayout.Route>
<EntityLayout.Route path="/workflows" title="Build">
<Workflows />
</EntityLayout.Route>
<EntityLayout.Route path="/runtime-logs" title="Logs">
<ObservabilityRuntimeLogs />
</EntityLayout.Route>
<EntityLayout.Route path="/runtime-events" title="Events">
<ObservabilityRuntimeEvents />
</EntityLayout.Route>
<EntityLayout.Route path="/metrics" title="Metrics">
<ObservabilityMetrics />
</EntityLayout.Route>
<EntityLayout.Route path="/alerts" title="Alerts">
<ObservabilityAlerts />
</EntityLayout.Route>
<EntityLayout.Route path="/wirelogs" title="Wirelogs">
<ObservabilityWirelogs />
</EntityLayout.Route>

// systemPage:
<EntityLayout.Route path="/definition" title="Definition">
<ResourceDefinitionTab />
</EntityLayout.Route>
<EntityLayout.Route path="/cell-diagram" title="Cell">
<CellDiagram />
</EntityLayout.Route>
<EntityLayout.Route path="/logs" title="Logs">
<ObservabilityProjectRuntimeLogs />
</EntityLayout.Route>
<EntityLayout.Route path="/traces" title="Traces">
<ObservabilityTraces />
</EntityLayout.Route>
<EntityLayout.Route path="/incidents" title="Incidents">
<ObservabilityProjectIncidents />
</EntityLayout.Route>
<EntityLayout.Route path="/rca-reports" title="RCA Reports">
<ObservabilityRCA />
</EntityLayout.Route>
<EntityLayout.Route path="/cost-analysis" title="Cost Analysis">
<ObservabilityCostAnalysis />
</EntityLayout.Route>

// domainPage:
<EntityLayout.Route path="/definition" title="Definition">
<ResourceDefinitionTab />
</EntityLayout.Route>

OpenChoreo synced components have type strings like deployment/web-application and deployment/service. The default componentPage EntitySwitch only routes service/website to the page that includes Environments — add the Environments route to defaultEntityPage too if you want it on every component kind.

Other extensions you can opt into

The @openchoreo/backstage-plugin package re-exports more components than the install guide wires. These are not part of the canonical install but are available for hosts that want richer overview cards or standalone pages:

ExportUse
RuntimeHealthCardSmaller component-level health card for the Overview tab.
DeploymentStatusCardPer-environment deployment status, for the Overview tab.
DeploymentPipelineCardDeployment pipeline summary on a Component overview.
EnvironmentStatusSummaryCardAggregated environment status on an Environment entity page.
AccessControlContentStandalone Access Control page (only useful when authz is enabled).
GitSecretsContentGit secret management page (only useful when secret-management is enabled).

These ship in the same @openchoreo/backstage-plugin package — no extra installation step.

Hiding tabs when annotations are missing (legacy)

For legacy hosts that want a tab to only appear on entities the OpenChoreo provider synced, gate it on the openchoreo.io/component-name annotation:

import { isOpenChoreoComponent } from "@openchoreo/backstage-plugin-common";

<EntityLayout.Route
path="/environments"
title="Deploy"
if={isOpenChoreoComponent}
>
<Environments />
</EntityLayout.Route>;

(isOpenChoreoComponent checks for the standard OpenChoreo annotations; see @openchoreo/backstage-plugin-common for the full list.)

Frontend dependencies

The plugin uses MUI v4 (@material-ui/core@4.12.x), matching Backstage's current default. If your host app has migrated to MUI v5, you must keep both: do not remove @material-ui/core@4.x from your dependencies. Note that the install guide pins @mui/material (v5) via resolutions to fix a material-ui-popup-state transitive resolution issue — see Section 2 of the install guide.

@material-ui/lab@4.0.0-alpha.61 is required for some sub-components — add it to your app workspace if you do not already depend on it.

The observability pack pulls recharts, @material-ui/pickers, and @date-io/date-fns transitively; the CI pack pulls @rjsf/* for dynamic workflow-parameter forms. Both are pinned by the packages themselves.