Monitoring·June 17, 2026·Updated October 19, 2026·8 min read

Building a pool-wide health view for XenServer: what we learned

It started as a small dashboard on top of a daily bash report. It is now the XenServer side of DTR Vantage: every pool on one page, health told apart from how complete the reading is, and a console for the work XenCenter used to do.

The XenServer pools list in DTR Vantage, with health, collection, host memory and Dom0 figures for each pool

Updated October 19, 2026. We first published this in June, when it was a small standalone dashboard. It is now the XenServer side of DTR Vantage, and some of what we wrote then turned out to be wrong. This version has screenshots from the current build and says what we changed our minds about.

Most XenServer environments we walk into have the same monitoring story: a bash script that emails a Markdown report once a day, plus XenCenter open on someone’s desk. That’s not nothing — the bash report is often genuinely good — but it stops at one host or one pool, the email gets filtered into a folder nobody reads, and “are all our pools healthy right now?” still means logging into each one to check.

So we built a dashboard that turns that report into a live, multi-pool view. Here’s what it does now, and the lessons that shaped it.

What we still optimize for

We wrote the constraints down before writing any code, because in this space they matter more than the features. Most of them have held:

The one we dropped was “read-only, always”. More on that below too.

How a collection works

Every 15 minutes by default (per pool if you like), the dashboard reaches out to your pools, runs the health check, brings the results home and turns them into the views your team uses. Click a step to follow it.

The dashboard wakes on a fixed interval (15 minutes by default, or a pool’s own) and starts a collection. Collect now runs one at any time.

Lesson one: “healthy” and “we read it” are different questions

The first version had one colour per pool. If a coordinator stopped answering, its card stayed green — the last report had been healthy. Green meant “nothing wrong was seen”, which is not the same as “we looked”.

Now every pool answers both, in separate columns. Health is what the last report observed. Collection is how many hosts have a current reading. When a report is older than twice the collection interval, health reads Unknown, with the last known verdict beside it, never the old colour. Problems sort to the top, and a pool expands in place to its hosts.

The XenServer pools list in DTR Vantage. Tiles show 2 pools with 1 needing attention, 4 of 4 hosts reachable, 4 of 4 collection current, and 0 critical, 1 warning, 2 info findings. The Lab pool reads Warning, with host memory 420 GB of 768 GB, Dom0 memory 60%, fullest VM storage 76% on shared storage, and 3 of 3 hosts current. It is expanded to its three hosts with their physical memory, Dom0 memory, Dom0 load and system disks.
The pools list: health in one column, how complete the reading is in another, and a pool opened to its hosts. From the live demo’s sample estate.

Lesson two: Dom0 is not the host

The health script runs in Dom0, XenServer’s control domain. So its memory, load average and disk figures describe Dom0 — a small VM — not the physical server. The first version showed them as the host’s, so a busy 256 GB host could look idle, and a control domain under pressure could look like a full host.

Now the two are kept apart. Host memory is the physical servers’, read through the XenServer management API and summed across the pool, with the busiest host named beside it. Dom0 memory, load and system disks are labelled as Dom0’s. VM storage counts each repository once and tells shared from local, and ISO libraries are never flagged for being full. Physical CPU time needs XenServer’s performance data, which we don’t read yet. So there is no CPU column, and the page says why rather than guessing from a load average.

From one view to a page per pool

Each pool has its own page. It opens on a verdict box listing the reasons, and each reason links straight to the host, repository or finding it names. Tabs cover hosts, VMs, storage, networks, activity and settings, and two labels say how old the inventory and the health report are. Trends charts findings, the verdict and each host’s resources over the past month, so you can tell “getting worse” from “just today”. Notifications brings every pool’s own alerts together with readable names, alongside the events from the health reports.

XenServer Notifications in DTR Vantage: filters for pool, category, severity and what to show; two pool alerts, a host clock skew on xs-02 and an HA statefile lost on the Lab pool; then events from the health report: HA statefile lost on xs-02 (critical), VM started (info), and a storage repository 63% full that will reach 80% in about 34 days at the last month's pace (warning).
Notifications: the pools’ own alerts, then the events from the health reports, with filters for pool, category and severity.

What we changed our minds about: read-only

In June we wrote that the dashboard would never start a VM, migrate a workload or patch a host. But keeping XenCenter open beside the dashboard was the problem we set out to fix, and a read-only view only solved half of it.

So there is now a XenServer console, licensed separately; with monitoring alone, the dashboard still only reads. It covers the day-to-day of XenCenter in the browser:

It also opens a VM’s screen right in the page, with Remote Desktop and SSH in the browser alongside. The inventory tree follows the pool’s own change events, so a VM powered on elsewhere turns green in seconds rather than at the next collection.

A VM's console in DTR Vantage: the virtual machine web01, running on xs-01, with Connect, Disconnect, Ctrl+Alt+Del, Full screen, Send text, Fixes, Detach, RDP in the browser, Remote Desktop and SSH buttons above the VM's Windows sign-in screen. The inventory tree on the left shows the Lab pool, its hosts, the VM, storage and networks.
A VM’s screen in the page, with Remote Desktop and SSH in the browser beside it.

We put limits on it. The pool’s management credential is stored encrypted on the dashboard server and never sent back to a browser. The coordinator’s certificate is pinned the first time, and a changed one is refused until an administrator accepts it. Actions that destroy data, like deleting a VM or reverting a snapshot, need an administrator. Every action is a task with its own log line, and is audited with who did it.

The VM settings dialog for web01, which is running: tabs for General, Compute and placement, Storage and Networking; fields for name, description, folder and tags; the note that Apply changes saves General and Compute and placement; and No unsaved changes beside a disabled Apply changes button.
VM settings: the state beside the name, unsaved changes counted, and what Apply saves said plainly.

Active Directory sign-in that just works

Getting sign-in right was the hardest part of the first version, and it still is the part people notice least when it works. Modern Python runtimes, hardened directory settings and strict certificate checks each broke approaches that “should” have worked and that most online guides still recommend.

So the sign-in is built to be resilient rather than textbook. It binds to the directory over encrypted connections that hold up on current systems, and reads group membership in a way that works even in locked-down domains. It checks certificates fully, while still letting you connect by IP address or host name. Windows single sign-on through IIS is there for sites that want it.

Installation

The dashboard runs on a Windows server beside your pools, not inside them. You install it with one setup program, and a wizard asks what to install and how the site should be reached (IIS in front, with HTTPS). Then you enrol your first pool from Manage pools. Updates come from the dashboard’s own settings page. Your configuration, pools, sign-in settings and history are kept across them.

What it still doesn’t do

Health comes from collections, every 15 minutes by default. The console’s inventory is live, but the health verdict is not a sub-minute alarm. There are no physical CPU graphs yet, since that needs XenServer’s performance data, which is next on the list. Alerts show in the dashboard; if you want a phone to ring, point your existing alerting at it.

You can click through all of it in the live demo, which runs on a sample estate, or try it on your own pools. And if you’re running XenServer and doing this the manual way, we’re always happy to compare notes.

Let’s talk

Want this kind of visibility across your estate?

Book a consultation and talk with an architect about monitoring your virtualization environment end to end.

Book a consultation →