Spaces:
Sleeping
Sleeping
| # API Testing Guide | |
| คู่มือการทดสอบ API สำหรับ Job Failure Prediction & Anomaly Detection | |
| ## 🚀 วิธีที่ 1: ใช้ Test Script (แนะนำ) | |
| ### Local Testing | |
| ```bash | |
| # Test API ที่รันบน localhost:8000 (default) | |
| python test_api.py | |
| # Test API ที่รันบน localhost:7860 (Hugging Face Spaces port) | |
| python test_api.py --port 7860 | |
| # Test API ที่ URL เฉพาะ | |
| python test_api.py --url http://localhost:8000 | |
| ``` | |
| ### Hugging Face Spaces Testing | |
| ```bash | |
| # Test API บน Hugging Face Spaces | |
| python test_api.py --url https://your-username-your-space.hf.space | |
| ``` | |
| --- | |
| ## 🧪 วิธีที่ 2: ใช้ cURL | |
| ### Health Check | |
| ```bash | |
| # Local | |
| curl http://localhost:8000/health | |
| # Hugging Face Spaces | |
| curl https://your-username-your-space.hf.space/health | |
| ``` | |
| ### Job Failure Prediction | |
| ```bash | |
| # Local | |
| curl -X POST http://localhost:8000/predict/job-fail \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "zone": "prod", | |
| "job_nm": "daily_export_customer", | |
| "job_start_time": "2026-01-21T01:00:00", | |
| "duration_sec": 5400, | |
| "status": "SUCCESS", | |
| "err_msg": "", | |
| "explain": true | |
| }' | |
| # Hugging Face Spaces | |
| curl -X POST https://your-username-your-space.hf.space/predict/job-fail \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "zone": "prod", | |
| "job_nm": "daily_export_customer", | |
| "job_start_time": "2026-01-21T01:00:00", | |
| "duration_sec": 5400, | |
| "status": "SUCCESS", | |
| "explain": true | |
| }' | |
| ``` | |
| ### Anomaly Detection | |
| ```bash | |
| # Local | |
| curl -X POST http://localhost:8000/detect/anomaly \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "features": { | |
| "duration_sec": 5400, | |
| "duration_zscore": 1.6, | |
| "avg_duration_7": 3000, | |
| "failure_rate_7": 0.15, | |
| "err_msg_len": 0, | |
| "hour_sin": 0.2588, | |
| "hour_cos": 0.9659 | |
| }, | |
| "threshold": 0.01 | |
| }' | |
| # Hugging Face Spaces | |
| curl -X POST https://your-username-your-space.hf.space/detect/anomaly \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "features": { | |
| "duration_sec": 5400, | |
| "duration_zscore": 1.6, | |
| "avg_duration_7": 3000, | |
| "failure_rate_7": 0.15, | |
| "err_msg_len": 0 | |
| } | |
| }' | |
| ``` | |
| --- | |
| ## 🌐 วิธีที่ 3: ใช้ Swagger UI (Interactive) | |
| ### Local | |
| 1. เริ่ม API server: | |
| ```bash | |
| uvicorn app:app --host 0.0.0.0 --port 8000 | |
| ``` | |
| 2. เปิด browser ไปที่: | |
| ``` | |
| http://localhost:8000/docs | |
| ``` | |
| 3. ทดสอบ endpoints ผ่าน interactive UI | |
| ### Hugging Face Spaces | |
| 1. ไปที่ Space page | |
| 2. คลิก "API" tab หรือไปที่: | |
| ``` | |
| https://your-username-your-space.hf.space/docs | |
| ``` | |
| 3. ทดสอบ endpoints ผ่าน interactive UI | |
| --- | |
| ## 📝 วิธีที่ 4: ใช้ Python Requests | |
| ### Example Script | |
| ```python | |
| import requests | |
| import json | |
| # Base URL | |
| BASE_URL = "http://localhost:8000" # หรือ URL ของ Hugging Face Space | |
| # Test Health | |
| response = requests.get(f"{BASE_URL}/health") | |
| print("Health Check:", response.json()) | |
| # Test Prediction | |
| payload = { | |
| "zone": "prod", | |
| "job_nm": "daily_export", | |
| "job_start_time": "2026-01-21T01:00:00", | |
| "duration_sec": 5400, | |
| "status": "SUCCESS", | |
| "explain": True | |
| } | |
| response = requests.post( | |
| f"{BASE_URL}/predict/job-fail", | |
| json=payload | |
| ) | |
| print("Prediction:", response.json()) | |
| # Test Anomaly Detection | |
| payload = { | |
| "features": { | |
| "duration_sec": 5400, | |
| "duration_zscore": 1.6, | |
| "err_msg_len": 0 | |
| } | |
| } | |
| response = requests.post( | |
| f"{BASE_URL}/detect/anomaly", | |
| json=payload | |
| ) | |
| print("Anomaly Detection:", response.json()) | |
| ``` | |
| --- | |
| ## 🔍 วิธีที่ 5: ใช้ Postman / Insomnia | |
| ### Import Collection | |
| 1. สร้าง new collection | |
| 2. เพิ่ม requests: | |
| **Health Check** | |
| - Method: `GET` | |
| - URL: `http://localhost:8000/health` | |
| **Job Failure Prediction** | |
| - Method: `POST` | |
| - URL: `http://localhost:8000/predict/job-fail` | |
| - Headers: `Content-Type: application/json` | |
| - Body (JSON): | |
| ```json | |
| { | |
| "zone": "prod", | |
| "job_nm": "daily_export", | |
| "job_start_time": "2026-01-21T01:00:00", | |
| "duration_sec": 5400, | |
| "status": "SUCCESS", | |
| "explain": true | |
| } | |
| ``` | |
| **Anomaly Detection** | |
| - Method: `POST` | |
| - URL: `http://localhost:8000/detect/anomaly` | |
| - Headers: `Content-Type: application/json` | |
| - Body (JSON): | |
| ```json | |
| { | |
| "features": { | |
| "duration_sec": 5400, | |
| "duration_zscore": 1.6, | |
| "err_msg_len": 0 | |
| } | |
| } | |
| ``` | |
| --- | |
| ## ✅ Expected Responses | |
| ### Health Check Response | |
| ```json | |
| { | |
| "status": "healthy", | |
| "service": "job-failure-prediction", | |
| "models_loaded": { | |
| "predictor": true, | |
| "anomaly_detector": true | |
| } | |
| } | |
| ``` | |
| ### Job Failure Prediction Response | |
| ```json | |
| { | |
| "fail_probability": 0.79, | |
| "risk_level": "MEDIUM", | |
| "top_drivers": [ | |
| { | |
| "feature": "failure_rate_7", | |
| "shap_value": 0.30, | |
| "effect": "increase" | |
| } | |
| ], | |
| "recommended_actions": [ | |
| "Monitor upstream dependencies and recent job history" | |
| ] | |
| } | |
| ``` | |
| ### Anomaly Detection Response | |
| ```json | |
| { | |
| "reconstruction_error": 0.0235, | |
| "is_anomaly": true, | |
| "threshold": 0.01, | |
| "top_drivers": [ | |
| { | |
| "feature": "duration_zscore", | |
| "error": 0.0142 | |
| } | |
| ] | |
| } | |
| ``` | |
| --- | |
| ## 🐛 Troubleshooting | |
| ### Connection Error | |
| **ปัญหา:** `ConnectionError: Could not connect to API` | |
| **แก้ไข:** | |
| - ตรวจสอบว่า API server กำลังรันอยู่ | |
| - ตรวจสอบ URL และ port | |
| - ตรวจสอบ firewall settings | |
| ### 404 Not Found | |
| **ปัญหา:** `404 Not Found` | |
| **แก้ไข:** | |
| - ตรวจสอบ endpoint path (`/health`, `/predict/job-fail`, `/detect/anomaly`) | |
| - ตรวจสอบว่า API server รันอยู่ | |
| ### 500 Internal Server Error | |
| **ปัญหา:** `500 Internal Server Error` | |
| **แก้ไข:** | |
| - ตรวจสอบ logs ของ API server | |
| - ตรวจสอบว่า models ถูก load ถูกต้อง | |
| - ตรวจสอบ request payload format | |
| ### Models Not Loaded | |
| **ปัญหา:** `models_loaded: {"predictor": false, "anomaly_detector": false}` | |
| **แก้ไข:** | |
| - ตรวจสอบว่า models อยู่ใน `models/` directory | |
| - ตรวจสอบว่า model files มีครบถ้วน | |
| - ตรวจสอบ logs สำหรับ error messages | |
| --- | |
| ## 📊 Test Cases | |
| ### Test Case 1: Basic Health Check | |
| ```bash | |
| curl http://localhost:8000/health | |
| ``` | |
| **Expected:** Status 200, models_loaded = true | |
| ### Test Case 2: Prediction with Minimal Data | |
| ```bash | |
| curl -X POST http://localhost:8000/predict/job-fail \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"job_nm": "test_job", "job_start_time": "2026-01-21T01:00:00"}' | |
| ``` | |
| **Expected:** Status 200, fail_probability between 0-1 | |
| ### Test Case 3: Prediction with Full Data | |
| ```bash | |
| curl -X POST http://localhost:8000/predict/job-fail \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "zone": "prod", | |
| "job_nm": "daily_export", | |
| "job_start_time": "2026-01-21T01:00:00", | |
| "duration_sec": 5400, | |
| "status": "SUCCESS", | |
| "explain": true | |
| }' | |
| ``` | |
| **Expected:** Status 200, includes top_drivers and recommended_actions | |
| ### Test Case 4: Anomaly Detection | |
| ```bash | |
| curl -X POST http://localhost:8000/detect/anomaly \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "features": { | |
| "duration_sec": 10000, | |
| "duration_zscore": 3.0, | |
| "err_msg_len": 0 | |
| } | |
| }' | |
| ``` | |
| **Expected:** Status 200, is_anomaly = true (for high zscore) | |
| --- | |
| ## 🎯 Quick Test Checklist | |
| - [ ] Health endpoint returns 200 | |
| - [ ] Models are loaded (check health response) | |
| - [ ] Prediction endpoint accepts requests | |
| - [ ] Prediction returns valid probability (0-1) | |
| - [ ] Risk level is one of: MINIMAL, LOW, MEDIUM, CRITICAL | |
| - [ ] SHAP explanations work (when explain=true) | |
| - [ ] Anomaly detection accepts feature dict | |
| - [ ] Anomaly detection returns is_anomaly boolean | |
| - [ ] Error handling works (invalid requests return 422/500) | |
| - [ ] CORS works (if testing from browser) | |
| --- | |
| ## 📚 Additional Resources | |
| - **Swagger UI**: `/docs` - Interactive API documentation | |
| - **ReDoc**: `/redoc` - Alternative API documentation | |
| - **OpenAPI Schema**: `/openapi.json` - Machine-readable API schema | |