Ceph usage 的查询
2016-01-04
介绍
admin commands
1 | radosgw-admin usage show [–uid={uid}] [–start-date={date}] [–end-date={date}] [–categories=<list>] [–show-log-entries=<flag>] [–show-log-sum=<flag>] |
example:
1 | radosgw-admin usage show –uid=demo –start-date=“2015-12-01 08:00:00” –end-date=“2015-12-02 08:00:00” –categories=“put_obj,put_acls” |
- –start-date、–categories 中含需转义字符,使用” “即可。
- –show-log-entries=true/false 即usage详细条目,–show-log-sum=true/false 即usage概览
- 关于 –categories,有如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22radosgw-admin usage show | grep category | awk -F ‘“‘ ‘{print $4}’ | sort | uniq
abort_multipart
complete_multipart
copy_obj
create_bucket
delete_bucket
delete_obj
get_acls
get_bucket_logging
get_cors
get_obj
init_multipart
list_bucket
list_bucket_multiparts
list_buckets
list_multipart
multi_object_delete
options_cors
post_obj
put_acls
put_obj
stat_bucket
admin restapi
请求
1 | GET /admin/usage HTTP/1.1 |
请求参数
1 | uid,start,end,show-entries,show-summary |
example
1 | relativePath=“/admin/usage” |
code
- rgw_admin.cc:main()可以用 –date 或 –time 来指定 end_date
1
2
3
4
5
6
7
8
9else if (ceph_argparse_witharg(args, i, &val, “–date”, “–time”, (char)NULL)) {
date = val;
if (end_date.empty())
end_date = date;
} else if (ceph_argparse_witharg(args, i, &val, “–start-date”, “–start-time”, (char)NULL)) {
start_date = val;
} else if (ceph_argparse_witharg(args, i, &val, “–end-date”, “–end-time”, (char)NULL)) {
end_date = val;
}
–-date 也可以用 –-time 来指定2. utime_t::parse_date()p = strptime(date.c_str(), “%Y-%m-%d”, &tm);1
const char
strptime() 函数成功返回 buff 的最后位置,失败返回空指针。
当 date 是 “%Y-%m-%d %H:%M:%S” 时,p 为字符 “ “,先转换 %Y-%m-%d,当 p== “ “,说明还有 %H:%M:%S date 可以是 “%Y-%m-%d” 或者 “%Y-%m-%d %H:%M:%S”3. rgw_log.cc:125
存储一个usage时调用的方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17void insert(utime_t& timestamp, rgw_usage_log_entry& entry) {
lock.Lock();
if (timestamp.sec() > round_timestamp + 3600)
recalc_round_timestamp(timestamp);
entry.epoch = round_timestamp.sec();
bool account;
rgw_user_bucket ub(entry.owner, entry.bucket);
usage_map[ub].insert(round_timestamp, entry, &account);
if (account)
num_entries++;
bool need_flush = (num_entries > cct->_conf->rgw_usage_log_flush_threshold);
lock.Unlock();
if (need_flush) {
Mutex::Locker l(timer_lock);
flush();
}
}
对应的recalc_round_timestamp()
1 | void recalc_round_timestamp(utime_t& ts) { |
最终的 usage_map[ub].insert(round_timestamp, entry, &account); 中的 round_timestamp 是以小时为单位。
总结
usage 的查询可以时间可以指定到时分秒,但事实上 usage 的存储是以小时为单位的,也就是说可以精确到小时。
time 的 start、end 遵循左闭右开的规则。
该时间是 UTC 时间。