From 7ef026339df61736ae346239ab947b37b7a69723 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Fri, 25 Feb 2022 11:46:26 +0100 Subject: [PATCH 01/29] Add Periskop plugin Signed-off-by: Julio Zynger --- .changeset/strong-pandas-roll.md | 6 + .github/styles/vocab.txt | 2 + app-config.yaml | 7 + .../well-known-annotations.md | 14 ++ microsite/data/plugins/periskop.yaml | 9 + plugins/periskop-backend/.eslintrc.js | 3 + plugins/periskop-backend/README.md | 5 + plugins/periskop-backend/api-report.md | 22 ++ plugins/periskop-backend/package.json | 43 ++++ plugins/periskop-backend/src/api/index.ts | 72 +++++++ plugins/periskop-backend/src/index.ts | 17 ++ plugins/periskop-backend/src/run.ts | 33 +++ .../src/service/router.test.ts | 56 ++++++ .../periskop-backend/src/service/router.ts | 57 ++++++ .../src/service/standaloneServer.ts | 56 ++++++ plugins/periskop-backend/src/setupTests.ts | 17 ++ plugins/periskop-backend/src/types.ts | 48 +++++ plugins/periskop/.eslintrc.js | 3 + plugins/periskop/README.md | 34 ++++ plugins/periskop/api-report.md | 59 ++++++ plugins/periskop/config.d.ts | 39 ++++ plugins/periskop/dev/index.tsx | 20 ++ .../docs/periskop-plugin-screenshot.png | Bin 0 -> 205851 bytes plugins/periskop/package.json | 58 ++++++ plugins/periskop/src/api/index.ts | 89 ++++++++ .../PeriskopErrorsTable.tsx | 190 ++++++++++++++++++ .../components/PeriskopErrorsTable/index.ts | 21 ++ plugins/periskop/src/extensions.ts | 33 +++ plugins/periskop/src/index.ts | 23 +++ plugins/periskop/src/plugin.test.ts | 23 +++ plugins/periskop/src/plugin.ts | 51 +++++ plugins/periskop/src/routes.ts | 21 ++ plugins/periskop/src/setupTests.ts | 18 ++ plugins/periskop/src/types.ts | 48 +++++ 34 files changed, 1197 insertions(+) create mode 100644 .changeset/strong-pandas-roll.md create mode 100644 microsite/data/plugins/periskop.yaml create mode 100644 plugins/periskop-backend/.eslintrc.js create mode 100644 plugins/periskop-backend/README.md create mode 100644 plugins/periskop-backend/api-report.md create mode 100644 plugins/periskop-backend/package.json create mode 100644 plugins/periskop-backend/src/api/index.ts create mode 100644 plugins/periskop-backend/src/index.ts create mode 100644 plugins/periskop-backend/src/run.ts create mode 100644 plugins/periskop-backend/src/service/router.test.ts create mode 100644 plugins/periskop-backend/src/service/router.ts create mode 100644 plugins/periskop-backend/src/service/standaloneServer.ts create mode 100644 plugins/periskop-backend/src/setupTests.ts create mode 100644 plugins/periskop-backend/src/types.ts create mode 100644 plugins/periskop/.eslintrc.js create mode 100644 plugins/periskop/README.md create mode 100644 plugins/periskop/api-report.md create mode 100644 plugins/periskop/config.d.ts create mode 100644 plugins/periskop/dev/index.tsx create mode 100644 plugins/periskop/docs/periskop-plugin-screenshot.png create mode 100644 plugins/periskop/package.json create mode 100644 plugins/periskop/src/api/index.ts create mode 100644 plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx create mode 100644 plugins/periskop/src/components/PeriskopErrorsTable/index.ts create mode 100644 plugins/periskop/src/extensions.ts create mode 100644 plugins/periskop/src/index.ts create mode 100644 plugins/periskop/src/plugin.test.ts create mode 100644 plugins/periskop/src/plugin.ts create mode 100644 plugins/periskop/src/routes.ts create mode 100644 plugins/periskop/src/setupTests.ts create mode 100644 plugins/periskop/src/types.ts diff --git a/.changeset/strong-pandas-roll.md b/.changeset/strong-pandas-roll.md new file mode 100644 index 0000000000..6271ed6f1c --- /dev/null +++ b/.changeset/strong-pandas-roll.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-periskop': patch +'@backstage/plugin-periskop-backend': patch +--- + +Add periskop and periskop-backend plugin, for usage with exception aggregation tool https://periskop.io/ diff --git a/.github/styles/vocab.txt b/.github/styles/vocab.txt index aa94c3d953..2614dd6b50 100644 --- a/.github/styles/vocab.txt +++ b/.github/styles/vocab.txt @@ -211,6 +211,8 @@ Patrik Peloton performant Performant +periskop +Periskop plantuml Platformize Podman diff --git a/app-config.yaml b/app-config.yaml index ab68d4398f..c88415da2e 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -456,3 +456,10 @@ apacheAirflow: gocd: baseUrl: https://your.gocd.instance.com + +periskop: + locations: + - name: + host: + - name: + host: diff --git a/docs/features/software-catalog/well-known-annotations.md b/docs/features/software-catalog/well-known-annotations.md index 26a8710820..2f41377a36 100644 --- a/docs/features/software-catalog/well-known-annotations.md +++ b/docs/features/software-catalog/well-known-annotations.md @@ -222,6 +222,20 @@ definition. Specifying this annotation will enable GoCD related features in Backstage for that entity. +### periskop.io/name + +```yaml +# Example: +metadata: + annotations: + periskop.io/name: pump-station +``` + +The value of this annotation is the periskop project name for the given entity. + +Specifying this annotation will enable [Periskop](https://periskop.io/) related features in Backstage for +that entity if the periskop plugin is installed. + ### sentry.io/project-slug ```yaml diff --git a/microsite/data/plugins/periskop.yaml b/microsite/data/plugins/periskop.yaml new file mode 100644 index 0000000000..cce8d0dde5 --- /dev/null +++ b/microsite/data/plugins/periskop.yaml @@ -0,0 +1,9 @@ +--- +title: Periskop +author: Periskop +authorUrl: https://periskop.io/ +category: Monitoring +description: Periskop is a pull-based, language agnostic exception aggregator for microservice environments. +documentation: https://github.com/backstage/backstage/tree/master/plugins/periskop +iconUrl: https://raw.githubusercontent.com/periskop-dev/periskop/master/docs/assets/periskop-logo.png +npmPackageName: '@backstage/plugin-periskop' diff --git a/plugins/periskop-backend/.eslintrc.js b/plugins/periskop-backend/.eslintrc.js new file mode 100644 index 0000000000..16a033dbc6 --- /dev/null +++ b/plugins/periskop-backend/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: [require.resolve('@backstage/cli/config/eslint.backend')], +}; diff --git a/plugins/periskop-backend/README.md b/plugins/periskop-backend/README.md new file mode 100644 index 0000000000..02552fe5b4 --- /dev/null +++ b/plugins/periskop-backend/README.md @@ -0,0 +1,5 @@ +# periskop-backend + +Simple plugin that proxies requests to the Periskop server APIs. + +To be used with the [Periskop plugin](../periskop/README.md). diff --git a/plugins/periskop-backend/api-report.md b/plugins/periskop-backend/api-report.md new file mode 100644 index 0000000000..7e737a21a8 --- /dev/null +++ b/plugins/periskop-backend/api-report.md @@ -0,0 +1,22 @@ +## API Report File for "@backstage/plugin-periskop-backend" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { Config } from '@backstage/config'; +import express from 'express'; +import { Logger as Logger_2 } from 'winston'; + +// @public (undocumented) +export function createRouter(options: RouterOptions): Promise; + +// @public (undocumented) +export interface RouterOptions { + // (undocumented) + config: Config; + // (undocumented) + logger: Logger_2; +} + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json new file mode 100644 index 0000000000..33da28be06 --- /dev/null +++ b/plugins/periskop-backend/package.json @@ -0,0 +1,43 @@ +{ + "name": "@backstage/plugin-periskop-backend", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "private": false, + "homepage": "https://periskop.io", + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "scripts": { + "start": "backstage-cli backend:dev", + "build": "backstage-cli backend:build", + "lint": "backstage-cli lint", + "test": "backstage-cli test", + "prepack": "backstage-cli prepack", + "postpack": "backstage-cli postpack", + "clean": "backstage-cli clean" + }, + "dependencies": { + "@backstage/backend-common": "^0.10.8", + "@backstage/config": "^0.1.14", + "@types/express": "*", + "cross-fetch": "^3.0.6", + "express": "^4.17.1", + "express-promise-router": "^4.1.0", + "node-fetch": "^2.6.0", + "winston": "^3.2.1", + "yn": "^4.0.0" + }, + "devDependencies": { + "@backstage/cli": "^0.14.0", + "@types/supertest": "^2.0.8", + "msw": "^0.35.0", + "supertest": "^4.0.2" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/periskop-backend/src/api/index.ts b/plugins/periskop-backend/src/api/index.ts new file mode 100644 index 0000000000..f2b15f58fb --- /dev/null +++ b/plugins/periskop-backend/src/api/index.ts @@ -0,0 +1,72 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Config } from '@backstage/config'; +import { AggregatedError, NotFoundInLocation } from '../types'; +import fetch from 'node-fetch'; + +export type Options = { + config: Config; +}; + +type PeriskopLocation = { + name: string; + host: string; +}; + +export class PeriskopApi { + private readonly locations: PeriskopLocation[]; + + constructor(options: Options) { + this.locations = options.config + .getConfigArray('periskop.locations') + .flatMap(locConf => { + const name = locConf.getString('name'); + const host = locConf.getString('host'); + return { name: name, host: host }; + }); + } + + private getApiUrl(locationName: string): string | undefined { + return this.locations.find(loc => loc.name === locationName)?.host; + } + + async getErrors( + locationName: string, + serviceName: string, + ): Promise { + const apiUrl = this.getApiUrl(locationName); + if (!apiUrl) { + throw new Error( + `failed to fetch data, no periskop location with name ${locationName}`, + ); + } + const response = await fetch(`${apiUrl}/services/${serviceName}/errors/`); + + if (!response.ok) { + if (response.status === 404) { + return { + body: await response.text(), + }; + } + + throw new Error( + `failed to fetch data, status ${response.status}: ${response.statusText}`, + ); + } + return response.json(); + } +} diff --git a/plugins/periskop-backend/src/index.ts b/plugins/periskop-backend/src/index.ts new file mode 100644 index 0000000000..ca73cb27ba --- /dev/null +++ b/plugins/periskop-backend/src/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './service/router'; diff --git a/plugins/periskop-backend/src/run.ts b/plugins/periskop-backend/src/run.ts new file mode 100644 index 0000000000..0a3ed2b7f0 --- /dev/null +++ b/plugins/periskop-backend/src/run.ts @@ -0,0 +1,33 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getRootLogger } from '@backstage/backend-common'; +import yn from 'yn'; +import { startStandaloneServer } from './service/standaloneServer'; + +const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; +const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); +const logger = getRootLogger(); + +startStandaloneServer({ port, enableCors, logger }).catch(err => { + logger.error(err); + process.exit(1); +}); + +process.on('SIGINT', () => { + logger.info('CTRL+C pressed; exiting.'); + process.exit(0); +}); diff --git a/plugins/periskop-backend/src/service/router.test.ts b/plugins/periskop-backend/src/service/router.test.ts new file mode 100644 index 0000000000..efc326280a --- /dev/null +++ b/plugins/periskop-backend/src/service/router.test.ts @@ -0,0 +1,56 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getVoidLogger } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import express from 'express'; +import request from 'supertest'; + +import { createRouter } from './router'; + +describe('createRouter', () => { + let app: express.Express; + + beforeAll(async () => { + const router = await createRouter({ + logger: getVoidLogger(), + config: new ConfigReader({ + periskop: { + locations: [ + { + name: 'db', + host: 'http://periskop-db', + }, + ], + }, + }), + }); + app = express().use(router); + }); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe('GET /health', () => { + it('returns ok', async () => { + const response = await request(app).get('/health'); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ status: 'ok' }); + }); + }); +}); diff --git a/plugins/periskop-backend/src/service/router.ts b/plugins/periskop-backend/src/service/router.ts new file mode 100644 index 0000000000..4f8ae12c31 --- /dev/null +++ b/plugins/periskop-backend/src/service/router.ts @@ -0,0 +1,57 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { errorHandler } from '@backstage/backend-common'; +import express from 'express'; +import Router from 'express-promise-router'; +import { Logger } from 'winston'; +import { PeriskopApi } from '../api/index'; +import { Config } from '@backstage/config'; + +/** + * @public + */ +export interface RouterOptions { + logger: Logger; + config: Config; +} + +/** + * @public + */ +export async function createRouter( + options: RouterOptions, +): Promise { + const { logger, config } = options; + const periskopApi = new PeriskopApi({ config }); + + const router = Router(); + router.use(express.json()); + + router.get('/health', (_, response) => { + logger.info('PONG!'); + response.send({ status: 'ok' }); + }); + + router.get('/:locationName/:serviceName', async (request, response) => { + const { locationName, serviceName } = request.params; + logger.info(`Periskop got queried for ${serviceName} in ${locationName}`); + const errors = await periskopApi.getErrors(locationName, serviceName); + response.status(200).json(errors); + }); + router.use(errorHandler()); + return router; +} diff --git a/plugins/periskop-backend/src/service/standaloneServer.ts b/plugins/periskop-backend/src/service/standaloneServer.ts new file mode 100644 index 0000000000..635b139ccf --- /dev/null +++ b/plugins/periskop-backend/src/service/standaloneServer.ts @@ -0,0 +1,56 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + createServiceBuilder, + loadBackendConfig, +} from '@backstage/backend-common'; +import { Server } from 'http'; +import { Logger } from 'winston'; +import { createRouter } from './router'; + +export interface ServerOptions { + port: number; + enableCors: boolean; + logger: Logger; +} + +export async function startStandaloneServer( + options: ServerOptions, +): Promise { + const logger = options.logger.child({ service: 'periskop-backend' }); + const config = await loadBackendConfig({ logger, argv: process.argv }); + + logger.debug('Starting application server...'); + const router = await createRouter({ + logger, + config, + }); + + let service = createServiceBuilder(module) + .setPort(options.port) + .addRouter('/periskop', router); + if (options.enableCors) { + service = service.enableCors({ origin: 'http://localhost:3000' }); + } + + return await service.start().catch(err => { + logger.error(err); + process.exit(1); + }); +} + +module.hot?.accept(); diff --git a/plugins/periskop-backend/src/setupTests.ts b/plugins/periskop-backend/src/setupTests.ts new file mode 100644 index 0000000000..813cdeaae3 --- /dev/null +++ b/plugins/periskop-backend/src/setupTests.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export {}; diff --git a/plugins/periskop-backend/src/types.ts b/plugins/periskop-backend/src/types.ts new file mode 100644 index 0000000000..e6ee09f97c --- /dev/null +++ b/plugins/periskop-backend/src/types.ts @@ -0,0 +1,48 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface AggregatedError { + aggregation_key: string; + total_count: number; + severity: string; + latest_errors: ErrorInstance[]; +} +export interface ErrorInstance { + error: Error; + uuid: string; + timestamp: number; + severity: string; + http_context: HttpContext; +} +export interface Error { + class: string; + message: string; + stacktrace?: string[]; + cause?: Error | null; +} +export interface HttpContext { + request_method: string; + request_url: string; + request_headers: RequestHeaders; + request_body: string; +} +export interface RequestHeaders { + [k: string]: string; +} + +export interface NotFoundInLocation { + body: string; +} diff --git a/plugins/periskop/.eslintrc.js b/plugins/periskop/.eslintrc.js new file mode 100644 index 0000000000..13573efa9c --- /dev/null +++ b/plugins/periskop/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: [require.resolve('@backstage/cli/config/eslint')], +}; diff --git a/plugins/periskop/README.md b/plugins/periskop/README.md new file mode 100644 index 0000000000..e937ee17ad --- /dev/null +++ b/plugins/periskop/README.md @@ -0,0 +1,34 @@ +# periskop + +[Periskop](https://periskop.io/) is a pull-based, language agnostic exception aggregator for microservice environments. + +![periskop-logo](https://i.imgur.com/z8BLePO.png) + +### `PeriskopErrorsTable` + +The Periskop Backstage Plugin exposes an entity tab component named `PeriskopErrorsTable`. Each of the entries in the table will direct you to the error details in your deployed Periskop instance location. + +![periskop-errors-card](./docs/periskop-plugin-screenshot.png) + +Now your plugin should be visible as a tab at the top of the entity pages. +However, it warns of a missing `periskop.io/name` annotation. + +Add the annotation to your component descriptor file as shown in the highlighted example below: + +```yaml +annotations: + periskop.io/name: '' +``` + +### Locations + +The periskop plugin can be configured to fetch aggregated errors from multiple deployment locations. This is especially useful if you have a multi-zone deployment, or a federated setup and would like to drill deeper into a single instance of the federation. Each of the configured locations will be included in the plugin's UI via a dropdown on the errors table. + +The plugin requires to configure _at least one_ Periskop API location in the [app-config.yaml](https://github.com/backstage/backstage/blob/master/app-config.yaml): + +```yaml +periskop: + locations: + - name: + host: +``` diff --git a/plugins/periskop/api-report.md b/plugins/periskop/api-report.md new file mode 100644 index 0000000000..8222f7a1c5 --- /dev/null +++ b/plugins/periskop/api-report.md @@ -0,0 +1,59 @@ +## API Report File for "@backstage/plugin-periskop" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +import { ApiRef } from '@backstage/core-plugin-api'; +import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { ConfigApi } from '@backstage/core-plugin-api'; +import { DiscoveryApi } from '@backstage/core-plugin-api'; +import { Entity } from '@backstage/catalog-model'; +import { RouteRef } from '@backstage/core-plugin-api'; + +// @public +export const isPeriskopAvailable: (entity: Entity) => boolean; + +// @public +export const PERISKOP_NAME_ANNOTATION = 'periskop.io/name'; + +// @public +export class PeriskopApi { + // Warning: (ae-forgotten-export) The symbol "Options" needs to be exported by the entry point index.d.ts + constructor(options: Options); + // Warning: (ae-forgotten-export) The symbol "AggregatedError" needs to be exported by the entry point index.d.ts + // + // (undocumented) + getErrorInstanceUrl( + locationName: string, + serviceName: string, + error: AggregatedError, + ): string; + // Warning: (ae-forgotten-export) The symbol "NotFoundInLocation" needs to be exported by the entry point index.d.ts + // + // (undocumented) + getErrors( + locationName: string, + serviceName: string, + ): Promise; + // (undocumented) + getLocationNames(): string[]; +} + +// @public (undocumented) +export const periskopApiRef: ApiRef; + +// @public (undocumented) +export const PeriskopErrorsTable: () => JSX.Element; + +// @public (undocumented) +export const periskopPlugin: BackstagePlugin< + { + root: RouteRef; + }, + {} +>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/periskop/config.d.ts b/plugins/periskop/config.d.ts new file mode 100644 index 0000000000..7aa259a6d0 --- /dev/null +++ b/plugins/periskop/config.d.ts @@ -0,0 +1,39 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface Config { + /** + * Configuration options for the periskop plugin + */ + periskop: { + /** + * Integration configuration for the periskop servers + * @visibility frontend + */ + locations: Array<{ + /** + * The name of the given Periskop instance + * @visibility frontend + */ + name: string; + /** + * The hostname of the given Periskop instance + * @visibility frontend + */ + host: string; + }>; + }; +} diff --git a/plugins/periskop/dev/index.tsx b/plugins/periskop/dev/index.tsx new file mode 100644 index 0000000000..b752f7f8b0 --- /dev/null +++ b/plugins/periskop/dev/index.tsx @@ -0,0 +1,20 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createDevApp } from '@backstage/dev-utils'; +import { periskopPlugin } from '../src/plugin'; + +createDevApp().registerPlugin(periskopPlugin).render(); diff --git a/plugins/periskop/docs/periskop-plugin-screenshot.png b/plugins/periskop/docs/periskop-plugin-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..9971f41992b313557f211e7fa020fced43da13e6 GIT binary patch literal 205851 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

$Fj8Jki8zowF9BJPf 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

>|}? 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

;-Iv)&Sh&4RpwqvmG%Wd=;K)<_a;=% z#IL^q32hRjKpMe0ki;=3Dw6ZD6H54hPJT4#nfK*uYip(vHKxlAc8P62ybF-gIGOew z-=ar$BqNu8VXU>BH>AysGDp}b+w6;6giA2PZI>f2{=ooPdlvq5 zv;t2XOMjlMqjN7x;922#qSwKX`({)`RP?AXtv=u7W<8K0ocs9eT0}sBUQ6RLYsV$B z*^te%KM9gkAK>Z$Q&D9&}1{xc^HDtb{1=FDv4tB`d^ zrSE&Ktyqr;0H!H=>@T+KOs=Ux(-a$hyg#%4aqq@vo*vAiA{#?(XKfK|r-4|l38EBn zYLYcp;iNw~t)>{9epi8*v(U;W&C|+%iHM;?x|9}0S(3LSN~-&#?gqIK21E0QlFo)* zFW>kg^cfPD2@-&&MMjo^iFa5QZFcCNOJO=fNqQ1Rs8~^c?}2fVh$}g z>-^c5eu7*2==%MN?Ym3}F1rqPlw&pYC%>a*OOYa_6jW?-dVN|>_i0@rK9+~&up_7H{vIpn5{?e0z4nwy0*yJp3 zdv)bxL(cr!O7^A(kk<*?^dkIgPCUCt9qI!bT6qBQ5OD6oIME_ZyCB*ZzEgsy!az6l zhVruo-Po@4KP|DyLUA)S5A|IUj9P&pyBv%reJXZFgRtut6BRxRZ(G?)rekrA5?ZBZ zpQM`J>A;Vv$=(g7^`~`FAg;Nwb`&Kl&NQ$Zy7?U~T3&wF6I*!aOjXke+i5V0fZXy7 zl?>QaN-;rAy@U2Y0naqfq8mzW;~Jhc1x@RRoSjA=$h zJFL6m4`by`dJQZua@Yq)gtggtfR|r^Etk&gn0I>Ewis{8{ntXX-7`$c?WBto-?u8s zv0Z9d9PrMj1d2QfT6>cUf;d54hCF5ux4W6t@4oak zkmYFb3k$0Y#JT?-moNsrsS=*BM&GOm>Ie~DY!BhdNd~B-GL{Q`U1^SCF_x~AB$XTj zs!ME~Y-7?Mf6N;eLZ7x`h6L*)z;}YU_e{Q4>y)s&to3PR+uTY&x-N@>bdoF4F?I{` z5tOJW%tG$7E`=Paz#+?FSN4;WyG`@iX~xwG3Kmxs9a~)?w!S~k>__<`IP|ulQRtdS=_`!mR>jIj=t^;7lGGVm_no<9Ut4qoF(IebAPDC zx~O#OoVc8StnyS(hC`cUyZzdcnTE2S+qnji?}!){rQw-kr?nkeSE zp7jVlj$GePgu-YF5ATR>k%yM}Mx0J&x^_$>WeNaC_F6~9u;w*83hEs8f2nG~*leHt zGPl-3hl^Jg0Ii4s$u}vb=!KYQR{B&%Qw(GJLOKB+a#`8zIZI-P%hi&I61lOLdpA2j zY_BuXb7s5o+s}A~Dg89>Io?&;!R&D@wh8Fz)<-x4Bt`I**e`2B3809^w#yjQf~act zrBFEEb9PoKzVV2za8aj$x3NJpHDHhX?mCKi2ND*q4JL&HZ?dQ)GiKqsh0#dRNr+>Z zh&K1YvGU^A(jL~rbuyqVwBoII&)sp7IC@PuG}%j(-I)zGwx>NKnzB^xzl~#_%`y$D1(qrSk)s z(Nx#Vj+wblZ-4|)gpmxV4TLe_4Kf%j0 z?Sg_nzCYy#N`_ZIpm!5sO{#-}=!pbLCG9qtWl3BQnZa4EQ#=Y!h9Fi7Uq1T3Z%g+bd~#baH{X%P)E(^b~svhu8Sbx zk3`=n_HlMU$;nu{?0ilNnNwTby=k>d5nO@8 zwZS3-)6Z^SA-RG|qYy8<*ZCLl6bd9ygH$Z8i{qv)h#)JaGWoxd(}slxi;`e*9Si5c zR?v5vUJ~=w{lOx~ak*LE+x++NKsdvQUVY^* z%*WRgR@O@D{Bhv>HC~r+i?2ZHg`}fQ2a>_@Fo`~fT!6XTI1PHCFeL&80kr2m`;qy& zx#QpwTC2sqSHI29sk&8jR}X6GH|L?L8Ucv=!mf-N=8BHm%=7Ko-de@@otaX1LcF5# z<8V`n7I~Oj@uHfz#f3K0Lb=2z_Nh{waYP${nz1G*1JO3zEh_Bxirw?cZ4AjQ0srqc zrx4_9#LEy6HL>T9r}y3fPfSM=%xye~tpG&>yLpq$b8K#&pYp@Uzx$9|>&>7O+*DudruFItIhL7rRm zFR%#^8OpAWRP=4vF!vd6AH#E(MTVSq?y5_W;1wgW0dA?(K#uTv&}cbP0@(=FaiC7S z0j}Whho}1!V*rM}GV=0A!dq~EeLP$0K)U=Tkx}3og)j2Ug`co_hDNNccdvJX|af{+W;k&93&jvk;Rr$LmGeeyXe zZ#q=`jXw|BXW`d^hcxKIaRAdEDvd=~%{w*Lk*7V$Dlq9V3{iblA}zduZssaD45ZFHwXC;D(vk7wK{cn)v6(uEt*m65ktQ~GH>cA9p+bZGKgq$#& zRXn&*{9o#ppRJ1A6SeNQ-MYE4KDeCVjoQX*{jRi+3;lprJ(YuQ)Ddq{leeGtEa7>w zF)l!ZB44^OWY5u>T_V{|06zI|K0UiQjVqabp;!5sa{crn9R_dE31^0kfpL^| z3X643BT+-YwYPfgg8YlWz)l5I&Z2+)Xl~`@N4^Ryk@UXNH2BaZv78k4D_}ZJZL0`vYhA=g{o| zy;l4xOVbh!u>uuMNFg)gp-me=OsL)+o?ly{`w16Z-Je9uKOMh4^}-gEZf66&W*T)h zxpwm8QfI_0Z(7kWKo|9(bsy|^8b686H||CGw#3YTW_sL7Ma>K}wG=AlR=NX;G2733 z%N|^R%$=#h5O4a{IFM*G>U*fAV#HpIS3x4Yj*JuCYg$B1$IENIwSeO51%)|+6;#CM zu`g%_@Jbfjt$vFdi%13}Skf6YWQ@)!hK{ zMk3IuCw23om=lphab}eW&2O!;Ps`$+HNTrOO2EY2$PH6L7>RBotvm9 z{cE{G;IGaA+-`3O1fd()S*;wHM<8aK!QVBN!|L6U30SQp`%#0eolZ0Cug_e=1&G4) z3_l0>y4w*x52$NRV%DmRYvRi61!2cYjyP4pE$sqK4=`jkVoK*(7^(l}2RYTysnF*h zp}_$|_LGUYlBRddhn{Enb6@_rfPXeQG4$Ql5j_xTm;mIFywyT1@UxZynkfhH@kx+I zj3Ac8K$Jk)?N0c4Z{+^xQ0I-|b)Z#ey$pSAAsN_e&;|QqiF+6b={?>4w|hw4>lf-{ z4e{>T-x7`gohJI{UxgsigUW!Y0La5w)ju)7fB$&N5MX#W_3)$x{__d>C*=Nb93Th- zlvTg){XG9JH~5bSL~;$6;-%qc*7Xn> zflxd~-2a5F{t6QUXg)5~|Kt($g5Hn=o?s`6P1yha5&8f6D|V(0^1t8P{(NP3D!{Qn z`_PN>pI!G`fld7Xvs?Vj7X)zvw`(IjjPTE^`S*_%-Flh-jgjGB+%WX7Kqu`XB;fp) zm-T=C^7~Dg(VxS|zkf`+0t|AYoGjM=*>ww@5%m2z>i+x3Ld^iH9{1~Kz$5LyTG?6$ zQpzVrs`1dDQgg7H)0$$QKmmq0PG}ZcpyQ>wa|Za^qmx=kv4r5UQK=q+RO+ zbsA})YJa;K4{Q6RT6+9#&d2i>6w7(mGM^5s%)9MU4lXGli`9>=L-3Cx&-;|(~s92<|xSEV!J}};1 z6{WHq3rK1Tb@&I{wDPIT$KtUS<>K>G*&`*T+!tEAK8lzcMJlPdw-tvI2hW2DqGeq9 zbT!8mdv>_-1DW>0HP(#HF+#w`BNs>yRBE(01EQG{0oKYtNYA@tnQfKt6aVaBl=$9< z^Hnl0q(Y~&4cqfAsbnsjY=C^oWXs(CJeDh$ss?EKnaqGXJy1G$-?7jW^7kOIrbhac zQi{baZ&epp>dkGE{btVv%hLmQGHCs<1a!mq;qM1Z67(`Fa!vRZz5n_$H$Pw$6GP5^l5oiyFcc#w$mXqfQz1${<73L| zI=)}&v~_R0r}U{)On+C704D*b%(d;!Ql-jOX{H5v)$8jvh6@iD@oyz5)DBG^?*KM8 z`x%KC=$4Kx`YsYRen7Nw5ct@KZ!mrq&O_`m3`idi91Qai$5^Dg`dU@=@IGHWeAIHp zrPXOE$&tA;;~h{JodC>WrBc`m-GEo0l|*d+lf(|ZZ9{l% z;5+sNxml&DHnuv3*4bK)(r-6R0(={u1)l$*Fu$PzE%%rNW70%VpfpLBPBm#qI9FtvQ_*7xJ8^6Z#6u41m@v6<=Rm!Zk2W%fmiQkB6v|uRkx4QsoIIM)C?-w-d~d^qD!6VA|TubZ}mlU z?0;Ct=n-{B5Y5p61_eKiYZp0^&*P(Q7Xqe|F9x$pWJdUh)tp*7Mqv6XIob{XE<$zT4>q8_T@9%5qx4WTz&<+7Pqi+Gz272H$@v(u9;Hb5_q^7gs zM6-v2Er!*(oeNcSx@17gP$)`*Q_k(WpM)@>hCDSc{uWoklphDW&-T-Wp=Q>DJPH5WeEvPeit55;&AdOw%1rGs^C*yXGs7IK zN80Z7$>4D~bBTI9@9B<2B=DRe1Dgvno!?#MTS*cfINyVzXhShe)Q(moH+MQ+d@-f0 zlc>_{7#_>ba{3JR3_APsW1#H!3MHZ-(7OU8NK`I2z}HKcWB5T_obXvgbCy%)=|OVH zK6WbkynoJdagL{%EM5=hs0~os$i%E|**>&$5I%$8r89p71vjm+Rev6atCh>BM9DE7 zxvF%Z7qdtOdxrCT7LJQy5tZjI-ksbSe+(}J8$IXw`}}rCj{xNFvbDn`41~Kn#84}n z81Be4RnsoSdO!8y8hC&b#rIvQg7i>V6)~R*zjhnW!`s|oi$FPz~EfU66-N@=HzW$q!`Yss>c-c zTlMH?E?nAQG)I4Hxpt6Uc?g+qm=)8z;SIN2EzNS#6Y3AJU{2#$-*E&?RJ?DHcdvoj zgGz44?VFqHfagRK(KQmCO zJSy5yxJLQ5U#FbT*F36$p6vSWzUG5?eY=vcq2%jL?DwbkR@Fw1{v1%;(E9-km|~3z zkr!GdeU1D5H_d9(=&k-}iqVpnv}6UoGe2wwEfpX~lV0B)=TSmJSZMOrT@ZY3( z`CPmyVat@VGO3p=f^6e=*OKAa)kZ@O*N%GeJT? zsQ9J=R+Gb|k$(rUJmUZ(jN}XLG`LZmzt@XVUeIe!xXMmDy8JU%KTXuUxxTN%K`ZcI z#w|-6t+wfZ2*W4a?2`}(Je(;>UCTH*X?spE$#DJv#Bovquw0|zyab6mCEx(W!l}K4 zWW87`*ZOp4@e=3DPG9R%j`9cSZ_Nf7T;}LY`kKz;{_!qX8B=bgM*g(C;i`)y60 z7_g*^&c@J1`-nfmGvm6Y3`Fzzu@iMtxRu(hYE!GUi|`d#-wiXxdRAb2+BTp5MWM zfLcnG&#ONP?AM~RET!7+&yo8v3knjFet6bpjo;lX<0EEa5~A7o8ic=4)BZQ&f+6XB z-`kOd-eRC9TBW;+5}`DDT8lJwrA)9ydq}|<2=%Cq)sq8*R(%6UgHd}gfh}&;Hy;E& zhel+j1orJPM3>RRxgWMoc-co?t~-Z??{T`tdC-L8HpL7-#nOHykc+*IKoG>FL8vrp zJ6hqS^3PLSQT>^{hv)_v=M%h6jIhKo zXPJTChPKpC=ss9sg_8#Ns$#!e8jysm;V{&OPiLReY1j`hUHKm2`B;a8% zBw+$u{gu&_etPc?l(*C(i?HF{(z63*-;z>@-h)TFaEtZu%dJWc*inl-S5??{Z%^)E zAwPhmFyod~jV41%?&jtKHh)rYC(;=)ZicEj%(aE{6EQK8l6SMD!NIEw-a(X#t@oi8 z+!QrV9b5$mbL$ZGn6Fy+bW+eQ1!IHxvJ9JW)!@YVP+Z)|l2t8%RnTiYWjeK{AK&Hu zz)-`?qhv}x{inmhUA4rJHOdQhNqSaXR|O%Q{=%ZgI%RmE>MjS^S6P-riM`TI9?H40vB#LDn~*fr(7B#yho70~`|G?A z)?|tSXi$P)KTnom9x&pnHvU62^9oZ^0}>$gM62tEKcGUJ{XCck)3BRQo$?ijHPpT6 z4f8WS=m5(cj#sZIazwYbApwKCUQ{ALS?7AqQK1Qlh2$t}oiDz4Pig@pg^o=J58u1x zYO`3tmtr4_RtWIoHSTy^d+`sYJ$TFlv@y1`x{k?f$mG?4oz`Nj4ng&+%hvNj`g4G+ zpsh_B;yZ`(idpAHX#{Z5|4}P^u>uFei9xA$e*_53ra>rK-GvGbQYvID9Xp=yjL^R% z2n6@8eO|0KQw9@vRsqq*Qf(fOFOs85hXXaNj2@ktEKxWhWF}ImIRF{vW)%Ng0ze}p zs)#+0c3u8n?bj1Smx3<{{K#*o7?4m6fu=D`0N;jNT$s%NK+2Z$(H!`)f&~`wVWtB*BnDjg?9o;p7 zCtmvvtzPhOBKI|XGYuirk~zYXiO@H0O;CS-MFAkp8`}!e}1q@%6%L?-kTWdtI|{o zz-vkoulh$!i7C5-RVw-Y%$TxGKP48Ta88_ntHEM-68O9M*uwn2{O>dd-#I4H(v27? zaaYC|Xd319Po4*v;-1YEO==%_0=ai->UT?$@529Olt6pO?kHZbMyBxG4rFI3x8U#i zN4oQR`?F@-UwOTw zzI!+KFqThWH6E?B&7vSzPF%36yER@}UQAc=!=6&7FQ9 z!kulKo+$kq3|>oZn_mxIp0*WQ8eEyf3!=$beoEo$GH$Z8QM+h2*pC!+lZS~8(nH6b zh$wyhp$j7iQ2a|D8CiI?CaR9rJLGDs#TQ7{QZ{p(q|!FgH~AWl2?ueU3xDelI#XIG zumbAB&&ze@4wIVX<}C`)rY9}a1qOIhvNNMfW)i^*?U*)?GRBs&-TK)^LQW0kr${_% z)enqGal+VP_4wW(1(p8p2HbdSLuLecR*cTt5U4dg&KAnfev)5FD-@$K)do?P#X$6z zJoUjdmnO%9n}zJJLH^>?JrpgbmHJ<3S3lNloX7 zbr!RXBNEL4YheiTUPzkS+Nq0xs*xum`rGjmcVcE{8KWtHWH=Zb8<)1WX1r5ZQrdX^ z`ZXI9C+BQUb#;A21nS6QgI&HTIw#S@#Dog8gf0jm+}C+Lx;XF|Z8*$V8t*TS&(b{m z!oySCZG?8nmE2f!BTMBIq1UGhte?_G$?gd#d4?oYhmaOPnpNRp9 z9X*J%J`)=3#+@)w+J>jZ;E^r6R1;FOUmr9CqQ4XSb=QSrK*Nu|IPQUmiydmAQA%yM z!Zl;VFyD(cW_j78S}nrk!x-7dIa4oSqm+W!`HhjG)LtLAkFzsQ?}&$CRPd5+qWy?Y zl{5g_ui%Fqg@EWAjya5=G5FkF(ILzUEV3~-gja(NyFoI;=d}z?y0S% zyzby3%&x0omNuJxU%MmOARWv9=z?k-N}XluOS^GdiaVpzC9!)WNI($r@|VrJKXOV){yPwFVSgGBI4)=gTa&TECeB}*2>DUydHc` z4UrG;-wsvS4#U8}?9c36Ai#zAmf~eZudJ*bSLqsLHE&UslIS^ofW@ludqXwWZNgk+ z+4I-1^B(pI4PQt@kc+Eeo#k=;oRBb!6(h?Tuw(5n>rD_~U}91be+Ul`KfkwlAIQSS zmcs;FtW_iJd4C=6M)bU#@Yh)I(rK40ke5C-KA=Usqo79ztp%|WCB26;=%ed~3PNcjm@0<)+9z0 zqA9r6lk09Q-1?;`8`P`4oo{YxV~CGfry3l7@KXO?ccl~3KzI;vOTV|n-P=DEiaMF> z>Wr<3=AG@{MO$vBkPZ6$AIeTeEEleIrQ7H_Ja+`>O5=tZFrBO}NsOrkD(o#p+<_OsotI~VJ{ zi=ecPjyj8*kvPSc$BkyVm~i$<;3bcO!?AeM_wK#C)R`IQ{M4@^-7z_?Vp)hu=cur4 z&g@pluhO6AF{NBZb%%IT&3l~BM7ejnjZ*ORK8Uyn-yeukW?#cYdqtK|zA;JU>YoO` zZ76H%Qgyq(-v98y)F6$o>FGS>z#PFt!wmdf*ag5(o4Lnbz=CJ0%gDU>V4wRn?rv?v z1zy1rg&Dj-!%7f$6=gBV3Hj8)GMNX;PrQ@NSE>`xur?iA6V##n`2gcXRSiNIB!L=* zoM7M+rIH5S@2|K;xS03wKYaMmOWCJ&-icZpG*|=%Z*zLv%q}e*MiBAhrncw2yKith z%MKZZU!GrGC9&h_(%l4tK}xHur%C|0XPF0;nC};W>c~t>6%-fS1A+rP8u>I(dV0D` zGZ03JB;YeVEbELx{aZUN=d3ag?zXGz`BsqEEUl{J?|vHQ{R|70&cdV`*FAq|MH`C@ zP@*PH($mt?G(L)5JvfsQWP3h!!snBzK`CcG0`uxE+N>se=?{eeIcM|tx3|5Lz-oux TU%=mn0KTNe<;6-xKKcAVBeKRU literal 0 HcmV?d00001 diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json new file mode 100644 index 0000000000..b832372090 --- /dev/null +++ b/plugins/periskop/package.json @@ -0,0 +1,58 @@ +{ + "name": "@backstage/plugin-periskop", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "private": false, + "homepage": "https://periskop.io", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "scripts": { + "build": "backstage-cli plugin:build", + "start": "backstage-cli plugin:serve", + "lint": "backstage-cli lint", + "test": "backstage-cli test", + "diff": "backstage-cli plugin:diff", + "prepack": "backstage-cli prepack", + "postpack": "backstage-cli postpack", + "clean": "backstage-cli clean" + }, + "dependencies": { + "@backstage/catalog-model": "^0.11.0", + "@backstage/core-components": "^0.8.9", + "@backstage/core-plugin-api": "^0.6.1", + "@backstage/plugin-catalog-react": "^0.7.0", + "@backstage/theme": "^0.2.15", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.57", + "moment": "^2.29.1", + "react-use": "^17.2.4" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "^0.14.0", + "@backstage/core-app-api": "^0.5.3", + "@backstage/dev-utils": "^0.2.22", + "@backstage/test-utils": "^0.2.5", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^11.2.5", + "@testing-library/user-event": "^13.1.8", + "@types/jest": "*", + "@types/node": "*", + "cross-fetch": "^3.0.6", + "msw": "^0.35.0" + }, + "files": [ + "dist", + "config.d.ts" + ], + "configSchema": "config.d.ts" +} diff --git a/plugins/periskop/src/api/index.ts b/plugins/periskop/src/api/index.ts new file mode 100644 index 0000000000..8683d636e4 --- /dev/null +++ b/plugins/periskop/src/api/index.ts @@ -0,0 +1,89 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ConfigApi, DiscoveryApi } from '@backstage/core-plugin-api'; +import { AggregatedError, NotFoundInLocation } from '../types'; + +type Options = { + discoveryApi: DiscoveryApi; + configApi: ConfigApi; +}; + +type PeriskopLocation = { + name: string; + host: string; +}; + +/** + * API abstraction to interact with Periskop's backends. + * + * @public + */ +export class PeriskopApi { + private readonly discoveryApi: DiscoveryApi; + private readonly locations: PeriskopLocation[]; + + constructor(options: Options) { + this.discoveryApi = options.discoveryApi; + this.locations = options.configApi + .getConfigArray('periskop.locations') + .flatMap(locConf => { + const name = locConf.getString('name'); + const host = locConf.getString('host'); + return { name: name, host: host }; + }); + } + + private getApiUrl(locationName: string): string | undefined { + return this.locations.find(loc => loc.name === locationName)?.host; + } + + getLocationNames(): string[] { + return this.locations.map(e => e.name); + } + + getErrorInstanceUrl( + locationName: string, + serviceName: string, + error: AggregatedError, + ): string { + return `${this.getApiUrl( + locationName, + )}/#/${serviceName}/errors/${encodeURIComponent(error.aggregation_key)}`; + } + + async getErrors( + locationName: string, + serviceName: string, + ): Promise { + const apiUrl = `${await this.discoveryApi.getBaseUrl( + 'periskop', + )}/${locationName}/${serviceName}`; + const response = await fetch(apiUrl); + + if (!response.ok) { + if (response.status === 404) { + return { + body: await response.text(), + }; + } + throw new Error( + `failed to fetch data, status ${response.status}: ${response.statusText}`, + ); + } + return response.json(); + } +} diff --git a/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx b/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx new file mode 100644 index 0000000000..494f83cef0 --- /dev/null +++ b/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx @@ -0,0 +1,190 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import moment from 'moment'; +import { Entity } from '@backstage/catalog-model'; +import { useApi } from '@backstage/core-plugin-api'; +import { useEntity } from '@backstage/plugin-catalog-react'; +import { + Content, + ContentHeader, + Table, + TableColumn, + Progress, + StatusWarning, + StatusError, + StatusPending, + Select, + EmptyState, + Link, +} from '@backstage/core-components'; +import Alert from '@material-ui/lab/Alert'; +import useAsync from 'react-use/lib/useAsync'; +import { periskopApiRef } from '../..'; +import { AggregatedError, NotFoundInLocation } from '../../types'; + +/** + * Constant storing Periskop project name. + * + * @public + */ +export const PERISKOP_NAME_ANNOTATION = 'periskop.io/name'; + +/** + * Returns true if Periskop annotation is present in the given entity. + * + * @public + */ +export const isPeriskopAvailable = (entity: Entity): boolean => + Boolean(entity.metadata.annotations?.[PERISKOP_NAME_ANNOTATION]); + +const renderKey = ( + error: AggregatedError, + linkTarget: string, +): React.ReactNode => { + return ( + + {error.aggregation_key} + + ); +}; + +const renderSeverity = (severity: string): React.ReactNode => { + if (severity.toLocaleLowerCase('en-US') === 'warning') { + return {severity}; + } else if (severity.toLocaleLowerCase('en-US') === 'error') { + return {severity}; + } + return {severity}; +}; + +const renderLastOccurrence = (error: AggregatedError): React.ReactNode => { + return moment(new Date(error.latest_errors[0].timestamp * 1000)).fromNow(); +}; + +function isNotFoundInLocation( + apiResult: AggregatedError[] | NotFoundInLocation | undefined, +): apiResult is NotFoundInLocation { + return (apiResult as NotFoundInLocation)?.body !== undefined; +} + +export const PeriskopErrorsTable = () => { + const { entity } = useEntity(); + const entityPeriskopName: string = + (entity.metadata.annotations?.[PERISKOP_NAME_ANNOTATION] as + | string + | undefined) ?? entity.metadata.name; + + const periskopApi = useApi(periskopApiRef); + const locations = periskopApi.getLocationNames(); + const [locationOption, setLocationOption] = React.useState( + locations[0], + ); + const { + value: aggregatedErrors, + loading, + error, + } = useAsync(async (): Promise => { + return periskopApi.getErrors(locationOption, entityPeriskopName); + }, [locationOption]); + + if (loading) { + return ; + } else if (error) { + return {error.message}; + } + + const columns: TableColumn[] = [ + { + title: 'Key', + field: 'aggregation_key', + highlight: true, + sorting: false, + render: aggregatedError => { + const errorUrl = periskopApi.getErrorInstanceUrl( + locationOption, + entityPeriskopName, + aggregatedError, + ); + return renderKey(aggregatedError, errorUrl); + }, + }, + { title: 'Occurrences', field: 'total_count', sorting: true }, + { + title: 'Last Occurrence', + render: aggregatedError => renderLastOccurrence(aggregatedError), + defaultSort: 'asc', + customSort: (a, b) => + b.latest_errors[0].timestamp - a.latest_errors[0].timestamp, + type: 'datetime', + }, + { + title: 'Severity', + field: 'severity', + render: aggregatedError => renderSeverity(aggregatedError.severity), + sorting: false, + }, + ]; + + const sortingSelect = ( + ({ + selected={instanceOption} + label="Instance" + items={instanceNames.map(e => ({ label: e, value: e, }))} - onChange={el => setLocationOption(el.toString())} + onChange={el => setInstanceOption(el.toString())} /> ); @@ -154,7 +154,7 @@ export const PeriskopErrorsTable = () => { ); - if (isNotFoundInLocation(aggregatedErrors)) { + if (isNotFoundInInstance(aggregatedErrors)) { return ( {contentHeader} diff --git a/plugins/periskop/src/types.ts b/plugins/periskop/src/types.ts index e6ee09f97c..084ba52620 100644 --- a/plugins/periskop/src/types.ts +++ b/plugins/periskop/src/types.ts @@ -43,6 +43,6 @@ export interface RequestHeaders { [k: string]: string; } -export interface NotFoundInLocation { +export interface NotFoundInInstance { body: string; } From 7bb98ee65536d00f44443ed2f00b334dccdae231 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Tue, 1 Mar 2022 10:32:47 +0100 Subject: [PATCH 11/29] Rename host -> url Signed-off-by: Julio Zynger --- plugins/periskop-backend/src/api/index.ts | 9 ++++----- plugins/periskop-backend/src/service/router.test.ts | 2 +- plugins/periskop/README.md | 2 +- plugins/periskop/config.d.ts | 2 +- plugins/periskop/src/api/index.ts | 9 ++++----- 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/plugins/periskop-backend/src/api/index.ts b/plugins/periskop-backend/src/api/index.ts index ff0f1e8b5d..6245dcacfd 100644 --- a/plugins/periskop-backend/src/api/index.ts +++ b/plugins/periskop-backend/src/api/index.ts @@ -24,7 +24,7 @@ export type Options = { type PeriskopInstance = { name: string; - host: string; + url: string; }; export class PeriskopApi { @@ -35,14 +35,13 @@ export class PeriskopApi { .getConfigArray('periskop.instances') .flatMap(locConf => { const name = locConf.getString('name'); - const host = locConf.getString('host'); - return { name: name, host: host }; + const url = locConf.getString('url'); + return { name: name, url: url }; }); } private getApiUrl(instanceName: string): string | undefined { - return this.instances.find(instance => instance.name === instanceName) - ?.host; + return this.instances.find(instance => instance.name === instanceName)?.url; } async getErrors( diff --git a/plugins/periskop-backend/src/service/router.test.ts b/plugins/periskop-backend/src/service/router.test.ts index f071ab901f..687255c6e0 100644 --- a/plugins/periskop-backend/src/service/router.test.ts +++ b/plugins/periskop-backend/src/service/router.test.ts @@ -32,7 +32,7 @@ describe('createRouter', () => { instances: [ { name: 'db', - host: 'http://periskop-db', + url: 'http://periskop-db', }, ], }, diff --git a/plugins/periskop/README.md b/plugins/periskop/README.md index ad71529b70..0c19d5f570 100644 --- a/plugins/periskop/README.md +++ b/plugins/periskop/README.md @@ -31,5 +31,5 @@ The plugin requires to configure _at least one_ Periskop API location in the [ap periskop: instances: - name: - host: + url: ``` diff --git a/plugins/periskop/config.d.ts b/plugins/periskop/config.d.ts index 31ab363a15..dfb914cd4f 100644 --- a/plugins/periskop/config.d.ts +++ b/plugins/periskop/config.d.ts @@ -33,7 +33,7 @@ export interface Config { * The hostname of the given Periskop instance * @visibility frontend */ - host: string; + url: string; }>; }; } diff --git a/plugins/periskop/src/api/index.ts b/plugins/periskop/src/api/index.ts index c35de9bcd3..1258529698 100644 --- a/plugins/periskop/src/api/index.ts +++ b/plugins/periskop/src/api/index.ts @@ -24,7 +24,7 @@ type Options = { type PeriskopInstance = { name: string; - host: string; + url: string; }; /** @@ -42,14 +42,13 @@ export class PeriskopApi { .getConfigArray('periskop.instances') .flatMap(locConf => { const name = locConf.getString('name'); - const host = locConf.getString('host'); - return { name: name, host: host }; + const url = locConf.getString('url'); + return { name: name, url: url }; }); } private getApiUrl(instanceName: string): string | undefined { - return this.instances.find(instance => instance.name === instanceName) - ?.host; + return this.instances.find(instance => instance.name === instanceName)?.url; } getInstanceNames(): string[] { From b6fdf5c5f351ed99fa67b531f30a45f393021c50 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Tue, 1 Mar 2022 10:49:24 +0100 Subject: [PATCH 12/29] Fix warning and update api-reports Signed-off-by: Julio Zynger --- plugins/periskop/api-report.md | 92 +++++++++++++++++++++++++------ plugins/periskop/src/api/index.ts | 5 +- plugins/periskop/src/index.ts | 1 + plugins/periskop/src/types.ts | 10 ++++ 4 files changed, 89 insertions(+), 19 deletions(-) diff --git a/plugins/periskop/api-report.md b/plugins/periskop/api-report.md index 8222f7a1c5..e60f039d4e 100644 --- a/plugins/periskop/api-report.md +++ b/plugins/periskop/api-report.md @@ -10,37 +10,94 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; import { ConfigApi } from '@backstage/core-plugin-api'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { Entity } from '@backstage/catalog-model'; -import { RouteRef } from '@backstage/core-plugin-api'; + +// @public (undocumented) +export interface AggregatedError { + // (undocumented) + aggregation_key: string; + // (undocumented) + latest_errors: ErrorInstance[]; + // (undocumented) + severity: string; + // (undocumented) + total_count: number; +} + +// @public (undocumented) +interface Error_2 { + // (undocumented) + cause?: Error_2 | null; + // (undocumented) + class: string; + // (undocumented) + message: string; + // (undocumented) + stacktrace?: string[]; +} +export { Error_2 as Error }; + +// @public (undocumented) +export interface ErrorInstance { + // (undocumented) + error: Error_2; + // (undocumented) + http_context: HttpContext; + // (undocumented) + severity: string; + // (undocumented) + timestamp: number; + // (undocumented) + uuid: string; +} + +// @public (undocumented) +export interface HttpContext { + // (undocumented) + request_body: string; + // (undocumented) + request_headers: RequestHeaders; + // (undocumented) + request_method: string; + // (undocumented) + request_url: string; +} // @public export const isPeriskopAvailable: (entity: Entity) => boolean; +// @public (undocumented) +export interface NotFoundInInstance { + // (undocumented) + body: string; +} + // @public export const PERISKOP_NAME_ANNOTATION = 'periskop.io/name'; // @public export class PeriskopApi { - // Warning: (ae-forgotten-export) The symbol "Options" needs to be exported by the entry point index.d.ts - constructor(options: Options); - // Warning: (ae-forgotten-export) The symbol "AggregatedError" needs to be exported by the entry point index.d.ts - // + constructor(options: PeriskopApiOptions); // (undocumented) getErrorInstanceUrl( - locationName: string, + instanceName: string, serviceName: string, error: AggregatedError, ): string; - // Warning: (ae-forgotten-export) The symbol "NotFoundInLocation" needs to be exported by the entry point index.d.ts - // // (undocumented) getErrors( - locationName: string, + instanceName: string, serviceName: string, - ): Promise; + ): Promise; // (undocumented) - getLocationNames(): string[]; + getInstanceNames(): string[]; } +// @public (undocumented) +export type PeriskopApiOptions = { + discoveryApi: DiscoveryApi; + configApi: ConfigApi; +}; + // @public (undocumented) export const periskopApiRef: ApiRef; @@ -48,12 +105,13 @@ export const periskopApiRef: ApiRef; export const PeriskopErrorsTable: () => JSX.Element; // @public (undocumented) -export const periskopPlugin: BackstagePlugin< - { - root: RouteRef; - }, - {} ->; +export const periskopPlugin: BackstagePlugin<{}, {}>; + +// @public (undocumented) +export interface RequestHeaders { + // (undocumented) + [k: string]: string; +} // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/periskop/src/api/index.ts b/plugins/periskop/src/api/index.ts index 1258529698..c935733a1e 100644 --- a/plugins/periskop/src/api/index.ts +++ b/plugins/periskop/src/api/index.ts @@ -17,7 +17,8 @@ import { ConfigApi, DiscoveryApi } from '@backstage/core-plugin-api'; import { AggregatedError, NotFoundInInstance } from '../types'; -type Options = { +/** @public */ +export type PeriskopApiOptions = { discoveryApi: DiscoveryApi; configApi: ConfigApi; }; @@ -36,7 +37,7 @@ export class PeriskopApi { private readonly discoveryApi: DiscoveryApi; private readonly instances: PeriskopInstance[]; - constructor(options: Options) { + constructor(options: PeriskopApiOptions) { this.discoveryApi = options.discoveryApi; this.instances = options.configApi .getConfigArray('periskop.instances') diff --git a/plugins/periskop/src/index.ts b/plugins/periskop/src/index.ts index 4f66e60228..a22fc65d73 100644 --- a/plugins/periskop/src/index.ts +++ b/plugins/periskop/src/index.ts @@ -21,3 +21,4 @@ export { PERISKOP_NAME_ANNOTATION, } from './components/PeriskopErrorsTable'; export * from './api/index'; +export * from './types'; diff --git a/plugins/periskop/src/types.ts b/plugins/periskop/src/types.ts index 084ba52620..d3d0d6663f 100644 --- a/plugins/periskop/src/types.ts +++ b/plugins/periskop/src/types.ts @@ -14,12 +14,15 @@ * limitations under the License. */ +/** @public */ export interface AggregatedError { aggregation_key: string; total_count: number; severity: string; latest_errors: ErrorInstance[]; } + +/** @public */ export interface ErrorInstance { error: Error; uuid: string; @@ -27,22 +30,29 @@ export interface ErrorInstance { severity: string; http_context: HttpContext; } + +/** @public */ export interface Error { class: string; message: string; stacktrace?: string[]; cause?: Error | null; } + +/** @public */ export interface HttpContext { request_method: string; request_url: string; request_headers: RequestHeaders; request_body: string; } + +/** @public */ export interface RequestHeaders { [k: string]: string; } +/** @public */ export interface NotFoundInInstance { body: string; } From 5ed59fb8c14162a32160a1abd99aa0bd1884e1a0 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Tue, 1 Mar 2022 11:04:40 +0100 Subject: [PATCH 13/29] Revamp README Signed-off-by: Julio Zynger --- plugins/periskop/README.md | 42 +++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/plugins/periskop/README.md b/plugins/periskop/README.md index 0c19d5f570..acc1e03074 100644 --- a/plugins/periskop/README.md +++ b/plugins/periskop/README.md @@ -4,22 +4,54 @@ ![periskop-logo](https://i.imgur.com/z8BLePO.png) -### `PeriskopErrorsTable` +## Periskop aggregated errors -The Periskop Backstage Plugin exposes an entity tab component named `PeriskopErrorsTable`. Each of the entries in the table will direct you to the error details in your deployed Periskop instance location. +The Periskop Backstage Plugin exposes a component named `PeriskopErrorsTable`. +Each of the entries in the table will direct you to the error details in your deployed Periskop instance location. ![periskop-errors-card](./docs/periskop-plugin-screenshot.png) -Now your plugin should be visible as a tab at the top of the entity pages. -However, it warns of a missing `periskop.io/name` annotation. +## Setup -Add the annotation to your component descriptor file as shown in the highlighted example below: +1. Configure the [periskop backend plugin](https://github.com/backstage/backstage/tree/master/plugins/periskop-backend/) + +2. If you have standalone app (you didn't clone this repo), then do + +```bash +# From your Backstage root directory +cd packages/app +yarn add @backstage/plugin-periskop +``` + +3. Add to the app `EntityPage` component: + +```tsx +// In packages/app/src/components/catalog/EntityPage.tsx +import { PeriskopErrorsTable } from '@backstage/plugin-periskop'; + +const componentPage = ( + + {/* other tabs... */} + + + + + + + +``` + +4. [Setup the `app-config.yaml`](#instances) and instance name and urls + +5. Annotate entities with the periskop service name ```yaml annotations: periskop.io/name: '' ``` +6. Run app with `yarn start` and navigate to `/periskop` or a catalog entity 'Periskop' tab + ### Instances The periskop plugin can be configured to fetch aggregated errors from multiple deployment instances. From a9c4cc91671b01b07a8c1950753925faf8fc7c64 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Tue, 1 Mar 2022 14:13:57 +0100 Subject: [PATCH 14/29] Replace moment with luxon Signed-off-by: Julio Zynger --- plugins/periskop/package.json | 3 ++- .../components/PeriskopErrorsTable/PeriskopErrorsTable.tsx | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index c6fc02a308..661efc23c3 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -30,7 +30,7 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", - "moment": "^2.29.1", + "luxon": "^2.0.2", "react-use": "^17.2.4" }, "peerDependencies": { @@ -46,6 +46,7 @@ "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", "@types/jest": "^26.0.7", + "@types/luxon": "^2.0.4", "@types/node": "^14.14.32", "cross-fetch": "^3.1.5", "msw": "^0.35.0" diff --git a/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx b/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx index 54f97b0700..ae299c6128 100644 --- a/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx +++ b/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import moment from 'moment'; +import { DateTime } from 'luxon'; import { Entity } from '@backstage/catalog-model'; import { useApi } from '@backstage/core-plugin-api'; import { useEntity } from '@backstage/plugin-catalog-react'; @@ -69,7 +69,9 @@ const renderSeverity = (severity: string): React.ReactNode => { }; const renderLastOccurrence = (error: AggregatedError): React.ReactNode => { - return moment(new Date(error.latest_errors[0].timestamp * 1000)).fromNow(); + return DateTime.fromMillis( + error.latest_errors[0].timestamp * 1000, + ).toRelative(); }; function isNotFoundInInstance( From 2d7aa19e099e08f4fd02b29c9b840f666a54a45a Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Tue, 1 Mar 2022 14:15:36 +0100 Subject: [PATCH 15/29] Remove redundant cast Signed-off-by: Julio Zynger --- .../components/PeriskopErrorsTable/PeriskopErrorsTable.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx b/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx index ae299c6128..2292ed0013 100644 --- a/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx +++ b/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx @@ -83,9 +83,8 @@ function isNotFoundInInstance( export const PeriskopErrorsTable = () => { const { entity } = useEntity(); const entityPeriskopName: string = - (entity.metadata.annotations?.[PERISKOP_NAME_ANNOTATION] as - | string - | undefined) ?? entity.metadata.name; + entity.metadata.annotations?.[PERISKOP_NAME_ANNOTATION] ?? + entity.metadata.name; const periskopApi = useApi(periskopApiRef); const instanceNames = periskopApi.getInstanceNames(); From 9cbfe00c5c988198aafcbab95e4c1531d241e1a2 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Tue, 1 Mar 2022 14:17:28 +0100 Subject: [PATCH 16/29] Use ResponseErrorPanel Signed-off-by: Julio Zynger --- .../components/PeriskopErrorsTable/PeriskopErrorsTable.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx b/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx index 2292ed0013..e7044a7037 100644 --- a/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx +++ b/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx @@ -25,6 +25,7 @@ import { Table, TableColumn, Progress, + ResponseErrorPanel, StatusWarning, StatusError, StatusPending, @@ -32,7 +33,6 @@ import { EmptyState, Link, } from '@backstage/core-components'; -import Alert from '@material-ui/lab/Alert'; import useAsync from 'react-use/lib/useAsync'; import { periskopApiRef } from '../..'; import { AggregatedError, NotFoundInInstance } from '../../types'; @@ -102,7 +102,7 @@ export const PeriskopErrorsTable = () => { if (loading) { return ; } else if (error) { - return {error.message}; + return ; } const columns: TableColumn[] = [ From 77caacc10d88bf6e8e0bce88ee62044ea9e996fa Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Tue, 1 Mar 2022 14:18:40 +0100 Subject: [PATCH 17/29] Rewrite section in README Signed-off-by: Julio Zynger --- plugins/periskop/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/periskop/README.md b/plugins/periskop/README.md index acc1e03074..64bd26ae86 100644 --- a/plugins/periskop/README.md +++ b/plugins/periskop/README.md @@ -41,9 +41,9 @@ const componentPage = ( ``` -4. [Setup the `app-config.yaml`](#instances) and instance name and urls +1. [Setup the `app-config.yaml`](#instances) `periskop` block -5. Annotate entities with the periskop service name +2. Annotate entities with the periskop service name ```yaml annotations: From 4d7c6e2a110da10b4416fc17aafef8384df4ece9 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Tue, 1 Mar 2022 14:26:54 +0100 Subject: [PATCH 18/29] Count properly Signed-off-by: Julio Zynger --- plugins/periskop/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/periskop/README.md b/plugins/periskop/README.md index 64bd26ae86..ecf66c4e24 100644 --- a/plugins/periskop/README.md +++ b/plugins/periskop/README.md @@ -41,9 +41,9 @@ const componentPage = ( ``` -1. [Setup the `app-config.yaml`](#instances) `periskop` block +4. [Setup the `app-config.yaml`](#instances) `periskop` block -2. Annotate entities with the periskop service name +5. Annotate entities with the periskop service name ```yaml annotations: From bdfdace83c8f987e2a583b4bf5011b13bcbe68f0 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Fri, 4 Mar 2022 09:46:18 +0100 Subject: [PATCH 19/29] Rename PeriskopErrorsTable -> EntityPeriskopErrorsCard Per https://backstage.io/docs/plugins/composability#naming-patterns Signed-off-by: Julio Zynger --- plugins/periskop/README.md | 6 +++--- plugins/periskop/api-report.md | 2 +- ...riskopErrorsTable.tsx => EntityPeriskopErrorsCard.tsx} | 2 +- .../periskop/src/components/PeriskopErrorsTable/index.ts | 4 ++-- plugins/periskop/src/extensions.ts | 8 ++++---- plugins/periskop/src/index.ts | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) rename plugins/periskop/src/components/PeriskopErrorsTable/{PeriskopErrorsTable.tsx => EntityPeriskopErrorsCard.tsx} (99%) diff --git a/plugins/periskop/README.md b/plugins/periskop/README.md index ecf66c4e24..ecc7349bef 100644 --- a/plugins/periskop/README.md +++ b/plugins/periskop/README.md @@ -6,7 +6,7 @@ ## Periskop aggregated errors -The Periskop Backstage Plugin exposes a component named `PeriskopErrorsTable`. +The Periskop Backstage Plugin exposes a component named `EntityPeriskopErrorsCard`. Each of the entries in the table will direct you to the error details in your deployed Periskop instance location. ![periskop-errors-card](./docs/periskop-plugin-screenshot.png) @@ -27,7 +27,7 @@ yarn add @backstage/plugin-periskop ```tsx // In packages/app/src/components/catalog/EntityPage.tsx -import { PeriskopErrorsTable } from '@backstage/plugin-periskop'; +import { EntityPeriskopErrorsCard } from '@backstage/plugin-periskop'; const componentPage = ( @@ -35,7 +35,7 @@ const componentPage = ( - + diff --git a/plugins/periskop/api-report.md b/plugins/periskop/api-report.md index e60f039d4e..5412b70dfb 100644 --- a/plugins/periskop/api-report.md +++ b/plugins/periskop/api-report.md @@ -102,7 +102,7 @@ export type PeriskopApiOptions = { export const periskopApiRef: ApiRef; // @public (undocumented) -export const PeriskopErrorsTable: () => JSX.Element; +export const EntityPeriskopErrorsCard: () => JSX.Element; // @public (undocumented) export const periskopPlugin: BackstagePlugin<{}, {}>; diff --git a/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx b/plugins/periskop/src/components/PeriskopErrorsTable/EntityPeriskopErrorsCard.tsx similarity index 99% rename from plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx rename to plugins/periskop/src/components/PeriskopErrorsTable/EntityPeriskopErrorsCard.tsx index e7044a7037..c4c8623f8e 100644 --- a/plugins/periskop/src/components/PeriskopErrorsTable/PeriskopErrorsTable.tsx +++ b/plugins/periskop/src/components/PeriskopErrorsTable/EntityPeriskopErrorsCard.tsx @@ -80,7 +80,7 @@ function isNotFoundInInstance( return (apiResult as NotFoundInInstance)?.body !== undefined; } -export const PeriskopErrorsTable = () => { +export const EntityPeriskopErrorsCard = () => { const { entity } = useEntity(); const entityPeriskopName: string = entity.metadata.annotations?.[PERISKOP_NAME_ANNOTATION] ?? diff --git a/plugins/periskop/src/components/PeriskopErrorsTable/index.ts b/plugins/periskop/src/components/PeriskopErrorsTable/index.ts index 61936dc476..0d0ab65d41 100644 --- a/plugins/periskop/src/components/PeriskopErrorsTable/index.ts +++ b/plugins/periskop/src/components/PeriskopErrorsTable/index.ts @@ -15,7 +15,7 @@ */ export { - PeriskopErrorsTable, + EntityPeriskopErrorsCard, isPeriskopAvailable, PERISKOP_NAME_ANNOTATION, -} from './PeriskopErrorsTable'; +} from './EntityPeriskopErrorsCard'; diff --git a/plugins/periskop/src/extensions.ts b/plugins/periskop/src/extensions.ts index 663be0ec35..990a41f24e 100644 --- a/plugins/periskop/src/extensions.ts +++ b/plugins/periskop/src/extensions.ts @@ -20,13 +20,13 @@ import { createComponentExtension } from '@backstage/core-plugin-api'; /** * @public */ -export const PeriskopErrorsTable = periskopPlugin.provide( +export const EntityPeriskopErrorsCard = periskopPlugin.provide( createComponentExtension({ - name: 'PeriskopErrorsTable', + name: 'EntityPeriskopErrorsCard', component: { lazy: () => - import('./components/PeriskopErrorsTable').then( - m => m.PeriskopErrorsTable, + import('./components/EntityPeriskopErrorsCard').then( + m => m.EntityPeriskopErrorsCard, ), }, }), diff --git a/plugins/periskop/src/index.ts b/plugins/periskop/src/index.ts index a22fc65d73..facb97bcc8 100644 --- a/plugins/periskop/src/index.ts +++ b/plugins/periskop/src/index.ts @@ -15,10 +15,10 @@ */ export { periskopPlugin, periskopApiRef } from './plugin'; -export { PeriskopErrorsTable } from './extensions'; +export { EntityPeriskopErrorsCard } from './extensions'; export { isPeriskopAvailable, PERISKOP_NAME_ANNOTATION, -} from './components/PeriskopErrorsTable'; +} from './components/EntityPeriskopErrorsCard'; export * from './api/index'; export * from './types'; From dc4103fe0991604811e2a8011ab53eb65c510a9b Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Fri, 4 Mar 2022 09:47:24 +0100 Subject: [PATCH 20/29] Update documentation - don't mention standalone app difference Signed-off-by: Julio Zynger --- plugins/periskop/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/periskop/README.md b/plugins/periskop/README.md index ecc7349bef..e475fd3477 100644 --- a/plugins/periskop/README.md +++ b/plugins/periskop/README.md @@ -15,7 +15,7 @@ Each of the entries in the table will direct you to the error details in your de 1. Configure the [periskop backend plugin](https://github.com/backstage/backstage/tree/master/plugins/periskop-backend/) -2. If you have standalone app (you didn't clone this repo), then do +2. Install the plugin by running: ```bash # From your Backstage root directory From 71ced2f7a5e58c2708d14c4be852e9764b4e5e35 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Fri, 4 Mar 2022 09:51:18 +0100 Subject: [PATCH 21/29] Rename dir Signed-off-by: Julio Zynger --- .../EntityPeriskopErrorsCard.tsx | 2 +- .../{PeriskopErrorsTable => EntityPeriskopErrorsCard}/index.ts | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename plugins/periskop/src/components/{PeriskopErrorsTable => EntityPeriskopErrorsCard}/EntityPeriskopErrorsCard.tsx (98%) rename plugins/periskop/src/components/{PeriskopErrorsTable => EntityPeriskopErrorsCard}/index.ts (100%) diff --git a/plugins/periskop/src/components/PeriskopErrorsTable/EntityPeriskopErrorsCard.tsx b/plugins/periskop/src/components/EntityPeriskopErrorsCard/EntityPeriskopErrorsCard.tsx similarity index 98% rename from plugins/periskop/src/components/PeriskopErrorsTable/EntityPeriskopErrorsCard.tsx rename to plugins/periskop/src/components/EntityPeriskopErrorsCard/EntityPeriskopErrorsCard.tsx index c4c8623f8e..cd4aa6da0f 100644 --- a/plugins/periskop/src/components/PeriskopErrorsTable/EntityPeriskopErrorsCard.tsx +++ b/plugins/periskop/src/components/EntityPeriskopErrorsCard/EntityPeriskopErrorsCard.tsx @@ -42,7 +42,7 @@ import { AggregatedError, NotFoundInInstance } from '../../types'; * * @public */ -export const PERISKOP_NAME_ANNOTATION = 'periskop.io/name'; +export const PERISKOP_NAME_ANNOTATION = 'periskop.io/service-name'; /** * Returns true if Periskop annotation is present in the given entity. diff --git a/plugins/periskop/src/components/PeriskopErrorsTable/index.ts b/plugins/periskop/src/components/EntityPeriskopErrorsCard/index.ts similarity index 100% rename from plugins/periskop/src/components/PeriskopErrorsTable/index.ts rename to plugins/periskop/src/components/EntityPeriskopErrorsCard/index.ts From 7235b16054f1d786a75b09bd8259855156fe7952 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Fri, 4 Mar 2022 09:51:29 +0100 Subject: [PATCH 22/29] Rename annotation Signed-off-by: Julio Zynger --- docs/features/software-catalog/well-known-annotations.md | 4 ++-- plugins/periskop/README.md | 2 +- plugins/periskop/api-report.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/features/software-catalog/well-known-annotations.md b/docs/features/software-catalog/well-known-annotations.md index 2f41377a36..4fa71329dd 100644 --- a/docs/features/software-catalog/well-known-annotations.md +++ b/docs/features/software-catalog/well-known-annotations.md @@ -222,13 +222,13 @@ definition. Specifying this annotation will enable GoCD related features in Backstage for that entity. -### periskop.io/name +### periskop.io/service-name ```yaml # Example: metadata: annotations: - periskop.io/name: pump-station + periskop.io/service-name: pump-station ``` The value of this annotation is the periskop project name for the given entity. diff --git a/plugins/periskop/README.md b/plugins/periskop/README.md index e475fd3477..35e86f083d 100644 --- a/plugins/periskop/README.md +++ b/plugins/periskop/README.md @@ -47,7 +47,7 @@ const componentPage = ( ```yaml annotations: - periskop.io/name: '' + periskop.io/service-name: '' ``` 6. Run app with `yarn start` and navigate to `/periskop` or a catalog entity 'Periskop' tab diff --git a/plugins/periskop/api-report.md b/plugins/periskop/api-report.md index 5412b70dfb..bd3e00d012 100644 --- a/plugins/periskop/api-report.md +++ b/plugins/periskop/api-report.md @@ -72,7 +72,7 @@ export interface NotFoundInInstance { } // @public -export const PERISKOP_NAME_ANNOTATION = 'periskop.io/name'; +export const PERISKOP_NAME_ANNOTATION = 'periskop.io/service-name'; // @public export class PeriskopApi { From 9e047159673f81331e253deaa495941124d3b108 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Fri, 4 Mar 2022 10:09:44 +0100 Subject: [PATCH 23/29] Extract interface Signed-off-by: Julio Zynger --- plugins/periskop/src/api/index.ts | 32 ++++++++++++++++++++++++++++++- plugins/periskop/src/plugin.ts | 4 ++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/plugins/periskop/src/api/index.ts b/plugins/periskop/src/api/index.ts index c935733a1e..0afbe9abd9 100644 --- a/plugins/periskop/src/api/index.ts +++ b/plugins/periskop/src/api/index.ts @@ -33,7 +33,37 @@ type PeriskopInstance = { * * @public */ -export class PeriskopApi { +export interface PeriskopApi { + /** + * Returns the list of registered Periskop instance names. + */ + getInstanceNames(): string[]; + + /** + * For the given instance and service, returns the URL pointing to the specific error instance occurrence. + * Note: This method might point to an external route. + */ + getErrorInstanceUrl( + instanceName: string, + serviceName: string, + error: AggregatedError, + ): string; + + /** + * Fetches all errors for the given service from the specified Periskop instance, given its name. + */ + getErrors( + instanceName: string, + serviceName: string, + ): Promise; +} + +/** + * API implementation to interact with Periskop's backends. + * + * @public + */ +export class PeriskopClient implements PeriskopApi { private readonly discoveryApi: DiscoveryApi; private readonly instances: PeriskopInstance[]; diff --git a/plugins/periskop/src/plugin.ts b/plugins/periskop/src/plugin.ts index 6a99980263..0fb0c2bede 100644 --- a/plugins/periskop/src/plugin.ts +++ b/plugins/periskop/src/plugin.ts @@ -21,7 +21,7 @@ import { createPlugin, createApiRef, } from '@backstage/core-plugin-api'; -import { PeriskopApi } from './api'; +import { PeriskopApi, PeriskopClient } from './api'; /** * @public @@ -40,7 +40,7 @@ export const periskopPlugin = createPlugin({ api: periskopApiRef, deps: { configApi: configApiRef, discoveryApi: discoveryApiRef }, factory: ({ configApi, discoveryApi }) => - new PeriskopApi({ configApi, discoveryApi }), + new PeriskopClient({ configApi, discoveryApi }), }), ], }); From aee6d9d60c21e1afb71a2792549732b74bfa1b65 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Mon, 7 Mar 2022 12:59:53 +0200 Subject: [PATCH 24/29] Use @backstage/errors Signed-off-by: Julio Zynger --- plugins/periskop/package.json | 1 + plugins/periskop/src/api/index.ts | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 661efc23c3..5c925cde08 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -25,6 +25,7 @@ "@backstage/catalog-model": "^0.11.0", "@backstage/core-components": "^0.8.10", "@backstage/core-plugin-api": "^0.7.0", + "@backstage/errors": "^0.2.2", "@backstage/plugin-catalog-react": "^0.7.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", diff --git a/plugins/periskop/src/api/index.ts b/plugins/periskop/src/api/index.ts index 0afbe9abd9..4171d55ae2 100644 --- a/plugins/periskop/src/api/index.ts +++ b/plugins/periskop/src/api/index.ts @@ -15,6 +15,7 @@ */ import { ConfigApi, DiscoveryApi } from '@backstage/core-plugin-api'; +import { ResponseError } from '@backstage/errors'; import { AggregatedError, NotFoundInInstance } from '../types'; /** @public */ @@ -111,9 +112,7 @@ export class PeriskopClient implements PeriskopApi { body: await response.text(), }; } - throw new Error( - `failed to fetch data, status ${response.status}: ${response.statusText}`, - ); + throw await ResponseError.fromResponse(response); } return response.json(); } From 0dcea38a79ecf1510b02a71ed2e0dee4ee9d318d Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Mon, 7 Mar 2022 13:00:46 +0200 Subject: [PATCH 25/29] Bump @backstage/backend-common Signed-off-by: Julio Zynger --- plugins/periskop-backend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index d036313df5..034945c7cd 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -21,7 +21,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.10.8", + "@backstage/backend-common": "^0.12.0", "@backstage/config": "^0.1.14", "@types/express": "*", "cross-fetch": "^3.0.6", From ad865be1701b84b5c09f3702d5b7138f39739416 Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Mon, 7 Mar 2022 13:03:24 +0200 Subject: [PATCH 26/29] Apply package roles Signed-off-by: Julio Zynger --- plugins/periskop-backend/package.json | 17 ++++++++++------- plugins/periskop/package.json | 17 ++++++++++------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index 034945c7cd..1fddb1b9d6 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -6,19 +6,22 @@ "license": "Apache-2.0", "private": false, "homepage": "https://periskop.io", + "backstage": { + "role": "backend-plugin" + }, "publishConfig": { "access": "public", "main": "dist/index.cjs.js", "types": "dist/index.d.ts" }, "scripts": { - "start": "backstage-cli backend:dev", - "build": "backstage-cli backend:build", - "lint": "backstage-cli lint", - "test": "backstage-cli test", - "prepack": "backstage-cli prepack", - "postpack": "backstage-cli postpack", - "clean": "backstage-cli clean" + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "clean": "backstage-cli package clean" }, "dependencies": { "@backstage/backend-common": "^0.12.0", diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 5c925cde08..1bf83576e3 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -6,20 +6,23 @@ "license": "Apache-2.0", "private": false, "homepage": "https://periskop.io", + "backstage": { + "role": "frontend-plugin" + }, "publishConfig": { "access": "public", "main": "dist/index.esm.js", "types": "dist/index.d.ts" }, "scripts": { - "build": "backstage-cli plugin:build", - "start": "backstage-cli plugin:serve", - "lint": "backstage-cli lint", - "test": "backstage-cli test", + "build": "backstage-cli package build", + "start": "backstage-cli package start", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", "diff": "backstage-cli plugin:diff", - "prepack": "backstage-cli prepack", - "postpack": "backstage-cli postpack", - "clean": "backstage-cli clean" + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "clean": "backstage-cli package clean" }, "dependencies": { "@backstage/catalog-model": "^0.11.0", From 45ea463a0d2ab675bb6ae8ae8d483d723b55437a Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Mon, 7 Mar 2022 14:05:51 +0200 Subject: [PATCH 27/29] Update api-report Signed-off-by: Julio Zynger --- plugins/periskop/api-report.md | 40 +++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/plugins/periskop/api-report.md b/plugins/periskop/api-report.md index bd3e00d012..2cf84faccf 100644 --- a/plugins/periskop/api-report.md +++ b/plugins/periskop/api-report.md @@ -23,6 +23,9 @@ export interface AggregatedError { total_count: number; } +// @public (undocumented) +export const EntityPeriskopErrorsCard: () => JSX.Element; + // @public (undocumented) interface Error_2 { // (undocumented) @@ -75,7 +78,30 @@ export interface NotFoundInInstance { export const PERISKOP_NAME_ANNOTATION = 'periskop.io/service-name'; // @public -export class PeriskopApi { +export interface PeriskopApi { + getErrorInstanceUrl( + instanceName: string, + serviceName: string, + error: AggregatedError, + ): string; + getErrors( + instanceName: string, + serviceName: string, + ): Promise; + getInstanceNames(): string[]; +} + +// @public (undocumented) +export type PeriskopApiOptions = { + discoveryApi: DiscoveryApi; + configApi: ConfigApi; +}; + +// @public (undocumented) +export const periskopApiRef: ApiRef; + +// @public +export class PeriskopClient implements PeriskopApi { constructor(options: PeriskopApiOptions); // (undocumented) getErrorInstanceUrl( @@ -92,18 +118,6 @@ export class PeriskopApi { getInstanceNames(): string[]; } -// @public (undocumented) -export type PeriskopApiOptions = { - discoveryApi: DiscoveryApi; - configApi: ConfigApi; -}; - -// @public (undocumented) -export const periskopApiRef: ApiRef; - -// @public (undocumented) -export const EntityPeriskopErrorsCard: () => JSX.Element; - // @public (undocumented) export const periskopPlugin: BackstagePlugin<{}, {}>; From 14a790901767f898bcabcdb07c14653c78f8cfac Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Mon, 7 Mar 2022 14:48:07 +0200 Subject: [PATCH 28/29] Bump dependencies Signed-off-by: Julio Zynger --- plugins/periskop-backend/package.json | 4 ++-- plugins/periskop/package.json | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index 1fddb1b9d6..6c7951283a 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -25,7 +25,7 @@ }, "dependencies": { "@backstage/backend-common": "^0.12.0", - "@backstage/config": "^0.1.14", + "@backstage/config": "^0.1.15", "@types/express": "*", "cross-fetch": "^3.0.6", "express": "^4.17.1", @@ -35,7 +35,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.14.0", + "@backstage/cli": "^0.15.0", "@types/supertest": "^2.0.8", "msw": "^0.35.0", "supertest": "^4.0.2" diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 1bf83576e3..8045b94133 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -25,11 +25,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^0.11.0", - "@backstage/core-components": "^0.8.10", - "@backstage/core-plugin-api": "^0.7.0", + "@backstage/catalog-model": "^0.12.0", + "@backstage/core-components": "^0.9.0", + "@backstage/core-plugin-api": "^0.8.0", "@backstage/errors": "^0.2.2", - "@backstage/plugin-catalog-react": "^0.7.0", + "@backstage/plugin-catalog-react": "^0.8.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -42,10 +42,10 @@ "react-dom": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.14.1", - "@backstage/core-app-api": "^0.5.4", - "@backstage/dev-utils": "^0.2.23", - "@backstage/test-utils": "^0.2.6", + "@backstage/cli": "^0.15.0", + "@backstage/core-app-api": "^0.6.0", + "@backstage/dev-utils": "^0.2.24", + "@backstage/test-utils": "^0.3.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", From c72eb5bbb8a6e62dfa91fff7c9826af3deb7f59a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 7 Mar 2022 15:10:20 +0100 Subject: [PATCH 29/29] fixup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- plugins/periskop-backend/api-report.md | 4 ++-- plugins/periskop-backend/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/periskop-backend/api-report.md b/plugins/periskop-backend/api-report.md index 7e737a21a8..caaed109f9 100644 --- a/plugins/periskop-backend/api-report.md +++ b/plugins/periskop-backend/api-report.md @@ -5,7 +5,7 @@ ```ts import { Config } from '@backstage/config'; import express from 'express'; -import { Logger as Logger_2 } from 'winston'; +import { Logger } from 'winston'; // @public (undocumented) export function createRouter(options: RouterOptions): Promise; @@ -15,7 +15,7 @@ export interface RouterOptions { // (undocumented) config: Config; // (undocumented) - logger: Logger_2; + logger: Logger; } // (No @packageDocumentation comment for this package) diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index 6c7951283a..0efb9d7168 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -38,7 +38,7 @@ "@backstage/cli": "^0.15.0", "@types/supertest": "^2.0.8", "msw": "^0.35.0", - "supertest": "^4.0.2" + "supertest": "^6.1.6" }, "files": [ "dist"