强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

系统监控工具指南 / 第12章:监控最佳实践

第12章:监控最佳实践

12.1 监控策略概述

12.1.1 监控的目标

目标 说明
可用性 确保服务正常运行
性能 保证响应时间和吞吐量
容量 合理规划资源使用
成本 优化资源成本

12.1.2 监控的层次

┌─────────────────────────────────────────────────────────────┐
│                    业务层监控 (Business)                      │
│   订单量、用户数、转化率、收入                                │
├─────────────────────────────────────────────────────────────┤
│                    应用层监控 (Application)                   │
│   响应时间、错误率、QPS、并发数                               │
├─────────────────────────────────────────────────────────────┤
│                    系统层监控 (System)                        │
│   CPU、内存、磁盘、网络                                       │
├─────────────────────────────────────────────────────────────┤
│                    基础设施层监控 (Infrastructure)             │
│   服务器、网络设备、存储设备                                   │
└─────────────────────────────────────────────────────────────┘

12.1.3 监控方法论

Google SRE四个黄金信号

信号 说明 示例
Latency 延迟 请求响应时间
Traffic 流量 每秒请求数
Errors 错误 错误率
Saturation 饱和度 资源使用率

USE方法(Brendan Gregg)

资源 Utilization Saturation Errors
CPU CPU使用率 运行队列长度 中断错误
内存 内存使用率 Swap使用 内存错误
磁盘 磁盘使用率 IO队列长度 IO错误
网络 带宽使用率 网络队列 网络错误

RED方法(Tom Wilkie)

指标 说明 适用场景
Rate 请求速率 微服务
Errors 错误率 微服务
Duration 请求延迟 微服务

12.2 监控指标体系

12.2.1 系统层指标

CPU指标

指标 计算方式 警告阈值 严重阈值
CPU使用率 1 - idle >70% >90%
用户空间CPU us >60% >80%
系统空间CPU sy >30% >50%
IO等待 wa >20% >50%
运行队列长度 load average >CPU核心数 >2*CPU核心数

内存指标

指标 计算方式 警告阈值 严重阈值
内存使用率 used/total >70% >90%
Swap使用率 used/total >20% >50%
页面换入 si >0 >100/s
页面换出 so >0 >100/s

磁盘指标

指标 计算方式 警告阈值 严重阈值
磁盘使用率 used/total >70% >90%
IO使用率 %util >70% >90%
IO等待时间 await >10ms >50ms
IO队列长度 avgqu-sz >1 >5

网络指标

指标 计算方式 警告阈值 严重阈值
带宽使用率 traffic/bandwidth >70% >90%
网络错误 errors >0 >10/s
丢包率 dropped/total >0.1% >1%
TCP连接数 established >5000 >10000

12.2.2 应用层指标

Web服务指标

指标 说明 警告阈值 严重阈值
QPS 每秒请求数 根据基线 根据基线
响应时间P99 99分位延迟 >500ms >2s
错误率 5xx比例 >1% >5%
并发数 活跃连接 >500 >1000

数据库指标

指标 说明 警告阈值 严重阈值
查询延迟 平均查询时间 >100ms >500ms
慢查询数 每秒慢查询 >10 >50
连接数 活跃连接 >80%最大 >95%最大
缓存命中率 缓存效率 <80% <50%

12.2.3 业务层指标

指标 说明 监控方式
订单量 每分钟/小时订单数 业务系统
用户活跃度 DAU/MAU 业务系统
转化率 转化漏斗 业务系统
收入 交易金额 业务系统

12.3 告警设计

12.3.1 告警原则

好的告警

  • 可操作:收到告警后能立即采取行动
  • 及时:在问题影响用户前发现
  • 准确:减少误报和漏报
  • 分级:根据严重程度分级

避免的告警

  • 无法操作的告警
  • 频繁的误报
  • 过于敏感的告警
  • 缺少上下文的告警

12.3.2 告警分级

级别 含义 响应时间 通知方式
P0 - Critical 服务不可用 5分钟 电话 + 短信 + 邮件
P1 - High 服务降级 15分钟 短信 + 邮件
P2 - Medium 潜在问题 1小时 邮件 + 即时通讯
P3 - Low 需要关注 下个工作日 邮件

12.3.3 告警规则示例

系统告警

# Prometheus告警规则
groups:
  - name: system_alerts
    rules:
      # CPU告警
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU使用率过高"
          description: "实例 {{ $labels.instance }} CPU使用率超过80%,当前值 {{ $value }}%"

      # 内存告警
      - alert: HighMemoryUsage
        expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "内存使用率过高"
          description: "实例 {{ $labels.instance }} 内存使用率超过85%,当前值 {{ $value }}%"

      # 磁盘告警
      - alert: HighDiskUsage
        expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "磁盘使用率过高"
          description: "实例 {{ $labels.instance }} 磁盘使用率超过85%,当前值 {{ $value }}%"

      # 负载告警
      - alert: HighLoadAverage
        expr: node_load1 > count by(instance) (node_cpu_seconds_total{mode="idle"}) * 2
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "系统负载过高"
          description: "实例 {{ $labels.instance }} 负载超过CPU核心数的2倍"

应用告警

groups:
  - name: application_alerts
    rules:
      # 响应时间告警
      - alert: HighResponseTime
        expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 1
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "响应时间过长"
          description: "P99响应时间超过1秒"

      # 错误率告警
      - alert: HighErrorRate
        expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "错误率过高"
          description: "5xx错误率超过5%"

12.3.4 告警抑制和静默

告警抑制

# Alertmanager配置
inhibit_rules:
  # 如果有Critical告警,抑制同实例的Warning告警
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['instance']

告警静默

# 维护期间静默告警
# 通过Alertmanager Web UI设置静默

# 或通过API
curl -X POST http://alertmanager:9093/api/v2/silences -d '{
  "matchers": [{"name": "instance", "value": "server1"}],
  "startsAt": "2026-05-10T22:00:00Z",
  "endsAt": "2026-05-11T06:00:00Z",
  "createdBy": "admin",
  "comment": "计划维护"
}'

12.4 监控系统架构

12.4.1 小型团队方案

架构

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   Server    │───>│   Glances   │───>│   Web UI    │
│   Agent     │    │   Server    │    │   Browser   │
└─────────────┘    └─────────────┘    └─────────────┘

工具选择

  • 系统监控:Glances
  • 网络监控:iftop + vnstat
  • 日志管理:journalctl + logrotate

部署示例

# 安装Glances
pip install 'glances[web]'

# 启动Web模式
glances -w --bind 0.0.0.0 -p 61208

# 访问
# http://server_ip:61208

12.4.2 中型团队方案

架构

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   Server 1  │───>│             │    │             │
├─────────────┤    │ Prometheus  │───>│   Grafana   │
│   Server 2  │───>│             │    │             │
├─────────────┤    └─────────────┘    └─────────────┘
│   Server 3  │───>        │
└─────────────┘    ┌───────┴───────┐
                   │ Alertmanager  │
                   └───────────────┘

工具选择

  • 指标收集:Prometheus + Node Exporter
  • 可视化:Grafana
  • 告警:Alertmanager
  • 日志:Loki

部署示例

# docker-compose-monitoring.yml
version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana

  alertmanager:
    image: prom/alertmanager:latest
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml

  node-exporter:
    image: prom/node-exporter:latest
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--path.rootfs=/rootfs'

volumes:
  prometheus_data:
  grafana_data:

12.4.3 大型团队方案

架构

┌─────────────────────────────────────────────────────────────┐
│                      Kubernetes Cluster                      │
├─────────────┬─────────────┬─────────────┬──────────────────┤
│  App Pod 1  │  App Pod 2  │  App Pod 3  │   ...            │
└──────┬──────┴──────┬──────┴──────┬──────┴──────────────────┘
       │             │             │
       ▼             ▼             ▼
┌─────────────────────────────────────────────────────────────┐
│                 Prometheus + Thanos/Cortex                   │
│              (Long-term storage & Global view)               │
└─────────────────────────────────────────────────────────────┘
                              │
       ┌──────────────────────┼──────────────────────┐
       ▼                      ▼                      ▼
┌─────────────┐    ┌─────────────┐    ┌─────────────────────┐
│   Grafana   │    │Alertmanager │    │   Loki (Logs)       │
│ (Dashboard) │    │  (Alerts)   │    │   (Log aggregation) │
└─────────────┘    └─────────────┘    └─────────────────────┘

工具选择

  • 指标收集:Prometheus + Thanos/Cortex
  • 可视化:Grafana
  • 告警:Alertmanager + PagerDuty
  • 日志:Loki + Promtail
  • 追踪:Jaeger/Zipkin

12.5 监控脚本库

12.5.1 系统健康检查脚本

#!/bin/bash
# health_check.sh - 系统健康检查脚本

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo "=== 系统健康检查 ==="
echo "时间: $(date)"
echo "主机: $(hostname)"
echo ""

# CPU检查
echo "--- CPU ---"
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
CPU_INT=${CPU_USAGE%.*}
if [ $CPU_INT -gt 90 ]; then
    echo -e "${RED}CPU使用率: ${CPU_USAGE}% (严重)${NC}"
elif [ $CPU_INT -gt 70 ]; then
    echo -e "${YELLOW}CPU使用率: ${CPU_USAGE}% (警告)${NC}"
else
    echo -e "${GREEN}CPU使用率: ${CPU_USAGE}% (正常)${NC}"
fi

# 内存检查
echo "--- 内存 ---"
MEM_TOTAL=$(free -m | awk 'NR==2{print $2}')
MEM_USED=$(free -m | awk 'NR==2{print $3}')
MEM_PERCENT=$((MEM_USED * 100 / MEM_TOTAL))
if [ $MEM_PERCENT -gt 90 ]; then
    echo -e "${RED}内存使用率: ${MEM_PERCENT}% (严重)${NC}"
elif [ $MEM_PERCENT -gt 70 ]; then
    echo -e "${YELLOW}内存使用率: ${MEM_PERCENT}% (警告)${NC}"
else
    echo -e "${GREEN}内存使用率: ${MEM_PERCENT}% (正常)${NC}"
fi

# 磁盘检查
echo "--- 磁盘 ---"
df -h | awk 'NR>1 {
    gsub(/%/, "", $5)
    if ($5 > 90) printf "\033[0;31m%s: %s%% (严重)\033[0m\n", $6, $5
    else if ($5 > 70) printf "\033[1;33m%s: %s%% (警告)\033[0m\n", $6, $5
    else printf "\033[0;32m%s: %s%% (正常)\033[0m\n", $6, $5
}'

# 负载检查
echo "--- 负载 ---"
LOAD=$(cat /proc/loadavg | awk '{print $1}')
CORES=$(nproc)
LOAD_INT=${LOAD%.*}
if [ $LOAD_INT -gt $((CORES * 2)) ]; then
    echo -e "${RED}负载: ${LOAD} (严重,CPU核心数: ${CORES})${NC}"
elif [ $LOAD_INT -gt $CORES ]; then
    echo -e "${YELLOW}负载: ${LOAD} (警告,CPU核心数: ${CORES})${NC}"
else
    echo -e "${GREEN}负载: ${LOAD} (正常,CPU核心数: ${CORES})${NC}"
fi

# Swap检查
echo "--- Swap ---"
SWAP_TOTAL=$(free -m | awk 'NR==3{print $2}')
SWAP_USED=$(free -m | awk 'NR==3{print $3}')
if [ $SWAP_TOTAL -gt 0 ]; then
    SWAP_PERCENT=$((SWAP_USED * 100 / SWAP_TOTAL))
    if [ $SWAP_PERCENT -gt 50 ]; then
        echo -e "${RED}Swap使用率: ${SWAP_PERCENT}% (严重)${NC}"
    elif [ $SWAP_PERCENT -gt 20 ]; then
        echo -e "${YELLOW}Swap使用率: ${SWAP_PERCENT}% (警告)${NC}"
    else
        echo -e "${GREEN}Swap使用率: ${SWAP_PERCENT}% (正常)${NC}"
    fi
else
    echo -e "${GREEN}Swap: 未启用${NC}"
fi

echo ""
echo "=== 检查完成 ==="

12.5.2 性能数据采集脚本

#!/bin/bash
# perf_collect.sh - 性能数据采集脚本

LOG_DIR="/var/log/performance"
mkdir -p $LOG_DIR

INTERVAL=${1:-60}  # 默认60秒
DURATION=${2:-3600}  # 默认1小时

LOG_FILE="$LOG_DIR/perf_$(date +%Y%m%d_%H%M%S).csv"

echo "开始性能数据采集..."
echo "间隔: ${INTERVAL}秒"
echo "持续: ${DURATION}秒"
echo "输出: $LOG_FILE"

# CSV头
echo "timestamp,cpu_user,cpu_system,cpu_idle,mem_used,mem_free,swap_used,disk_read,disk_write,net_rx,net_tx" > $LOG_FILE

END_TIME=$(($(date +%s) + DURATION))

while [ $(date +%s) -lt $END_TIME ]; do
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    
    # CPU
    CPU=$(mpstat 1 1 | tail -1)
    CPU_USER=$(echo $CPU | awk '{print $3}')
    CPU_SYSTEM=$(echo $CPU | awk '{print $5}')
    CPU_IDLE=$(echo $CPU | awk '{print $12}')
    
    # 内存
    MEM=$(free -m | awk 'NR==2{print $3,$4}')
    MEM_USED=$(echo $MEM | awk '{print $1}')
    MEM_FREE=$(echo $MEM | awk '{print $2}')
    
    # Swap
    SWAP_USED=$(free -m | awk 'NR==3{print $3}')
    
    # 磁盘
    DISK=$(iostat -d sda 1 1 | tail -1)
    DISK_READ=$(echo $DISK | awk '{print $3}')
    DISK_WRITE=$(echo $DISK | awk '{print $4}')
    
    # 网络
    NET=$(sar -n DEV 1 1 | grep "eth0" | tail -1)
    NET_RX=$(echo $NET | awk '{print $5}')
    NET_TX=$(echo $NET | awk '{print $6}')
    
    echo "$TIMESTAMP,$CPU_USER,$CPU_SYSTEM,$CPU_IDLE,$MEM_USED,$MEM_FREE,$SWAP_USED,$DISK_READ,$DISK_WRITE,$NET_RX,$NET_TX" >> $LOG_FILE
    
    sleep $INTERVAL
done

echo "采集完成: $LOG_FILE"

12.5.3 告警通知脚本

#!/bin/bash
# alert_notify.sh - 告警通知脚本

# 配置
WEBHOOK_URL="https://hooks.slack.com/services/xxx/yyy/zzz"
EMAIL="[email protected]"
ALERT_LOG="/var/log/alerts.log"

# 参数
LEVEL=$1      # critical, warning, info
SUBJECT=$2    # 告警主题
MESSAGE=$3    # 告警内容

# 记录日志
echo "$(date '+%Y-%m-%d %H:%M:%S') [$LEVEL] $SUBJECT: $MESSAGE" >> $ALERT_LOG

# 发送Slack通知
send_slack() {
    local color
    case $LEVEL in
        critical) color="#FF0000" ;;
        warning)  color="#FFA500" ;;
        *)        color="#36A64F" ;;
    esac
    
    curl -X POST -H 'Content-type: application/json' \
        --data "{
            \"attachments\": [{
                \"color\": \"$color\",
                \"title\": \"[$LEVEL] $SUBJECT\",
                \"text\": \"$MESSAGE\",
                \"footer\": \"$(hostname)\",
                \"ts\": $(date +%s)
            }]
        }" \
        $WEBHOOK_URL
}

# 发送邮件通知
send_email() {
    echo "$MESSAGE" | mail -s "[$LEVEL] $SUBJECT" $EMAIL
}

# 根据级别发送通知
case $LEVEL in
    critical)
        send_slack
        send_email
        ;;
    warning)
        send_slack
        ;;
    *)
        send_slack
        ;;
esac

12.6 运维SOP

12.6.1 日常巡检SOP

每日巡检清单

检查项 命令 正常标准
系统负载 uptime load < CPU核心数
CPU使用率 top -bn1 <70%
内存使用 free -h 使用率<80%
磁盘使用 df -h 使用率<80%
磁盘IO iostat -x 1 %util<70%
网络连接 ss -s 无异常增长
服务状态 systemctl status xxx active (running)
日志检查 journalctl -p err --since today 无严重错误

巡检脚本

#!/bin/bash
# daily_check.sh - 每日巡检脚本

REPORT_FILE="/var/log/daily_check_$(date +%Y%m%d).txt"

{
    echo "=== 每日巡检报告 ==="
    echo "时间: $(date)"
    echo "主机: $(hostname)"
    echo ""

    echo "1. 系统负载"
    uptime
    echo ""

    echo "2. CPU使用率"
    top -bn1 | head -5
    echo ""

    echo "3. 内存使用"
    free -h
    echo ""

    echo "4. 磁盘使用"
    df -h
    echo ""

    echo "5. 磁盘IO"
    iostat -x 1 1
    echo ""

    echo "6. 网络连接"
    ss -s
    echo ""

    echo "7. 服务状态"
    systemctl list-units --state=failed
    echo ""

    echo "8. 最近错误日志"
    journalctl -p err --since today --no-pager | tail -20
    echo ""

    echo "=== 巡检完成 ==="
} > $REPORT_FILE

echo "巡检报告: $REPORT_FILE"

12.6.2 故障处理SOP

故障响应流程

1. 确认问题
   ├── 检查监控告警
   ├── 确认影响范围
   └── 评估严重级别

2. 快速恢复
   ├── 重启服务
   ├── 切换备用
   └── 回滚变更

3. 问题定位
   ├── 查看日志
   ├── 分析监控数据
   └── 复现问题

4. 根因分析
   ├── 代码问题
   ├── 配置问题
   └── 资源问题

5. 修复验证
   ├── 实施修复
   ├── 验证效果
   └── 监控观察

6. 总结复盘
   ├── 记录故障
   ├── 分析原因
   └── 改进措施

故障排查命令速查

# CPU问题
top -o %CPU                    # 找CPU大户
pidstat -u 1 5                 # 进程CPU统计
perf top                       # CPU性能分析

# 内存问题
top -o %MEM                    # 找内存大户
pmap -x <PID>                  # 进程内存映射
vmstat 1 5                     # 内存统计

# 磁盘问题
iostat -x 1 5                  # 磁盘IO统计
iotop -o                       # 找IO大户
lsof +D /path                  # 打开的文件

# 网络问题
iftop -i eth0                  # 网络流量
ss -tuln                       # 监听端口
netstat -an | awk '{print $5}' | sort | uniq -c | sort -rn  # 连接统计

12.6.3 容量规划SOP

容量规划步骤

# 1. 收集历史数据
# 使用SAR收集30天数据
sar -u -f /var/log/sysstat/sa$(date +%d) > /tmp/cpu_history.txt
sar -r -f /var/log/sysstat/sa$(date +%d) > /tmp/mem_history.txt
sar -d -f /var/log/sysstat/sa$(date +%d) > /tmp/disk_history.txt

# 2. 分析趋势
# 使用Python分析
python3 << EOF
import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
df = pd.read_csv('/tmp/cpu_history.txt', sep='\s+')

# 分析趋势
print(df.describe())

# 绘图
df.plot()
plt.savefig('/tmp/cpu_trend.png')
EOF

# 3. 预测未来需求
# 基于历史增长率预测
# CPU需求 = 当前使用 * (1 + 增长率)^月数

容量规划表格

资源 当前使用 峰值使用 增长率 3个月后 6个月后 建议
CPU 40% 70% 5%/月 55% 70% 观察
内存 60% 85% 3%/月 69% 78% 观察
磁盘 50% 60% 10%/月 80% 100% 扩容

12.6.4 变更管理SOP

变更前检查

# 1. 备份当前配置
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%Y%m%d)

# 2. 记录当前状态
systemctl status nginx > /tmp/nginx_before.txt

# 3. 测试新配置
nginx -t

# 4. 准备回滚方案
echo "回滚命令: cp /etc/nginx/nginx.conf.bak.$(date +%Y%m%d) /etc/nginx/nginx.conf && systemctl restart nginx"

变更后验证

# 1. 检查服务状态
systemctl status nginx

# 2. 检查日志
journalctl -u nginx --since "5 minutes ago"

# 3. 测试功能
curl -I http://localhost

# 4. 监控指标
# 观察CPU、内存、响应时间是否有异常

12.7 监控数据管理

12.7.1 数据保留策略

数据类型 保留时间 存储方式
实时数据 24小时 内存/本地
分钟级数据 7天 本地磁盘
小时级数据 30天 本地磁盘
天级数据 1年 归档存储
月级数据 3年 归档存储

Prometheus数据保留

# prometheus.yml
global:
  scrape_interval: 15s

# 命令行参数
--storage.tsdb.retention.time=30d
--storage.tsdb.retention.size=50GB

SAR数据保留

# /etc/sysstat/sysstat
HISTORY=28      # 保留28天
COMPRESSAFTER=10  # 10天后压缩

12.7.2 数据备份

#!/bin/bash
# backup_monitoring.sh - 监控数据备份脚本

BACKUP_DIR="/backup/monitoring"
DATE=$(date +%Y%m%d)

mkdir -p $BACKUP_DIR

# 备份Prometheus数据
tar czf $BACKUP_DIR/prometheus_$DATE.tar.gz /var/lib/prometheus/

# 备份Grafana数据
tar czf $BACKUP_DIR/grafana_$DATE.tar.gz /var/lib/grafana/

# 备份SAR数据
tar czf $BACKUP_DIR/sar_$DATE.tar.gz /var/log/sysstat/

# 备份配置文件
tar czf $BACKUP_DIR/config_$DATE.tar.gz /etc/prometheus/ /etc/grafana/

# 清理30天前的备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

echo "备份完成: $BACKUP_DIR"

12.7.3 数据清理

#!/bin/bash
# cleanup_monitoring.sh - 监控数据清理脚本

# 清理旧的SAR数据
find /var/log/sysstat/ -name "sa*" -mtime +30 -delete
find /var/log/sysstat/ -name "sar*" -mtime +30 -delete

# 清理旧的nmon数据
find /var/log/nmon/ -name "*.nmon" -mtime +30 -delete

# 清理旧的性能日志
find /var/log/performance/ -name "*.csv" -mtime +30 -delete

# 清理旧的监控日志
find /var/log/ -name "monitoring_*.log" -mtime +30 -delete

echo "清理完成"

12.8 安全考虑

12.8.1 监控系统安全

访问控制

# 限制Prometheus访问
# 使用反向代理 + 认证
server {
    listen 80;
    server_name prometheus.example.com;

    auth_basic "Prometheus";
    auth_basic_user_file /etc/nginx/.htpasswd;

    location / {
        proxy_pass http://localhost:9090;
    }
}

网络安全

# 防火墙规则
iptables -A INPUT -p tcp --dport 9090 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 9090 -j DROP

数据加密

# TLS配置
tls_server_config:
  cert_file: /etc/prometheus/tls/cert.pem
  key_file: /etc/prometheus/tls/key.pem

12.8.2 敏感信息处理

避免监控敏感数据

# 不要监控包含密码的环境变量
# 不要监控包含密钥的配置文件
# 不要监控包含个人信息的日志

数据脱敏

# 日志脱敏示例
import re

def mask_sensitive(text):
    # 手机号
    text = re.sub(r'1[3-9]\d{9}', '1**********', text)
    # 身份证号
    text = re.sub(r'\d{17}[\dXx]', '*******************', text)
    # 邮箱
    text = re.sub(r'[\w.]+@[\w.]+', '***@***.***', text)
    return text

12.9 监控文化建设

12.9.1 监控意识

团队培训

  • 监控工具使用培训
  • 告警响应流程培训
  • 故障排查方法培训

文档建设

  • 监控系统架构文档
  • 告警处理手册
  • 故障排查手册

12.9.2 持续改进

定期回顾

  • 每周回顾告警情况
  • 每月分析监控数据
  • 每季度优化监控策略

指标优化

# 分析告警统计
cat /var/log/alerts.log | awk '{print $3}' | sort | uniq -c | sort -rn

# 分析误报率
# 误报率 = 无需处理的告警 / 总告警数

12.10 扩展阅读

推荐书籍

  • 《Site Reliability Engineering》- Google SRE团队
  • 《The Site Reliability Workbook》- Google SRE团队
  • 《Monitoring with Prometheus》- James Turnbull
  • 《Systems Performance》- Brendan Gregg

在线资源

工具文档

12.11 本章小结

本章详细介绍了监控最佳实践:

  1. 监控策略

    • 四个黄金信号
    • USE方法
    • RED方法
  2. 指标体系

    • 系统层指标
    • 应用层指标
    • 业务层指标
  3. 告警设计

    • 告警原则
    • 告警分级
    • 告警规则
  4. 监控架构

    • 小型团队方案
    • 中型团队方案
    • 大型团队方案
  5. 运维SOP

    • 日常巡检
    • 故障处理
    • 容量规划
    • 变更管理
  6. 数据管理

    • 数据保留策略
    • 数据备份
    • 数据清理
  7. 安全考虑

    • 访问控制
    • 数据加密
    • 敏感信息处理

监控是一个持续改进的过程,需要根据业务需求不断优化和完善。


上一章: 第11章:Docker容器监控 返回目录: 系统监控工具指南