Applications
Every running Warp process, grouped by application. This page was called Servers until applications
landed; /servers still redirects here.
The roster merges two kinds of process, because every server is an instance but not every instance is a server:
- Servers — processes running
AddWarpServer, with worker groups and background tasks. - Application instances —
AddWarp-only processes (publishers, APIs, dashboards) that never run a server. They appear onceWarpConfiguration.ApplicationNameis set, and only then.
Set the identity a process reports:
builder.Services.AddWarp<AppDbContext>(options =>
{
options.ApplicationName = "orders-api"; // cluster-wide identity; groups instances together
options.ApplicationVersion = "1.4.2"; // per-instance, may differ mid rolling-deploy
options.ApplicationEnvironment = "prod";
});
ApplicationName gates all of it: leave it null and the behaviour is exactly as before — only servers
appear, and nothing new is written.
Liveness
Each instance carries a status dot: green live, amber paused, red silent. Liveness is
ApplicationInstanceStaleGrace (2 minutes by default) — the same threshold that decides when a stale
instance row is swept and an InstanceDown notification fires.
The API computes it once per read and also publishes the threshold itself, so the browser re-derives
the same answer every second: an instance that stops checking in while you are looking at the roster
goes red on its own, and the headline 3/4 live instances count drops with it. That holds for the
flat server list this page falls back to when no ApplicationName is set, and for a server's own
detail page, which used to apply a tighter rule of its own. The 15-second refresh is still there for
everything that is not liveness — CPU, memory, and instances that started after you opened the page.
See Status dots for what the dashboard does against a backend too old to send the threshold.
A server's own detail page asks a tighter question and answers it in the browser: silent for more
than 30 seconds (six missed heartbeats at the default 5-second HealthCheckInterval) turns the dot
red and adds an Inactive badge, without waiting for a refetch. The two can therefore disagree for
up to that grace: "should I worry?" is not the same question as "should this row be deleted?".
Click an application to see its instances, and an instance to see its detail.
Background tasks
Each Warp server runs a set of background tasks for orchestration and maintenance. A service-only
server (opt.DisableWorker()) runs only the shared ones — Heartbeat, ServerCleanup, ExpirationCleanup.
| Task | Default interval | Purpose |
|---|---|---|
| Heartbeat | 5s (HealthCheckInterval) | Updates the server heartbeat so other servers know it is alive; renews singleton background-service leases |
| ScheduledJobActivation | 10s (ScheduledActivationInterval) | Flips due Scheduled jobs to Enqueued — the worst-case latency between a schedule time and pickup eligibility |
| MessageRouting | 10s (MessageRoutingInterval) + signal | Routes IMessage jobs to their handlers by creating child jobs |
| Orchestration | 10s (OrchestrationInterval) + signal | Finalizes parent jobs when all children complete, activates continuations |
| RecurringJobScheduler | 15s (RecurringJobSchedulerInterval) | Creates job instances when a recurring cron expression fires |
| StaleJobRecovery | 30s (StaleJobRecoveryInterval) | Requeues jobs stuck in Processing after a worker crash, and recovers stuck webhook deliveries |
| ServerCleanup | 30s (ServerCleanupInterval) | Removes dead servers that stopped sending heartbeats |
| AggregateCounters | 1m (CounterAggregationInterval) | Rolls write-optimized Counter rows into Statistic rows for the dashboard |
| BacklogSampler | 60s (BacklogSampleInterval) | Samples per-queue backlog depth and oldest age off the worker hot path |
| AggregateErrorGroups | 60s (ErrorGroupingInterval) | Drains the error-occurrence inbox into ErrorGroup issues |
| EvaluateSlos | 1m (SloEvaluationInterval) | Computes attainment, error budget and burn rate for each objective |
| ExpirationCleanup | 5m (ExpirationCleanupInterval) | Deletes expired jobs, call logs, deliveries and other retention-capped rows |
| RollupStatistics | 10m (StatisticRollupInterval) | Downsamples time-bucketed statistics fine → hourly → daily |
Every interval is configurable — see Configuration.
Setting one to null disables that task.
The server detail page shows each task's last status, duration and run time, alongside its worker groups:
Individual workers have their own page — see Workers.
See also
- Multi-application observability — how the roster, provenance and per-app metrics work.
- Pause and resume — pausing a server or a single worker group.