Apache nifi 监视自定义处理器中的背压计数和大小

Apache nifi 监视自定义处理器中的背压计数和大小,apache-nifi,Apache Nifi,我有一个定制处理器(NiFi 1.8.0),它已经根据需要修改传入的流文件。但是,在将文件传输到传出关系之前,我想检查该关系的背压是否接近于超过其阈值。如果是,那么我计划将流文件发送到另一个连接到PutFile处理器的关系,并将其写入磁盘 我知道我可以得到传入队列的数量和大小。但我不知道如何从传出关系的连接中获取计数和大小。有一个名为的控制器服务,它本质上发送Nifi中发生的每个事件的状态 如果您查看,您会发现它在检测背压方面几乎没有非常有用的属性- // fields for connecti

我有一个定制处理器(NiFi 1.8.0),它已经根据需要修改传入的流文件。但是,在将文件传输到传出关系之前,我想检查该关系的背压是否接近于超过其阈值。如果是,那么我计划将流文件发送到另一个连接到PutFile处理器的关系,并将其写入磁盘


我知道我可以得到传入队列的数量和大小。但我不知道如何从传出关系的连接中获取计数和大小。

有一个名为的控制器服务,它本质上发送Nifi中发生的每个事件的状态

如果您查看,您会发现它在检测背压方面几乎没有非常有用的属性-

// fields for connections
{ "name" : "sourceId", "type" : ["string", "null"]},
{ "name" : "sourceName", "type" : ["string", "null"]},
{ "name" : "destinationId", "type" : ["string", "null"]},
{ "name" : "destinationName", "type" : ["string", "null"]},
{ "name" : "maxQueuedBytes", "type" : ["long", "null"]},
{ "name" : "maxQueuedCount", "type" : ["long", "null"]},
{ "name" : "queuedBytes", "type" : ["long", "null"]},
{ "name" : "backPressureBytesThreshold", "type" : ["long", "null"]},
{ "name" : "backPressureObjectThreshold", "type" : ["long", "null"]},
{ "name" : "backPressureDataSizeThreshold", "type" : ["string", "null"]},
{ "name" : "isBackPressureEnabled", "type" : ["string", "null"]},

您可以使用此信息导出所需内容

我最终从ProcessGroupStatus对象中找到了连接:

String myProcessorId = this.getIdentifier();
int queuedCount = 0;
float queuedBytes = 0;
ProcessGroupStatus processGroupStatus = ((EventAccess) getControllerServiceLookup().getControllerStatus();

  if (processGroupStatus.getConnectionStatus() != null {
    Collection < CollectionStatus > groupConnections = processGroupStatus.getConnectionStatus();

    // Now have to iterate through groupConnections to find the one where the connection's source ID = myProcessorId and  
    // the connection's name = 'normal output' (this is the name of a relationship I added)

    ArrayList connections = new ArrayList <> (groupConnections);
    for (Object processorConnection : connections) {
     ConnectionStatus connection = (ConnectionStatus) processorConnection;

     if (connection.getName().equals("normal output") && connections.getSourceId.equals(myProcessorId)) {
      // Now I can grab the current count and size of the 'normal output' relationship
      // The back pressure threshold values can be grabbed from the connection as well
      queuedCount = connection.getQueuedCount();
      queuedBytes = connection.getQueuedBytes();
      break;
     }
    }
   }
String myProcessorId=this.getIdentifier();
int queuedCount=0;
float queuedBytes=0;
ProcessGroupStatus ProcessGroupStatus=((EventAccess)getControllerServiceLookup().getControllerStatus();
if(processGroupStatus.getConnectionStatus()!=null{
CollectiongroupConnections=processGroupStatus.getConnectionStatus();
//现在必须遍历groupConnections,以找到连接的源ID=myProcessorId和
//连接的名称='normal output'(这是我添加的关系的名称)
ArrayList connections=新的ArrayList(groupConnections);
用于(对象处理器连接:连接){
ConnectionStatus连接=(ConnectionStatus)处理器连接;
if(connection.getName().equals(“正常输出”)&&connections.getSourceId.equals(myProcessorId)){
//现在我可以获取“正常输出”关系的当前计数和大小
//也可以从连接处获取背压阈值
queuedCount=connection.getQueuedCount();
queuedBytes=connection.getQueuedBytes();
打破
}
}
}
以上仅检索parrent组中的连接。如果要查找的连接包含在子组中,则需要遍历子组:

ProcessGroupStatus processGroupStatus = ((EventAccess) getControllerServiceLookup().getControllerStatus();
ArrayList childProcessorGroups = new ArrayList < > (processGroupStatus.getProcessGroupStatus());
for (Object childProcessorGroup : childProcessorGroups) {
 ProcessGroupStatus childProcessGroupStatus = (ProcessGroupStatus) childProcessorGroup;
 Collection < CollectionStatus > groupConnections = childProcessGroupStatus.getConnectionStatus();
 // Then iterate through groupConnections as above
}
ProcessGroupStatus ProcessGroupStatus=((EventAccess)getControllerServiceLookup().getControllerStatus();
ArrayList childProcessorGroups=新建ArrayList<>(processGroupStatus.getProcessGroupStatus());
对于(对象childProcessorGroup:childProcessorGroup){
ProcessGroupStatus childProcessGroupStatus=(ProcessGroupStatus)childProcessorGroup;
CollectiongroupConnections=childProcessGroupStatus.getConnectionStatus();
//然后如上所述遍历groupConnections
}

NiFi getControllerServiceLookup()确实显示了一个“allConnections”变量,该变量包含所有组中所有处理器的所有连接。但似乎没有该变量的getter。如果有getter,您就不必担心要查找哪个组的连接。您可以简单地遍历“allConnections”并查找与您匹配的连接r处理器ID和关系名称。

在NiFi 1.10+中有一个QueryNifReportingTask,您可以在其中发出SQL查询以获取所需的字段(或任何内容),它们的名称应与上述报告任务的名称相同。如
SELECT*FROM CONNECTION\u STATUS,其中isBackPressureEnabled=true