Skip to main content

Observability

This article briefly describes the observability options that are available to a Backstage integrator.

Datadog RUM Events

See how to install Datadog Events in your app here

Logging

New Backend

The backend supplies a central logging service, rootLogger, as well as a plugin based logger, logger from coreServices. To add additional granularity to your logs, you can create children from the plugin based logger, using the .child() method and provide is with JSON data. For example, if you wanted to log items for a specific span in your plugin, you could do

export function createRouter({ logger }) {
const router = Router();

router.post('/task/:taskId/queue', (req, res) => {
const { taskId } = req.params;
const taskLogger = logger.child({ task: taskId });
taskLogger.log('Queueing this task.');
});

router.get('/task/:taskId/results', (req, res) => {
const { taskId } = req.params;
const taskLogger = logger.child({ task: taskId });
taskLogger.log('Getting the results of this task.');
});
}

You can also add additional metadata to all logs for your Backstage instance by overriding the rootLogger implementation, you can see an example in the rootLogger docs.

Old Backend

The backend supplies a central winston root logger that plugins are expected to use for their logging needs. In the default production setup, it emits structured JSON logs on stdout, with a field "service": "backstage" and also tagged on a per-plugin basis. Plugins that want to more finely specify what part of their processes that emitted the log message should add a "component" field to do so.

An example log line could look as follows:

{
"service": "backstage",
"type": "plugin",
"plugin": "catalog",
"component": "catalog-all-locations-refresh",
"level": "info",
"message": "Locations Refresh: Refreshing location bootstrap:bootstrap"
}

Health Checks

New Backend (post 1.29.0)

The new backend provides a RootHealthService which implements /.backstage/health/v1/readiness and /.backstage/health/v1/liveness endpoints to provide health checks for the entire backend instance.

You can read more about this new service and how to customize it in the Root Health Service documentation.

New Backend (pre 1.29.0)

The new backend is moving towards health checks being plugin-based, as such there is no current plugin for providing a health check route. You can add this yourself easily though,

import {
coreServices,
createBackendModule,
createBackendPlugin,
} from '@backstage/backend-plugin-api';

const healthCheck = createBackendPlugin({
pluginId: 'healthcheck',

register(env) {
env.registerInit({
deps: {
rootHttpRouter: coreServices.rootHttpRouter,
},
init: async ({ rootHttpRouter }) => {
// You can adjust the route name and response as you need.
rootHttpRouter.use('/healthcheck', (req, res) => {
res.json({ status: 'ok' });
});
},
});
},
});

Old Backend

The example old backend in the Backstage repository supplies a very basic health check endpoint on the /healthcheck route. You may add such a handler to your backend as well, and supply your own logic to it that fits your particular health checking needs.