Skip to content

Commit ca3bfcf

Browse files
committed
[metrics] report ReportEvent request key counts by event type
1 parent c581939 commit ca3bfcf

7 files changed

Lines changed: 75 additions & 15 deletions

File tree

kv_cache_manager/metrics/kmonitor_metrics_reporter.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,9 @@ void KmonitorMetricsReporter::ReportPerQuery(MetricsCollector *collector) {
561561

562562
const double error_code = p->GetErrorCodeSample();
563563
REPORT_METRICS_WHEN(event_report, error_qps, 1.0, !CommonUtil::IsZeroDouble(error_code));
564+
if (p->HasRequestKeyCountSample()) {
565+
REPORT_METRICS(manager, request_key_count, p->GetRequestKeyCountSample());
566+
}
564567
} else if (dynamic_cast<DataStorageMetricsCollector *>(collector)) {
565568
const auto *p = dynamic_cast<DataStorageMetricsCollector *>(collector);
566569
const kmonitor::MetricsTags tags = ctx_->GetKmonitorTags(p->GetMetricsTags());

kv_cache_manager/metrics/metrics_collector.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,11 +195,16 @@ bool ServiceMetricsCollector::Init() {
195195
REGISTER_METRICS_W_TAGS_COUNTER_(metrics_registry_, event_report, name, metrics_tags_)
196196
#define REGISTER_GAUGE_METRICS_FOR_EVENT_REPORT(name) \
197197
REGISTER_METRICS_W_TAGS_GAUGE_(metrics_registry_, event_report, name, metrics_tags_)
198+
#define DEFINE_METRICS_NAME_FOR_EVENT_REPORT_MANAGER(name) \
199+
DEFINE_METRICS_NAME_(EventReportMetricsCollector, manager, name)
200+
#define REGISTER_GAUGE_METRICS_FOR_EVENT_REPORT_MANAGER(name) \
201+
REGISTER_METRICS_W_TAGS_GAUGE_(metrics_registry_, manager, name, metrics_tags_)
198202

199203
DEFINE_METRICS_NAME_FOR_EVENT_REPORT(request_counter);
200204
DEFINE_METRICS_NAME_FOR_EVENT_REPORT(request_rt_us);
201205
DEFINE_METRICS_NAME_FOR_EVENT_REPORT(error_code);
202206
DEFINE_METRICS_NAME_FOR_EVENT_REPORT(error_counter);
207+
DEFINE_METRICS_NAME_FOR_EVENT_REPORT_MANAGER(request_key_count);
203208

204209
EventReportMetricsCollector::EventReportMetricsCollector(std::shared_ptr<MetricsRegistry> metrics_registry,
205210
MetricsTags metrics_tags) noexcept
@@ -211,6 +216,7 @@ EventReportMetricsCollector::EventReportMetricsCollector(const EventReportMetric
211216
event_report_request_rt_us_metrics_ = shared_collector.event_report_request_rt_us_metrics_;
212217
event_report_error_code_metrics_ = shared_collector.event_report_error_code_metrics_;
213218
event_report_error_counter_metrics_ = shared_collector.event_report_error_counter_metrics_;
219+
manager_request_key_count_metrics_ = shared_collector.manager_request_key_count_metrics_;
214220
}
215221

216222
bool EventReportMetricsCollector::Init() {
@@ -221,6 +227,7 @@ bool EventReportMetricsCollector::Init() {
221227
REGISTER_GAUGE_METRICS_FOR_EVENT_REPORT(request_rt_us);
222228
REGISTER_GAUGE_METRICS_FOR_EVENT_REPORT(error_code);
223229
REGISTER_COUNTER_METRICS_FOR_EVENT_REPORT(error_counter);
230+
REGISTER_GAUGE_METRICS_FOR_EVENT_REPORT_MANAGER(request_key_count);
224231
return true;
225232
}
226233

kv_cache_manager/metrics/metrics_collector.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -322,13 +322,14 @@ class ServiceMetricsCollector final : public MetricsCollector {
322322
};
323323

324324
// Lightweight per-event observability for ReportEvent. This intentionally
325-
// avoids registering the manager/meta metric families carried by a full
326-
// ServiceMetricsCollector.
325+
// carries only the request key count from the manager metric family, rather
326+
// than registering every manager/meta metric from ServiceMetricsCollector.
327327
class EventReportMetricsCollector final : public MetricsCollector {
328328
KVCM_COUNTER_METRICS(event_report, request_counter)
329329
KVCM_GAUGE_METRICS(event_report, request_rt_us)
330330
KVCM_GAUGE_METRICS(event_report, error_code)
331331
KVCM_COUNTER_METRICS(event_report, error_counter)
332+
KVCM_GAUGE_METRICS(manager, request_key_count)
332333

333334
public:
334335
EventReportMetricsCollector() = delete;
@@ -341,7 +342,7 @@ class EventReportMetricsCollector final : public MetricsCollector {
341342
// Collector objects are request-local, while registry gauges with the
342343
// same event_type tag are shared. Synchronous reporters must consume this
343344
// local sample so concurrent requests cannot attribute one another's
344-
// latency or error.
345+
// latency, error, or request key count.
345346
void SetRequestSample(double request_rt_us, double error_code) noexcept {
346347
request_rt_us_sample_ = request_rt_us;
347348
error_code_sample_ = error_code;
@@ -353,11 +354,21 @@ class EventReportMetricsCollector final : public MetricsCollector {
353354
[[nodiscard]] double GetErrorCodeSample() const noexcept {
354355
return has_request_sample_ ? error_code_sample_ : get_event_report_error_code_metrics();
355356
}
357+
void SetRequestKeyCountSample(double request_key_count) noexcept {
358+
request_key_count_sample_ = request_key_count;
359+
has_request_key_count_sample_ = true;
360+
}
361+
[[nodiscard]] bool HasRequestKeyCountSample() const noexcept { return has_request_key_count_sample_; }
362+
[[nodiscard]] double GetRequestKeyCountSample() const noexcept {
363+
return has_request_key_count_sample_ ? request_key_count_sample_ : get_manager_request_key_count_metrics();
364+
}
356365

357366
private:
358367
double request_rt_us_sample_ = 0.0;
359368
double error_code_sample_ = 0.0;
369+
double request_key_count_sample_ = 0.0;
360370
bool has_request_sample_ = false;
371+
bool has_request_key_count_sample_ = false;
361372
};
362373

363374
/* ------------------ DataStorageMetricsCollector ------------------- */

kv_cache_manager/metrics/test/metrics_collector_test.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,13 @@ TEST_F(MetricsCollectorTest, EventReportMetricsTest) {
2727
auto collector = std::make_shared<EventReportMetricsCollector>(metrics_registry_, tags);
2828
ASSERT_TRUE(collector->Init());
2929
EXPECT_EQ(tags, collector->GetMetricsTags());
30-
EXPECT_EQ(4, metrics_registry_->GetSize());
30+
EXPECT_EQ(5, metrics_registry_->GetSize());
3131

3232
EXPECT_EQ(0, GET(collector, event_report, request_counter));
3333
EXPECT_DOUBLE_EQ(0., GET(collector, event_report, request_rt_us));
3434
EXPECT_DOUBLE_EQ(0., GET(collector, event_report, error_code));
3535
EXPECT_EQ(0, GET(collector, event_report, error_counter));
36+
EXPECT_DOUBLE_EQ(0., GET(collector, manager, request_key_count));
3637

3738
SET_METRICS_(collector, event_report, request_rt_us, 123.);
3839
SET_METRICS_(collector, event_report, error_code, 10.);

kv_cache_manager/service/meta_service_metrics_base.cc

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

kv_cache_manager/service/test/meta_service_metrics_base_test.cc

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,10 @@ TEST_F(MetaServiceMetricsBaseTest, AttachesOneCollectorPerDistinctEventTypeAndBo
155155
SeedInstance("inst1", "grp1");
156156
proto::meta::ReportEventRequest request;
157157
request.set_instance_id("inst1");
158-
request.add_events()->set_event_type(proto::meta::EVENT_BLOCK_SNAPSHOT);
158+
auto *snapshot_event = request.add_events();
159+
snapshot_event->set_event_type(proto::meta::EVENT_BLOCK_SNAPSHOT);
160+
snapshot_event->mutable_block_snapshot()->add_blocks()->set_block_key("1");
161+
snapshot_event->mutable_block_snapshot()->add_blocks()->set_block_key("2");
159162
request.add_events()->set_event_type(proto::meta::EVENT_BLOCK_SNAPSHOT);
160163
request.add_events()->set_event_type(proto::meta::EVENT_HEARTBEAT);
161164
request.add_events()->set_event_type(static_cast<proto::meta::ReportEventType>(99));
@@ -167,8 +170,14 @@ TEST_F(MetaServiceMetricsBaseTest, AttachesOneCollectorPerDistinctEventTypeAndBo
167170
ASSERT_EQ(3, collectors.size());
168171
std::set<std::string> event_types;
169172
for (const auto &collector : collectors) {
170-
ASSERT_NE(nullptr, dynamic_cast<EventReportMetricsCollector *>(collector.get()));
171-
event_types.insert(collector->GetMetricsTags().at("event_type"));
173+
auto *event_collector = dynamic_cast<EventReportMetricsCollector *>(collector.get());
174+
ASSERT_NE(nullptr, event_collector);
175+
const auto &event_type = collector->GetMetricsTags().at("event_type");
176+
event_types.insert(event_type);
177+
if (event_type == "block_snapshot") {
178+
EXPECT_TRUE(event_collector->HasRequestKeyCountSample());
179+
EXPECT_DOUBLE_EQ(2., event_collector->GetRequestKeyCountSample());
180+
}
172181
}
173182
EXPECT_EQ((std::set<std::string>{"block_snapshot", "heartbeat", "unknown"}), event_types);
174183
}

kv_cache_manager/service/util/service_call_guard.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,12 @@ ServiceCallGuard::~ServiceCallGuard() {
151151
SET_METRICS_(event_metrics_collector, event_report, request_rt_us, request_rt_us);
152152
SET_METRICS_(event_metrics_collector, event_report, error_code, error_code);
153153
event_metrics_collector->SetRequestSample(request_rt_us, error_code);
154+
if (event_metrics_collector->HasRequestKeyCountSample()) {
155+
SET_METRICS_(event_metrics_collector,
156+
manager,
157+
request_key_count,
158+
event_metrics_collector->GetRequestKeyCountSample());
159+
}
154160
}
155161
metrics_reporter_->ReportPerQuery(mc.get());
156162
}

0 commit comments

Comments
 (0)