Skip to content

Metrics and Status

Vexillum provides two different ways to expose runtime information:

  • The public status interface, intended for users and communities.
  • The metrics listener, intended for operators and monitoring systems.

These serve different purposes and should usually have different exposure rules. The public status interface can be safely shown to users when configured appropriately. The metrics listener should normally remain private.

The metrics listener is intended for monitoring and observability.

Metrics are useful for operators who want to track runtime behavior, service health, traffic patterns, and mode activity over time.

A typical metrics listener default is:

[metrics]
listen = "127.0.0.1:9090"

Binding metrics to localhost keeps them private by default. That is usually the right choice unless you have a dedicated monitoring network, reverse proxy, VPN, or firewall rules protecting access.

The public status interface and metrics listener should not be treated as the same thing.

SurfaceAudienceTypical exposurePurpose
Public status interfaceUsers and communitiesPublic or semi-publicHuman-readable reflector status
Metrics listenerOperators and monitoring systemsPrivateMachine-readable monitoring data
Admin interfaceOperatorsPrivateManagement and configuration

The public status interface answers questions like:

  • Which modes are available?
  • Is the reflector online?
  • What services does this deployment provide?
  • Where should users connect?

The metrics listener answers questions like:

  • Is the process healthy?
  • Are mode instances running?
  • How much activity is happening?
  • Are errors increasing?
  • Did traffic suddenly drop?
  • Is something behaving strangely?

A safe deployment usually exposes services like this:

ServiceRecommended exposure
Protocol listenersPublic if the reflector is intended for public use
Public status interfacePublic or community-facing
Admin interfacePrivate, VPN, SSH tunnel, or reverse proxy protected
Metrics listenerPrivate or monitoring-only

Avoid exposing the metrics listener directly to the public internet. Metrics can reveal operational details that are useful to operators and occasionally useful to people whose hobbies need better parental supervision.

For a local-only metrics listener:

[metrics]
listen = "127.0.0.1:9090"

This allows monitoring tools on the same host to scrape metrics without exposing the listener externally.

Example private network metrics configuration

Section titled “Example private network metrics configuration”

For a private monitoring network:

[metrics]
listen = "10.10.0.25:9090"

Use a specific private interface address when metrics should only be reachable from a monitoring VLAN, VPN, or private management network.

The public status interface may be exposed through a reverse proxy such as Caddy, nginx, or Traefik.

A typical deployment might expose the public site on HTTPS:

https://vexillum.example.net/

while keeping the admin and metrics listeners private:

127.0.0.1:8080
127.0.0.1:9090

This gives users a useful status page without handing them the control panel like civilization has learned nothing.

When using a reverse proxy:

  • Terminate TLS at the proxy.
  • Expose the public status interface publicly.
  • Restrict the admin interface by VPN, IP allowlist, authentication, or private network.
  • Keep the metrics listener private unless your monitoring system needs proxy access.
  • Avoid publishing raw metrics unless you have a specific reason.
  • Use clear hostnames for public and admin access.

Example hostname layout:

HostnamePurpose
vexillum.example.netPublic status interface
admin.vexillum.example.netAdmin interface, restricted
metrics.vexillum.example.netMetrics, restricted or internal only

Do not put all three surfaces behind the same access policy unless you enjoy solving self-inflicted security puzzles.

Operators should configure service health checks where possible.

Health checks can be used by:

  • systemd watchdogs
  • reverse proxies
  • load balancers
  • monitoring systems
  • external uptime checks
  • deployment automation

A health check should answer one basic question:

Is the Vexillum process alive and able to serve requests?

A health check does not necessarily prove that every reflector mode is healthy, reachable, or correctly configured. It only proves that the checked service is responding. Useful, but not magic. Humans keep trying to outsource judgment to endpoints named /health.

Useful things to monitor include:

  • Process uptime
  • Admin or public web availability
  • Metrics scrape success
  • Enabled mode instance state
  • Listener availability
  • Packet or session activity
  • Authentication failures
  • Error counts
  • Unexpected restarts
  • Disk usage for storage and logs
  • Memory and CPU usage
  • Network traffic on protocol ports

For a public reflector, also consider monitoring from outside your network so you know whether users can actually reach the exposed services.

Use ss to confirm which ports Vexillum is listening on:

Terminal window
ss -ltnup | grep vexillum

If the process name does not appear, search by port:

Terminal window
ss -ltnup | grep -E '8080|9090|17000|42000|43000|43001'

This can help confirm whether the configured services actually started and which addresses they are bound to.

Use curl to test HTTP listeners:

Terminal window
curl -v http://127.0.0.1:8080/

For metrics:

Terminal window
curl -v http://127.0.0.1:9090/

If a service is bound to 127.0.0.1, it will only be reachable from the same machine unless you use a tunnel or reverse proxy.

Check:

  • Is Vexillum running?
  • Is the public listener enabled?
  • Is the listener bound to the expected address?
  • Is the reverse proxy pointing to the correct port?
  • Is the firewall allowing inbound traffic?
  • Is DNS pointing to the correct host?
  • Is TLS configured correctly?

Check:

  • Is the metrics listener enabled?
  • Is it bound to 127.0.0.1 or a private address?
  • Are you testing from the same host?
  • Is a firewall blocking access?
  • Is your monitoring system scraping the correct URL?
  • Are you accidentally trying to access private metrics from a public network?

This usually means the admin listener is bound to localhost:

[admin]
listen = "127.0.0.1:8080"

That is expected. Use an SSH tunnel, VPN, reverse proxy, or private listener address if remote administration is required.

A mode port is open but clients cannot connect

Section titled “A mode port is open but clients cannot connect”

Check:

  • The mode instance is enabled.
  • The listener is bound to the expected address.
  • The firewall allows the protocol and port.
  • NAT forwards the correct protocol, UDP or TCP.
  • The client is using the correct reflector address.
  • The mode-specific configuration matches what the client expects.
  • Logs show whether packets or sessions are arriving.

For UDP modes, remember that a port can appear open from the server side while clients still fail due to NAT, firewall, or routing problems. UDP remains the internet’s way of saying “maybe.”

A practical deployment might use:

ToolPurpose
systemdProcess supervision
journalctlRuntime logs
Prometheus-compatible scraperMetrics collection
GrafanaDashboards
Uptime monitorPublic web availability
Reverse proxy health checksWeb listener health
External UDP checksProtocol reachability, where practical

The exact tooling matters less than having enough visibility to know whether Vexillum is healthy before users start reporting “it doesn’t work” with the diagnostic precision of a foghorn.

Before publishing a Vexillum deployment:

  • Confirm the public status page loads.
  • Confirm admin access is restricted.
  • Confirm metrics are private.
  • Confirm enabled protocol ports are listening.
  • Confirm firewall and NAT rules match enabled modes.
  • Confirm monitoring can reach the metrics listener.
  • Confirm logs are available after restart.
  • Confirm storage is persistent.
  • Confirm backup coverage includes configuration and storage.
  • Confirm public documentation shows the correct connection details.

Metrics and status behavior may continue to evolve while Vexillum is under active development. Operators should review the current example configuration and release notes when upgrading.