1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
9 #include "rgw_formats.h"
14 static void dump_usage_categories_info(Formatter
*formatter
, const rgw_usage_log_entry
& entry
, map
<string
, bool> *categories
)
16 formatter
->open_array_section("categories");
17 map
<string
, rgw_usage_data
>::const_iterator uiter
;
18 for (uiter
= entry
.usage_map
.begin(); uiter
!= entry
.usage_map
.end(); ++uiter
) {
19 if (categories
&& !categories
->empty() && !categories
->count(uiter
->first
))
21 const rgw_usage_data
& usage
= uiter
->second
;
22 formatter
->open_object_section("entry");
23 formatter
->dump_string("category", uiter
->first
);
24 formatter
->dump_int("bytes_sent", usage
.bytes_sent
);
25 formatter
->dump_int("bytes_received", usage
.bytes_received
);
26 formatter
->dump_int("ops", usage
.ops
);
27 formatter
->dump_int("successful_ops", usage
.successful_ops
);
28 formatter
->close_section(); // entry
30 formatter
->close_section(); // categories
33 int RGWUsage::show(RGWRados
*store
, rgw_user
& uid
, uint64_t start_epoch
,
34 uint64_t end_epoch
, bool show_log_entries
, bool show_log_sum
,
35 map
<string
, bool> *categories
,
36 RGWFormatterFlusher
& flusher
)
38 uint32_t max_entries
= 1000;
40 bool is_truncated
= true;
42 RGWUsageIter usage_iter
;
43 Formatter
*formatter
= flusher
.get_formatter();
45 map
<rgw_user_bucket
, rgw_usage_log_entry
> usage
;
49 formatter
->open_object_section("usage");
50 if (show_log_entries
) {
51 formatter
->open_array_section("entries");
54 bool user_section_open
= false;
55 map
<string
, rgw_usage_log_entry
> summary_map
;
56 while (is_truncated
) {
57 int ret
= store
->read_usage(uid
, start_epoch
, end_epoch
, max_entries
,
58 &is_truncated
, usage_iter
, usage
);
69 map
<rgw_user_bucket
, rgw_usage_log_entry
>::iterator iter
;
70 for (iter
= usage
.begin(); iter
!= usage
.end(); ++iter
) {
71 const rgw_user_bucket
& ub
= iter
->first
;
72 const rgw_usage_log_entry
& entry
= iter
->second
;
74 if (show_log_entries
) {
75 if (ub
.user
.compare(last_owner
) != 0) {
76 if (user_section_open
) {
77 formatter
->close_section();
78 formatter
->close_section();
80 formatter
->open_object_section("user");
81 formatter
->dump_string("user", ub
.user
);
82 formatter
->open_array_section("buckets");
83 user_section_open
= true;
86 formatter
->open_object_section("bucket");
87 formatter
->dump_string("bucket", ub
.bucket
);
88 utime_t
ut(entry
.epoch
, 0);
89 ut
.gmtime(formatter
->dump_stream("time"));
90 formatter
->dump_int("epoch", entry
.epoch
);
91 string owner
= entry
.owner
.to_str();
92 string payer
= entry
.payer
.to_str();
93 formatter
->dump_string("owner", owner
);
94 if (!payer
.empty() && payer
!= owner
) {
95 formatter
->dump_string("payer", payer
);
97 dump_usage_categories_info(formatter
, entry
, categories
);
98 formatter
->close_section(); // bucket
102 summary_map
[ub
.user
].aggregate(entry
, categories
);
105 if (show_log_entries
) {
106 if (user_section_open
) {
107 formatter
->close_section(); // buckets
108 formatter
->close_section(); //user
110 formatter
->close_section(); // entries
114 formatter
->open_array_section("summary");
115 map
<string
, rgw_usage_log_entry
>::iterator siter
;
116 for (siter
= summary_map
.begin(); siter
!= summary_map
.end(); ++siter
) {
117 const rgw_usage_log_entry
& entry
= siter
->second
;
118 formatter
->open_object_section("user");
119 formatter
->dump_string("user", siter
->first
);
120 dump_usage_categories_info(formatter
, entry
, categories
);
121 rgw_usage_data total_usage
;
122 entry
.sum(total_usage
, *categories
);
123 formatter
->open_object_section("total");
124 formatter
->dump_int("bytes_sent", total_usage
.bytes_sent
);
125 formatter
->dump_int("bytes_received", total_usage
.bytes_received
);
126 formatter
->dump_int("ops", total_usage
.ops
);
127 formatter
->dump_int("successful_ops", total_usage
.successful_ops
);
128 formatter
->close_section(); // total
130 formatter
->close_section(); // user
135 formatter
->close_section(); // summary
138 formatter
->close_section(); // usage
144 int RGWUsage::trim(RGWRados
*store
, rgw_user
& uid
, uint64_t start_epoch
,
147 return store
->trim_usage(uid
, start_epoch
, end_epoch
);