Резюме
Мне нужно собрать набор статистики во время процесса in-modify-out сервера Camel и выдать эту статистику как один объект (одну строку журнала json).
Эти статистические данные должны включать:
- метрики входного файла (размер / символы / байты и другие, специфичные для раздела файла)
- статистика времени обработки (начало / конец / продолжительность времени обработки, начало / конец / продолжительность времени сбора метрик)
- метрики выходного файла (такие же, как метрики входного файла, и будут другими числами, изменяемый выходной файл)
Метрика выходного файла является проблемой , так как я не могу получить доступ к файлу, пока он не будет записан на диск, и
он не записывается на диск до завершения процесса
Фон
Реализация log4j используется для регистрации сервисов, но после некоторой обработки мы поняли, что она действительно не удовлетворяет требованиям здесь, поскольку она выдает многострочный json и встраивает json в одно поле верхнего уровня. Нам нужны различные поля верхнего уровня, в зависимости от обрабатываемого файла.
Предполагается, что сервер будет работать с несколькими файловыми операциями асинхронно, а файлы различаются по размеру (от крошечных до довольно огромных - что является одной из причин, по которым нам нужно повторять статистику и показатели, прежде чем мы начнем настраивать или просматривать)
Текущее состояние
Входной файл и даже статистика времени обработки работают нормально, и я использую следующую технику для их получения:
Внутри метода переопределения процесса «MyProcessor» я создаю новый экземпляр моего класса JsonLogWriter. (сокращенный псевдокод с многоточием)
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
...
@Component
public class MyProcessor implements Processor {
...
@Override
public void process(Exchange exchange) throws Exception {
...
JsonLogWriter jlw = new JsonLogWriter();
jlw.logfilePath = jsonLogFilePath;
jlw.inputFilePath = inFilePath;
jlw.outputfilePath = outFilePath;
...
jlw.metricsInputFile(); //gathers metrics using inputFilePath - OK
...
(входной файл обрабатывается / изменяется и возвращается как входной поток:
InputStream result = myEngine.readAndUpdate(inFilePath);
... get timings
jlw.write
}
Отсюда видно, что JsonLogWriter имеет
- свойства для путей к файлам (входной файл, выходной файл, вывод журнала),
- набор методов для заполнения данных:
- метод для передачи данных в файл (после готовности)
Как только я заполнил все объекты json в классе, я вызываю метод write (), и класс собирает все объекты json вместе и
все статистические данные поступают в лог-файл (в одну строку json) - ОК.
Ошибка - нет выходного файла (пока)
Если я использую метод metricsOutputFile, однако:
InputStream result = myEngine.readAndUpdate(inFilePath);
... get timings
jlw.metricsOutputFile(); // using outputfilePath
jlw.write
}
... JsonLogWriter завершается ошибкой, поскольку файл еще не существует.
java.nio.file.NoSuchFileException: aroute\output\a_long_guid_filename
при отладке я не вижу ни одной части объекта обмена или результата, которую я мог бы направить в процесс чтения / сбора файлов.
Для этого потребуется больше верблюжьих маршрутов? Какой может быть альтернативный подход, когда я могу получить всю статистику из входных и выходных файлов и сохранить их в одном объекте / строке json?
(очень рад получить конструктивную критику - как, например, почему ваша Java такая жесткая - и да, вполне возможно, я на этом этапе создаю прототипы решений, так что это не рабочий код, и я не исповедую глубоко понимание внутренних компонентов Java - обычно я могу заставить все работать)