• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

zalando / skipper / 22872236893
78%

Build:
DEFAULT BRANCH: master
Ran 09 Mar 2026 08:18PM UTC
Jobs 1
Files 301
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

09 Mar 2026 08:00PM UTC coverage: 78.458% (-0.02%) from 78.482%
22872236893

push

github

web-flow
feature: expose invalid routes via support listener API (#3897)

Fixes #3488

### Context

Operators in multitenant ingress setups currently have no programmatic
way to discover which routes failed validation — the only option is
grepping logs for `"failed to process route"` messages. The `routeTable`
already tracks `invalidRoutes []*eskip.Route` alongside `validRoutes`,
but `Routing.ServeHTTP` unconditionally serves only the valid set.
Invalid routes are silently dropped from the routing table with no API
visibility into what broke or why.

### Approach

This extends the existing `/routes` handler with a `?invalid=true` query
parameter rather than adding a separate endpoint. The query param
approach follows @szuecs's guidance in the issue — invalid routes are a
filtered view of the same data, not a distinct resource, and this avoids
new mux registrations or a parallel `ServeHTTP` implementation.

The harder design decision was how to expose error messages (per
@AlexanderYastrebov's suggestion). The validation errors are computed in
`processRouteDefs` and `newMatcher` but were previously only sent to
metrics and discarded. Rather than adding an error field to
`eskip.Route` (a core type used across the entire codebase for parsing,
serialization, and matching), the errors are stored in a separate
`invalidRouteErrors map[string]string` on `routeTable` and merged into
the JSON response via a custom `MarshalJSON` on `InvalidRouteResponse`.

### Changes

- `processRouteDefs` returns a third value — error messages keyed by
route ID — collected from filter, predicate, backend, and matcher
validation failures
- `routeTable` gains an `invalidRouteErrors` field, populated from both
`processRouteDefs` and `newMatcher` error paths in `receiveRouteMatcher`
- `Routing.ServeHTTP` switches between `validRoutes` and `invalidRoutes`
based on the `invalid` query param; all existing behavior (pagination,
content negotiation, `X-Count`/`X-Timestamp` headers) works identica... (continued)

41 of 59 new or added lines in 2 files covered. (69.49%)

4 existing lines in 2 files now uncovered.

25794 of 32876 relevant lines covered (78.46%)

88366.48 hits per line

New Missed Lines in Diff

Lines Coverage ∆ File
18
80.5
-3.14% routing/routing.go

Uncovered Existing Lines

Lines Coverage ∆ File
1
90.23
-0.08% proxy/proxy.go
3
66.38
-0.25% skipper.go
Jobs
ID Job ID Ran Files Coverage
1 22872236893.1 09 Mar 2026 08:18PM UTC 301
78.46
GitHub Action Run
Source Files on build 22872236893
  • Tree
  • List 301
  • Changed 4
  • Source Changed 2
  • Coverage Changed 4
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #22872236893
  • 893b0429 on github
  • Prev Build on master (#22871504743)
  • Next Build on master (#22874271621)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc