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

Abierto
#3,686 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@afalhambra-hivemq ya está trabajando en esto.

Desde el 11/11/2026.

  • #3689 de @csviri — fusionado

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
54/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
java

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
Java
Estrellas
945
Forks
247
Merge medio
2 d 10 h
PR fusionados (30 d)
27

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de operator-framework/java-operator-sdk

Todos los issues de operator-framework/java-operator-sdk

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.