You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@grails.apache.org by GitBox <gi...@apache.org> on 2026/06/20 06:32:41 UTC

[GH] (grails-core/feat/observation-route-uri): Workflow run "Code Style" failed!

The GitHub Actions job "Code Style" on grails-core.git/feat/observation-route-uri has failed.
Run started by GitHub user codeconsole (triggered by codeconsole).

Head commit for run:
a28f6f9974df81949f5395b3bad596a5bd1de26e / Scott Murphy Heiberg <sc...@alwaysvip.com>
Observability: extract shared grails-observation foundation + add interceptor, databinding and convert spans

Builds on the controller/render observations: extracts the duplicated convention
boilerplate into a new leaf module and instruments three more Grails request-lifecycle
phases on top of it, so a trace reads http(route) -> interceptor -> controller ->
databinding -> {render -> gsp | convert(json/xml)}.

New module `grails-observation` (org.apache.grails.observation): a micrometer-only leaf
(no Grails deps, so GORM and GSP can reuse it later) holding the shared base —
GrailsObservationContext, GrailsObservationConvention<C> (supportsContext by context type,
the low-cardinality `error` key value, the null/empty fallback) and the shared `error`
KeyName. Registered in settings.gradle and the publish-root-config.gradle publishedProjects
list (required, or grails-publish never applies and configuration fails).

The controller/render conventions (grails-web-common) are refactored onto the base, dropping
their duplicated error/fallback logic and sharing the `error` KeyName.

New spans — each a Context + Convention + default convention + ObservationDocumentation built
on the shared base, NOOP-fast-pathed and fully guarded (never affect request handling):

- grails.interceptor (grails-interceptors): one span per matched interceptor before()/after()
  callback, tagged grails.interceptor=<logical name> and grails.interceptor.phase. The adapter
  is made ObservationRegistry-aware; the boolean short-circuit/control flow is preserved.
- grails.databinding (grails-web-databinding): wraps GrailsWebDataBinder.doBind, tagged
  grails.databinding.target; the registry is resolved from the GrailsApplication main context.
- grails.convert (grails-converters): wraps JSON/XML.render(HttpServletResponse), which write
  straight to the response and bypass DispatcherServlet.render, tagged grails.convert.format.
  Converters are not Spring beans, so the registry rides the existing ConvertersConfigurationHolder
  (set once by ConvertersConfigurationInitializer).

Convention specs cover the new conventions' tags, fallbacks, error capture and documentation
wiring; the shared base is exercised through the existing controller/render spec.

GORM (gorm.query/persist) and validate observations are deferred to follow-ups that reuse this
foundation.

Report URL: https://github.com/apache/grails-core/actions/runs/27862728399

With regards,
GitHub Actions via GitBox