in src/shell/commands/table_management.cpp [469:665]
bool app_stat(command_executor *e, shell_context *sc, arguments args)
{
static struct option long_options[] = {{"app_name", required_argument, 0, 'a'},
{"only_qps", required_argument, 0, 'q'},
{"only_usage", required_argument, 0, 'u'},
{"json", no_argument, 0, 'j'},
{"output", required_argument, 0, 'o'},
{0, 0, 0, 0}};
std::string app_name;
std::string out_file;
bool only_qps = false;
bool only_usage = false;
bool json = false;
optind = 0;
while (true) {
int option_index = 0;
int c;
c = getopt_long(args.argc, args.argv, "a:qujo:", long_options, &option_index);
if (c == -1)
break;
switch (c) {
case 'a':
app_name = optarg;
break;
case 'q':
only_qps = true;
break;
case 'u':
only_usage = true;
break;
case 'j':
json = true;
break;
case 'o':
out_file = optarg;
break;
default:
return false;
}
}
if (only_qps && only_usage) {
std::cout << "ERROR: only_qps and only_usage should not be set at the same time"
<< std::endl;
return true;
}
std::vector<row_data> rows;
if (!get_app_stat(sc, app_name, rows)) {
std::cout << "ERROR: query app stat from server failed" << std::endl;
return true;
}
rows.resize(rows.size() + 1);
row_data &sum = rows.back();
sum.row_name = "(total:" + std::to_string(rows.size() - 1) + ")";
for (int i = 0; i < rows.size() - 1; ++i) {
row_data &row = rows[i];
sum.partition_count += row.partition_count;
sum.get_qps += row.get_qps;
sum.multi_get_qps += row.multi_get_qps;
sum.batch_get_qps += row.batch_get_qps;
sum.put_qps += row.put_qps;
sum.multi_put_qps += row.multi_put_qps;
sum.remove_qps += row.remove_qps;
sum.multi_remove_qps += row.multi_remove_qps;
sum.incr_qps += row.incr_qps;
sum.check_and_set_qps += row.check_and_set_qps;
sum.check_and_mutate_qps += row.check_and_mutate_qps;
sum.scan_qps += row.scan_qps;
sum.recent_read_cu += row.recent_read_cu;
sum.recent_write_cu += row.recent_write_cu;
sum.recent_expire_count += row.recent_expire_count;
sum.recent_filter_count += row.recent_filter_count;
sum.recent_abnormal_count += row.recent_abnormal_count;
sum.recent_write_throttling_delay_count += row.recent_write_throttling_delay_count;
sum.recent_write_throttling_reject_count += row.recent_write_throttling_reject_count;
sum.recent_read_throttling_delay_count += row.recent_read_throttling_delay_count;
sum.recent_read_throttling_reject_count += row.recent_read_throttling_reject_count;
sum.recent_backup_request_throttling_delay_count +=
row.recent_backup_request_throttling_delay_count;
sum.recent_backup_request_throttling_reject_count +=
row.recent_backup_request_throttling_reject_count;
sum.recent_write_splitting_reject_count += row.recent_write_splitting_reject_count;
sum.recent_read_splitting_reject_count += row.recent_read_splitting_reject_count;
sum.recent_write_bulk_load_ingestion_reject_count +=
row.recent_write_bulk_load_ingestion_reject_count;
sum.storage_mb += row.storage_mb;
sum.storage_count += row.storage_count;
sum.rdb_block_cache_hit_count += row.rdb_block_cache_hit_count;
sum.rdb_block_cache_total_count += row.rdb_block_cache_total_count;
sum.rdb_index_and_filter_blocks_mem_usage += row.rdb_index_and_filter_blocks_mem_usage;
sum.rdb_memtable_mem_usage += row.rdb_memtable_mem_usage;
sum.rdb_bf_seek_negatives += row.rdb_bf_seek_negatives;
sum.rdb_bf_seek_total += row.rdb_bf_seek_total;
sum.rdb_bf_point_positive_true += row.rdb_bf_point_positive_true;
sum.rdb_bf_point_positive_total += row.rdb_bf_point_positive_total;
sum.rdb_bf_point_negatives += row.rdb_bf_point_negatives;
}
std::streambuf *buf;
std::ofstream of;
if (!out_file.empty()) {
of.open(out_file);
buf = of.rdbuf();
} else {
buf = std::cout.rdbuf();
}
std::ostream out(buf);
::dsn::utils::table_printer tp("app_stat", 2 /* tabular_width */, 3 /* precision */);
tp.add_title(app_name.empty() ? "app_name" : "pidx");
if (app_name.empty()) {
tp.add_column("app_id", tp_alignment::kRight);
tp.add_column("pcount", tp_alignment::kRight);
}
if (!only_usage) {
tp.add_column("GET", tp_alignment::kRight);
tp.add_column("MGET", tp_alignment::kRight);
tp.add_column("BGET", tp_alignment::kRight);
tp.add_column("PUT", tp_alignment::kRight);
tp.add_column("MPUT", tp_alignment::kRight);
tp.add_column("DEL", tp_alignment::kRight);
tp.add_column("MDEL", tp_alignment::kRight);
tp.add_column("INCR", tp_alignment::kRight);
tp.add_column("CAS", tp_alignment::kRight);
tp.add_column("CAM", tp_alignment::kRight);
tp.add_column("SCAN", tp_alignment::kRight);
tp.add_column("RCU", tp_alignment::kRight);
tp.add_column("WCU", tp_alignment::kRight);
tp.add_column("expire", tp_alignment::kRight);
tp.add_column("filter", tp_alignment::kRight);
tp.add_column("abnormal", tp_alignment::kRight);
tp.add_column("delay", tp_alignment::kRight);
tp.add_column("reject", tp_alignment::kRight);
}
if (!only_qps) {
tp.add_column("file_mb", tp_alignment::kRight);
tp.add_column("file_num", tp_alignment::kRight);
tp.add_column("mem_tbl_mb", tp_alignment::kRight);
tp.add_column("mem_idx_mb", tp_alignment::kRight);
}
tp.add_column("hit_rate", tp_alignment::kRight);
tp.add_column("seek_n_rate", tp_alignment::kRight);
tp.add_column("point_n_rate", tp_alignment::kRight);
tp.add_column("point_fp_rate", tp_alignment::kRight);
for (row_data &row : rows) {
tp.add_row(row.row_name);
if (app_name.empty()) {
tp.append_data(row.app_id);
tp.append_data(row.partition_count);
}
if (!only_usage) {
tp.append_data(row.get_qps);
tp.append_data(row.multi_get_qps);
tp.append_data(row.batch_get_qps);
tp.append_data(row.put_qps);
tp.append_data(row.multi_put_qps);
tp.append_data(row.remove_qps);
tp.append_data(row.multi_remove_qps);
tp.append_data(row.incr_qps);
tp.append_data(row.check_and_set_qps);
tp.append_data(row.check_and_mutate_qps);
tp.append_data(row.scan_qps);
tp.append_data(row.recent_read_cu);
tp.append_data(row.recent_write_cu);
tp.append_data(row.recent_expire_count);
tp.append_data(row.recent_filter_count);
tp.append_data(row.recent_abnormal_count);
tp.append_data(row.recent_write_throttling_delay_count);
tp.append_data(row.recent_write_throttling_reject_count);
}
if (!only_qps) {
tp.append_data(row.storage_mb);
tp.append_data((uint64_t)row.storage_count);
tp.append_data(row.rdb_memtable_mem_usage / (1 << 20U));
tp.append_data(row.rdb_index_and_filter_blocks_mem_usage / (1 << 20U));
}
tp.append_data(
convert_to_ratio(row.rdb_block_cache_hit_count, row.rdb_block_cache_total_count));
tp.append_data(convert_to_ratio(row.rdb_bf_seek_negatives, row.rdb_bf_seek_total));
tp.append_data(
convert_to_ratio(row.rdb_bf_point_negatives,
row.rdb_bf_point_negatives + row.rdb_bf_point_positive_total));
tp.append_data(
convert_to_ratio(row.rdb_bf_point_positive_total - row.rdb_bf_point_positive_true,
(row.rdb_bf_point_positive_total - row.rdb_bf_point_positive_true) +
row.rdb_bf_point_negatives));
}
tp.output(out, json ? tp_output_format::kJsonPretty : tp_output_format::kTabular);
return true;
}