Observability & Admin UI

Enable the built-in admin UI to inspect and recover workflows, and wire up metrics to monitor the engine.

Skipper ships with a built-in admin UI for inspecting and recovering workflow instances, plus a pluggable metrics hook for monitoring the engine itself.

Enabling the Admin UI

The admin UI is a standard JAX-RS resource — AdminResource, served under the path /skipper/admin. Obtain it from your SkipperRuntime (see the Quickstart) and register it with your application’s JAX-RS / HTTP server alongside your other resources:

val runtime = SkipperRuntime(config)

// AdminResource is a JAX-RS resource — register it with your server's JAX-RS runtime
// (Jersey, Dropwizard, RESTEasy, …).
val admin = runtime.adminResource.get()
jaxrs.register(admin)
SkipperRuntime runtime = new SkipperRuntime(config);

// AdminResource is a JAX-RS resource — register it with your server's JAX-RS runtime
// (Jersey, Dropwizard, RESTEasy, …).
AdminResource admin = runtime.getAdminResource().get();
jaxrs.register(admin);

Because it is a plain JAX-RS resource, it drops into any JAX-RS-compatible stack — there is nothing Skipper-specific about how you mount it.

Then open the UI in a browser:

http://<your-service-host>/skipper/admin/

For a service running remotely, forward its port to your machine first, then open the path locally.

What the Admin UI gives you

The UI — and the JSON API behind it — lets you:

  • View dashboard stats and search workflow instances by type and status.
  • Inspect a single instance’s status and history — GET /skipper/admin/workflows/{id}.
  • Cancel a running instance — POST /skipper/admin/workflows/{id}/cancel.
  • Review workflows that exhausted their retries and the scheduler dead-letter queue, and requeue stuck tasks.
  • List and replay durable signals:
GET  /skipper/admin/workflows/{id}/signals
POST /skipper/admin/workflows/{id}/signals/{signalId}/replay

These endpoints back the same operations available programmatically through WorkflowsService.

Metrics

Skipper reports engine metrics through a pluggable Metrics interface. It is a no-op by default, so to collect metrics, supply an implementation on the config before creating the runtime:

config.metrics = ComponentFactory { MyMetrics() }
config.setMetrics(() -> new MyMetrics());

Your implementation receives metrics covering actions, the scheduler, storage, and overall workflow throughput — forward them to your existing pipeline and dashboards to track:

  • Workflow counts by status (running, waiting, completed, errored).
  • Action execution and failure rates.
  • Scheduler and storage latency and error rates.

Watching workflow status counts and the size of the dead-letter queue is usually the fastest way to spot a problem in production.