mirror of
https://github.com/ceph/ceph
synced 2024-12-22 19:34:30 +00:00
105 lines
2.7 KiB
Python
105 lines
2.7 KiB
Python
|
#!/usr/bin/env python
|
||
|
# coding: utf-8
|
||
|
#
|
||
|
# Ceph - scalable distributed file system
|
||
|
#
|
||
|
# Copyright (C) 2017 OVH
|
||
|
#
|
||
|
# This is free software; you can redistribute it and/or
|
||
|
# modify it under the terms of the GNU General Public
|
||
|
# License version 2, as published by the Free Software
|
||
|
# Foundation. See file COPYING.
|
||
|
#
|
||
|
|
||
|
import json
|
||
|
import subprocess
|
||
|
import time
|
||
|
import os
|
||
|
import argparse
|
||
|
|
||
|
|
||
|
def shorten(val):
|
||
|
if isinstance(val, str):
|
||
|
return val
|
||
|
for u in ((3, ''), (6, 'k'), (9, 'M'), (12, 'G'), (15, 'T')):
|
||
|
if val < 10**u[0]:
|
||
|
return "{}{}".format(int(val / (10 ** (u[0]-3))), u[1])
|
||
|
return val
|
||
|
|
||
|
|
||
|
def print_histogram(asok, logger, counter, last):
|
||
|
|
||
|
try:
|
||
|
out = subprocess.check_output(
|
||
|
"ceph --admin-daemon {} perf histogram dump".format(asok),
|
||
|
shell=True)
|
||
|
j = json.loads(out.decode('utf-8'))
|
||
|
except Exception as e:
|
||
|
return (last,
|
||
|
"Couldn't connect to admin socket, result: \n{}".format(e))
|
||
|
|
||
|
current = j['osd'][counter]['values']
|
||
|
axes = j['osd'][counter]['axes']
|
||
|
content = ""
|
||
|
|
||
|
content += "{}:\n".format(axes[1]['name'])
|
||
|
for r in axes[1]['ranges']:
|
||
|
content += "{0: >4} ".format(
|
||
|
shorten(r['min']) if 'min' in r else '')
|
||
|
content += "\n"
|
||
|
for r in axes[1]['ranges']:
|
||
|
content += "{0: >4} ".format(
|
||
|
shorten(r['max']) if 'max' in r else '')
|
||
|
content += "\n"
|
||
|
|
||
|
content += ("{0: >"+str(len(axes[1]['ranges'])*5+14)+"}:\n").format(
|
||
|
axes[0]['name'])
|
||
|
|
||
|
for i in range(len(current)):
|
||
|
for j in range(len(current[i])):
|
||
|
try:
|
||
|
diff = current[i][j] - last[i][j]
|
||
|
except IndexError:
|
||
|
diff = '-'
|
||
|
content += "{0: >4} ".format(shorten(diff))
|
||
|
|
||
|
r = axes[0]['ranges'][i]
|
||
|
content += "{0: >6} : {1}\n".format(
|
||
|
shorten(r['min']) if 'min' in r else '',
|
||
|
shorten(r['max']) if 'max' in r else '')
|
||
|
return (current, content)
|
||
|
|
||
|
|
||
|
def loop_print(asok, logger, counter):
|
||
|
last = []
|
||
|
while True:
|
||
|
|
||
|
last, content = print_histogram(asok, logger, counter, last)
|
||
|
print("{}{}".format("\n"*100, content))
|
||
|
time.sleep(1)
|
||
|
|
||
|
|
||
|
def main():
|
||
|
parser = argparse.ArgumentParser(
|
||
|
description='Continuously display ceph performance histogram')
|
||
|
parser.add_argument(
|
||
|
'--asok',
|
||
|
type=str,
|
||
|
default='/var/run/ceph/*.asok',
|
||
|
help='Path to asok file, can use wildcards')
|
||
|
parser.add_argument(
|
||
|
'--logger',
|
||
|
type=str,
|
||
|
default='osd')
|
||
|
parser.add_argument(
|
||
|
'--counter',
|
||
|
type=str,
|
||
|
default='op_w_latency_in_bytes_histogram')
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
loop_print(args.asok, args.logger, args.counter)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|