Backstage
Visualize your Backstage software catalog in JupiterOne — components, APIs, systems, domains, resources, groups, and users — map which components provide and consume which APIs and depend on which resources, how systems roll up into domains, and which teams and people own each catalog entity, then monitor ownership gaps and catalog changes through queries and alerts.
- Installation
- Authorization
- Data Model
- Types
Installation
This integration connects to your self-hosted Backstage instance using the Backstage Software Catalog API and ingests the catalog entities of seven kinds: Components, APIs, Systems, Domains, Resources, Groups, and Users. It only reads GET /entities/by-query, filtered by kind. Backstage is usually hosted on your own network, so the integration normally runs on a JupiterOne Collector that can reach the Backstage backend over HTTP or HTTPS.
Configuration in Backstage
Before you configure the integration in JupiterOne, prepare the following:
-
The Catalog API base URL of your Backstage backend. This is usually your
backend.baseUrlwith/api/catalogappended, for examplehttps://backstage.example.com/api/catalog. The JupiterOne Collector must be able to reach it. -
A static access token for the integration, unless your catalog allows unauthenticated reads. Backstage backends are secure by default, so in most installations you need one. To create it, add a
staticentry under thebackend.auth.externalAccesskey of your app-config (for exampleapp-config.production.yaml) and restart the backend:backend:auth:externalAccess:- type: staticoptions:token: ${JUPITERONE_BACKSTAGE_TOKEN}subject: jupiterone-integrationaccessRestrictions:- plugin: catalogpermissionAttribute:action: readThe token can be any string without whitespace, but should be long enough that it cannot be guessed. Backstage suggests generating one with
node -p 'require("crypto").randomBytes(24).toString("base64")'. The subject is any string without whitespace that identifies the caller in Backstage.The
accessRestrictionsblock is optional, but recommended: without it, the token has unlimited access to every Backstage backend plugin.plugin: cataloglimits the token to the catalog, andpermissionAttributewithaction: readlimits it to read actions. Backstage applies thepermissionAttributerestriction only where permission checks are enabled. See Service to Service Auth for details.The integration sends the token in the
Authorization: Bearer <token>request header. -
If the Backstage backend presents a self-signed or internal-CA TLS certificate, get the CA certificate in PEM format so the collector can verify the connection.
Once you have obtained the information above, proceed to JupiterOne to finalize the integration.
Configuration in JupiterOne
To install the Backstage integration in JupiterOne, navigate to the Integrations tab in JupiterOne and select Backstage. Click New Instance to begin configuring your integration.
Creating an instance requires the following:
-
The Account Name used to identify the Backstage account in JupiterOne. Ingested entities will have this value stored in
tag.AccountNamewhen theAccountNametoggle is enabled. -
Description to assist in identifying the integration instance, if desired.
-
Polling Interval that you feel is sufficient for your monitoring needs. You may leave this as
DISABLEDand manually execute the integration. -
The Catalog API Base URL of your Backstage catalog, for example
https://backstage.example.com/api/catalog. It is required and must be anhttporhttpsURL that includes the/api/catalogpath. -
Optionally, the API Token created above. Leave it blank only if your catalog allows unauthenticated reads.
-
Optionally, under Additional Options, a CA Certificate to trust a self-signed or internal-CA certificate, or enable Disable TLS Verification to skip certificate validation (not recommended).
When you save the instance, JupiterOne checks the configuration by requesting one catalog entity. A rejected token, or a URL that cannot be reached, fails this check.
Data Sources
Each data source can be enabled or disabled on its own. All data sources are disabled by default. If you enable none of them, the integration ingests only the backstage_account entity that represents your Backstage instance, so enable the catalog kinds you want to ingest. To get the full catalog graph, enable all seven.
| Data Source | Description | Entities Created |
|---|---|---|
| Fetch Components | Backstage catalog Components (kind=component), with their type, lifecycle, and namespace | backstage_component |
| Fetch APIs | Backstage catalog APIs (kind=api), with their type, lifecycle, and namespace | backstage_api |
| Fetch Systems | Backstage catalog Systems (kind=system) | backstage_system |
| Fetch Domains | Backstage catalog Domains (kind=domain) | backstage_domain |
| Fetch Resources | Backstage catalog Resources (kind=resource), such as databases, buckets, and queues | backstage_resource |
| Fetch Groups | Backstage catalog Groups (kind=group), such as teams and business units | backstage_group |
| Fetch Users | Backstage catalog Users (kind=user), with their display name and email | backstage_user |
Every ingested entity is linked to the backstage_account entity with a HAS relationship. The relationships between catalog entities are built only when the data sources on both sides are enabled:
- Component to API (
PROVIDESandUSES) requires Fetch Components and Fetch APIs. - Component to resource (
USES) requires Fetch Components and Fetch Resources. - Component to subcomponent (
HAS) requires Fetch Components. - System to component, API, and resource (
HAS) requires Fetch Systems and, respectively, Fetch Components, Fetch APIs, or Fetch Resources. - Domain to system (
HAS) requires Fetch Domains and Fetch Systems. - Domain to subdomain (
HAS) requires Fetch Domains. - Group to subgroup (
HAS) requires Fetch Groups. - Group to user (
HAS) requires Fetch Groups and Fetch Users. - Group ownership (
OWNS) of components, APIs, systems, domains, and resources requires Fetch Groups and the data source of the owned kind. - User ownership (
OWNS) of components and APIs requires Fetch Users and, respectively, Fetch Components or Fetch APIs.
Relationships are built from the relations Backstage reports for each entity. A relation that points at an entity that was not ingested, because its data source is disabled or it is not registered in the catalog, is skipped. An owner written without a kind (for example owner: team-a) is treated as a Group, as in Backstage. The integration does not create mapped relationships to entities from other integrations.
The integration does not collect:
- Entity annotations (
metadata.annotations). - API definitions (
spec.definition). Eachbackstage_apionly records whether a definition is configured, inisDefinitionConfigured. - Catalog kinds other than the seven listed above, such as Locations and Templates.
Click Create once all values are provided to finalize the integration.
Next steps
Now that your integration instance has been configured, it will begin running on the polling interval you provided, populating data within JupiterOne. Continue on to our Instance management guide to learn more about working with and editing integration instances.
Additional resources
Endpoints
API endpoints that the integration makes requests to.
Show Endpoints (7)
GET /api/catalog/entities/by-query?filter=kind=apiGET /api/catalog/entities/by-query?filter=kind=componentGET /api/catalog/entities/by-query?filter=kind=domainGET /api/catalog/entities/by-query?filter=kind=groupGET /api/catalog/entities/by-query?filter=kind=resourceGET /api/catalog/entities/by-query?filter=kind=systemGET /api/catalog/entities/by-query?filter=kind=user
Documentation Links
Links to provider documentation relevant to setup and configuration.
Show Documentation Links (1)
Entities
The following entities are created:
| Resources | Entity _type | Entity _class |
|---|---|---|
| Account | backstage_account | Account |
| API | backstage_api | ApplicationEndpoint |
| Component | backstage_component | Application |
| Domain | backstage_domain | Domain |
| Group | backstage_group | UserGroup |
| Resource | backstage_resource | Resource |
| System | backstage_system | Service |
| User | backstage_user | User |
Relationships
The following relationships are created:
Source Entity _type | Relationship _class | Target Entity _type |
|---|---|---|
backstage_account | HAS | backstage_component |
backstage_account | HAS | backstage_api |
backstage_account | HAS | backstage_system |
backstage_account | HAS | backstage_domain |
backstage_account | HAS | backstage_resource |
backstage_account | HAS | backstage_group |
backstage_account | HAS | backstage_user |
backstage_component | PROVIDES | backstage_api |
backstage_component | USES | backstage_api |
backstage_component | USES | backstage_resource |
backstage_component | HAS | backstage_component |
backstage_domain | HAS | backstage_system |
backstage_domain | HAS | backstage_domain |
backstage_group | HAS | backstage_group |
backstage_group | HAS | backstage_user |
backstage_group | OWNS | backstage_component |
backstage_group | OWNS | backstage_api |
backstage_group | OWNS | backstage_system |
backstage_group | OWNS | backstage_domain |
backstage_group | OWNS | backstage_resource |
backstage_system | HAS | backstage_component |
backstage_system | HAS | backstage_api |
backstage_system | HAS | backstage_resource |
backstage_user | OWNS | backstage_component |
backstage_user | OWNS | backstage_api |
Backstage Account
backstage_account inherits from Account
| Property | Type | Description | Specifications |
|---|---|---|---|
host * | string | The host of the Backstage catalog API base URL. |
Backstage Api
backstage_api inherits from ApplicationEndpoint
| Property | Type | Description | Specifications |
|---|---|---|---|
apiType * | string | null | The API spec.type (e.g. 'openapi', 'asyncapi', 'graphql', 'grpc'). | |
isDefinitionConfigured * | boolean | Whether the API has a spec.definition configured. The definition text itself is not ingested (it is large, changes on edit, and may embed credentialed URLs). | |
lifecycle * | string | null | The API lifecycle stage (e.g. 'experimental', 'production', 'deprecated'). | |
namespace * | string | null | The catalog namespace the API belongs to. | |
uid * | string | null | The Backstage-generated uid of the API (not a stable external reference). |
Backstage Component
backstage_component inherits from Application
| Property | Type | Description | Specifications |
|---|---|---|---|
componentType * | string | null | The Component spec.type (e.g. 'service', 'website', 'library'). | |
lifecycle * | string | null | The Component lifecycle stage (e.g. 'experimental', 'production', 'deprecated'). | |
namespace * | string | null | The catalog namespace the Component belongs to. | |
uid * | string | null | The Backstage-generated uid of the Component (not a stable external reference). |
Backstage Domain
backstage_domain inherits from Domain
| Property | Type | Description | Specifications |
|---|---|---|---|
domainType * | string | null | The Domain spec.type, if set. | |
uid * | string | null | The Backstage-generated uid of the Domain (not a stable external reference). |
Backstage Group
backstage_group inherits from UserGroup
| Property | Type | Description | Specifications |
|---|---|---|---|
groupType * | string | null | The Group spec.type (e.g. 'team', 'business-unit', 'product-area'). | |
uid * | string | null | The Backstage-generated uid of the Group (not a stable external reference). |
Backstage Resource
backstage_resource inherits from Resource
| Property | Type | Description | Specifications |
|---|---|---|---|
resourceType * | string | null | The Resource spec.type (e.g. 'database', 's3-bucket', 'queue'). | |
uid * | string | null | The Backstage-generated uid of the Resource (not a stable external reference). |
Backstage System
backstage_system inherits from Service
| Property | Type | Description | Specifications |
|---|---|---|---|
systemType * | string | null | The System spec.type, if set. | |
uid * | string | null | The Backstage-generated uid of the System (not a stable external reference). |
Backstage User
backstage_user inherits from User
| Property | Type | Description | Specifications |
|---|---|---|---|
namespace * | string | null | The catalog namespace the User belongs to. | |
uid * | string | null | The Backstage-generated uid of the User (not a stable external reference). |