new statistics

This commit is contained in:
Vyacheslav Anzhiganov 2015-12-16 08:39:53 +03:00
parent 45de50d15a
commit a777aa846c
5 changed files with 104 additions and 39 deletions

View file

@ -1,6 +1,7 @@
# coding: utf-8 # coding: utf-8
import uuid import uuid
import datetime
from peewee import fn from peewee import fn
from app import models from app import models
@ -60,33 +61,24 @@ class ControllerContainers:
return True return True
class ControllerRulesStatistics: class ControllerContainersStatistics:
def __init__(self, rule_id): def __init__(self, container_id):
self.rule_id = rule_id self.container_id = container_id
def requests_total_get(self, days): def size_get(self, days=7):
return models.RulesTraffic.select().\ last_days = datetime.datetime.now() - datetime.timedelta(days=days)
where(models.RulesTraffic.rule == self.rule_id, models.RulesTraffic.timestamp > days).count() return models.ContainersStatistics.select().where(
models.ContainersStatistics.container == self.container_id,
models.ContainersStatistics.created > last_days
)
def traffic_total_get(self, days): def traffic_total_get(self, days):
traffic_sum = models.RulesTraffic.\ last_days = datetime.datetime.now() - datetime.timedelta(days=days)
select(fn.sum(models.RulesTraffic.body_bytes_sent).alias('sum')).\ traffic_sum = models.ContainersStatistics.select(
where(models.RulesTraffic.rule == self.rule_id, models.RulesTraffic.timestamp > days)[0].sum fn.sum(models.ContainersStatistics.net_total).alias('sum')
).where(
models.ContainersStatistics.container == self.container_id,
models.ContainersStatistics.created > last_days)[0].sum
if not traffic_sum: if not traffic_sum:
traffic_sum = 0 traffic_sum = 0
return format(float(traffic_sum / 1024) / 1024 / 1024, '.3f') return format(float(traffic_sum / 1024) / 1024 / 1024, '.3f')
def traffic_by_country_get(self, days):
traffic_by_country = dict()
tbc = models.RulesTraffic.\
select(models.RulesTraffic.country, fn.sum(models.RulesTraffic.body_bytes_sent).alias('sum')).\
where(models.RulesTraffic.rule == self.rule_id, models.RulesTraffic.timestamp > days).\
group_by(models.RulesTraffic.country)
for t in tbc:
if not t.sum:
t.sum = 0
# traffic_by_country[t.country] = t.sum
traffic_by_country[t.country] = format(float(t.sum / 1024) / 1024 / 1024, '.3f')
return traffic_by_country

View file

@ -1,4 +1,4 @@
# import datetime import datetime
from app import models from app import models
@ -14,3 +14,66 @@ class ControllerServerStatistics:
net_total=net_total net_total=net_total
) )
return True return True
def state_exists(self, container_id):
if models.ContainersStatisticsState.select().where(
models.ContainersStatisticsState.container == container_id
).count() == 0:
return False
return True
def state_create(self, container_id, statistics):
if 'cpu_use' not in statistics:
statistics['cpu_use'] = 0
if 'memory_use' not in statistics:
statistics['memory_use'] = 0
if 'size' not in statistics:
statistics['size'] = 0
if 'tx_bytes' not in statistics:
statistics['tx_bytes'] = 0
if 'rx_bytes' not in statistics:
statistics['rx_bytes'] = 0
if 'total_bytes' not in statistics:
statistics['total_bytes'] = 0
try:
models.ContainersStatisticsState.create(
container=container_id,
cpu=statistics['cpu_use'],
memory=statistics['memory_use'],
size=statistics['size'],
net_tx=statistics['tx_bytes'],
net_rx=statistics['rx_bytes'],
net_total=statistics['total_bytes']
)
except Exception as e:
# TODO: report
return False
return True
def state_update(self, container_id, statistics):
if 'cpu_use' not in statistics:
statistics['cpu_use'] = 0
if 'memory_use' not in statistics:
statistics['memory_use'] = 0
if 'size' not in statistics:
statistics['size'] = 0
if 'tx_bytes' not in statistics:
statistics['tx_bytes'] = 0
if 'rx_bytes' not in statistics:
statistics['rx_bytes'] = 0
if 'total_bytes' not in statistics:
statistics['total_bytes'] = 0
state = models.ContainersStatisticsState.update(
updated=datetime.datetime.now(),
cpu=statistics['cpu_use'],
memory=statistics['memory_use'],
size=statistics['size'],
net_tx=statistics['tx_bytes'],
net_rx=statistics['rx_bytes'],
net_total=statistics['total_bytes']
).where(models.ContainersStatisticsState.container == container_id)
state.execute()
return True

View file

@ -86,18 +86,22 @@ def report_container_status():
container_id = statistics['container_id'] container_id = statistics['container_id']
if 'cpu_use' not in statistics: if 'cpu_use' not in statistics:
return False return jsonify({})
if 'memory_use' not in statistics: if 'memory_use' not in statistics:
return False return jsonify({})
if 'tx_bytes' not in statistics: if 'tx_bytes' not in statistics:
return False return jsonify({})
if 'rx_bytes' not in statistics: if 'rx_bytes' not in statistics:
return False return jsonify({})
if 'total_bytes' not in statistics: if 'total_bytes' not in statistics:
return False return jsonify({})
# create or update state
if ControllerServerStatistics().state_exists(container_id):
ControllerServerStatistics().state_update(container_id, statistics)
else:
ControllerServerStatistics().state_create(container_id, statistics)
# print container_id, ,
print statistics
if ControllerContainersServer().exists(container_id): if ControllerContainersServer().exists(container_id):
ControllerServerStatistics().write( ControllerServerStatistics().write(
container_id, container_id,
@ -107,12 +111,6 @@ def report_container_status():
int(statistics['tx_bytes']), int(statistics['tx_bytes']),
int(statistics['rx_bytes']), int(statistics['rx_bytes']),
int(statistics['total_bytes']) int(statistics['total_bytes'])
# int(statistics['rx_bytes']) / 1024 / 1024,
# int(statistics['total_bytes']) / 1024 / 1024
) )
# import datetime
# print container_id
# print ControllerContainersServer().exists(container_id)
# print datetime.datetime.now
return jsonify({}) return jsonify({})

View file

@ -142,6 +142,17 @@ class ContainersStatistics(PgSQLModel):
net_total = BigIntegerField(default=0, null=False) net_total = BigIntegerField(default=0, null=False)
class ContainersStatisticsState(PgSQLModel):
container = ForeignKeyField(Containers)
updated = DateTimeField(default=datetime.datetime.now)
cpu = BigIntegerField(default=0, null=False)
memory = BigIntegerField(default=0, null=False)
size = BigIntegerField(default=0, null=False)
net_tx = BigIntegerField(default=0, null=False)
net_rx = BigIntegerField(default=0, null=False)
net_total = BigIntegerField(default=0, null=False)
class Tasks(PgSQLModel): class Tasks(PgSQLModel):
id = UUIDField(primary_key=True, unique=True) id = UUIDField(primary_key=True, unique=True)
datacenter = ForeignKeyField(DataCenters, related_name='dcstasks') datacenter = ForeignKeyField(DataCenters, related_name='dcstasks')

View file

@ -16,5 +16,6 @@ models.database.create_tables({
models.SSHKeys, models.SSHKeys,
models.Containers, models.Containers,
models.ContainersStatistics, models.ContainersStatistics,
models.ContainersStatisticsState,
models.Tasks models.Tasks
}, safe=True) }, safe=True)