rigscope 0.1.0 → 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 -1
- package/.next/app-path-routes-manifest.json +3 -3
- package/.next/build-manifest.json +2 -2
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/administration/page_client-reference-manifest.js +1 -1
- package/.next/server/app/administration.html +1 -1
- package/.next/server/app/administration.rsc +2 -2
- package/.next/server/app/administration.segments/_full.segment.rsc +2 -2
- package/.next/server/app/administration.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/administration.segments/administration/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/alerts/page_client-reference-manifest.js +1 -1
- package/.next/server/app/alerts.html +1 -1
- package/.next/server/app/alerts.rsc +2 -2
- package/.next/server/app/alerts.segments/_full.segment.rsc +2 -2
- package/.next/server/app/alerts.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/alerts.segments/alerts/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/connections/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connections.html +1 -1
- package/.next/server/app/connections.rsc +2 -2
- package/.next/server/app/connections.segments/_full.segment.rsc +2 -2
- package/.next/server/app/connections.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connections.segments/connections/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/history/page.js +2 -2
- package/.next/server/app/history/page_client-reference-manifest.js +1 -1
- package/.next/server/app/history.html +1 -1
- package/.next/server/app/history.rsc +4 -4
- package/.next/server/app/history.segments/_full.segment.rsc +4 -4
- package/.next/server/app/history.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/history.segments/history/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +2 -2
- package/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/machines/[machineId]/page.js +1 -1
- package/.next/server/app/machines/[machineId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/processes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/processes.html +1 -1
- package/.next/server/app/processes.rsc +2 -2
- package/.next/server/app/processes.segments/_full.segment.rsc +2 -2
- package/.next/server/app/processes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/processes.segments/processes/__PAGE__.segment.rsc +2 -2
- package/.next/server/app-paths-manifest.json +3 -3
- package/.next/server/chunks/168.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/408-dc6158e0bb450ef6.js +1 -0
- package/.next/static/chunks/app/history/{page-3fa5846eca26b7f7.js → page-1475454737279ee0.js} +2 -2
- package/.next/static/chunks/app/machines/[machineId]/page-916ee73de5eb067d.js +1 -0
- package/.next/static/css/e45c0c7ef5ba0336.css +1 -0
- package/CHANGELOG.md +12 -0
- package/README.md +53 -136
- package/dist/collector.cjs +9 -1
- package/dist/hub.cjs +12 -3
- package/dist/ops.cjs +6 -2
- package/docs/bottlenecks.md +1 -1
- package/docs/configuration.md +85 -0
- package/docs/development.md +1 -1
- package/docs/installation.md +205 -376
- package/docs/monitoring.md +112 -0
- package/docs/operations.md +103 -68
- package/docs/releasing.md +16 -14
- package/docs/scale-validation.md +34 -3
- 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/package.json +9 -1
- package/packaging/system/README.md +1 -1
- package/.next/static/chunks/408-18819c6490a5f8d3.js +0 -1
- package/.next/static/chunks/app/machines/[machineId]/page-a5aa1d8676272f38.js +0 -1
- package/.next/static/css/e41ccbccc3afaae5.css +0 -1
- /package/.next/static/{DZKWF9ur7H5wI0c7RAhdq → NE6PGEiJxUnKRceuzUWPc}/_buildManifest.js +0 -0
- /package/.next/static/{DZKWF9ur7H5wI0c7RAhdq → NE6PGEiJxUnKRceuzUWPc}/_ssgManifest.js +0 -0
|
@@ -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.
|
package/docs/operations.md
CHANGED
|
@@ -1,80 +1,107 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Operations
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
For an npm installation, use the managed commands below. The
|
|
4
|
+
[manifest archive workflow](#low-level-manifest-archive-workflow) is for operators
|
|
5
|
+
building and deploying from source.
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
custom server from the installed release directory; the production UI must be
|
|
14
|
-
present in `.next`.
|
|
15
|
-
|
|
16
|
-
All paths below are examples. Choose a prefix and state directory owned by the
|
|
17
|
-
service user. Paths containing spaces are supported by the generated units.
|
|
7
|
+
| Task | Section |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| Check, upgrade or roll back an npm installation | [Managed CLI operations](#managed-cli-operations) |
|
|
10
|
+
| Reset a lost password | [Password recovery](#password-recovery) |
|
|
11
|
+
| Change localhost/HTTPS access | [Access changes](#access-changes) |
|
|
12
|
+
| Back up or restore a database | [Database commands](#database-commands) |
|
|
13
|
+
| Plan what to back up | [Consistent backup set](#consistent-backup-set) |
|
|
14
|
+
| Handle a full database or queue | [Storage pressure recovery](#storage-budgets-and-pressure-recovery) |
|
|
18
15
|
|
|
19
16
|
## Managed CLI operations
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
`~/.local/state/rigscope
|
|
18
|
+
These commands apply to an installation created by `rigscope install`. Its
|
|
19
|
+
state directory defaults to `~/.local/state/rigscope`.
|
|
20
|
+
|
|
21
|
+
### Check health
|
|
23
22
|
|
|
24
23
|
```sh
|
|
25
24
|
rigscope status
|
|
26
|
-
rigscope doctor
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
rigscope doctor
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`status` shows services and the dashboard URL. `doctor` checks configuration,
|
|
29
|
+
runtimes, database integrity, listeners, TLS destinations, disk space and sensor
|
|
30
|
+
access. It follows enabled components: a hub-only installation does not need a
|
|
31
|
+
collector. Checks are read-only and omit credentials. Use `doctor --json` for
|
|
32
|
+
structured output.
|
|
33
|
+
|
|
34
|
+
### Upgrade
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
rigscope upgrade
|
|
30
38
|
```
|
|
31
39
|
|
|
32
|
-
`
|
|
33
|
-
|
|
34
|
-
and
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
the
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
40
|
+
Use `--from PACKAGE` for an exact npm version or local archive. The command
|
|
41
|
+
stages the package, stops running components, takes a consistent hub database
|
|
42
|
+
backup and activates the new runtime. It restarts only the components that were
|
|
43
|
+
running, then checks:
|
|
44
|
+
|
|
45
|
+
- the installed and running versions match the new package;
|
|
46
|
+
- restarted services are active;
|
|
47
|
+
- hub health is OK and its database passes integrity/schema checks;
|
|
48
|
+
- a restarted collector produces a fresh sampling marker.
|
|
49
|
+
|
|
50
|
+
The health timeout is 25 seconds; change it with `--timeout SECONDS`. A failed
|
|
51
|
+
start, migration or health check restores the previous runtime. It also restores
|
|
52
|
+
the paired database backup if the old runtime cannot read the new schema,
|
|
53
|
+
preserving the replaced database first.
|
|
54
|
+
|
|
55
|
+
Credentials, collector identities and pending samples are retained.
|
|
56
|
+
`release-state.json` records which backup belongs to each runtime. Upgrading a
|
|
57
|
+
stopped installation leaves it stopped and reports live checks as skipped.
|
|
58
|
+
|
|
59
|
+
### Roll back
|
|
60
|
+
|
|
61
|
+
```sh
|
|
62
|
+
rigscope rollback
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Rollback uses `runtime-previous` and runs the same health checks. If that runtime
|
|
66
|
+
can read the current database, post-upgrade data stays intact. Otherwise it
|
|
67
|
+
restores the paired pre-upgrade backup and saves the replaced database.
|
|
68
|
+
|
|
69
|
+
A missing compatible backup stops rollback. Older installations without a
|
|
70
|
+
recorded backup can supply a compatible copy with `--backup PATH`. Never point
|
|
71
|
+
old code at a newer database schema.
|
|
72
|
+
|
|
73
|
+
## Password recovery
|
|
74
|
+
|
|
75
|
+
Stop the installation, enter a new password at the private prompt, then restart:
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
rigscope stop
|
|
79
|
+
rigscope recover-password --user owner
|
|
80
|
+
rigscope start
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Recovery requires the hub to be stopped and refuses a live or uncertain database
|
|
84
|
+
lock. For unattended recovery, use `--password-file` with an owned `0600` file.
|
|
85
|
+
It updates the existing user's stored hash. `--enable` also clears that user's
|
|
86
|
+
disabled flag; recovery never creates a user or grants administrator access.
|
|
87
|
+
|
|
88
|
+
The operation records an audit event and invalidates sessions. It keeps
|
|
89
|
+
configuration, history and collector credentials. Sign in again after restart;
|
|
90
|
+
editing bootstrap hashes in `config.json` or `HUB_BROWSER_USERS` does not reset a
|
|
91
|
+
managed account.
|
|
92
|
+
|
|
93
|
+
## Access changes
|
|
94
|
+
|
|
95
|
+
Follow the commands in [Remote access](installation.md#access-from-another-computer).
|
|
96
|
+
`configure` requires a stopped hub and, when changing its local collector's
|
|
97
|
+
destination, a stopped collector.
|
|
98
|
+
|
|
99
|
+
It validates the HTTPS origin and private socket, backs up the old settings, and
|
|
100
|
+
updates the matching local collector destination. It moves that destination's
|
|
101
|
+
whole queue directory, including SQLite WAL files. Credentials and other hubs
|
|
102
|
+
stay unchanged. An existing target queue stops the conversion to avoid merging
|
|
103
|
+
or discarding pending records. Accounts and the hub history database are retained.
|
|
104
|
+
Rollback targets must support the saved configuration and database schema.
|
|
78
105
|
|
|
79
106
|
## Low-level manifest archive workflow
|
|
80
107
|
|
|
@@ -84,6 +111,14 @@ used by `rigscope install` and `rigscope upgrade`. For ordinary installations,
|
|
|
84
111
|
follow [installation](installation.md) and the managed commands above. The npm
|
|
85
112
|
package excludes source helper scripts and does not require users to build it.
|
|
86
113
|
|
|
114
|
+
The built deployment runs `dist/hub.cjs` for the dashboard and collector
|
|
115
|
+
connections, and `dist/collector.cjs` for collection. `dist/ops.cjs` provides the
|
|
116
|
+
database and archive tools below. The hub serves the production Next.js output
|
|
117
|
+
from `.next`; it does not use `next start` or standalone output.
|
|
118
|
+
|
|
119
|
+
Choose a prefix and state directory owned by the service user. All paths below
|
|
120
|
+
are examples; generated units support paths containing spaces.
|
|
121
|
+
|
|
87
122
|
### Build and package
|
|
88
123
|
|
|
89
124
|
```sh
|
|
@@ -406,7 +441,7 @@ a hub back below the schema its database already uses; `rollback` enforces that
|
|
|
406
441
|
boundary, and collector rollback keeps its private state and outboxes. Process
|
|
407
442
|
detail remains request-scoped and is never persisted or included in the backup
|
|
408
443
|
set. Separate machines and hubs are upgraded independently. System installations
|
|
409
|
-
use the component controls
|
|
444
|
+
use the component controls in [System installation](system-installation.md#system-component-lifecycle).
|
|
410
445
|
|
|
411
446
|
On upgrade from the previous collector endpoint, saved `/api/collector/v1/connect`
|
|
412
447
|
URLs normalize to `/api/collector/connect` without changing identity, credentials,
|
package/docs/releasing.md
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
# Releasing Rigscope
|
|
2
2
|
|
|
3
|
-
The first public version
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
The first public version, `0.1.0`, is published on
|
|
4
|
+
[npm](https://www.npmjs.com/package/rigscope). Source and issues are on
|
|
5
|
+
[GitHub](https://github.com/Triet1402/rigscope). The package includes MIT licensing,
|
|
6
6
|
dependency notices, the security policy and [release notes](../CHANGELOG.md).
|
|
7
7
|
|
|
8
|
+
The commands below use `0.1.0` as an example. For a new release, substitute its
|
|
9
|
+
new version everywhere; do not attempt to republish `0.1.0`. Documentation edits
|
|
10
|
+
can be committed and pushed to GitHub independently. The published archive and
|
|
11
|
+
its bundled documentation stay unchanged; ship updated package documentation
|
|
12
|
+
with the next version. Keep each release tag on the revision used to build it.
|
|
13
|
+
|
|
8
14
|
## Recommended release order
|
|
9
15
|
|
|
10
|
-
1.
|
|
11
|
-
those changes. Keep the installation examples in the package ready for the
|
|
12
|
-
version being published.
|
|
16
|
+
1. Update the version, docs, release notes and repository metadata. Commit them.
|
|
13
17
|
2. Push the source to GitHub and run the manual CI workflow on that revision.
|
|
14
|
-
|
|
15
|
-
triggers. A local result is not a GitHub Actions result.
|
|
18
|
+
CI runs manually; pushes and pull requests do not trigger it.
|
|
16
19
|
3. Build one npm archive from the final revision. Retain it, its SHA-256 checksum
|
|
17
20
|
and verification results. Test and publish that archive without rebuilding it.
|
|
18
21
|
4. Run the publish dry run, check the npm account, and publish the verified archive.
|
|
@@ -111,9 +114,8 @@ npm publish ./out/release/rigscope-0.1.0.tgz --access public --tag latest \
|
|
|
111
114
|
--registry=https://registry.npmjs.org --dry-run
|
|
112
115
|
```
|
|
113
116
|
|
|
114
|
-
The dry run
|
|
115
|
-
|
|
116
|
-
metadata does not establish npm package ownership.
|
|
117
|
+
The dry run checks the package without publishing. It does not verify permission
|
|
118
|
+
to publish or complete two-factor authentication.
|
|
117
119
|
|
|
118
120
|
When releasing, this command actually publishes the verified archive publicly:
|
|
119
121
|
|
|
@@ -129,8 +131,8 @@ check. Uninstall that test installation afterward. Use the same isolation
|
|
|
129
131
|
settings for all test commands so the check does not select a real installation.
|
|
130
132
|
|
|
131
133
|
The public quick start uses `npx --yes rigscope@latest install --boot` and the
|
|
132
|
-
installed `rigscope upgrade`. Archive commands remain available
|
|
133
|
-
|
|
134
|
+
installed `rigscope upgrade`. Archive commands remain available for downloaded
|
|
135
|
+
releases and testing before publication. Users do not need a global npm
|
|
134
136
|
installation of Rigscope.
|
|
135
137
|
|
|
136
138
|
GitHub Actions trusted publishing can automate later releases. Configure it for
|
|
@@ -146,7 +148,7 @@ It is a separate format from the npm `.tgz`. The low-level installer validates
|
|
|
146
148
|
size/hash and required artifacts before activation. Production dependencies must
|
|
147
149
|
be installed in the staged release; activation never silently runs npm or service
|
|
148
150
|
commands. See [operations](operations.md#low-level-manifest-archive-workflow) and
|
|
149
|
-
[system installation](installation.md
|
|
151
|
+
[system installation](system-installation.md).
|
|
150
152
|
|
|
151
153
|
Configuration, database schema and wire-protocol revisions are internal
|
|
152
154
|
compatibility checks, independent of the application package version.
|
package/docs/scale-validation.md
CHANGED
|
@@ -9,6 +9,22 @@ concurrency listed for each case. They do not prove that a larger fleet,
|
|
|
9
9
|
different hardware, slower storage or a different browser workload will behave
|
|
10
10
|
the same way.
|
|
11
11
|
|
|
12
|
+
## Later capacity search
|
|
13
|
+
|
|
14
|
+
The [November 4 capacity stress test](stress-2026-11-04/README.md) extends these
|
|
15
|
+
measurements with an exponential/binary search and two-minute confirmations:
|
|
16
|
+
|
|
17
|
+
- 500 collectors plus 64 live browser sessions passed at one sample and one
|
|
18
|
+
History poll per second per participant.
|
|
19
|
+
- Ingestion without live viewers passed at 1,050 collectors; 1,125 exceeded the
|
|
20
|
+
experiment's 500 ms acknowledgment p95 target.
|
|
21
|
+
- Full-fleet streaming passed with 529 representative machines, but 530 exceeded
|
|
22
|
+
the live feed's 1 MiB buffer guard and disconnected the viewer.
|
|
23
|
+
|
|
24
|
+
That report, its measurement JSON and chart are included in the npm package.
|
|
25
|
+
These results describe a bounded synthetic workload, not long-term capacity.
|
|
26
|
+
The five-case suite below remains the earlier sustained measurement.
|
|
27
|
+
|
|
12
28
|
## What was missing
|
|
13
29
|
|
|
14
30
|
The earlier `ops measure` command was a bounded synthetic burst capped at 50
|
|
@@ -86,12 +102,13 @@ phase boundary.
|
|
|
86
102
|
|
|
87
103
|
### Bounds
|
|
88
104
|
|
|
89
|
-
- machines: 1–
|
|
105
|
+
- machines: 1–8,192 (the total-record bound below still applies),
|
|
90
106
|
- measured phase: up to 1 hour,
|
|
91
107
|
- sample cadence: at least 100 ms (the protocol rate limit),
|
|
92
108
|
- records per live batch: 1–32,
|
|
93
|
-
- viewers: 1–
|
|
94
|
-
- SSE
|
|
109
|
+
- viewers: 1–200 authenticated sessions,
|
|
110
|
+
- SSE attempts: 0–65; the hub still admits at most 64 (zero isolates ingestion,
|
|
111
|
+
and the 65th attempt measures admission rejection),
|
|
95
112
|
- replay: at most 128 records per reconnect,
|
|
96
113
|
- estimated live plus replay records: at most 500,000 per case,
|
|
97
114
|
- database: 512 MiB main+WAL by default (`--database-budget-mb 0` disables the
|
|
@@ -201,6 +218,10 @@ payloads, storage and viewer counts.
|
|
|
201
218
|
|
|
202
219
|
## Reproduction
|
|
203
220
|
|
|
221
|
+
For the later resource-guarded capacity search, including the distinction between
|
|
222
|
+
collector throughput and full-fleet stream limits, see
|
|
223
|
+
[the November 4 stress test](stress-2026-11-04/README.md).
|
|
224
|
+
|
|
204
225
|
```sh
|
|
205
226
|
# full five-case suite (about five minutes)
|
|
206
227
|
npx tsx scripts/scale-harness.ts --suite \
|
|
@@ -213,6 +234,11 @@ npx tsx scripts/scale-harness.ts --case fleet-75m \
|
|
|
213
234
|
|
|
214
235
|
# retain the throwaway database and configuration for inspection
|
|
215
236
|
npx tsx scripts/scale-harness.ts --case small-5m --keep
|
|
237
|
+
|
|
238
|
+
# Keep stream parsing independent of collector sample generation
|
|
239
|
+
npx tsx scripts/scale-harness.ts --case fleet-75m \
|
|
240
|
+
--machines 500 --viewers 64 --sse-clients 64 --sse-workers 4 \
|
|
241
|
+
--duration-ms 60000 --json-out /tmp/rigscope-scale-mixed.json
|
|
216
242
|
```
|
|
217
243
|
|
|
218
244
|
The short `tests/scale-harness.test.ts` smoke runs the same child with two
|
|
@@ -224,6 +250,11 @@ test; it proves the harness paths work in CI.
|
|
|
224
250
|
- The hub child and all load generators share one host. The hub event loop uses
|
|
225
251
|
one thread; the load processes can run on other cores. This is
|
|
226
252
|
not a distributed-load test and the generator competes with the hub.
|
|
253
|
+
`--sse-workers N` separates stream readers into up to eight processes. With
|
|
254
|
+
workers enabled, a one-second client warmup precedes the measured window;
|
|
255
|
+
without workers, collector generation and stream parsing share an event loop,
|
|
256
|
+
which can under-drive large mixed workloads. Report configuration records
|
|
257
|
+
the worker count and client warmup. The original five results used no workers.
|
|
227
258
|
- History queries are synchronous SQLite work on the hub event loop.
|
|
228
259
|
"Concurrent viewers" means overlapping authenticated HTTP requests, not
|
|
229
260
|
parallel SQLite readers.
|