Lần đầu tiên tôi tiếp cận việc thu thập dữ liệu options từ Deribit là khi một quỹ đầu cơ nhỏ thuê tôi xây dựng hệ thống historical data pipeline cho đội ngũ trading của họ. Tháng đầu tiên, mọi thứ có vẻ ổn định — script chạy đều đặn mỗi ngày, dữ liệu được lưu vào database. Nhưng rồi khoảng tuần thứ 5, tôi nhận ra một vấn đề nghiêm trọng: 30% các batch download đã fail thầm lặng, không có alert, không có retry, và đội ngũ quant chỉ phát hiện ra khi họ cần dữ liệu để backtest — lúc đó thì đã quá muộn.

Bài viết này là bài hướng dẫn thực chiến về cách tôi giải quyết bài toán đó bằng việc kết hợp Deribit API với HolySheep AI để tạo một hệ thống monitor thông minh, có khả năng tự phục hồi và gửi thông báo khi có sự cố.

Tại sao việc monitor Deribit data pipeline lại quan trọng

Deribit là sàn giao dịch options lớn nhất thế giới về khối lượng, đặc biệt phổ biến với các quỹ quantitative. Tuy nhiên, API của họ có đặc điểm:

Với một đội ngũ quant cần dữ liệu liên tục để chạy model, bất kỳ gap nào trong dữ liệu đều có thể dẫn đến:

Kiến trúc hệ thống

Hệ thống tôi xây dựng gồm 4 thành phần chính:

Kết nối Deribit API

Deribit cung cấp REST API với endpoint cho historical data. Bạn cần tạo API key tại Deribit.com (chỉ cần email, không cần KYC cho testnet).

Lấy danh sách Options Instruments

import requests
import time
from datetime import datetime, timedelta
from typing import List, Dict, Optional

class DeribitOptionsClient:
    """Client cho Deribit Options Historical Data API"""
    
    BASE_URL = "https://history.deribit.com/api/v2"
    # Testnet: "https://testnet.deribit.com/api/v2"
    
    def __init__(self, client_id: str, client_secret: str):
        self.client_id = client_id
        self.client_secret = client_secret
        self.access_token = None
        self._authenticate()
    
    def _authenticate(self) -> None:
        """Authenticate và lấy access token"""
        response = requests.post(
            f"{self.BASE_URL}/public/auth",
            json={
                "method": "client_credentials",
                "client_id": self.client_id,
                "client_secret": self.client_secret,
                "scope": "session:bookrunner"
            }
        )
        data = response.json()
        
        if data.get("success"):
            self.access_token = data["result"]["access_token"]
            print(f"[{datetime.now()}] ✓ Authenticated successfully")
        else:
            raise Exception(f"Authentication failed: {data}")
    
    def get_options_instruments(self, currency: str = "BTC") -> List[str]:
        """Lấy danh sách tất cả options instruments"""
        response = requests.get(
            f"{self.BASE_URL}/public/get_instruments",
            params={
                "currency": currency,
                "kind": "option",
                "expired": "false"
            }
        )
        data = response.json()
        
        if not data.get("success"):
            raise Exception(f"Failed to get instruments: {data}")
        
        instruments = [
            item["instrument_name"] 
            for item in data["result"]
        ]
        print(f"[{datetime.now()}] Found {len(instruments)} options instruments")
        return instruments
    
    def get_options_instrument_name(self, underlying: str, expiry_date: str, strike: float, option_type: str) -> str:
        """
        Tạo instrument name theo format Deribit
        Ví dụ: BTC-28MAR25-95000-C
        """
        return f"{underlying}-{expiry_date}-{int(strike)}-{option_type.upper()}"

Download Historical Options Data

import requests
import time
from datetime import datetime, timedelta
from typing import List, Dict, Optional, Tuple

class DeribitHistoricalDownloader:
    """Download historical options data với retry và error handling"""
    
    RATE_LIMIT = 20  # requests per second
    REQUEST_DELAY = 1 / RATE_LIMIT + 0.01  # Buffer 10ms
    
    def __init__(self, client: DeribitOptionsClient):
        self.client = client
        self.download_log = []
    
    def download_options_history(
        self,
        instrument_name: str,
        start_timestamp: int,
        end_timestamp: int,
        data_type: str = "trades"
    ) -> Tuple[bool, List[Dict], str]:
        """
        Download historical data cho một instrument
        
        Args:
            instrument_name: Tên instrument (VD: BTC-28MAR25-95000-C)
            start_timestamp: Start time in milliseconds
            end_timestamp: End time in milliseconds
            data_type: 'trades', 'book', 'ticker'
        
        Returns:
            (success, data, error_message)
        """
        endpoint_map = {
            "trades": "get_trade_volumes",
            "book": "get_order_book",
            "ticker": "get_ticker"
        }
        
        endpoint = endpoint_map.get(data_type, "get_trade_volumes")
        url = f"{self.client.BASE_URL}/public/{endpoint}"
        
        params = {
            "instrument_name": instrument_name,
            "start_timestamp": start_timestamp,
            "end_timestamp": end_timestamp
        }
        
        log_entry = {
            "instrument": instrument_name,
            "start_time": start_timestamp,
            "end_time": end_timestamp,
            "timestamp": int(datetime.now().timestamp() * 1000),
            "success": False,
            "retry_count": 0,
            "error": None
        }
        
        try:
            response = requests.get(
                url,
                params=params,
                headers={"Authorization": f"Bearer {self.client.access_token}"},
                timeout=60
            )
            
            if response.status_code == 200:
                data = response.json()
                if data.get("success"):
                    log_entry["success"] = True
                    self.download_log.append(log_entry)
                    return True, data.get("result", {}).get("trades", []), ""
                else:
                    error_msg = data.get("error", {}).get("message", "Unknown error")
                    log_entry["error"] = error_msg
            else:
                error_msg = f"HTTP {response.status_code}: {response.text[:200]}"
                log_entry["error"] = error_msg
            
            self.download_log.append(log_entry)
            return False, [], log_entry["error"]
            
        except requests.exceptions.Timeout:
            error_msg = "Request timeout (>60s)"
            log_entry["error"] = error_msg
            self.download_log.append(log_entry)
            return False, [], error_msg
            
        except requests.exceptions.ConnectionError as e:
            error_msg = f"Connection error: {str(e)[:100]}"
            log_entry["error"] = error_msg
            self.download_log.append(log_entry)
            return False, [], error_msg
    
    def batch_download_with_retry(
        self,
        instruments: List[str],
        start_ts: int,
        end_ts: int,
        max_retries: int = 3,
        backoff_factor: float = 2.0
    ) -> Dict[str, Tuple[bool, str]]:
        """
        Batch download với exponential backoff retry
        
        Returns:
            Dict mapping instrument_name -> (success, error_message)
        """
        results = {}
        
        for i, instrument in enumerate(instruments):
            print(f"[{datetime.now()}] [{i+1}/{len(instruments)}] Downloading {instrument}")
            
            success, data, error = self.download_options_history(
                instrument, start_ts, end_ts
            )
            
            retry_count = 0
            while not success and retry_count < max_retries:
                retry_count += 1
                wait_time = backoff_factor ** retry_count
                print(f"    ↻ Retry {retry_count}/{max_retries} in {wait_time:.1f}s...")
                time.sleep(wait_time)
                
                success, data, error = self.download_options_history(
                    instrument, start_ts, end_ts
                )
            
            results[instrument] = (success, error)
            
            # Rate limiting
            if i < len(instruments) - 1:
                time.sleep(self.REQUEST_DELAY)
        
        return results
    
    def get_failed_downloads(self) -> List[Dict]:
        """Trả về danh sách các download đã thất bại"""
        return [log for log in self.download_log if not log["success"]]
    
    def get_success_rate(self) -> float:
        """Tính tỷ lệ thành công"""
        if not self.download_log:
            return 0.0
        success_count = sum(1 for log in self.download_log if log["success"])
        return success_count / len(self.download_log) * 100

Tích hợp HolySheep AI cho Monitor và Alert

Đây là phần quan trọng nhất — tôi sử dụng HolySheep AI để xây dựng một monitoring agent thông minh. HolySheep có độ trễ dưới <50ms và chi phí chỉ từ $0.42/MTok với DeepSeek V3.2, giúp tiết kiệm 85%+ so với OpenAI.

HolySheep Monitor Agent

import requests
import json
from datetime import datetime
from typing import List, Dict, Optional

class HolySheepMonitorAgent:
    """
    AI Monitor Agent dùng HolySheep API để phân tích 
    download logs và quyết định có cần alert không
    """
    
    HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
    
    def __init__(self, api_key: str):
        self.api_key = api_key
    
    def analyze_download_health(self, download_logs: List[Dict]) -> Dict:
        """
        Sử dụng AI để phân tích sức khỏe của data pipeline
        
        Returns:
            {
                "status": "healthy" | "warning" | "critical",
                "analysis": str,
                "recommendations": List[str],
                "should_alert": bool,
                "alert_priority": "low" | "medium" | "high" | "critical"
            }
        """
        
        # Tính toán metrics
        total = len(download_logs)
        success_count = sum(1 for log in download_logs if log.get("success"))
        fail_count = total - success_count
        success_rate = (success_count / total * 100) if total > 0 else 0
        
        # Phân tích lỗi
        error_types = {}
        for log in download_logs:
            if not log.get("success") and log.get("error"):
                error = log["error"]
                error_types[error] = error_types.get(error, 0) + 1
        
        # Top 3 lỗi phổ biến
        top_errors = sorted(error_types.items(), key=lambda x: x[1], reverse=True)[:3]
        
        # Gọi HolySheep API để phân tích
        prompt = f"""Bạn là một Data Pipeline Monitor Agent cho hệ thống thu thập dữ liệu options từ Deribit.

Tình trạng hiện tại:

- Tổng số requests: {total} - Thành công: {success_count} ({success_rate:.1f}%) - Thất bại: {fail_count} - Thời gian: {datetime.now().isoformat()}

Top lỗi:

{json.dumps(top_errors, indent=2)}

Chi tiết lỗi (5 mẫu đầu):

{json.dumps([l for l in download_logs if not l.get("success")][:5], indent=2)}

Nhiệm vụ:

Phân tích tình trạng này và trả về JSON: {{ "status": "healthy" | "warning" | "critical", "analysis": "Mô tả ngắn tình trạng", "recommendations": ["Khuyến nghị 1", "Khuyến nghị 2"], "should_alert": true/false, "alert_priority": "low" | "medium" | "high" | "critical", "alert_message": "Tin nhắn alert ngắn gọn cho đội ngũ quant" }} Chỉ trả về JSON, không có text khác.""" try: response = requests.post( f"{self.HOLYSHEEP_BASE_URL}/chat/completions", headers={ "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" }, json={ "model": "deepseek-v3.2", "messages": [ {"role": "system", "content": "Bạn là một AI monitor agent chuyên phân tích data pipeline health. Chỉ trả về JSON hợp lệ."}, {"role": "user", "content": prompt} ], "temperature": 0.3, "max_tokens": 500 }, timeout=30 ) if response.status_code == 200: result = response.json() content = result["choices"][0]["message"]["content"] # Parse JSON response try: analysis = json.loads(content) return analysis except json.JSONDecodeError: return { "status": "warning", "analysis": f"Không parse được response: {content[:100]}", "recommendations": ["Kiểm tra log thủ công"], "should_alert": True, "alert_priority": "medium" } else: return { "status": "error", "analysis": f"API Error: {response.status_code}", "recommendations": ["Kiểm tra HolySheep API key"], "should_alert": True, "alert_priority": "high" } except Exception as e: return { "status": "error", "analysis": f"Exception: {str(e)}", "recommendations": ["Kiểm tra network connection"], "should_alert": True, "alert_priority": "critical" } def send_alert(self, analysis: Dict, channels: List[str] = ["log"]) -> bool: """ Gửi alert qua các kênh channels: "log", "email", "slack", "webhook" """ if not analysis.get("should_alert"): print(f"[{datetime.now()}] No alert needed - Status: {analysis.get('status')}") return False alert_msg = f""" ⚠️ DERIBIT DATA PIPELINE ALERT ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Priority: {analysis.get('alert_priority', 'unknown').upper()} Status: {analysis.get('status', 'unknown')} Time: {datetime.now().isoformat()} Analysis: {analysis.get('analysis', 'N/A')} Recommendations: {chr(10).join(f"• {r}" for r in analysis.get('recommendations', []))} Alert Message: {analysis.get('alert_message', 'N/A')} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ """ # Log alert if "log" in channels: print(alert_msg) # TODO: Implement email, slack, webhook integrations # if "email" in channels: ... return True def generate_recovery_plan(self, failed_logs: List[Dict]) -> str: """ Sử dụng AI để tạo kế hoạch khôi phục cho các download thất bại """ if not failed_logs: return "Không có download thất bại cần khôi phục." failed_instruments = [log["instrument"] for log in failed_logs] prompt = f"""Tạo kế hoạch khôi phục cho {len(failed_logs)} download thất bại: Instruments cần retry: {json.dumps(failed_instruments, indent=2)} Thông tin chi tiết: {json.dumps(failed_logs, indent=2)} Viết kế hoạch khôi phục chi tiết bao gồm: 1. Thứ tự ưu tiên retry 2. Chiến lược backoff cụ thể 3. Alternative approach nếu Deribit API không khả dụng """ try: response = requests.post( f"{self.HOLYSHEEP_BASE_URL}/chat/completions", headers={ "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" }, json={ "model": "deepseek-v3.2", "messages": [ {"role": "system", "content": "Bạn là AI assistant chuyên tạo kế hoạch khôi phục data pipeline."}, {"role": "user", "content": prompt} ], "temperature": 0.5, "max_tokens": 800 }, timeout=30 ) if response.status_code == 200: result = response.json() return result["choices"][0]["message"]["content"] else: return f"Lỗi API: {response.status_code}" except Exception as e: return f"Exception: {str(e)}"

Hệ thống Failure Compensation

import time
import requests
from datetime import datetime, timedelta
from typing import Dict, List, Tuple, Optional
from collections import defaultdict

class DeribitCompensationEngine:
    """
    Failure Compensation Engine cho Deribit data pipeline
    - Tự động retry với smart backoff
    - Fallback sang alternative sources
    - Ghi nhận trend để predict failures
    """
    
    def __init__(
        self,
        client: DeribitOptionsClient,
        monitor: HolySheepMonitorAgent,
        max_retry_per_batch: int = 5
    ):
        self.client = client
        self.monitor = monitor
        self.max_retry_per_batch = max_retry_per_batch
        
        # Track failure patterns
        self.failure_history = []
        self.retry_success_rate = 0.0
        
        # Alternative sources (khi Deribit fail hoàn toàn)
        self.alternative_sources = {
            "coinglass": "https://open-api.coinglass.com/public/v2",
            "cryptodata": "https://api.cryptodata.com"
        }
    
    def smart_retry(
        self,
        instrument: str,
        start_ts: int,
        end_ts: int,
        failure_reason: str
    ) -> Tuple[bool, str, Dict]:
        """
        Smart retry với chiến lược thay đổi theo loại lỗi
        """
        strategy = self._determine_retry_strategy(failure_reason)
        
        for attempt in range(strategy["max_attempts"]):
            wait_time = strategy["base_delay"] * (strategy["multiplier"] ** attempt)
            print(f"    ↻ [{attempt+1}/{strategy['max_attempts']}] {instrument} "
                  f"- Wait {wait_time:.1f}s (strategy: {strategy['name']})")
            
            time.sleep(wait_time)
            
            success, data, error = self._try_download(
                instrument, start_ts, end_ts, strategy
            )
            
            if success:
                self._record_success(instrument, attempt + 1)
                return True, data, "Success after retry"
            
            # Log failure
            self.failure_history.append({
                "instrument": instrument,
                "attempt": attempt + 1,
                "error": error,
                "strategy": strategy["name"],
                "timestamp": datetime.now().isoformat()
            })
        
        return False, [], f"Failed after {strategy['max_attempts']} retries"
    
    def _determine_retry_strategy(self, failure_reason: str) -> Dict:
        """
        Xác định chiến lược retry dựa trên loại lỗi
        """
        if "timeout" in failure_reason.lower():
            return {
                "name": "timeout_recovery",
                "max_attempts": 3,
                "base_delay": 30,  # Bắt đầu với 30s
                "multiplier": 2.5,
                "use_compressed": True  # Thử query nhỏ hơn
            }
        elif "rate limit" in failure_reason.lower() or "429" in failure_reason:
            return {
                "name": "rate_limit_backoff",
                "max_attempts": 5,
                "base_delay": 60,  # Rate limit cần chờ lâu hơn
                "multiplier": 2.0,
                "use_compressed": False
            }
        elif "connection" in failure_reason.lower():
            return {
                "name": "connection_recovery",
                "max_attempts": 4,
                "base_delay": 10,
                "multiplier": 3.0,
                "use_compressed": False
            }
        else:
            return {
                "name": "default",
                "max_attempts": 3,
                "base_delay": 5,
                "multiplier": 2.0,
                "use_compressed": False
            }
    
    def _try_download(
        self,
        instrument: str,
        start_ts: int,
        end_ts: int,
        strategy: Dict
    ) -> Tuple[bool, List, str]:
        """
        Thực hiện download attempt với chiến lược cụ thể
        """
        try:
            if strategy.get("use_compressed"):
                # Chia nhỏ query thành các chunk
                chunk_size = (end_ts - start_ts) // 4
                all_data = []
                
                for i in range(4):
                    chunk_start = start_ts + (i * chunk_size)
                    chunk_end = chunk_start + chunk_size if i < 3 else end_ts
                    
                    success, data, error = self.client.download_options_history(
                        instrument, chunk_start, chunk_end
                    )
                    
                    if success:
                        all_data.extend(data)
                    else:
                        return False, [], error
                    
                    time.sleep(1)  # Rate limit
                
                return True, all_data, ""
            else:
                return self.client.download_options_history(
                    instrument, start_ts, end_ts
                )
                
        except Exception as e:
            return False, [], str(e)
    
    def _record_success(self, instrument: str, attempts: int) -> None:
        """Cập nhật success rate"""
        # Simple moving average
        if self.retry_success_rate == 0:
            self.retry_success_rate = 100 / attempts
        else:
            self.retry_success_rate = (self.retry_success_rate * 0.7) + (100 / attempts * 0.3)
    
    def get_fallback_data(
        self,
        instrument: str,
        start_ts: int,
        end_ts: int
    ) -> Tuple[bool, str, Dict]:
        """
        Fallback sang alternative sources khi Deribit không khả dụng
        """
        print(f"[{datetime.now()}] ⚠️ Deribit unavailable - Trying fallback sources...")
        
        # Priority: CoinGlass > CryptoData
        for source_name, base_url in self.alternative_sources.items():
            print(f"    → Trying {source_name}...")
            
            try:
                # Implement fallback logic tùy theo source
                # Đây là placeholder - cần implement theo API của từng source
                pass
                
            except Exception as e:
                print(f"    ✗ {source_name} failed: {e}")
                continue
        
        return False, [], "All sources unavailable"
    
    def analyze_failure_trends(self) -> Dict:
        """Phân tích trend của các lỗi để predict future issues"""
        if len(self.failure_history) < 10:
            return {"trend": "insufficient_data"}
        
        # Count errors by type
        error_counts = defaultdict(int)
        for failure in self.failure_history:
            error_counts[failure["error"]] += 1
        
        # Count errors by time of day
        hour_counts = defaultdict(int)
        for failure in self.failure_history:
            hour = datetime.fromisoformat(failure["timestamp"]).hour
            hour_counts[hour] += 1
        
        # Peak hours
        peak_hours = sorted(hour_counts.items(), key=lambda x: x[1], reverse=True)[:3]
        
        return {
            "total_failures": len(self.failure_history),
            "retry_success_rate": self.retry_success_rate,
            "top_errors": dict(sorted(error_counts.items(), key=lambda x: x[1], reverse=True)[:5]),
            "peak_failure_hours": peak_hours,
            "recommendation": self._generate_trend_recommendation(error_counts, peak_hours)
        }
    
    def _generate_trend_recommendation(
        self,
        error_counts: Dict,
        peak_hours: List
    ) -> str:
        """Tạo khuyến nghị dựa trên trend"""
        if not peak_hours:
            return "Tiếp tục monitor bình thường"
        
        peak_hours_str = ", ".join(f"{h}:00" for h, _ in peak_hours)
        
        if peak_hours[0][1] > len(self.failure_history) * 0.3:
            return (f"Cân nhắc giảm tần suất download vào khung giờ {peak_hours_str} "
                    f"do tỷ lệ lỗi cao ({peak_hours[0][1]/len(self.failure_history)*100:.0f}%)")
        
        return "Tình trạng ổn định, tiếp tục như hiện tại"

Workflow hoàn chỉnh

import schedule
import time
from datetime import datetime, timedelta

def run_daily_deribit_pipeline():
    """
    Daily pipeline workflow - chạy mỗi ngày lúc 00:05 UTC
    """
    print(f"\n{'='*60}")
    print(f"DERIBIT OPTIONS PIPELINE - {datetime.now()}")
    print(f"{'='*60}\n")
    
    # === 1. Setup ===
    HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"  # Thay bằng key thật
    
    deribit_client = DeribitOptionsClient(
        client_id="your_client_id",
        client_secret="your_client_secret"
    )
    
    downloader = DeribitHistoricalDownloader(deribit_client)
    monitor = HolySheepMonitorAgent(HOLYSHEEP_API_KEY)
    compensation = DeribitCompensationEngine(deribit_client, monitor)
    
    # === 2. Xác định thời gian download ===
    # Lấy data của ngày hôm trước
    end_time = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0)
    start_time = end_time - timedelta(days=1)
    
    start_ts = int(start_time.timestamp() * 1000)
    end_ts = int(end_time.timestamp() * 1000)
    
    print(f"📅 Downloading data from {start_time} to {end_time}")
    
    # === 3. Lấy danh sách instruments ===
    try:
        instruments = deribit_client.get_options_instruments("BTC")
        # Filter: chỉ lấy options có volume > 0 ngày hôm qua
        target_instruments = instruments[:50]  # Demo: limit 50
        print(f"🎯 Target: {len(target_instruments)} instruments\n")
    except Exception as e:
        print(f"✗ Failed to get instruments: {e}")
        return
    
    # === 4. Batch download với retry ===
    print("📥 Starting batch download...\n")
    results = downloader.batch_download_with_retry(
        instruments=target_instruments,
        start_ts=start_ts,
        end_ts=end_ts,
        max_retries=3
    )
    
    # === 5. Phân tích kết quả bằng HolySheep ===
    print("\n🤖 Running HolySheep AI analysis...\n")
    analysis = monitor.analyze_download_health(downloader.download_log)
    
    # In kết quả
    status_emoji = {
        "healthy": "✅",
        "warning": "⚠️",
        "critical": "🚨",
        "error": "❌"
    }.get(analysis.get("status"), "❓")
    
    print(f"{status_emoji} Pipeline Status: {analysis.get('status', 'unknown').upper()}")
    print(f"📊 Success Rate: {downloader.get_success_rate():.1f}%")
    print(f"\n📝 Analysis:\n{analysis.get('analysis', 'N/A')}")
    
    if analysis.get("recommendations"):
        print(f"\n💡 Recommendations:")
        for rec in analysis["recommendations"]:
            print(f"   • {rec}")
    
    # === 6. Xử lý failures ===
    failed_logs = downloader.get_failed_downloads()
    
    if failed_logs:
        print(f"\n🔧 Processing {len(failed_logs)} failed downloads...\n")
        
        for log in failed_logs:
            instrument = log["instrument"]
            print(f"   ↻ Retrying {instrument}...")
            
            success, data, msg = compensation.smart_retry(
                instrument,
                log["start_time"],
                log["end_time"],
                log["error"]
            )
            
            if success:
                print(f"      ✅ Success!")
            else:
                print(f"      ❌ Failed: {msg}")
        
        # Generate recovery plan
        print("\n📋 Generating recovery plan with HolySheep AI...\n")
        recovery_plan = monitor.generate_recovery_plan(failed_logs)
        print(recovery_plan)
    
    # === 7. Gửi alert nếu cần ===
    if analysis.get("should_alert"):
        monitor.send_alert(analysis, channels=["log", "email"])
        
        # In alert chi tiết
        print(f"\n{'!'*60}")
        print(f"🚨 ALERT: {analysis.get('alert_priority', 'unknown').upper()}")
        print(f"📧 Message: {analysis.get('alert_message', 'N/A')}")
        print(f"{'!'*60}\n")
    
    # === 8. Failure trend analysis ===
    if len(compensation.failure_history) >= 10:
        print("\n📈 Failure Trend Analysis:")
        trends = compensation.analyze_failure_trends()
        print(f"   Total Failures: {trends.get('total_failures', 0