Monitoring · Zabbix, Prometheus & Grafana

Your VPN belongs on the same dashboard as everything else

Valenius exposes a Prometheus-compatible metrics endpoint and ships an official Zabbix template — one HTTP item a minute, no agent on the backend, no scripts on the Zabbix server. Backend health, license runway and every WireGuard® gateway land in the monitoring system your team already watches. Included in both editions.

Why it matters

A VPN nobody watches is a VPN that fails quietly

VPN problems rarely announce themselves. A license quietly runs out, a gateway stops answering, handshakes go stale on one site — and the first alert you get is a phone call from someone who cannot work. These are exactly the states a monitoring system is good at catching, provided something hands it the numbers.

License runway, not license surprise

Validity, expiry date and seat usage are all exported as plain numbers, so your monitoring system can warn you thirty days out and escalate at seven — instead of you discovering the problem on the morning it expires.

🗄️

Backend health, in detail

Is the backend answering, is its database reachable, how long does a query take, what does request latency look like at the 95th percentile, are 5xx responses climbing? All of it is visible before users start noticing anything.

📡

Gateways that went quiet

Each Pro-managed WireGuard® server reports in every 30 seconds. If one stops, you see it as a gateway that is down — and, separately, as data that has gone stale, so “the server is dead” never gets confused with “the poller is stuck”.

🤝

Handshakes going cold

Peers configured versus peers actually connected, plus the age of the oldest handshake on each gateway. A site that slowly loses its peers shows up as a trend long before anyone raises a ticket about it.

📈

Capacity before it hurts

Gateway CPU, memory, load average and connection-tracking table usage come along with the peer data — so the host running out of room is a warning you act on, not a post-mortem you write.

🔕

No new console to keep open

You already run something that pages the right person at 3am, with escalation, maintenance windows and on-call rotas configured. Valenius feeds that, instead of asking your team to watch yet another panel.

The integration

An official Zabbix template, not a DIY scrape

Plenty of tools publish a metrics endpoint and leave the rest to you. Valenius ships the finished Zabbix side too — items, triggers, discovery, value maps, a dashboard and a traffic graph, in one importable file.

Valenius by HTTP

One request a minute, whatever the size of your fleet

The template polls a single HTTP agent item once a minute. Everything else — roughly twenty control-plane and license items, plus per-gateway items and triggers discovered automatically — is parsed out of that one payload by Zabbix’s built-in Prometheus preprocessing. A deployment with five hundred peers is still one request, not five hundred.

Nothing is installed on the Valenius host and no external script runs on the Zabbix server. The host needs no interface at all, because every item is an HTTP agent or dependent item rather than an agent or SNMP poll.

  • Import-verified against a real Zabbix 7.4 server; declares 7.0, so any 7.x import works
  • Low-level discovery finds your gateways on its own — no host editing when a new one appears
  • Bundled Valenius overview dashboard and a per-gateway traffic graph
  • Everything tunable by macro — thresholds, timeouts and discovery filters, no template forking
  • Fields this backend cannot source yet are simply absent, never reported as a fake zero
  • Metric names are treated as a public API: added to or deliberately omitted, never silently renamed
Zabbix logo
Under the hood
  • Endpoint: GET /api/v1/metrics · Prometheus text exposition format
  • Snapshot: built in the background, 15 s cache — a scrape never blocks a request path
  • Auth: bearer token with the single scope monitoring:read
  • Limits: 12 requests/minute per token, gzip when asked for
  • Also: GET /api/v1/monitoring/status — the same data as small JSON
  • Template: integrations/zabbix/template_valenius_http.yaml in the repo

Check it with one command

The endpoint is ordinary HTTP, so you can verify it before touching Zabbix at all — and confirm that it refuses anyone without a token.

# does it answer, and with the right content type?
curl -sSi -H "Authorization: Bearer vlnm_..." \
  https://vpn.example.com/api/v1/metrics | head -20

# and without a token it must refuse — expect 401
curl -sSi https://vpn.example.com/api/v1/metrics | head -1
Setup

Three steps, about five minutes

No agent to deploy, no exporter to run, no script to schedule. Mint a token, import a file, set two macros.

1

Mint a monitoring token

Open Monitoring in the admin panel’s left nav and create a token. Optionally restrict it to your monitoring server’s IP or CIDR range and give it an expiry. The full value is shown exactly once.

2

Import the template

In Zabbix, Data collection → Templates → Import and pick template_valenius_http.yaml. Create a host for your backend — no interface needed — and link the template Valenius by HTTP.

3

Set two macros

Point {$VALENIUS.URL} at your backend and paste the token into {$VALENIUS.TOKEN} as Secret text. A minute later, Latest data fills up and gateway discovery starts finding your servers.

In practice

What it will actually wake you up for

Triggers ship with sensible defaults and every threshold is a macro, so tightening or loosening one is a field on the host — not a fork of the template.

Control plane

  • The service stopped answering scrapes altogether
  • The database is unreachable — raised as its own cause, not as a symptom
  • The metrics snapshot has gone stale, so the numbers can no longer be trusted
  • Request latency at the 95th percentile is above where it should sit
  • 5xx responses are climbing between scrapes
  • The backend version changed — useful as a notice next to a change record

License

  • The license is no longer valid
  • Expiry is inside the warning window (30 days by default)
  • Expiry is inside the critical window (7 days by default)
  • Seat usage crossed 90 % — time to talk about the next tier
  • Seat usage crossed 98 % — the next onboarding is going to fail
  • Nothing at all, on a Community install with no expiry — the item simply has nothing to parse, and the trigger never fires

Per gateway (Pro)

  • A gateway’s sidecar stopped answering the backend’s poll
  • A gateway has not been seen for longer than the allowed window
  • The oldest handshake on a gateway is older than it should be
  • CPU or connection-tracking usage crossed its threshold
  • Endpoint churn spiked — peers roaming or a NAT device misbehaving
  • Discovered automatically, so a gateway added today is monitored today

Fleet totals

  • Customers, clients and gateways configured
  • How many gateways answered the last poll
  • Devices online right now, against devices in total
  • Lifetime traffic per gateway, graphed as a rate
  • Peers configured versus peers reachable, per gateway
  • All of it on the bundled dashboard, without building one first
Not a Zabbix shop?

It is a standard endpoint, so bring your own tool

The Zabbix template is the ready-made path, not the only one. The format underneath is plain Prometheus text exposition — the closest thing monitoring has to a lingua franca — so anything that scrapes Prometheus reads Valenius without an adapter.

Prometheus logo Grafana logo

Prometheus & Grafana

Add a scrape job with a bearer token and you have history, alerting rules and dashboards in the stack you already run. Grafana Alloy works the same way.

Checkmk logo

Checkmk, VictoriaMetrics, Netdata

All of them ingest the Prometheus format natively. One implementation on our side means you are not waiting for us to build an integration for your particular tool.

💚

Uptime Kuma & plain curl

For a simple “is it healthy” check there is a small JSON summary at /api/v1/monitoring/status — status, version, license, database, gateway and peer counts, nothing to parse.

🛠️

Your own scripts

The same JSON is what support will ask you to paste into a ticket. It is also perfectly reasonable as the input to a nightly report or a Slack digest you write yourself.

For MSPs

Built for people who already monitor other companies for a living

If you run Zabbix for your customers, a VPN platform that hands you a finished template is worth more than one that hands you a metrics URL and a shrug. Import once, link the template to a host per backend, and the customer VPN is monitored to the same standard as their servers — with the same escalation paths and the same reports.

Because the token plane is separate from everything else, a monitoring credential is safe to treat as infrastructure. It cannot list clients, read configs or change anything — so it can live in your monitoring server’s configuration without becoming a key to the customer’s VPN.

  • One template, many customers — thresholds per host, no per-customer fork
  • Gateway discovery keeps a growing fleet monitored without manual upkeep
  • Restrict a token to your monitoring server’s address, and give it an expiry
  • Seat-usage numbers make the “time to upgrade” conversation a data point, not a guess
🏢
Under the hood
  • Poll cost: one HTTP request per backend per minute, fleet size irrelevant
  • Gateway data: refreshed every 30 s by the Pro sidecar poll
  • Discovery: derived from the same payload — no second endpoint to allow
  • Token: revocable instantly, with optional CIDR allowlist and expiry
Access & privacy

A credential that can only ever read numbers

Monitoring systems collect credentials and keep them in config files for years. That is a good reason for a monitoring token to be the least powerful thing in your deployment — and for the data it returns to be boring by design.

🎫

Its own credential plane

A monitoring token is not an admin login with fewer rights, and not a management API key with a box unticked. It carries exactly one scope — read metrics — and there is no path from it to anything else.

🙈

No personal data in the labels

Labels never carry hostnames, usernames, e-mail addresses, WireGuard® public keys or client IP addresses — only opaque identifiers and counts. Key material never leaves through a monitoring scope, by construction.

🏷️

No customer names either

The license identity exported to your monitoring system is an internal license id, not the name of the organisation it belongs to. What ends up in a shared NMS is a number, not a customer list.

🚫

Never unauthenticated

There is no open metrics port, not even bound to localhost. Self-hosted deployments sit behind reverse proxies where “localhost” is rarely what people assume, so the endpoint always demands a token.

🧯

Degrades instead of failing

If the database is unreachable the endpoint still answers, still reports that the backend is up, and says the database is down. A monitoring endpoint that returns an error in a crisis tells you nothing at the moment you need it most.

🎁

Not behind a paywall

Observability stays part of the open-source core. Community installs get the endpoint, the token plane and the template; Pro adds the per-gateway detail, because that data comes from the Pro sidecar and does not exist without one.

Put your VPN on the dashboard

The metrics endpoint and the Zabbix template are in the free Community edition. Start there — the same template keeps working when you move to Pro, it just discovers more.