From ff83ed2da4e2e26f63c8484eece327a6e055cc4d Mon Sep 17 00:00:00 2001 From: Kevin Doran Date: Wed, 27 May 2026 12:15:24 -0400 Subject: [PATCH 1/6] NIFI-15979 Add Connector logging MDC and reporting-task visibility - ConnectorInitializationContext.setLoggingAttributes(Map): new default method (throws UOE) for connectors to surface custom MDC context. - AbstractConnector.setLoggingAttributes(Map): protected helper forwarding to the init context. - ProcessGroupStatus.loggingAttributes: snapshot map (default Map.of()) plus accessors; propagated through clone() and merge(). - EventAccess.getConnectorStatuses(): new default method returning an empty collection; implementations override to expose connector-managed Process Groups to reporting tasks. Pure API additions with default impls keep existing code compiling unchanged. --- .../connector/AbstractConnector.java | 13 +++++++++ .../ConnectorInitializationContext.java | 29 +++++++++++++++++++ .../controller/status/ProcessGroupStatus.java | 28 ++++++++++++++++++ .../apache/nifi/reporting/EventAccess.java | 18 ++++++++++++ 4 files changed, 88 insertions(+) diff --git a/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java b/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java index 7cc847a..0ba9fab 100644 --- a/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java +++ b/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java @@ -96,6 +96,19 @@ protected final ConnectorInitializationContext getInitializationContext() { return initializationContext; } + /** + * Sets custom logging attributes that the framework will include in the SLF4J {@code MDC} for every log line emitted + * by this Connector and by any component running inside its managed flow. Convenience wrapper for + * {@link ConnectorInitializationContext#setLoggingAttributes(Map)} that subclasses can call once they have computed + * the attributes (for example, after configuration is applied). Calls replace any previously set custom attributes. + * + * @param attributes the custom attributes to expose; must not be {@code null} + * @see ConnectorInitializationContext#setLoggingAttributes(Map) + */ + protected final void setLoggingAttributes(final Map attributes) { + getInitializationContext().setLoggingAttributes(attributes); + } + @Override public void start(final FlowContext context) throws FlowUpdateException { final ProcessGroupLifecycle lifecycle = context.getRootGroup().getLifecycle(); diff --git a/src/main/java/org/apache/nifi/components/connector/ConnectorInitializationContext.java b/src/main/java/org/apache/nifi/components/connector/ConnectorInitializationContext.java index fa422b4..b8c688c 100644 --- a/src/main/java/org/apache/nifi/components/connector/ConnectorInitializationContext.java +++ b/src/main/java/org/apache/nifi/components/connector/ConnectorInitializationContext.java @@ -21,6 +21,8 @@ import org.apache.nifi.flow.VersionedExternalFlow; import org.apache.nifi.logging.ComponentLog; +import java.util.Map; + /** *

* The ConnectorInitializationContext provides context about how the connector is being run. @@ -111,4 +113,31 @@ default void updateFlow(FlowContext flowContext, VersionedExternalFlow versioned */ void updateFlow(FlowContext flowContext, VersionedExternalFlow versionedExternalFlow, BundleCompatibility bundleCompatability) throws FlowUpdateException; + /** + *

+ * Sets custom logging attributes that the framework will include in the SLF4J {@code MDC} for every log line emitted + * by the Connector and by any component (Processor, Controller Service, etc.) running inside the Connector's managed + * flow. The given map replaces any previously set custom attributes. + *

+ * + *

+ * The framework reserves a set of well-known keys that describe the Connector itself (identity, bundle coordinate, + * etc.). Any entry in {@code attributes} whose key collides with a reserved framework-managed key is dropped and a + * warning is logged for that entry; the remaining entries are accepted. + *

+ * + *

+ * This method is intended to be called during or after {@link Connector#initialize(ConnectorInitializationContext) + * initialization}, for example once configuration has been applied and the Connector has values it wishes to surface + * (e.g. database name, source schema). It is safe to call repeatedly; each call replaces the prior set of custom + * attributes. + *

+ * + * @param attributes the custom attributes to expose on logs from this Connector and its managed flow; must not be {@code null} + * @throws UnsupportedOperationException if the runtime implementation does not support custom logging attributes + */ + default void setLoggingAttributes(Map attributes) { + throw new UnsupportedOperationException(); + } + } diff --git a/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java b/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java index 9de9940..1d26a1b 100644 --- a/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java +++ b/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java @@ -61,6 +61,8 @@ public class ProcessGroupStatus implements Cloneable { private ProcessingPerformanceStatus processingPerformanceStatus; + private Map loggingAttributes = Map.of(); + public String getId() { return id; } @@ -293,6 +295,27 @@ public void setProcessingPerformanceStatus(ProcessingPerformanceStatus processin this.processingPerformanceStatus = processingPerformanceStatus; } + /** + * Returns the snapshot of logging attributes (e.g. connector identity, NiFi {@code processGroup*} keys) that apply to + * this Process Group at the time the status was captured. Consumers should treat the returned map as immutable. + * + * @return the logging attributes for this Process Group, or an empty map if none have been set + */ + public Map getLoggingAttributes() { + return loggingAttributes; + } + + /** + * Sets the snapshot of logging attributes (e.g. connector identity, NiFi {@code processGroup*} keys) that apply to + * this Process Group at the time the status was captured. The supplied map is stored by reference; callers should + * provide an immutable snapshot (e.g. {@link Map#copyOf(Map)}). A {@code null} value is treated as an empty map. + * + * @param loggingAttributes the logging attributes for this Process Group + */ + public void setLoggingAttributes(final Map loggingAttributes) { + this.loggingAttributes = loggingAttributes == null ? Map.of() : loggingAttributes; + } + @Override public ProcessGroupStatus clone() { final ProcessGroupStatus clonedObj = new ProcessGroupStatus(); @@ -317,6 +340,7 @@ public ProcessGroupStatus clone() { clonedObj.bytesTransferred = bytesTransferred; clonedObj.processingNanos = processingNanos; clonedObj.processingPerformanceStatus = processingPerformanceStatus; + clonedObj.loggingAttributes = loggingAttributes; if (connectionStatus != null) { final Collection statusList = new ArrayList<>(); @@ -476,6 +500,10 @@ public static void merge(final ProcessGroupStatus target, final ProcessGroupStat } target.setRegisteredFlowSnapshotMetadata(toMerge.getRegisteredFlowSnapshotMetadata()); + if (!toMerge.getLoggingAttributes().isEmpty()) { + target.setLoggingAttributes(toMerge.getLoggingAttributes()); + } + // connection status // sort by id final Map mergedConnectionMap = new HashMap<>(); diff --git a/src/main/java/org/apache/nifi/reporting/EventAccess.java b/src/main/java/org/apache/nifi/reporting/EventAccess.java index 7cf15fb..f63e357 100644 --- a/src/main/java/org/apache/nifi/reporting/EventAccess.java +++ b/src/main/java/org/apache/nifi/reporting/EventAccess.java @@ -23,6 +23,8 @@ import org.apache.nifi.provenance.ProvenanceEventRepository; import java.io.IOException; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -39,6 +41,22 @@ public interface EventAccess { */ ProcessGroupStatus getGroupStatus(final String groupId); + /** + * Returns one {@link ProcessGroupStatus} per Connector currently registered with the runtime, each rooted at the + * Connector's managed Process Group. Connector-managed groups are siblings of the root Process Group (they have no + * parent and are not reachable from {@link #getControllerStatus()}), so reporting tasks that wish to surface metrics + * for connector-managed flows must consult this method in addition to {@link #getControllerStatus()}. + * + * The default implementation returns an empty collection so that runtimes without Connector support — and existing + * callers compiled against earlier versions of this interface — continue to work unchanged. + * + * @return one status per Connector's managed Process Group; empty if no Connectors are registered or if the runtime + * does not support Connectors + */ + default Collection getConnectorStatuses() { + return Collections.emptyList(); + } + /** * Convenience method to obtain Provenance Events starting with (and * including) the given ID. If no event exists with that ID, the first event From bc84b7fb26b6ecb53c94fe3b4f8a43d2e2c90d74 Mon Sep 17 00:00:00 2001 From: Kevin Doran Date: Wed, 27 May 2026 14:59:21 -0400 Subject: [PATCH 2/6] Address review comments --- .../components/connector/AbstractConnector.java | 14 -------------- .../nifi/controller/status/ProcessGroupStatus.java | 14 ++++++++------ 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java b/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java index 0ba9fab..b2ba7b6 100644 --- a/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java +++ b/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java @@ -92,23 +92,9 @@ protected final ConnectorInitializationContext getInitializationContext() { if (initializationContext == null) { throw new IllegalStateException("Connector has not been initialized"); } - return initializationContext; } - /** - * Sets custom logging attributes that the framework will include in the SLF4J {@code MDC} for every log line emitted - * by this Connector and by any component running inside its managed flow. Convenience wrapper for - * {@link ConnectorInitializationContext#setLoggingAttributes(Map)} that subclasses can call once they have computed - * the attributes (for example, after configuration is applied). Calls replace any previously set custom attributes. - * - * @param attributes the custom attributes to expose; must not be {@code null} - * @see ConnectorInitializationContext#setLoggingAttributes(Map) - */ - protected final void setLoggingAttributes(final Map attributes) { - getInitializationContext().setLoggingAttributes(attributes); - } - @Override public void start(final FlowContext context) throws FlowUpdateException { final ProcessGroupLifecycle lifecycle = context.getRootGroup().getLifecycle(); diff --git a/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java b/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java index 1d26a1b..b10714d 100644 --- a/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java +++ b/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java @@ -297,7 +297,7 @@ public void setProcessingPerformanceStatus(ProcessingPerformanceStatus processin /** * Returns the snapshot of logging attributes (e.g. connector identity, NiFi {@code processGroup*} keys) that apply to - * this Process Group at the time the status was captured. Consumers should treat the returned map as immutable. + * this Process Group at the time the status was captured. The returned map is immutable. * * @return the logging attributes for this Process Group, or an empty map if none have been set */ @@ -307,13 +307,13 @@ public Map getLoggingAttributes() { /** * Sets the snapshot of logging attributes (e.g. connector identity, NiFi {@code processGroup*} keys) that apply to - * this Process Group at the time the status was captured. The supplied map is stored by reference; callers should - * provide an immutable snapshot (e.g. {@link Map#copyOf(Map)}). A {@code null} value is treated as an empty map. + * this Process Group at the time the status was captured. An immutable defensive copy of the supplied map is stored; + * subsequent mutations of the caller's map have no effect. A {@code null} value is treated as an empty map. * * @param loggingAttributes the logging attributes for this Process Group */ public void setLoggingAttributes(final Map loggingAttributes) { - this.loggingAttributes = loggingAttributes == null ? Map.of() : loggingAttributes; + this.loggingAttributes = loggingAttributes == null ? Map.of() : Map.copyOf(loggingAttributes); } @Override @@ -340,7 +340,7 @@ public ProcessGroupStatus clone() { clonedObj.bytesTransferred = bytesTransferred; clonedObj.processingNanos = processingNanos; clonedObj.processingPerformanceStatus = processingPerformanceStatus; - clonedObj.loggingAttributes = loggingAttributes; + clonedObj.setLoggingAttributes(loggingAttributes); if (connectionStatus != null) { final Collection statusList = new ArrayList<>(); @@ -501,7 +501,9 @@ public static void merge(final ProcessGroupStatus target, final ProcessGroupStat target.setRegisteredFlowSnapshotMetadata(toMerge.getRegisteredFlowSnapshotMetadata()); if (!toMerge.getLoggingAttributes().isEmpty()) { - target.setLoggingAttributes(toMerge.getLoggingAttributes()); + final Map mergedLoggingAttributes = new HashMap<>(target.getLoggingAttributes()); + mergedLoggingAttributes.putAll(toMerge.getLoggingAttributes()); + target.setLoggingAttributes(mergedLoggingAttributes); } // connection status From f4c2f00342b3ee8912b59007d435eea291eefa4c Mon Sep 17 00:00:00 2001 From: Kevin Doran Date: Wed, 27 May 2026 15:45:51 -0400 Subject: [PATCH 3/6] Introduce ConnectorStatus --- .../controller/status/ConnectorStatus.java | 90 +++++++++++++++++++ .../apache/nifi/reporting/EventAccess.java | 17 ++-- 2 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/apache/nifi/controller/status/ConnectorStatus.java diff --git a/src/main/java/org/apache/nifi/controller/status/ConnectorStatus.java b/src/main/java/org/apache/nifi/controller/status/ConnectorStatus.java new file mode 100644 index 0000000..c2fc7fc --- /dev/null +++ b/src/main/java/org/apache/nifi/controller/status/ConnectorStatus.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.nifi.controller.status; + +/** + * The status of a Connector, including the status of its managed root Process Group. + * + *

+ * Connector-managed flows live outside the controller's root Process Group, so reporting tasks that wish to observe + * metrics for them must consult {@link org.apache.nifi.reporting.EventAccess#getConnectorStatuses()} in addition to + * {@link org.apache.nifi.reporting.EventAccess#getControllerStatus()}. Each {@link ConnectorStatus} exposes the + * Connector's identity along with the {@link ProcessGroupStatus} for its managed root group. + *

+ * + *

+ * The Connector API is experimental and this type is expected to grow over time to surface connector-level metrics + * that do not exist at the Process Group level (e.g. connector-wide backlog or idle time). + *

+ */ +public class ConnectorStatus implements Cloneable { + + private String id; + private String name; + private ProcessGroupStatus rootGroupStatus; + + /** + * @return the identifier of the Connector + */ + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + + /** + * @return the name of the Connector + */ + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + /** + * @return the status of the Connector's managed root Process Group, or {@code null} if the Connector has no + * active managed flow at the time the status was captured + */ + public ProcessGroupStatus getRootGroupStatus() { + return rootGroupStatus; + } + + public void setRootGroupStatus(final ProcessGroupStatus rootGroupStatus) { + this.rootGroupStatus = rootGroupStatus; + } + + @Override + public ConnectorStatus clone() { + final ConnectorStatus clonedObj = new ConnectorStatus(); + clonedObj.id = id; + clonedObj.name = name; + clonedObj.rootGroupStatus = rootGroupStatus == null ? null : rootGroupStatus.clone(); + return clonedObj; + } + + @Override + public String toString() { + return "ConnectorStatus [id=" + id + + ", name=" + name + + ", rootGroupStatus=" + rootGroupStatus + + "]"; + } +} diff --git a/src/main/java/org/apache/nifi/reporting/EventAccess.java b/src/main/java/org/apache/nifi/reporting/EventAccess.java index f63e357..4c53304 100644 --- a/src/main/java/org/apache/nifi/reporting/EventAccess.java +++ b/src/main/java/org/apache/nifi/reporting/EventAccess.java @@ -17,6 +17,7 @@ package org.apache.nifi.reporting; import org.apache.nifi.action.Action; +import org.apache.nifi.controller.status.ConnectorStatus; import org.apache.nifi.controller.status.ProcessGroupStatus; import org.apache.nifi.diagnostics.StorageUsage; import org.apache.nifi.provenance.ProvenanceEventRecord; @@ -42,18 +43,20 @@ public interface EventAccess { ProcessGroupStatus getGroupStatus(final String groupId); /** - * Returns one {@link ProcessGroupStatus} per Connector currently registered with the runtime, each rooted at the - * Connector's managed Process Group. Connector-managed groups are siblings of the root Process Group (they have no - * parent and are not reachable from {@link #getControllerStatus()}), so reporting tasks that wish to surface metrics - * for connector-managed flows must consult this method in addition to {@link #getControllerStatus()}. + * Returns one {@link ConnectorStatus} per Connector currently registered with the runtime. Each + * {@link ConnectorStatus} carries the Connector's identity together with the {@link ProcessGroupStatus} for the + * Connector's managed root Process Group. Connector-managed groups are siblings of the controller's root Process + * Group (they have no parent and are not reachable from {@link #getControllerStatus()}), so reporting tasks that + * wish to surface metrics for connector-managed flows must consult this method in addition to + * {@link #getControllerStatus()}. * * The default implementation returns an empty collection so that runtimes without Connector support — and existing * callers compiled against earlier versions of this interface — continue to work unchanged. * - * @return one status per Connector's managed Process Group; empty if no Connectors are registered or if the runtime - * does not support Connectors + * @return one status per Connector; empty if no Connectors are registered or if the runtime does not support + * Connectors */ - default Collection getConnectorStatuses() { + default Collection getConnectorStatuses() { return Collections.emptyList(); } From 30c00f5eb6dc3b74e99630f4556e13b7437a6ffd Mon Sep 17 00:00:00 2001 From: Kevin Doran Date: Mon, 1 Jun 2026 10:20:30 -0400 Subject: [PATCH 4/6] Drop Logging Attributes from ConnnectorInitializationContext --- .../ConnectorInitializationContext.java | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/src/main/java/org/apache/nifi/components/connector/ConnectorInitializationContext.java b/src/main/java/org/apache/nifi/components/connector/ConnectorInitializationContext.java index b8c688c..fa422b4 100644 --- a/src/main/java/org/apache/nifi/components/connector/ConnectorInitializationContext.java +++ b/src/main/java/org/apache/nifi/components/connector/ConnectorInitializationContext.java @@ -21,8 +21,6 @@ import org.apache.nifi.flow.VersionedExternalFlow; import org.apache.nifi.logging.ComponentLog; -import java.util.Map; - /** *

* The ConnectorInitializationContext provides context about how the connector is being run. @@ -113,31 +111,4 @@ default void updateFlow(FlowContext flowContext, VersionedExternalFlow versioned */ void updateFlow(FlowContext flowContext, VersionedExternalFlow versionedExternalFlow, BundleCompatibility bundleCompatability) throws FlowUpdateException; - /** - *

- * Sets custom logging attributes that the framework will include in the SLF4J {@code MDC} for every log line emitted - * by the Connector and by any component (Processor, Controller Service, etc.) running inside the Connector's managed - * flow. The given map replaces any previously set custom attributes. - *

- * - *

- * The framework reserves a set of well-known keys that describe the Connector itself (identity, bundle coordinate, - * etc.). Any entry in {@code attributes} whose key collides with a reserved framework-managed key is dropped and a - * warning is logged for that entry; the remaining entries are accepted. - *

- * - *

- * This method is intended to be called during or after {@link Connector#initialize(ConnectorInitializationContext) - * initialization}, for example once configuration has been applied and the Connector has values it wishes to surface - * (e.g. database name, source schema). It is safe to call repeatedly; each call replaces the prior set of custom - * attributes. - *

- * - * @param attributes the custom attributes to expose on logs from this Connector and its managed flow; must not be {@code null} - * @throws UnsupportedOperationException if the runtime implementation does not support custom logging attributes - */ - default void setLoggingAttributes(Map attributes) { - throw new UnsupportedOperationException(); - } - } From eedd6a714cac889769a98269cbcd3050508effac Mon Sep 17 00:00:00 2001 From: Kevin Doran Date: Tue, 2 Jun 2026 09:44:45 -0400 Subject: [PATCH 5/6] Restore accidentally-deleted blank line in AbstractConnector The blank line between the null-check and the return statement in getInitializationContext() was inadvertently removed in an earlier revision of this branch and not restored when the surrounding helper method was dropped. Addresses review feedback on PR #89. Co-authored-by: Cursor --- .../org/apache/nifi/components/connector/AbstractConnector.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java b/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java index b2ba7b6..7cc847a 100644 --- a/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java +++ b/src/main/java/org/apache/nifi/components/connector/AbstractConnector.java @@ -92,6 +92,7 @@ protected final ConnectorInitializationContext getInitializationContext() { if (initializationContext == null) { throw new IllegalStateException("Connector has not been initialized"); } + return initializationContext; } From ec90afdfd3141087ef8e0c190b11029cdb171414 Mon Sep 17 00:00:00 2001 From: Kevin Doran Date: Tue, 2 Jun 2026 10:46:44 -0400 Subject: [PATCH 6/6] Drop loggingAttributes from ProcessGroupStatus Per review feedback, remove the loggingAttributes snapshot field, its accessors, and the associated clone()/merge() plumbing from ProcessGroupStatus. The remaining ConnectorStatus type and EventAccess.getConnectorStatuses() provide connector identity to reporting consumers without adding a logging-attributes map to the Process Group status. Co-authored-by: Cursor --- .../controller/status/ProcessGroupStatus.java | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java b/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java index b10714d..9de9940 100644 --- a/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java +++ b/src/main/java/org/apache/nifi/controller/status/ProcessGroupStatus.java @@ -61,8 +61,6 @@ public class ProcessGroupStatus implements Cloneable { private ProcessingPerformanceStatus processingPerformanceStatus; - private Map loggingAttributes = Map.of(); - public String getId() { return id; } @@ -295,27 +293,6 @@ public void setProcessingPerformanceStatus(ProcessingPerformanceStatus processin this.processingPerformanceStatus = processingPerformanceStatus; } - /** - * Returns the snapshot of logging attributes (e.g. connector identity, NiFi {@code processGroup*} keys) that apply to - * this Process Group at the time the status was captured. The returned map is immutable. - * - * @return the logging attributes for this Process Group, or an empty map if none have been set - */ - public Map getLoggingAttributes() { - return loggingAttributes; - } - - /** - * Sets the snapshot of logging attributes (e.g. connector identity, NiFi {@code processGroup*} keys) that apply to - * this Process Group at the time the status was captured. An immutable defensive copy of the supplied map is stored; - * subsequent mutations of the caller's map have no effect. A {@code null} value is treated as an empty map. - * - * @param loggingAttributes the logging attributes for this Process Group - */ - public void setLoggingAttributes(final Map loggingAttributes) { - this.loggingAttributes = loggingAttributes == null ? Map.of() : Map.copyOf(loggingAttributes); - } - @Override public ProcessGroupStatus clone() { final ProcessGroupStatus clonedObj = new ProcessGroupStatus(); @@ -340,7 +317,6 @@ public ProcessGroupStatus clone() { clonedObj.bytesTransferred = bytesTransferred; clonedObj.processingNanos = processingNanos; clonedObj.processingPerformanceStatus = processingPerformanceStatus; - clonedObj.setLoggingAttributes(loggingAttributes); if (connectionStatus != null) { final Collection statusList = new ArrayList<>(); @@ -500,12 +476,6 @@ public static void merge(final ProcessGroupStatus target, final ProcessGroupStat } target.setRegisteredFlowSnapshotMetadata(toMerge.getRegisteredFlowSnapshotMetadata()); - if (!toMerge.getLoggingAttributes().isEmpty()) { - final Map mergedLoggingAttributes = new HashMap<>(target.getLoggingAttributes()); - mergedLoggingAttributes.putAll(toMerge.getLoggingAttributes()); - target.setLoggingAttributes(mergedLoggingAttributes); - } - // connection status // sort by id final Map mergedConnectionMap = new HashMap<>();