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

系统监控工具指南 / 第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)

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

RED方法(Tom Wilkie)

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

12.2 监控指标体系

12.2.1 系统层指标

CPU指标

指标计算方式警告阈值严重阈值
CPU使用率1 - idle>70%>90%
用户空间CPUus>60%>80%
系统空间CPUsy>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每秒请求数根据基线根据基线
响应时间P9999分位延迟>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="admin@example.com"
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

每日巡检清单

检查项命令正常标准
系统负载uptimeload < CPU核心数
CPU使用率top -bn1<70%
内存使用free -h使用率<80%
磁盘使用df -h使用率<80%
磁盘IOiostat -x 1%util<70%
网络连接ss -s无异常增长
服务状态systemctl status xxxactive (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个月后建议
CPU40%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容器监控 返回目录: 系统监控工具指南