"""
Main entry point for network performance exporter.
"""
import asyncio
import os
import signal
import sys
from typing import Optional
from prometheus_client import start_http_server
from logger.setup_logger import setup_logger
from network_performance_exporter.config import get_config
from network_performance_exporter.collector import NetworkPerformanceCollector
from network_performance_exporter.exporters.prometheus_exporter import PrometheusExporter
from network_performance_exporter.exporters.nats_exporter import NatsExporter
module_name = os.getenv("MODULE_NAME", "network_performance_exporter")
logger = setup_logger()
class NetworkPerformanceExporter:
"""Main exporter application."""
def __init__(self):
self.config = get_config()
self.prometheus_exporter: Optional[PrometheusExporter] = None
self.nats_exporter: Optional[NatsExporter] = None
self.collector: Optional[NetworkPerformanceCollector] = None
async def initialize(self):
"""Initialize the exporter."""
logger.info("Initializing network performance exporter...")
logger.info("Configuration: listen_address=%s:%d, collect_interval=%ds, node_name=%s",
self.config.prometheus_host,
self.config.prometheus_port,
self.config.collect_interval,
self.config.node_name)
self.prometheus_exporter = PrometheusExporter()
logger.info("Prometheus exporter initialized")
self.nats_exporter = NatsExporter()
logger.info("NATS exporter initialized")
await self.nats_exporter.connect()
self.collector = NetworkPerformanceCollector(
self.config,
self.prometheus_exporter,
self.nats_exporter,
update_interval=self.config.collect_interval
)
logger.info("Network performance collector initialized")
def start(self):
"""Start the exporter."""
logger.info("Starting network performance exporter...")
start_http_server(
self.config.prometheus_port,
addr=self.config.prometheus_host,
registry=self.prometheus_exporter.get_registry()
)
logger.info("Prometheus HTTP server started on %s:%d",
self.config.prometheus_host, self.config.prometheus_port)
self.collector.bootstrap()
logger.info("Collector bootstrap completed")
self.collector.start()
logger.info("All collectors started with interval %d seconds", self.config.collect_interval)
logger.info("Network performance exporter started successfully")
async def stop(self):
"""Stop the exporter."""
logger.info("Stopping network performance exporter...")
self.collector.stop()
logger.info("All collectors stopped")
await self.nats_exporter.disconnect()
logger.info("NATS exporter disconnected")
logger.info("Network performance exporter stopped")
async def run(self):
"""Run the exporter."""
try:
await self.initialize()
self.start()
stop_event = asyncio.Event()
loop = asyncio.get_running_loop()
def signal_handler():
logger.info("Received signal, stopping...")
stop_event.set()
loop.add_signal_handler(signal.SIGINT, signal_handler)
loop.add_signal_handler(signal.SIGTERM, signal_handler)
await self.collector.run_forever(stop_event)
except Exception as e:
logger.error("Fatal error in network performance exporter: %s", str(e))
raise
finally:
await self.stop()
def main():
"""Main entry point."""
logger.info("Network performance exporter starting...")
exporter = NetworkPerformanceExporter()
try:
asyncio.run(exporter.run())
except Exception as e:
logger.error("Network performance exporter failed to start: %s", str(e))
sys.exit(1)
if __name__ == "__main__":
main()