@enginuity-io/dora-metrics
v0.1.4
Published
DORA Metrics frontend plugin for Backstage
Maintainers
Readme
DORA Metrics Frontend Plugin for Backstage
This plugin provides a dashboard for visualizing DORA (DevOps Research and Assessment) metrics in your Backstage application. It integrates with Apache DevLake as a data source to display key DevOps performance indicators.
Note: Version 0.1.3+ includes pre-compiled TypeScript with declaration files for seamless integration with Backstage apps.
Features
- Display key DORA metrics:
- Deployment Frequency
- Lead Time for Changes
- Mean Time to Restore
- Change Failure Rate
- Interactive charts and visualizations
- Performance level indicators (Elite, High, Medium, Low)
- Time range selection for metrics analysis
- Project selection for multi-project environments
- Trend indicators showing improvement or decline
Prerequisites
- Backstage app version 1.0.0 or higher
- Apache DevLake instance with DORA metrics data
- Backend plugin @enginuity-io/dora-metrics-backend installed
Installation
# From your Backstage root directory
yarn add --cwd packages/app @enginuity-io/dora-metricsConfiguration
Add the following to your app-config.yaml:
doraMetrics:
# URL to the backend API (default: /api/dora-metrics)
backendUrl: /api/dora-metrics
# Optional: Additional API path to append to backendUrl
apiPath: ''
# Optional: Frontend URL for CORS configuration
frontendUrl: http://localhost:3000
# Database configuration for backend
database:
connection:
host: localhost # DevLake database host
port: 3306 # DevLake database port
user: devlake # Database user
password: devlake # Database password
database: devlake # Database nameUsage
Register the plugin in your Backstage app
Option 1: Using the new frontend plugin system (recommended)
- Add the plugin to your app's
packages/app/src/App.tsx:
import { doraMetricsPlugin } from '@enginuity-io/dora-metrics';
// Inside your FlatRoutes component:
<Route path="/dora-metrics" element={<DoraMetricsPage />} />
// Add to your plugins list
const app = createApp({
apis,
plugins: [
// ... other plugins
doraMetricsPlugin,
],
});- Add a link to the sidebar in
packages/app/src/components/Root/Root.tsx:
import ExtensionIcon from '@material-ui/icons/Extension';
// Inside your SidebarPage component:
<SidebarItem icon={ExtensionIcon} to="dora-metrics" text="DORA Metrics" />Option 2: Using the legacy plugin system
- Add the plugin to your app's
packages/app/src/plugins.ts:
export { doraMetricsPlugin } from '@enginuity-io/dora-metrics';- Add the page to your app's
packages/app/src/App.tsx:
import { DoraMetricsPage } from '@enginuity-io/dora-metrics';
// Inside your AppRouter or similar component:
<Route path="/dora-metrics" element={<DoraMetricsPage />} />- Add a link to the sidebar in
packages/app/src/components/Root/Root.tsx:
import ExtensionIcon from '@material-ui/icons/Extension';
// Inside your SidebarPage component:
<SidebarItem icon={ExtensionIcon} to="dora-metrics" text="DORA Metrics" />Complete Integration
For complete integration, you need to install and configure both the frontend and backend plugins. Here's a step-by-step guide for both the new plugin system (recommended) and the legacy plugin system.
Using the New Plugin System (Backstage 1.15+)
- Install both plugins:
# From your Backstage root directory
yarn add --cwd packages/app @enginuity-io/dora-metrics
yarn add --cwd packages/backend @enginuity-io/dora-metrics-backend- Register the frontend plugin in
packages/app/src/App.tsx:
import { doraMetricsPlugin } from '@enginuity-io/dora-metrics';
import { DoraMetricsPage } from '@enginuity-io/dora-metrics';
// Inside your FlatRoutes component:
<Route path="/dora-metrics" element={<DoraMetricsPage />} />
// Add to your plugins list
const app = createApp({
apis,
plugins: [
// ... other plugins
doraMetricsPlugin,
],
});- Register the backend plugin in
packages/backend/src/index.ts:
import { doraMetricsPlugin } from '@enginuity-io/dora-metrics-backend';
// Inside your backend.add() calls:
backend.add(doraMetricsPlugin);- Add the configuration to your
app-config.yamlas described in the Configuration section.
Using the Legacy Plugin System
- Install both plugins:
# From your Backstage root directory
yarn add --cwd packages/app @enginuity-io/dora-metrics
yarn add --cwd packages/backend @enginuity-io/dora-metrics-backendRegister the frontend plugin as described in the "Option 2: Using the legacy plugin system" section above.
Register the backend plugin in
packages/backend/src/plugins/dora-metrics.ts:
import { createRouter } from '@enginuity-io/dora-metrics-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger: env.logger,
config: env.config,
});
}- Import and use the plugin in
packages/backend/src/index.ts:
import doraMetrics from './plugins/dora-metrics';
// Inside the main function:
const doraMetricsEnv = useHotMemoize(module, () => createEnv('dora-metrics'));
apiRouter.use('/dora-metrics', await doraMetrics(doraMetricsEnv));- Add the configuration to your
app-config.yamlas described in the Configuration section.
Development
# From your Backstage root directory
yarn start # Starts both frontend and backendTesting
To test the plugin in isolation before integrating with Backstage:
# From the plugin directory
yarn testYou can also use the standalone test app in the repository:
# From the test-app directory
yarn install
yarn startPublishing to npm
To publish the package to npm:
# From the plugin directory
yarn build
npm login # Login to your npm account
npm publish --access public # For scoped packagesAPI Reference
DoraMetricsPage Component
Main component that renders the DORA metrics dashboard.
import { DoraMetricsPage } from '@enginuity-io/dora-metrics';
<DoraMetricsPage />Configuration API
The plugin reads configuration from the Backstage app-config.yaml file using the @backstage/config package.
Troubleshooting
- No data displayed: Ensure your Apache DevLake instance is properly configured and contains DORA metrics data
- Connection errors: Check the database connection settings in your app-config.yaml
- CORS issues: Verify that the frontendUrl in your configuration matches your actual frontend URL
