From 793bebb82e4e982dcaeacd4888875f64153e3a61 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 6 Sep 2012 16:46:26 -0700 Subject: [PATCH] rgw: rgw-admin filter usage by categories rgw can now filter usage output by specific op categories. Signed-off-by: Yehuda Sadeh --- src/cls/rgw/cls_rgw_types.h | 15 +++++++++++++-- src/rgw/rgw_admin.cc | 31 +++++++++++++++++++++++++++---- src/test/cli/radosgw-admin/help.t | 1 + 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/cls/rgw/cls_rgw_types.h b/src/cls/rgw/cls_rgw_types.h index b6a8f399c7384..5dbc6168ad5a7 100644 --- a/src/cls/rgw/cls_rgw_types.h +++ b/src/cls/rgw/cls_rgw_types.h @@ -272,7 +272,7 @@ struct rgw_usage_log_entry { DECODE_FINISH(bl); } - void aggregate(const rgw_usage_log_entry& e) { + void aggregate(const rgw_usage_log_entry& e, map *categories = NULL) { if (owner.empty()) { owner = e.owner; bucket = e.bucket; @@ -280,7 +280,18 @@ struct rgw_usage_log_entry { } map::const_iterator iter; for (iter = e.usage_map.begin(); iter != e.usage_map.end(); ++iter) { - add(iter->first, iter->second); + if (!categories || !categories->size() || categories->count(iter->first)) { + add(iter->first, iter->second); + } + } + } + + void sum(rgw_usage_data& usage, map& categories) const { + usage = rgw_usage_data(); + for (map::const_iterator iter = usage_map.begin(); iter != usage_map.end(); ++iter) { + if (!categories.size() || categories.count(iter->first)) { + usage.aggregate(iter->second); + } } } diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 062ffade8681f..fcbeed78f4683 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -12,6 +12,7 @@ using namespace std; #include "global/global_init.h" #include "common/errno.h" #include "include/utime.h" +#include "include/str_list.h" #include "common/armor.h" #include "rgw_user.h" @@ -94,6 +95,7 @@ void _usage() cerr << " --show-log-sum= enable/disable dump of log summation on log show\n"; cerr << " --skip-zero-entries log show only dumps entries that don't have zero value\n"; cerr << " in one of the numeric field\n"; + cerr << " --categories= comma separated list of categories, used in usage show\n"; cerr << " --yes-i-really-mean-it required for certain operations\n"; cerr << "\n"; cerr << " := \"YYYY-MM-DD[ hh:mm:ss]\"\n"; @@ -646,11 +648,13 @@ static int remove_bucket(rgw_bucket& bucket, bool delete_children) return ret; } -void dump_usage_categories_info(Formatter *formatter, const rgw_usage_log_entry& entry) +void dump_usage_categories_info(Formatter *formatter, const rgw_usage_log_entry& entry, map& categories) { formatter->open_array_section("categories"); map::const_iterator uiter; for (uiter = entry.usage_map.begin(); uiter != entry.usage_map.end(); ++uiter) { + if (categories.size() && !categories.count(uiter->first)) + continue; const rgw_usage_data& usage = uiter->second; formatter->open_object_section("entry"); formatter->dump_string("category", uiter->first); @@ -705,6 +709,7 @@ int main(int argc, char **argv) int yes_i_really_mean_it = false; int delete_child_objects = false; int max_buckets = -1; + map categories; std::string val; std::ostringstream errs; @@ -781,6 +786,14 @@ int main(int argc, char **argv) } } else if (ceph_argparse_witharg(args, i, &val, "--format", (char*)NULL)) { format = val; + } else if (ceph_argparse_witharg(args, i, &val, "--categories", (char*)NULL)) { + string cat_str = val; + list cat_list; + list::iterator iter; + get_str_list(cat_str, cat_list); + for (iter = cat_list.begin(); iter != cat_list.end(); ++iter) { + categories[*iter] = true; + } } else if (ceph_argparse_binary_flag(args, i, &delete_child_objects, NULL, "--purge-objects", (char*)NULL)) { // do nothing } else if (ceph_argparse_binary_flag(args, i, &pretty_format, NULL, "--pretty-format", (char*)NULL)) { @@ -1591,12 +1604,12 @@ next: utime_t ut(entry.epoch, 0); ut.gmtime(formatter->dump_stream("time")); formatter->dump_int("epoch", entry.epoch); - dump_usage_categories_info(formatter, entry); + dump_usage_categories_info(formatter, entry, categories); formatter->close_section(); // bucket formatter->flush(cout); } - summary_map[ub.user].aggregate(entry); + summary_map[ub.user].aggregate(entry, &categories); } } if (show_log_entries) { @@ -1614,8 +1627,18 @@ next: const rgw_usage_log_entry& entry = siter->second; formatter->open_object_section("user"); formatter->dump_string("user", siter->first); - dump_usage_categories_info(formatter, entry); + dump_usage_categories_info(formatter, entry, categories); + rgw_usage_data total_usage; + entry.sum(total_usage, categories); + formatter->open_object_section("total"); + formatter->dump_int("bytes_sent", total_usage.bytes_sent); + formatter->dump_int("bytes_received", total_usage.bytes_received); + formatter->dump_int("ops", total_usage.ops); + formatter->dump_int("successful_ops", total_usage.successful_ops); + formatter->close_section(); // total + formatter->close_section(); // user + formatter->flush(cout); } diff --git a/src/test/cli/radosgw-admin/help.t b/src/test/cli/radosgw-admin/help.t index c71de5c295735..c17e5056713e0 100644 --- a/src/test/cli/radosgw-admin/help.t +++ b/src/test/cli/radosgw-admin/help.t @@ -64,6 +64,7 @@ --show-log-sum= enable/disable dump of log summation on log show --skip-zero-entries log show only dumps entries that don't have zero value in one of the numeric field + --categories= comma separated list of categories, used in usage show --yes-i-really-mean-it required for certain operations := "YYYY-MM-DD[ hh:mm:ss]" -- 2.39.5