| """ |
| π ARF Ultimate Investor Demo v3.8.0 - ENTERPRISE EDITION |
| With Audit Trail, Incident History, Memory Graph, and Enterprise Features |
| """ |
|
|
| import logging |
| import datetime |
| import random |
| import uuid |
| import json |
| import tempfile |
| from typing import Dict, List, Optional, Any, Tuple |
| from collections import deque |
| import gradio as gr |
| import plotly.graph_objects as go |
| import pandas as pd |
| import numpy as np |
| from plotly.subplots import make_subplots |
|
|
| |
| try: |
| from agentic_reliability_framework.arf_core.models.healing_intent import ( |
| HealingIntent, |
| create_scale_out_intent |
| ) |
| from agentic_reliability_framework.arf_core.engine.simple_mcp_client import OSSMCPClient |
| ARF_OSS_AVAILABLE = True |
| except ImportError: |
| ARF_OSS_AVAILABLE = False |
| |
| class HealingIntent: |
| def __init__(self, **kwargs): |
| self.intent_type = kwargs.get("intent_type", "scale_out") |
| self.parameters = kwargs.get("parameters", {}) |
| |
| def to_dict(self) -> Dict[str, Any]: |
| return { |
| "intent_type": self.intent_type, |
| "parameters": self.parameters, |
| "created_at": datetime.datetime.now().isoformat() |
| } |
| |
| def create_scale_out_intent(resource_type: str, scale_factor: float = 2.0) -> HealingIntent: |
| return HealingIntent( |
| intent_type="scale_out", |
| parameters={ |
| "resource_type": resource_type, |
| "scale_factor": scale_factor, |
| "action": "Increase capacity" |
| } |
| ) |
| |
| class OSSMCPClient: |
| def analyze_incident(self, metrics: Dict, pattern: str = "") -> Dict[str, Any]: |
| return { |
| "status": "analysis_complete", |
| "recommendations": [ |
| "Increase resource allocation", |
| "Implement monitoring", |
| "Add circuit breakers", |
| "Optimize configuration" |
| ], |
| "confidence": 0.92 |
| } |
|
|
| |
| logging.basicConfig(level=logging.INFO) |
| logger = logging.getLogger(__name__) |
|
|
| |
| |
| |
|
|
| INCIDENT_SCENARIOS = { |
| "Cache Miss Storm": { |
| "description": "Redis cluster experiencing 80% cache miss rate causing database overload", |
| "severity": "CRITICAL", |
| "metrics": { |
| "Cache Hit Rate": "18.5% (Critical)", |
| "Database Load": "92% (Overloaded)", |
| "Response Time": "1850ms (Slow)", |
| "Affected Users": "45,000", |
| "Eviction Rate": "125/sec" |
| }, |
| "impact": { |
| "Revenue Loss": "$8,500/hour", |
| "Page Load Time": "+300%", |
| "Users Impacted": "45,000", |
| "SLA Violation": "Yes", |
| "Customer Sat": "-40%" |
| }, |
| "oss_analysis": { |
| "status": "β
ARF OSS Analysis Complete", |
| "recommendations": [ |
| "Increase Redis cache memory allocation", |
| "Implement cache warming strategy", |
| "Optimize key patterns (TTL adjustments)", |
| "Add circuit breaker for database fallback", |
| "Deploy monitoring for cache hit rate trends" |
| ], |
| "estimated_time": "60+ minutes", |
| "engineers_needed": "2-3 SREs + 1 DBA", |
| "manual_effort": "High", |
| "total_cost": "$8,500", |
| "healing_intent": "scale_out_cache" |
| }, |
| "enterprise_results": { |
| "actions_completed": [ |
| "β
Auto-scaled Redis cluster: 4GB β 8GB", |
| "β
Deployed intelligent cache warming service", |
| "β
Optimized 12 key patterns with ML recommendations", |
| "β
Implemented circuit breaker with 95% success rate", |
| "β
Validated recovery with automated testing" |
| ], |
| "metrics_improvement": { |
| "Cache Hit Rate": "18.5% β 72%", |
| "Response Time": "1850ms β 450ms", |
| "Database Load": "92% β 45%", |
| "Throughput": "1250 β 2450 req/sec" |
| }, |
| "business_impact": { |
| "Recovery Time": "60 min β 12 min", |
| "Cost Saved": "$7,200", |
| "Users Impacted": "45,000 β 0", |
| "Revenue Protected": "$1,700", |
| "MTTR Improvement": "80% reduction" |
| } |
| } |
| }, |
| "Database Connection Pool Exhaustion": { |
| "description": "Database connection pool exhausted causing API timeouts and user failures", |
| "severity": "HIGH", |
| "metrics": { |
| "Active Connections": "98/100 (Critical)", |
| "API Latency": "2450ms", |
| "Error Rate": "15.2%", |
| "Queue Depth": "1250", |
| "Connection Wait": "45s" |
| }, |
| "impact": { |
| "Revenue Loss": "$4,200/hour", |
| "Affected Services": "API Gateway, User Service, Payment", |
| "SLA Violation": "Yes", |
| "Partner Impact": "3 external APIs" |
| } |
| }, |
| "Memory Leak in Production": { |
| "description": "Java service memory leak causing gradual performance degradation", |
| "severity": "HIGH", |
| "metrics": { |
| "Memory Usage": "96% (Critical)", |
| "GC Pause Time": "4500ms", |
| "Error Rate": "28.5%", |
| "Restart Frequency": "12/hour", |
| "Heap Fragmentation": "42%" |
| }, |
| "impact": { |
| "Revenue Loss": "$5,500/hour", |
| "Session Loss": "8,500 users", |
| "Customer Impact": "High", |
| "Support Tickets": "+300%" |
| } |
| }, |
| "API Rate Limit Exceeded": { |
| "description": "Global API rate limit exceeded causing 429 errors for external clients", |
| "severity": "MEDIUM", |
| "metrics": { |
| "429 Error Rate": "42.5%", |
| "Successful Requests": "58.3%", |
| "API Latency": "120ms", |
| "Queue Depth": "1250", |
| "Client Satisfaction": "65/100" |
| }, |
| "impact": { |
| "Revenue Loss": "$1,800/hour", |
| "Affected Partners": "8", |
| "Partner SLA Violations": "3", |
| "Business Impact": "Medium" |
| } |
| }, |
| "Microservice Cascading Failure": { |
| "description": "Order service failure causing cascading failures in dependent services", |
| "severity": "CRITICAL", |
| "metrics": { |
| "Order Failure Rate": "68.2%", |
| "Circuit Breakers Open": "4", |
| "Retry Storm Intensity": "425", |
| "Error Propagation": "85%", |
| "System Stability": "15/100" |
| }, |
| "impact": { |
| "Revenue Loss": "$25,000/hour", |
| "Abandoned Carts": "12,500", |
| "Affected Users": "75,000", |
| "Brand Damage": "High" |
| } |
| } |
| } |
|
|
| |
| |
| |
|
|
| class AuditTrailManager: |
| """Manage audit trail and execution history""" |
| |
| def __init__(self) -> None: |
| self.execution_history = deque(maxlen=50) |
| self.incident_history = deque(maxlen=100) |
| self._initialize_sample_data() |
| |
| def _initialize_sample_data(self) -> None: |
| """Initialize with sample historical data""" |
| base_time = datetime.datetime.now() - datetime.timedelta(hours=2) |
| |
| |
| sample_executions = [ |
| self._create_execution_entry( |
| base_time - datetime.timedelta(minutes=90), |
| "Cache Miss Storm", 4, 7200, "β
Executed", "Auto-scaled cache" |
| ), |
| self._create_execution_entry( |
| base_time - datetime.timedelta(minutes=75), |
| "Memory Leak", 3, 5200, "β
Executed", "Fixed memory leak" |
| ), |
| self._create_execution_entry( |
| base_time - datetime.timedelta(minutes=60), |
| "API Rate Limit", 4, 2800, "β
Executed", "Increased rate limits" |
| ), |
| self._create_execution_entry( |
| base_time - datetime.timedelta(minutes=45), |
| "DB Connection Pool", 4, 3800, "β
Executed", "Scaled connection pool" |
| ), |
| self._create_execution_entry( |
| base_time - datetime.timedelta(minutes=30), |
| "Cascading Failure", 5, 12500, "β
Executed", "Isolated services" |
| ), |
| self._create_execution_entry( |
| base_time - datetime.timedelta(minutes=15), |
| "Cache Miss Storm", 4, 7200, "β
Executed", "Optimized cache" |
| ) |
| ] |
| |
| for execution in sample_executions: |
| self.execution_history.append(execution) |
| |
| |
| services = ["API Gateway", "Database", "Cache", "Auth Service", "Payment Service", |
| "Order Service", "User Service", "Session Service"] |
| |
| for _ in range(25): |
| incident_time = base_time - datetime.timedelta(minutes=random.randint(5, 120)) |
| self.incident_history.append({ |
| "timestamp": incident_time, |
| "time_str": incident_time.strftime("%H:%M"), |
| "service": random.choice(services), |
| "type": random.choice(list(INCIDENT_SCENARIOS.keys())), |
| "severity": random.randint(1, 3), |
| "description": f"{random.choice(['High latency', 'Connection failed', 'Memory spike', 'Timeout'])} on {random.choice(services)}", |
| "id": str(uuid.uuid4())[:8] |
| }) |
| |
| def _create_execution_entry(self, timestamp: datetime.datetime, scenario: str, |
| actions: int, savings: int, status: str, details: str) -> Dict[str, Any]: |
| """Create an execution history entry""" |
| return { |
| "timestamp": timestamp, |
| "time_str": timestamp.strftime("%H:%M"), |
| "scenario": scenario, |
| "actions": str(actions), |
| "savings": f"${savings:,}", |
| "status": status, |
| "details": details, |
| "id": str(uuid.uuid4())[:8] |
| } |
| |
| def add_execution(self, scenario: str, actions: List[str], |
| savings: int, approval_required: bool, details: str = "") -> Dict[str, Any]: |
| """Add new execution to history""" |
| entry = self._create_execution_entry( |
| datetime.datetime.now(), |
| scenario, |
| len(actions), |
| savings, |
| "β
Approved & Executed" if approval_required else "β
Auto-Executed", |
| details |
| ) |
| self.execution_history.appendleft(entry) |
| return entry |
| |
| def add_incident(self, scenario_name: str, metrics: Dict) -> Dict[str, Any]: |
| """Add incident to history""" |
| severity = 2 if "MEDIUM" in INCIDENT_SCENARIOS.get(scenario_name, {}).get("severity", "") else 3 |
| entry = { |
| "timestamp": datetime.datetime.now(), |
| "time_str": datetime.datetime.now().strftime("%H:%M"), |
| "service": "Demo System", |
| "type": scenario_name, |
| "severity": severity, |
| "description": f"Demo incident: {scenario_name}", |
| "id": str(uuid.uuid4())[:8] |
| } |
| self.incident_history.appendleft(entry) |
| return entry |
| |
| def get_execution_history_table(self, limit: int = 10) -> List[List[str]]: |
| """Get execution history for table display""" |
| return [ |
| [entry["time_str"], entry["scenario"], entry["actions"], |
| entry["status"], entry["savings"], entry["details"]] |
| for entry in list(self.execution_history)[:limit] |
| ] |
| |
| def get_incident_history_table(self, limit: int = 15) -> List[List[str]]: |
| """Get incident history for table display""" |
| return [ |
| [entry["time_str"], entry["service"], entry["type"], |
| f"{entry['severity']}/3", entry["description"]] |
| for entry in list(self.incident_history)[:limit] |
| ] |
| |
| def clear_history(self) -> Tuple[List[List[str]], List[List[str]]]: |
| """Clear all history""" |
| self.execution_history.clear() |
| self.incident_history.clear() |
| self._initialize_sample_data() |
| return self.get_execution_history_table(), self.get_incident_history_table() |
| |
| def export_audit_trail(self) -> str: |
| """Export audit trail as JSON""" |
| total_savings = 0 |
| for e in self.execution_history: |
| if "$" in e["savings"]: |
| try: |
| total_savings += int(e["savings"].replace("$", "").replace(",", "")) |
| except ValueError: |
| continue |
| |
| return json.dumps({ |
| "executions": list(self.execution_history), |
| "incidents": list(self.incident_history), |
| "exported_at": datetime.datetime.now().isoformat(), |
| "total_executions": len(self.execution_history), |
| "total_incidents": len(self.incident_history), |
| "total_savings": total_savings |
| }, indent=2, default=str) |
|
|
| |
| |
| |
|
|
| class EnhancedVisualizationEngine: |
| """Enhanced visualization engine with memory graph support""" |
| |
| @staticmethod |
| def create_incident_timeline() -> go.Figure: |
| """Create interactive incident timeline""" |
| fig = go.Figure() |
| |
| |
| now = datetime.datetime.now() |
| events = [ |
| {"time": now - datetime.timedelta(minutes=25), "event": "π Cache hit rate drops to 18.5%", "type": "problem"}, |
| {"time": now - datetime.timedelta(minutes=22), "event": "β οΈ Alert: Database load hits 92%", "type": "alert"}, |
| {"time": now - datetime.timedelta(minutes=20), "event": "π€ ARF detects pattern", "type": "detection"}, |
| {"time": now - datetime.timedelta(minutes=18), "event": "π§ Analysis: Cache Miss Storm identified", "type": "analysis"}, |
| {"time": now - datetime.timedelta(minutes=15), "event": "β‘ Healing actions executed", "type": "action"}, |
| {"time": now - datetime.timedelta(minutes=12), "event": "β
Cache hit rate recovers to 72%", "type": "recovery"}, |
| {"time": now - datetime.timedelta(minutes=10), "event": "π System stabilized", "type": "stable"} |
| ] |
| |
| color_map = { |
| "problem": "red", "alert": "orange", "detection": "blue", |
| "analysis": "purple", "action": "green", "recovery": "lightgreen", |
| "stable": "darkgreen" |
| } |
| |
| for event in events: |
| fig.add_trace(go.Scatter( |
| x=[event["time"]], |
| y=[1], |
| mode='markers+text', |
| marker=dict( |
| size=15, |
| color=color_map[event["type"]], |
| symbol='circle' if event["type"] in ['problem', 'alert'] else 'diamond', |
| line=dict(width=2, color='white') |
| ), |
| text=[event["event"]], |
| textposition="top center", |
| name=event["type"].capitalize(), |
| hovertemplate="<b>%{text}</b><br>%{x|%H:%M:%S}<extra></extra>" |
| )) |
| |
| fig.update_layout( |
| title="<b>Incident Timeline - Cache Miss Storm Resolution</b>", |
| xaxis_title="Time β", |
| yaxis_title="Event Type", |
| height=450, |
| showlegend=True, |
| paper_bgcolor='rgba(0,0,0,0)', |
| plot_bgcolor='rgba(0,0,0,0)', |
| hovermode='closest', |
| xaxis=dict( |
| tickformat='%H:%M', |
| gridcolor='rgba(200,200,200,0.2)' |
| ), |
| yaxis=dict( |
| showticklabels=False, |
| gridcolor='rgba(200,200,200,0.1)' |
| ) |
| ) |
| |
| return fig |
| |
| @staticmethod |
| def create_business_dashboard() -> go.Figure: |
| """Create executive business dashboard""" |
| fig = make_subplots( |
| rows=2, cols=2, |
| subplot_titles=('Annual Cost Impact', 'Team Capacity Shift', |
| 'MTTR Comparison', 'ROI Analysis'), |
| vertical_spacing=0.15, |
| horizontal_spacing=0.15 |
| ) |
| |
| |
| categories = ['Without ARF', 'With ARF Enterprise', 'Net Savings'] |
| values = [2960000, 1000000, 1960000] |
| |
| fig.add_trace( |
| go.Bar( |
| x=categories, |
| y=values, |
| marker_color=['#FF6B6B', '#4ECDC4', '#45B7D1'], |
| text=[f'${v/1000000:.1f}M' for v in values], |
| textposition='auto', |
| name='Cost Impact' |
| ), |
| row=1, col=1 |
| ) |
| |
| |
| labels = ['Firefighting', 'Innovation', 'Strategic Work'] |
| before = [60, 20, 20] |
| after = [10, 60, 30] |
| |
| fig.add_trace( |
| go.Bar( |
| x=labels, |
| y=before, |
| name='Before ARF', |
| marker_color='#FF6B6B' |
| ), |
| row=1, col=2 |
| ) |
| |
| fig.add_trace( |
| go.Bar( |
| x=labels, |
| y=after, |
| name='After ARF Enterprise', |
| marker_color='#4ECDC4' |
| ), |
| row=1, col=2 |
| ) |
| |
| |
| mttr_categories = ['Manual', 'Traditional', 'ARF OSS', 'ARF Enterprise'] |
| mttr_values = [120, 45, 25, 8] |
| |
| fig.add_trace( |
| go.Bar( |
| x=mttr_categories, |
| y=mttr_values, |
| marker_color=['#FF6B6B', '#FFE66D', '#45B7D1', '#4ECDC4'], |
| text=[f'{v} min' for v in mttr_values], |
| textposition='auto', |
| name='MTTR' |
| ), |
| row=2, col=1 |
| ) |
| |
| |
| fig.add_trace( |
| go.Indicator( |
| mode="gauge+number+delta", |
| value=5.2, |
| title={'text': "ROI Multiplier"}, |
| delta={'reference': 1.0, 'increasing': {'color': "green"}}, |
| gauge={ |
| 'axis': {'range': [0, 10], 'tickwidth': 1}, |
| 'bar': {'color': "#4ECDC4"}, |
| 'steps': [ |
| {'range': [0, 2], 'color': "lightgray"}, |
| {'range': [2, 4], 'color': "gray"}, |
| {'range': [4, 6], 'color': "lightgreen"}, |
| {'range': [6, 10], 'color': "green"} |
| ], |
| 'threshold': { |
| 'line': {'color': "red", 'width': 4}, |
| 'thickness': 0.75, |
| 'value': 5.2 |
| } |
| } |
| ), |
| row=2, col=2 |
| ) |
| |
| fig.update_layout( |
| height=700, |
| showlegend=True, |
| paper_bgcolor='rgba(0,0,0,0)', |
| plot_bgcolor='rgba(0,0,0,0)', |
| title_text="<b>Executive Business Dashboard</b>", |
| barmode='group' |
| ) |
| |
| return fig |
| |
| @staticmethod |
| def create_execution_history_chart(audit_manager: AuditTrailManager) -> go.Figure: |
| """Create execution history visualization""" |
| executions = list(audit_manager.execution_history)[:10] |
| |
| if not executions: |
| fig = go.Figure() |
| fig.update_layout( |
| title="No execution history yet", |
| height=400, |
| paper_bgcolor='rgba(0,0,0,0)', |
| plot_bgcolor='rgba(0,0,0,0)' |
| ) |
| return fig |
| |
| |
| scenarios = [e["scenario"] for e in executions] |
| savings = [] |
| for e in executions: |
| try: |
| savings.append(int(e["savings"].replace("$", "").replace(",", ""))) |
| except ValueError: |
| savings.append(0) |
| |
| fig = go.Figure(data=[ |
| go.Bar( |
| x=scenarios, |
| y=savings, |
| marker_color='#4ECDC4', |
| text=[f'${s:,.0f}' for s in savings], |
| textposition='outside', |
| name='Cost Saved', |
| hovertemplate="<b>%{x}</b><br>Savings: %{text}<extra></extra>" |
| ) |
| ]) |
| |
| fig.update_layout( |
| title="<b>Execution History - Cost Savings</b>", |
| xaxis_title="Scenario", |
| yaxis_title="Cost Saved ($)", |
| height=500, |
| paper_bgcolor='rgba(0,0,0,0)', |
| plot_bgcolor='rgba(0,0,0,0)', |
| showlegend=False |
| ) |
| |
| return fig |
| |
| @staticmethod |
| def create_memory_graph(audit_manager: AuditTrailManager, graph_type: str = "Force Directed", |
| show_weights: bool = True, auto_layout: bool = True) -> go.Figure: |
| """Create interactive memory graph visualization""" |
| fig = go.Figure() |
| |
| |
| incidents = list(audit_manager.incident_history)[:20] |
| |
| if not incidents: |
| |
| nodes = [ |
| {"id": "Incident_1", "label": "Cache Miss", "type": "incident", "size": 20}, |
| {"id": "Action_1", "label": "Scale Cache", "type": "action", "size": 15}, |
| {"id": "Outcome_1", "label": "Resolved", "type": "outcome", "size": 15}, |
| {"id": "Component_1", "label": "Redis", "type": "component", "size": 18}, |
| ] |
| |
| edges = [ |
| {"source": "Incident_1", "target": "Action_1", "weight": 0.9, "label": "resolved_by"}, |
| {"source": "Action_1", "target": "Outcome_1", "weight": 1.0, "label": "leads_to"}, |
| {"source": "Incident_1", "target": "Component_1", "weight": 0.8, "label": "affects"}, |
| ] |
| else: |
| |
| nodes = [] |
| edges = [] |
| |
| for i, incident in enumerate(incidents): |
| node_id = f"Incident_{i}" |
| nodes.append({ |
| "id": node_id, |
| "label": incident["type"][:20], |
| "type": "incident", |
| "size": 15 + (incident.get("severity", 2) * 5), |
| "severity": incident.get("severity", 2) |
| }) |
| |
| |
| if i > 0: |
| prev_id = f"Incident_{i-1}" |
| edges.append({ |
| "source": prev_id, |
| "target": node_id, |
| "weight": 0.7, |
| "label": "related_to" |
| }) |
| |
| |
| color_map = { |
| "incident": "#FF6B6B", |
| "action": "#4ECDC4", |
| "outcome": "#45B7D1", |
| "component": "#96CEB4" |
| } |
| |
| |
| node_x = [] |
| node_y = [] |
| node_text = [] |
| node_color = [] |
| node_size = [] |
| |
| for i, node in enumerate(nodes): |
| |
| angle = 2 * np.pi * i / len(nodes) |
| radius = 1.0 |
| |
| node_x.append(radius * np.cos(angle)) |
| node_y.append(radius * np.sin(angle)) |
| node_text.append(f"{node['label']}<br>Type: {node['type']}") |
| node_color.append(color_map.get(node["type"], "#999999")) |
| node_size.append(node.get("size", 15)) |
| |
| fig.add_trace(go.Scatter( |
| x=node_x, |
| y=node_y, |
| mode='markers+text', |
| marker=dict( |
| size=node_size, |
| color=node_color, |
| line=dict(width=2, color='white') |
| ), |
| text=[node["label"] for node in nodes], |
| textposition="top center", |
| hovertext=node_text, |
| hoverinfo="text", |
| name="Nodes" |
| )) |
| |
| |
| for edge in edges: |
| try: |
| source_idx = next(i for i, n in enumerate(nodes) if n["id"] == edge["source"]) |
| target_idx = next(i for i, n in enumerate(nodes) if n["id"] == edge["target"]) |
| |
| fig.add_trace(go.Scatter( |
| x=[node_x[source_idx], node_x[target_idx], None], |
| y=[node_y[source_idx], node_y[target_idx], None], |
| mode='lines', |
| line=dict( |
| width=2 * edge.get("weight", 1.0), |
| color='rgba(100, 100, 100, 0.5)' |
| ), |
| hoverinfo='none', |
| showlegend=False |
| )) |
| except StopIteration: |
| continue |
| |
| fig.update_layout( |
| title="<b>Incident Memory Graph</b>", |
| showlegend=True, |
| height=600, |
| paper_bgcolor='rgba(0,0,0,0)', |
| plot_bgcolor='rgba(0,0,0,0)', |
| hovermode='closest', |
| xaxis=dict(showgrid=False, zeroline=False, showticklabels=False), |
| yaxis=dict(showgrid=False, zeroline=False, showticklabels=False), |
| margin=dict(l=20, r=20, t=40, b=20) |
| ) |
| |
| return fig |
| |
| @staticmethod |
| def create_pattern_analysis_chart(analysis_data: Dict[str, Any]) -> go.Figure: |
| """Create pattern analysis visualization""" |
| fig = make_subplots( |
| rows=2, cols=2, |
| subplot_titles=('Incident Frequency', 'Resolution Times', |
| 'Success Rates', 'Pattern Correlation'), |
| vertical_spacing=0.15 |
| ) |
| |
| |
| patterns = ['Cache Issues', 'DB Connections', 'Memory Leaks', 'API Limits', 'Cascading'] |
| frequencies = [12, 8, 5, 7, 3] |
| resolution_times = [8.2, 15.5, 45.2, 5.1, 32.8] |
| success_rates = [92, 85, 78, 96, 65] |
| |
| |
| fig.add_trace( |
| go.Bar(x=patterns, y=frequencies, name='Frequency'), |
| row=1, col=1 |
| ) |
| |
| |
| fig.add_trace( |
| go.Bar(x=patterns, y=resolution_times, name='Resolution Time (min)'), |
| row=1, col=2 |
| ) |
| |
| |
| fig.add_trace( |
| go.Bar(x=patterns, y=success_rates, name='Success Rate %'), |
| row=2, col=1 |
| ) |
| |
| |
| corr_matrix = np.array([ |
| [1.0, 0.3, 0.1, 0.2, 0.05], |
| [0.3, 1.0, 0.4, 0.1, 0.25], |
| [0.1, 0.4, 1.0, 0.05, 0.6], |
| [0.2, 0.1, 0.05, 1.0, 0.1], |
| [0.05, 0.25, 0.6, 0.1, 1.0] |
| ]) |
| |
| fig.add_trace( |
| go.Heatmap(z=corr_matrix, x=patterns, y=patterns), |
| row=2, col=2 |
| ) |
| |
| fig.update_layout( |
| height=700, |
| showlegend=False, |
| title_text="<b>Pattern Analysis Dashboard</b>" |
| ) |
| |
| return fig |
|
|
| |
| |
| |
|
|
| class EnhancedBusinessLogic: |
| """Enhanced business logic with enterprise features""" |
| |
| def __init__(self, audit_manager: AuditTrailManager): |
| self.audit_manager = audit_manager |
| self.viz_engine = EnhancedVisualizationEngine() |
| self.license_info = { |
| "valid": True, |
| "customer_name": "Demo Enterprise Corp", |
| "customer_email": "demo@enterprise.com", |
| "tier": "ENTERPRISE", |
| "expires_at": "2024-12-31T23:59:59", |
| "features": ["autonomous_healing", "compliance", "audit_trail", "multi_cloud"], |
| "max_services": 100, |
| "max_incidents_per_month": 1000, |
| "status": "β
Active" |
| } |
| self.mcp_mode = "approval" |
| self.learning_stats = { |
| "total_incidents": 127, |
| "resolved_automatically": 89, |
| "average_resolution_time": "8.2 min", |
| "success_rate": "92.1%", |
| "patterns_detected": 24, |
| "confidence_threshold": 0.85, |
| "memory_size": "4.7 MB", |
| "embeddings": 127, |
| "graph_nodes": 89, |
| "graph_edges": 245 |
| } |
| |
| def run_oss_analysis(self, scenario_name: str) -> Dict[str, Any]: |
| """Run OSS analysis""" |
| scenario = INCIDENT_SCENARIOS.get(scenario_name, {}) |
| analysis = scenario.get("oss_analysis", {}) |
| |
| if not analysis: |
| analysis = { |
| "status": "β
Analysis Complete", |
| "recommendations": [ |
| "Increase resource allocation", |
| "Implement monitoring", |
| "Add circuit breakers", |
| "Optimize configuration" |
| ], |
| "estimated_time": "45-60 minutes", |
| "engineers_needed": "2-3", |
| "manual_effort": "Required", |
| "total_cost": "$3,000 - $8,000" |
| } |
| |
| |
| analysis["arf_context"] = { |
| "oss_available": ARF_OSS_AVAILABLE, |
| "version": "3.3.6", |
| "mode": "advisory_only", |
| "healing_intent": True |
| } |
| |
| |
| self.audit_manager.add_incident(scenario_name, scenario.get("metrics", {})) |
| |
| return analysis |
| |
| def execute_enterprise_healing(self, scenario_name: str, approval_required: bool) -> Tuple[Any, ...]: |
| """Execute enterprise healing""" |
| scenario = INCIDENT_SCENARIOS.get(scenario_name, {}) |
| results = scenario.get("enterprise_results", {}) |
| |
| |
| if not results: |
| results = { |
| "actions_completed": [ |
| "β
Auto-scaled resources based on ARF healing intent", |
| "β
Implemented optimization recommendations", |
| "β
Deployed monitoring and alerting", |
| "β
Validated recovery with automated testing" |
| ], |
| "metrics_improvement": { |
| "Performance": "Dramatically improved", |
| "Stability": "Restored", |
| "Recovery": "Complete" |
| }, |
| "business_impact": { |
| "Recovery Time": f"60 min β {random.randint(5, 15)} min", |
| "Cost Saved": f"${random.randint(2000, 10000):,}", |
| "Users Impacted": "45,000 β 0", |
| "Revenue Protected": f"${random.randint(1000, 5000):,}" |
| } |
| } |
| |
| |
| savings = 0 |
| if "Cost Saved" in results["business_impact"]: |
| try: |
| savings_str = results["business_impact"]["Cost Saved"] |
| savings = int(''.join(filter(str.isdigit, savings_str))) |
| except (ValueError, TypeError): |
| savings = random.randint(2000, 10000) |
| |
| |
| if approval_required: |
| results["status"] = "β
Approved and Executed" |
| approval_html = self._create_approval_html(scenario_name, True) |
| else: |
| results["status"] = "β
Auto-Executed" |
| approval_html = self._create_approval_html(scenario_name, False) |
| |
| |
| details = f"{len(results['actions_completed'])} actions executed" |
| self.audit_manager.add_execution( |
| scenario_name, |
| results["actions_completed"], |
| savings, |
| approval_required, |
| details |
| ) |
| |
| |
| results["enterprise_context"] = { |
| "approval_required": approval_required, |
| "compliance_mode": "strict", |
| "audit_trail": "created", |
| "learning_applied": True, |
| "roi_measured": True |
| } |
| |
| |
| execution_chart = self.viz_engine.create_execution_history_chart(self.audit_manager) |
| |
| return ( |
| approval_html, |
| {"approval_required": approval_required, "compliance_mode": "strict"}, |
| results, |
| execution_chart, |
| self.audit_manager.get_execution_history_table(), |
| self.audit_manager.get_incident_history_table() |
| ) |
| |
| def _create_approval_html(self, scenario_name: str, approval_required: bool) -> str: |
| |