@@ -79,6 +79,10 @@ struct MetricIndices {
7979 size_t timeframesRead = -1 ;
8080 size_t timeframesConsumed = -1 ;
8181 size_t timeframesExpired = -1 ;
82+ // Timeslices counting
83+ size_t timeslicesStarted = -1 ;
84+ size_t timeslicesExpired = -1 ;
85+ size_t timeslicesDone = -1 ;
8286};
8387
8488std::vector<MetricIndices> createDefaultIndices (std::vector<DeviceMetricsInfo>& allDevicesMetrics)
@@ -95,7 +99,11 @@ std::vector<MetricIndices> createDefaultIndices(std::vector<DeviceMetricsInfo>&
9599 .shmOfferBytesConsumed = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " shm-offer-bytes-consumed" ),
96100 .timeframesRead = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " df-sent" ),
97101 .timeframesConsumed = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " consumed-timeframes" ),
98- .timeframesExpired = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " expired-timeframes" )});
102+ .timeframesExpired = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " expired-timeframes" ),
103+ .timeslicesStarted = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " timeslices-started" ),
104+ .timeslicesExpired = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " timeslices-expired" ),
105+ .timeslicesDone = DeviceMetricsHelper::bookNumericMetric<uint64_t >(info, " timeslices-done" ),
106+ });
99107 }
100108 return results;
101109}
@@ -230,6 +238,19 @@ auto offerResources(ResourceState& resourceState,
230238 offeredResourceMetric (driverMetrics, resourceState.offered , timestamp);
231239};
232240
241+ auto processTimeslices = [](size_t index, DeviceMetricsInfo& deviceMetrics, bool & changed,
242+ int64_t & totalMetricValue, size_t & lastTimestamp) {
243+ assert (index < deviceMetrics.metrics .size ());
244+ changed |= deviceMetrics.changed [index];
245+ MetricInfo info = deviceMetrics.metrics [index];
246+ assert (info.storeIdx < deviceMetrics.uint64Metrics .size ());
247+ auto & data = deviceMetrics.uint64Metrics [info.storeIdx ];
248+ auto value = (int64_t )data[(info.pos - 1 ) % data.size ()];
249+ totalMetricValue += value;
250+ auto const & timestamps = DeviceMetricsHelper::getTimestampsStore<uint64_t >(deviceMetrics)[info.storeIdx ];
251+ lastTimestamp = std::max (lastTimestamp, timestamps[(info.pos - 1 ) % data.size ()]);
252+ };
253+
233254o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec ()
234255{
235256 using o2::monitoring::Metric;
@@ -257,11 +278,22 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
257278 int64_t totalTimeframesRead = 0 ;
258279 int64_t totalTimeframesConsumed = 0 ;
259280 int64_t totalTimeframesExpired = 0 ;
281+ int64_t totalTimeslicesStarted = 0 ;
282+ int64_t totalTimeslicesDone = 0 ;
283+ int64_t totalTimeslicesExpired = 0 ;
260284 auto &driverMetrics = sm.driverMetricsInfo ;
261285 auto &allDeviceMetrics = sm.deviceMetricsInfos ;
262286 auto &specs = sm.deviceSpecs ;
263287 auto &infos = sm.deviceInfos ;
264288
289+ // Aggregated driver metrics for timeslice rate limiting
290+ auto createUint64DriverMetric = [&driverMetrics](char const *name) -> auto {
291+ return DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, name);
292+ };
293+ auto createIntDriverMetric = [&driverMetrics](char const *name) -> auto {
294+ return DeviceMetricsHelper::createNumericMetric<int >(driverMetrics, name);
295+ };
296+
265297 static auto stateMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " rate-limit-state" );
266298 static auto totalBytesCreatedMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " total-arrow-bytes-created" );
267299 static auto shmOfferConsumedMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " total-shm-offer-bytes-consumed" );
@@ -280,6 +312,12 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
280312 static auto totalTimeframesReadMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " total-timeframes-read" );
281313 static auto totalTimeframesConsumedMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " total-timeframes-consumed" );
282314 static auto totalTimeframesInFlyMetric = DeviceMetricsHelper::createNumericMetric<int >(driverMetrics, " total-timeframes-in-fly" );
315+
316+ static auto totalTimeslicesStartedMetric = createUint64DriverMetric (" total-timeslices-started" );
317+ static auto totalTimeslicesExpiredMetric = createUint64DriverMetric (" total-timeslices-expired" );
318+ static auto totalTimeslicesDoneMetric = createUint64DriverMetric (" total-timeslices-done" );
319+ static auto totalTimeslicesInFlyMetric = createIntDriverMetric (" total-timeslices-in-fly" );
320+
283321 static auto totalBytesDeltaMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " arrow-bytes-delta" );
284322 static auto changedCountMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " changed-metrics-count" );
285323 static auto totalSignalsMetric = DeviceMetricsHelper::createNumericMetric<uint64_t >(driverMetrics, " aod-reader-signals" );
@@ -406,6 +444,9 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
406444 auto const & timestamps = DeviceMetricsHelper::getTimestampsStore<uint64_t >(deviceMetrics)[info.storeIdx ];
407445 lastTimestamp = std::max (lastTimestamp, timestamps[(info.pos - 1 ) % data.size ()]);
408446 }
447+ processTimeslices (indices.timeslicesStarted , deviceMetrics, changed, totalTimeslicesStarted, lastTimestamp);
448+ processTimeslices (indices.timeslicesExpired , deviceMetrics, changed, totalTimeslicesExpired, lastTimestamp);
449+ processTimeslices (indices.timeslicesDone , deviceMetrics, changed, totalTimeslicesDone, lastTimestamp);
409450 }
410451 static uint64_t unchangedCount = 0 ;
411452 if (changed) {
@@ -418,6 +459,10 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
418459 totalTimeframesReadMetric (driverMetrics, totalTimeframesRead, timestamp);
419460 totalTimeframesConsumedMetric (driverMetrics, totalTimeframesConsumed, timestamp);
420461 totalTimeframesInFlyMetric (driverMetrics, (int )(totalTimeframesRead - totalTimeframesConsumed), timestamp);
462+ totalTimeslicesStartedMetric (driverMetrics, totalTimeslicesStarted, timestamp);
463+ totalTimeslicesExpiredMetric (driverMetrics, totalTimeslicesExpired, timestamp);
464+ totalTimeslicesDoneMetric (driverMetrics, totalTimeslicesDone, timestamp);
465+ totalTimeslicesInFlyMetric (driverMetrics, (int )(totalTimeslicesStarted - totalTimeslicesDone), timestamp);
421466 totalBytesDeltaMetric (driverMetrics, totalBytesCreated - totalBytesExpired - totalBytesDestroyed, timestamp);
422467 } else {
423468 unchangedCount++;
@@ -458,8 +503,8 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
458503 };
459504
460505 offerResources (timesliceResourceState, timesliceResourceSpec, timesliceResourceStats,
461- specs, infos, manager, totalTimeframesConsumed, totalTimeframesExpired ,
462- totalTimeframesRead, totalTimeframesConsumed , timestamp, driverMetrics,
506+ specs, infos, manager, totalTimeframesConsumed, totalTimeslicesExpired ,
507+ totalTimeslicesStarted, totalTimeslicesDone , timestamp, driverMetrics,
463508 availableTimeslicesMetric, unusedOfferedTimeslicesMetric, offeredTimeslicesMetric,
464509 (void *)&sm);
465510
0 commit comments