rigscope 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -0
- package/.next/app-path-routes-manifest.json +13 -0
- package/.next/build-manifest.json +20 -0
- package/.next/export-marker.json +6 -0
- package/.next/images-manifest.json +68 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +297 -0
- package/.next/react-loadable-manifest.json +1 -0
- package/.next/required-server-files.json +369 -0
- package/.next/routes-manifest.json +114 -0
- package/.next/server/app/_global-error/page.js +31 -0
- package/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_global-error.html +1 -0
- package/.next/server/app/_global-error.meta +35 -0
- package/.next/server/app/_global-error.rsc +18 -0
- package/.next/server/app/_global-error.segments/_full.segment.rsc +18 -0
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +24 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +3 -0
- package/.next/server/app/_not-found/page.js +1 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_not-found.html +1 -0
- package/.next/server/app/_not-found.meta +35 -0
- package/.next/server/app/_not-found.rsc +24 -0
- package/.next/server/app/_not-found.segments/_full.segment.rsc +24 -0
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +30 -0
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +4 -0
- package/.next/server/app/administration/page.js +1 -0
- package/.next/server/app/administration/page.js.nft.json +1 -0
- package/.next/server/app/administration/page_client-reference-manifest.js +1 -0
- package/.next/server/app/administration.html +1 -0
- package/.next/server/app/administration.meta +34 -0
- package/.next/server/app/administration.rsc +29 -0
- package/.next/server/app/administration.segments/_full.segment.rsc +29 -0
- package/.next/server/app/administration.segments/_tree.segment.rsc +4 -0
- package/.next/server/app/administration.segments/administration/__PAGE__.segment.rsc +35 -0
- package/.next/server/app/alerts/page.js +1 -0
- package/.next/server/app/alerts/page.js.nft.json +1 -0
- package/.next/server/app/alerts/page_client-reference-manifest.js +1 -0
- package/.next/server/app/alerts.html +1 -0
- package/.next/server/app/alerts.meta +34 -0
- package/.next/server/app/alerts.rsc +28 -0
- package/.next/server/app/alerts.segments/_full.segment.rsc +28 -0
- package/.next/server/app/alerts.segments/_tree.segment.rsc +4 -0
- package/.next/server/app/alerts.segments/alerts/__PAGE__.segment.rsc +34 -0
- package/.next/server/app/connections/page.js +1 -0
- package/.next/server/app/connections/page.js.nft.json +1 -0
- package/.next/server/app/connections/page_client-reference-manifest.js +1 -0
- package/.next/server/app/connections.html +1 -0
- package/.next/server/app/connections.meta +34 -0
- package/.next/server/app/connections.rsc +29 -0
- package/.next/server/app/connections.segments/_full.segment.rsc +29 -0
- package/.next/server/app/connections.segments/_tree.segment.rsc +4 -0
- package/.next/server/app/connections.segments/connections/__PAGE__.segment.rsc +35 -0
- package/.next/server/app/history/page.js +2 -0
- package/.next/server/app/history/page.js.nft.json +1 -0
- package/.next/server/app/history/page_client-reference-manifest.js +1 -0
- package/.next/server/app/history.html +1 -0
- package/.next/server/app/history.meta +34 -0
- package/.next/server/app/history.rsc +33 -0
- package/.next/server/app/history.segments/_full.segment.rsc +33 -0
- package/.next/server/app/history.segments/_tree.segment.rsc +4 -0
- package/.next/server/app/history.segments/history/__PAGE__.segment.rsc +37 -0
- package/.next/server/app/icon.svg/route.js +1 -0
- package/.next/server/app/icon.svg/route.js.nft.json +1 -0
- package/.next/server/app/icon.svg.body +1 -0
- package/.next/server/app/icon.svg.meta +1 -0
- package/.next/server/app/index.html +1 -0
- package/.next/server/app/index.meta +29 -0
- package/.next/server/app/index.rsc +26 -0
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +31 -0
- package/.next/server/app/index.segments/_full.segment.rsc +26 -0
- package/.next/server/app/index.segments/_tree.segment.rsc +3 -0
- package/.next/server/app/login/page.js +1 -0
- package/.next/server/app/login/page.js.nft.json +1 -0
- package/.next/server/app/login/page_client-reference-manifest.js +1 -0
- package/.next/server/app/login.html +1 -0
- package/.next/server/app/login.meta +34 -0
- package/.next/server/app/login.rsc +26 -0
- package/.next/server/app/login.segments/_full.segment.rsc +26 -0
- package/.next/server/app/login.segments/_tree.segment.rsc +4 -0
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +32 -0
- package/.next/server/app/machines/[machineId]/page.js +1 -0
- package/.next/server/app/machines/[machineId]/page.js.nft.json +1 -0
- package/.next/server/app/machines/[machineId]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/page.js +1 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/server/app/processes/page.js +2 -0
- package/.next/server/app/processes/page.js.nft.json +1 -0
- package/.next/server/app/processes/page_client-reference-manifest.js +1 -0
- package/.next/server/app/processes.html +1 -0
- package/.next/server/app/processes.meta +34 -0
- package/.next/server/app/processes.rsc +30 -0
- package/.next/server/app/processes.segments/_full.segment.rsc +30 -0
- package/.next/server/app/processes.segments/_tree.segment.rsc +4 -0
- package/.next/server/app/processes.segments/processes/__PAGE__.segment.rsc +36 -0
- package/.next/server/app-paths-manifest.json +13 -0
- package/.next/server/chunks/161.js +1 -0
- package/.next/server/chunks/168.js +1 -0
- package/.next/server/chunks/266.js +68 -0
- package/.next/server/chunks/430.js +116 -0
- package/.next/server/chunks/721.js +1 -0
- package/.next/server/chunks/751.js +1 -0
- package/.next/server/chunks/877.js +1 -0
- package/.next/server/chunks/894.js +2 -0
- package/.next/server/functions-config-manifest.json +4 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/404.html +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages-manifest.json +4 -0
- package/.next/server/prefetch-hints.json +123 -0
- package/.next/server/preview-props.json +5 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/NE6PGEiJxUnKRceuzUWPc/_buildManifest.js +1 -0
- package/.next/static/NE6PGEiJxUnKRceuzUWPc/_ssgManifest.js +1 -0
- package/.next/static/chunks/103-c47318242b24e9ac.js +1 -0
- package/.next/static/chunks/157-0d36ebf66af048ac.js +1 -0
- package/.next/static/chunks/227-417939c480f50747.js +1 -0
- package/.next/static/chunks/408-dc6158e0bb450ef6.js +1 -0
- package/.next/static/chunks/4bd1b696-c7408084347438ae.js +1 -0
- package/.next/static/chunks/794-ceeb732a1a81bc27.js +52 -0
- package/.next/static/chunks/939-2600d7c8e583d5ef.js +1 -0
- package/.next/static/chunks/app/_global-error/page-aba28f88d5781771.js +1 -0
- package/.next/static/chunks/app/_not-found/page-a2a510233e4836e2.js +1 -0
- package/.next/static/chunks/app/administration/page-4b16b19bb6a39c36.js +1 -0
- package/.next/static/chunks/app/alerts/page-fe0e877778c60af8.js +1 -0
- package/.next/static/chunks/app/connections/page-99cd54d6929b3f1f.js +1 -0
- package/.next/static/chunks/app/history/page-1475454737279ee0.js +3 -0
- package/.next/static/chunks/app/layout-4feff677c4071745.js +1 -0
- package/.next/static/chunks/app/login/page-c57e12dbe5146737.js +1 -0
- package/.next/static/chunks/app/machines/[machineId]/page-916ee73de5eb067d.js +1 -0
- package/.next/static/chunks/app/page-1ae9fc94c897785b.js +1 -0
- package/.next/static/chunks/app/processes/page-e471ed23a1d5632f.js +3 -0
- package/.next/static/chunks/framework-ea4f97ca039bd777.js +1 -0
- package/.next/static/chunks/main-a458d32948147b84.js +5 -0
- package/.next/static/chunks/main-app-f92328c8950d2e53.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-aba28f88d5781771.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-aba28f88d5781771.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-43cbaa3aa1576eb4.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-aba28f88d5781771.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-aba28f88d5781771.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-9ca43f4ce1bb8938.js +1 -0
- package/.next/static/css/e45c0c7ef5ba0336.css +1 -0
- package/ARCHITECTURE.md +279 -0
- package/CHANGELOG.md +37 -0
- package/DESIGN.md +299 -0
- package/LICENSE +21 -0
- package/README.md +74 -2
- package/SECURITY.md +12 -0
- package/THIRD_PARTY_NOTICES.md +8847 -0
- package/bin/rigscope.cjs +6 -0
- package/dist/cli.cjs +9075 -0
- package/dist/collector.cjs +5679 -0
- package/dist/hub.cjs +8364 -0
- package/dist/ops.cjs +4976 -0
- package/dist/system.cjs +4333 -0
- package/docs/bottlenecks.md +62 -0
- package/docs/configuration.md +85 -0
- package/docs/development.md +46 -0
- package/docs/exports.md +39 -0
- package/docs/installation.md +306 -0
- package/docs/monitoring.md +112 -0
- package/docs/operations.md +550 -0
- package/docs/releasing.md +154 -0
- package/docs/scale-acceptance.json +412 -0
- package/docs/scale-validation.json +1898 -0
- package/docs/scale-validation.md +294 -0
- package/docs/stress-2026-11-04/180301-probe-m100-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180335-probe-m200-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180409-probe-m400-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180443-probe-m800-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180518-probe-m600-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180553-probe-m500-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180628-probe-m550-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180716-probe-m800-u1-s0-20000ms.json +415 -0
- package/docs/stress-2026-11-04/180751-probe-m1600-u1-s0-20000ms.json +415 -0
- package/docs/stress-2026-11-04/180828-probe-m3200-u1-s0-20000ms.json +416 -0
- package/docs/stress-2026-11-04/180941-probe-m2400-u1-s0-20000ms.json +416 -0
- package/docs/stress-2026-11-04/181031-probe-m2000-u1-s0-20000ms.json +416 -0
- package/docs/stress-2026-11-04/181114-probe-m1800-u1-s0-20000ms.json +416 -0
- package/docs/stress-2026-11-04/181203-probe-m100-u64-s64-20000ms.json +418 -0
- package/docs/stress-2026-11-04/181304-probe-m200-u64-s64-20000ms.json +418 -0
- package/docs/stress-2026-11-04/181405-probe-m400-u64-s64-20000ms.json +418 -0
- package/docs/stress-2026-11-04/181507-probe-m500-u64-s64-20000ms.json +418 -0
- package/docs/stress-2026-11-04/181609-probe-m450-u64-s64-20000ms.json +418 -0
- package/docs/stress-2026-11-04/181845-probe-m2-u2-s2-3000ms.json +419 -0
- package/docs/stress-2026-11-04/181931-probe-m500-u64-s64-30000ms.json +420 -0
- package/docs/stress-2026-11-04/182108-probe-m1800-u1-s0-120000ms.json +418 -0
- package/docs/stress-2026-11-04/182354-probe-m1200-u1-s0-120000ms.json +418 -0
- package/docs/stress-2026-11-04/182625-probe-m900-u1-s0-120000ms.json +418 -0
- package/docs/stress-2026-11-04/182847-probe-m1050-u1-s0-120000ms.json +418 -0
- package/docs/stress-2026-11-04/183112-probe-m1125-u1-s0-120000ms.json +418 -0
- package/docs/stress-2026-11-04/193608-probe-m500-u64-s64-120000ms.json +420 -0
- package/docs/stress-2026-11-04/193909-probe-m529-u1-s1-15000ms.json +420 -0
- package/docs/stress-2026-11-04/193940-probe-m530-u1-s1-15000ms.json +420 -0
- package/docs/stress-2026-11-04/194011-probe-m100-u1-s65-10000ms.json +421 -0
- package/docs/stress-2026-11-04/README.md +205 -0
- package/docs/stress-2026-11-04/index.jsonl +29 -0
- package/docs/stress-2026-11-04/manifest.json +13 -0
- package/docs/stress-2026-11-04/results.html +22 -0
- package/docs/system-installation.md +195 -0
- package/next.config.js +38 -0
- package/package.json +117 -4
- package/packaging/README.md +5 -0
- package/packaging/collector.env.example +24 -0
- package/packaging/hub.env.example +31 -0
- package/packaging/system/90-rigscope-rapl.rules +7 -0
- package/packaging/system/README.md +5 -0
- package/packaging/system/rigscope-collector.service.example +53 -0
- package/packaging/system/rigscope-hub.service.example +50 -0
- package/packaging/system/rigscope-rapl.sysusers +5 -0
- package/packaging/system/rigscope.sysusers +7 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Bottleneck telemetry
|
|
2
|
+
|
|
3
|
+
Overview shows available bottleneck readings alongside existing resource panels.
|
|
4
|
+
History records the same readings and offers separate charts for units such as
|
|
5
|
+
temperature, watts and milliseconds. Select **CPU cores** in History to compare cores; the selection is saved per machine and applies to exports. Up to eight series use lines; larger selections use a scrollable heatmap. Drawing groups
|
|
6
|
+
points toward a 150-point target per core while preserving extrema and gaps;
|
|
7
|
+
downloads retain the loaded stored buckets rather than the drawing reduction.
|
|
8
|
+
|
|
9
|
+
Readings are optional. An older collector, missing kernel interface, unreadable
|
|
10
|
+
file or reset counter produces an unavailable reading rather than zero. GPU
|
|
11
|
+
power and CPU package power are separate measurements; neither is whole-machine
|
|
12
|
+
wall power.
|
|
13
|
+
|
|
14
|
+
| Reading | Source and meaning |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| CPU temperature | Readable CPU hwmon sensors; package/Tctl/Tdie sensors take precedence over core sensors. Reports the hottest reading in the preferred class. |
|
|
17
|
+
| CPU package power | Change in top-level RAPL package energy over monotonic elapsed time, summed across readable packages. Package subdomains are excluded. Requires two valid observations. |
|
|
18
|
+
| CPU I/O wait | Change in procfs CPU iowait ticks, normalized by elapsed time and logical core count. |
|
|
19
|
+
| CPU pressure | Linux PSI `some avg10`: percentage of time with tasks stalled for CPU over the recent ten-second window. |
|
|
20
|
+
| Memory / I/O pressure | PSI `some avg10` and `full avg10`; `full` measures simultaneous stalls of all non-idle tasks. |
|
|
21
|
+
| Disk read / write latency | Change in diskstats operation milliseconds divided by completed operations. No completed operations means unavailable latency. |
|
|
22
|
+
| Disk utilization | Change in diskstats I/O-active milliseconds divided by elapsed time, capped at 100%. This is not a throughput-capacity estimate for parallel devices. |
|
|
23
|
+
| Filesystem inode use | Used inode count divided by a positive total from `statfs`. Filesystems without usable inode totals remain unavailable. |
|
|
24
|
+
| Memory / filesystem use | Used bytes divided by a positive total, on the 0–100 percent scale. |
|
|
25
|
+
|
|
26
|
+
CPU temperature supports known CPU hwmon drivers, including `coretemp` and
|
|
27
|
+
`k10temp`. CPU package power uses the Linux powercap `intel-rapl:N` interface,
|
|
28
|
+
including compatible AMD implementations. Many systems restrict `energy_uj` to
|
|
29
|
+
root. The collector remains unprivileged. The optional
|
|
30
|
+
[system installer](system-installation.md#cpu-package-power) grants its dedicated account persistent
|
|
31
|
+
read-only package-counter access; ordinary user installation leaves permissions
|
|
32
|
+
under the operator's control.
|
|
33
|
+
|
|
34
|
+
Counter resets invalidate the affected derived reading until a valid interval is
|
|
35
|
+
available. RAPL wrap handling requires a readable energy range and a previous
|
|
36
|
+
counter near its ceiling. Monitoring continues when an optional sensor fails.
|
|
37
|
+
|
|
38
|
+
The new fields belong to the existing CPU, memory and disks sharing families.
|
|
39
|
+
Withholding a family withholds its bottleneck fields for that destination too.
|
|
40
|
+
|
|
41
|
+
Enhanced fields are negotiated independently for each hub. Upgraded collectors
|
|
42
|
+
advertise wire revision `0.3.0`; upgraded hubs opt in with `bottleneck-v1` in their
|
|
43
|
+
welcome. Older hubs receive the original metric shape, including replay. Older
|
|
44
|
+
collectors receive the original welcome shape. Upgrade the hub and collector to
|
|
45
|
+
see enhanced readings; an independent older destination continues receiving its
|
|
46
|
+
existing metrics. Projection affects transmission, not the durable outbox record.
|
|
47
|
+
|
|
48
|
+
Kernel references: [PSI](https://docs.kernel.org/accounting/psi.html),
|
|
49
|
+
[powercap](https://docs.kernel.org/power/powercap/powercap.html), and
|
|
50
|
+
[disk statistics](https://docs.kernel.org/admin-guide/iostats.html).
|
|
51
|
+
|
|
52
|
+
## Warning presets
|
|
53
|
+
|
|
54
|
+
In Alerts, choose a preset while creating a rule. The preset fills editable
|
|
55
|
+
fields; **Create rule** is still required. Presets include high CPU, memory or
|
|
56
|
+
disk nearly full, inode use, hot CPU/GPU, offline collectors, pressure stalls,
|
|
57
|
+
I/O wait and disk latency/utilization. Resource presets use the selected machine's
|
|
58
|
+
inventory, preferring its root filesystem when available.
|
|
59
|
+
|
|
60
|
+
Percentage thresholds use 0–100. Preset thresholds and durations are starting
|
|
61
|
+
points to review for the workload and hardware, not manufacturer safety limits.
|
|
62
|
+
Unavailable readings/resources are identified before applying a preset.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Configuration reference
|
|
2
|
+
|
|
3
|
+
For an installation made with `rigscope install`, use `rigscope config` to find
|
|
4
|
+
its private settings. See [Hub configuration](installation.md#hub-configuration)
|
|
5
|
+
and [Remote access](installation.md#access-from-another-computer) for managed setup.
|
|
6
|
+
|
|
7
|
+
The environment variables below apply to source development and services that
|
|
8
|
+
run the hub or collector directly. Setting them in your shell does not change
|
|
9
|
+
an installed background service. Keep private directories at mode `0700` and
|
|
10
|
+
configuration files at `0600`; do not commit them.
|
|
11
|
+
|
|
12
|
+
## Hub variables
|
|
13
|
+
|
|
14
|
+
| Variable | Purpose and default |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| `HUB_HOST`, `HUB_PORT` | Local listener: `127.0.0.1:8081`. Only literal loopback addresses are accepted. Port `0` selects an unused port for tests. |
|
|
17
|
+
| `HUB_PUBLIC_ORIGIN`, `HUB_SOCKET_PATH` | Remote access: set both the exact HTTPS origin and an absolute Unix socket path in a private directory. The hub then has no TCP listener. |
|
|
18
|
+
| `HUB_DATABASE_PATH` | SQLite database for telemetry, users, alerts and the collector registry. Defaults beside `HUB_STATE_FILE`, or under `$XDG_STATE_HOME/rigscope/hub/` (falling back to `~/.local/state`). |
|
|
19
|
+
| `HUB_BROWSER_USERS` | First-run users as JSON: `{username,passwordHash,machineIds,admin?}`. `machineIds` is `"*"` or a list; `[]` allows no machines. |
|
|
20
|
+
| `HUB_ADMIN_USERS` | Comma-separated usernames to make administrators during first import. If omitted, an existing bootstrap account named `owner` becomes an administrator. Other users need an explicit `admin:true`. |
|
|
21
|
+
| `HUB_COLLECTORS` | First-run collector credentials as JSON: `{collectorId,machineId,token}`. The limit applies to JSON bytes, not a fixed machine count. |
|
|
22
|
+
| `HUB_MAX_COLLECTOR_CONNECTIONS` | Maximum concurrent collector connections. Positive integer; defaults to `100`. Choose a value based on measured capacity. |
|
|
23
|
+
| `HUB_STATE_FILE` | Private enrollment file to import from an existing installation; also enables enrollment. Keep it with the deployment configuration for recovery. |
|
|
24
|
+
| `HUB_ENROLLMENT_GRANTS` | Initial grants as JSON: `{token,expiresAt}`. Expiry must be within 15 minutes. Used grants stay consumed after import and restart. |
|
|
25
|
+
|
|
26
|
+
### First-run users and credentials
|
|
27
|
+
|
|
28
|
+
The database imports bootstrap users and collector credentials once. Later
|
|
29
|
+
restarts do not overwrite managed users or restore revoked credentials. Use
|
|
30
|
+
**Administration** to change users after the first start.
|
|
31
|
+
|
|
32
|
+
The managed installer creates the initial account for you. From a source
|
|
33
|
+
checkout, use `scripts/hash-browser-password.cjs` to generate salted scrypt
|
|
34
|
+
hashes; it reads passwords from stdin. Keep hashes private.
|
|
35
|
+
|
|
36
|
+
## Collector variables
|
|
37
|
+
|
|
38
|
+
| Variable | Purpose and default |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| `COLLECTOR_MODE` | `real` by default. `mock` generates synthetic readings and never scans real processes. |
|
|
41
|
+
| `COLLECTOR_STATE_FILE` | Private saved identity, destinations and enrollment recovery proof. Defaults to `$XDG_STATE_HOME/rigscope/collector.json` (falling back to `~/.local/state`). |
|
|
42
|
+
| `COLLECTOR_INTERVAL_MS` | Sampling interval: `1000` ms by default, minimum `100` ms. GPU polling runs at most once per second. |
|
|
43
|
+
| `COLLECTOR_HUBS` | Explicit destinations as JSON: `{url,token,sharing?,intervalMs?}`, up to eight. Otherwise the collector uses saved enrollment. |
|
|
44
|
+
| `COLLECTOR_HOSTNAME` | Display metadata; defaults to the OS hostname in real mode. |
|
|
45
|
+
|
|
46
|
+
### Sharing settings
|
|
47
|
+
|
|
48
|
+
Each destination's `sharing` object accepts `cpu`, `memory`, `swap`, `gpus`,
|
|
49
|
+
`disks`, `network`, `networkAddresses`, `processes` and `processArguments`.
|
|
50
|
+
When supplying an object, CPU and memory must remain enabled.
|
|
51
|
+
|
|
52
|
+
Omitted fields default to true, except `swap` follows `memory` and
|
|
53
|
+
`processArguments` defaults to false. Managed enrollment starts with network
|
|
54
|
+
addresses and full process arguments disabled. Review a destination's saved
|
|
55
|
+
policy before expanding what it shares. Environment variables are never collected.
|
|
56
|
+
|
|
57
|
+
The collector applies sharing rules before queueing samples, again before
|
|
58
|
+
sending restored samples, and to each hub's process results. Restricting a policy
|
|
59
|
+
also restricts pending records.
|
|
60
|
+
|
|
61
|
+
## Source enrollment, rotation and replacement
|
|
62
|
+
|
|
63
|
+
For a managed installation, follow [Add machines and hubs](installation.md#add-machines-and-hubs)
|
|
64
|
+
using `rigscope connect`. The steps here require a source checkout with
|
|
65
|
+
development dependencies installed.
|
|
66
|
+
|
|
67
|
+
1. Create a short-lived grant through the hub's administration interface.
|
|
68
|
+
2. Set `COLLECTOR_ENROLL_URL` to the full `ws[s]://…/api/collector/connect` URL.
|
|
69
|
+
Set `COLLECTOR_ENROLL_TOKEN` privately to the grant.
|
|
70
|
+
3. Run:
|
|
71
|
+
|
|
72
|
+
```sh
|
|
73
|
+
npm run collector:enroll
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
4. Remove the grant from the environment and restart the collector.
|
|
77
|
+
|
|
78
|
+
The collector saves a random recovery proof before enrolling. If a successful
|
|
79
|
+
response is lost, retrying with that proof recovers the same credential. A
|
|
80
|
+
hostname or collector ID alone cannot recover it.
|
|
81
|
+
|
|
82
|
+
Rotation or replacement needs a grant bound to the existing machine on that
|
|
83
|
+
hub. Use `npm run collector:enroll -- --replace-enrollment` to replace a saved
|
|
84
|
+
destination. Revocation closes existing connections and invalidates old recovery
|
|
85
|
+
proofs. Replacement never identifies a machine by its hostname or address.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Development
|
|
2
|
+
|
|
3
|
+
Use Node.js 26+ and Linux for real collection. Keep private configuration outside Git, with directories 0700 and files 0600. Public fixture credentials are only for isolated tests.
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
npm ci
|
|
7
|
+
npm run dev
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Development uses `.next-dev`; production uses `.next`. Configure users and collector credentials privately before starting a hub. With no browser users it fails closed. Do not run two hubs against the same database or build output.
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
npm run build
|
|
14
|
+
npm start
|
|
15
|
+
# After enrollment, in a separate terminal or service:
|
|
16
|
+
npm run collector:start
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`npm run collector:enroll` uses `COLLECTOR_ENROLL_URL` and a private `COLLECTOR_ENROLL_TOKEN`. `npm run collector:mock` emits synthetic readings. Real collection continues without a browser. See the [configuration reference](configuration.md) for variables, enrollment and sharing settings.
|
|
20
|
+
|
|
21
|
+
## HTTPS boundary
|
|
22
|
+
|
|
23
|
+
Local HTTP is literal loopback only. Remote access requires `HUB_PUBLIC_ORIGIN` and `HUB_SOCKET_PATH` together: an exact HTTPS origin and an absolute Unix socket inside a private directory. The TLS reverse proxy must support WebSocket upgrades, unbuffered SSE, the configured Host and long-lived connections. The remote-mode hub has no TCP listener. The CLI does not configure DNS, certificates, Tailscale or a proxy.
|
|
24
|
+
|
|
25
|
+
Cookies are Secure and HttpOnly remotely; same-origin validation and machine scope apply to queries, streams and mutations. A hub restart invalidates in-memory sessions. Development HMR upgrades must reach Next.js while collector upgrades reach `/api/collector/connect`. Browser sign-in during development reconnects to the authenticated socket.
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
curl --fail --silent --unix-socket /path/private/hub.sock \
|
|
29
|
+
-H 'Host: monitor.example.invalid' http://localhost/api/health
|
|
30
|
+
npm run validate:https
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The validation command checks an already configured endpoint. Supply its `RIGSCOPE_VALIDATE_*` settings privately; inspect `scripts/validate-https.cjs` for the exact inputs. It does not deploy or change credentials. Health checks and anonymous rejection alone do not prove an authenticated owner stream advances or reconnects.
|
|
34
|
+
|
|
35
|
+
## Targeted verification
|
|
36
|
+
|
|
37
|
+
| Command | Scope / default workers |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| `npm test` | Source tests; 4 concurrent files, `RIGSCOPE_TEST_CONCURRENCY` |
|
|
40
|
+
| `npm run test:runtime` | Packaged runtime topology/auth/durability; 4 concurrent files, `RIGSCOPE_RUNTIME_TEST_CONCURRENCY` |
|
|
41
|
+
| `npm run test:dev` | Development/HMR integration; 1 file at a time, `RIGSCOPE_DEV_TEST_CONCURRENCY` |
|
|
42
|
+
| `npm run build:ui` | Production UI and TypeScript; `RIGSCOPE_BUILD_WORKERS`, default `min(4, available CPUs)` |
|
|
43
|
+
| `npm run build:runtime` | Hub, collector, CLI and operations bundles |
|
|
44
|
+
| `npm run typecheck` | Repository TypeScript check |
|
|
45
|
+
|
|
46
|
+
Run the narrow checks relevant to the change. Build the UI once before runtime integration tests that require it; avoid duplicate unchanged builds. Tests use isolated state and never authorize touching host services or private installed data. `RIGSCOPE_REAL_HW=1 npx tsx --test tests/sampling-real.test.ts` explicitly opts into host collection. See [releasing](releasing.md) for package validation and evidence boundaries.
|
package/docs/exports.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Export monitoring data
|
|
2
|
+
|
|
3
|
+
History and Processes provide CSV and JSON download controls. Exports use the data
|
|
4
|
+
already loaded in the browser; downloading does not request more history or trigger
|
|
5
|
+
a process scan. Access remains scoped to the signed-in user's machines.
|
|
6
|
+
|
|
7
|
+
## History
|
|
8
|
+
|
|
9
|
+
Exports include the selected metrics and visible series. Hidden GPU cards and
|
|
10
|
+
legend series are excluded. The document records the machine, time range, units,
|
|
11
|
+
load time, resolution and partial-result status. Rolled-up buckets retain their
|
|
12
|
+
minimum, maximum and average; these are not individual raw samples.
|
|
13
|
+
|
|
14
|
+
Unavailable numeric values remain empty in CSV and null in JSON. Recorded gaps
|
|
15
|
+
include their interval and available reason/drop count. Selected metrics without
|
|
16
|
+
stored data are identified separately. The JSON summary's
|
|
17
|
+
`averageOfBucketAverages` is an average of the loaded buckets, not a weighted
|
|
18
|
+
average of all underlying raw samples.
|
|
19
|
+
|
|
20
|
+
The CSV begins with metadata rows, followed by a `record_type` table containing
|
|
21
|
+
`bucket` and `gap` records. JSON includes equivalent structured metadata and series.
|
|
22
|
+
|
|
23
|
+
## Processes
|
|
24
|
+
|
|
25
|
+
Exports follow the current search, sort and view. Application view includes each
|
|
26
|
+
matching group's processes; tree view retains depth. Snapshot capture time,
|
|
27
|
+
receipt time, freshness, unreadable-process count and collector truncation are
|
|
28
|
+
included. A paused or stale snapshot is labeled accordingly.
|
|
29
|
+
|
|
30
|
+
The exported fields are process name, PID, user, application/group, tree depth,
|
|
31
|
+
CPU percentage, resident memory, GPU memory, read/write rates and thread count.
|
|
32
|
+
Command arguments and environment data are not exported. CSV begins with snapshot
|
|
33
|
+
metadata, followed by the process table; JSON preserves the same scope explicitly.
|
|
34
|
+
|
|
35
|
+
## Files
|
|
36
|
+
|
|
37
|
+
Downloads use a machine slug and UTC timestamp. Text cells that could be treated
|
|
38
|
+
as spreadsheet formulas receive an apostrophe prefix in CSV. Numeric measurements
|
|
39
|
+
remain numeric. JSON preserves original text without spreadsheet-specific changes.
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
# Installation
|
|
2
|
+
|
|
3
|
+
Start with [npm installation](#install-from-npm). For a shared dashboard, see
|
|
4
|
+
[remote access](#access-from-another-computer) and [adding machines](#add-machines-and-hubs).
|
|
5
|
+
[Upgrades](#upgrades) and [troubleshooting](#troubleshooting) cover existing installs.
|
|
6
|
+
|
|
7
|
+
## Install from npm
|
|
8
|
+
|
|
9
|
+
Requires Linux, Node.js 26+ with npm, and a working systemd user manager. Install
|
|
10
|
+
Node.js first; Rigscope uses that Node executable for its background services.
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
npx --yes rigscope@latest install --boot
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Save the generated `owner` password and open the printed URL, normally
|
|
17
|
+
`http://127.0.0.1:8081`. The password is shown only when the account is first
|
|
18
|
+
created. An existing installation keeps its account and password.
|
|
19
|
+
|
|
20
|
+
The installer starts a hub and a collector in the background. Closing the
|
|
21
|
+
terminal does not stop them. `--boot` enables startup at boot, including before
|
|
22
|
+
login. If the host requires authorization, the installer prints the recovery
|
|
23
|
+
command. Omit `--boot` to start at login instead.
|
|
24
|
+
|
|
25
|
+
Add `~/.local/bin` to PATH, or run `~/.local/bin/rigscope` directly. No global npm
|
|
26
|
+
install or source checkout is needed. The launcher and services use the installed
|
|
27
|
+
runtime, so removing the npx cache does not break them.
|
|
28
|
+
|
|
29
|
+
Releases are on [npm](https://www.npmjs.com/package/rigscope). `@latest` selects
|
|
30
|
+
the current stable release; replace it with `@0.1.0` to select that exact version.
|
|
31
|
+
|
|
32
|
+
### Installation options
|
|
33
|
+
|
|
34
|
+
Append these options to `npx --yes rigscope@latest install`:
|
|
35
|
+
|
|
36
|
+
| Goal | Options |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| Monitor this computer | `--boot` |
|
|
39
|
+
| Send readings to another hub | `--role collector --boot` |
|
|
40
|
+
| Host a dashboard over HTTPS and monitor this computer | `--origin https://hub.example.com --boot` |
|
|
41
|
+
| Host a dashboard without collecting local readings | `--role hub --origin https://hub.example.com --boot` |
|
|
42
|
+
| Use another local port | `--port 8086 --boot` |
|
|
43
|
+
| Leave a new installation stopped | `--no-start` |
|
|
44
|
+
| Disable startup at login | `--no-enable` |
|
|
45
|
+
|
|
46
|
+
Repeating `install` repairs the services, launcher and startup settings. It keeps
|
|
47
|
+
the existing runtime and credentials; use `rigscope upgrade` to update the code.
|
|
48
|
+
`--no-start` does not stop a service that is already running.
|
|
49
|
+
|
|
50
|
+
### Install from an archive
|
|
51
|
+
|
|
52
|
+
For a downloaded package or one built from source, run from the directory
|
|
53
|
+
containing the archive, or give its absolute path:
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
npx --yes --package ./rigscope-0.1.0.tgz rigscope install --boot
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The same installation options apply. npm still needs registry access or cached
|
|
60
|
+
production dependencies; the archive alone is not a complete offline installer.
|
|
61
|
+
|
|
62
|
+
## Everyday commands and installation selection
|
|
63
|
+
|
|
64
|
+
Run only the command for the task you want:
|
|
65
|
+
|
|
66
|
+
| Task | Command |
|
|
67
|
+
| --- | --- |
|
|
68
|
+
| Check services, versions and the dashboard URL | `rigscope status` (or just `rigscope`) |
|
|
69
|
+
| Start or stop | `rigscope start` / `rigscope stop` |
|
|
70
|
+
| Restart the hub | `rigscope restart hub` |
|
|
71
|
+
| Stop local collection | `rigscope stop collector` |
|
|
72
|
+
| Follow logs | `rigscope logs --follow` |
|
|
73
|
+
| Check configuration, services and sensor access | `rigscope doctor` |
|
|
74
|
+
| Remove services and the managed runtime | `rigscope uninstall` |
|
|
75
|
+
|
|
76
|
+
`start` is safe to repeat. `logs` shows the last 100 journal lines by default.
|
|
77
|
+
`enable` and `disable` control the hub and collector independently; the initial
|
|
78
|
+
role is a preset. Use `rigscope enable collector` to add local collection to a
|
|
79
|
+
hub-only installation.
|
|
80
|
+
|
|
81
|
+
`uninstall` keeps accounts, history, identity, pending samples and backups.
|
|
82
|
+
Reinstalling reuses that data, including the existing password.
|
|
83
|
+
|
|
84
|
+
## Access from another computer
|
|
85
|
+
|
|
86
|
+
Run the commands on the hub machine. The examples use Tailscale already signed
|
|
87
|
+
in, with HTTPS enabled. Replace `machine.example.ts.net` with the hub's Tailscale
|
|
88
|
+
DNS name. Choose the section for a new or existing installation.
|
|
89
|
+
|
|
90
|
+
### New HTTPS installation
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
npx --yes rigscope@latest install \
|
|
94
|
+
--origin https://machine.example.ts.net:8081 --boot
|
|
95
|
+
tailscale serve --bg --tls-terminated-tcp=8081 \
|
|
96
|
+
"unix:$HOME/.local/state/rigscope/run/hub.sock"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Convert a retained localhost installation
|
|
100
|
+
|
|
101
|
+
If you already installed for localhost, change access without reinstalling:
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
rigscope stop
|
|
105
|
+
rigscope configure --origin https://machine.example.ts.net:8081
|
|
106
|
+
tailscale serve --bg --tls-terminated-tcp=8081 \
|
|
107
|
+
"unix:$HOME/.local/state/rigscope/run/hub.sock"
|
|
108
|
+
rigscope start
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
This keeps accounts, history and collector credentials. It updates the local
|
|
112
|
+
collector's destination and moves its pending samples. Both services must be
|
|
113
|
+
stopped during conversion. See [Access changes](operations.md#access-changes)
|
|
114
|
+
for backup and queue checks.
|
|
115
|
+
|
|
116
|
+
### Open and check the dashboard
|
|
117
|
+
|
|
118
|
+
Open `https://machine.example.ts.net:8081/` from a device allowed to reach the
|
|
119
|
+
hub through Tailscale. Sign in with the existing account or the password printed
|
|
120
|
+
at first installation. The viewing device needs no Rigscope installation.
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
rigscope status
|
|
124
|
+
tailscale serve status
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The forwarding command changes only port 8081 and keeps other Serve routes.
|
|
128
|
+
Use the socket path printed by Rigscope if you chose another state directory.
|
|
129
|
+
`--bg` keeps the route active after the terminal closes and across reboots.
|
|
130
|
+
|
|
131
|
+
Use TLS-terminated TCP forwarding to preserve the request's Host header,
|
|
132
|
+
including its port. See the [Tailscale Serve reference](https://tailscale.com/docs/reference/tailscale-cli/serve).
|
|
133
|
+
Remote mode listens on a private Unix socket instead of a plaintext TCP port;
|
|
134
|
+
collectors connect through HTTPS with certificate validation.
|
|
135
|
+
|
|
136
|
+
### Return to localhost
|
|
137
|
+
|
|
138
|
+
```sh
|
|
139
|
+
rigscope stop
|
|
140
|
+
rigscope configure --local
|
|
141
|
+
tailscale serve --bg --tls-terminated-tcp=8081 off
|
|
142
|
+
rigscope start
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
If you already uninstalled, change retained settings through the package entry
|
|
146
|
+
point, then reinstall:
|
|
147
|
+
|
|
148
|
+
```sh
|
|
149
|
+
npx --yes rigscope@latest configure \
|
|
150
|
+
--origin https://machine.example.ts.net:8081
|
|
151
|
+
npx --yes rigscope@latest install --boot
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Add machines and hubs
|
|
155
|
+
|
|
156
|
+
1. On the hub, choose **Add machine**, then **New machine**. Create a connection
|
|
157
|
+
grant; it can be used once and expires within 15 minutes.
|
|
158
|
+
2. On the machine to monitor, run:
|
|
159
|
+
|
|
160
|
+
```sh
|
|
161
|
+
npx --yes rigscope@latest install --role collector --boot
|
|
162
|
+
~/.local/bin/rigscope connect https://hub.example.com
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
3. Paste the grant at the private prompt. The collector starts after enrollment.
|
|
166
|
+
Use `connect --no-start` to enroll without starting it.
|
|
167
|
+
|
|
168
|
+
Collectors connect outbound and need no incoming port or root access. Each can
|
|
169
|
+
send to up to eight hubs. Sharing is separate for each hub; network addresses
|
|
170
|
+
and full process arguments start disabled. See [Collection and sharing](monitoring.md#collection-and-sharing).
|
|
171
|
+
|
|
172
|
+
Stop a running collector before changing its destinations. To replace an
|
|
173
|
+
existing machine credential, create a grant bound to that machine and use
|
|
174
|
+
`connect --replace`. For unattended enrollment, use `--token-file` with an owned
|
|
175
|
+
private file and delete it afterward; do not put the grant on the command line.
|
|
176
|
+
|
|
177
|
+
## Explicit foreground trial
|
|
178
|
+
|
|
179
|
+
```sh
|
|
180
|
+
npx --yes rigscope@latest try
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Ctrl+C stops the trial. It uses separate data at `~/.local/state/rigscope-trial`
|
|
184
|
+
and port 8082. Trial accounts and history persist. Use `try --state-dir PATH
|
|
185
|
+
--port PORT` to choose another trial directory and port.
|
|
186
|
+
|
|
187
|
+
To run an existing installation in the terminal, stop its background service
|
|
188
|
+
first, then use `rigscope start --foreground`. This does not install services.
|
|
189
|
+
A managed runtime directory cannot be used for `try`.
|
|
190
|
+
|
|
191
|
+
## Hub configuration
|
|
192
|
+
|
|
193
|
+
`rigscope config` prints the private `config.json` path. The installed launcher
|
|
194
|
+
selects its own state directory. `--state-dir PATH` or `RIGSCOPE_STATE_DIR`
|
|
195
|
+
selects another installation, with separate data and service names.
|
|
196
|
+
|
|
197
|
+
Settings include component enablement, port, HTTPS origin and socket. Keep state
|
|
198
|
+
directories at mode `0700` and configuration files at `0600`. Restart after edits.
|
|
199
|
+
Use `configure` for access changes and **Administration** for users: editing
|
|
200
|
+
first-run password hashes does not change an account already stored in SQLite.
|
|
201
|
+
|
|
202
|
+
There is no fixed machine-count limit. The default connection limit is 100.
|
|
203
|
+
Set `maxCollectorConnections` in private `config.json` and restart to change it.
|
|
204
|
+
For direct hub/collector services, see the [environment reference](configuration.md).
|
|
205
|
+
For another HTTPS proxy, see the [proxy requirements](development.md#https-boundary).
|
|
206
|
+
|
|
207
|
+
## Upgrades
|
|
208
|
+
|
|
209
|
+
Use the installed command:
|
|
210
|
+
|
|
211
|
+
```sh
|
|
212
|
+
rigscope upgrade
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
It gets `rigscope@latest` from npm, backs up the hub database and replaces the
|
|
216
|
+
managed runtime. Accounts, history and collector settings are retained. Only
|
|
217
|
+
components that were running are restarted; startup settings stay the same.
|
|
218
|
+
|
|
219
|
+
| Alternative | Command |
|
|
220
|
+
| --- | --- |
|
|
221
|
+
| Select an exact published version | `rigscope upgrade --from rigscope@0.1.0` |
|
|
222
|
+
| Install a local archive | `rigscope upgrade --from ./rigscope-VERSION.tgz` |
|
|
223
|
+
| Return to the retained previous runtime | `rigscope rollback` |
|
|
224
|
+
|
|
225
|
+
A fresh installation has no previous runtime to roll back to. Updating a global
|
|
226
|
+
npm package does not update this runtime. Do not move runtime directories or run
|
|
227
|
+
old code against a newer database. See [Upgrade and rollback checks](operations.md#managed-cli-operations)
|
|
228
|
+
for health checks, failure recovery, database compatibility and backup selection.
|
|
229
|
+
Keep separate backups outside the machine.
|
|
230
|
+
|
|
231
|
+
## Troubleshooting
|
|
232
|
+
|
|
233
|
+
### No password was printed
|
|
234
|
+
|
|
235
|
+
The `owner` password appears only when the account is created. Reinstalling with
|
|
236
|
+
saved settings keeps the old password. If you lost it, stop the installation
|
|
237
|
+
and reset it at a private prompt:
|
|
238
|
+
|
|
239
|
+
```sh
|
|
240
|
+
rigscope stop
|
|
241
|
+
rigscope recover-password --user owner
|
|
242
|
+
rigscope start
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Recovery keeps history and collector credentials. Sign in again afterward.
|
|
246
|
+
It changes an existing account; it does not create a missing user or grant
|
|
247
|
+
administrator access. See [Password recovery](operations.md#password-recovery).
|
|
248
|
+
|
|
249
|
+
### An old command opens, or uninstall is unknown
|
|
250
|
+
|
|
251
|
+
If installation prints `Keeping existing command at …`, another launcher already
|
|
252
|
+
occupies that path. The installer leaves it intact and prints a usable `Command:`
|
|
253
|
+
path for the new CLI. Use that path, or invoke the published CLI directly:
|
|
254
|
+
|
|
255
|
+
```sh
|
|
256
|
+
npx --yes rigscope@latest status
|
|
257
|
+
npx --yes rigscope@latest uninstall
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Choose the operation you need; `uninstall` removes this installation and retains
|
|
261
|
+
its data. Use `ls -l ~/.local/bin/rigscope` to check for a link to an older
|
|
262
|
+
checkout. Back up a confirmed old launcher before removing it, then repeat
|
|
263
|
+
`install` to create the new launcher. Older services with other names may need
|
|
264
|
+
separate cleanup; do not stop unrelated services.
|
|
265
|
+
|
|
266
|
+
### The hub keeps restarting
|
|
267
|
+
|
|
268
|
+
Check `rigscope logs hub` and `rigscope doctor`. If port 8081 is already in use,
|
|
269
|
+
identify the listener before stopping anything. For a fresh install, choose an
|
|
270
|
+
unused port with `install --port 8086 --boot`, or use HTTPS mode with a private
|
|
271
|
+
socket. An existing installation refuses a different `--port` during reinstall;
|
|
272
|
+
reinstalling alone does not reset its settings.
|
|
273
|
+
|
|
274
|
+
## Hardware
|
|
275
|
+
|
|
276
|
+
Collection supports Linux. CPU, memory and process readings come from procfs.
|
|
277
|
+
ARM and RISC-V CPU names are recognized; utilization uses per-core counters.
|
|
278
|
+
|
|
279
|
+
| Hardware | Available readings | Limit |
|
|
280
|
+
| --- | --- | --- |
|
|
281
|
+
| NVIDIA | Utilization, dedicated memory, temperature, power; compute-process memory | Requires `nvidia-smi` |
|
|
282
|
+
| AMD discrete GPU | Busy percentage, dedicated VRAM, temperature, power | Requires readable amdgpu sysfs/hwmon counters |
|
|
283
|
+
| AMD integrated GPU | Busy percentage and available hardware sensors | Reports only driver-provided VRAM; does not estimate shared memory |
|
|
284
|
+
| Intel discrete or integrated GPU | Available hwmon temperature/power and optional driver counters | Partial support; most utilization readings remain unavailable |
|
|
285
|
+
| ASPEED/other display adapters | Inventory | No telemetry backend |
|
|
286
|
+
|
|
287
|
+
On AMD APUs the reported power counter can include CPU/SoC power; it is not a
|
|
288
|
+
GPU-exclusive power measurement.
|
|
289
|
+
|
|
290
|
+
Drivers, permissions and kernel versions determine which readings are available.
|
|
291
|
+
Missing readings never become zeros. Intel temperature or power support does not
|
|
292
|
+
imply utilization or per-process GPU memory support. Inventory refresh detects
|
|
293
|
+
hotplug changes. AMD/Intel adapters use PCI-based IDs; NVIDIA uses GPU UUIDs.
|
|
294
|
+
|
|
295
|
+
AMD uses the kernel's [amdgpu sysfs and hwmon interfaces](https://docs.kernel.org/gpu/amdgpu/thermal.html).
|
|
296
|
+
Physical checks cover an Ubuntu RTX 3090 rig and a laptop with an RTX 5060 and
|
|
297
|
+
Radeon 860M, including iGPU utilization, memory, temperature and power stored by
|
|
298
|
+
the hub. Intel sensors and ARM/RISC-V naming have fixture tests but still need
|
|
299
|
+
physical validation. macOS, Windows and Apple GPU collection are not supported.
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
## System installation
|
|
303
|
+
|
|
304
|
+
For dedicated service accounts, system units and CPU package-power permissions,
|
|
305
|
+
see [System installation](system-installation.md). The default npm installation
|
|
306
|
+
above runs as your own user.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Monitoring and alerts
|
|
2
|
+
|
|
3
|
+
This guide explains what Rigscope collects, how long it keeps data, and how
|
|
4
|
+
access and alerts work. For setup, see [Installation](installation.md).
|
|
5
|
+
|
|
6
|
+
## Collection and sharing
|
|
7
|
+
|
|
8
|
+
Each collector samples its machine once and sends readings independently to up
|
|
9
|
+
to eight hubs. Collection continues when no browser is open. Each hub owns its
|
|
10
|
+
users, permissions, history and alerts.
|
|
11
|
+
|
|
12
|
+
Managed enrollment shares CPU, memory, swap, GPU, disk and network readings,
|
|
13
|
+
plus on-demand process details. Network addresses and full process arguments
|
|
14
|
+
start disabled. Sharing is set separately for each hub; see the
|
|
15
|
+
[configuration reference](configuration.md#sharing-settings).
|
|
16
|
+
|
|
17
|
+
Missing or inaccessible readings stay unavailable. GPU support depends on the
|
|
18
|
+
driver and readable counters; see [Hardware](installation.md#hardware) and
|
|
19
|
+
[Sensor readings](bottlenecks.md).
|
|
20
|
+
|
|
21
|
+
## History and delivery
|
|
22
|
+
|
|
23
|
+
The hub acknowledges samples after committing them to SQLite. A collector keeps
|
|
24
|
+
unacknowledged samples in a persistent queue for each hub and retries after a
|
|
25
|
+
disconnect. The hub removes duplicates using the collector, run and sequence IDs.
|
|
26
|
+
Replayed samples fill History without replacing current live readings or opening
|
|
27
|
+
alerts for past threshold crossings.
|
|
28
|
+
|
|
29
|
+
Default retention:
|
|
30
|
+
|
|
31
|
+
| Resolution | Kept for |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| Raw samples | 48 hours |
|
|
34
|
+
| One-minute summaries | 30 days |
|
|
35
|
+
| One-hour summaries | 400 days |
|
|
36
|
+
|
|
37
|
+
Summaries retain minimum and maximum values. History queries limit the number
|
|
38
|
+
of points, series, scanned rows and time spent. The UI marks partial results.
|
|
39
|
+
|
|
40
|
+
Hover over a History or Overview recent-usage chart to inspect a recorded time
|
|
41
|
+
and its bucket averages. The time marker follows across charts in the same view;
|
|
42
|
+
per-core heatmaps show the bucket peak at that time. Missing readings stay
|
|
43
|
+
unavailable. With a chart focused, use Left/Right arrows to move between readings,
|
|
44
|
+
Home/End to jump to the first/last reading, and Escape to dismiss the marker.
|
|
45
|
+
|
|
46
|
+
### Storage limits
|
|
47
|
+
|
|
48
|
+
Each collector queue keeps up to ten minutes or 64 MiB of queued JSON per hub,
|
|
49
|
+
with a 256 MiB total JSON limit. Physical SQLite files, including WAL files,
|
|
50
|
+
have separate limits of 80 MiB per hub and 640 MiB across eight hubs.
|
|
51
|
+
|
|
52
|
+
The hub's default database limit is 2 GiB, including its WAL file and all tables.
|
|
53
|
+
Retention protects the newest hour of telemetry. If old-data cleanup cannot
|
|
54
|
+
free enough space, the hub stops acknowledging new samples and collectors retry.
|
|
55
|
+
Existing oversized databases report pressure; startup does not run a destructive
|
|
56
|
+
cleanup.
|
|
57
|
+
|
|
58
|
+
These are application limits, not filesystem quotas. A transaction can briefly
|
|
59
|
+
grow the WAL before checkpointing. Blocked checkpoints stop further ingestion
|
|
60
|
+
instead of allowing continued growth. Keep disk space for backups and sidecar
|
|
61
|
+
files. See [Storage pressure recovery](operations.md#storage-budgets-and-pressure-recovery).
|
|
62
|
+
|
|
63
|
+
## Live readings and process details
|
|
64
|
+
|
|
65
|
+
A receipt becomes stale after `max(15 seconds, 3 × expected delivery interval)`.
|
|
66
|
+
If the cadence is unknown, Rigscope uses 15 seconds and discloses that fallback.
|
|
67
|
+
Connection status, unavailable readings and clock skew are reported separately.
|
|
68
|
+
Rigscope does not synchronize the browser and hub clocks.
|
|
69
|
+
|
|
70
|
+
Process details are scanned while viewers request them. Viewers share one
|
|
71
|
+
collector scan. Pausing, hiding or closing the view releases the extra work;
|
|
72
|
+
expired viewer requests and ended sessions do the same. Process details are
|
|
73
|
+
never persisted.
|
|
74
|
+
|
|
75
|
+
Process CPU uses 100% per logical core. Machine CPU is normalized across all
|
|
76
|
+
logical cores. See [Exports](exports.md) for CSV and JSON behavior.
|
|
77
|
+
|
|
78
|
+
## Users and administration
|
|
79
|
+
|
|
80
|
+
Use **Administration** to manage users, machine access, names, tags, collector
|
|
81
|
+
revocation and enrollment grants. Administration requires an administrator role
|
|
82
|
+
and the appropriate machine access. Access to all machines alone does not make
|
|
83
|
+
a user an administrator.
|
|
84
|
+
|
|
85
|
+
User changes revoke existing browser sessions. Collector credential changes
|
|
86
|
+
close connections that no longer have access. User records and collector
|
|
87
|
+
credentials persist in SQLite. Browser sessions stay in memory, expire after
|
|
88
|
+
12 hours and end when the hub restarts.
|
|
89
|
+
|
|
90
|
+
## Alerts and webhooks
|
|
91
|
+
|
|
92
|
+
Alerts support above/below thresholds, durations, unavailable readings, missing
|
|
93
|
+
receipts, maintenance and recovery. Value, unavailable and stale-receipt rules
|
|
94
|
+
apply to the machines tracked by that hub. Replayed samples do not open past
|
|
95
|
+
incidents.
|
|
96
|
+
|
|
97
|
+
In **Alerts**, configure one HTTPS webhook channel. Its URL, headers and HMAC
|
|
98
|
+
secret are write-only. Loopback HTTP is allowed for controlled test sinks.
|
|
99
|
+
Delivery may be repeated: receivers should deduplicate the `Idempotency-Key`.
|
|
100
|
+
Rigscope makes up to six attempts, with a five-second deadline per request and
|
|
101
|
+
bounded persistent queues.
|
|
102
|
+
|
|
103
|
+
## Scale and limits
|
|
104
|
+
|
|
105
|
+
There is no fixed machine-count limit. The default limit is 100 concurrent
|
|
106
|
+
collector connections. [Scale validation](scale-validation.md) records synthetic
|
|
107
|
+
workloads of up to 75 machines on one host; those results are not a capacity
|
|
108
|
+
guarantee.
|
|
109
|
+
|
|
110
|
+
Rigscope does not kill processes, change their priorities, control remote
|
|
111
|
+
services, federate hubs or provide a clustered hub. See the
|
|
112
|
+
[hardware notes](installation.md#hardware) for physical testing and sensor limits.
|