feat:
--ADDED db status and uptime websockets
This commit is contained in:
1 parent
cd99831abc
commit
2ebd83c68d
1 file changed
+138
@@ -26,6 +26,14 @@ class NodeStatusRequest(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class DatabaseRequest(BaseModel):
|
||||||
|
host: str
|
||||||
|
port: int
|
||||||
|
dbname: str
|
||||||
|
user: str
|
||||||
|
password: str
|
||||||
|
|
||||||
|
|
||||||
def verify_token(
|
def verify_token(
|
||||||
authorization: str = Header(None),
|
authorization: str = Header(None),
|
||||||
):
|
):
|
||||||
@@ -256,7 +264,137 @@ async def replication_monitor(websocket: WebSocket):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_database_status(
|
||||||
|
data: DatabaseRequest
|
||||||
|
):
|
||||||
|
|
||||||
|
conn = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
conn = psycopg2.connect(
|
||||||
|
host=data.host,
|
||||||
|
port=data.port,
|
||||||
|
dbname=data.dbname,
|
||||||
|
user=data.user,
|
||||||
|
password=data.password,
|
||||||
|
connect_timeout=3
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"database_name": data.dbname,
|
||||||
|
"status": "online"
|
||||||
|
}
|
||||||
|
|
||||||
|
except psycopg2.Error:
|
||||||
|
|
||||||
|
return {
|
||||||
|
"database_name": data.dbname,
|
||||||
|
"status": "offline"
|
||||||
|
}
|
||||||
|
|
||||||
|
finally:
|
||||||
|
if conn:
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
def get_database_uptime(
|
||||||
|
data: DatabaseRequest
|
||||||
|
):
|
||||||
|
|
||||||
|
conn = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
conn = psycopg2.connect(
|
||||||
|
host=data.host,
|
||||||
|
port=data.port,
|
||||||
|
dbname=data.dbname,
|
||||||
|
user=data.user,
|
||||||
|
password=data.password,
|
||||||
|
connect_timeout=3
|
||||||
|
)
|
||||||
|
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
cursor.execute("""
|
||||||
|
SELECT EXTRACT(
|
||||||
|
EPOCH FROM (
|
||||||
|
CURRENT_TIMESTAMP - pg_postmaster_start_time()
|
||||||
|
)
|
||||||
|
)::BIGINT;
|
||||||
|
""")
|
||||||
|
|
||||||
|
uptime_seconds = cursor.fetchone()[0]
|
||||||
|
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
|
return {
|
||||||
|
"database_name": data.dbname,
|
||||||
|
"uptime_seconds": uptime_seconds
|
||||||
|
}
|
||||||
|
|
||||||
|
except psycopg2.Error as e:
|
||||||
|
|
||||||
|
return {
|
||||||
|
"database_name": data.dbname,
|
||||||
|
"uptime_seconds": None,
|
||||||
|
"error": str(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
finally:
|
||||||
|
if conn:
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
@app.websocket("/ws/database/status")
|
||||||
|
async def database_status_monitor(websocket: WebSocket):
|
||||||
|
|
||||||
|
await websocket.accept()
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
raw_data = await websocket.receive_json()
|
||||||
|
|
||||||
|
data = DatabaseRequest(**raw_data)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
status_result, uptime_result = await asyncio.wait_for(
|
||||||
|
asyncio.gather(
|
||||||
|
asyncio.to_thread(
|
||||||
|
get_database_status,
|
||||||
|
data
|
||||||
|
),
|
||||||
|
asyncio.to_thread(
|
||||||
|
get_database_uptime,
|
||||||
|
data
|
||||||
|
)
|
||||||
|
),
|
||||||
|
timeout=5
|
||||||
|
)
|
||||||
|
|
||||||
|
result = {
|
||||||
|
"database_name": data.dbname,
|
||||||
|
"status": status_result["status"],
|
||||||
|
"uptime_seconds": uptime_result["uptime_seconds"]
|
||||||
|
}
|
||||||
|
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
|
||||||
|
result = {
|
||||||
|
"database_name": data.dbname,
|
||||||
|
"status": "offline",
|
||||||
|
"uptime_seconds": None
|
||||||
|
}
|
||||||
|
|
||||||
|
await websocket.send_json(result)
|
||||||
|
|
||||||
|
await asyncio.sleep(2)
|
||||||
|
|
||||||
|
except WebSocketDisconnect:
|
||||||
|
|
||||||
|
print("Database status WebSocket disconnected")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user