mirror of
https://github.com/crawlab-team/crawlab.git
synced 2026-01-22 17:31:03 +01:00
83 lines
2.3 KiB
Python
83 lines
2.3 KiB
Python
import os
|
|
from datetime import datetime, timedelta
|
|
|
|
from flask_restful import reqparse, Resource
|
|
|
|
from db.manager import db_manager
|
|
from utils import jsonify
|
|
|
|
|
|
class StatsApi(Resource):
|
|
def get(self, action=None):
|
|
# action
|
|
if action is not None:
|
|
if not hasattr(self, action):
|
|
return {
|
|
'status': 'ok',
|
|
'code': 400,
|
|
'error': 'action "%s" invalid' % action
|
|
}, 400
|
|
return getattr(self, action)()
|
|
|
|
else:
|
|
return {}
|
|
|
|
def get_home_stats(self):
|
|
# overview stats
|
|
task_count = db_manager.count('tasks', {})
|
|
spider_count = db_manager.count('spiders', {})
|
|
node_count = db_manager.count('nodes', {})
|
|
deploy_count = db_manager.count('deploys', {})
|
|
|
|
# daily stats
|
|
cur = db_manager.aggregate('tasks', [
|
|
{
|
|
'$project': {
|
|
'date': {
|
|
'$dateToString': {
|
|
'format': '%Y-%m-%d',
|
|
'date': '$create_ts'
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
'$group': {
|
|
'_id': '$date',
|
|
'count': {
|
|
'$sum': 1
|
|
}
|
|
}
|
|
},
|
|
{
|
|
'$sort': {
|
|
'_id': 1
|
|
}
|
|
}
|
|
])
|
|
date_cache = {}
|
|
for item in cur:
|
|
date_cache[item['_id']] = item['count']
|
|
start_date = datetime.now() - timedelta(31)
|
|
end_date = datetime.now() - timedelta(1)
|
|
date = start_date
|
|
daily_tasks = []
|
|
while date < end_date:
|
|
date = date + timedelta(1)
|
|
date_str = date.strftime('%Y-%m-%d')
|
|
daily_tasks.append({
|
|
'date': date_str,
|
|
'count': date_cache.get(date_str) or 0,
|
|
})
|
|
|
|
return {
|
|
'status': 'ok',
|
|
'overview_stats': {
|
|
'task_count': task_count,
|
|
'spider_count': spider_count,
|
|
'node_count': node_count,
|
|
'deploy_count': deploy_count,
|
|
},
|
|
'daily_tasks': daily_tasks
|
|
}
|