diff --git a/roottest/root/ntuple/metrics/CMakeLists.txt b/roottest/root/ntuple/metrics/CMakeLists.txt new file mode 100644 index 0000000000000..24fb47b881f7b --- /dev/null +++ b/roottest/root/ntuple/metrics/CMakeLists.txt @@ -0,0 +1,8 @@ +ROOTTEST_ADD_TEST(metrics_env_enabled + MACRO test_rntuple_metrics_env.C + ENVIRONMENT ROOT_EXPORT_RNTUPLE_METRICS=metrics_env_enabled.root + OUTREF metrics_env_enabled.ref) + +ROOTTEST_ADD_TEST(metrics_env_disabled + MACRO test_rntuple_metrics_env.C + OUTREF metrics_env_disabled.ref) diff --git a/roottest/root/ntuple/metrics/metrics_env_disabled.ref b/roottest/root/ntuple/metrics/metrics_env_disabled.ref new file mode 100644 index 0000000000000..71b9e67cef4cb --- /dev/null +++ b/roottest/root/ntuple/metrics/metrics_env_disabled.ref @@ -0,0 +1,3 @@ +Processing test_rntuple_metrics_env.C... +Metrics enabled: false +nPageCommitted: 0 diff --git a/roottest/root/ntuple/metrics/metrics_env_enabled.ref b/roottest/root/ntuple/metrics/metrics_env_enabled.ref new file mode 100644 index 0000000000000..289372a209b92 --- /dev/null +++ b/roottest/root/ntuple/metrics/metrics_env_enabled.ref @@ -0,0 +1,3 @@ +Processing test_rntuple_metrics_env.C... +Metrics enabled: true +nPageCommitted: 1 diff --git a/roottest/root/ntuple/metrics/test_rntuple_metrics_env.C b/roottest/root/ntuple/metrics/test_rntuple_metrics_env.C new file mode 100644 index 0000000000000..f3baefae64ffc --- /dev/null +++ b/roottest/root/ntuple/metrics/test_rntuple_metrics_env.C @@ -0,0 +1,32 @@ +#include +#include + +#include + +#include +#include +#include +#include + +void test_rntuple_metrics_env() +{ + constexpr std::size_t kNEntries = 1000; + const std::string kFileName{"test_metrics_env.root"}; + + auto model = ROOT::RNTupleModel::Create(); + auto pt = model->MakeField("f"); + + auto writer = ROOT::RNTupleWriter::Recreate(std::move(model), "ntpl", kFileName); + for (std::size_t i = 0; i < kNEntries; ++i) { + *pt = static_cast(i); + writer->Fill(); + } + writer->CommitDataset(); + + const auto &metrics = writer->GetMetrics(); + const auto *nPageCommitted = metrics.GetCounter("RNTupleWriter.RPageSinkBuf.RPageSinkFile.nPageCommitted"); + + std::cout << "Metrics enabled: " << std::boolalpha << metrics.IsEnabled() << std::endl; + std::cout << "nPageCommitted: " << (nPageCommitted ? std::to_string(nPageCommitted->GetValueAsInt()) : "?") + << std::endl; +} diff --git a/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx b/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx index 5137a4bde1e0c..965234e254851 100644 --- a/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx @@ -282,6 +282,9 @@ using RNTupleAtomicTimer = RNTupleTimer>(name, std::forward(args)...); auto ptrCounter = counter.get(); fCounters.emplace_back(std::move(counter)); + if (fIsEnabled) + ptrCounter->Enable(); return ptrCounter; } @@ -322,6 +332,7 @@ public: const RNTuplePerfCounter *GetCounter(std::string_view name) const; void ObserveMetrics(RNTupleMetrics &observee); + static const std::string &GetMetricsExportPath(); void Print(std::ostream &output, const std::string &prefix = "") const; void Enable(); diff --git a/tree/ntuple/src/RNTupleMetrics.cxx b/tree/ntuple/src/RNTupleMetrics.cxx index c02fbd3d88675..5bd4538bfae15 100644 --- a/tree/ntuple/src/RNTupleMetrics.cxx +++ b/tree/ntuple/src/RNTupleMetrics.cxx @@ -14,6 +14,8 @@ #include +#include + #include #include @@ -90,3 +92,13 @@ void ROOT::Experimental::Detail::RNTupleMetrics::ObserveMetrics(RNTupleMetrics & { fObservedMetrics.push_back(&observee); } + +const std::string &ROOT::Experimental::Detail::RNTupleMetrics::GetMetricsExportPath() +{ + static const std::string path = []() -> std::string { + if (const char *env = gSystem->Getenv("ROOT_EXPORT_RNTUPLE_METRICS"); env && *env) + return env; + return ""; + }(); + return path; +}