File size: 7,596 Bytes
3dc2617
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import tensorflow as tf
import time
import logging
from prometheus_client import Gauge, push_to_gateway

logger = logging.getLogger("Orbix")

class TelemetryMonitor:
    """
    Monitorea m茅tricas en tiempo real de la predicci贸n y optimizaci贸n orbital.
    
    Esta clase proporciona funcionalidades para recopilar, actualizar y exportar
    m茅tricas relacionadas con la predicci贸n de trayectorias orbitales y la
    optimizaci贸n de rutas para sat茅lites.
    
    Attributes:
        metrics (dict): Diccionario de m茅tricas de TensorFlow para seguimiento interno.
        prometheus_metrics (dict): Diccionario de m茅tricas de Prometheus para exportaci贸n.
        last_update_time (float): Timestamp de la 煤ltima actualizaci贸n de m茅tricas.
    """
    
    def __init__(self):
        """
        Inicializa el monitor de telemetr铆a con m茅tricas espec铆ficas para navegaci贸n orbital.
        """
        # M茅tricas internas de TensorFlow
        self.metrics = {
            'position_error': tf.keras.metrics.MeanSquaredError(),
            'velocity_error': tf.keras.metrics.MeanAbsoluteError(),
            'collision_probability': tf.keras.metrics.Mean(),
            'prediction_latency': tf.keras.metrics.Mean(),
            'optimization_time': tf.keras.metrics.Mean(),
            'fuel_consumption_estimate': tf.keras.metrics.Mean(),
            'trajectory_deviation': tf.keras.metrics.MeanSquaredError(),
            'orbital_stability': tf.keras.metrics.Mean()
        }
        
        # M茅tricas de Prometheus para exportaci贸n
        self.prometheus_metrics = {
            'position_error': Gauge('orbix_position_error', 'Error cuadr谩tico medio en la posici贸n'),
            'velocity_error': Gauge('orbix_velocity_error', 'Error absoluto medio en la velocidad'),
            'collision_probability': Gauge('orbix_collision_probability', 'Probabilidad de colisi贸n'),
            'prediction_latency': Gauge('orbix_prediction_latency_ms', 'Latencia de predicci贸n en ms'),
            'optimization_time': Gauge('orbix_optimization_time_ms', 'Tiempo de optimizaci贸n en ms'),
            'fuel_consumption_estimate': Gauge('orbix_fuel_consumption', 'Estimaci贸n de consumo de combustible'),
            'trajectory_deviation': Gauge('orbix_trajectory_deviation', 'Desviaci贸n de la trayectoria 贸ptima'),
            'orbital_stability': Gauge('orbix_orbital_stability', '脥ndice de estabilidad orbital')
        }
        
        self.last_update_time = time.time()
    
    def update_metrics(self, predictions, ground_truth):
        """
        Actualiza las m茅tricas con nuevos datos de predicci贸n y valores reales.
        
        Args:
            predictions (tf.Tensor): Tensor con las predicciones del modelo.
            ground_truth (tf.Tensor): Tensor con los valores reales.
        """
        # Registrar el tiempo de inicio para medir la latencia
        start_time = time.time()
        
        # Actualizar m茅tricas de error de posici贸n y velocidad
        self.metrics['position_error'].update_state(predictions, ground_truth)
        self.metrics['velocity_error'].update_state(predictions, ground_truth)
        
        # Calcular y actualizar la latencia
        latency = (time.time() - start_time) * 1000  # Convertir a milisegundos
        self.metrics['prediction_latency'].update_state(latency)
        
        # Actualizar timestamp de 煤ltima actualizaci贸n
        self.last_update_time = time.time()
        
        logger.debug("M茅tricas actualizadas. Latencia: %.2f ms", latency)
    
    def update_collision_probability(self, probability):
        """
        Actualiza la m茅trica de probabilidad de colisi贸n.
        
        Args:
            probability (float): Valor de probabilidad entre 0 y 1.
        """
        self.metrics['collision_probability'].update_state(probability)
        logger.info("Probabilidad de colisi贸n actualizada: %.4f", probability)
    
    def update_optimization_metrics(self, optimization_time, fuel_consumption=None, 
                                   trajectory_deviation=None, orbital_stability=None):
        """
        Actualiza las m茅tricas relacionadas con la optimizaci贸n de rutas.
        
        Args:
            optimization_time (float): Tiempo de ejecuci贸n del algoritmo de optimizaci贸n en ms.
            fuel_consumption (float, optional): Estimaci贸n del consumo de combustible.
            trajectory_deviation (float, optional): Desviaci贸n de la trayectoria 贸ptima.
            orbital_stability (float, optional): 脥ndice de estabilidad orbital entre 0 y 1.
        """
        self.metrics['optimization_time'].update_state(optimization_time)
        
        if fuel_consumption is not None:
            self.metrics['fuel_consumption_estimate'].update_state(fuel_consumption)
        
        if trajectory_deviation is not None:
            self.metrics['trajectory_deviation'].update_state(trajectory_deviation)
        
        if orbital_stability is not None:
            self.metrics['orbital_stability'].update_state(orbital_stability)
        
        logger.debug("M茅tricas de optimizaci贸n actualizadas. Tiempo: %.2f ms", optimization_time)
    
    def _update_prometheus_metrics(self):
        """
        Actualiza las m茅tricas de Prometheus con los valores actuales de las m茅tricas de TensorFlow.
        """
        # Transferir valores de m茅tricas internas a Prometheus
        for name, metric in self.metrics.items():
            if name in self.prometheus_metrics:
                self.prometheus_metrics[name].set(metric.result().numpy())
        
        logger.debug("M茅tricas de Prometheus actualizadas.")
    
    def get_prometheus_metrics(self):
        """
        Obtiene los valores actuales de las m茅tricas para exportaci贸n a Prometheus.
        
        Returns:
            dict: Diccionario con los nombres de las m茅tricas y sus valores actuales.
        """
        return {name: metric.result().numpy() for name, metric in self.metrics.items()}
    
    def export_to_prometheus(self, push_gateway_url):
        """
        Exporta las m茅tricas actuales al Push Gateway de Prometheus.
        
        Args:
            push_gateway_url (str): URL del Push Gateway de Prometheus.
        """
        try:
            # Actualizar las m茅tricas de Prometheus
            self._update_prometheus_metrics()
            
            # Exportar a Prometheus
            push_to_gateway(
                push_gateway_url, 
                job='orbix_satellite_metrics', 
                registry=self.prometheus_metrics
            )
            
            logger.info("M茅tricas exportadas a Prometheus: %s", push_gateway_url)
        except Exception as e:
            logger.error("Error al exportar m茅tricas a Prometheus: %s", str(e))
    
    def reset_metrics(self):
        """
        Reinicia todas las m茅tricas a sus valores iniciales.
        """
        for metric in self.metrics.values():
            metric.reset_states()
        
        logger.info("M茅tricas reiniciadas.")
    
    def get_metrics_summary(self):
        """
        Genera un resumen de las m茅tricas actuales en formato legible.
        
        Returns:
            str: Resumen de las m茅tricas en formato de texto.
        """
        summary = "Resumen de m茅tricas de telemetr铆a:\n"
        for name, metric in self.metrics.items():
            summary += f"  - {name}: {metric.result().numpy():.6f}\n"
        summary += f"脷ltima actualizaci贸n: {self.last_update_time}\n"
        
        return summary