From 2fe58c7285719d2823accca0bcace49da7657bcf Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 18 Mar 2022 13:13:20 -0500 Subject: [PATCH] Improved Tech-Insights documentation Signed-off-by: Andre Wanlin --- .changeset/thick-comics-fold.md | 11 ++ plugins/tech-insights-backend/README.md | 131 +++++++++++++++++- plugins/tech-insights/README.md | 10 +- .../docs/boolean-scorecard-example.png | Bin 0 -> 22446 bytes plugins/tech-insights/package.json | 5 + 5 files changed, 148 insertions(+), 9 deletions(-) create mode 100644 .changeset/thick-comics-fold.md create mode 100644 plugins/tech-insights/docs/boolean-scorecard-example.png diff --git a/.changeset/thick-comics-fold.md b/.changeset/thick-comics-fold.md new file mode 100644 index 0000000000..5faf2fd399 --- /dev/null +++ b/.changeset/thick-comics-fold.md @@ -0,0 +1,11 @@ +--- +'@backstage/plugin-tech-insights': patch +'@backstage/plugin-tech-insights-backend': patch +--- + +Improved the Tech-Insights documentation: + +- `lifecycle` examples used `ttl` when it should be `timeToLive` +- Added list of included FactRetrievers +- Added full backend example using all included FactRetrievers +- Added boolean scorecard example image showing results of backend example diff --git a/plugins/tech-insights-backend/README.md b/plugins/tech-insights-backend/README.md index 275adaa15c..3d19e31579 100644 --- a/plugins/tech-insights-backend/README.md +++ b/plugins/tech-insights-backend/README.md @@ -92,8 +92,8 @@ FactRetrieverRegistration also accepts an optional `lifecycle` configuration val ```ts const maxItems = { maxItems: 7 }; // Deletes all but 7 latest facts for each id/entity pair -const ttl = { ttl: 1209600000 }; // (2 weeks) Deletes items older than 2 weeks -const ttlWithAHumanReadableValue = { ttl: { weeks: 2 } }; // Deletes items older than 2 weeks +const ttl = { timeToLive: 1209600000 }; // (2 weeks) Deletes items older than 2 weeks +const ttlWithAHumanReadableValue = { timeToLive: { weeks: 2 } }; // Deletes items older than 2 weeks ``` To register these fact retrievers to your application you can modify the example `techInsights.ts` file shown above like this: @@ -235,3 +235,130 @@ const myFactCheckerFactory = new JsonRulesEngineFactCheckerFactory({ }), ``` + +## Included FactRetrievers + +There are three FactRetrievers that come out of the box with Tech Insights: + +- `entityMetadataFactRetriever`: Generates facts which indicate the completeness of entity metadata +- `entityOwnershipFactRetriever`: Generates facts which indicate the quality of data in the spec.owner field +- `techdocsFactRetriever`: Generates facts related to the completeness of techdocs configuration for entities + +## Backend Example + +Here's an example backend setup that will use the three included fact retrievers so you can get an idea of how this all works. This will the the entire contents of your `techInsights.ts` file found at `\packages\backend\src\plugins` as per [Adding the plugin to your `packages/backend`](#adding-the-plugin-to-your-packagesbackend) + +```ts +import { + createRouter, + buildTechInsightsContext, + createFactRetrieverRegistration, + entityOwnershipFactRetriever, + entityMetadataFactRetriever, + techdocsFactRetriever, +} from '@backstage/plugin-tech-insights-backend'; +import { Router } from 'express'; +import { PluginEnvironment } from '../types'; +import { + JsonRulesEngineFactCheckerFactory, + JSON_RULE_ENGINE_CHECK_TYPE, +} from '@backstage/plugin-tech-insights-backend-module-jsonfc'; + +const ttlTwoWeeks = { timeToLive: { weeks: 2 } }; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const techInsightsContext = await buildTechInsightsContext({ + logger: env.logger, + config: env.config, + database: env.database, + discovery: env.discovery, + factRetrievers: [ + createFactRetrieverRegistration({ + cadence: '0 */6 * * *', // Run every 6 hours - https://crontab.guru/#0_*/6_*_*_* + factRetriever: entityOwnershipFactRetriever, + lifecycle: ttlTwoWeeks, + }), + createFactRetrieverRegistration({ + cadence: '0 */6 * * *', + factRetriever: entityMetadataFactRetriever, + lifecycle: ttlTwoWeeks, + }), + createFactRetrieverRegistration({ + cadence: '0 */6 * * *', + factRetriever: techdocsFactRetriever, + lifecycle: ttlTwoWeeks, + }), + ], + factCheckerFactory: new JsonRulesEngineFactCheckerFactory({ + logger: env.logger, + checks: [ + { + id: 'groupOwnerCheck', + type: JSON_RULE_ENGINE_CHECK_TYPE, + name: 'Group Owner Check', + description: + 'Verifies that a Group has been set as the owner for this entity', + factIds: ['entityOwnershipFactRetriever'], + rule: { + conditions: { + all: [ + { + fact: 'hasGroupOwner', + operator: 'equal', + value: true, + }, + ], + }, + }, + }, + { + id: 'titleCheck', + type: JSON_RULE_ENGINE_CHECK_TYPE, + name: 'Title Check', + description: + 'Verifies that a Title, used to improve readability, has been set for this entity', + factIds: ['entityMetadataFactRetriever'], + rule: { + conditions: { + all: [ + { + fact: 'hasTitle', + operator: 'equal', + value: true, + }, + ], + }, + }, + }, + { + id: 'techDocsCheck', + type: JSON_RULE_ENGINE_CHECK_TYPE, + name: 'TechDocs Check', + description: + 'Verifies that TechDocs has been enabled for this entity', + factIds: ['techdocsFactRetriever'], + rule: { + conditions: { + all: [ + { + fact: 'hasAnnotationBackstageIoTechdocsRef', + operator: 'equal', + value: true, + }, + ], + }, + }, + }, + ], + }), + }); + + return await createRouter({ + ...techInsightsContext, + logger: env.logger, + config: env.config, + }); +} +``` diff --git a/plugins/tech-insights/README.md b/plugins/tech-insights/README.md index db69808df1..068f88c035 100644 --- a/plugins/tech-insights/README.md +++ b/plugins/tech-insights/README.md @@ -47,12 +47,8 @@ const serviceEntityPage = ( It is not obligatory to pass title and description props to `EntityTechInsightsScorecardContent`. If those are left out, default values from `defaultCheckResultRenderers` in `CheckResultRenderer` will be taken, hence `Boolean scorecard` and `This card represents an overview of default boolean Backstage checks`. -### Customize scorecards overview title and description: +## Boolean Scorecard Example -```tsx -// packages/app/src/components/catalog/EntityPage.tsx +If you follow the [Backend Example](https://github.com/backstage/backstage/tree/master/plugins/tech-insights-backend#backend-example), once the needed facts have been generated the boolean scorecard will look like this: -## Links - -- [The Backstage homepage](https://backstage.io) -``` +![Boolean Scorecard Example](./docs/boolean-scorecard-example.png) diff --git a/plugins/tech-insights/docs/boolean-scorecard-example.png b/plugins/tech-insights/docs/boolean-scorecard-example.png new file mode 100644 index 0000000000000000000000000000000000000000..f7860afc2c28772e256b3e043b921b4e12057a39 GIT binary patch literal 22446 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 GfAinx#g|9` literal 0 HcmV?d00001 diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 1740fc66b1..8ae665508a 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -12,6 +12,11 @@ "backstage": { "role": "frontend-plugin" }, + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/tech-insights" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start",