Skip to content

Commit 2f26cb9

Browse files
lordgamezfgerlits
authored andcommitted
MINIFICPP-2723 Add log and properties.d dir property files to debug bundle
Signed-off-by: Ferenc Gerlits <fgerlits@gmail.com> Closes #2124
1 parent 2493330 commit 2f26cb9

File tree

9 files changed

+68
-7
lines changed

9 files changed

+68
-7
lines changed

libminifi/include/properties/Configure.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ class ConfigureImpl : public ConfigurationImpl, public virtual core::AgentIdenti
4949
std::string getAgentIdentifier() const override;
5050
void setFallbackAgentIdentifier(const std::string& id) override;
5151

52+
std::optional<std::filesystem::path> logPropertiesFilePath() const override;
53+
std::optional<std::filesystem::path> extraLogPropertiesFilesDirName() const override;
54+
5255
using Configuration::set;
5356
void set(const std::string& key, const std::string& value, PropertyChangeLifetime lifetime) override;
5457
bool commitChanges() override;

libminifi/include/properties/Properties.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,9 @@ class PropertiesImpl : public virtual Properties {
124124

125125
std::map<std::string, std::string> getProperties() const override;
126126

127+
std::filesystem::path extraPropertiesFilesDirName() const override;
128+
127129
private:
128-
std::filesystem::path extraPropertiesFilesDirName() const;
129130
void setPropertiesFromFile(const std::filesystem::path& properties_file, std::string_view prefix);
130131

131132
std::map<std::string, PropertyValue> properties_;

libminifi/src/Configure.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,20 @@ void ConfigureImpl::setFallbackAgentIdentifier(const std::string& id) {
110110
fallback_identifier_ = id;
111111
}
112112

113+
std::optional<std::filesystem::path> ConfigureImpl::logPropertiesFilePath() const {
114+
if (logger_properties_) {
115+
return logger_properties_->getFilePath();
116+
}
117+
return std::nullopt;
118+
}
119+
120+
std::optional<std::filesystem::path> ConfigureImpl::extraLogPropertiesFilesDirName() const {
121+
if (logger_properties_) {
122+
return logger_properties_->extraPropertiesFilesDirName();
123+
}
124+
return std::nullopt;
125+
}
126+
113127
void ConfigureImpl::set(const std::string& key, const std::string& value, PropertyChangeLifetime lifetime) {
114128
const std::string_view log_prefix = "nifi.log.";
115129
if (utils::string::startsWith(key, log_prefix)) {

libminifi/src/FlowController.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,12 +482,29 @@ std::map<std::string, std::unique_ptr<io::InputStream>> FlowController::getDebug
482482
std::string index_str = i == logs.size() - 1 ? "" : "." + std::to_string(logs.size() - 1 - i);
483483
debug_info["minifi.log" + index_str + ".gz"] = std::move(logs[i]);
484484
}
485+
485486
if (auto opt_flow_path = flow_configuration_->getConfigurationPath()) {
486487
if (utils::file::exists(opt_flow_path.value())) {
487488
debug_info["config.yml"] = std::make_unique<io::FileStream>(opt_flow_path.value(), 0, false);
488489
}
489490
}
491+
492+
const auto addDirectoryContents = [this, &debug_info](const std::filesystem::path& dir) {
493+
if (!utils::file::exists(dir)) { return; }
494+
for (const auto& [parent, file] : utils::file::list_dir_all(dir, logger_, false)) {
495+
debug_info[parent.filename().string() + "/" + file.string()] = std::make_unique<io::FileStream>(dir / file, 0, false);
496+
}
497+
};
498+
490499
debug_info["minifi.properties"] = std::make_unique<io::FileStream>(configuration_->getFilePath(), 0, false);
500+
addDirectoryContents(configuration_->extraPropertiesFilesDirName());
501+
502+
if (auto log_properties_path = configuration_->logPropertiesFilePath()) {
503+
debug_info["minifi-log.properties"] = std::make_unique<io::FileStream>(*log_properties_path, 0, false);
504+
}
505+
if (auto log_properties_dir = configuration_->extraLogPropertiesFilesDirName()) {
506+
addDirectoryContents(*log_properties_dir);
507+
}
491508

492509
return debug_info;
493510
}

libminifi/test/integration/C2DebugBundleTest.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ class C2HeartbeatHandler : public ServerAwareHandler {
138138
};
139139

140140
static std::string properties_file = "some.dummy.content = here\n";
141+
static std::string c2_properties_file = "c2.dummy.content = content\n";
142+
static std::string log_properties_file = "log.dummy.content = log\n";
143+
static std::string extra_log_properties_file = "extra.log.dummy.content = extra\n";
141144
static std::string flow_config_file = empty_flow;
142145

143146
TEST_CASE("C2DebugBundleTest", "[c2test]") {
@@ -149,7 +152,12 @@ TEST_CASE("C2DebugBundleTest", "[c2test]") {
149152

150153
std::filesystem::path home_dir = controller.createTempDirectory();
151154
minifi::utils::file::PathUtils::create_dir(home_dir / "conf");
155+
minifi::utils::file::PathUtils::create_dir(home_dir / "conf" / "minifi.properties.d");
156+
minifi::utils::file::PathUtils::create_dir(home_dir / "conf" / "minifi-log.properties.d");
152157
std::ofstream{home_dir / "conf" / "minifi.properties", std::ios::binary} << properties_file;
158+
std::ofstream{home_dir / "conf" / "minifi.properties.d" / "90_c2.properties", std::ios::binary} << c2_properties_file;
159+
std::ofstream{home_dir / "conf" / "minifi-log.properties", std::ios::binary} << log_properties_file;
160+
std::ofstream{home_dir / "conf" / "minifi-log.properties.d" / "99_c2.properties", std::ios::binary} << extra_log_properties_file;
153161
std::ofstream{home_dir / "conf" / "config.yml", std::ios::binary} << flow_config_file;
154162

155163
VerifyDebugInfo harness(home_dir / "conf" / "config.yml", [&]() -> bool {
@@ -174,8 +182,11 @@ TEST_CASE("C2DebugBundleTest", "[c2test]") {
174182
file_content.length());
175183
archive_content[info->filename] = std::move(file_content);
176184
}
177-
REQUIRE(archive_content["minifi.properties"] == properties_file);
178-
REQUIRE(archive_content["config.yml"] == flow_config_file);
185+
CHECK(archive_content["minifi.properties"] == properties_file);
186+
CHECK(archive_content["minifi.properties.d/90_c2.properties"] == c2_properties_file);
187+
CHECK(archive_content["minifi-log.properties"] == log_properties_file);
188+
CHECK(archive_content["minifi-log.properties.d/99_c2.properties"] == extra_log_properties_file);
189+
CHECK(archive_content["config.yml"] == flow_config_file);
179190
auto log_gz = archive_content["minifi.log.gz"];
180191
auto log_stream = std::make_shared<minifi::io::BufferStream>();
181192
{
@@ -185,11 +196,12 @@ TEST_CASE("C2DebugBundleTest", "[c2test]") {
185196
std::string log_text;
186197
log_text.resize(log_stream->size());
187198
log_stream->read(as_writable_bytes(std::span(log_text)));
188-
REQUIRE(log_text.find("Tis but a scratch") != std::string::npos);
189-
REQUIRE(archive_content["manifest.json"].find("minifi-archive-extensions") != std::string::npos);
199+
CHECK(log_text.find("Tis but a scratch") != std::string::npos);
200+
CHECK(archive_content["manifest.json"].find("minifi-archive-extensions") != std::string::npos);
190201
return true;
191202
});
192203

204+
harness.getLoggerProperties()->loadConfigureFile(home_dir / "conf" / "minifi-log.properties");
193205
harness.getConfiguration()->loadConfigureFile(home_dir / "conf" / "minifi.properties");
194206
harness.setUrl("http://localhost:0/heartbeat", &heartbeat_handler);
195207
harness.setUrl("http://localhost:0/acknowledge", &ack_handler);
@@ -213,6 +225,7 @@ TEST_CASE("Test that the debug bundle operation works when config.yml does not e
213225
std::filesystem::path home_dir = controller.createTempDirectory();
214226
minifi::utils::file::PathUtils::create_dir(home_dir / "conf");
215227
std::ofstream{home_dir / "conf" / "minifi.properties", std::ios::binary} << properties_file;
228+
std::ofstream{home_dir / "conf" / "minifi-log.properties", std::ios::binary} << log_properties_file;
216229

217230
VerifyDebugInfo harness(home_dir / "conf" / "config.yml", [&]() -> bool {
218231
if (!ack_handler.isAcknowledged("79")) {
@@ -224,6 +237,7 @@ TEST_CASE("Test that the debug bundle operation works when config.yml does not e
224237
});
225238

226239
harness.getConfiguration()->loadConfigureFile(home_dir / "conf" / "minifi.properties");
240+
harness.getLoggerProperties()->loadConfigureFile(home_dir / "conf" / "minifi-log.properties");
227241
harness.setUrl("http://localhost:0/heartbeat", &heartbeat_handler);
228242
harness.setUrl("http://localhost:0/acknowledge", &ack_handler);
229243
harness.setUrl("http://localhost:0/debug_bundle", &bundle_handler);

libminifi/test/libtest/integration/IntegrationBase.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
namespace org::apache::nifi::minifi::test {
3232

3333
IntegrationBase::IntegrationBase(const std::optional<std::filesystem::path>& test_file_location, const std::optional<std::filesystem::path>& home_path, std::chrono::milliseconds waitTime)
34-
: configuration(std::make_shared<minifi::ConfigureImpl>()),
34+
: logger_properties_(std::make_shared<core::logging::LoggerProperties>(std::filesystem::temp_directory_path())),
35+
configuration(std::make_shared<minifi::ConfigureImpl>(std::nullopt, logger_properties_)),
3536
wait_time_(waitTime),
3637
home_path_(home_path) {
3738
flow_config_path_.config_path = test_file_location;

libminifi/test/libtest/integration/IntegrationBase.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class IntegrationBase {
5050
std::chrono::milliseconds waitTime = std::chrono::milliseconds(DEFAULT_WAITTIME_MSECS));
5151
IntegrationBase(const IntegrationBase&) = delete;
5252
IntegrationBase(IntegrationBase&& other) noexcept
53-
: configuration{std::move(other.configuration)},
53+
: logger_properties_{std::move(other.logger_properties_)},
54+
configuration{std::move(other.configuration)},
5455
flowController_{std::move(other.flowController_)},
5556
wait_time_{other.wait_time_},
5657
port{std::move(other.port)},
@@ -64,6 +65,7 @@ class IntegrationBase {
6465
IntegrationBase& operator=(const IntegrationBase&) = delete;
6566
IntegrationBase& operator=(IntegrationBase&& other) noexcept {
6667
if (&other == this) return *this;
68+
logger_properties_ = std::move(other.logger_properties_);
6769
configuration = std::move(other.configuration);
6870
flowController_ = std::move(other.flowController_);
6971
wait_time_ = other.wait_time_;
@@ -94,6 +96,10 @@ class IntegrationBase {
9496
return configuration;
9597
}
9698

99+
const std::shared_ptr<core::logging::LoggerProperties>& getLoggerProperties() const {
100+
return logger_properties_;
101+
}
102+
97103
void setConfiguration(std::shared_ptr<minifi::Configure> configuration) {
98104
this->configuration = std::move(configuration);
99105
}
@@ -124,6 +130,7 @@ class IntegrationBase {
124130
}
125131

126132
void configureSecurity();
133+
std::shared_ptr<core::logging::LoggerProperties> logger_properties_;
127134
std::shared_ptr<minifi::Configure> configuration;
128135
std::unique_ptr<minifi::utils::file::AssetManager> asset_manager_;
129136
std::unique_ptr<core::BulletinStore> bulletin_store_;

minifi-api/include/minifi-cpp/properties/Configure.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ class Configure : public virtual Configuration, public virtual core::AgentIdenti
4141

4242
virtual void setFallbackAgentIdentifier(const std::string& id) = 0;
4343

44+
virtual std::optional<std::filesystem::path> logPropertiesFilePath() const = 0;
45+
virtual std::optional<std::filesystem::path> extraLogPropertiesFilesDirName() const = 0;
46+
4447
using Configuration::set;
4548
void set(const std::string& key, const std::string& value, PropertyChangeLifetime lifetime) override = 0;
4649
bool commitChanges() override = 0;

minifi-api/include/minifi-cpp/properties/Properties.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class Properties {
6060
virtual utils::ChecksumCalculator& getChecksumCalculator() = 0;
6161
virtual std::filesystem::path getFilePath() const = 0;
6262
virtual std::map<std::string, std::string> getProperties() const = 0;
63+
virtual std::filesystem::path extraPropertiesFilesDirName() const = 0;
6364

6465
static std::shared_ptr<Properties> create();
6566
};

0 commit comments

Comments
 (0)