Bài viết cập nhật: 2026-05-30 | Phiên bản: v2_0451_0530 | Tác giả: đội ngũ kỹ thuật HolySheep AI

Mở đầu: Tại sao cần quan tâm đến API SLA và Failover?

Trong môi trường production, downtime của AI API có thể gây thiệt hại hàng nghìn đô mỗi giờ. Bài viết này sẽ hướng dẫn bạn xây dựng hệ thống kháng lỗi toàn diện với HolySheep AI, bao gồm các chiến lược rate limiting thông minh, circuit breaker pattern, và multi-region failover.

Bảng so sánh: HolySheep AI vs API chính thức vs Dịch vụ Relay

Tiêu chí HolySheep AI API chính thức (OpenAI/Anthropic) Dịch vụ Relay khác
Độ trễ trung bình <50ms 150-300ms 80-200ms
SLA uptime 99.95% 99.9% 99.5-99.8%
Tỷ giá ¥1 = $1 (tiết kiệm 85%+) Giá gốc USD Markup 20-50%
Hỗ trợ thanh toán WeChat, Alipay, Visa Thẻ quốc tế Hạn chế
GPT-4.1 $8/MTok $8/MTok $10-15/MTok
Claude Sonnet 4.5 $15/MTok $15/MTok $18-22/MTok
DeepSeek V3.2 $0.42/MTok Không có $0.50-0.80/MTok
Multi-region failover ✓ Tích hợp sẵn Không Tùy nhà cung cấp
Tín dụng miễn phí ✓ Có khi đăng ký $5 trial Thường không

1. Cấu hình Rate Limiting với Exponential Backoff

Khi làm việc với AI API, việc xử lý rate limit là bắt buộc. Dưới đây là implementation hoàn chỉnh với retry logic thông minh.

# holy_sheep_client.py
import time
import asyncio
import aiohttp
from typing import Optional, Dict, Any
from dataclasses import dataclass
from enum import Enum

class RetryStrategy(Enum):
    EXPONENTIAL_BACKOFF = "exponential_backoff"
    LINEAR_BACKOFF = "linear_backoff"
    FIBONACCI_BACKOFF = "fibonacci_backoff"

@dataclass
class RateLimitConfig:
    max_retries: int = 5
    base_delay: float = 1.0
    max_delay: float = 60.0
    jitter: bool = True
    strategy: RetryStrategy = RetryStrategy.EXPONENTIAL_BACKOFF

class HolySheepAIClient:
    """
    HolySheep AI API Client với Rate Limiting và Retry Logic
    base_url: https://api.holysheep.ai/v1
    """
    
    BASE_URL = "https://api.holysheep.ai/v1"
    
    def __init__(self, api_key: str, config: Optional[RateLimitConfig] = None):
        self.api_key = api_key
        self.config = config or RateLimitConfig()
        self.session: Optional[aiohttp.ClientSession] = None
        self.request_count = 0
        self.last_request_time = 0
        
    async def _calculate_delay(self, attempt: int) -> float:
        """Tính toán delay với chiến lược backoff được cấu hình"""
        if self.config.strategy == RetryStrategy.EXPONENTIAL_BACKOFF:
            delay = self.config.base_delay * (2 ** attempt)
        elif self.config.strategy == RetryStrategy.LINEAR_BACKOFF:
            delay = self.config.base_delay * attempt
        else:  # FIBONACCI
            delay = self.config.base_delay * self._fibonacci(attempt)
        
        # Áp dụng jitter để tránh thundering herd
        if self.config.jitter:
            import random
            delay = delay * (0.5 + random.random())
        
        return min(delay, self.config.max_delay)
    
    def _fibonacci(self, n: int) -> float:
        """Tính số Fibonacci thứ n"""
        if n <= 1:
            return 1
        a, b = 1, 1
        for _ in range(n - 1):
            a, b = b, a + b
        return b
    
    async def _make_request(
        self,
        method: str,
        endpoint: str,
        data: Optional[Dict[str, Any]] = None,
        headers: Optional[Dict[str, str]] = None
    ) -> Dict[str, Any]:
        """Thực hiện request với retry logic"""
        
        default_headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        if headers:
            default_headers.update(headers)
        
        last_exception = None
        
        for attempt in range(self.config.max_retries):
            try:
                async with self.session.request(
                    method,
                    f"{self.BASE_URL}{endpoint}",
                    json=data,
                    headers=default_headers,
                    timeout=aiohttp.ClientTimeout(total=60)
                ) as response:
                    self.request_count += 1
                    self.last_request_time = time.time()
                    
                    if response.status == 200:
                        return await response.json()
                    
                    elif response.status == 429:
                        # Rate limit hit - đọc Retry-After header
                        retry_after = response.headers.get('Retry-After', 
                                                           str(await self._calculate_delay(attempt)))
                        wait_time = float(retry_after)
                        print(f"[Rate Limited] Chờ {wait_time:.2f}s trước retry #{attempt + 1}")
                        await asyncio.sleep(wait_time)
                        
                    elif response.status >= 500:
                        # Server error - retry với backoff
                        delay = await self._calculate_delay(attempt)
                        print(f"[Server Error {response.status}] Retry #{attempt + 1} sau {delay:.2f}s")
                        await asyncio.sleep(delay)
                        
                    else:
                        # Client error - không retry
                        error_text = await response.text()
                        raise Exception(f"HTTP {response.status}: {error_text}")
                        
            except aiohttp.ClientError as e:
                last_exception = e
                delay = await self._calculate_delay(attempt)
                print(f"[Connection Error] {type(e).__name__}: {str(e)}")
                print(f"Retry #{attempt + 1}/{self.config.max_retries} sau {delay:.2f}s")
                await asyncio.sleep(delay)
        
        raise Exception(f"Tất cả {self.config.max_retries} retry đều thất bại. Lỗi cuối: {last_exception}")
    
    async def chat_completions(
        self,
        model: str = "gpt-4.1",
        messages: list = None,
        **kwargs
    ) -> Dict[str, Any]:
        """
        Gọi Chat Completions API với rate limiting tự động
        """
        if messages is None:
            messages = []
            
        payload = {
            "model": model,
            "messages": messages,
            **kwargs
        }
        
        return await self._make_request("POST", "/chat/completions", payload)
    
    async def __aenter__(self):
        self.session = aiohttp.ClientSession()
        return self
    
    async def __aexit__(self, exc_type, exc_val, exc_tb):
        if self.session:
            await self.session.close()

============== SỬ DỤNG ==============

async def main(): config = RateLimitConfig( max_retries=5, base_delay=1.0, max_delay=30.0, jitter=True, strategy=RetryStrategy.EXPONENTIAL_BACKOFF ) async with HolySheepAIClient("YOUR_HOLYSHEEP_API_KEY", config) as client: response = await client.chat_completions( model="gpt-4.1", messages=[{"role": "user", "content": "Xin chào"}], temperature=0.7 ) print(f"Response: {response}") if __name__ == "__main__": asyncio.run(main())

2. Circuit Breaker Pattern cho AI API

Circuit breaker giúp ngăn chặn cascade failure khi API gặp sự cố. Khi số lỗi vượt ngưỡng, circuit sẽ "ngắt" để bảo vệ hệ thống.

# circuit_breaker.py
import asyncio
import time
from enum import Enum
from dataclasses import dataclass, field
from typing import Callable, Any, Optional
from collections import deque
from threading import Lock

class CircuitState(Enum):
    CLOSED = "closed"       # Hoạt động bình thường
    OPEN = "open"           # Ngắt mạch - từ chối request
    HALF_OPEN = "half_open" # Thử nghiệm phục hồi

@dataclass
class CircuitBreakerConfig:
    failure_threshold: int = 5      # Số lỗi để mở circuit
    success_threshold: int = 3     # Số thành công để đóng circuit
    timeout: float = 30.0          # Thời gian chuyển OPEN -> HALF_OPEN (giây)
    half_open_max_calls: int = 3   # Số call tối đa trong trạng thái half-open

class CircuitBreaker:
    """
    Circuit Breaker Pattern cho HolySheep AI API
    """
    
    def __init__(self, name: str, config: Optional[CircuitBreakerConfig] = None):
        self.name = name
        self.config = config or CircuitBreakerConfig()
        self.state = CircuitState.CLOSED
        self.failure_count = 0
        self.success_count = 0
        self.last_failure_time: Optional[float] = None
        self.half_open_calls = 0
        self.history: deque = field(default_factory=lambda: deque(maxlen=100))
        
    def _should_attempt(self) -> bool:
        """Kiểm tra xem có nên thử request không"""
        if self.state == CircuitState.CLOSED:
            return True
        
        if self.state == CircuitState.OPEN:
            # Kiểm tra timeout
            if time.time() - self.last_failure_time >= self.config.timeout:
                print(f"[Circuit Breaker {self.name}] Chuyển sang HALF_OPEN sau {self.config.timeout}s")
                self.state = CircuitState.HALF_OPEN
                self.half_open_calls = 0
                return True
            return False
        
        if self.state == CircuitState.HALF_OPEN:
            return self.half_open_calls < self.config.half_open_max_calls
        
        return False
    
    def _on_success(self):
        """Xử lý khi request thành công"""
        self.history.append({"type": "success", "time": time.time()})
        
        if self.state == CircuitState.HALF_OPEN:
            self.success_count += 1
            self.half_open_calls += 1
            
            if self.success_count >= self.config.success_threshold:
                print(f"[Circuit Breaker {self.name}] Đóng circuit - API phục hồi!")
                self.state = CircuitState.CLOSED
                self.failure_count = 0
                self.success_count = 0
        else:
            self.failure_count = 0
    
    def _on_failure(self, error: Exception):
        """Xử lý khi request thất bại"""
        self.failure_count += 1
        self.last_failure_time = time.time()
        self.history.append({"type": "failure", "error": str(error), "time": time.time()})
        
        if self.state == CircuitState.HALF_OPEN:
            # Thất bại trong half-open = quay về OPEN
            print(f"[Circuit Breaker {self.name}] Thất bại trong HALF_OPEN - Mở lại circuit")
            self.state = CircuitState.OPEN
            self.half_open_calls = 0
            self.success_count = 0
            
        elif self.failure_count >= self.config.failure_threshold:
            print(f"[Circuit Breaker {self.name}] Mở circuit - {self.failure_count} lỗi liên tiếp")
            self.state = CircuitState.OPEN
    
    def get_stats(self) -> dict:
        """Lấy thống kê circuit breaker"""
        return {
            "name": self.name,
            "state": self.state.value,
            "failure_count": self.failure_count,
            "success_count": self.success_count,
            "last_failure": self.last_failure_time,
            "threshold": self.config.failure_threshold
        }
    
    async def call(self, func: Callable, *args, fallback: Callable = None, **kwargs) -> Any:
        """
        Execute function với circuit breaker protection
        """
        if not self._should_attempt():
            print(f"[Circuit Breaker {self.name}] Circuit OPEN - Sử dụng fallback")
            if fallback:
                return await fallback(*args, **kwargs) if asyncio.iscoroutinefunction(fallback) else fallback(*args, **kwargs)
            raise Exception(f"Circuit {self.name} đang OPEN - không thể thực hiện request")
        
        try:
            result = await func(*args, **kwargs) if asyncio.iscoroutinefunction(func) else func(*args, **kwargs)
            self._on_success()
            return result
        except Exception as e:
            self._on_failure(e)
            if fallback:
                return await fallback(*args, **kwargs) if asyncio.iscoroutinefunction(fallback) else fallback(*args, **kwargs)
            raise

============== TÍCH HỢP VỚI HOLYSHEEP ==============

class HolySheepCircuitBreaker: """ HolySheep AI với Circuit Breaker tích hợp """ def __init__(self, api_key: str): self.api_key = api_key self.primary_cb = CircuitBreaker( "holy_sheep_primary", CircuitBreakerConfig(failure_threshold=3, timeout=30.0) ) self.fallback_cb = CircuitBreaker( "holy_sheep_fallback", CircuitBreakerConfig(failure_threshold=5, timeout=60.0) ) async def chat_with_circuit_breaker( self, messages: list, model: str = "gpt-4.1", use_fallback: bool = False ) -> dict: """Gọi API với circuit breaker protection""" async def primary_call(): from holy_sheep_client import HolySheepAIClient async with HolySheepAIClient(self.api_key) as client: return await client.chat_completions(model=model, messages=messages) async def fallback_call(): # Fallback sang model khác hoặc cache print("[Fallback] Sử dụng response từ cache") return {"cached": True, "model": "cached"} cb = self.fallback_cb if use_fallback else self.primary_cb return await cb.call(primary_call, fallback=fallback_call)

============== SỬ DỤNG ==============

async def demo(): cb = HolySheepCircuitBreaker("YOUR_HOLYSHEEP_API_KEY") # Gọi với circuit breaker result = await cb.chat_with_circuit_breaker( messages=[{"role": "user", "content": "Test circuit breaker"}] ) print(f"Kết quả: {result}") # Kiểm tra stats print(f"Primary CB Stats: {cb.primary_cb.get_stats()}") if __name__ == "__main__": asyncio.run(demo())

3. Multi-Region Failover với Health Check

Triển khai multi-region failover đảm bảo high availability tối đa cho production.

# multi_region_failover.py
import asyncio
import aiohttp
import time
from typing import List, Dict, Optional, Tuple
from dataclasses import dataclass
from enum import Enum
import random

class RegionStatus(Enum):
    HEALTHY = "healthy"
    DEGRADED = "degraded"
    UNHEALTHY = "unhealthy"
    UNKNOWN = "unknown"

@dataclass
class Region:
    name: str
    base_url: str
    priority: int = 1
    status: RegionStatus = RegionStatus.UNKNOWN
    latency_ms: float = 0.0
    consecutive_failures: int = 0
    last_health_check: float = 0

class MultiRegionFailover:
    """
    Multi-Region Failover với Health Check cho HolySheep AI
    """
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.regions: List[Region] = []
        self.current_region: Optional[Region] = None
        self.session: Optional[aiohttp.ClientSession] = None
        
        # Cấu hình health check
        self.health_check_interval = 30  # giây
        self.health_check_timeout = 5    # giây
        self.max_latency_threshold = 500  # ms
        
    def add_region(self, name: str, base_url: str, priority: int = 1):
        """Thêm region vào danh sách"""
        region = Region(name=name, base_url=base_url, priority=priority)
        self.regions.append(region)
        self.regions.sort(key=lambda x: x.priority)
        
    async def _health_check_region(self, region: Region) -> Tuple[bool, float]:
        """Kiểm tra sức khỏe của một region"""
        try:
            start_time = time.time()
            
            headers = {
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            }
            
            # Test với request nhẹ
            async with self.session.post(
                f"{region.base_url}/chat/completions",
                headers=headers,
                json={
                    "model": "gpt-4.1",
                    "messages": [{"role": "user", "content": "ping"}],
                    "max_tokens": 1
                },
                timeout=aiohttp.ClientTimeout(total=self.health_check_timeout)
            ) as response:
                latency = (time.time() - start_time) * 1000  # Convert to ms
                
                if response.status == 200:
                    return True, latency
                else:
                    return False, latency
                    
        except asyncio.TimeoutError:
            return False, self.health_check_timeout * 1000
        except Exception as e:
            print(f"[Health Check] {region.name}: Error - {str(e)}")
            return False, 0
    
    async def _update_region_status(self, region: Region):
        """Cập nhật trạng thái region sau health check"""
        is_healthy, latency = await self._health_check_region(region)
        
        region.latency_ms = latency
        region.last_health_check = time.time()
        
        if is_healthy:
            region.consecutive_failures = 0
            if latency < self.max_latency_threshold:
                region.status = RegionStatus.HEALTHY
            else:
                region.status = RegionStatus.DEGRADED
        else:
            region.consecutive_failures += 1
            if region.consecutive_failures >= 3:
                region.status = RegionStatus.UNHEALTHY
    
    async def _health_check_loop(self):
        """Background loop kiểm tra sức khỏe tất cả regions"""
        while True:
            tasks = [self._update_region_status(region) for region in self.regions]
            await asyncio.gather(*tasks, return_exceptions=True)
            
            # Cập nhật current region
            self._select_best_region()
            
            await asyncio.sleep(self.health_check_interval)
    
    def _select_best_region(self):
        """Chọn region tốt nhất dựa trên health check"""
        healthy_regions = [r for r in self.regions if r.status != RegionStatus.UNHEALTHY]
        
        if not healthy_regions:
            print("[WARNING] Tất cả regions đều unhealthy!")
            self.current_region = None
            return
        
        # Ưu tiên latency thấp nhất
        best = min(healthy_regions, key=lambda r: (r.priority, r.latency_ms))
        self.current_region = best
        
        print(f"[Region Selection] Chọn {best.name} (latency: {best.latency_ms:.2f}ms, status: {best.status.value})")
    
    async def call(self, messages: list, model: str = "gpt-4.1", **kwargs) -> dict:
        """
        Gọi API với automatic failover
        """
        if not self.current_region:
            raise Exception("Không có region khả dụng")
        
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        payload = {
            "model": model,
            "messages": messages,
            **kwargs
        }
        
        # Thử region hiện tại trước
        for attempt_region in [self.current_region] + [r for r in self.regions if r != self.current_region]:
            try:
                start_time = time.time()
                
                async with self.session.post(
                    f"{attempt_region.base_url}/chat/completions",
                    headers=headers,
                    json=payload,
                    timeout=aiohttp.ClientTimeout(total=60)
                ) as response:
                    if response.status == 200:
                        result = await response.json()
                        result['_metadata'] = {
                            'region': attempt_region.name,
                            'latency_ms': (time.time() - start_time) * 1000,
                            'attempt': 1
                        }
                        return result
                    
                    elif response.status >= 500:
                        print(f"[Failover] {attempt_region.name} returned {response.status}, trying next...")
                        continue
                    else:
                        error_text = await response.text()
                        raise Exception(f"HTTP {response.status}: {error_text}")
                        
            except Exception as e:
                print(f"[Failover] {attempt_region.name} failed: {str(e)}, trying next...")
                attempt_region.consecutive_failures += 1
                if attempt_region.consecutive_failures >= 3:
                    attempt_region.status = RegionStatus.UNHEALTHY
                continue
        
        raise Exception("Tất cả regions đều không khả dụng")
    
    async def start(self):
        """Khởi động multi-region client"""
        self.session = aiohttp.ClientSession()
        
        # Bắt đầu health check loop
        asyncio.create_task(self._health_check_loop())
        
        # Initial health check
        await asyncio.sleep(2)
        
    async def stop(self):
        """Dừng multi-region client"""
        if self.session:
            await self.session.close()
    
    def get_status(self) -> dict:
        """Lấy trạng thái tất cả regions"""
        return {
            "current_region": self.current_region.name if self.current_region else None,
            "regions": [
                {
                    "name": r.name,
                    "status": r.status.value,
                    "latency_ms": round(r.latency_ms, 2),
                    "failures": r.consecutive_failures,
                    "last_check": r.last_health_check
                }
                for r in self.regions
            ]
        }

============== SỬ DỤNG ==============

async def main(): client = MultiRegionFailover("YOUR_HOLYSHEEP_API_KEY") # Cấu hình regions client.add_region("ap-southeast", "https://api.holysheep.ai/v1", priority=1) client.add_region("us-east", "https://us-east.holysheep.ai/v1", priority=2) client.add_region("eu-west", "https://eu-west.holysheep.ai/v1", priority=3) await client.start() try: # Gọi API - tự động failover nếu cần response = await client.call( messages=[{"role": "user", "content": "Hello với failover"}], model="gpt-4.1" ) print(f"Response từ {response['_metadata']['region']}: {response}") # Kiểm tra trạng thái status = client.get_status() print(f"Status: {status}") finally: await client.stop() if __name__ == "__main__": asyncio.run(main())

4. Tích hợp Alerting với Monitoring

Thiết lập hệ thống giám sát và cảnh báo để phát hiện sự cố sớm.

# monitoring_alerting.py
import asyncio
import aiohttp
import time
from typing import Dict, List, Optional, Callable
from dataclasses import dataclass, field
from collections import deque
import json

@dataclass
class AlertRule:
    name: str
    metric: str
    condition: str  # "gt", "lt", "eq"
    threshold: float
    severity: str = "warning"  # "info", "warning", "critical"
    cooldown_seconds: int = 300

@dataclass
class MetricData:
    name: str
    value: float
    timestamp: float
    tags: Dict[str, str] = field(default_factory=dict)

class MonitoringAlertingSystem:
    """
    Hệ thống Monitoring và Alerting cho HolySheep AI API
    """
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.metrics: deque = field(default_factory=lambda: deque(maxlen=10000))
        self.alert_rules: List[AlertRule] = []
        self.alert_history: deque = field(default_factory=deque)
        self.alert_callbacks: List[Callable] = []
        self.is_running = False
        
        # Metrics counters
        self.request_count = 0
        self.error_count = 0
        self.total_latency = 0.0
        self.last_request_time = 0
        
    def add_alert_rule(self, rule: AlertRule):
        """Thêm alert rule"""
        self.alert_rules.append(rule)
        print(f"[Alerting] Đã thêm rule: {rule.name}")
    
    def register_alert_callback(self, callback: Callable):
        """Đăng ký callback khi có alert"""
        self.alert_callbacks.append(callback)
    
    def record_metric(self, name: str, value: float, tags: Optional[Dict[str, str]] = None):
        """Ghi metric data"""
        metric = MetricData(
            name=name,
            value=value,
            timestamp=time.time(),
            tags=tags or {}
        )
        self.metrics.append(metric)
        
        # Check alert rules
        self._check_alerts(metric)
    
    def record_request(self, latency_ms: float, success: bool, region: str = "default"):
        """Ghi metric cho request"""
        self.request_count += 1
        self.total_latency += latency_ms
        self.last_request_time = time.time()
        
        if not success:
            self.error_count += 1
        
        # Record individual metrics
        self.record_metric("api.latency", latency_ms, {"region": region})
        self.record_metric("api.success" if success else "api.error", 1 if success else 1, {"region": region})
        
        # Calculate rate metrics
        error_rate = self.error_count / self.request_count if self.request_count > 0 else 0
        avg_latency = self.total_latency / self.request_count if self.request_count > 0 else 0
        
        self.record_metric("api.error_rate", error_rate * 100, {"region": region})
        self.record_metric("api.avg_latency", avg_latency, {"region": region})
    
    def _check_alerts(self, metric: MetricData):
        """Kiểm tra xem metric có trigger alert không"""
        for rule in self.alert_rules:
            if rule.metric != metric.name:
                continue
            
            # Check condition
            triggered = False
            if rule.condition == "gt" and metric.value > rule.threshold:
                triggered = True
            elif rule.condition == "lt" and metric.value < rule.threshold:
                triggered = True
            elif rule.condition == "eq" and metric.value == rule.threshold:
                triggered = True
            
            if triggered:
                self._trigger_alert(rule, metric)
    
    def _trigger_alert(self, rule: AlertRule, metric: MetricData):
        """Trigger alert"""
        # Check cooldown
        for alert in self.alert_history:
            if alert['rule'] == rule.name:
                if time.time() - alert['timestamp'] < rule.cooldown_seconds:
                    return  # Still in cooldown
        
        alert = {
            "rule": rule.name,
            "severity": rule.severity,
            "metric": metric.name,
            "value": metric.value,
            "threshold": rule.threshold,
            "timestamp": time.time(),
            "message": f"[{rule.severity.upper()}] {rule.name}: {metric.name}={metric.value:.2f} ({rule.condition} {rule.threshold})"
        }
        
        self.alert_history.append(alert)
        print(f"\n{'='*60}")
        print(f"🚨 ALERT: {alert['message']}")
        print(f"{'='*60}\n")
        
        # Call registered callbacks
        for callback in self.alert_callbacks:
            try:
                callback(alert)
            except Exception as e:
                print(f"[Alerting] Callback error: {e}")
    
    async def health_monitor_loop(self):
        """Background loop giám sát sức khỏe API"""
        while self.is_running:
            try:
                # Kiểm tra API health
                headers = {"Authorization": f"Bearer {self.api_key}"}
                
                async with aiohttp.ClientSession() as session:
                    start = time.time()
                    async with session.get(
                        "https://api.holysheep.ai/v1/health",
                        headers=headers,
                        timeout=aiohttp.ClientTimeout(total=5)
                    ) as response:
                        latency = (time.time() - start) * 1000
                        
                        if response.status == 200:
                            self.record_metric("api.health", 1, {"endpoint": "health"})
                        else:
                            self.record_metric("api.health", 0, {"endpoint": "health"})
                
                # Check for stale data (no requests for a while)
                if self.last_request_time > 0:
                    time_since_last = time.time() - self.last_request_time
                    if time_since_last > 300:  # 5 minutes
                        self.record_metric("api.stale", time_since_last)
                        
            except Exception as e:
                print(f"[Health Monitor] Error: {e}")
                self.record_metric("api.health", 0, {"endpoint": "health"})
            
            await asyncio.sleep(30)
    
    def get_stats(self) -> dict:
        """Lấy thống kê monitoring"""
        recent_metrics = [m for m in self.metrics if time.time() - m.timestamp < 300]
        
        latency_metrics = [m.value for m in recent_metrics if m.name == "api.latency"]
        error