Many APIs in, standard metrics out
Poll one or several vendor APIs, follow pagination, normalize names, labels and units, then export clean metrics.
Tapyr collects data from the REST APIs of your cloud-managed network gear, normalizes it, and exports clean Prometheus or OTLP metrics. One declarative definition per API, no code to write.
Prometheus and OpenTelemetry logos are trademarks of their respective owners.
GET /v1/devices?page=1
{
"data": [{
"id": "dev-0142",
"name": "branch-12-ap",
"status": "online",
"signal": { "rssi": -61 }
}, ...],
"meta": { "next": 2 }
}
metrics:
- name: device_up
value: item.status == "online"
- name: signal_rssi_dbm
value: item.signal.rssi
labels:
device: item.name
# every page, every device
tapyr_device_up{
provider="wifi_cloud",
device="branch-12-ap"} 1
tapyr_signal_rssi_dbm{
provider="wifi_cloud",
device="branch-12-ap"} -61
# OTLP, simplified
resource: provider=wifi_cloud
gauge device_up
device=branch-12-ap 1
gauge signal_rssi_dbm
device=branch-12-ap -61
Illustration. Field and metric names are examples, the definition syntax is not final.
Cloud APIs ration calls in many ways, often several at once. When one of those budgets runs dry, every device you monitor goes flat until the window resets, and the cause hides in a response header.
Tapyr declares those limits once per provider, plans every call against them, keeps a reserve for retries, and exports its own quota metrics so you see trouble coming.
You describe an API once: its endpoints, how to page through them, how its JSON becomes metrics, and every limit it enforces. The budget engine schedules each call against those limits, the collector fetches, the normalizer maps, the exporters deliver.
Declare what the vendor enforces, once per provider. Then ask Tapyr what your jobs will cost before anything touches the real API.
A per-organization rate, plus a daily quota that resyncs from the API's own headers.
limits:
- name: org-rate
kind: rate
rate: 10/s
scope: { by: [account, "var:organizationId"] }
- name: daily
kind: quota
max: auto
initialMax: 5000
window: { period: day, resetAt: "00:00", timezone: UTC }
sync:
limitHeader: X-RateLimit-Limit-day
remainingHeader: X-RateLimit-Remaining-day
tapyr plan projects what each quota window will spend, and stretches low-priority jobs to fit.
$ tapyr planQUOTA SCOPE BUDGET/DAY PROJECTED RESERVE STATUSwifi-cloud/daily 4500 4212 450 ok (93.6%) job wifi-aps desired 5m effective 5m 288 runs x 3 pages = 864 job wifi-clients desired 5m effective 15m 96 runs x 30 pages = 2880 (stretched x3, priority low)
Everything below is in development. Nothing is released yet.
Poll one or several vendor APIs, follow pagination, normalize names, labels and units, then export clean metrics.
YAML plus CEL. A new API needs a definition, not Go code.
Any window, any scope, retries included. Budgets resync from the API's quota headers.
Know what a config will spend on each quota before you deploy it.
Every provider ships with one that enforces the real limits. No vendor account needed.
Calls, retries, 429s, quota left, projected exhaustion and job freshness, as metrics. Plus a read-only web UI in the binary.
Tapyr won't make data from US clouds sovereign. It just doesn't add another middleman between your network and your dashboards.
Apache-2.0. Read it, fork it, write your own providers.
One static binary on your infrastructure. No account, no SaaS.
No telemetry, no third party. Your metrics stay with you.