new statistics
This commit is contained in:
parent
45de50d15a
commit
a777aa846c
5 changed files with 104 additions and 39 deletions
|
@ -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
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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({})
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue