Skip to content

健康检查与监控

概述

生产环境的健康检查与监控是保障服务可用性的关键环节。本文介绍 Django 应用的健康检查端点、监控指标采集、日志聚合方案。

监控体系层次

1. 应用层:健康检查端点、业务指标
2. 系统层:CPU/内存/磁盘/网络
3. 中间件:MySQL/Redis 连接状态
4. 日志:集中式日志收集与分析

健康检查端点

可通过 Django 视图实现健康检查端点,用于负载均衡器或容器编排的探针配置:

python
# application/health/views.py
from django.http import JsonResponse
from django.db import connection

def health_check(request):
    """健康检查端点"""
    try:
        # 检查数据库连接
        with connection.cursor() as cursor:
            cursor.execute("SELECT 1")
        return JsonResponse({"status": "healthy", "database": "ok"})
    except Exception as e:
        return JsonResponse({"status": "unhealthy", "error": str(e)}, status=503)
bash
# 基础健康检查
GET /health/

# 响应示例
{
    "status": "healthy",
    "database": "ok"
}

Docker 健康检查

在 Dockerfile 中配置 HEALTHCHECK:

dockerfile
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
 CMD curl -f http://localhost:8000/health/ || exit 1

监控指标

应用指标

指标说明采集方式
请求总量API 调用次数Nginx access log / Django 中间件
响应时间P50/P95/P99 延迟Django 中间件 / APM
错误率5xx 响应占比Nginx error log / Django 日志
活跃连接数当前并发请求Gunicorn stats

系统指标

指标说明告警阈值
CPU 使用率进程 CPU 占用> 80%
内存使用率进程内存占用> 85%
磁盘使用率磁盘空间占用> 90%
网络流量入站/出站带宽根据带宽设定

中间件指标

指标说明告警阈值
MySQL 连接数活跃/空闲连接> max_connections * 0.8
MySQL 慢查询执行时间 > 1s 的查询> 10/min
Redis 内存使用Redis 内存占用> maxmemory * 0.8
Redis 连接数活跃客户端连接> maxclients * 0.8

日志聚合

应用日志格式

项目使用 Python logging 模块输出结构化日志:

2026-09-05 10:30:15 [INFO] django: Application startup complete
2026-09-05 10:30:16 [WARNING] middleware: Rate limit exceeded for 192.168.1.100
2026-09-05 10:30:17 [ERROR] services: Login failed for user admin

ELK 方案

Elasticsearch + Logstash + Kibana 集中日志收集:

yaml
# Filebeat 配置示例
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /data/apps/logs/*.log
    fields:
      app: djangoadmin
    multiline.pattern: '^\d{4}-\d{2}-\d{2}'
    multiline.negate: true
    multiline.match: after

output.elasticsearch:
  hosts: ["http://elasticsearch:9200"]
  index: "djangoadmin-%{+yyyy.MM.dd}"

Loki 方案

轻量级日志聚合(配合 Grafana):

yaml
# docker-compose.yml 添加 Loki 和 Grafana
services:
  loki:
    image: grafana/loki:latest
    ports:
      - "3100:8001"

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /data/apps/logs:/var/log/app
      - ./promtail-config.yml:/etc/promtail/config.yml

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"

Loki 优势

相比 ELK,Loki 更轻量——不索引日志内容,仅索引标签,存储成本低,适合中小规模部署。

告警配置

常用告警规则

yaml
# Prometheus AlertManager 规则示例
groups:
  - name: djangoadmin
    rules:
      - alert: HighErrorRate
        expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "错误率超过10%"

      - alert: HighResponseTime
        expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 2
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "P95响应时间超过2秒"

总结

健康检查与监控是生产环境的基础设施:通过健康检查端点实现负载均衡探针,通过系统/应用/中间件指标全面掌握服务状态,通过 ELK 或 Loki 实现日志集中分析。建议中小项目优先采用 Loki+Grafana 轻量方案,大型项目使用 ELK 全家桶。

小蚂蚁云团队 · 提供技术支持