Initial commit
This commit is contained in:
101
monitor/monitor.py
Executable file
101
monitor/monitor.py
Executable file
@@ -0,0 +1,101 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import socket
|
||||
import json
|
||||
import time
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
# --- CONFIGURATION ---
|
||||
# Adjust these paths/ports to match your config.json files
|
||||
INPUT_SOCKET = "/tmp/streamer.sock"
|
||||
ONRAMP_HOST = "127.0.0.1"
|
||||
ONRAMP_PORT = 9999
|
||||
REFRESH_RATE = 1.0 # Seconds
|
||||
|
||||
def query_input_go():
|
||||
"""Queries the Go Input service via Unix Socket."""
|
||||
if not os.path.exists(INPUT_SOCKET):
|
||||
return "OFFLINE (Socket not found)"
|
||||
try:
|
||||
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
|
||||
s.settimeout(0.5)
|
||||
s.connect(INPUT_SOCKET)
|
||||
data = s.recv(1024)
|
||||
return data.decode('utf-8').strip()
|
||||
except Exception as e:
|
||||
return f"OFFLINE ({e})"
|
||||
|
||||
def query_onramp_json(command):
|
||||
"""Queries the Python Onramp service via TCP."""
|
||||
try:
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
||||
s.settimeout(0.5)
|
||||
s.connect((ONRAMP_HOST, ONRAMP_PORT))
|
||||
s.sendall(command.encode('utf-8'))
|
||||
data = s.recv(8192) # Larger buffer for 'live' data
|
||||
return json.loads(data.decode('utf-8'))
|
||||
except:
|
||||
return None
|
||||
|
||||
def format_candle(candle):
|
||||
"""Formats a single candle dictionary into a readable line."""
|
||||
return (f"O: {candle['open']:.2f} | H: {candle['high']:.2f} | "
|
||||
f"L: {candle['low']:.2f} | C: {candle['close']:.2f} | V: {candle['volume']:.2f}")
|
||||
|
||||
def main():
|
||||
try:
|
||||
while True:
|
||||
# 1. Collect Data
|
||||
input_status = query_input_go()
|
||||
onramp_status = query_onramp_json("status")
|
||||
onramp_live = query_onramp_json("live")
|
||||
|
||||
# 2. Clear Screen
|
||||
print("\033[2J\033[H", end="")
|
||||
|
||||
print("="*70)
|
||||
print(f" UNIFIED MONITOR - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
print("="*70)
|
||||
|
||||
# 3. Display Input (Go) Section
|
||||
print(f"\n[1] INPUT SERVICE (Go)")
|
||||
print(f" Status: {input_status}")
|
||||
|
||||
# 4. Display Onramp (Python) Section
|
||||
print(f"\n[2] ONRAMP SERVICE (Python)")
|
||||
if onramp_status:
|
||||
stats = onramp_status
|
||||
# Calculate lag
|
||||
last_ts = stats.get('last_ts', 0) / 1000
|
||||
lag = time.time() - last_ts if last_ts > 0 else 0
|
||||
|
||||
print(f" Uptime Start : {stats.get('uptime_start')}")
|
||||
print(f" Processed : {stats.get('total_trades')} trades")
|
||||
print(f" Current File : {os.path.basename(str(stats.get('last_file')))}")
|
||||
print(f" Data Lag : {lag:.2f}s")
|
||||
else:
|
||||
print(" Status: OFFLINE")
|
||||
|
||||
# 5. Display Live Market Snapshot
|
||||
if onramp_live and "data" in onramp_live:
|
||||
print(f"\n[3] LIVE MARKET SNAPSHOT")
|
||||
candles = onramp_live["data"]
|
||||
# Show 1m and 1h as examples
|
||||
for tf in ["1m", "1h"]:
|
||||
if tf in candles:
|
||||
# Get the most recent timestamp in that timeframe
|
||||
latest_ts = max(candles[tf].keys())
|
||||
c = candles[tf][latest_ts]
|
||||
ts_str = datetime.fromtimestamp(int(latest_ts)).strftime('%H:%M')
|
||||
print(f" {tf} ({ts_str}) >> {format_candle(c)}")
|
||||
|
||||
print("\n" + "="*70)
|
||||
print(" (Ctrl+C to exit)")
|
||||
|
||||
time.sleep(REFRESH_RATE)
|
||||
except KeyboardInterrupt:
|
||||
print("\nClosing monitor...")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user