Skip to main content

Root Health Service

The Root Health service provides some health check endpoints for the backend. By default, the rootHttpRouter exposes a /.backstage/health/v1/readiness and /.backstage/health/v1/liveness endpoints, which return a JSON object with the status of the backend services according the implementation of the Root Health Service.

Configuring the service

The following example shows how you can override the root health service implementation.

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

const backend = createBackend();

class MyRootHealthService implements RootHealthService {
async getLiveness() {
// provide your own implementation
return { status: 200, payload: { status: 'ok' } };
}

async getReadiness() {
// provide your own implementation
return { status: 200, payload: { status: 'ok' } };
}
}

backend.add(
createServiceFactory({
service: coreServices.rootHealth,
deps: {},
async factory({}) {
return new MyRootHealthService();
},
}),
);

Custom headers in health check responses

While not implemented directly in the root health service, the default implementation of the RootHttpRouter service includes a configuration option to set additional headers to include in health check responses. For example, you can add a service-name header using the following configuration:

backend:
health:
headers:
service-name: my-service

It can be a good idea to set a header for your health check responses that uniquely identifies your service in a multi-service environment. This ensures that the health check that is configured for your service is actually hitting your service and not another.

For example, if using Envoy you can use the service_name_matcher configuration and set the x-envoy-upstream-healthchecked-cluster header to a matching value. For example:

backend:
health:
headers:
x-envoy-upstream-healthchecked-cluster: my-service