Răsfoiți Sursa

实现获取Guest当前及最后10分钟的top 10性能数据

James Iter 9 ani în urmă
părinte
comite
7f6a22e3ac
2 a modificat fișierele cu 187 adăugiri și 0 ștergeri
  1. 37 0
      api/guest.py
  2. 150 0
      api/performance.py

+ 37 - 0
api/guest.py

@@ -609,6 +609,43 @@ def r_content_search():
     return guest_base.content_search()
 
 
+@Utils.dumps2response
+def r_distribute_count():
+    from models import Guest
+    rows, count = Guest.get_all()
+
+    ret = dict()
+    ret['state'] = ji.Common.exchange_state(20000)
+
+    ret['data'] = {
+        'os_template_id': dict(),
+        'status': dict(),
+        'on_host': dict(),
+        'cpu_memory': dict()
+    }
+
+    for guest in rows:
+        if guest['os_template_id'] not in ret['data']['os_template_id']:
+            ret['data']['os_template_id'][guest['os_template_id']] = 0
+
+        if guest['status'] not in ret['data']['status']:
+            ret['data']['status'][guest['status']] = 0
+
+        if guest['on_host'] not in ret['data']['on_host']:
+            ret['data']['on_host'][guest['on_host']] = 0
+
+        cpu_memory = '_'.join([str(guest['cpu']), str(guest['memory'])])
+        if cpu_memory not in ret['data']['cpu_memory']:
+            ret['data']['cpu_memory'][cpu_memory] = 0
+
+        ret['data']['os_template_id'][guest['os_template_id']] += 1
+        ret['data']['status'][guest['status']] += 1
+        ret['data']['on_host'][guest['on_host']] += 1
+        ret['data']['cpu_memory'][cpu_memory] += 1
+
+    return ret
+
+
 @Utils.dumps2response
 def r_update(uuid):
 

+ 150 - 0
api/performance.py

@@ -202,3 +202,153 @@ def r_disk_io_last_seven_days(uuid):
     return get_performance_data(uuid=uuid, uuid_field='disk_uuid', the_class=DiskIO, granularity='seven_days')
 
 
+@Utils.dumps2response
+def r_current_top_10():
+
+    # JimV 设计的 Guests 容量为 4000 个
+    volume = 4000
+    limit = volume
+    end_ts = ji.Common.ts() - 60
+    start_ts = end_ts - 60
+
+    # 避免落在时间边界上,导致过滤条件的范围落空
+    if start_ts % 60 == 0:
+        start_ts -= 1
+
+    ret = dict()
+    ret['state'] = ji.Common.exchange_state(20000)
+    ret['data'] = {
+        'cpu_load': list(),
+        'rw_bytes': list(),
+        'rw_req': list(),
+        'rt_bytes': list(),
+        'rt_packets': list()
+    }
+
+    filter_str = ';'.join([':'.join(['timestamp', 'gt', start_ts.__str__()]),
+                           ':'.join(['timestamp', 'lt', end_ts.__str__()])])
+
+    rows, _ = CPUMemory.get_by_filter(limit=limit, filter_str=filter_str)
+    rows.sort(key=lambda k: k['cpu_load'], reverse=True)
+
+    ret['data']['cpu_load'] = rows[0:10]
+
+    rows, _ = DiskIO.get_by_filter(limit=limit, filter_str=filter_str)
+    for i in range(rows.__len__()):
+        rows[i]['rw_bytes'] = rows[i]['rd_bytes'] + rows[i]['wr_bytes']
+        rows[i]['rw_req'] = rows[i]['rd_req'] + rows[i]['wr_req']
+
+    rows.sort(key=lambda k: k['rw_bytes'], reverse=True)
+    ret['data']['rw_bytes'] = rows[0:10]
+
+    rows.sort(key=lambda k: k['rw_req'], reverse=True)
+    ret['data']['rw_req'] = rows[0:10]
+
+    rows, _ = Traffic.get_by_filter(limit=limit, filter_str=filter_str)
+    for i in range(rows.__len__()):
+        rows[i]['rt_bytes'] = rows[i]['rx_bytes'] + rows[i]['tx_bytes']
+        rows[i]['rt_packets'] = rows[i]['rx_packets'] + rows[i]['tx_packets']
+
+    rows.sort(key=lambda k: k['rt_bytes'], reverse=True)
+    ret['data']['rt_bytes'] = rows[0:10]
+
+    rows.sort(key=lambda k: k['rt_packets'], reverse=True)
+    ret['data']['rt_packets'] = rows[0:10]
+
+    return ret
+
+
+@Utils.dumps2response
+def r_last_10_minutes_top_10():
+
+    _range = 10
+    volume = 4000
+    limit = volume * _range
+    end_ts = ji.Common.ts() - 60
+    start_ts = end_ts - 60 * _range
+
+    # 避免落在时间边界上,导致过滤条件的范围落空
+    if start_ts % 60 == 0:
+        start_ts -= 1
+
+    ret = dict()
+    ret['state'] = ji.Common.exchange_state(20000)
+    ret['data'] = {
+        'cpu_load': list(),
+        'rw_bytes': list(),
+        'rw_req': list(),
+        'rt_bytes': list(),
+        'rt_packets': list()
+    }
+
+    filter_str = ';'.join([':'.join(['timestamp', 'gt', start_ts.__str__()]),
+                           ':'.join(['timestamp', 'lt', end_ts.__str__()])])
+
+    # cpu 负载
+    guests_uuid_mapping = dict()
+    rows, _ = CPUMemory.get_by_filter(limit=limit, filter_str=filter_str)
+    for row in rows:
+        if row['guest_uuid'] not in guests_uuid_mapping:
+            guests_uuid_mapping[row['guest_uuid']] = {'cpu_load': 0, 'count': 0}
+
+        guests_uuid_mapping[row['guest_uuid']]['cpu_load'] += row['cpu_load']
+        guests_uuid_mapping[row['guest_uuid']]['count'] += 1
+
+    rows = list()
+    for k, v in guests_uuid_mapping.items():
+
+        # 忽略除数为 0 的情况
+        if v['cpu_load'] == 0:
+            continue
+
+        rows.append({'guest_uuid': k, 'cpu_load': v['cpu_load'] / v['count']})
+
+    rows.sort(key=lambda _k: _k['cpu_load'], reverse=True)
+
+    ret['data']['cpu_load'] = rows[0:10]
+
+    # 磁盘使用统计
+    guests_uuid_mapping.clear()
+    rows, _ = DiskIO.get_by_filter(limit=limit, filter_str=filter_str)
+    for row in rows:
+        if row['disk_uuid'] not in guests_uuid_mapping:
+            guests_uuid_mapping[row['disk_uuid']] = {'rw_bytes': 0, 'rw_req': 0}
+
+        guests_uuid_mapping[row['disk_uuid']]['rw_bytes'] += row['rd_bytes'] + row['wr_bytes']
+        guests_uuid_mapping[row['disk_uuid']]['rw_req'] += row['rd_req'] + row['wr_req']
+
+    rows = list()
+    for k, v in guests_uuid_mapping.items():
+        rows.append({'disk_uuid': k, 'rw_bytes': v['rw_bytes'] * 60 * _range, 'rw_req': v['rw_req'] * 60 * _range})
+
+    rows.sort(key=lambda _k: _k['rw_bytes'], reverse=True)
+    ret['data']['rw_bytes'] = rows[0:10]
+
+    rows.sort(key=lambda _k: _k['rw_req'], reverse=True)
+    ret['data']['rw_req'] = rows[0:10]
+
+    # 网络流量
+    guests_uuid_mapping.clear()
+    rows, _ = Traffic.get_by_filter(limit=limit, filter_str=filter_str)
+    for row in rows:
+        if row['guest_uuid'] not in guests_uuid_mapping:
+            guests_uuid_mapping[row['guest_uuid']] = {'rt_bytes': 0, 'rt_packets': 0}
+
+        guests_uuid_mapping[row['guest_uuid']]['rt_bytes'] += row['rx_bytes'] + row['tx_bytes']
+        guests_uuid_mapping[row['guest_uuid']]['rt_packets'] += row['rx_packets'] + row['tx_packets']
+
+    rows = list()
+    for k, v in guests_uuid_mapping.items():
+        rows.append({'guest_uuid': k, 'rt_bytes': v['rt_bytes'] * 60 * _range,
+                     'rt_packets': v['rt_packets'] * 60 * _range})
+
+    rows.sort(key=lambda _k: _k['rt_bytes'], reverse=True)
+    ret['data']['rt_bytes'] = rows[0:10]
+
+    rows.sort(key=lambda _k: _k['rt_packets'], reverse=True)
+    ret['data']['rt_packets'] = rows[0:10]
+
+    return ret
+
+
+