@@ -205,17 +205,36 @@ void MetaServiceMetricsBase::AttachReportEventTypeMetricsCollectors(const proto:
205205 return ;
206206 }
207207
208+ static constexpr std::array<const char *, 7 > kEventTypeTags = {
209+ " unknown" , " node_register" , " block_add" , " block_delete" , " host_down" , " heartbeat" , " block_snapshot" };
208210 uint32_t event_type_mask = 0 ;
211+ std::array<size_t , kEventTypeTags .size ()> request_key_counts{};
209212 for (const auto &event : request.events ()) {
210213 const int event_type = static_cast <int >(event.event_type ());
211- event_type_mask |=
212- 1U << ((event_type >= proto::meta::EVENT_NODE_REGISTER && event_type <= proto::meta::EVENT_BLOCK_SNAPSHOT )
213- ? event_type
214- : 0 );
214+ const int bounded_event_type =
215+ (event_type >= proto::meta::EVENT_NODE_REGISTER && event_type <= proto::meta::EVENT_BLOCK_SNAPSHOT )
216+ ? event_type
217+ : 0 ;
218+ event_type_mask |= 1U << bounded_event_type;
219+ // Match request_key_count semantics used by the other manager APIs:
220+ // count keys in the request payload, regardless of later validation,
221+ // deduplication, or persistence outcomes.
222+ switch (bounded_event_type) {
223+ case proto::meta::EVENT_BLOCK_ADD :
224+ request_key_counts[bounded_event_type] += event.has_block_add () ? 1 : 0 ;
225+ break ;
226+ case proto::meta::EVENT_BLOCK_DELETE :
227+ request_key_counts[bounded_event_type] += event.has_block_delete () ? 1 : 0 ;
228+ break ;
229+ case proto::meta::EVENT_BLOCK_SNAPSHOT :
230+ request_key_counts[bounded_event_type] +=
231+ event.has_block_snapshot () ? static_cast <size_t >(event.block_snapshot ().blocks_size ()) : 0 ;
232+ break ;
233+ default :
234+ break ;
235+ }
215236 }
216237
217- static constexpr std::array<const char *, 7 > kEventTypeTags = {
218- " unknown" , " node_register" , " block_add" , " block_delete" , " host_down" , " heartbeat" , " block_snapshot" };
219238 for (size_t event_type = 0 ; event_type < kEventTypeTags .size (); ++event_type) {
220239 if ((event_type_mask & (1U << event_type)) == 0 ) {
221240 continue ;
@@ -227,8 +246,12 @@ void MetaServiceMetricsBase::AttachReportEventTypeMetricsCollectors(const proto:
227246 // The cached object owns the registry handles. Each request gets a
228247 // lightweight view with the same handles but private sample state,
229248 // avoiding both registry re-registration and cross-request races.
230- request_context->GetMetricsCollectorsVehicle ().AddMetricsCollector (
231- std::make_shared<EventReportMetricsCollector>(*event_collector));
249+ auto request_collector = std::make_shared<EventReportMetricsCollector>(*event_collector);
250+ if (event_type == proto::meta::EVENT_BLOCK_ADD || event_type == proto::meta::EVENT_BLOCK_DELETE ||
251+ event_type == proto::meta::EVENT_BLOCK_SNAPSHOT ) {
252+ request_collector->SetRequestKeyCountSample (request_key_counts[event_type]);
253+ }
254+ request_context->GetMetricsCollectorsVehicle ().AddMetricsCollector (std::move (request_collector));
232255 }
233256 }
234257}
0 commit comments