Repository navigation
🧭 Add root-cause and correlation work with its dashboard support - #606
Merged
Merged
Conversation
…n-round # Conflicts: # .github/workflows/ci.yml # .github/workflows/e2e.yml
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.
What this changes
Ten items from
docs/specs/core-round-2026-11.md, in one branch. Alert text stays terse and technical; beginner help is on the dashboard only. Nothing here forecasts: every sentence says what kwatch saw now.CeilingUnavailable). Notify max 5m0s to 4m15s, p95 4m15s to 3m15s. The staging peak fell 28/h to 26/h as a side effect of item 4.host:porttargets from non-credential keys (same parser, bounds and credential-name filter as env values, values over 512 bytes skipped, never Secrets) before digesting; no raw value is kept. A join gives pods that read the ConfigMap viaenvFromorconfigMapKeyRefaCallsedge, whichever of pod and ConfigMap arrives first. Messages say(from ConfigMap api-config, DB_HOST).LogErrorBurst(modeErrorBurst, Pro, notify): at least 20 error lines, at least 5 times the workload's own earlier rate per window, with at least 10 minutes of earlier windows. A refused log read pauses it for 5 minutes without a finding. Opt out withinvestigation.sampleLogs: false(also off wheninvestigation.logsis false).... is healthy again, but <cause> still <state>. The same cause is still present.; recovered:<cause> accepts connections again.co-onsetproof (+0.05) and the factThey started failing 4 seconds apart.Independent failures on separate nodes, or minutes apart, stay apart (adversarial scenarios).Users can't reach shop.example.com/checkout, shop.example.com and 2 more.from Ingress and HTTPRoute rules (path only when the rule has one), 2 named thenand N more, worst first. Dashboard Traffic rows list up to 8Users reach it atrows.Timeline: 10:09 postgres out of memory → 10:10 api unavailable → 10:11 service api no ready endpoints.for chains of 3 or more steps, in onset order, observed events only. Dropped from messages past 600 characters; never in the short form or a resolve. The dashboard has it as an ordered list.TestMissingEvidenceNeverStatesAWrongRoot, wired intomake alert-quality-gate, replays every labelled scenario with logs denied, without metrics and with Secrets and ConfigMaps hidden.+0.1at all pods,-0.05under 30%). Message:5 of 5 failing pods read it.kwatch checked: DNS resolves db.example.com fine, so DNS is not the cause.Decisions on the spec's open points
kwatch will keep watching itis not said: a resolved incident is not kept open. While the cause is present the incident stays open (scenarioresolve-cause-still-present); the resolve form only occurs when the cause is not a member of the incident.the previous N minwhen less than an hour of history exists.Before and after
See the goldens in
internal/notification/compose/testdataandinternal/scenarios/testdata/messages:external_endpoint_storm,log_error_burst,log_error_burst_no_baseline,resolved_cause_still_present,resolved_cause_recovered,user_endpoints,user_endpoints_partial,close_call_checked, and the scenario goldens forco-onset-pair-shares-node,chain-timeline-line,change-blast-overlap,dependency-host-from-configmap,healthy-pods-error-burst,user-endpoints-named.Scorecard
SCORECARD.md is regenerated; 28 of 28 gates pass.
Added scenarios: 14 labelled, each with
expect.jsonand a message golden.Checks
make verifyrun locally: build, vet, lint, race tests with coverage, line and diff checks, architecture, test layout, hygiene, catalogs, docs, manifests, negative regressions and dead code all pass. The one race-run failure isTestProviderHealthIsPublishedWithoutFailingReadinessininternal/app; it fails identically onmainunder-racehere (a delivery health event wait), so it is not from this branch. It passes without-race.go test -tags browser -run Browser ./internal/dashboard/) pass, including a new test for the issue page block.make alert-quality-gate: 28 of 28 gates, plus the ablation and missing-evidence tests.Needs CI
pods/logreads is exercised by the existing RBAC (pods/logis already granted).Not done or done differently
Sourceon the cause); no schema bump, since old files decode and omitted fields are absent.toleratedWithoutEvidence; the test fails when one stops being true.