Ceph Mgr Prometheus 的模块没有提供用户数据使用量的指标,而在 Ceph 日常运维中,我们希望知道哪个用户用了多少存储容量,或者距离 Quota 还有多少,方便自动化扩容等等,所以推荐一个开源的 prometheus exeporter 来通过 radosgw 来输出用户在 Ceph 集群使用的量。 再次明确一下,这个 usage 的监控,主要需要两方面的指标。
https://github.com/blemmenes/radosgw_usage_exporter
因为这个 exporter 其实是很简单的,可以查看一下 radosgw_usage_exporter.py 源码,分析一下 exporter 的实现。
核心的两个方法 _get_usage()
和 _get_bucket_usage()
,实际上这两个方法是通过 Ceph RGW 的 API 来封装的。
关于 radosgw_usage_exporter 输出哪些指标呢,我们可以看看源码。
def _setup_empty_prometheus_metrics(self):
"""
The metrics we want to export.
"""
self._prometheus_metrics = {
'ops':
CounterMetricFamily('radosgw_usage_ops_total',
'Number of operations',
labels=["bucket", "owner", "category", "cluster"]),
'successful_ops':
CounterMetricFamily('radosgw_usage_successful_ops_total',
'Number of successful operations',
labels=["bucket", "owner", "category", "cluster"]),
'bytes_sent':
CounterMetricFamily('radosgw_usage_sent_bytes_total',
'Bytes sent by the RADOSGW',
labels=["bucket", "owner", "category", "cluster"]),
'bytes_received':
CounterMetricFamily('radosgw_usage_received_bytes_total',
'Bytes received by the RADOSGW',
labels=["bucket", "owner", "category", "cluster"]),
'bucket_usage_bytes':
GaugeMetricFamily('radosgw_usage_bucket_bytes',
'Bucket used bytes',
labels=["bucket", "owner", "zonegroup", "cluster"]),
'bucket_utilized_bytes':
GaugeMetricFamily('radosgw_usage_bucket_utilized_bytes',
'Bucket utilized bytes',
labels=["bucket", "owner", "zonegroup", "cluster"]),
'bucket_usage_objects':
GaugeMetricFamily('radosgw_usage_bucket_objects',
'Number of objects in bucket',
labels=["bucket", "owner", "zonegroup", "cluster"]),
'scrape_duration_seconds':
GaugeMetricFamily('radosgw_usage_scrape_duration_seconds',
'Ammount of time each scrape takes',
labels=[])
}
一共有8个指标,分别是:
radosgw_usage_ops_total
是指 rgw 的操作次数。radosgw_usage_successful_ops_total
是指成功的操作次数。radosgw_usage_sent_bytes_total
是指发送的字节数。radosgw_usage_received_bytes_total
是指接收的字节数。radosgw_usage_bucket_bytes
是指对象的原始字节数。radosgw_usage_bucket_utilized_bytes
是指对象的实际字节数(因为会有压缩等操作)。radosgw_usage_bucket_objects
是指对象数量。radosgw_usage_scrape_duration_seconds
是指获取指标的时间秒数。其实这些数据,Ceph RGW 都有提供接口通过 http 的方式获取的,然后通过 python 发送请求,得到 response 之后,根据返回结果的 JSON 重新选择如 size_utilized
, owner
这些参数,构建指标的 Value 和 Label。
先看一下 usage 方面,可以先参考 Ceph 的官方文档 get-usage。文档里有该 RESTful API 的详细请求和返回参数。
如果熟悉 Ceph RGW 的读者,应该是知道 adosgw-admin bucket stats
这个命令也是可以得到这些返回的结果的。
然后看 bucket 方面,同样是参考 Ceph 的官方文档 get-bucket-info。
如果熟悉 Ceph RGW 的读者,应该是知道 adosgw-admin bucket stats
这个命令也是可以得到这些返回的结果的。
需要读取到 bucket 和 usage 的用户,并且对 bucket 和 usage 是至少有 read
权限的。可以通过下面命令创建一个 admin 账号来专门获取这些指标。这里要注意的是,权限不要放得太大了,完全 read
就够了。
radosgw-admin user create --uid=admin --display-name="admin"
radosgw-admin key create --uid=admin --key-type=s3 --access-key admin --secret-key admin
radosgw-admin caps add --uid=admin --caps="users=read;buckets=read;usage=read;metadata=read;zone=read"
我写了一个 service unit 来通过 systemctl
来管理进程。
cat >/lib/systemd/system/radosgw_usage_exporter.service <<EOF
[Unit]
Description=radosgw_usage_exporter
[Service]
Type=simple
ExecStart=/usr/bin/python /data/ceph/bucket-metrics/radosgw_usage_exporter.py -H localhost:7480 -a admin -s admin
[Install]
WantedBy=radosgw_usage_exporter.target
EOF
启动和验证就很简单了。
systemctl daemon-reload
systemctl stop radosgw_usage_exporter.service
systemctl start radosgw_usage_exporter.service
systemctl status radosgw_usage_exporter.service
# 最后 curl 一下默认端口的指标看看指标的 Value 和 Label 是否设置正确了
curl localhost:9242/metrics
然后针对 metrics 来构建一个 grafana 的图。
Done! 现在我们就可以很方便地看到 Ceph RGW 中,不同用户的使用量了!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。