Spaces:
Build error
Build error
title: System Performance Monitor UI | |
emoji: 📊 | |
colorFrom: blue | |
colorTo: gray | |
sdk: gradio | |
sdk_version: 5.35.0 | |
app_file: app.py | |
python_version: 3.1 | |
license: mit | |
# ProMonitor 🌖 | |
## Features | |
ProMonitor offers a comprehensive interface for system monitoring and management, with a focus on security and usability: | |
- Dashboard: Displays real-time system metrics (CPU, memory, GPU, disk usage) and health status (Healthy, Degraded, Unhealthy) with a refreshable view. | |
- History: Visualizes historical CPU, memory, and GPU usage over a user-specified time range (1–1440 minutes) using tables and line charts. | |
- Resource Limits: Allows setting and viewing CPU, memory, and GPU power limits, with validation and feedback. | |
- Alerts: Shows active system alerts with severity levels (critical, warning) in a clear, color-coded table. | |
- Processes: Lists top CPU- and memory-intensive processes, with options to kill, suspend, or resume processes (secured with API key). | |
- System Info: Provides static system information (platform, CPU, memory, disk, GPU) in a structured format. | |
- Emergency Stop: Enables termination of high-memory processes with confirmation and API key authentication. | |
## Prerequisites | |
- Python: 3.10+ (as specified in .hf_space.yml) | |
- FastAPI Backend: The backend (app/main.py) must be running and accessible (default: http://localhost:8000). | |
- Dependencies: Listed in requirements.txt (see Installation). | |
## Installation | |
1 Clone the Repository: git clone https://huggingface.co/spaces//ProMonitor | |
2 cd ProMonitor | |
3 | |
4 Install Dependencies: pip install -r requirements.txt | |
5 Dependencies include: | |
◦ gradio==5.35.0 | |
◦ requests==2.32.3 | |
◦ pydantic==2.9.2 | |
◦ python-dotenv==1.0.1 | |
◦ logging==0.5.1.2 | |
6 Configure Environment: Create a .env file in the project root: API_BASE_URL=http://localhost:8000 | |
7 API_KEY=your_secure_api_key | |
8 | |
◦ Replace your_secure_api_key with the API key required by the FastAPI backend. | |
◦ Ensure .env is listed in .gitignore to prevent committing sensitive data. | |
9 Run the FastAPI Backend: Start the backend (assumed to be in app/main.py): uvicorn app.main:app --host 0.0.0.0 --port 8000 | |
10 If the backend is hosted elsewhere, update API_BASE_URL in .env. | |
11 Run the UI: Launch the Gradio app: python app.py | |
12 The UI will be available at http://localhost:7860. | |
# Usage | |
1 Access the UI: Open http://localhost:7860 in a web browser to access the ProMonitor interface. | |
2 Navigate Tabs: | |
◦ Dashboard: View real-time metrics and health status. Click “Refresh Metrics” to update. | |
◦ History: Enter a time range (1–1440 minutes) to view historical data in tables and charts. | |
◦ Resource Limits: Set CPU, memory, and GPU limits using input fields. View current limits. | |
◦ Alerts: Monitor active alerts with severity indicators (red for critical, yellow for warning). | |
◦ Processes: View top processes and perform actions (kill, suspend, resume) with a valid API key. | |
◦ System Info: Review static system details (platform, CPU, memory, etc.). | |
◦ Emergency Stop: Trigger an emergency stop to terminate high-memory processes (requires API key and confirmation). | |
3 Secure Actions: | |
◦ For process actions and emergency stop, provide the API key in the respective input fields. | |
◦ Ensure the backend validates the API key to prevent unauthorized access. | |
## Deployment on Hugging Face Spaces | |
### ProMonitor is configured for deployment on Hugging Face Spaces with the following setup: | |
1 Push to Hugging Face Spaces: | |
◦ Create a new Space on Hugging Face: https://huggingface.co/new | |
◦ Select “Gradio” as the SDK and configure it as a public or private Space. | |
◦ Push the repository containing app.py, requirements.txt, .hf_space.yml, and this README.md. | |
2 Configure Secrets: | |
◦ In the Space’s Settings > Secrets, add: | |
▪ API_BASE_URL: URL of the FastAPI backend (e.g., https://your-backend.com). | |
▪ API_KEY: The API key for secure endpoint access. | |
◦ Avoid including .env in the repository; use Spaces secrets for sensitive data. | |
3 Build and Deploy: | |
◦ Hugging Face Spaces will automatically build the container using requirements.txt and run app.py. | |
◦ Check the Space’s logs for any errors during startup. | |
◦ Access the deployed UI at https://huggingface.co/spaces//ProMonitor. | |
4 Backend Hosting: | |
◦ The FastAPI backend must be hosted separately (e.g., on another Hugging Face Space, AWS, or a local server with tunneling via ngrok). | |
◦ Update API_BASE_URL in Spaces secrets to point to the backend. | |
◦ Ensure the backend implements API key authentication for endpoints like /processes/action and /emergency/stop. | |
## Security Considerations | |
• API Key Authentication: | |
◦ The backend (app/main.py) must validate the Authorization header (e.g., Bearer ). | |
◦ Update the backend to include middleware for API key verification: from fastapi import Depends, HTTPException, Security | |
◦ from fastapi.security import APIKeyHeader | |
◦ | |
◦ api_key_header = APIKeyHeader(name="Authorization") | |
◦ def verify_api_key(api_key: str = Security(api_key_header)): | |
◦ if api_key != f"Bearer {os.getenv('API_KEY')}": | |
◦ raise HTTPException(status_code=403, detail="Invalid API key") | |
◦ return api_key | |
◦ Apply to sensitive endpoints: @app.post("/emergency/stop", dependencies=[Depends(verify_api_key)]). | |
• CORS: | |
◦ In the FastAPI backend, replace allow_origins=["*"] with specific origins (e.g., the Hugging Face Space URL) to prevent unauthorized access. | |
◦ Example: allow_origins=["https://-promonitor.hf.space"]. | |
• Sensitive Data: | |
◦ Do not commit .env or sensitive configuration files to the repository. | |
◦ Use Hugging Face Spaces secrets for API_KEY and API_BASE_URL. | |
• Rate Limiting: | |
◦ Implement rate limiting in the Gradio UI (e.g., using the ratelimit library) to prevent overwhelming the backend. | |
◦ Consider adding rate limiting to the FastAPI backend using slowapi. | |
## Testing | |
To ensure the UI works correctly, test it locally before deploying: | |
1 Install Testing Dependencies: pip install pytest pytest-httpx pytest-asyncio | |
2 | |
3 Create a Test File (test_ui.py): import pytest | |
4 from httpx import AsyncClient | |
5 from app import APIClient | |
6 | |
7 @pytest.mark.asyncio | |
8 async def test_get_metrics(): | |
9 async with AsyncClient() as client: | |
10 async def mock_get(*args, **kwargs): | |
11 return type("Response", (), {"json": lambda: {"status": "success", "data": {}}, "status_code": 200})() | |
12 client.get = mock_get | |
13 api_client = APIClient("http://test") | |
14 response = api_client.get_metrics() | |
15 assert response["status"] == "success" | |
16 | |
17 @pytest.mark.asyncio | |
18 async def test_get_history(): | |
19 async with AsyncClient() as client: | |
20 async def mock_get(*args, **kwargs): | |
21 return type("Response", (), {"json": lambda: {"status": "success", "data": []}, "status_code": 200})() | |
22 client.get = mock_get | |
23 api_client = APIClient("http://test") | |
24 response = api_client.get_history(60) | |
25 assert response["status"] == "success" | |
26 | |
27 Run Tests: pytest test_ui.py | |
28 | |
29 Test Locally: | |
◦ Start the FastAPI backend: uvicorn app.main:app --host 0.0.0.0 --port 8000 | |
◦ Run the Gradio UI: python app.py | |
◦ Verify all tabs and functionality in the browser. | |
## Troubleshooting | |
- Backend Unreachable: | |
- Ensure the FastAPI backend is running and accessible at API_BASE_URL. | |
- Check network connectivity and firewall settings. | |
- Use a tunneling service like ngrok for local testing: ngrok http 8000. | |
- API Key Errors: | |
- Verify the API_KEY matches the backend’s expected value. | |
- Check backend logs for authentication errors. | |
- Gradio UI Issues: | |
- Review ui.log for error messages. | |
- Ensure gradio==5.35.0 is installed correctly. | |
- Check Hugging Face Spaces logs for deployment issues. | |
## Contributing | |
### Contributions are welcome! To contribute: | |
1 Fork the repository. | |
2 Create a feature branch: git checkout -b feature/your-feature. | |
3 Commit changes: git commit -m "Add your feature". | |
4 Push to the branch: git push origin feature/your-feature. | |
5 Open a pull request on the Hugging Face Space repository. | |
Please include tests and follow PEP 8 guidelines. | |
## License | |
This project is licensed under the MIT License. See the LICENSE file for details. | |
## Acknowledgments | |
- Built with Gradio for the UI and FastAPI for the backend. | |
- Designed for cybersecurity and system performance monitoring on HP Z440 workstations. | |
- Hosted on Hugging Face Spaces. |