|
# retoor <retoor@molodetz.nl>
|
|
|
|
import time
|
|
from collections import defaultdict
|
|
from typing import Optional
|
|
from devplacepy.services.tunnel.session_manager import get_manager
|
|
|
|
|
|
def get_metrics() -> dict:
|
|
manager = get_manager()
|
|
active = manager.list_active()
|
|
now = time.time()
|
|
|
|
per_user: dict[str, dict] = defaultdict(
|
|
lambda: {
|
|
"active_tunnels": 0,
|
|
"total_bytes_in": 0,
|
|
"total_bytes_out": 0,
|
|
"total_requests": 0,
|
|
}
|
|
)
|
|
|
|
total_bytes_in = 0
|
|
total_bytes_out = 0
|
|
total_requests = 0
|
|
|
|
for session in active:
|
|
username = session.username
|
|
per_user[username]["active_tunnels"] += 1
|
|
per_user[username]["total_bytes_in"] += session.bytes_in
|
|
per_user[username]["total_bytes_out"] += session.bytes_out
|
|
per_user[username]["total_requests"] += session.requests_count
|
|
total_bytes_in += session.bytes_in
|
|
total_bytes_out += session.bytes_out
|
|
total_requests += session.requests_count
|
|
|
|
return {
|
|
"active_tunnels": len(active),
|
|
"total_bytes_in": total_bytes_in,
|
|
"total_bytes_out": total_bytes_out,
|
|
"total_requests": total_requests,
|
|
"uptime_seconds": now - (min(s.started_at for s in active) if active else now),
|
|
"per_user": dict(per_user),
|
|
}
|
|
|
|
|
|
def get_user_metrics(username: str) -> Optional[dict]:
|
|
manager = get_manager()
|
|
active = manager.list_by_user(username)
|
|
now = time.time()
|
|
|
|
if not active:
|
|
return None
|
|
|
|
total_bytes_in = sum(s.bytes_in for s in active)
|
|
total_bytes_out = sum(s.bytes_out for s in active)
|
|
total_requests = sum(s.requests_count for s in active)
|
|
|
|
return {
|
|
"username": username,
|
|
"active_tunnels": len(active),
|
|
"total_bytes_in": total_bytes_in,
|
|
"total_bytes_out": total_bytes_out,
|
|
"total_requests": total_requests,
|
|
"uptime_seconds": now - min(s.started_at for s in active),
|
|
"tunnels": [
|
|
{
|
|
"session_id": s.session_id,
|
|
"subdomain": s.subdomain,
|
|
"local_port": s.local_port,
|
|
"remote_port": s.remote_port,
|
|
"started_at": s.started_at,
|
|
"bytes_in": s.bytes_in,
|
|
"bytes_out": s.bytes_out,
|
|
"requests_count": s.requests_count,
|
|
}
|
|
for s in active
|
|
],
|
|
}
|