Cannot record events outside reconciliation loop or for arbitrary resources (`RegisteredController#eventRecorder` missing)

Aperta
#3,686 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@afalhambra-hivemq ci sta già lavorando.

Dal 11/11/2026.

  • #3689 di @csviri — integrata

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
54/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
java

Direzione di ricerca

Read the v5.6 event recorder release notes and trace the API changes described for PRs #3570 and #3581, then inspect RegisteredController, Context, and DefaultEventRecorder. Confirm how recording is currently scoped to the primary resource and where an unbound recorder or explicit target resource could fit; done means events can be recorded outside reconciliation and targeted at a parent resource from a sub-resource controller.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Bug Report

What did you do?

We attempted to record a Kubernetes event for our primary/main resource from within the reconciliation loop of a sub-resource / secondary controller, following the v5.6 release notes:
https://javaoperatorsdk.io/blog/2026/09/02/version-5.6-released/#kubernetes-event-recorder

According to the release documentation:

"Outside of the reconciliation loop — from a status listener or a background task, or about an object other than the primary — use the unbound form from RegisteredController#eventRecorder(), which is scoped to the controller rather than to a reconciliation:

EventRecorder recorder = registeredController.eventRecorder();
recorder.record(someOtherResource, EventRecord.normal("Noticed", "something happened"));
What did you expect to see?
  1. RegisteredController exposes an eventRecorder() method (or equivalent API) to obtain an unbound EventRecorder.
  2. EventRecorder provides a way to record events for an arbitrary target resource (e.g. recorder.record(someOtherResource, EventRecord.normal(...))), allowing a controller reconciling a sub-resource to emit an event on its main/parent resource.
What did you see instead? Under which circumstances?
  1. RegisteredController does not contain eventRecorder(). Calling registeredController.eventRecorder() fails to compile.
  2. In Context<P>, eventRecorder() returns a ResourceEventRecorder strictly bound to context.getPrimaryResource().
  3. In DefaultEventRecorder, toEvent(...) hardcodes the target resource to context.getPrimaryResource():
    var regarding = context.getPrimaryResource();
    and EventRecorder#record only accepts (EventRecord event, Context<?> context).
    

As a result, when reconciling a sub-resource (where context.getPrimaryResource() is the sub-resource), there is no supported way to publish an event targeting the main/parent resource.

Environment

Kubernetes cluster type: any
java-operator-sdk version: 5.6.3
java -version: 17 / 21
kubectl version: 1.30+

Possible Solution

Tracing through the PR history:

  • PR #3570 (feat: Add Event Recorder) originally introduced RegisteredController#eventRecorder() and supported recording events for arbitrary objects.
  • PR #3581 (refactor: configurable event recorder) refactored the API to be stateless and removed RegisteredController#eventRecorder(), inadvertently dropping the ability to record events outside a reconciliation context or targeting a resource other than context.getPrimaryResource().
    Suggested fixes:
  1. Re-introduce an unbound EventRecorder accessible via RegisteredController, ConfigurationService, or Operator.
  2. Allow passing an explicit target HasMetadata targetResource (or via EventRecord / EventRecorder#record(targetResource, ...)), rather than exclusively binding to context.getPrimaryResource().
Additional context

Our use case: We have separate controllers reconciling sub-resources. When state changes or failures occur during the reconciliation of a sub-resource, we need to publish a Kubernetes event targeting the main/parent resource so users inspecting the parent resource (kubectl describe ) have visibility into events triggered by its sub-resources.

Lingua principale
Java
Stelle
945
Fork
247
Merge medio
2g 10h
PR unite (30g)
27

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di operator-framework/java-operator-sdk

Tutte le issue di operator-framework/java-operator-sdk

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.