226 lines
8.9 KiB
Markdown
226 lines
8.9 KiB
Markdown
# REST API (agent-compatible)
|
||
|
||
PearMonitor agents expose an optional HTTP API for local tooling (`/api/v1`, `/api/v2`, `/api/v3`).
|
||
|
||
Default bind: `http://127.0.0.1:18888`.
|
||
Disable: `PEARDATA_REST=0`.
|
||
Bind all interfaces (careful): `PEARDATA_REST_HOST=0.0.0.0`.
|
||
|
||
Core query/metadata paths are implemented for scripts, Grafana, and Prometheus scrapers.
|
||
|
||
Compatibility matrix vs upstream agent OpenAPI: [SWAGGER_PLAN.md](./SWAGGER_PLAN.md).
|
||
|
||
## Quick examples
|
||
|
||
```bash
|
||
# Agent info
|
||
curl -s http://127.0.0.1:18888/api/v3/info | jq
|
||
|
||
# Chart catalog (v1 style)
|
||
curl -s http://127.0.0.1:18888/api/v1/charts | jq '.charts | keys'
|
||
|
||
# Last 60s of CPU (v3)
|
||
curl -s 'http://127.0.0.1:18888/api/v3/data?chart=system.cpu&after=-60&points=60' | jq
|
||
|
||
# Contexts
|
||
curl -s http://127.0.0.1:18888/api/v3/contexts | jq
|
||
|
||
# Prometheus export
|
||
curl -s 'http://127.0.0.1:18888/api/v3/allmetrics?format=prometheus'
|
||
|
||
# Health
|
||
curl -s http://127.0.0.1:18888/api/v3/health | jq
|
||
```
|
||
|
||
## Endpoint matrix
|
||
|
||
### Info & identity
|
||
|
||
| Method | Path | Notes |
|
||
|--------|------|-------|
|
||
| GET | `/` or `/api` | Service index + P2P pubkey + HyperDB keys |
|
||
| GET | `/api/v1/info` | Agent info |
|
||
| GET | `/api/v2/info` | same |
|
||
| GET | `/api/v3/info` | **preferred** (includes `peardata.hyperdb`) |
|
||
| GET | `/api/v3/db` | HyperDB public/discovery keys + collections |
|
||
| GET | `/api/v3/versions` | Agent / protocol / API versions |
|
||
| GET | `/api/v3/me` | Anonymous REST identity note |
|
||
| GET | `/api/v3/settings` | Runtime knobs + **retention** + **storage usage** summary (Data Manager read model) |
|
||
| GET | `/api/v3/config` | alias of settings |
|
||
| GET | `/health`, `/api/v1/health`, `/api/v3/health` | Aggregate health |
|
||
|
||
### AI / QVAC tool helpers
|
||
|
||
Compact reads for local copilots (same payloads as P2P `getHostSnapshot` / `searchCharts` / `summarizeChart`). See [QVAC.md](./QVAC.md).
|
||
|
||
| Method | Path | Notes |
|
||
|--------|------|-------|
|
||
| GET | `/api/v3/ai/snapshot` | Health, KPIs, anomalies/alerts, catalog/storage summary |
|
||
| GET | `/api/v3/ai/charts?q=&limit=` | Catalog search |
|
||
| GET | `/api/v3/ai/chart/:id/summary?after=&points=&group=` | Windowed min/avg/max/last per dimension |
|
||
|
||
```bash
|
||
curl -s http://127.0.0.1:18888/api/v3/ai/snapshot | jq
|
||
curl -s 'http://127.0.0.1:18888/api/v3/ai/charts?q=disk&limit=20' | jq
|
||
curl -s 'http://127.0.0.1:18888/api/v3/ai/chart/system.cpu/summary?after=-120&points=120' | jq
|
||
```
|
||
|
||
### Nodes
|
||
|
||
| Method | Path |
|
||
|--------|------|
|
||
| GET | `/api/v2/nodes` |
|
||
| GET | `/api/v3/nodes` |
|
||
| GET | `/api/v3/node_instances` |
|
||
| GET | `/api/v3/fleet` |
|
||
| GET | `/api/v3/stream_path` |
|
||
|
||
Single-agent returns one node. With `PEARDATA_PARENT=1`, `/nodes` and `/fleet` include dialed children.
|
||
|
||
### Export
|
||
|
||
| Method | Path | Notes |
|
||
|--------|------|-------|
|
||
| GET | `/api/v3/export` | JSON snapshot; `?format=prometheus` for text; `?write=1` writes `PEARDATA_EXPORT_DIR` |
|
||
| GET | `/api/v3/tunnel` | HyperDHT REST tunnel status / public key |
|
||
|
||
### Contexts & charts
|
||
|
||
| Method | Path | Notes |
|
||
|--------|------|-------|
|
||
| GET | `/api/v3/contexts` | Context map |
|
||
| GET | `/api/v2/contexts` | same |
|
||
| GET | `/api/v3/context?context=` | One context |
|
||
| GET | `/api/v1/charts` | Full chart summary (legacy but useful) |
|
||
| GET | `/api/v1/chart?chart=` | One chart |
|
||
|
||
### Data queries
|
||
|
||
| Method | Path | Query params |
|
||
|--------|------|--------------|
|
||
| GET | `/api/v3/data` | `chart` or `context`, `after`, `before`, `points`, `group`, `tier`, `format` |
|
||
| GET | `/api/v2/data` | same |
|
||
| GET | `/api/v1/data` | same (legacy) |
|
||
|
||
**Params (agent-style)**
|
||
|
||
| Param | Default | Description |
|
||
|-------|---------|-------------|
|
||
| `chart` / `context` | required | Chart id or context id |
|
||
| `after` | `-60` | Absolute unix sec, or relative (negative) |
|
||
| `before` | `0` (now) | Absolute or relative |
|
||
| `points` | `60` | Max points returned (downsampled) |
|
||
| `group` | `average` | `average` \| `min` \| `max` \| `sum` |
|
||
| `tier` | `0` | `0` = 1s buffer, `1` = downsampled |
|
||
| `format` | `json` | `json` \| `csv` \| `array` |
|
||
|
||
### Search & weights
|
||
|
||
| Method | Path | Notes |
|
||
|--------|------|-------|
|
||
| GET | `/api/v3/q?q=` | Full-text over chart ids/titles |
|
||
| GET | `/api/v1\|v2\|v3/weights` | Metric Correlations + alert weights — see [Weights](#weights--metric-correlations); user guide: [weights-api](../user-guide/weights-api.md) |
|
||
| GET | `/api/v1\|v2\|v3/logs` | Log search — `source=anomaly\|audit\|journal`, `q`, `since`, `until`, `priority`, `unit`, `limit` — [user-guide/logs](../user-guide/logs.md) |
|
||
| GET | `/api/v1\|v2\|v3/processes` | Live process table — `sort`, `order`, `filter`, `q`, `limit`, `offset`, `pid` — [user-guide/processes](../user-guide/processes.md) |
|
||
|
||
### Alerts
|
||
|
||
| Method | Path |
|
||
|--------|------|
|
||
| GET | `/api/v3/alerts` |
|
||
| GET | `/api/v2/alerts` |
|
||
| GET | `/api/v1/alarms` |
|
||
| GET | `/api/v3/alert_transitions` |
|
||
| GET | `/api/v3/alert_config` |
|
||
| GET | `/api/v3/variable` |
|
||
|
||
### Export & badges
|
||
|
||
| Method | Path | Params |
|
||
|--------|------|--------|
|
||
| GET | `/api/v3/allmetrics` | `format=json\|prometheus\|shell` |
|
||
| GET | `/api/v1/allmetrics` | same |
|
||
| GET | `/api/v3/badge.svg` | `chart`, `dimensions`, `label` |
|
||
|
||
### Functions (stub)
|
||
|
||
| Method | Path | Notes |
|
||
|--------|------|-------|
|
||
| GET | `/api/v3/functions` | Lists job names; execution remains P2P `runJob` for auth |
|
||
|
||
## Auth model (REST)
|
||
|
||
- **Default:** localhost-only, no bearer required (like a typical local agent bind).
|
||
- **P2P remains the secure remote path** (Noise + roles).
|
||
- If you bind `0.0.0.0`, put REST behind a firewall, reverse proxy, or Holesail tunnel — do not expose raw metrics to the internet.
|
||
- Future: optional bearer gate (`/api/v3/bearer_protection` parity).
|
||
|
||
## Weights / Metric Correlations
|
||
|
||
`GET /api/v1/weights` · `/api/v2/weights` · `/api/v3/weights` (same engine; also RPC `getWeights`)
|
||
|
||
Desktop walkthrough: [user-guide/metric-correlations.md](../user-guide/metric-correlations.md) · Parameter cheat sheet: [user-guide/weights-api.md](../user-guide/weights-api.md)
|
||
|
||
| Param | Notes |
|
||
|-------|--------|
|
||
| `method` | `volume` (default with window), `ks2`, `anomaly-rate`, `value`, `alerts` |
|
||
| `after` / `before` | Highlight window (unix seconds or relative, e.g. `after=-60&before=0`) |
|
||
| `baseline_after` / `baseline_before` | Optional; default = 4× highlight immediately preceding |
|
||
| `points` | Resolution (default 500 for MC methods) |
|
||
| `time_group` | Aggregation for `value` (default `cv`) |
|
||
| `contexts` / `charts` / `dimensions` | Optional filters |
|
||
| `limit` / `timeout` | Result cap / ms budget |
|
||
|
||
Without a highlight window, `method` defaults to **alerts** (active anomaly/alert weights — used by Related panel boost).
|
||
|
||
Response includes `method`, `view.highlight` / `view.baseline`, and `results[{ id, weight, context, family, info }]`. Higher `weight` = more changed / interesting.
|
||
|
||
Engine: `server/services/weights.js`. Unit tests: `test/weights.test.js`.
|
||
|
||
## Logs
|
||
|
||
`GET /api/v1/logs` · `/api/v2/logs` · `/api/v3/logs` (same engine; also RPC `queryLogs`)
|
||
|
||
Desktop walkthrough: [user-guide/logs.md](../user-guide/logs.md)
|
||
|
||
| Param | Notes |
|
||
|-------|--------|
|
||
| `source` | `journal` (default) \| `anomaly` \| `audit` — desktop prefers **journal** for admins |
|
||
| `q` | Case-insensitive substring over message / unit / severity |
|
||
| `since` / `until` | Absolute ms/sec, ISO, or relative (`-1h`) |
|
||
| `priority` | Journal max priority (`journalctl -p`) |
|
||
| `unit` | Journal unit (e.g. `peardata.service`) |
|
||
| `limit` / `cursor` | Cap (default 200, max 2000) + pagination offset |
|
||
|
||
**Auth:** REST is localhost-open (like other GETs). Over P2P, `audit` and `journal` require **admin**; `anomaly` allows viewer.
|
||
|
||
**Journal:** enabled by default (`PEARDATA_JOURNAL=0` to disable). Linux only; installer adds `peardata` to `systemd-journal`. Omitted `source` defaults to **journal**.
|
||
|
||
Engine: `server/services/logs.js`. Unit tests: `test/logs.test.js`.
|
||
|
||
### Data Manager (read via settings)
|
||
|
||
`GET /api/v3/settings` includes `retention` and a `storage` summary (data dir / corestore / memory rings). Mutating retention / prune is **P2P admin RPC** (`setRetentionConfig`, `pruneHistory`) — see [PROTOCOL.md](./PROTOCOL.md) and [user-guide/settings.md](../user-guide/settings.md).
|
||
|
||
## CORS
|
||
|
||
`Access-Control-Allow-Origin` defaults to `*` (override with `PEARDATA_REST_CORS`).
|
||
|
||
## Scope notes
|
||
|
||
| Area | PearData |
|
||
|------|----------|
|
||
| Weights / Metric Correlations | `GET /api/v*/weights` — highlight-vs-baseline scoring (`method=volume\|ks2\|anomaly-rate\|value`) or alert weights when no window; see above |
|
||
| Logs | `GET /api/v*/logs` — journal (default) / anomaly / audit; see above |
|
||
| Retention / storage | `GET /api/v*/settings` includes retention + usage; writes via P2P admin RPC |
|
||
| Multi-node parent streaming | Single node; parent planned |
|
||
| Cloud POST spaces APIs | Not implemented (agent GET style only) |
|
||
| App/plugin charts (nginx, DB, …) | System/OS charts; plugins later |
|
||
| Functions via HTTP | Listed; run via P2P jobs |
|
||
|
||
## Implementation
|
||
|
||
- Router: `server/rest/routes.js`
|
||
- Server: `server/rest/http-server.js`
|
||
- Exporters: `server/rest/formatters.js`
|