Apache nifi 以编程方式读取Nifi计数器值

Apache nifi 以编程方式读取Nifi计数器值,apache-nifi,Apache Nifi,我正在开发一个自定义处理器,我想在其中读取Nifi计数器的值。除了使用Nifi Rest Api“”,还有其他读取计数器值的方法吗?没有。Apache Nifi没有任何直接的Api可用于以编程方式读取计数器值。一种简单的方法是使用GetHTTP处理器并使用您提到的NiFi REST API URL:http://NiFi主机:端口/NiFi API/计数器 然后使用EvaluateJsonPath从GetHTTP处理器接收的JSON响应中解析并读取计数器值。否。Apache NiFi没有任何直接

我正在开发一个自定义处理器,我想在其中读取Nifi计数器的值。除了使用Nifi Rest Api“”,还有其他读取计数器值的方法吗?

没有。Apache Nifi没有任何直接的Api可用于以编程方式读取计数器值。一种简单的方法是使用
GetHTTP
处理器并使用您提到的NiFi REST API URL:
http://NiFi主机:端口/NiFi API/计数器


然后使用
EvaluateJsonPath
GetHTTP
处理器接收的JSON响应中解析并读取计数器值。

否。Apache NiFi没有任何直接的API可用于以编程方式读取计数器值。一种简单的方法是使用
GetHTTP
处理器并使用您提到的NiFi REST API URL:
http://NiFi主机:端口/NiFi API/计数器


然后使用
EvaluateJsonPath
GetHTTP
处理器接收的JSON响应中解析和读取计数器值。

虽然读取/写入计数器值不如修改流文件属性容易,但Apache NiFi确实有修改计数器的API。然而,计数器的目的是向人类用户提供信息,而不是让处理器根据其值做出决策。根据您试图实现的目标,您可能会更成功地使用本地地图或and。如果值仅与此处理器相关,则可以使用内存中的映射来存储和检索值。如果需要与其他处理器通信,请使用缓存()


Pierre Villard有,您可以使用来修改计数器值。由于计数器的设计不允许编程,因此无法从
RepositoryContext
对象检索
CounterRepository
实例。你可能还想读一些关于这方面的文章,因为根据你的目标,这可能是实现它的更好的方法

虽然读/写计数器值不如修改flowfile属性容易,但apachenifi确实有修改计数器的api。然而,计数器的目的是向人类用户提供信息,而不是让处理器根据其值做出决策。根据您试图实现的目标,您可能会更成功地使用本地地图或and。如果值仅与此处理器相关,则可以使用内存中的映射来存储和检索值。如果需要与其他处理器通信,请使用缓存()


Pierre Villard有,您可以使用来修改计数器值。由于计数器的设计不允许编程,因此无法从
RepositoryContext
对象检索
CounterRepository
实例。你可能还想读一些关于这方面的文章,因为根据你的目标,这可能是实现它的更好的方法

根据安迪的建议,我使用REFLECTION阅读了以下计数器:

private void  printCounters(ProcessSession session) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Class standardProcessSession=session.getClass();
        Field fieldContext = standardProcessSession.getDeclaredField("context");
        fieldContext.setAccessible(true);
        Object processContext =  fieldContext.get(session);
        Class processContextClass = processContext.getClass();
        Field fieldCounterRepo = processContextClass.getDeclaredField("counterRepo");
        fieldCounterRepo.setAccessible(true);
        Object counterRepo = fieldCounterRepo.get(processContext);
        Method declaredMethod = counterRepo.getClass().getDeclaredMethod("getCounters");

        ArrayList<Object> counters = (ArrayList<Object>)declaredMethod.invoke(counterRepo);
        for(Object obj:counters) {
            Method methodName = obj.getClass().getDeclaredMethod("getName");
            methodName.setAccessible(true);
            Method methodVal = obj.getClass().getDeclaredMethod("getValue");
            methodVal.setAccessible(true);
            System.out.println("Counter name: "+methodName.invoke(obj));
            System.out.println("Counter value: "+methodVal.invoke(obj));
        }
    }
private void打印计数器(ProcessSession会话)抛出NoSuchFieldException、SecurityException、IllegalArgumentException、IllegalAccessException、NoSuchMethodException、InvocationTargetException{
类standardProcessSession=session.getClass();
fieldContext=standardProcessSession.getDeclaredField(“上下文”);
fieldContext.setAccessible(true);
对象processContext=fieldContext.get(会话);
类processContextClass=processContext.getClass();
fieldCounterRepo=processContextClass.getDeclaredField(“counterRepo”);
fieldCounterRepo.setAccessible(真实);
Object counterRepo=fieldCounterRepo.get(processContext);
方法declaredMethod=counterRepo.getClass().getDeclaredMethod(“getCounters”);
ArrayList计数器=(ArrayList)declaredMethod.invoke(counterRepo);
用于(对象对象对象:计数器){
方法methodName=obj.getClass().getDeclaredMethod(“getName”);
methodName.setAccessible(true);
方法methodVal=obj.getClass().getDeclaredMethod(“getValue”);
methodVal.setAccessible(真);
System.out.println(“计数器名称:”+methodName.invoke(obj));
System.out.println(“计数器值:“+methodVal.invoke(obj));
}
}

注意:NIFI版本为1.5.0

根据Andy的建议,我使用REFLECTION阅读计数器如下:

private void  printCounters(ProcessSession session) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Class standardProcessSession=session.getClass();
        Field fieldContext = standardProcessSession.getDeclaredField("context");
        fieldContext.setAccessible(true);
        Object processContext =  fieldContext.get(session);
        Class processContextClass = processContext.getClass();
        Field fieldCounterRepo = processContextClass.getDeclaredField("counterRepo");
        fieldCounterRepo.setAccessible(true);
        Object counterRepo = fieldCounterRepo.get(processContext);
        Method declaredMethod = counterRepo.getClass().getDeclaredMethod("getCounters");

        ArrayList<Object> counters = (ArrayList<Object>)declaredMethod.invoke(counterRepo);
        for(Object obj:counters) {
            Method methodName = obj.getClass().getDeclaredMethod("getName");
            methodName.setAccessible(true);
            Method methodVal = obj.getClass().getDeclaredMethod("getValue");
            methodVal.setAccessible(true);
            System.out.println("Counter name: "+methodName.invoke(obj));
            System.out.println("Counter value: "+methodVal.invoke(obj));
        }
    }
private void打印计数器(ProcessSession会话)抛出NoSuchFieldException、SecurityException、IllegalArgumentException、IllegalAccessException、NoSuchMethodException、InvocationTargetException{
类standardProcessSession=session.getClass();
fieldContext=standardProcessSession.getDeclaredField(“上下文”);
fieldContext.setAccessible(true);
对象processContext=fieldContext.get(会话);
类processContextClass=processContext.getClass();
fieldCounterRepo=processContextClass.getDeclaredField(“counterRepo”);
fieldCounterRepo.setAccessible(真实);
Object counterRepo=fieldCounterRepo.get(processContext);
方法declaredMethod=counterRepo.getClass().getDeclaredMethod(“getCounters”);
ArrayList计数器=(ArrayList)declaredMethod.invoke(counterRepo);
用于(对象对象对象:计数器){
方法methodName=obj.getClass().getDeclaredMethod(“getName”);
methodName.setAccessible(true);
方法methodVal=obj.getClass().getDeclaredMethod(“getValue”);
methodVal.setAccessible(真);
System.out.println(“计数器名称:”+methodName.invoke(obj));
System.out.println(“计数器值:“+methodVal.invoke(obj));
}
}

注意:NIFI版本是1.5.0

你好,安迪,谢谢你的回复。我想尝试的是读取所有计数器值,并随时存储它们的状态。”调整