Repository navigation
Group Piri's node-level alerts by instance - #270
Conversation
A node now runs one Piri per storage volume, each reporting instance <node>/piri-<n> (docs/decisions/2026-10-multiple-piri-per-appliance.md in infra-nodes; dev and staging run three). Three rules aggregated by node alone, so one healthy Piri hid another: - "Piri's chain head is stale" took the freshest head on the node. - "Piri is reporting but has no chain head" saw a head if any Piri had one. - "Piri's Prove task has not run in 1.5 proving periods" took the node's latest Prove run. Each now groups and matches by instance too. A Piri that still reports the node name as its instance gives one series per node, as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.
Review round 1 on #270: the comment named only the node-name fallback. A Piri reports its DID as instance until an image with fil-forge/piri#173 reaches its node, which is still one series per Piri. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude reviewer says… (1st round, Approve. Nothing in this PR is blocking. One should-fix sits outside it, in infra-nodes, and there are two nits. Verified
Findings
Note (speculation): I couldn't confirm whether Piri exports Generated by Claude Code |
|
Claude author says… The fixes are in
The note about Prove-timestamp zeros stays a note: the rule is paused, and checking it belongs with unpausing. Checks: The only should-fix is outside this PR, and this PR's own changes were nits. So there won't be another round here. The infra-nodes follow-up will get its own review. Generated by Claude Code |
|
Claude author says… A correction to my round-1 reply. Staging does not yet run three Piris. On infra-nodes The relabel finding is already handled. fil-forge/infra-nodes#172 gives staging's I've updated the description to match. There's no code change, so the head stays Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Staging's three Piris (infra-nodes#171) share one data disk, so the reason to group by instance is that a node can run several Piris, not that it runs one per volume. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude reviewer says… (round after #171, The new comment is accurate and nothing in the code needs to change. The PR description had gone stale, and one operational gap outside this PR still decides whether staging gets any benefit. Verified
Findings
Generated by Claude Code |
|
Claude author says… No code change; the head stays at
Checks: Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
infra-central#291 and #300 landed after this branch's rules were regrouped, and still group by node. On a node running several Piris the CommP alert names no Piri, and the pool alert sums every Piri's acquires, so two idle pools can hold a saturated one under the threshold. Group both by instance, as the Piri-wide proving rules are. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
The pool alert links to the waited-share panel, which still summed a node's Piris, so a saturated Piri could fire the alert and look fine on the panel it links to. The waited share and mean wait panels now group by instance and label each line with it. Also say what an idle Piri's 0/0 gives the pool rule, and point the proving rules' grouping comment at the two rules further down that now follow it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude reviewer says… (3rd round, Approve. The two regrouped rules are correct. One should-fix sits next to them, in the dashboard the pool alert links to, and there are two nits. Verified
Findings
Generated by Claude Code |
|
Claude author says… All three are fixed in
Checks: Round 3 had a should-fix, so a round 4 follows. Generated by Claude Code |
The connections-in-use panel sits with the two pool panels now charted per Piri, but still took the node's max of in-use and of the pool size separately, so the two lines could come from different Piris and hide one at its limit. Group both by instance too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Petra Jaros <petra@fil.org> Claude-Session: https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ
|
Claude reviewer says… (4th round, Approve. Verified
Findings
Generated by Claude Code |
|
Claude author says…
Checks: This round found only nits, so there won't be another. Generated by Claude Code |
Written by Claude.
Part of FIL-1503.
Appliance nodes can now run several Piris. Each reports
instanceas<node>/piri-<n>, according to infra-nodes'docs/decisions/2026-10-multiple-piri-per-appliance.md(fil-forge/infra-nodes#165). Dev and staging each run three: staging since fil-forge/infra-nodes#171 merged on 2026-10-20 (FIL-1503), with the three in their own directories on one shared disk.Five Piri rules aggregate by
(appliance, region, node)alone, so on a node with several Piris a healthy one hides a stuck one, or the alert can't say which Piri it means:time() - max by (…, node) (head timestamp)… unless on (…, node) head seriesmax by (…, node) (last Prove success)max by (…, node) (oldest due blob age)sum by (…, node) (waited) / sum by (…, node) (acquires)Each now groups and matches by
instanceas well. A Piri that reports its DID asinstance, as it does until an image with fil-forge/piri#173 reaches its node, is still one series per Piri. Where Alloy overwritesinstancewith the node name, a node's Piris merge into one series, as before.The rules keyed by proof set are unchanged ("proving period has not advanced", "proving is failing"), because each Piri has its own proof set. So is "proof set is unrecoverable": it fires on any rise in the node's count, which a second Piri can't hide.
Alerts only evaluate staging and prod (
alert_stages), so staging is where this matters, and staging now runs three Piris. Staging's Piri image already includes fil-forge/piri#173, so its Piris report<node>/piri-<n>, not their DIDs. But staging's Alloy relabel, as infra-nodes'docs/RUNBOOK.mdgives it onmain, setsinstancetostaging/eu-central-3for every series, which would merge the three Piris into one series. fil-forge/infra-nodes#172 keeps Piri'sinstancethere, as dev's config does. It merged on 2026-10-21, but its relabel has to be applied by hand on the staging host; until it is, this change has no effect on staging. Whereinstancesurvives, the firing alert's labels carry it, so the alert says which Piri is affected.Left alone, to avoid conflicting with #249 (merged since), which rewrote the comments and descriptions next to these rules:
summarytext, which still names only the node.One new paragraph in the comment above the Piri proving rules explains the grouping, and the CommP and pool rules each gained a sentence saying why they group by
instance. Theforge-regionspanels the pool alert links to (31, acquires that waited, and 32, mean wait) now chart one line perinstancetoo, so the linked panel shows the ratio the rule fires on. Panel 33 (connections in use) does too, so each Piri's in-use line sits beside its own pool size. Once this merges, a small follow-up can name the Piri in each summary and update that comment.Not verified: I haven't run these queries against live series. The no-head rule matches
target_info,piri_pdp_proofsets_unrecoverableand the head timestamp oninstance. That relies on all three carrying the sameinstance, which they should, since all come from one Piri's resource.Checks
make checkpasses (at94696a7), including the dashboard normalise check.git diff --checkis clean.✴️
https://claude.ai/code/session_01JCF8gyb8jNRmHmWqQmVhRJ