Прочитайте значение счетчика Нифи программно - PullRequest
0 голосов
/ 13 мая 2018

Я занимаюсь разработкой собственного процессора, в котором я хочу прочитать значение счетчиков Nifi.Есть ли способ прочитать значение счетчиков, кроме использования Nifi Rest Api "http://nifi -host: port / nifi-api / counters "?

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Хотя считывать / записывать значения счетчиков не так просто, как изменять атрибуты потокового файла, в Apache NiFi действительно есть API для изменения счетчиков. Однако целью счетчиков является предоставление информации пользователям, а не процессорам, которые принимают решения на основе их значений. В зависимости от того, что вы пытаетесь достичь, вы можете добиться большего успеха, используя локальные карты или DistributedMapCacheServer и DistributedMapCacheClientService. Если значения имеют отношение только к этому процессору, вы можете просто использовать карту в памяти для хранения и извлечения значений. Если вам нужно общаться с другими процессорами, используйте кеш ( пример здесь ).

Пьер Виллар написал хорошее руководство по использованию счетчиков , и вы можете использовать ProcessSession#adjustCounter(String counter, int delta, boolean immediate) для изменения значений счетчиков. Поскольку счетчики не были предназначены для программного обеспечения, нет способа извлечь экземпляр CounterRepository из объекта RepositoryContext. Вы также можете прочитать о Reporting Tasks, так как в зависимости от вашей цели это может быть лучшим способом ее достижения.

0 голосов
/ 30 мая 2018

Исходя из предположения Энди, я использовал рефлексию, чтобы прочитать Счетчики следующим образом:

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));
        }
    }

ПРИМЕЧАНИЕ: Версия NIFI - 1.5.0

0 голосов
/ 13 мая 2018

Нет. В Apache NiFi нет простых API-интерфейсов, позволяющих программно считывать значения счетчиков. Простой подход - использовать процессор GetHTTP и использовать URL-адрес API-интерфейса NiFi REST, который вы упомянули: http(s)://nifi-host:port/nifi-api/counters.

Затем используйте EvaluateJsonPath, чтобы просто проанализировать и прочитать значение счетчика из ответа JSON, полученного от процессора GetHTTP.

...