From 5bc348d9f781dd05ef26e45edd7e948b02331b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Francisco=20Solaz=20Garc=C3=ADa?= Date: Fri, 7 Aug 2026 14:07:57 +0200 Subject: [PATCH 1/2] [ntuple] Auto-enable counters if metrics are also enabled --- tree/ntuple/inc/ROOT/RNTupleMetrics.hxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx b/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx index 5137a4bde1e0c..8cbc78a8842c5 100644 --- a/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx @@ -312,6 +312,8 @@ public: auto counter = std::make_unique>(name, std::forward(args)...); auto ptrCounter = counter.get(); fCounters.emplace_back(std::move(counter)); + if (fIsEnabled) + ptrCounter->Enable(); return ptrCounter; } From 6b687ea5c4974e69a89cac1c18dcfae4bbdf2f4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Francisco=20Solaz=20Garc=C3=ADa?= Date: Fri, 7 Aug 2026 14:08:57 +0200 Subject: [PATCH 2/2] [ntuple] Enable metrics if ROOT_EXPORT_RNTUPLE_METRICS is set In this commit, `ROOT_EXPORT_RNTUPLE_METRICS` is an optional environment variable that if set enables the metrics, but does not trigger metric storage after the program ends. In a future commit, we will expect the optional environment variable `ROOT_EXPORT_RNTUPLE_METRICS` to be set to a path. If done, metrics will be enabled and RNTupleMetrics will store the metrics there as a `.root` file. --- roottest/root/ntuple/metrics/CMakeLists.txt | 8 +++++ .../ntuple/metrics/metrics_env_disabled.ref | 3 ++ .../ntuple/metrics/metrics_env_enabled.ref | 3 ++ .../ntuple/metrics/test_rntuple_metrics_env.C | 32 +++++++++++++++++++ tree/ntuple/inc/ROOT/RNTupleMetrics.hxx | 11 ++++++- tree/ntuple/src/RNTupleMetrics.cxx | 12 +++++++ 6 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 roottest/root/ntuple/metrics/CMakeLists.txt create mode 100644 roottest/root/ntuple/metrics/metrics_env_disabled.ref create mode 100644 roottest/root/ntuple/metrics/metrics_env_enabled.ref create mode 100644 roottest/root/ntuple/metrics/test_rntuple_metrics_env.C 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 8cbc78a8842c5..965234e254851 100644 --- a/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx @@ -282,6 +282,9 @@ using RNTupleAtomicTimer = RNTupleTimer +#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; +}