Ceph usage 的查询

介绍

usage 用于统计用户的使用情况,操作记录。

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
    22
    radosgw-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
2
3
4
GET /admin/usage HTTP/1.1
Host: host
date: Date
Authorization: auth

请求参数

1
uid,start,end,show-entries,show-summary

example

1
2
3
4
5
6
relativePath=“/admin/usage”
start=“2015-12-20%2020%3A00%3A00” # : 和空格转义
curl -s -v -X GET “http://${HOST}${relativePath}?start=${start}&show-entries=true&show-summary=false” \
-H “Authorization: AWS ${KEY_ID}:${signature} \
-H “Date: ${DATE} \
-H “Host: ${HOST}

code

  1. rgw_admin.cc:main()
    1
    2
    3
    4
    5
    6
    7
    8
    9
    else 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 来指定 end_date
    -date 也可以用 –-time 来指定2. utime_t::parse_date()
    1
    const char 
    p = strptime(date.c_str(), “%Y-%m-%d”, &tm);

    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
    17
    void 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
2
3
void recalc_round_timestamp(utime_t& ts) {
round_timestamp = ts.round_to_hour();
}

最终的 usage_map[ub].insert(round_timestamp, entry, &account); 中的 round_timestamp 是以小时为单位。

总结

usage 的查询可以时间可以指定到时分秒,但事实上 usage 的存储是以小时为单位的,也就是说可以精确到小时。
time 的 start、end 遵循左闭右开的规则。
该时间是 UTC 时间。