{"id":44200928,"url":"https://github.com/nobl9/nobl9-backstage-plugin","last_synced_at":"2026-02-09T21:37:54.587Z","repository":{"id":212664894,"uuid":"730586418","full_name":"nobl9/nobl9-backstage-plugin","owner":"nobl9","description":"Nobl9 plugin for Backstage","archived":false,"fork":false,"pushed_at":"2026-02-05T19:02:20.000Z","size":2126,"stargazers_count":22,"open_issues_count":9,"forks_count":3,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-02-06T04:54:05.544Z","etag":null,"topics":["backstage","nobl9","reliability","slo"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nobl9.png","metadata":{"files":{"readme":"README.MD","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-12-12T08:48:30.000Z","updated_at":"2026-02-02T20:10:08.000Z","dependencies_parsed_at":"2026-02-05T21:04:46.069Z","dependency_job_id":null,"html_url":"https://github.com/nobl9/nobl9-backstage-plugin","commit_stats":{"total_commits":110,"total_committers":4,"mean_commits":27.5,"dds":0.5272727272727273,"last_synced_commit":"60e7cd08a517e9713de6eed10ea4f76a042975bb"},"previous_names":["nobl9/nobl9-backstage-plugin"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/nobl9/nobl9-backstage-plugin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nobl9%2Fnobl9-backstage-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nobl9%2Fnobl9-backstage-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nobl9%2Fnobl9-backstage-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nobl9%2Fnobl9-backstage-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nobl9","download_url":"https://codeload.github.com/nobl9/nobl9-backstage-plugin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nobl9%2Fnobl9-backstage-plugin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29281981,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-09T19:05:41.198Z","status":"ssl_error","status_checked_at":"2026-02-09T19:05:37.449Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backstage","nobl9","reliability","slo"],"created_at":"2026-02-09T21:37:51.712Z","updated_at":"2026-02-09T21:37:54.577Z","avatar_url":"https://github.com/nobl9.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Nobl9 plugin for Backstage\n\n[![CI](https://github.com/nobl9/nobl9-backstage-plugin/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/nobl9/nobl9-backstage-plugin/actions/workflows/ci.yaml)\n\nThis repository contains a set of [Backstage](https://backstage.io) plugins to support [Nobl9](https://nobl9.com) SLOs in your Backstage installation. The plugins provide a custom entity page to show SLOs for entities of your choice.\n\nThe repository contains the following Backstage plugins:\n\n- Nobl9 Backend plugin - acts as a proxy between UI and Nobl9 SLO Status API\n- Nobl9 UI plugin - displays SLO statuses for annotated entities\n\nYou'll need both plugins to integrate with Nobl9 successfully.\n\n\u003e [!IMPORTANT]\n\u003e Starting from version v0.3.0, Nobl9 Backstage plugins support the new [Backstage Backend System](https://backstage.io/docs/backend-system/building-backends/index).\n\n## Feature overview\n\nThe plugin allows you to easily access the most up-to-date metrics for any SLO within Backstage, such as the Burn Rate, Remaining Error Budget, labels, etc.\n\n![Nobl9 SLOs tab](/docs/images/backstage-ui-plugin.png 'Nobl9 SLOs tab')\n\n## Installation guide\n\nThis guide covers the installation and configuration options for the Nobl9 Backstage plugins. The steps assume you already have a working Backstage application in which you can install the plugins.\n\n\u003c!-- toc --\u003e\n\n- [Nobl9 API credentials](#nobl9-api-credentials)\n- [Backend plugin installation](#backend-plugin-installation)\n- [UI plugin installation](#ui-plugin-installation)\n- [Configure the plugin](#configure-the-plugin)\n  - [Global configuration](#global-configuration)\n  - [Catalog entity annotations](#catalog-entity-annotations)\n- [Uninstall the backstage plugin](#uninstall-the-backstage-plugin)\n\n\u003c!-- tocstop --\u003e\n\n### Nobl9 API credentials\n\nThe Nobl9 backend plugin relies on [Nobl9 SLO Status API](https://docs.nobl9.com/api/slo). Hence, you'll need an access key to authorize requests to Nobl9 properly. Use the [official guide](https://docs.nobl9.com/Getting_Started/#access-keys) to generate `Client ID` and `Client Secret`.\n\n### Backend plugin installation\n\nInstall the Nobl9 backend plugin package in your Backstage app by running the following command in the root directory:\n\n```\nyarn workspace backend add @nobl9/nobl9-backstage-backend-plugin\n```\n\nEdit `packages/backend/src/index.ts` to register the backend plugin:\n\n```diff\ndiff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts\nindex 1c442a8..d3af2ba 100644\n--- a/packages/backend/src/index.ts\n+++ b/packages/backend/src/index.ts\n@@ -38,4 +38,7 @@ backend.add(import('@backstage/plugin-search-backend/alpha'));\n backend.add(import('@backstage/plugin-search-backend-module-catalog/alpha'));\n backend.add(import('@backstage/plugin-search-backend-module-techdocs/alpha'));\n\n+// nobl9 plugin\n+backend.add(import('@nobl9/nobl9-backstage-backend-plugin'));\n+\n backend.start();\n```\n\nYou can now verify that the backend plugin is running correctly. Access the backend URL by sending a `GET` request to `\u003cbackstage app url\u003e/api/nobl9-backend/health`. If the plugin is running, you will receive a response with `{\"status\":\"ok\"}`.\n\n### UI plugin installation\n\nInstall the Nobl9 UI plugin package in your Backstage app by running the following command in the root directory:\n\n```\nyarn workspace app add @nobl9/nobl9-backstage-plugin\n```\n\nFind and edit `packages/app/src/components/catalog/EntityPage.tsx` to add the Nobl9 SLOs tab in the entity page layout.\n\nFor example, you can embed the plugin for a service entity in the following way:\n\n```diff\ndiff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx\nindex 6722ea2..c37def2 100644\n--- a/packages/app/src/components/catalog/EntityPage.tsx\n+++ b/packages/app/src/components/catalog/EntityPage.tsx\n@@ -57,6 +57,7 @@ import {\n\n import { TechDocsAddons } from '@backstage/plugin-techdocs-react';\n import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib';\n+import { Nobl9Page, isNobl9Available } from '@nobl9/nobl9-backstage-plugin';\n\n const techdocsContent = (\n   \u003cEntityTechdocsContent\u003e\n@@ -175,6 +176,10 @@ const serviceEntityPage = (\n     \u003cEntityLayout.Route path=\"/docs\" title=\"Docs\"\u003e\n       {techdocsContent}\n     \u003c/EntityLayout.Route\u003e\n+\n+    \u003cEntityLayout.Route path=\"/slos\" title=\"SLOs\" if={isNobl9Available}\u003e\n+      \u003cNobl9Page /\u003e\n+    \u003c/EntityLayout.Route\u003e\n   \u003c/EntityLayout\u003e\n );\n```\n\n### Configure the plugin\n\n#### Global configuration\n\nAdd the following Nobl9 configuration section to `app-config.yaml`:\n\n```yaml\nnobl9:\n  baseUrl: https://app.nobl9.com\n  organization: ${NOBL9_ORGANIZATION_ID}\n  clientId: ${NOBL9_CLIENT_ID}\n  clientSecret: ${NOBL9_CLIENT_SECRET}\n```\n\n| Environment variable    | Description                                                                                          |\n| ----------------------- | ---------------------------------------------------------------------------------------------------- |\n| `NOBL9_ORGANIZATION_ID` | ID of your organization you can find in the Nobl9 UI in Settings \u003e Account                           |\n| `NOBL9_CLIENT_ID`       | Client ID associated with an Access Key generated in the [previous step](#nobl9-api-credentials)     |\n| `NOBL9_CLIENT_SECRET`   | Client Secret associated with an Access Key generated in the [previous step](#nobl9-api-credentials) |\n\nDepending on where your Nobl9 organization is hosted, use either `https://app.nobl9.com` or `http://us1.nobl9.com` as the base URL.\n\nThe backend plugin will be available under the `/api/nobl9-backend/slos` path by default. You can use the `nobl9.backendPluginPath` config key to provide a custom path.\nIf, for example, your backend plugins are served without the `/api` prefix, you can use the following config:\n\n```yaml\nnobl9:\n  baseUrl: https://app.nobl9.com\n  organization: ${NOBL9_ORGANIZATION_ID}\n  clientId: ${NOBL9_CLIENT_ID}\n  clientSecret: ${NOBL9_CLIENT_SECRET}\n  backendPluginPath: /nobl9-backend/slos\n```\n\n#### Catalog entity annotations\n\nAnnotate components of your choice with `nobl9.com/project` annotation and either `nobl9.com/services` and/or `nobl9.com/slos`. Based on multiple annotations, the `AND` operator is used to decide which SLOs to display.\n\n**Available annotations**\n\n| Annotation           | Required           | Description                                 |\n| -------------------- | ------------------ | ------------------------------------------- |\n| `nobl9.com/project`  | :heavy_check_mark: | Nobl9 project name used to query for SLOs   |\n| `nobl9.com/services` |                    | Comma-separated list of Nobl9 service names |\n| `nobl9.com/slos`     |                    | Comma-separated list of Nobl9 SLO names     |\n\n**Example annotations**\n\nComponent with all SLOs from the Nobl9 `default` project:\n\n```yaml\napiVersion: backstage.io/v1alpha1\nkind: Component\nmetadata:\n  name: service1\n  annotations:\n    nobl9.com/project: default\nspec:\n  type: service\n  lifecycle: production\n  owner: io\n  system: nobl9\n```\n\nComponent with all SLOs from the Nobl9 `service1` service, that is organized under the `default` project:\n\n```yaml\napiVersion: backstage.io/v1alpha1\nkind: Component\nmetadata:\n  name: service1\n  annotations:\n    nobl9.com/project: default\n    nobl9.com/services: service1\nspec:\n  type: service\n  lifecycle: production\n  owner: io\n  system: nobl9\n```\n\nComponent with two SLOs named `latency` and `error-rate` from the Nobl9 `default` project:\n\n```yaml\napiVersion: backstage.io/v1alpha1\nkind: Component\nmetadata:\n  name: services2\n  annotations:\n    nobl9.com/project: default\n    nobl9.com/slos: latency,error-rate\nspec:\n  type: service\n  lifecycle: production\n  owner: foundations\n  system: nobl9\n```\n\n### Uninstall the Backstage plugin\n\n1. Remove any configuration added in Backstage `yaml` files, such as the [Nobl9 configuration section](#global-configuration) in `app-config.yaml` and entity annotations.\n2. Remove the code snippets from `EntityPage.tsx`\n3. Remove the plugin packages:\n\n```\nyarn remove --cwd packages/app @nobl9/nobl9-backstage-plugin\nyarn remove --cwd packages/app @nobl9/nobl9-backstage-backend-plugin\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnobl9%2Fnobl9-backstage-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnobl9%2Fnobl9-backstage-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnobl9%2Fnobl9-backstage-plugin/lists"}