Skip to content

Commit

Permalink
Add /cluster/<fsid>/{pool/<id>/}stats endpoints
Browse files Browse the repository at this point in the history
The commit adds two stats endpoints that provide cluster as well per
pool statistics.

Signed-off-by: Boris Ranto <branto@redhat.com>
  • Loading branch information
b-ranto committed Oct 11, 2016
1 parent 4556b99 commit 2b679e8
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 2 deletions.
28 changes: 28 additions & 0 deletions rest-api/calamari_rest/serializers/v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -386,3 +386,31 @@ class Meta:
out = serializers.CharField(help_text="Standard out")
err = serializers.CharField(help_text="Standard error")
status = serializers.IntegerField(help_text="Exit code")


class ClusterStatsSerializer(serializers.Serializer):
class Meta:
fields = ('kb', 'num_objects', 'kb_avail', 'kb_used')

kb = serializers.IntegerField(help_text='total kb')
num_objects = serializers.IntegerField(help_text='total number of objects')
kb_avail = serializers.IntegerField(help_text='available kb')
kb_used = serializers.IntegerField(help_text='used kb')


class PoolStatsSerializer(serializers.Serializer):
class Meta:
fields = ('num_objects_unfound', 'num_objects_missing_on_primary', 'num_object_clones', 'num_objects', 'num_object_copies', 'num_bytes', 'num_rd_kb', 'num_wr_kb', 'num_kb', 'num_wr', 'num_objects_degraded', 'num_rd')

num_objects_unfound = serializers.IntegerField()
num_objects_missing_on_primary = serializers.IntegerField()
num_object_clones = serializers.IntegerField()
num_objects = serializers.IntegerField()
num_object_copies = serializers.IntegerField()
num_bytes = serializers.IntegerField()
num_rd_kb = serializers.IntegerField()
num_wr_kb = serializers.IntegerField()
num_kb = serializers.IntegerField()
num_wr = serializers.IntegerField()
num_objects_degraded = serializers.IntegerField()
num_rd = serializers.IntegerField()
7 changes: 6 additions & 1 deletion rest-api/calamari_rest/urls/v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
calamari_rest.views.v2.RequestViewSet.as_view({'get': 'list'}),
name='cluster-request-list'),

# OSDs, Pools, CRUSH
# OSDs, Pools, CRUSH, stats
url(r'^cluster/(?P<fsid>[a-zA-Z0-9-]+)/crush_map$',
calamari_rest.views.v2.CrushMapViewSet.as_view({'get': 'retrieve', 'post': 'replace'}),
name='cluster-crush_map'),
Expand Down Expand Up @@ -73,6 +73,11 @@
'patch': 'update',
'delete': 'destroy'}),
name='cluster-pool-detail'),
url(r'^cluster/(?P<fsid>[a-zA-Z0-9-]+)/pool/(?P<pool_id>\d+)/stats$',
calamari_rest.views.v2.PoolStatsViewSet.as_view({'get': 'retrieve'}),
name='cluster-pool-stats'),
url(r'^cluster/(?P<fsid>[a-zA-Z0-9-]+)/stats$',
calamari_rest.views.v2.ClusterStatsViewSet.as_view({'get': 'retrieve'})),

url(r'^cluster/(?P<fsid>[a-zA-Z0-9-]+)/osd$',
calamari_rest.views.v2.OsdViewSet.as_view({'get': 'list'}),
Expand Down
26 changes: 25 additions & 1 deletion rest-api/calamari_rest/views/v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from calamari_rest.serializers.v2 import PoolSerializer, CrushRuleSetSerializer, CrushRuleSerializer, CrushNodeSerializer, CrushTypeSerializer,\
ServerSerializer, SimpleServerSerializer, SaltKeySerializer, RequestSerializer, \
ClusterSerializer, EventSerializer, LogTailSerializer, OsdSerializer, ConfigSettingSerializer, MonSerializer, OsdConfigSerializer, \
CliSerializer
CliSerializer, ClusterStatsSerializer, PoolStatsSerializer
from calamari_rest.views.database_view_set import DatabaseViewSet
from calamari_rest.views.exceptions import ServiceUnavailable
from calamari_rest.views.paginated_mixin import PaginatedMixin
Expand Down Expand Up @@ -1112,3 +1112,27 @@ def create(self, request, fsid):
raise APIException("Remote error: %s" % str(result))

return Response(self.serializer_class(DataObject(result)).data)


class ClusterStatsViewSet(RPCViewSet):
"""
Allows retrieval of cluster statistics
"""
serializer_class = ClusterStatsSerializer

def retrieve(self, request, fsid):
name = self.client.get_cluster(fsid)['name']
result = self.client.run_mon_job(fsid, "ceph.cluster_stats", [name])
return Response(self.serializer_class(DataObject(result)).data)


class PoolStatsViewSet(RPCViewSet):
"""
Allows retrieval of pool statistics
"""
serializer_class = PoolStatsSerializer

def retrieve(self, request, fsid, pool_id):
name = self.client.get_cluster(fsid)['name']
result = self.client.run_mon_job(fsid, "ceph.pool_stats", [name, pool_id])
return Response(result)
27 changes: 27 additions & 0 deletions salt/srv/salt/_modules/ceph.py
Original file line number Diff line number Diff line change
Expand Up @@ -707,3 +707,30 @@ def heartbeat():
# once the issue is fixed upstream and we are using a more
# recent salt in calamari.
pass


def cluster_stats(cluster_name):
import rados

cluster = rados.Rados(name=RADOS_NAME, clustername=cluster_name, conffile='')
cluster.connect()

result = cluster.get_cluster_stats()

return result


def pool_stats(cluster_name, pool_id):
import rados

cluster = rados.Rados(name=RADOS_NAME, clustername=cluster_name, conffile='')
cluster.connect()

try:
pool = cluster.pool_reverse_lookup(pool_id)
except Exception as e:
raise RuntimeError("pool lookup: " + str(e))

result = cluster.open_ioctx(pool).get_stats()

return result

0 comments on commit 2b679e8

Please sign in to comment.