Health Checks
The health namespace provides comprehensive system health monitoring capabilities. It includes basic health checks, detailed system status, and visualization service monitoring.
Basic Operations
Basic Health Check
from functor_sdk import FunctorClientclient = FunctorClient()# Basic health checkhealth = client.health.check()print(f"System status: {health['status']}")print(f"System name: {health['system']}")print(f"Version: {health['version']}")print(f"Uptime: {health['uptime']}")
Detailed Health Check
# Detailed health check with component statushealth = client.health.check_detailed(detailed=True)print(f"Overall status: {health['status']}")print(f"Components:")for component, status in health['components'].items():print(f" {component}: {status['status']}")if 'message' in status:print(f" Message: {status['message']}")
Visualization Service Health
# Check visualization service specificallyviz_health = client.health.check_visualizations()print(f"Visualization service status: {viz_health['status']}")print(f"Service name: {viz_health['service']}")print(f"Available endpoints: {viz_health['endpoints']}")
Complete Parameter Reference
check() Parameters
health = client.health.check()# No parameters required
check_detailed() Parameters
health = client.health.check_detailed(detailed=True # Optional: Include detailed component information)
check_visualizations() Parameters
viz_health = client.health.check_visualizations()# No parameters required
Response Formats
Basic Health Response
health = client.health.check()# Basic propertiesprint(f"Status: {health['status']}") # 'healthy', 'degraded', 'unhealthy'print(f"System: {health['system']}")print(f"Version: {health['version']}")print(f"Uptime: {health['uptime']}")print(f"Timestamp: {health['timestamp']}")# Optional propertiesif 'message' in health:print(f"Message: {health['message']}")if 'checks' in health:print(f"Checks: {health['checks']}")
Detailed Health Response
health = client.health.check_detailed(detailed=True)# Overall statusprint(f"Overall status: {health['status']}")print(f"System: {health['system']}")print(f"Version: {health['version']}")# Component statusfor component, status in health['components'].items():print(f"\n{component}:")print(f" Status: {status['status']}")if 'message' in status:print(f" Message: {status['message']}")if 'details' in status:print(f" Details: {status['details']}")if 'response_time_ms' in status:print(f" Response time: {status['response_time_ms']}ms")
Visualization Health Response
viz_health = client.health.check_visualizations()# Basic propertiesprint(f"Status: {viz_health['status']}")print(f"Service: {viz_health['service']}")print(f"Version: {viz_health['version']}")# Available endpointsif 'endpoints' in viz_health:print(f"Available endpoints: {viz_health['endpoints']}")# Service detailsif 'details' in viz_health:print(f"Service details: {viz_health['details']}")
Advanced Usage Patterns
Comprehensive Health Monitoring
def comprehensive_health_check():client = FunctorClient()health_report = {"timestamp": "2024-01-01T00:00:00Z","overall_status": "unknown","checks": {}}try:# Basic health checkbasic_health = client.health.check()health_report["checks"]["basic"] = {"status": basic_health["status"],"system": basic_health["system"],"version": basic_health["version"],"uptime": basic_health["uptime"]}# Detailed health checkdetailed_health = client.health.check_detailed(detailed=True)health_report["checks"]["detailed"] = {"status": detailed_health["status"],"components": detailed_health["components"]}# Visualization service healthviz_health = client.health.check_visualizations()health_report["checks"]["visualizations"] = {"status": viz_health["status"],"service": viz_health["service"],"endpoints": viz_health.get("endpoints", [])}# Determine overall statusstatuses = [basic_health["status"],detailed_health["status"],viz_health["status"]]if all(status == "healthy" for status in statuses):health_report["overall_status"] = "healthy"elif any(status == "unhealthy" for status in statuses):health_report["overall_status"] = "unhealthy"else:health_report["overall_status"] = "degraded"except Exception as e:health_report["overall_status"] = "error"health_report["error"] = str(e)return health_report# Usagereport = comprehensive_health_check()print(f"Overall status: {report['overall_status']}")print(f"Checks performed: {len(report['checks'])}")
Async Health Monitoring
import asynciofrom functor_sdk import FunctorClientasync def async_health_monitoring():async with FunctorClient() as client:# Run all health checks concurrentlytasks = [client.health.check_async(),client.health.check_detailed_async(detailed=True),client.health.check_visualizations_async()]results = await asyncio.gather(*tasks, return_exceptions=True)basic_health, detailed_health, viz_health = results# Process resultshealth_summary = {"basic_status": "error","detailed_status": "error","viz_status": "error"}if not isinstance(basic_health, Exception):health_summary["basic_status"] = basic_health["status"]if not isinstance(detailed_health, Exception):health_summary["detailed_status"] = detailed_health["status"]if not isinstance(viz_health, Exception):health_summary["viz_status"] = viz_health["status"]return health_summary# Usagesummary = asyncio.run(async_health_monitoring())print(f"Health Summary: {summary}")
Health Monitoring with Alerts
def health_monitoring_with_alerts():client = FunctorClient()alerts = []try:# Check basic healthbasic_health = client.health.check()if basic_health["status"] != "healthy":alerts.append(f"Basic health check failed: {basic_health['status']}")# Check detailed healthdetailed_health = client.health.check_detailed(detailed=True)for component, status in detailed_health["components"].items():if status["status"] != "healthy":alerts.append(f"Component {component} is {status['status']}")if "message" in status:alerts.append(f" Message: {status['message']}")# Check visualization serviceviz_health = client.health.check_visualizations()if viz_health["status"] != "healthy":alerts.append(f"Visualization service is {viz_health['status']}")# Check uptimeuptime_hours = basic_health["uptime"] / 3600if uptime_hours < 1:alerts.append(f"System uptime is very low: {uptime_hours:.1f} hours")except Exception as e:alerts.append(f"Health check failed: {e}")return alerts# Usagealerts = health_monitoring_with_alerts()if alerts:print("Health Alerts:")for alert in alerts:print(f" - {alert}")else:print("All health checks passed!")
Error Handling
Common Error Scenarios
from functor_sdk import (FunctorClient,FunctorAPIError,FunctorConnectionError,FunctorServiceUnavailableError)client = FunctorClient()try:health = client.health.check()except FunctorConnectionError:print("Connection failed - check your network and base URL")except FunctorServiceUnavailableError:print("Service is currently unavailable")print("The system may be under maintenance")except FunctorAPIError as e:print(f"API error {e.status_code}: {e.message}")except Exception as e:print(f"Unexpected error: {e}")
Robust Health Checking
def robust_health_check(max_retries=3):client = FunctorClient()for attempt in range(max_retries):try:health = client.health.check()return {"status": "success","health": health,"attempts": attempt + 1}except FunctorConnectionError as e:if attempt < max_retries - 1:print(f"Connection error, retrying... (attempt {attempt + 1})")time.sleep(2 ** attempt) # Exponential backoffelse:return {"status": "connection_failed","error": str(e),"attempts": max_retries}except FunctorServiceUnavailableError as e:return {"status": "service_unavailable","error": str(e),"attempts": attempt + 1}except Exception as e:return {"status": "error","error": str(e),"attempts": attempt + 1}return {"status": "max_retries_exceeded","attempts": max_retries}# Usageresult = robust_health_check()if result["status"] == "success":print(f"Health check successful: {result['health']['status']}")else:print(f"Health check failed: {result['status']}")
Performance Optimization
Optimization Tips
- Use basic checks for frequent monitoring: Less overhead than detailed checks
- Cache health results: Health status doesn't change frequently
- Use async for concurrent checks: When monitoring multiple systems
- Implement exponential backoff: For retry logic
Health Check Caching
import timefrom functor_sdk import FunctorClientclass HealthCache:def __init__(self, client):self.client = clientself._cache = {}self._cache_time = {}self.cache_duration = 60 # 1 minutedef get_health(self, check_type="basic", force_refresh=False):now = time.time()# Check cacheif not force_refresh and check_type in self._cache:if now - self._cache_time[check_type] < self.cache_duration:print(f"Using cached {check_type} health check")return self._cache[check_type]# Fetch fresh dataprint(f"Fetching fresh {check_type} health check")try:if check_type == "basic":health = self.client.health.check()elif check_type == "detailed":health = self.client.health.check_detailed(detailed=True)elif check_type == "visualizations":health = self.client.health.check_visualizations()else:raise ValueError(f"Unknown check type: {check_type}")# Update cacheself._cache[check_type] = healthself._cache_time[check_type] = nowreturn healthexcept Exception as e:return {"error": str(e)}def clear_cache(self):self._cache.clear()self._cache_time.clear()# Usageclient = FunctorClient()health_cache = HealthCache(client)# First call - fetches from APIhealth1 = health_cache.get_health("basic")# Second call - uses cachehealth2 = health_cache.get_health("basic")# Force refreshhealth3 = health_cache.get_health("basic", force_refresh=True)
Integration Examples
System Status Dashboard
def create_system_dashboard():client = FunctorClient()dashboard = {"timestamp": "2024-01-01T00:00:00Z","overall_status": "unknown","components": {},"metrics": {}}try:# Basic healthbasic_health = client.health.check()dashboard["components"]["basic"] = {"status": basic_health["status"],"system": basic_health["system"],"version": basic_health["version"],"uptime": basic_health["uptime"]}# Detailed healthdetailed_health = client.health.check_detailed(detailed=True)dashboard["components"]["detailed"] = detailed_health["components"]# Visualization serviceviz_health = client.health.check_visualizations()dashboard["components"]["visualizations"] = {"status": viz_health["status"],"service": viz_health["service"],"endpoints": viz_health.get("endpoints", [])}# Calculate overall statusstatuses = [basic_health["status"],detailed_health["status"],viz_health["status"]]if all(status == "healthy" for status in statuses):dashboard["overall_status"] = "healthy"elif any(status == "unhealthy" for status in statuses):dashboard["overall_status"] = "unhealthy"else:dashboard["overall_status"] = "degraded"# Add metricsdashboard["metrics"] = {"total_components": len(dashboard["components"]),"healthy_components": sum(1 for comp in dashboard["components"].values()if isinstance(comp, dict) and comp.get("status") == "healthy"),"uptime_hours": basic_health["uptime"] / 3600}except Exception as e:dashboard["overall_status"] = "error"dashboard["error"] = str(e)return dashboard# Usagedashboard = create_system_dashboard()print(f"System Dashboard:")print(f"Overall Status: {dashboard['overall_status']}")print(f"Components: {dashboard['metrics'].get('total_components', 0)}")print(f"Healthy: {dashboard['metrics'].get('healthy_components', 0)}")
Health Monitoring Service
import timeimport jsonfrom datetime import datetimeclass HealthMonitoringService:def __init__(self, client, check_interval=300): # 5 minutesself.client = clientself.check_interval = check_intervalself.history = []self.max_history = 100def run_check(self):check_time = datetime.now().isoformat()try:# Perform health checksbasic_health = self.client.health.check()detailed_health = self.client.health.check_detailed(detailed=True)viz_health = self.client.health.check_visualizations()# Record resultshealth_record = {"timestamp": check_time,"basic_status": basic_health["status"],"detailed_status": detailed_health["status"],"viz_status": viz_health["status"],"uptime": basic_health["uptime"],"components": detailed_health["components"]}self.history.append(health_record)# Keep only recent historyif len(self.history) > self.max_history:self.history = self.history[-self.max_history:]return health_recordexcept Exception as e:error_record = {"timestamp": check_time,"error": str(e),"basic_status": "error","detailed_status": "error","viz_status": "error"}self.history.append(error_record)return error_recorddef get_status_summary(self):if not self.history:return {"status": "no_data"}recent = self.history[-1]return {"current_status": recent.get("basic_status", "unknown"),"last_check": recent["timestamp"],"uptime_hours": recent.get("uptime", 0) / 3600,"total_checks": len(self.history),"recent_errors": sum(1 for h in self.history[-10:] if "error" in h)}def export_history(self, filename=None):if filename is None:filename = f"health_history_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"with open(filename, 'w') as f:json.dump(self.history, f, indent=2)return filename# Usageclient = FunctorClient()monitor = HealthMonitoringService(client)# Run a checkhealth_record = monitor.run_check()print(f"Health check completed: {health_record['basic_status']}")# Get summarysummary = monitor.get_status_summary()print(f"Status summary: {summary}")# Export historyfilename = monitor.export_history()print(f"History exported to: {filename}")
Next Steps
- Knowledge Graphs Namespace - Monitor your knowledge graphs
- Sources Namespace - Check source health
- Visualizations Namespace - Monitor visualization services
- Error Handling - Comprehensive error management