【Ceph RGW】radosgw_usage_exporter监控用户使用量
1 Overview
Ceph Mgr Prometheus 的模块没有提供用户数据使用量的指标,而在 Ceph 日常运维中,我们希望知道哪个用户用了多少存储容量,或者距离 Quota 还有多少,方便自动化扩容等等,所以推荐一个开源的 prometheus exeporter 来通过 radosgw 来输出用户在 Ceph 集群使用的量。 再次明确一下,这个 usage 的监控,主要需要两方面的指标。
- usage: 就是用户不同 bucket 的使用量
- bucket: 桶的情况,比如说读写操作的次数,成功率,大小等等
2 radosgw_usage_exporter
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。
2.1 usage
先看一下 usage 方面,可以先参考 Ceph 的官方文档 get-usage。文档里有该 RESTful API 的详细请求和返回参数。
如果熟悉 Ceph RGW 的读者,应该是知道 adosgw-admin bucket stats
这个命令也是可以得到这些返回的结果的。
2.2 bucket
然后看 bucket 方面,同样是参考 Ceph 的官方文档 get-bucket-info。
如果熟悉 Ceph RGW 的读者,应该是知道 adosgw-admin bucket stats
这个命令也是可以得到这些返回的结果的。
3 关于权限
需要读取到 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"
4 metrics
我写了一个 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 中,不同用户的使用量了!
- 如何解决EnterLib异常处理框架最大的局限——基于异常"类型"的异常处理策略
- [WCF权限控制]从两个重要的概念谈起:Identity与Principal[下篇]
- 收藏!6道常见hadoop面试题及答案解析
- 这是EnterLib PIAB的BUG吗?
- [WCF权限控制]基于Windows用户组的授权方式[上篇]
- EnterLib PIAB又一个BUG?
- 关于WCF的一个非常“无语”的BUG!
- 谈谈分布式事务之一:SOA需要怎样的事务控制方式
- [WCF权限控制]WCF的三种授权模式
- [WCF安全系列]消息的保护等级[下篇]
- [WCF安全系列]通过绑定元素看各种绑定对消息保护的实现
- 通过添加HTTP Header实现上下文数据在WCF的自动传递
- 模拟在WCF中的应用
- [WCF权限控制]通过扩展自行实现服务授权[提供源码下载]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux文件管理参考
- CloudBase Framework丨第一个 Deno 部署工具是如何打造的?
- 关于null通过+" ",String.ValueOf转换为字符串的问题!!!
- Java实现尺取法
- 【自然语言处理】利用朴素贝叶斯进行新闻分类(自己处理数据)
- mybatis文件映射之select操作返回Map
- shm进程间通信失败了!!!
- Vue3.0 beta源码学习笔记(二)
- 【自然语言处理】使用朴素贝叶斯进行语种检测
- 关于errno的后事妥善处理
- Vue3.0 beta源码学习笔记(三)
- 你会不会分布式系统进程间通信?
- 学以致用C++设计模式 之 “备忘录模式”
- Mybatis学习笔记(三)关联查询以及相关属性
- 学以致用C++设计模式 之 “装饰者模式”