5.6 KiB
5.6 KiB
Extending PearData
Add a chart / context
- Define the chart in
shared/metrics.js(STATIC_CHART_DEFS, orregisterChart()for instances). - Emit samples from
server/services/collector.js(or a new collector module). - Store + REST/RPC pick it up automatically via
getAllChartDefs()/CHART_BY_ID. - Ensure the chart lands in the Charts wall TOC via
shared/taxonomy.js(sectionForChartmatchers). Prefer a real section over Other. - Document dimensions in DATA-MODEL.md.
- The desktop Charts tab picks it up automatically (no per-chart HTML). Overview spotlight is optional.
Coverage is asserted by test/taxonomy-coverage.test.js.
Add an RPC method
shared/protocol.js
export const MethodRoles = Object.freeze({
// ...
listContainers: Roles.viewer,
restartCollector: Roles.admin,
})
shared/schema.js
Validate args.
server/services/… + server/handlers/monitor.js
Register with session.respond(...). Use { hot: true } for high-frequency paths.
Client
await manager.request(Methods.listContainers, {})
Docs + tests
Update PROTOCOL.md and add a brittle test.
Add a REST route
Edit server/rest/routes.js — keep stable /api/v3/... path naming.
Add a job
Register in server/services/jobs.js JOB_HANDLERS.
retrainAnomaly: async (args) => getAnomalyEngine().retrain(getStore(), args)
Operators run via runJob (retrainAnomaly is registered).
Add a collector plugin (pattern)
server/services/collectors/
docker.js # PEARDATA_DOCKER=1 — cgroup + Docker socket names (installer auto-enables)
peardock.js # bridge (planned)
Have pipeline.js start each enabled collector; all emit samples batches into the same store.
Docker collector (shipped spike)
- Set
PEARDATA_DOCKER=1on the agent (or re-run the installer when Docker is present). - Ensure
peardatacan read the socket (usermod -aG docker peardata+ unitSupplementaryGroups=… docker). - Charts:
docker.containers,docker.cpu.<shortId>,docker.mem.<shortId>(stable ids); titles/families use human names (dozzle · CPU). - Discovery: cgroup v2
docker-*.scope/libpod-*.scope; names vialoadContainerNameMap(unix HTTP API →docker ps→ filesystem) + Compose labels (shared/container-names.js). - Cgroups collector reuses the same name map so
cgroup.*cards are not bare hashes. - UI: user-guide/containers.md.
Process top-N collector
- Default on for Linux (
PEARDATA_PROCESSES=0to disable charts). OptionalPEARDATA_PROCESSES_TOP=8. - Charts:
processes.top_cpu/top_rss/top_io/top_threads(dimensions = process comm names). - Desktop Processes tab + RPC
listProcesses/GET /api/v3/processes— per-PID live table (not just top-N charts). - Linux
/proconly; safe no-op on other platforms.
Nginx stub_status plugin
- Set
PEARDATA_NGINX=1andPEARDATA_NGINX_URL=…. - Charts:
nginx.connections,nginx.requests. - Base class:
server/services/collectors/plugin.js(CollectorPlugin).
Redis INFO plugin
- Set
PEARDATA_REDIS=1and optionalPEARDATA_REDIS_URL. - Charts:
redis.memory,redis.clients,redis.stats.
Postgres plugin
- Set
PEARDATA_POSTGRES=1(+ host/port). - Charts:
postgres.up(TCP probe); optionalpostgres.statsviaPEARDATA_POSTGRES_STATS_URL.
Export / Prometheus push
- Job
exportSnapshot/ RPCexportSnapshot/ RESTGET /api/v3/export - Job
prometheusPush→PEARDATA_PUSHGATEWAY_URL - Optional file write:
PEARDATA_EXPORT_DIR
Webhook notifications
- Set
PEARDATA_WEBHOOK_URL=https://…and optionalPEARDATA_WEBHOOK_SECRET. - When a secret is set, requests include:
X-PearData-TimestampX-PearData-Signature: sha256=<HMAC-SHA256(secret,${ts}.${body})>
- Verify with
verifyWebhookSignaturefromserver/services/notify.js. - Desktop: toggle “Desktop notifications” in the Anomalies panel.
z-score / retrain
PEARDATA_ANOMALY_MODE=zscore|hybridfor rolling z-score fires.- Job
retrainAnomaly(operator) refits warn/crit from store history (mean ± z·stdev). - Helpers live in
server/services/zscore.js.
REST HyperDHT tunnel (holesail-style)
PEARDATA_REST_TUNNEL=1(+ optionalPEARDATA_REST_TUNNEL_SEED).- Agent announces a HyperDHT key that proxies TCP → local REST.
- Inspect:
GET /api/v3/tunnelorgetServerInfo.restTunnel.
PearDock bridge
- Set
PEARDATA_PEARDOCK=1andPEARDATA_PEARDOCK_PEERS=<dockOrAgentPk>,…. - Bridge dials peers, reads
getAllMetrics, remapsdocker.*→peardock.*. - Prefer public APIs / your own modules when integrating with PearDock (both are AGPL-3).
Parent peer (fleet aggregator)
Shipped opt-in spike:
- Set
PEARDATA_PARENT=1andPEARDATA_PARENT_PEERS=<childPk>,…. - Parent dials children over HyperDHT (
PearDataConnection), polls health + metrics. - Emits
fleet.cpu,fleet.ram,fleet.childreninto the local store. - REST:
GET /api/v3/nodes(multi),/api/v3/fleet,/api/v3/stream_path. - RPC:
getFleetHealth,listChildPeers.
PearDock / PearVirt hooks
- Prefer RPC adapters over scraping: call dock/virt methods, map to PearData contexts.
- PearData is AGPL-3.0-only — see LICENSE. Depend on public APIs when integrating sibling projects.
Desktop chrome
Keep <pear-ctrl>, titlebar drag regions, and pear.gui.resizable. See DESKTOP.md.
Rebrand (fork)
npm run rename -- my-monitor MyMonitor
Review invite prefix / env prefix, then npm test.