[defer] feat(dashboard): add per-exit failure breakdown to pool observation - #14749
Merged
diegosouzapw merged 3 commits intoSep 25, 2026
Merged
diegosouzapw merged 3 commits into
diegosouzapw merged 3 commits into
Conversation
maxmad64bis
force-pushed
the
fix/pool-failure-breakdown
branch
from
September 24, 2026 12:56
b396f7e to
bd38031
Compare
maxmad64bis
marked this pull request as ready for review
September 24, 2026 13:46
maxmad64bis
marked this pull request as draft
September 24, 2026 23:41
maxmad64bis
force-pushed
the
fix/pool-failure-breakdown
branch
from
September 25, 2026 00:12
bd38031 to
2fede0b
Compare
maxmad64bis
marked this pull request as ready for review
September 25, 2026 01:01
The per-exit failure breakdown reused the traffic sentence (poolEgressObservation) and the empty-state sentence (poolEgressObservationEmpty), so N failures via one exit rendered as '1 exit used by N connections · up to N on one exit' and the unattributed remainder as 'No traffic observed in the last 24 h (N)', contradicting the counts they show. Add poolEgressFailuresByExit / poolEgressFailuresUnattributed, translated in all 67 locale files, and assert the UI no longer reuses the traffic keys.
diegosouzapw
merged commit Sep 25, 2026
02ead75
into
diegosouzapw:release/v3.8.51
11 of 16 checks passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Pool members that fail requests are invisible as a group: the pool screen shows per-member egress traffic but nothing about which exits fail and why, so an operator cannot tell a refusing exit from a quiet one. The egress-observation endpoint now also returns a per-exit failure breakdown (grouped by egress IP and call-log error family, with an explicit
unattributedbucket for rows without correlation), and the pool screen shows a 24 h summary card plus per-exit detail. The derived dedup table is wrapped so SQLite never mergesunknownintoserver_error.Related Issues
No linked issue — pool failure attribution is a new observability surface with no prior ticket.
Validation
npm run lintTests Added Or Updated
tests/unit/pool-failure-breakdown.test.ts(new, 18 tests with oracle): scalar-subquery form wrapped in a derived table — the unwrapped form mergesunknownintoserver_errorunder SQLite (red 1/2, verified); real base 43k/101k rows: no moreMATERIALIZE, 40→20 ms, same rows; 18/18 green on the head.tests/unit/ui/PoolEgressObservation.test.tsx(7 tests): summary card + per-exit detail render; 7/7 green.Coverage Notes
proxyLogs.tsbreakdown) and the summary/detail UI hunks are covered by the new tests.Reviewer Notes
(SELECT c.error_type ... ORDER BY c.rowid LIMIT 1) AS familyis wrapped in a derived table before the outerGROUP BY— the Fait-vs-spec curve (unwrapped =unknownabsorbed) is locked by the oracle test.EXPLAINon the real base:SEARCH c USING INDEX idx_cl_correlation_id, noMATERIALIZE, 40→20 ms, identical rows.proxyRefusalMemory.tswith feat(webhooks): notify when a pool member is set aside #14755 (this PR only reads it); the B6-part symbols + Contingency removal are done in this head.Maintainer rework (merge-batch 2026-09-24)
poolEgressObservation) and the empty-state sentence (poolEgressObservationEmpty), so N failures via one exit read "1 exit used by N connections · up to N on one exit" and the unattributed remainder read "No traffic observed in the last 24 h (N)". Added dedicated keysproxyRegistry.poolEgressFailuresByExit/proxyRegistry.poolEgressFailuresUnattributed, translated in all 67 locale files (no__MISSING__markers).tests/unit/ui/PoolEgressObservation.test.tsxnow asserts the dedicated keys and that the traffic/empty sentences are not reused (red on the previous head, green after), plus a case where every failure has an exit.release/v3.8.51(clean).