This is an automated email from the ASF dual-hosted git repository. szaszm pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit 3c44ebaff0ace8454b2245ee3fe23fa484cd4a5a Author: Martin Zink <[email protected]> AuthorDate: Wed Feb 8 16:28:55 2023 +0100 MINIFICPP-2009 CWEL should add resolved attributes with json output as well Closes #1482 Signed-off-by: Marton Szasz <[email protected]> --- .../windows-event-log/ConsumeWindowsEventLog.cpp | 54 ++++++++++------------ .../windows-event-log/ConsumeWindowsEventLog.h | 9 +++- .../tests/ConsumeWindowsEventLogTests.cpp | 12 +++++ 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/extensions/windows-event-log/ConsumeWindowsEventLog.cpp b/extensions/windows-event-log/ConsumeWindowsEventLog.cpp index 714023acd..fa48bf2ac 100644 --- a/extensions/windows-event-log/ConsumeWindowsEventLog.cpp +++ b/extensions/windows-event-log/ConsumeWindowsEventLog.cpp @@ -629,10 +629,10 @@ nonstd::expected<EventRender, std::string> ConsumeWindowsEventLog::createEventRe if (output_.xml || output_.json) { substituteXMLPercentageItems(doc); logger_->log_trace("Finish substituting %% in XML"); + } - if (resolve_as_attributes_) { - result.matched_fields = walker.getFieldValues(); - } + if (resolve_as_attributes_) { + result.matched_fields = walker.getFieldValues(); } if (output_.xml) { @@ -699,42 +699,38 @@ void ConsumeWindowsEventLog::refreshTimeZoneData() { } void ConsumeWindowsEventLog::putEventRenderFlowFileToSession(const EventRender& eventRender, core::ProcessSession& session) const { - auto commitFlowFile = [&] (const std::shared_ptr<core::FlowFile>& flowFile, const std::string& content, const std::string& mimeType) { - session.writeBuffer(flowFile, content); - session.putAttribute(flowFile, core::SpecialFlowAttribute::MIME_TYPE, mimeType); - session.putAttribute(flowFile, "timezone.name", timezone_name_); - session.putAttribute(flowFile, "timezone.offset", timezone_offset_); - session.getProvenanceReporter()->receive(flowFile, provenanceUri_, getUUIDStr(), "Consume windows event logs", 0ms); - session.transfer(flowFile, Success); + auto commitFlowFile = [&] (const std::string& content, const std::string& mimeType) { + auto flow_file = session.create(); + addMatchedFieldsAsAttributes(eventRender, session, flow_file); + session.writeBuffer(flow_file, content); + session.putAttribute(flow_file, core::SpecialFlowAttribute::MIME_TYPE, mimeType); + session.putAttribute(flow_file, "timezone.name", timezone_name_); + session.putAttribute(flow_file, "timezone.offset", timezone_offset_); + session.getProvenanceReporter()->receive(flow_file, provenanceUri_, getUUIDStr(), "Consume windows event logs", 0ms); + session.transfer(flow_file, Success); }; if (output_.xml) { - auto flowFile = session.create(); logger_->log_trace("Writing rendered XML to a flow file"); - - for (const auto &fieldMapping : eventRender.matched_fields) { - if (!fieldMapping.second.empty()) { - session.putAttribute(flowFile, fieldMapping.first, fieldMapping.second); - } - } - - commitFlowFile(flowFile, eventRender.xml, "application/xml"); + commitFlowFile(eventRender.xml, "application/xml"); } if (output_.plaintext) { logger_->log_trace("Writing rendered plain text to a flow file"); - commitFlowFile(session.create(), eventRender.plaintext, "text/plain"); + commitFlowFile(eventRender.plaintext, "text/plain"); } - if (output_.json.type == JSONType::Raw) { - logger_->log_trace("Writing rendered raw JSON to a flow file"); - commitFlowFile(session.create(), eventRender.json, "application/json"); - } else if (output_.json.type == JSONType::Simple) { - logger_->log_trace("Writing rendered simple JSON to a flow file"); - commitFlowFile(session.create(), eventRender.json, "application/json"); - } else if (output_.json.type == JSONType::Flattened) { - logger_->log_trace("Writing rendered flattened JSON to a flow file"); - commitFlowFile(session.create(), eventRender.json, "application/json"); + if (output_.json) { + logger_->log_trace("Writing rendered %s JSON to a flow file", output_.json.type.toString()); + commitFlowFile(eventRender.json, "application/json"); + } +} + +void ConsumeWindowsEventLog::addMatchedFieldsAsAttributes(const EventRender& eventRender, core::ProcessSession& session, const std::shared_ptr<core::FlowFile>& flowFile) const { + for (const auto &fieldMapping : eventRender.matched_fields) { + if (!fieldMapping.second.empty()) { + session.putAttribute(flowFile, fieldMapping.first, fieldMapping.second); + } } } diff --git a/extensions/windows-event-log/ConsumeWindowsEventLog.h b/extensions/windows-event-log/ConsumeWindowsEventLog.h index ef430204c..258846b1e 100644 --- a/extensions/windows-event-log/ConsumeWindowsEventLog.h +++ b/extensions/windows-event-log/ConsumeWindowsEventLog.h @@ -42,6 +42,7 @@ #include "FlowFileRecord.h" #include "concurrentqueue.h" #include "pugixml.hpp" +#include "utils/Enum.h" #include "utils/Export.h" #include "utils/RegexUtils.h" @@ -145,6 +146,8 @@ class ConsumeWindowsEventLog : public core::Processor { const std::shared_ptr<core::ProcessSession>& session, const EVT_HANDLE& event_query_results); + void addMatchedFieldsAsAttributes(const EventRender &eventRender, core::ProcessSession &session, const std::shared_ptr<core::FlowFile> &flowFile) const; + std::shared_ptr<core::logging::Logger> logger_; core::StateManager* state_manager_{nullptr}; wel::METADATA_NAMES header_names_; @@ -161,7 +164,11 @@ class ConsumeWindowsEventLog : public core::Processor { std::map<std::string, wel::WindowsEventLogHandler> providers_; uint64_t batch_commit_size_{}; - enum class JSONType { None, Raw, Simple, Flattened }; + SMART_ENUM(JSONType, + (None, "None"), + (Raw, "Raw"), + (Simple, "Simple"), + (Flattened, "Flattened")) struct OutputFormat { bool xml{false}; diff --git a/extensions/windows-event-log/tests/ConsumeWindowsEventLogTests.cpp b/extensions/windows-event-log/tests/ConsumeWindowsEventLogTests.cpp index c16767ee5..c5f9d052d 100644 --- a/extensions/windows-event-log/tests/ConsumeWindowsEventLogTests.cpp +++ b/extensions/windows-event-log/tests/ConsumeWindowsEventLogTests.cpp @@ -238,6 +238,18 @@ TEST_CASE("ConsumeWindowsEventLog extracts some attributes by default", "[onTrig auto logger_processor = test_plan->addProcessor("LogAttribute", "logger", Success, true); test_plan->setProperty(logger_processor, LogAttribute::FlowFilesToLog.getName(), "0"); + SECTION("XML output") { + REQUIRE(test_plan->setProperty(cwel_processor, ConsumeWindowsEventLog::OutputFormat.getName(), "XML")); + } + + SECTION("Json output") { + REQUIRE(test_plan->setProperty(cwel_processor, ConsumeWindowsEventLog::OutputFormat.getName(), "JSON")); + } + + SECTION("Plaintext output") { + REQUIRE(test_plan->setProperty(cwel_processor, ConsumeWindowsEventLog::OutputFormat.getName(), "Plaintext")); + } + // 0th event, only to create a bookmark { reportEvent(APPLICATION_CHANNEL, "Event zero: this is in the past");
