project initialization
Some checks failed
System Monitoring / Health Checks (push) Has been cancelled
System Monitoring / Performance Monitoring (push) Has been cancelled
System Monitoring / Database Monitoring (push) Has been cancelled
System Monitoring / Cache Monitoring (push) Has been cancelled
System Monitoring / Log Monitoring (push) Has been cancelled
System Monitoring / Resource Monitoring (push) Has been cancelled
System Monitoring / Uptime Monitoring (push) Has been cancelled
System Monitoring / Backup Monitoring (push) Has been cancelled
System Monitoring / Security Monitoring (push) Has been cancelled
System Monitoring / Monitoring Dashboard (push) Has been cancelled
System Monitoring / Alerting (push) Has been cancelled
Security Scanning / Dependency Scanning (push) Has been cancelled
Security Scanning / Code Security Scanning (push) Has been cancelled
Security Scanning / Secrets Scanning (push) Has been cancelled
Security Scanning / Container Security Scanning (push) Has been cancelled
Security Scanning / Compliance Checking (push) Has been cancelled
Security Scanning / Security Dashboard (push) Has been cancelled
Security Scanning / Security Remediation (push) Has been cancelled

This commit is contained in:
2025-10-05 02:37:33 +08:00
parent 2cbb6d5fa1
commit b3fff546e9
226 changed files with 97805 additions and 35 deletions

View File

@@ -0,0 +1,132 @@
"""
Django management command to start metrics collection.
"""
import time
import signal
import sys
from django.core.management.base import BaseCommand
from django.conf import settings
from ..exporters import metrics_collector
from ..alerts import alert_manager
class Command(BaseCommand):
help = 'Start metrics collection and alert monitoring'
def add_arguments(self, parser):
parser.add_argument(
'--interval',
type=int,
default=30,
help='Metrics collection interval in seconds (default: 30)'
)
parser.add_argument(
'--alert-interval',
type=int,
default=60,
help='Alert checking interval in seconds (default: 60)'
)
parser.add_argument(
'--port',
type=int,
default=8001,
help='Metrics server port (default: 8001)'
)
parser.add_argument(
'--metrics-only',
action='store_true',
help='Only collect metrics, no alerts'
)
parser.add_argument(
'--alerts-only',
action='store_true',
help='Only check alerts, no metrics collection'
)
parser.add_argument(
'--quiet',
action='store_true',
help='Run quietly'
)
def handle(self, *args, **options):
self.interval = options['interval']
self.alert_interval = options['alert_interval']
self.port = options['port']
self.metrics_only = options['metrics_only']
self.alerts_only = options['alerts_only']
self.quiet = options['quiet']
# Set up signal handlers for graceful shutdown
signal.signal(signal.SIGINT, self.signal_handler)
signal.signal(signal.SIGTERM, self.signal_handler)
self.running = True
if not self.quiet:
self.stdout.write(
self.style.SUCCESS('Starting metrics collection and alert monitoring...')
)
self.stdout.write(f'Metrics interval: {self.interval} seconds')
self.stdout.write(f'Alert interval: {self.alert_interval} seconds')
try:
# Start metrics collection
if not self.alerts_only:
if not self.quiet:
self.stdout.write('Starting metrics collection...')
metrics_collector.start_collection(self.interval)
# Start alert monitoring
if not self.metrics_only:
if not self.quiet:
self.stdout.write('Starting alert monitoring...')
self.start_alert_monitoring()
# Keep the command running
if not self.quiet:
self.stdout.write('Monitoring started. Press Ctrl+C to stop.')
while self.running:
time.sleep(1)
except KeyboardInterrupt:
if not self.quiet:
self.stdout.write('\nReceived interrupt signal, stopping...')
finally:
self.shutdown()
def start_alert_monitoring(self):
"""Start alert monitoring in a separate thread."""
import threading
def alert_monitor():
while self.running:
try:
alert_manager.check_rules()
time.sleep(self.alert_interval)
except Exception as e:
if not self.quiet:
self.stdout.write(
self.style.ERROR(f'Error in alert monitoring: {e}')
)
time.sleep(self.alert_interval)
alert_thread = threading.Thread(target=alert_monitor, daemon=True)
alert_thread.start()
def signal_handler(self, signum, frame):
"""Handle shutdown signals."""
if not self.quiet:
self.stdout.write(f'\nReceived signal {signum}, shutting down...')
self.running = False
def shutdown(self):
"""Shutdown the monitoring system."""
if not self.quiet:
self.stdout.write('Shutting down metrics collection...')
metrics_collector.stop_collection()
if not self.quiet:
self.stdout.write(self.style.SUCCESS('Monitoring stopped.'))