diff --git a/cloud/src/common/bvars.cpp b/cloud/src/common/bvars.cpp index ac36976553b781..dc567b6dad8ff1 100644 --- a/cloud/src/common/bvars.cpp +++ b/cloud/src/common/bvars.cpp @@ -218,19 +218,9 @@ bvar::Status g_bvar_fdb_qos_worst_data_lag_storage_server_ns("fdb_qos_w bvar::Status g_bvar_fdb_qos_worst_durability_lag_storage_server_ns("fdb_qos_worst_durability_lag_storage_server_ns", BVAR_FDB_INVALID_VALUE); bvar::Status g_bvar_fdb_qos_worst_log_server_queue_bytes("fdb_qos_worst_log_server_queue_bytes", BVAR_FDB_INVALID_VALUE); bvar::Status g_bvar_fdb_qos_worst_storage_server_queue_bytes("fdb_qos_worst_storage_server_queue_bytes", BVAR_FDB_INVALID_VALUE); -bvar::Status g_bvar_fdb_workload_conflict_rate_hz("fdb_workload_conflict_rate_hz", BVAR_FDB_INVALID_VALUE); -bvar::Status g_bvar_fdb_workload_location_rate_hz("fdb_workload_location_rate_hz", BVAR_FDB_INVALID_VALUE); -bvar::Status g_bvar_fdb_workload_keys_read_hz("fdb_workload_keys_read_hz", BVAR_FDB_INVALID_VALUE); -bvar::Status g_bvar_fdb_workload_read_bytes_hz("fdb_workload_read_bytes_hz", BVAR_FDB_INVALID_VALUE); -bvar::Status g_bvar_fdb_workload_read_rate_hz("fdb_workload_read_rate_hz", BVAR_FDB_INVALID_VALUE); -bvar::Status g_bvar_fdb_workload_write_rate_hz("fdb_workload_write_rate_hz", BVAR_FDB_INVALID_VALUE); -bvar::Status g_bvar_fdb_workload_written_bytes_hz("fdb_workload_written_bytes_hz", BVAR_FDB_INVALID_VALUE); -bvar::Status g_bvar_fdb_workload_transactions_started_hz("fdb_workload_transactions_started_hz", BVAR_FDB_INVALID_VALUE); -bvar::Status g_bvar_fdb_workload_transactions_committed_hz("fdb_workload_transactions_committed_hz", BVAR_FDB_INVALID_VALUE); -bvar::Status g_bvar_fdb_workload_transactions_rejected_hz("fdb_workload_transactions_rejected_hz", BVAR_FDB_INVALID_VALUE); bvar::Status g_bvar_fdb_client_thread_busyness_percent("fdb_client_thread_busyness_percent", BVAR_FDB_INVALID_VALUE); -mBvarStatus g_bvar_fdb_process_status_int("fdb_process_status_int", {"process_id", "component", "metric"}); -mBvarStatus g_bvar_fdb_process_status_float("fdb_process_status_float", {"process_id", "component", "metric"}); +mBvarStatus g_bvar_fdb_cluster_processes("fdb_cluster_processes", {"process_id", "component", "metric"}); +mBvarStatus g_bvar_fdb_cluster_workload("fdb_cluster_workload", {"component", "metric"}); // checker's bvars BvarStatusWithTag g_bvar_checker_num_scanned("checker", "num_scanned"); diff --git a/cloud/src/common/bvars.h b/cloud/src/common/bvars.h index 5641a2a30ce152..94494acc650f34 100644 --- a/cloud/src/common/bvars.h +++ b/cloud/src/common/bvars.h @@ -710,19 +710,9 @@ extern bvar::Status g_bvar_fdb_qos_worst_data_lag_storage_server_ns; extern bvar::Status g_bvar_fdb_qos_worst_durability_lag_storage_server_ns; extern bvar::Status g_bvar_fdb_qos_worst_log_server_queue_bytes; extern bvar::Status g_bvar_fdb_qos_worst_storage_server_queue_bytes; -extern bvar::Status g_bvar_fdb_workload_conflict_rate_hz; -extern bvar::Status g_bvar_fdb_workload_location_rate_hz; -extern bvar::Status g_bvar_fdb_workload_keys_read_hz; -extern bvar::Status g_bvar_fdb_workload_read_bytes_hz; -extern bvar::Status g_bvar_fdb_workload_read_rate_hz; -extern bvar::Status g_bvar_fdb_workload_write_rate_hz; -extern bvar::Status g_bvar_fdb_workload_written_bytes_hz; -extern bvar::Status g_bvar_fdb_workload_transactions_started_hz; -extern bvar::Status g_bvar_fdb_workload_transactions_committed_hz; -extern bvar::Status g_bvar_fdb_workload_transactions_rejected_hz; extern bvar::Status g_bvar_fdb_client_thread_busyness_percent; -extern mBvarStatus g_bvar_fdb_process_status_int; -extern mBvarStatus g_bvar_fdb_process_status_float; +extern mBvarStatus g_bvar_fdb_cluster_processes; +extern mBvarStatus g_bvar_fdb_cluster_workload; // checker extern BvarStatusWithTag g_bvar_checker_num_scanned; diff --git a/cloud/src/common/metric.cpp b/cloud/src/common/metric.cpp index ac0193a9921ec3..d41e7ea6e0f905 100644 --- a/cloud/src/common/metric.cpp +++ b/cloud/src/common/metric.cpp @@ -141,68 +141,6 @@ static void export_fdb_status_details(const std::string& status_str) { DCHECK(node->value.IsDouble()); return static_cast(node->value.GetDouble() * NANOSECONDS); }; - auto get_process_metric = [&](std::string component) { - auto node = document.FindMember("cluster"); - if (!node->value.HasMember("processes")) return; - node = node->value.FindMember("processes"); - // process - for (auto process_node = node->value.MemberBegin(); process_node != node->value.MemberEnd(); - process_node++) { - const char* process_id = process_node->name.GetString(); - decltype(process_node) component_node; - // get component iter - if (!process_node->value.HasMember(component.data())) return; - component_node = process_node->value.FindMember(component.data()); - // There are three cases here: int64, double, and object. - // If it is double or int64, put it directly into the bvar. - // If it is an object, recursively obtain the full name and corresponding value. - // such as: {"disk": {"reads": {"counter": 123, "hz": 0}}} - // component is "disk", the names of these two values should be "reads_counter" and "reads_hz" - auto recursive_name_helper = [](std::string& origin_name, - const char* next_level_name) -> std::string { - return origin_name + '_' + next_level_name; - }; - // proved two type lambda func to handle object and other type - - // set_bvar_value is responsible for setting integer and float values to the corresponding bvar. - auto set_bvar_value = [&process_id, &component]( - std::string& name, - decltype(process_node)& temp_node) -> void { - if (temp_node->value.IsInt64()) { - g_bvar_fdb_process_status_int.put({process_id, component, name}, - temp_node->value.GetInt64()); - return; - } - if (temp_node->value.IsDouble()) { - g_bvar_fdb_process_status_float.put({process_id, component, name}, - temp_node->value.GetDouble()); - return; - } - LOG(WARNING) << fmt::format( - "Get process metrics set_bvar_value input a wrong type node {}", name); - }; - auto object_recursive = [&set_bvar_value, &recursive_name_helper]( - auto&& self, std::string name, - decltype(process_node) temp_node) -> void { - // if the node is an object, then get Member(iter) and recursive with iter as arg - if (temp_node->value.IsObject()) { - for (auto iter = temp_node->value.MemberBegin(); - iter != temp_node->value.MemberEnd(); iter++) { - self(self, recursive_name_helper(name, iter->name.GetString()), iter); - } - return; - } - // if not object, set bvar value - set_bvar_value(name, temp_node); - }; - // Note that the parameter passed to set_bvar_value here is the current node, not its Member - // so we can directly call object_recursive in the loop - for (auto metric_node = component_node->value.MemberBegin(); - metric_node != component_node->value.MemberEnd(); metric_node++) { - object_recursive(object_recursive, metric_node->name.GetString(), metric_node); - } - } - }; // Configuration g_bvar_fdb_configuration_coordinators_count.set_value( get_value({"configuration", "coordinators_count"})); @@ -245,26 +183,6 @@ static void export_fdb_status_details(const std::string& status_str) { get_nanoseconds({"latency_probe", "commit_seconds"})); g_bvar_fdb_latency_probe_read_ns.set_value(get_nanoseconds({"latency_probe", "read_seconds"})); - // Workload - g_bvar_fdb_workload_conflict_rate_hz.set_value( - get_value({"workload", "transactions", "conflicted", "hz"})); - g_bvar_fdb_workload_location_rate_hz.set_value( - get_value({"workload", "operations", "location_requests", "hz"})); - g_bvar_fdb_workload_keys_read_hz.set_value(get_value({"workload", "keys", "read", "hz"})); - g_bvar_fdb_workload_read_bytes_hz.set_value(get_value({"workload", "bytes", "read", "hz"})); - g_bvar_fdb_workload_read_rate_hz.set_value( - get_value({"workload", "operations", "reads", "hz"})); - g_bvar_fdb_workload_written_bytes_hz.set_value( - get_value({"workload", "bytes", "written", "hz"})); - g_bvar_fdb_workload_write_rate_hz.set_value( - get_value({"workload", "operations", "writes", "hz"})); - g_bvar_fdb_workload_transactions_started_hz.set_value( - get_value({"workload", "transactions", "started", "hz"})); - g_bvar_fdb_workload_transactions_committed_hz.set_value( - get_value({"workload", "transactions", "committed", "hz"})); - g_bvar_fdb_workload_transactions_rejected_hz.set_value( - get_value({"workload", "transactions", "rejected_for_queued_too_long", "hz"})); - // QOS g_bvar_fdb_qos_worst_data_lag_storage_server_ns.set_value( get_nanoseconds({"qos", "worst_data_lag_storage_server", "seconds"})); @@ -296,10 +214,117 @@ static void export_fdb_status_details(const std::string& status_str) { } } + // Helper function for recursive name construction + // such as: {"disk": {"reads": {"counter": 123, "hz": 0}}} + // component is "disk", the names of these two values should be "reads_counter" and "reads_hz" + auto recursive_name_helper = [](std::string& origin_name, + const char* next_level_name) -> std::string { + return origin_name + '_' + next_level_name; + }; + + // Generic recursive function to traverse JSON node and set bvar values + // There are three cases here: int64, double, and object. + // If it is double or int64, put it directly into the bvar. + // If it is an object, recursively obtain the full name and corresponding value. + auto recursive_traverse_and_set = [&recursive_name_helper](auto&& set_value_callback, + auto&& self, std::string name, + auto temp_node) -> void { + // if the node is an object, then get Member(iter) and recursive with iter as arg + if (temp_node->value.IsObject()) { + for (auto iter = temp_node->value.MemberBegin(); iter != temp_node->value.MemberEnd(); + iter++) { + self(set_value_callback, self, recursive_name_helper(name, iter->name.GetString()), + iter); + } + return; + } + // if not object, set bvar value + set_value_callback(name, temp_node); + }; + + auto get_process_metric = [&](std::string component) { + auto node = document.FindMember("cluster"); + if (!node->value.HasMember("processes")) return; + node = node->value.FindMember("processes"); + // process + for (auto process_node = node->value.MemberBegin(); process_node != node->value.MemberEnd(); + process_node++) { + const char* process_id = process_node->name.GetString(); + decltype(process_node) component_node; + // get component iter + if (!process_node->value.HasMember(component.data())) continue; + component_node = process_node->value.FindMember(component.data()); + + // set_bvar_value is responsible for setting integer and float values to the corresponding bvar. + auto set_bvar_value = [&process_id, &component]( + std::string& name, + decltype(process_node)& temp_node) -> void { + if (temp_node->value.IsInt64()) { + g_bvar_fdb_cluster_processes.put( + {process_id, component, name}, + static_cast(temp_node->value.GetInt64())); + return; + } + if (temp_node->value.IsDouble()) { + g_bvar_fdb_cluster_processes.put({process_id, component, name}, + temp_node->value.GetDouble()); + return; + } + LOG(WARNING) << fmt::format( + "Get process metrics set_bvar_value input a wrong type node {}", name); + }; + // Note that the parameter passed to set_bvar_value here is the current node, not its Member + // so we can directly call recursive_traverse_and_set in the loop + for (auto metric_node = component_node->value.MemberBegin(); + metric_node != component_node->value.MemberEnd(); metric_node++) { + recursive_traverse_and_set(set_bvar_value, recursive_traverse_and_set, + metric_node->name.GetString(), metric_node); + } + } + }; + + auto get_workload_metric = [&](std::string component) { + auto node = document.FindMember("cluster"); + if (!node->value.HasMember("workload")) return; + node = node->value.FindMember("workload"); + + if (!node->value.HasMember(component.data())) return; + auto component_node = node->value.FindMember(component.data()); + + // set_bvar_value is responsible for setting integer and float values to the corresponding bvar. + auto set_bvar_value = [&component](std::string& name, + decltype(component_node)& temp_node) -> void { + if (temp_node->value.IsInt64()) { + g_bvar_fdb_cluster_workload.put({component, name}, + static_cast(temp_node->value.GetInt64())); + return; + } + if (temp_node->value.IsDouble()) { + g_bvar_fdb_cluster_workload.put({component, name}, temp_node->value.GetDouble()); + return; + } + LOG(WARNING) << fmt::format( + "Get workload metrics set_bvar_value input a wrong type node {}", name); + }; + + // Reuse the common recursive_traverse_and_set function + for (auto metric_node = component_node->value.MemberBegin(); + metric_node != component_node->value.MemberEnd(); metric_node++) { + recursive_traverse_and_set(set_bvar_value, recursive_traverse_and_set, + metric_node->name.GetString(), metric_node); + } + }; + // Process Status get_process_metric("cpu"); get_process_metric("disk"); get_process_metric("memory"); + + // Workload Status + get_workload_metric("keys"); + get_workload_metric("bytes"); + get_workload_metric("operations"); + get_workload_metric("transactions"); } // boundaries include the key category{meta, txn, recycle...}, instance_id and sub_category{rowset, txn_label...} diff --git a/cloud/test/metric_test.cpp b/cloud/test/metric_test.cpp index 81174c73924de9..e00f62d990e5c3 100644 --- a/cloud/test/metric_test.cpp +++ b/cloud/test/metric_test.cpp @@ -196,97 +196,170 @@ TEST(MetricTest, FdbMetricExporterTest) { fdb_metric_exporter.start(); std::this_thread::sleep_for(std::chrono::milliseconds(10)); fdb_metric_exporter.stop(); - ASSERT_EQ(g_bvar_fdb_process_status_float.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "cpu", "usage_cores"}), 0.0012292); - ASSERT_EQ(g_bvar_fdb_process_status_float.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "disk", "busy"}), 0.0085999800000000001); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "disk", "free_bytes"}), 490412584960); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "disk", "reads_counter"}), 854857); - ASSERT_EQ(g_bvar_fdb_process_status_float.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "disk", "reads_hz"}), 0); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "disk", "reads_sectors"}), 0); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "disk", "total_bytes"}), 527295578112); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "disk", "writes_counter"}), 73765457); - ASSERT_EQ(g_bvar_fdb_process_status_float.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "disk", "writes_hz"}), 26.1999); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "disk", "writes_sectors"}), 1336); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "memory", "available_bytes"}), 3065090867); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "memory", "limit_bytes"}), 8589934592); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "memory", "rss_bytes"}), 46551040); - ASSERT_EQ(g_bvar_fdb_process_status_int.get({"09ca90b9f3f413e5816b2610ed8b465d", "memory", - "unused_allocated_memory"}), + ASSERT_EQ(g_bvar_fdb_cluster_processes.get({"09ca90b9f3f413e5816b2610ed8b465d", "memory", + "unused_allocated_memory"}), 655360); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"09ca90b9f3f413e5816b2610ed8b465d", "memory", "used_bytes"}), 122974208); // test second process - ASSERT_EQ(g_bvar_fdb_process_status_float.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "cpu", "usage_cores"}), 0.0049765900000000004); - ASSERT_EQ(g_bvar_fdb_process_status_float.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "disk", "busy"}), 0.012200000000000001); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "disk", "free_bytes"}), 489160159232); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "disk", "reads_counter"}), 877107); - ASSERT_EQ(g_bvar_fdb_process_status_float.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "disk", "reads_hz"}), 0); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "disk", "reads_sectors"}), 0); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "disk", "total_bytes"}), 527295578112); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "disk", "writes_counter"}), 79316112); - ASSERT_EQ(g_bvar_fdb_process_status_float.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "disk", "writes_hz"}), 30.9999); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "disk", "writes_sectors"}), 744); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "memory", "available_bytes"}), 3076787404); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "memory", "limit_bytes"}), 8589934592); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "memory", "rss_bytes"}), 72359936); - ASSERT_EQ(g_bvar_fdb_process_status_int.get({"0a456165f04e1ec1a2ade0ce523d54a8", "memory", - "unused_allocated_memory"}), + ASSERT_EQ(g_bvar_fdb_cluster_processes.get({"0a456165f04e1ec1a2ade0ce523d54a8", "memory", + "unused_allocated_memory"}), 393216); - ASSERT_EQ(g_bvar_fdb_process_status_int.get( + ASSERT_EQ(g_bvar_fdb_cluster_processes.get( {"0a456165f04e1ec1a2ade0ce523d54a8", "memory", "used_bytes"}), 157978624); } + + // workload status + { + g_bvar_fdb_machines_count.set_value(BVAR_FDB_INVALID_VALUE); + g_bvar_fdb_client_count.set_value(BVAR_FDB_INVALID_VALUE); + + std::string fdb_metric_example = "./fdb_metric_example.json"; + std::ifstream inFile(fdb_metric_example); + + ASSERT_TRUE(inFile.is_open()); + std::string fileContent((std::istreambuf_iterator(inFile)), + std::istreambuf_iterator()); + + std::shared_ptr txn_kv = std::make_shared(); + std::unique_ptr txn; + ASSERT_EQ(txn_kv->create_txn(&txn), TxnErrorCode::TXN_OK); + txn->put("\xff\xff/status/json", fileContent); + ASSERT_EQ(txn->commit(), TxnErrorCode::TXN_OK); + + FdbMetricExporter fdb_metric_exporter(txn_kv); + fdb_metric_exporter.sleep_interval_ms_ = 1; + fdb_metric_exporter.start(); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + fdb_metric_exporter.stop(); + + // Test transactions component + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"transactions", "started_hz"}), 12); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"transactions", "started_counter"}), 196874980); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"transactions", "committed_hz"}), 3.4); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"transactions", "committed_counter"}), 2083958); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"transactions", "conflicted_hz"}), 0); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"transactions", "conflicted_counter"}), 2970); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"transactions", "started_batch_priority_hz"}), + 0); + ASSERT_EQ( + g_bvar_fdb_cluster_workload.get({"transactions", "started_batch_priority_counter"}), + 155); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"transactions", "started_default_priority_hz"}), + 11); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get( + {"transactions", "started_default_priority_counter"}), + 192248190); + ASSERT_EQ( + g_bvar_fdb_cluster_workload.get({"transactions", "started_immediate_priority_hz"}), + 0.999999); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get( + {"transactions", "started_immediate_priority_counter"}), + 4626635); + + // Test operations component + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"operations", "reads_hz"}), 24.6); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"operations", "reads_counter"}), 324877376); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"operations", "writes_hz"}), 7.39999); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"operations", "writes_counter"}), 4336393); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"operations", "location_requests_hz"}), 0); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"operations", "location_requests_counter"}), + 107543); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"operations", "read_requests_hz"}), 24.4); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"operations", "read_requests_counter"}), + 324877376); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"operations", "memory_errors_hz"}), 0); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"operations", "memory_errors_counter"}), 0); + + // Test bytes component + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"bytes", "read_hz"}), 18468.2); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"bytes", "read_counter"}), 312243021624); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"bytes", "written_hz"}), 2042.2); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"bytes", "written_counter"}), 6678975461); + + // Test keys component + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"keys", "read_hz"}), 56.6); + ASSERT_EQ(g_bvar_fdb_cluster_workload.get({"keys", "read_counter"}), 728858585); + } } \ No newline at end of file