在Linux服务器运维中,及时发现和处理系统异常是保障业务稳定运行的关键。本文将详细介绍如何搭建一套完整的服务器监控告警系统,实现7×24小时自动化监控和多渠道告警通知。
🎯 告警系统架构设计
系统组件概览
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 数据采集层 │───▶│ 告警判断层 │───▶│ 通知发送层 │
│ │ │ │ │ │
│ • 系统指标 │ │ • 阈值判断 │ │ • 邮件通知 │
│ • 服务状态 │ │ • 规则引擎 │ │ • 短信告警 │
│ • 日志监控 │ │ • 告警抑制 │ │ • 钉钉/企微 │
│ • 自定义指标 │ │ • 升级策略 │ │ • 电话告警 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
核心功能特性
多维度监控:CPU、内存、磁盘、网络、服务状态
智能告警:阈值告警、趋势告警、异常检测
多渠道通知:邮件、短信、即时通讯工具
告警抑制:防止告警风暴,支持静默期设置
可视化展示:监控大屏、历史趋势图表
📊 系统监控指标设计
基础系统指标
#!/bin/bash
# system_monitor.sh - 系统基础指标监控脚本
# 配置文件
CONFIG_FILE="/etc/monitor/config.conf"
LOG_FILE="/var/log/monitor/system.log"
ALERT_FILE="/tmp/alert_status"
# 加载配置
source $CONFIG_FILE
# 获取CPU使用率
get_cpu_usage() {
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | awk -F'%' '{print $1}')
echo "CPU使用率: ${cpu_usage}%"
if (( $(echo "$cpu_usage > $CPU_THRESHOLD" | bc -l) )); then
send_alert "CPU告警" "CPU使用率过高: ${cpu_usage}%,阈值: ${CPU_THRESHOLD}%"
fi
}
# 获取内存使用率
get_memory_usage() {
memory_info=$(free | grep Mem)
total=$(echo $memory_info | awk '{print $2}')
used=$(echo $memory_info | awk '{print $3}')
memory_usage=$(echo "scale=2; $used/$total*100" | bc)
echo "内存使用率: ${memory_usage}%"
if (( $(echo "$memory_usage > $MEMORY_THRESHOLD" | bc -l) )); then
send_alert "内存告警" "内存使用率过高: ${memory_usage}%,阈值: ${MEMORY_THRESHOLD}%"
fi
}
# 获取磁盘使用率
get_disk_usage() {
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5 " " $1}' | while read output;
do
usage=$(echo $output | awk '{print $1}' | cut -d'%' -f1)
partition=$(echo $output | awk '{print $2}')
echo "磁盘使用率 $partition: ${usage}%"
if [ $usage -ge $DISK_THRESHOLD ]; then
send_alert "磁盘告警" "磁盘使用率过高 $partition: ${usage}%,阈值: ${DISK_THRESHOLD}%"
fi
done
}
# 检查系统负载
get_load_average() {
load_avg=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')
cpu_cores=$(nproc)
load_ratio=$(echo "scale=2; $load_avg/$cpu_cores" | bc)
echo "系统负载: $load_avg (${cpu_cores}核心,比率: $load_ratio)"
if (( $(echo "$load_ratio > $LOAD_THRESHOLD" | bc -l) )); then
send_alert "负载告警" "系统负载过高: $load_avg,CPU核心数: $cpu_cores,负载比率: $load_ratio"
fi
}
# 发送告警
send_alert() {
local title="$1"
local message="$2"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# 检查告警抑制
if check_alert_suppression "$title"; then
echo "[$timestamp] 告警被抑制: $title" >> $LOG_FILE
return
fi
# 记录告警
echo "[$timestamp] $title: $message" >> $LOG_FILE
# 发送邮件告警
send_email_alert "$title" "$message"
# 发送短信告警(如果配置了)
if [ "$SMS_ENABLED" = "true" ]; then
send_sms_alert "$title" "$message"
fi
# 发送钉钉告警(如果配置了)
if [ "$DINGTALK_ENABLED" = "true" ]; then
send_dingtalk_alert "$title" "$message"
fi
# 更新告警状态
echo "$title:$(date +%s)" >> $ALERT_FILE
}
# 邮件告警发送
send_email_alert() {
local title="$1"
local message="$2"
local hostname=$(hostname)
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# 构造邮件内容
local email_body="
服务器告警通知
服务器: $hostname
时间: $timestamp
告警类型: $title
告警详情: $message
请及时处理!
---
自动监控系统
"
# 使用mailx发送邮件
echo "$email_body" | mailx -s "【告警】$hostname - $title" "$ALERT_EMAIL"
echo "邮件告警已发送: $title"
}
# 主监控函数
main_monitor() {
echo "=== 系统监控开始 $(date) ==="
get_cpu_usage
get_memory_usage
get_disk_usage
get_load_average
echo "=== 系统监控结束 $(date) ==="
echo ""
}
# 执行监控
main_monitor
配置文件示例
# /etc/monitor/config.conf
# 监控阈值配置
# CPU使用率阈值(百分比)
CPU_THRESHOLD=80
# 内存使用率阈值(百分比)
MEMORY_THRESHOLD=85
# 磁盘使用率阈值(百分比)
DISK_THRESHOLD=90
# 系统负载阈值(负载/CPU核心数)
LOAD_THRESHOLD=2.0
# 告警邮箱
ALERT_EMAIL="admin@company.com,ops@company.com"
# 短信告警开关
SMS_ENABLED=true
SMS_API_URL="https://api.sms.com/send"
SMS_API_KEY="your_sms_api_key"
SMS_PHONES="13800138000,13900139000"
# 钉钉告警开关
DINGTALK_ENABLED=true
DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxx"
# 告警抑制时间(秒)
ALERT_SUPPRESSION_TIME=3600
📧 邮件告警配置
邮件服务配置
邮件告警是运维告警系统的核心组件,需要正确配置SMTP服务。详细的邮件发送配置请参考:
CentOS通过命令发送邮件完整教程
高级邮件告警功能
#!/bin/bash
# advanced_email_alert.sh - 高级邮件告警功能
# 邮件模板配置
EMAIL_TEMPLATE_DIR="/etc/monitor/templates"
# 发送HTML格式告警邮件
send_html_alert() {
local alert_type="$1"
local
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END
暂无评论内容