← Назад к вопросам
Как отслеживать работоспособность программы?
1.2 Junior🔥 91 комментариев
#Soft Skills
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как отслеживать работоспособность программы?
Отслеживание здоровья приложения — критическое умение для production. За 10+ лет я разработал комплексный подход.
1. Логирование как основа
Все начинается с хорошего логирования:
import logging
import json
from datetime import datetime
# Настройка логирования
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
# Пример использования
def process_order(order_id: int):
logger.info(f"Processing order {order_id}")
try:
# основной код
order = fetch_order(order_id)
validate_order(order)
save_order(order)
logger.info(f"Order {order_id} processed successfully")
except Exception as e:
logger.error(f"Failed to process order {order_id}", exc_info=True)
raise
2. Структурированное логирование
Лучше использовать JSON логи для удобного парсинга:
from pythonjsonlogger import jsonlogger
import logging
import sys
# JSON логирование
logHandler = logging.StreamHandler(sys.stdout)
formatter = jsonlogger.JsonFormatter()
logHandler.setFormatter(formatter)
logger = logging.getLogger()
logger.addHandler(logHandler)
logger.setLevel(logging.INFO)
# Использование
logger.info(
"Processing started",
extra={
"order_id": 12345,
"user_id": 999,
"timestamp": datetime.utcnow().isoformat(),
"status": "processing"
}
)
3. Система health checks
Программа должна иметь эндпоинты для проверки здоровья:
from fastapi import FastAPI
import asyncio
from datetime import datetime
app = FastAPI()
@app.get("/health")
async def simple_health():
return {
"status": "ok",
"timestamp": datetime.utcnow().isoformat()
}
@app.get("/health/deep")
async def deep_health():
checks = {
"database": await check_database_health(),
"cache": await check_cache_health(),
"external_api": await check_external_api(),
}
all_healthy = all(checks.values())
return {
"status": "healthy" if all_healthy else "degraded",
"checks": checks,
"timestamp": datetime.utcnow().isoformat()
}
4. Мониторинг использования ресурсов
import psutil
def monitor_resources():
# CPU
cpu_percent = psutil.cpu_percent(interval=1)
print(f"CPU: {cpu_percent}%")
# Память
memory = psutil.virtual_memory()
print(f"Memory: {memory.percent}% used")
# Диск
disk = psutil.disk_usage("/")
print(f"Disk: {disk.percent}% used")
5. Профилирование производительности
import time
from functools import wraps
def measure_time(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
elapsed = time.perf_counter() - start
logger.info(
f"Function {func.__name__} took {elapsed:.3f}s",
extra={"function": func.__name__, "duration_ms": elapsed * 1000}
)
return result
return wrapper
6. Отслеживание ошибок
def safe_function(data):
try:
result = risky_operation(data)
logger.info("Operation successful")
return result
except ValueError as e:
logger.warning(f"Validation error: {e}")
return None
except Exception as e:
logger.error(
f"Unexpected error",
exc_info=True,
extra={"error_type": type(e).__name__}
)
raise
7. Prometheus метрики
from prometheus_client import Counter, Histogram, Gauge
app_errors = Counter(
"app_errors_total",
"Total application errors",
["error_type"]
)
request_duration = Histogram(
"request_duration_seconds",
"Request duration"
)
active_connections = Gauge(
"active_connections",
"Active connections"
)
8. Алерты и уведомления
import smtplib
from email.mime.text import MIMEText
def send_alert(subject: str, message: str):
msg = MIMEText(message)
msg["Subject"] = subject
msg["From"] = "monitoring@example.com"
msg["To"] = "devops@example.com"
with smtplib.SMTP("localhost") as server:
server.send_message(msg)
if memory_usage > 90:
send_alert("Memory critical", f"Memory at {memory_usage}%")
9. Инструменты мониторинга
Системные утилиты:
- top — процессы в реальном времени
- htop — удобный top
- df -h — использование диска
- ps aux — список процессов
- netstat -an — сетевые подключения
10. Пример скрипта мониторинга
import psutil
import time
from datetime import datetime
import requests
def monitor_app():
while True:
timestamp = datetime.now().isoformat()
cpu = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory()
try:
resp = requests.get("http://localhost:8000/health", timeout=2)
health_status = "ok" if resp.status_code == 200 else "error"
except Exception:
health_status = "unreachable"
print(f"{timestamp} | CPU: {cpu:5.1f}% | MEM: {mem.percent:5.1f}% | Health: {health_status}")
if cpu > 80:
print(f" WARNING: High CPU usage: {cpu}%")
if mem.percent > 85:
print(f" WARNING: High memory usage: {mem.percent}%")
time.sleep(5)
Чек-лист отслеживания
- Логирование — все важные события логируются
- Структурированные логи — JSON формат
- Health checks — простой и глубокий endpoints
- Метрики — Prometheus для сбора данных
- Дашборды — Grafana для визуализации
- Алерты — автоматические уведомления
- Мониторинг ресурсов — CPU, память, диск
- Трассировка — отслеживание запросов
- Централизованное хранилище — ELK, Datadog
- Историчность — просмотр прошлых данных
Хорошее отслеживание — это разница между быстрым fixing инцидента и часами отладки.