Skip to content

Watch fleet health

Day 2 starts with one question every morning: are all firewalls up? pfCentral answers it in the UI and as Prometheus metrics.

The top bar counts devices online, warning (added but not enrolled yet) and offline, and shows the average CPU. The left rail lists every firewall with a status dot and live CPU and memory. Issues in the rail filters to devices that are not online.

Fleet page in list view with three online firewalls, their sites, IPs, CPU and memory
Full size ↗

The fleet page has a List and a Grid view. Your choice is remembered in the browser.

Fleet page in grid view with one card per firewall
Full size ↗

When a firewall goes offline, its pages keep the last known data under an Offline banner, and changes are blocked until it is back:

Device page for an offline firewall with a Device offline banner
Full size ↗

How fast status changes is explained, with a simulator, in Online, offline and telemetry.

GET /metrics returns the latest telemetry for every firewall in Prometheus text format. It needs no login, so allow only your scraper to reach it.

prometheus.yml
scrape_configs:
- job_name: pfcentral
scheme: https
metrics_path: /metrics
scrape_interval: 30s
static_configs:
- targets: ["pf.example.com"]

Every series has a device_id label.

MetricTypeMeaning
pfsense_cpu_percentgaugeCPU use
pfsense_memory_*gaugeMemory use
pfsense_disk_percent, pfsense_swap_percentgaugeRoot disk and swap use
pfsense_temp_celsiusgaugeCPU temperature
pfsense_uptime_secondsgaugeFirewall uptime
pfsense_states_used, pfsense_states_maxgaugepf state table
pfsense_interface_{in,out}_{bytes,packets}_totalcounterPer-interface traffic, label interface
pfsense_gateway_{delay_ms,stddev_ms,loss_percent}gaugeGateway monitoring
pfsense_vpn_{bytes_recv,bytes_sent}_total, pfsense_vpn_connected_clientscounter, gaugeVPN traffic and clients
pfcentral-alerts.yml
groups:
- name: pfcentral
rules:
- alert: PfSenseStale
expr: changes(pfsense_uptime_seconds[5m]) == 0
for: 5m
annotations:
summary: "No fresh telemetry from {{ $labels.device_id }}"
- alert: PfSenseGatewayLoss
expr: pfsense_gateway_loss_percent > 10
for: 5m
- alert: PfSenseStateTableHigh
expr: pfsense_states_used / pfsense_states_max > 0.8
for: 15m
- alert: PfSenseDiskHigh
expr: pfsense_disk_percent > 85
for: 30m

pfCentral has no built-in alerting yet. The bell in the top bar is a placeholder.

  • Liveness: a TCP check on port 2808, or an HTTP check on /login for status 200.
  • Logs: JSON on stdout by default (PFCENTRAL_LOG_JSON=true). Ship them to your log system. Useful messages: server listening, authorization callout service started, device registry started, warnings about TLS or email.
  • Database: monitor PostgreSQL as usual. pfCentral’s load on it is light.
  • Disk: the state volume grows with JetStream telemetry, which is kept for 6 hours.