From 7e6c1712eb16a097e5dc797c1cd9546b81b7eec6 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 25 Feb 2026 14:34:29 +0100 Subject: [PATCH 1/4] fix: unify how resource information is added, prevent NPEs Fixes #3183 Some (all?) MDC implementations prevent adding null values so default should be provided or the key omitted. Signed-off-by: Chris Laprun --- .../operator/processing/MDCUtils.java | 64 ++++++++++--------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java index 68043be070..4381a1d34c 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java @@ -22,6 +22,7 @@ import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.ResourceAction; +@SuppressWarnings("unused") public class MDCUtils { private static final String NAME = "resource.name"; @@ -35,34 +36,23 @@ public class MDCUtils { private static final boolean enabled = Utils.getBooleanFromSystemPropsOrDefault(Utils.USE_MDC_ENV_KEY, true); - private static final String EVENT_RESOURCE_NAME = "eventsource.event.resource.name"; - private static final String EVENT_RESOURCE_UID = "eventsource.event.resource.uid"; - private static final String EVENT_RESOURCE_NAMESPACE = "eventsource.event.resource.namespace"; - private static final String EVENT_RESOURCE_KIND = "eventsource.event.resource.kind"; - private static final String EVENT_RESOURCE_VERSION = "eventsource.event.resource.resourceVersion"; - private static final String EVENT_ACTION = "eventsource.event.action"; + private static final String EVENT_SOURCE_PREFIX = "eventSource.event."; + private static final String EVENT_ACTION = EVENT_SOURCE_PREFIX + "action"; private static final String EVENT_SOURCE_NAME = "eventsource.name"; + private static final String UNKNOWN_ACTION = "unknown action"; public static void addInformerEventInfo( HasMetadata resource, ResourceAction action, String eventSourceName) { if (enabled) { - MDC.put(EVENT_RESOURCE_NAME, resource.getMetadata().getName()); - MDC.put(EVENT_RESOURCE_NAMESPACE, resource.getMetadata().getNamespace()); - MDC.put(EVENT_RESOURCE_KIND, HasMetadata.getKind(resource.getClass())); - MDC.put(EVENT_RESOURCE_VERSION, resource.getMetadata().getResourceVersion()); - MDC.put(EVENT_RESOURCE_UID, resource.getMetadata().getUid()); - MDC.put(EVENT_ACTION, action == null ? null : action.name()); + addResourceInfo(resource, true); + MDC.put(EVENT_ACTION, action == null ? UNKNOWN_ACTION : action.name()); MDC.put(EVENT_SOURCE_NAME, eventSourceName); } } public static void removeInformerEventInfo() { if (enabled) { - MDC.remove(EVENT_RESOURCE_NAME); - MDC.remove(EVENT_RESOURCE_NAMESPACE); - MDC.remove(EVENT_RESOURCE_KIND); - MDC.remove(EVENT_RESOURCE_VERSION); - MDC.remove(EVENT_RESOURCE_UID); + removeResourceInfo(true); MDC.remove(EVENT_ACTION); MDC.remove(EVENT_SOURCE_NAME); } @@ -116,33 +106,45 @@ public static void removeResourceIDInfo() { } public static void addResourceInfo(HasMetadata resource) { + addResourceInfo(resource, false); + } + + public static void addResourceInfo(HasMetadata resource, boolean forEventSource) { if (enabled) { - MDC.put(API_VERSION, resource.getApiVersion()); - MDC.put(KIND, resource.getKind()); + MDC.put(key(API_VERSION, forEventSource), resource.getApiVersion()); + MDC.put(key(KIND, forEventSource), resource.getKind()); final var metadata = resource.getMetadata(); if (metadata != null) { - MDC.put(NAME, metadata.getName()); + MDC.put(key(NAME, forEventSource), metadata.getName()); if (metadata.getNamespace() != null) { - MDC.put(NAMESPACE, metadata.getNamespace()); + MDC.put(key(NAMESPACE, forEventSource), metadata.getNamespace()); } - MDC.put(RESOURCE_VERSION, metadata.getResourceVersion()); + MDC.put(key(RESOURCE_VERSION, forEventSource), metadata.getResourceVersion()); if (metadata.getGeneration() != null) { - MDC.put(GENERATION, metadata.getGeneration().toString()); + MDC.put(key(GENERATION, forEventSource), metadata.getGeneration().toString()); } - MDC.put(UID, metadata.getUid()); + MDC.put(key(UID, forEventSource), metadata.getUid()); } } } + private static String key(String key, boolean forEventSource) { + return forEventSource ? EVENT_SOURCE_PREFIX + key : key; + } + public static void removeResourceInfo() { + removeResourceInfo(false); + } + + public static void removeResourceInfo(boolean forEventSource) { if (enabled) { - MDC.remove(API_VERSION); - MDC.remove(KIND); - MDC.remove(NAME); - MDC.remove(NAMESPACE); - MDC.remove(RESOURCE_VERSION); - MDC.remove(GENERATION); - MDC.remove(UID); + MDC.remove(key(API_VERSION, forEventSource)); + MDC.remove(key(KIND, forEventSource)); + MDC.remove(key(NAME, forEventSource)); + MDC.remove(key(NAMESPACE, forEventSource)); + MDC.remove(key(RESOURCE_VERSION, forEventSource)); + MDC.remove(key(GENERATION, forEventSource)); + MDC.remove(key(UID, forEventSource)); } } } From 494497a55fa6747def9605f7691af09641cfeb93 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 25 Feb 2026 14:44:05 +0100 Subject: [PATCH 2/4] fix: prefix name Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/io/javaoperatorsdk/operator/processing/MDCUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java index 4381a1d34c..4fd099db91 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java @@ -36,7 +36,7 @@ public class MDCUtils { private static final boolean enabled = Utils.getBooleanFromSystemPropsOrDefault(Utils.USE_MDC_ENV_KEY, true); - private static final String EVENT_SOURCE_PREFIX = "eventSource.event."; + private static final String EVENT_SOURCE_PREFIX = "eventsource.event."; private static final String EVENT_ACTION = EVENT_SOURCE_PREFIX + "action"; private static final String EVENT_SOURCE_NAME = "eventsource.name"; private static final String UNKNOWN_ACTION = "unknown action"; From fd109b74fa7615a28ec6945d0c1e7616829f0d58 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 25 Feb 2026 14:47:51 +0100 Subject: [PATCH 3/4] fix: cosmetic Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/io/javaoperatorsdk/operator/processing/MDCUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java index 4fd099db91..ac190f4884 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java @@ -128,8 +128,8 @@ public static void addResourceInfo(HasMetadata resource, boolean forEventSource) } } - private static String key(String key, boolean forEventSource) { - return forEventSource ? EVENT_SOURCE_PREFIX + key : key; + private static String key(String baseKey, boolean forEventSource) { + return forEventSource ? EVENT_SOURCE_PREFIX + baseKey : baseKey; } public static void removeResourceInfo() { From 9da6bf544c713251be90034a608e97360af25ece Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 25 Feb 2026 15:14:49 +0100 Subject: [PATCH 4/4] refactor: remove unused methods Signed-off-by: Chris Laprun --- .../operator/processing/MDCUtils.java | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java index ac190f4884..b8a7ba1f40 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/MDCUtils.java @@ -22,7 +22,6 @@ import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.ResourceAction; -@SuppressWarnings("unused") public class MDCUtils { private static final String NAME = "resource.name"; @@ -58,11 +57,6 @@ public static void removeInformerEventInfo() { } } - public static void withMDCForEvent( - HasMetadata resource, Runnable runnable, String eventSourceName) { - withMDCForEvent(resource, null, runnable, eventSourceName); - } - public static void withMDCForEvent( HasMetadata resource, ResourceAction action, Runnable runnable, String eventSourceName) { try { @@ -73,24 +67,6 @@ public static void withMDCForEvent( } } - public static void withMDCForResourceID(ResourceID resourceID, Runnable runnable) { - try { - MDCUtils.addResourceIDInfo(resourceID); - runnable.run(); - } finally { - MDCUtils.removeResourceIDInfo(); - } - } - - public static void withMDCForPrimary(HasMetadata primary, Runnable runnable) { - try { - MDCUtils.addResourceInfo(primary); - runnable.run(); - } finally { - MDCUtils.removeResourceInfo(); - } - } - public static void addResourceIDInfo(ResourceID resourceID) { if (enabled) { MDC.put(NAME, resourceID.getName());