diff --git a/algo/detectors/trd/Hitfind.cxx b/algo/detectors/trd/Hitfind.cxx
index a72229d1eb062ebd6f0bc5f56f8a50ec42071321..4367147765f471d1ef4ce5e8a1269e064d4b5c44 100644
--- a/algo/detectors/trd/Hitfind.cxx
+++ b/algo/detectors/trd/Hitfind.cxx
@@ -108,12 +108,14 @@ namespace cbm::algo::trd
     auto& hitsOut     = std::get<0>(result);
     auto& monitor     = std::get<1>(result);
 
+    xpu::scoped_timer t_{"TRDHitfind", &monitor.timeTotal};
+
     // Intermediate storage variables (digi, index) per module
     std::unordered_map<int, std::vector<std::pair<CbmTrdDigi, int32_t>>> digiBuffer;  //[modAddress]
 
     // Loop over the digis array and store the digis in separate vectors for
     // each modules
-    xpu::push_timer("TrdHitfindModuleSort");
+    xpu::push_timer("DigiModuleSort");
     for (size_t idigi = 0; idigi < digiIn.size(); idigi++) {
       const CbmTrdDigi* digi = &digiIn[idigi];
       auto addrModule        = digi->GetAddressModule();
@@ -134,7 +136,7 @@ namespace cbm::algo::trd
 
       digiBuffer[addrModule].emplace_back(*digi, idigi);
     }
-    monitor.fSortTime = xpu::pop_timer();
+    monitor.sortTime = xpu::pop_timer();
 
     PODVector<Hit> hitsFlat;                          // hit storage
     std::vector<size_t> modSizes(fModList.size());    // nHits per modules
@@ -143,7 +145,7 @@ namespace cbm::algo::trd
     // Prefix array for parallelization
     std::vector<size_t> hitsPrefix;
 
-    xpu::push_timer("TrdHitfind");
+    xpu::push_timer("FindHits");
     xpu::t_add_bytes(digiIn.size_bytes());
 
     CBM_PARALLEL()
@@ -192,9 +194,9 @@ namespace cbm::algo::trd
       std::move(local_hits.begin(), local_hits.end(), hitsFlat.begin() + hitsPrefix[ithread]);
     }
     // Monitoring
-    monitor.fTime     = xpu::pop_timer();
-    monitor.fNumDigis = digiIn.size();
-    monitor.fNumHits  = hitsFlat.size();
+    monitor.timeHitfind = xpu::pop_timer();
+    monitor.numDigis    = digiIn.size();
+    monitor.numHits     = hitsFlat.size();
 
     // Create ouput vector
     hitsOut = PartitionedVector(std::move(hitsFlat), modSizes, modAddresses);
diff --git a/algo/detectors/trd/Hitfind.h b/algo/detectors/trd/Hitfind.h
index 90ea01cc561c714d96758244f790b00cefaf6d5f..07f64557ba52d18769b6d25ddc2a4818fbc93c3c 100644
--- a/algo/detectors/trd/Hitfind.h
+++ b/algo/detectors/trd/Hitfind.h
@@ -31,16 +31,18 @@ namespace cbm::algo::trd
    ** @brief Monitoring data for hitfinding
    **/
   struct HitfindMonitorData {
-    xpu::timings fTime;
-    xpu::timings fSortTime;
-    size_t fNumDigis = 0;
-    size_t fNumHits  = 0;
+    xpu::timings timeTotal;
+    xpu::timings timeHitfind;
+    xpu::timings sortTime;
+    size_t numDigis = 0;
+    size_t numHits  = 0;
 
     std::string print() const
     {
       std::stringstream ss;
-      ss << "Hitfind stats: num digis " << fNumDigis << ", time " << fTime.wall() << " ms ( " << fTime.throughput()
-         << " GB/s ), sort time " << fSortTime.wall() << " ms, num hits " << fNumHits << std::endl;
+      ss << "Hitfind stats: num digis " << numDigis << ", time " << timeTotal.wall() << " ms ( "
+         << timeTotal.throughput() << " GB/s ), sort time " << sortTime.wall() << " ms, num hits " << numHits
+         << std::endl;
       return ss.str();
     }
   };
diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx
index 9f7c0350c1142e5284b3d7569c4138307a7703a8..10c2635d93a67b65c487c45ecdc076ead46e370e 100644
--- a/algo/global/Reco.cxx
+++ b/algo/global/Reco.cxx
@@ -300,6 +300,7 @@ RecoResults Reco::Run(const fles::Timeslice& ts)
       std::copy(digis2d.begin(), digis2d.end(), std::back_inserter(allDigis));
       auto trdResults = (*fTrdHitfind)(allDigis);
       trdHits         = std::move(std::get<0>(trdResults));
+      QueueTrdRecoMetrics(std::get<1>(trdResults));
       L_(info) << "TS has " << trdHits.NElements() << " TRD hits.";
     }
 
@@ -442,6 +443,21 @@ void Reco::QueueTofRecoMetrics(const tof::HitfindMonitorData& mon)
                            });
 }
 
+void Reco::QueueTrdRecoMetrics(const trd::HitfindMonitorData& mon)
+{
+  if (!HasMonitor()) {
+    return;
+  }
+
+  GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}},
+                           {
+                             {"trdRecoTimeTotal", mon.timeTotal.wall()},
+                             {"trdRecoThroughput", mon.timeTotal.throughput()},
+                             {"trdRecoNumDigisIn", mon.numDigis},
+                             {"trdRecoNumHits", mon.numHits},
+                           });
+}
+
 void Reco::QueueTofCalibMetrics(const tof::CalibrateMonitorData& mon)
 {
   if (!HasMonitor()) return;
diff --git a/algo/global/Reco.h b/algo/global/Reco.h
index 18be6d475e5106a2930522d776306303607b6cb1..7f104732a002ae68fe44c6785ee71829b86c324a 100644
--- a/algo/global/Reco.h
+++ b/algo/global/Reco.h
@@ -60,6 +60,7 @@ namespace cbm::algo
   {
     class Unpack;
     class Hitfind;
+    struct HitfindMonitorData;
   }
 
   namespace trd2d
@@ -154,6 +155,7 @@ namespace cbm::algo
     void QueueUnpackerMetricsDet(const UnpackMonitor<MSMonitor>&);
     void QueueStsRecoMetrics(const sts::HitfinderMon&);
     void QueueTofRecoMetrics(const tof::HitfindMonitorData&);
+    void QueueTrdRecoMetrics(const trd::HitfindMonitorData&);
     void QueueTofCalibMetrics(const tof::CalibrateMonitorData&);
     void QueueEvbuildMetrics(const evbuild::EventbuildChainMonitorData&);
     void QueueTrackingMetrics(const ca::TrackingMonitorData&);