feat :
--FAST API AGENT
This commit is contained in:
commit
ded28ab88e
5 files changed
+206
No files matched your search
@@ -0,0 +1,7 @@
|
||||
venv/
|
||||
.env
|
||||
__pycache__/
|
||||
*.pyc
|
||||
.pytest_cache/
|
||||
.vscode/
|
||||
.idea/
|
||||
@@ -0,0 +1,39 @@
|
||||
| Area | What to show | Why it matters |
|
||||
| -------------------- | -------------------------------------------- | ------------------------------------------- |
|
||||
| Node status | Up/down, PostgreSQL service state, uptime | Tells you whether the node is reachable |
|
||||
| CPU | Current %, load average | Detects compute saturation |
|
||||
| Memory | Used/free RAM, swap | Finds memory pressure |
|
||||
| Disk | Used %, free GB, IOPS, read/write latency | Disk issues can kill DB performance |
|
||||
| Network | RX/TX, latency, packet loss | Important for distributed replication |
|
||||
| Connections | Active, idle, total, max connections | Prevents connection exhaustion |
|
||||
| Sessions | Current sessions, user, DB, client IP | Shows who is connected |
|
||||
| Transactions | TPS, commits, rollbacks | Measures workload and failures |
|
||||
| Query performance | Avg query time, slow queries, top queries | Finds performance bottlenecks |
|
||||
| Long-running queries | Query, PID, runtime, user | Long queries often cause locks/bloat |
|
||||
| Locks | Waiting locks, blocking PID, blocked query | Critical for troubleshooting stalls |
|
||||
| Deadlocks | Count and recent deadlocks | Shows transaction contention |
|
||||
| Cache | Buffer cache hit ratio | Indicates memory efficiency |
|
||||
| Tables | Size, rows, scans, inserts, updates, deletes | Shows table activity |
|
||||
| Indexes | Usage, unused indexes, index size | Helps optimize queries/storage |
|
||||
| WAL | WAL generated, retained, archived | Important for replication and recovery |
|
||||
| Checkpoints | Checkpoint frequency/duration | Too many checkpoints hurt performance |
|
||||
| Vacuum | Last vacuum/autovacuum, failures | Prevents table bloat |
|
||||
| Analyze | Last analyze, stats freshness | Needed for query planner accuracy |
|
||||
| Bloat | Table/index bloat | Excess bloat wastes space and slows queries |
|
||||
| Replication | Status, lag, slot status | Essential for HA/multi-master |
|
||||
| Replication slots | Active/inactive, retained WAL | Inactive slots can fill disk |
|
||||
| Backup | Last backup, status, duration | Tells you whether recovery is possible |
|
||||
| Disk growth | Database/table/WAL growth trend | Helps capacity planning |
|
||||
| Errors | PostgreSQL errors/warnings | Shows immediate operational issues |
|
||||
| Security | Failed logins, unusual connections | Useful for security monitoring |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Using my uploaded photo, show me what I would have looked like around 1985. Preserve my identity, facial features, skin tone, age, and recognizable appearance. Reimagine my hair, clothing, accessories, and surroundings with bold, unmistakably mid-1980s styling—expressive silhouettes, statement accessories, layered details, distinctive colors, and textures. Make it feel like a genuine 1985 photograph with analog grain, faded color, direct flash, and subtle softness. Add a period-accurate 1980s red-orange date stamp in the lower corner. No recognizable posters. No modern objects or text.
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
|==================================================|
|
||||
|FIND VENV READING LOCATION AND OTHER INFO ABT VENV|
|
||||
|==================================================|
|
||||
which python
|
||||
which pip
|
||||
|
||||
python --version
|
||||
|
||||
pip show psycopg2
|
||||
pip show psycopg2-binary
|
||||
|
||||
pip freeze | grep psycopg
|
||||
|
||||
|
||||
|
||||
deactivate
|
||||
|
||||
source /home/george/Desktop/PROJECT26/psqlDB/venv/bin/activate
|
||||
@@ -0,0 +1,128 @@
|
||||
import os
|
||||
import uvicorn
|
||||
from dotenv import load_dotenv
|
||||
from fastapi import FastAPI,Depends, Header, HTTPException, status
|
||||
import psycopg2
|
||||
from jwt import ExpiredSignatureError, InvalidTokenError
|
||||
import jwt
|
||||
load_dotenv()
|
||||
app = FastAPI()
|
||||
|
||||
SECRET_KEY = os.getenv("SECRET_KEY")
|
||||
ALGORITHM = os.getenv("ALGORITHM", "HS256")
|
||||
|
||||
|
||||
|
||||
|
||||
def verify_token(
|
||||
authorization: str = Header(None),
|
||||
):
|
||||
|
||||
if not authorization:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Authorization header missing",
|
||||
headers={
|
||||
"WWW-Authenticate": "Bearer"
|
||||
},
|
||||
)
|
||||
|
||||
parts = authorization.split()
|
||||
|
||||
if len(parts) != 2:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Invalid Authorization header",
|
||||
)
|
||||
|
||||
scheme = parts[0]
|
||||
token = parts[1]
|
||||
|
||||
if scheme.lower() != "bearer":
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Authorization scheme must be Bearer",
|
||||
)
|
||||
|
||||
try:
|
||||
|
||||
payload = jwt.decode(
|
||||
token,
|
||||
SECRET_KEY,
|
||||
algorithms=[ALGORITHM],
|
||||
)
|
||||
|
||||
return payload
|
||||
|
||||
except ExpiredSignatureError:
|
||||
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Token expired",
|
||||
)
|
||||
|
||||
except InvalidTokenError:
|
||||
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Invalid token",
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@app.get("/")
|
||||
def root():
|
||||
return {"message": "PostgreSQL Agent is running"}
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
host = os.getenv("HOST", "127.0.0.1")
|
||||
port = int(os.getenv("PORT", 9000))
|
||||
|
||||
uvicorn.run(
|
||||
"main:app",
|
||||
host=host,
|
||||
port=port,
|
||||
reload=True
|
||||
)
|
||||
|
||||
|
||||
|
||||
DB_CONFIG = {
|
||||
"host": "172.16.10.178",
|
||||
"port": 5444,
|
||||
"dbname": "postgres",
|
||||
"user": "postgres",
|
||||
"password": "postgres",
|
||||
"connect_timeout": 3,
|
||||
}
|
||||
|
||||
NODE_NAME = "node3"
|
||||
|
||||
|
||||
@app.get("/node/status")
|
||||
def node_status(token_data=Depends(verify_token)):
|
||||
|
||||
try:
|
||||
conn = psycopg2.connect(**DB_CONFIG)
|
||||
|
||||
conn.close()
|
||||
|
||||
return {
|
||||
"node": NODE_NAME,
|
||||
"online": True,
|
||||
"status": "online"
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
|
||||
return {
|
||||
"node": NODE_NAME,
|
||||
"online": False,
|
||||
"status": "offline",
|
||||
"error": str(e)
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
annotated-doc==0.0.5
|
||||
annotated-types==0.8.0
|
||||
anyio==4.15.1
|
||||
click==8.5.0
|
||||
fastapi==0.141.1
|
||||
h11==0.16.0
|
||||
idna==3.19
|
||||
pydantic==2.13.5
|
||||
pydantic_core==2.46.5
|
||||
python-dotenv==1.2.3
|
||||
starlette==1.6.0
|
||||
typing-inspection==0.4.4
|
||||
typing_extensions==4.16.0
|
||||
uvicorn==0.53.0
|
||||
Reference in new issue
Block a user