0rbix / src /telemetry_enhanced.py
nicolasleiva's picture
Initial commit: Add complete Orbix project
3dc2617
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