GET /metricsServed by the Node entry (npm start, servePinboard with a metricsRegistry) only. Always at /metrics, ignoring basePath. Counters are per node; gauges about the fleet read a shared overview cached for 5 s.
Authentication
pinboard:operator scope with an unrestricted claim: namespaces contains "*", and hostnames and envs are absent or contain "*". Metrics cannot be filtered per caller.
Example
curl https://pinboard.example.com/metrics \
-H "Authorization: Bearer $PINBOARD_OPERATOR_TOKEN"Response
200
text/plain Prometheus exposition.
| Metric | Type | Labels | Description |
|---|---|---|---|
pinboard_http_requests_total | counter | method, route, status_code | HTTP requests, upgrades excluded |
pinboard_http_request_duration_seconds | histogram | method, route, status_code | Request duration |
pinboard_internal_errors_total | counter | source | Caught errors, by source |
pinboard_registered_workers | gauge | Live workers, fleet-wide | |
pinboard_active_placements | gauge | Live placements, fleet-wide | |
pinboard_active_hostnames | gauge | Distinct hostnames with live workers | |
pinboard_active_envs | gauge | Distinct envs with live workers | |
pinboard_placement_resolutions_total | counter | outcome | Resolutions; outcomes as in Node health |
pinboard_event_loop_lag_seconds | gauge | Event loop lag, mean over 2 s | |
pinboard_forwards_total | counter | kind (http, upgrade) | Forwards started |
pinboard_forward_failures_total | counter | outcome (aborted, unreachable, failed) | Forwards that did not complete |
pinboard_takeovers_total | counter | strategy, outcome | Cross-hostname takeovers |
pinboard_degraded_heartbeats_total | counter | reason | Heartbeats whose probe failed, plus mismatch voids |
pinboard_register_rejections_total | counter | account, pool, reason (policy, conflict, invalid) | Rejected registrations |
pinboard_data_plane_connections | gauge | Open forwards and tunnels on this node |
route is /healthz, /readyz, /:namespace/:id, an exact /registry/* path, or unknown.
The Node default metrics from @prometheus-io/client (collectDefaultMetrics) are also exported with the pinboard_ prefix, for example pinboard_process_resident_memory_bytes.
Errors
| Status | Body | When |
|---|---|---|
401 | {"error":"unauthorized"} | No accepted credential |
403 | {"error":"forbidden"} | No pinboard:operator scope, malformed claim, or a restricted claim |
404 | {"error":"unknown namespace"} | Metrics not configured (the path falls through to routing) |
500 | {"error":"metrics collection failed"} | Collection threw |
/metrics does not check whether the node is serving.