mirror of
https://github.com/apache/nifi.git
synced 2025-02-06 10:08:42 +00:00
NIFI-13762 Expose processor metrics as a part of FlowInfo
Signed-off-by: Ferenc Kis <briansolo1985@gmail.com> This closes #9281.
This commit is contained in:
parent
516edf5d87
commit
c8bdbb19db
@ -59,6 +59,7 @@ public class C2ClientConfig {
|
|||||||
private final String c2AssetDirectory;
|
private final String c2AssetDirectory;
|
||||||
private final long bootstrapAcknowledgeTimeout;
|
private final long bootstrapAcknowledgeTimeout;
|
||||||
private final int c2FlowInfoProcessorBulletinLimit;
|
private final int c2FlowInfoProcessorBulletinLimit;
|
||||||
|
private final boolean c2FlowInfoProcessorStatusEnabled;
|
||||||
|
|
||||||
private C2ClientConfig(final Builder builder) {
|
private C2ClientConfig(final Builder builder) {
|
||||||
this.c2Url = builder.c2Url;
|
this.c2Url = builder.c2Url;
|
||||||
@ -90,6 +91,7 @@ public class C2ClientConfig {
|
|||||||
this.c2AssetDirectory = builder.c2AssetDirectory;
|
this.c2AssetDirectory = builder.c2AssetDirectory;
|
||||||
this.bootstrapAcknowledgeTimeout = builder.bootstrapAcknowledgeTimeout;
|
this.bootstrapAcknowledgeTimeout = builder.bootstrapAcknowledgeTimeout;
|
||||||
this.c2FlowInfoProcessorBulletinLimit = builder.c2FlowInfoProcessorBulletinLimit;
|
this.c2FlowInfoProcessorBulletinLimit = builder.c2FlowInfoProcessorBulletinLimit;
|
||||||
|
this.c2FlowInfoProcessorStatusEnabled = builder.c2FlowInfoProcessorStatusEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getC2Url() {
|
public String getC2Url() {
|
||||||
@ -208,6 +210,9 @@ public class C2ClientConfig {
|
|||||||
return c2FlowInfoProcessorBulletinLimit;
|
return c2FlowInfoProcessorBulletinLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isC2FlowInfoProcessorStatusEnabled() {
|
||||||
|
return c2FlowInfoProcessorStatusEnabled;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Builder for client configuration.
|
* Builder for client configuration.
|
||||||
*/
|
*/
|
||||||
@ -245,6 +250,7 @@ public class C2ClientConfig {
|
|||||||
private String c2AssetDirectory;
|
private String c2AssetDirectory;
|
||||||
private long bootstrapAcknowledgeTimeout;
|
private long bootstrapAcknowledgeTimeout;
|
||||||
private int c2FlowInfoProcessorBulletinLimit;
|
private int c2FlowInfoProcessorBulletinLimit;
|
||||||
|
private boolean c2FlowInfoProcessorStatusEnabled;
|
||||||
|
|
||||||
public Builder c2Url(String c2Url) {
|
public Builder c2Url(String c2Url) {
|
||||||
this.c2Url = c2Url;
|
this.c2Url = c2Url;
|
||||||
@ -401,6 +407,11 @@ public class C2ClientConfig {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder c2FlowInfoProcessorStatusEnabled(boolean c2FlowInfoProcessorStatusEnabled) {
|
||||||
|
this.c2FlowInfoProcessorStatusEnabled = c2FlowInfoProcessorStatusEnabled;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public C2ClientConfig build() {
|
public C2ClientConfig build() {
|
||||||
return new C2ClientConfig(this);
|
return new C2ClientConfig(this);
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,7 @@ import org.apache.nifi.c2.protocol.api.AgentRepositories;
|
|||||||
import org.apache.nifi.c2.protocol.api.AgentResourceConsumption;
|
import org.apache.nifi.c2.protocol.api.AgentResourceConsumption;
|
||||||
import org.apache.nifi.c2.protocol.api.AgentStatus;
|
import org.apache.nifi.c2.protocol.api.AgentStatus;
|
||||||
import org.apache.nifi.c2.protocol.api.ProcessorBulletin;
|
import org.apache.nifi.c2.protocol.api.ProcessorBulletin;
|
||||||
|
import org.apache.nifi.c2.protocol.api.ProcessorStatus;
|
||||||
import org.apache.nifi.c2.protocol.api.ResourceInfo;
|
import org.apache.nifi.c2.protocol.api.ResourceInfo;
|
||||||
import org.apache.nifi.c2.protocol.api.C2Heartbeat;
|
import org.apache.nifi.c2.protocol.api.C2Heartbeat;
|
||||||
import org.apache.nifi.c2.protocol.api.DeviceInfo;
|
import org.apache.nifi.c2.protocol.api.DeviceInfo;
|
||||||
@ -91,7 +92,7 @@ public class C2HeartbeatFactory {
|
|||||||
|
|
||||||
heartbeat.setAgentInfo(getAgentInfo(runtimeInfoWrapper.getAgentRepositories(), runtimeInfoWrapper.getManifest()));
|
heartbeat.setAgentInfo(getAgentInfo(runtimeInfoWrapper.getAgentRepositories(), runtimeInfoWrapper.getManifest()));
|
||||||
heartbeat.setDeviceInfo(generateDeviceInfo());
|
heartbeat.setDeviceInfo(generateDeviceInfo());
|
||||||
heartbeat.setFlowInfo(getFlowInfo(runtimeInfoWrapper.getQueueStatus(), runtimeInfoWrapper.getProcessorBulletins()));
|
heartbeat.setFlowInfo(getFlowInfo(runtimeInfoWrapper.getQueueStatus(), runtimeInfoWrapper.getProcessorBulletins(), runtimeInfoWrapper.getProcessorStatus()));
|
||||||
heartbeat.setCreated(System.currentTimeMillis());
|
heartbeat.setCreated(System.currentTimeMillis());
|
||||||
|
|
||||||
ResourceInfo resourceInfo = new ResourceInfo();
|
ResourceInfo resourceInfo = new ResourceInfo();
|
||||||
@ -101,10 +102,11 @@ public class C2HeartbeatFactory {
|
|||||||
return heartbeat;
|
return heartbeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
private FlowInfo getFlowInfo(Map<String, FlowQueueStatus> queueStatus, List<ProcessorBulletin> processorBulletins) {
|
private FlowInfo getFlowInfo(Map<String, FlowQueueStatus> queueStatus, List<ProcessorBulletin> processorBulletins, List<ProcessorStatus> processorStatus) {
|
||||||
FlowInfo flowInfo = new FlowInfo();
|
FlowInfo flowInfo = new FlowInfo();
|
||||||
flowInfo.setQueues(queueStatus);
|
flowInfo.setQueues(queueStatus);
|
||||||
flowInfo.setProcessorBulletins(processorBulletins);
|
flowInfo.setProcessorBulletins(processorBulletins);
|
||||||
|
flowInfo.setProcessorStatuses(processorStatus);
|
||||||
Optional.ofNullable(flowIdHolder.getFlowId()).ifPresent(flowInfo::setFlowId);
|
Optional.ofNullable(flowIdHolder.getFlowId()).ifPresent(flowInfo::setFlowId);
|
||||||
return flowInfo;
|
return flowInfo;
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ import java.util.Map;
|
|||||||
import org.apache.nifi.c2.protocol.api.AgentRepositories;
|
import org.apache.nifi.c2.protocol.api.AgentRepositories;
|
||||||
import org.apache.nifi.c2.protocol.api.FlowQueueStatus;
|
import org.apache.nifi.c2.protocol.api.FlowQueueStatus;
|
||||||
import org.apache.nifi.c2.protocol.api.ProcessorBulletin;
|
import org.apache.nifi.c2.protocol.api.ProcessorBulletin;
|
||||||
|
import org.apache.nifi.c2.protocol.api.ProcessorStatus;
|
||||||
import org.apache.nifi.c2.protocol.component.api.RuntimeManifest;
|
import org.apache.nifi.c2.protocol.component.api.RuntimeManifest;
|
||||||
|
|
||||||
public class RuntimeInfoWrapper {
|
public class RuntimeInfoWrapper {
|
||||||
@ -28,12 +29,15 @@ public class RuntimeInfoWrapper {
|
|||||||
final RuntimeManifest manifest;
|
final RuntimeManifest manifest;
|
||||||
final Map<String, FlowQueueStatus> queueStatus;
|
final Map<String, FlowQueueStatus> queueStatus;
|
||||||
final List<ProcessorBulletin> processorBulletins;
|
final List<ProcessorBulletin> processorBulletins;
|
||||||
|
final List<ProcessorStatus> processorStatus;
|
||||||
|
|
||||||
public RuntimeInfoWrapper(AgentRepositories repos, RuntimeManifest manifest, Map<String, FlowQueueStatus> queueStatus, List<ProcessorBulletin> processorBulletins) {
|
public RuntimeInfoWrapper(AgentRepositories repos, RuntimeManifest manifest, Map<String, FlowQueueStatus> queueStatus, List<ProcessorBulletin> processorBulletins,
|
||||||
|
List<ProcessorStatus> processorStatus) {
|
||||||
this.repos = repos;
|
this.repos = repos;
|
||||||
this.manifest = manifest;
|
this.manifest = manifest;
|
||||||
this.queueStatus = queueStatus;
|
this.queueStatus = queueStatus;
|
||||||
this.processorBulletins = processorBulletins;
|
this.processorBulletins = processorBulletins;
|
||||||
|
this.processorStatus = processorStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AgentRepositories getAgentRepositories() {
|
public AgentRepositories getAgentRepositories() {
|
||||||
@ -51,4 +55,8 @@ public class RuntimeInfoWrapper {
|
|||||||
public List<ProcessorBulletin> getProcessorBulletins() {
|
public List<ProcessorBulletin> getProcessorBulletins() {
|
||||||
return processorBulletins;
|
return processorBulletins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<ProcessorStatus> getProcessorStatus() {
|
||||||
|
return processorStatus;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ import org.apache.nifi.c2.protocol.api.C2Heartbeat;
|
|||||||
import org.apache.nifi.c2.protocol.api.FlowQueueStatus;
|
import org.apache.nifi.c2.protocol.api.FlowQueueStatus;
|
||||||
import org.apache.nifi.c2.protocol.api.OperationType;
|
import org.apache.nifi.c2.protocol.api.OperationType;
|
||||||
import org.apache.nifi.c2.protocol.api.ProcessorBulletin;
|
import org.apache.nifi.c2.protocol.api.ProcessorBulletin;
|
||||||
|
import org.apache.nifi.c2.protocol.api.ProcessorStatus;
|
||||||
import org.apache.nifi.c2.protocol.api.SupportedOperation;
|
import org.apache.nifi.c2.protocol.api.SupportedOperation;
|
||||||
import org.apache.nifi.c2.protocol.api.ResourcesGlobalHash;
|
import org.apache.nifi.c2.protocol.api.ResourcesGlobalHash;
|
||||||
import org.apache.nifi.c2.protocol.component.api.Bundle;
|
import org.apache.nifi.c2.protocol.component.api.Bundle;
|
||||||
@ -121,13 +122,15 @@ public class C2HeartbeatFactoryTest {
|
|||||||
RuntimeManifest manifest = createManifest();
|
RuntimeManifest manifest = createManifest();
|
||||||
Map<String, FlowQueueStatus> queueStatus = new HashMap<>();
|
Map<String, FlowQueueStatus> queueStatus = new HashMap<>();
|
||||||
List<ProcessorBulletin> processorBulletins = new ArrayList<>();
|
List<ProcessorBulletin> processorBulletins = new ArrayList<>();
|
||||||
|
List<ProcessorStatus> processorStatus = new ArrayList<>();
|
||||||
|
|
||||||
C2Heartbeat heartbeat = c2HeartbeatFactory.create(new RuntimeInfoWrapper(repos, manifest, queueStatus, processorBulletins));
|
C2Heartbeat heartbeat = c2HeartbeatFactory.create(new RuntimeInfoWrapper(repos, manifest, queueStatus, processorBulletins, processorStatus));
|
||||||
|
|
||||||
assertEquals(repos, heartbeat.getAgentInfo().getStatus().getRepositories());
|
assertEquals(repos, heartbeat.getAgentInfo().getStatus().getRepositories());
|
||||||
assertEquals(manifest, heartbeat.getAgentInfo().getAgentManifest());
|
assertEquals(manifest, heartbeat.getAgentInfo().getAgentManifest());
|
||||||
assertEquals(queueStatus, heartbeat.getFlowInfo().getQueues());
|
assertEquals(queueStatus, heartbeat.getFlowInfo().getQueues());
|
||||||
assertEquals(processorBulletins, heartbeat.getFlowInfo().getProcessorBulletins());
|
assertEquals(processorBulletins, heartbeat.getFlowInfo().getProcessorBulletins());
|
||||||
|
assertEquals(processorStatus, heartbeat.getFlowInfo().getProcessorStatuses());
|
||||||
assertEquals(RESOURCE_HASH, heartbeat.getResourceInfo().getHash());
|
assertEquals(RESOURCE_HASH, heartbeat.getResourceInfo().getHash());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,13 +143,15 @@ public class C2HeartbeatFactoryTest {
|
|||||||
RuntimeManifest manifest = createManifest();
|
RuntimeManifest manifest = createManifest();
|
||||||
Map<String, FlowQueueStatus> queueStatus = new HashMap<>();
|
Map<String, FlowQueueStatus> queueStatus = new HashMap<>();
|
||||||
List<ProcessorBulletin> processorBulletins = new ArrayList<>();
|
List<ProcessorBulletin> processorBulletins = new ArrayList<>();
|
||||||
|
List<ProcessorStatus> processorStatus = new ArrayList<>();
|
||||||
|
|
||||||
C2Heartbeat heartbeat = c2HeartbeatFactory.create(new RuntimeInfoWrapper(repos, manifest, queueStatus, processorBulletins));
|
C2Heartbeat heartbeat = c2HeartbeatFactory.create(new RuntimeInfoWrapper(repos, manifest, queueStatus, processorBulletins, processorStatus));
|
||||||
|
|
||||||
assertEquals(repos, heartbeat.getAgentInfo().getStatus().getRepositories());
|
assertEquals(repos, heartbeat.getAgentInfo().getStatus().getRepositories());
|
||||||
assertNull(heartbeat.getAgentInfo().getAgentManifest());
|
assertNull(heartbeat.getAgentInfo().getAgentManifest());
|
||||||
assertEquals(queueStatus, heartbeat.getFlowInfo().getQueues());
|
assertEquals(queueStatus, heartbeat.getFlowInfo().getQueues());
|
||||||
assertEquals(processorBulletins, heartbeat.getFlowInfo().getProcessorBulletins());
|
assertEquals(processorBulletins, heartbeat.getFlowInfo().getProcessorBulletins());
|
||||||
|
assertEquals(processorStatus, heartbeat.getFlowInfo().getProcessorStatuses());
|
||||||
assertEquals(RESOURCE_HASH, heartbeat.getResourceInfo().getHash());
|
assertEquals(RESOURCE_HASH, heartbeat.getResourceInfo().getHash());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +168,7 @@ public class C2HeartbeatFactoryTest {
|
|||||||
when(manifestHashProvider.calculateManifestHash(manifest.getBundles(), Collections.emptySet())).thenReturn(MANIFEST_HASH);
|
when(manifestHashProvider.calculateManifestHash(manifest.getBundles(), Collections.emptySet())).thenReturn(MANIFEST_HASH);
|
||||||
when(resourcesGlobalHashSupplier.get()).thenReturn(createResourcesGlobalHash());
|
when(resourcesGlobalHashSupplier.get()).thenReturn(createResourcesGlobalHash());
|
||||||
|
|
||||||
C2Heartbeat heartbeat = c2HeartbeatFactory.create(new RuntimeInfoWrapper(new AgentRepositories(), manifest, new HashMap<>(), new ArrayList<>()));
|
C2Heartbeat heartbeat = c2HeartbeatFactory.create(new RuntimeInfoWrapper(new AgentRepositories(), manifest, new HashMap<>(), new ArrayList<>(), new ArrayList<>()));
|
||||||
|
|
||||||
assertEquals(MANIFEST_HASH, heartbeat.getAgentInfo().getAgentManifestHash());
|
assertEquals(MANIFEST_HASH, heartbeat.getAgentInfo().getAgentManifestHash());
|
||||||
assertEquals(RESOURCE_HASH, heartbeat.getResourceInfo().getHash());
|
assertEquals(RESOURCE_HASH, heartbeat.getResourceInfo().getHash());
|
||||||
@ -179,7 +184,7 @@ public class C2HeartbeatFactoryTest {
|
|||||||
when(manifestHashProvider.calculateManifestHash(manifest.getBundles(), supportedOperations)).thenReturn(MANIFEST_HASH);
|
when(manifestHashProvider.calculateManifestHash(manifest.getBundles(), supportedOperations)).thenReturn(MANIFEST_HASH);
|
||||||
when(resourcesGlobalHashSupplier.get()).thenReturn(createResourcesGlobalHash());
|
when(resourcesGlobalHashSupplier.get()).thenReturn(createResourcesGlobalHash());
|
||||||
|
|
||||||
C2Heartbeat heartbeat = c2HeartbeatFactory.create(new RuntimeInfoWrapper(new AgentRepositories(), manifest, new HashMap<>(), new ArrayList<>()));
|
C2Heartbeat heartbeat = c2HeartbeatFactory.create(new RuntimeInfoWrapper(new AgentRepositories(), manifest, new HashMap<>(), new ArrayList<>(), new ArrayList<>()));
|
||||||
|
|
||||||
assertEquals(MANIFEST_HASH, heartbeat.getAgentInfo().getAgentManifestHash());
|
assertEquals(MANIFEST_HASH, heartbeat.getAgentInfo().getAgentManifestHash());
|
||||||
assertEquals(RESOURCE_HASH, heartbeat.getResourceInfo().getHash());
|
assertEquals(RESOURCE_HASH, heartbeat.getResourceInfo().getHash());
|
||||||
|
@ -58,7 +58,7 @@ public class DescribeManifestOperationHandlerTest {
|
|||||||
void testDescribeManifestOperationHandlerPopulatesAckSuccessfully() {
|
void testDescribeManifestOperationHandlerPopulatesAckSuccessfully() {
|
||||||
RuntimeManifest manifest = new RuntimeManifest();
|
RuntimeManifest manifest = new RuntimeManifest();
|
||||||
manifest.setIdentifier("manifestId");
|
manifest.setIdentifier("manifestId");
|
||||||
RuntimeInfoWrapper runtimeInfoWrapper = new RuntimeInfoWrapper(null, manifest, null, null);
|
RuntimeInfoWrapper runtimeInfoWrapper = new RuntimeInfoWrapper(null, manifest, null, null, null);
|
||||||
|
|
||||||
C2Heartbeat heartbeat = new C2Heartbeat();
|
C2Heartbeat heartbeat = new C2Heartbeat();
|
||||||
AgentInfo agentInfo = new AgentInfo();
|
AgentInfo agentInfo = new AgentInfo();
|
||||||
|
@ -31,6 +31,7 @@ public class FlowInfo implements Serializable {
|
|||||||
private Map<String, ComponentStatus> components;
|
private Map<String, ComponentStatus> components;
|
||||||
private Map<String, FlowQueueStatus> queues;
|
private Map<String, FlowQueueStatus> queues;
|
||||||
private List<ProcessorBulletin> processorBulletins;
|
private List<ProcessorBulletin> processorBulletins;
|
||||||
|
private List<ProcessorStatus> processorStatuses;
|
||||||
|
|
||||||
@Schema(description = "A unique identifier of the flow currently deployed on the agent")
|
@Schema(description = "A unique identifier of the flow currently deployed on the agent")
|
||||||
public String getFlowId() {
|
public String getFlowId() {
|
||||||
@ -77,4 +78,12 @@ public class FlowInfo implements Serializable {
|
|||||||
this.processorBulletins = processorBulletins;
|
this.processorBulletins = processorBulletins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Schema(description = "Status and metrics for each processors")
|
||||||
|
public List<ProcessorStatus> getProcessorStatuses() {
|
||||||
|
return processorStatuses;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProcessorStatuses(List<ProcessorStatus> processorStatuses) {
|
||||||
|
this.processorStatuses = processorStatuses;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,148 @@
|
|||||||
|
/*
|
||||||
|
* 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.c2.protocol.api;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class ProcessorStatus implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
private String groupId;
|
||||||
|
private long bytesRead;
|
||||||
|
private long bytesWritten;
|
||||||
|
private long flowFilesIn;
|
||||||
|
private long flowFilesOut;
|
||||||
|
private long bytesIn;
|
||||||
|
private long bytesOut;
|
||||||
|
private int invocations;
|
||||||
|
private long processingNanos;
|
||||||
|
private int activeThreadCount;
|
||||||
|
private int terminatedThreadCount;
|
||||||
|
|
||||||
|
@Schema(description = "The id of the processor")
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "The group id of the processor")
|
||||||
|
public String getGroupId() {
|
||||||
|
return groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGroupId(String groupId) {
|
||||||
|
this.groupId = groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "The number of bytes read by the processor")
|
||||||
|
public long getBytesRead() {
|
||||||
|
return bytesRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBytesRead(long bytesRead) {
|
||||||
|
this.bytesRead = bytesRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "The number of bytes written by the processor")
|
||||||
|
public long getBytesWritten() {
|
||||||
|
return bytesWritten;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBytesWritten(long bytesWritten) {
|
||||||
|
this.bytesWritten = bytesWritten;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "The number of accepted flow files")
|
||||||
|
public long getFlowFilesIn() {
|
||||||
|
return flowFilesIn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFlowFilesIn(long flowFilesIn) {
|
||||||
|
this.flowFilesIn = flowFilesIn;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "The number of transferred flow files")
|
||||||
|
public long getFlowFilesOut() {
|
||||||
|
return flowFilesOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFlowFilesOut(long flowFilesOut) {
|
||||||
|
this.flowFilesOut = flowFilesOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "The size of accepted flow files")
|
||||||
|
public long getBytesIn() {
|
||||||
|
return bytesIn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBytesIn(long bytesIn) {
|
||||||
|
this.bytesIn = bytesIn;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "The size of transferred flow files")
|
||||||
|
public long getBytesOut() {
|
||||||
|
return bytesOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBytesOut(long bytesOut) {
|
||||||
|
this.bytesOut = bytesOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "The number of invocations")
|
||||||
|
public int getInvocations() {
|
||||||
|
return invocations;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInvocations(int invocations) {
|
||||||
|
this.invocations = invocations;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "The number of nanoseconds that the processor has spent running")
|
||||||
|
public long getProcessingNanos() {
|
||||||
|
return processingNanos;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProcessingNanos(long processingNanos) {
|
||||||
|
this.processingNanos = processingNanos;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "The number of active threads currently executing")
|
||||||
|
public int getActiveThreadCount() {
|
||||||
|
return activeThreadCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setActiveThreadCount(int activeThreadCount) {
|
||||||
|
this.activeThreadCount = activeThreadCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "The number of threads currently terminated")
|
||||||
|
public int getTerminatedThreadCount() {
|
||||||
|
return terminatedThreadCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTerminatedThreadCount(int terminatedThreadCount) {
|
||||||
|
this.terminatedThreadCount = terminatedThreadCount;
|
||||||
|
}
|
||||||
|
}
|
@ -93,6 +93,7 @@ public enum MiNiFiProperties {
|
|||||||
C2_REQUEST_COMPRESSION("c2.request.compression", "none", false, true, VALID),
|
C2_REQUEST_COMPRESSION("c2.request.compression", "none", false, true, VALID),
|
||||||
C2_BOOTSTRAP_ACKNOWLEDGE_TIMEOUT("c2.bootstrap.acknowledge.timeout", "15 sec", false, true, VALID),
|
C2_BOOTSTRAP_ACKNOWLEDGE_TIMEOUT("c2.bootstrap.acknowledge.timeout", "15 sec", false, true, VALID),
|
||||||
C2_FLOW_INFO_PROCESSOR_BULLETIN_LIMIT("c2.flow.info.processor.bulletin.limit", "1000", false, true, NON_NEGATIVE_INTEGER_VALIDATOR ),
|
C2_FLOW_INFO_PROCESSOR_BULLETIN_LIMIT("c2.flow.info.processor.bulletin.limit", "1000", false, true, NON_NEGATIVE_INTEGER_VALIDATOR ),
|
||||||
|
C2_FLOW_INFO_PROCESSOR_STATUS_ENABLED("c2.flow.info.processor.status.enabled", "true", false, true, BOOLEAN_VALIDATOR),
|
||||||
NIFI_MINIFI_NOTIFIER_INGESTORS("nifi.minifi.notifier.ingestors", null, false, true, VALID),
|
NIFI_MINIFI_NOTIFIER_INGESTORS("nifi.minifi.notifier.ingestors", null, false, true, VALID),
|
||||||
NIFI_MINIFI_NOTIFIER_INGESTORS_FILE_CONFIG_PATH("nifi.minifi.notifier.ingestors.file.config.path", null, false, true, VALID),
|
NIFI_MINIFI_NOTIFIER_INGESTORS_FILE_CONFIG_PATH("nifi.minifi.notifier.ingestors.file.config.path", null, false, true, VALID),
|
||||||
NIFI_MINIFI_NOTIFIER_INGESTORS_FILE_POLLING_PERIOD_SECONDS("nifi.minifi.notifier.ingestors.file.polling.period.seconds", null, false, true, NON_NEGATIVE_INTEGER_VALIDATOR),
|
NIFI_MINIFI_NOTIFIER_INGESTORS_FILE_POLLING_PERIOD_SECONDS("nifi.minifi.notifier.ingestors.file.polling.period.seconds", null, false, true, NON_NEGATIVE_INTEGER_VALIDATOR),
|
||||||
|
@ -31,6 +31,7 @@ import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_AGENT_IDENT
|
|||||||
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_ASSET_DIRECTORY;
|
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_ASSET_DIRECTORY;
|
||||||
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_BOOTSTRAP_ACKNOWLEDGE_TIMEOUT;
|
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_BOOTSTRAP_ACKNOWLEDGE_TIMEOUT;
|
||||||
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_CONFIG_DIRECTORY;
|
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_CONFIG_DIRECTORY;
|
||||||
|
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_FLOW_INFO_PROCESSOR_STATUS_ENABLED;
|
||||||
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_FULL_HEARTBEAT;
|
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_FULL_HEARTBEAT;
|
||||||
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_KEEP_ALIVE_DURATION;
|
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_KEEP_ALIVE_DURATION;
|
||||||
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_MAX_IDLE_CONNECTIONS;
|
import static org.apache.nifi.minifi.commons.api.MiNiFiProperties.C2_MAX_IDLE_CONNECTIONS;
|
||||||
@ -95,6 +96,7 @@ import org.apache.nifi.c2.protocol.api.AgentRepositories;
|
|||||||
import org.apache.nifi.c2.protocol.api.AgentRepositoryStatus;
|
import org.apache.nifi.c2.protocol.api.AgentRepositoryStatus;
|
||||||
import org.apache.nifi.c2.protocol.api.FlowQueueStatus;
|
import org.apache.nifi.c2.protocol.api.FlowQueueStatus;
|
||||||
import org.apache.nifi.c2.protocol.api.ProcessorBulletin;
|
import org.apache.nifi.c2.protocol.api.ProcessorBulletin;
|
||||||
|
import org.apache.nifi.c2.protocol.api.ProcessorStatus;
|
||||||
import org.apache.nifi.c2.serializer.C2JacksonSerializer;
|
import org.apache.nifi.c2.serializer.C2JacksonSerializer;
|
||||||
import org.apache.nifi.c2.serializer.C2Serializer;
|
import org.apache.nifi.c2.serializer.C2Serializer;
|
||||||
import org.apache.nifi.controller.FlowController;
|
import org.apache.nifi.controller.FlowController;
|
||||||
@ -180,7 +182,9 @@ public class C2NifiClientService {
|
|||||||
|
|
||||||
this.c2OperationManager = new C2OperationManager(
|
this.c2OperationManager = new C2OperationManager(
|
||||||
client, c2OperationHandlerProvider, heartbeatLock, operationQueueDAO, c2OperationRestartHandler);
|
client, c2OperationHandlerProvider, heartbeatLock, operationQueueDAO, c2OperationRestartHandler);
|
||||||
Supplier<RuntimeInfoWrapper> runtimeInfoWrapperSupplier = () -> generateRuntimeInfo(clientConfig.getC2FlowInfoProcessorBulletinLimit());
|
Supplier<RuntimeInfoWrapper> runtimeInfoWrapperSupplier = () -> generateRuntimeInfo(
|
||||||
|
clientConfig.getC2FlowInfoProcessorBulletinLimit(),
|
||||||
|
clientConfig.isC2FlowInfoProcessorStatusEnabled());
|
||||||
this.c2HeartbeatManager = new C2HeartbeatManager(
|
this.c2HeartbeatManager = new C2HeartbeatManager(
|
||||||
client, heartbeatFactory, heartbeatLock, runtimeInfoWrapperSupplier, c2OperationManager);
|
client, heartbeatFactory, heartbeatLock, runtimeInfoWrapperSupplier, c2OperationManager);
|
||||||
}
|
}
|
||||||
@ -216,6 +220,8 @@ public class C2NifiClientService {
|
|||||||
.bootstrapAcknowledgeTimeout(durationPropertyInMilliSecs(properties, C2_BOOTSTRAP_ACKNOWLEDGE_TIMEOUT))
|
.bootstrapAcknowledgeTimeout(durationPropertyInMilliSecs(properties, C2_BOOTSTRAP_ACKNOWLEDGE_TIMEOUT))
|
||||||
.c2FlowInfoProcessorBulletinLimit(parseInt(properties
|
.c2FlowInfoProcessorBulletinLimit(parseInt(properties
|
||||||
.getProperty(C2_FLOW_INFO_PROCESSOR_BULLETIN_LIMIT.getKey(), C2_FLOW_INFO_PROCESSOR_BULLETIN_LIMIT.getDefaultValue())))
|
.getProperty(C2_FLOW_INFO_PROCESSOR_BULLETIN_LIMIT.getKey(), C2_FLOW_INFO_PROCESSOR_BULLETIN_LIMIT.getDefaultValue())))
|
||||||
|
.c2FlowInfoProcessorStatusEnabled(parseBoolean(properties
|
||||||
|
.getProperty(C2_FLOW_INFO_PROCESSOR_STATUS_ENABLED.getKey(), C2_FLOW_INFO_PROCESSOR_STATUS_ENABLED.getDefaultValue())))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,7 +248,8 @@ public class C2NifiClientService {
|
|||||||
new StandardFlowEnrichService(niFiProperties), flowPropertyEncryptor,
|
new StandardFlowEnrichService(niFiProperties), flowPropertyEncryptor,
|
||||||
StandardFlowSerDeService.defaultInstance(), niFiProperties.getProperty(FLOW_CONFIGURATION_FILE));
|
StandardFlowSerDeService.defaultInstance(), niFiProperties.getProperty(FLOW_CONFIGURATION_FILE));
|
||||||
Supplier<RuntimeInfoWrapper> runtimeInfoWrapperSupplier = () -> generateRuntimeInfo(
|
Supplier<RuntimeInfoWrapper> runtimeInfoWrapperSupplier = () -> generateRuntimeInfo(
|
||||||
parseInt(niFiProperties.getProperty(C2_FLOW_INFO_PROCESSOR_BULLETIN_LIMIT.getKey(), C2_FLOW_INFO_PROCESSOR_BULLETIN_LIMIT.getDefaultValue())));
|
parseInt(niFiProperties.getProperty(C2_FLOW_INFO_PROCESSOR_BULLETIN_LIMIT.getKey(), C2_FLOW_INFO_PROCESSOR_BULLETIN_LIMIT.getDefaultValue())),
|
||||||
|
parseBoolean(niFiProperties.getProperty(C2_FLOW_INFO_PROCESSOR_STATUS_ENABLED.getKey(), C2_FLOW_INFO_PROCESSOR_STATUS_ENABLED.getDefaultValue())));
|
||||||
|
|
||||||
return new C2OperationHandlerProvider(List.of(
|
return new C2OperationHandlerProvider(List.of(
|
||||||
new UpdateConfigurationOperationHandler(client, flowIdHolder, updateConfigurationStrategy, emptyOperandPropertiesProvider),
|
new UpdateConfigurationOperationHandler(client, flowIdHolder, updateConfigurationStrategy, emptyOperandPropertiesProvider),
|
||||||
@ -283,10 +290,15 @@ public class C2NifiClientService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized RuntimeInfoWrapper generateRuntimeInfo(int processorBulletinLimit) {
|
private synchronized RuntimeInfoWrapper generateRuntimeInfo(int processorBulletinLimit, boolean processorStatusEnabled) {
|
||||||
AgentManifest agentManifest = new AgentManifest(runtimeManifestService.getManifest());
|
AgentManifest agentManifest = new AgentManifest(runtimeManifestService.getManifest());
|
||||||
agentManifest.setSupportedOperations(supportedOperationsProvider.getSupportedOperations());
|
agentManifest.setSupportedOperations(supportedOperationsProvider.getSupportedOperations());
|
||||||
return new RuntimeInfoWrapper(getAgentRepositories(), agentManifest, getQueueStatus(), getBulletins(processorBulletinLimit));
|
return new RuntimeInfoWrapper(
|
||||||
|
getAgentRepositories(),
|
||||||
|
agentManifest,
|
||||||
|
getQueueStatus(),
|
||||||
|
getBulletins(processorBulletinLimit),
|
||||||
|
getProcessorStatus(processorStatusEnabled));
|
||||||
}
|
}
|
||||||
|
|
||||||
private AgentRepositories getAgentRepositories() {
|
private AgentRepositories getAgentRepositories() {
|
||||||
@ -367,4 +379,33 @@ public class C2NifiClientService {
|
|||||||
}
|
}
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<ProcessorStatus> getProcessorStatus(boolean processorStatusEnabled) {
|
||||||
|
if (processorStatusEnabled) {
|
||||||
|
return flowController.getEventAccess()
|
||||||
|
.getGroupStatus(ROOT_GROUP_ID)
|
||||||
|
.getProcessorStatus()
|
||||||
|
.stream()
|
||||||
|
.map(this::convertProcessorStatus)
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ProcessorStatus convertProcessorStatus(org.apache.nifi.controller.status.ProcessorStatus processorStatus) {
|
||||||
|
ProcessorStatus result = new ProcessorStatus();
|
||||||
|
result.setId(processorStatus.getId());
|
||||||
|
result.setGroupId(processorStatus.getGroupId());
|
||||||
|
result.setBytesRead(processorStatus.getBytesRead());
|
||||||
|
result.setBytesWritten(processorStatus.getBytesWritten());
|
||||||
|
result.setFlowFilesIn(processorStatus.getFlowFilesReceived());
|
||||||
|
result.setFlowFilesOut(processorStatus.getFlowFilesSent());
|
||||||
|
result.setBytesIn(processorStatus.getBytesReceived());
|
||||||
|
result.setBytesOut(processorStatus.getBytesSent());
|
||||||
|
result.setInvocations(processorStatus.getInvocations());
|
||||||
|
result.setProcessingNanos(processorStatus.getProcessingNanos());
|
||||||
|
result.setActiveThreadCount(processorStatus.getActiveThreadCount());
|
||||||
|
result.setTerminatedThreadCount(processorStatus.getTerminatedThreadCount());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user