1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| import json import time from datetime import datetime from typing import Dict, Any
class FunctionMonitor: def __init__(self): self.metrics = {} self.logs = [] self.alerts = [] def record_invocation(self, function_name, event, context, start_time, end_time, status, error=None): """记录函数调用指标""" duration = end_time - start_time metric_key = f"{function_name}:{datetime.now().strftime('%Y-%m-%d:%H')}" if metric_key not in self.metrics: self.metrics[metric_key] = { 'invocation_count': 0, 'error_count': 0, 'total_duration': 0, 'max_duration': 0, 'min_duration': float('inf') } metrics = self.metrics[metric_key] metrics['invocation_count'] += 1 metrics['total_duration'] += duration metrics['max_duration'] = max(metrics['max_duration'], duration) metrics['min_duration'] = min(metrics['min_duration'], duration) if status == 'error': metrics['error_count'] += 1 log_entry = { 'timestamp': datetime.now().isoformat(), 'function_name': function_name, 'request_id': context.request_id, 'duration': duration, 'status': status, 'memory_used': getattr(context, 'memory_limit_in_mb', 0), 'error': error } self.logs.append(log_entry) self.check_alerts(function_name, metrics, log_entry) def check_alerts(self, function_name, metrics, log_entry): """检查告警条件""" error_rate = metrics['error_count'] / metrics['invocation_count'] if error_rate > 0.05: self.create_alert( 'high_error_rate', f"Function {function_name} error rate: {error_rate:.2%}", 'warning' ) if log_entry['duration'] > 10: self.create_alert( 'long_execution_time', f"Function {function_name} execution time: {log_entry['duration']:.2f}s", 'warning' ) def create_alert(self, alert_type, message, severity): """创建告警""" alert = { 'timestamp': datetime.now().isoformat(), 'type': alert_type, 'message': message, 'severity': severity } self.alerts.append(alert) print(f"ALERT [{severity}]: {message}") def get_metrics_summary(self, function_name, time_range='1h'): """获取指标摘要""" relevant_metrics = [ metrics for key, metrics in self.metrics.items() if key.startswith(function_name) ] if not relevant_metrics: return None total_invocations = sum(m['invocation_count'] for m in relevant_metrics) total_errors = sum(m['error_count'] for m in relevant_metrics) avg_duration = sum(m['total_duration'] for m in relevant_metrics) / total_invocations return { 'function_name': function_name, 'time_range': time_range, 'total_invocations': total_invocations, 'error_rate': total_errors / total_invocations if total_invocations > 0 else 0, 'avg_duration': avg_duration, 'max_duration': max(m['max_duration'] for m in relevant_metrics), 'min_duration': min(m['min_duration'] for m in relevant_metrics) }
def monitor_function(monitor: FunctionMonitor): """函数监控装饰器""" def decorator(func): def wrapper(event, context): start_time = time.time() status = 'success' error = None try: result = func(event, context) return result except Exception as e: status = 'error' error = str(e) raise finally: end_time = time.time() monitor.record_invocation( func.__name__, event, context, start_time, end_time, status, error ) return wrapper return decorator
|