從原理到生產(chǎn)部署解析Python多服務(wù)器監(jiān)控告警系統(tǒng)開(kāi)發(fā)
整體架構(gòu)圖

核心設(shè)計(jì)思想
- 無(wú)代理監(jiān)控:通過(guò)SSH直接獲取數(shù)據(jù),無(wú)需在目標(biāo)服務(wù)器安裝代理
- 故障隔離:?jiǎn)闻_(tái)服務(wù)器故障不影響整體監(jiān)控
- 多級(jí)檢測(cè):網(wǎng)絡(luò)層→資源層→服務(wù)層層層遞進(jìn)
- 冪等設(shè)計(jì):支持定時(shí)重復(fù)執(zhí)行,避免狀態(tài)累積
代碼深度解析
1. 配置模塊 - 靈活的參數(shù)管理
# 服務(wù)器配置列表
SERVERS = [
{
"host": "192.168.0.224",
"ssh_port": 22,
"ssh_user": "root",
"ssh_key": "/root/.ssh/server_monitor_key"
},
# 更多服務(wù)器...
]
# 監(jiān)控閾值設(shè)置
MEMORY_THRESHOLD = 90 # 內(nèi)存閾值%
CPU_THRESHOLD = 85 # CPU閾值%
DISK_THRESHOLD = 95 # 磁盤(pán)閾值%
# 檢測(cè)參數(shù)
DINGTALK_WEBHOOK = "https://oapi.dingtalk.com/robot/send?access_token="
PING_TIMEOUT = 3 # 網(wǎng)絡(luò)檢測(cè)超時(shí)(秒)
CHECK_INTERVAL = 600 # 檢查間隔(秒)
- 支持多服務(wù)器配置,可擴(kuò)展性強(qiáng)
- 關(guān)鍵參數(shù)集中管理,便于維護(hù)
- 支持不同服務(wù)器使用不同認(rèn)證方式
2. 網(wǎng)絡(luò)檢測(cè)模塊 - 基于TCP的連通性檢查
def check_network(host):
try:
socket.setdefaulttimeout(PING_TIMEOUT)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, 22)) # 檢測(cè)SSH端口
s.close()
return True
except Exception:
return False
- 使用TCP連接檢測(cè)替代ICMP ping,更貼近實(shí)際服務(wù)可用性
- 檢測(cè)SSH服務(wù)端口(22),確保監(jiān)控功能可用
- 設(shè)置超時(shí)時(shí)間防止阻塞
3. 指標(biāo)采集模塊 - SSH命令執(zhí)行與解析
def get_server_metrics(server):
# 創(chuàng)建SSH客戶(hù)端
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
# 多密鑰類(lèi)型支持
try:
private_key = paramiko.RSAKey.from_private_key_file(server["ssh_key"])
except:
try:
private_key = paramiko.Ed25519Key.from_private_key_file(server["ssh_key"])
except:
private_key = paramiko.ECDSAKey.from_private_key_file(server["ssh_key"])
# 建立SSH連接
ssh.connect(
hostname=server["host"],
port=server["ssh_port"],
username=server["ssh_user"],
pkey=private_key,
timeout=15,
look_for_keys=False,
allow_agent=False
)
# 獲取主機(jī)名
stdin, stdout, stderr = ssh.exec_command("hostname")
hostname = stdout.read().decode().strip() or server["host"]
# CPU監(jiān)控命令
stdin, stdout, stderr = ssh.exec_command(
"top -bn1 | grep 'Cpu(s)' | awk -F'[ ,]+' '{print $8}' | tr -d '%' | awk '{print 100 - $1}'"
)
cpu_usage = float(stdout.read().decode().strip())
# 更多指標(biāo)采集...
finally:
ssh.close()
return hostname, alerts
- 多密鑰算法支持:自動(dòng)嘗試RSA/Ed25519/ECDSA等算法
- 安全連接設(shè)置:禁用SSH agent和密鑰搜索
- 主機(jī)名獲取:優(yōu)先使用服務(wù)器真實(shí)主機(jī)名
- 資源釋放:finally塊確保SSH連接關(guān)閉
4. 告警模塊 - 釘釘機(jī)器人集成
def send_dingtalk_message(message):
"""發(fā)送Markdown格式消息到釘釘機(jī)器人"""
headers = {"Content-Type": "application/json"}
# 創(chuàng)建Markdown格式消息
markdown_content = "### ?? 服務(wù)器監(jiān)控告警\n" + message.replace("\n", "\n\n")
data = {
"msgtype": "markdown",
"markdown": {
"title": "服務(wù)器監(jiān)控告警",
"text": markdown_content
}
}
try:
response = requests.post(
DINGTALK_WEBHOOK,
data=json.dumps(data),
headers=headers,
timeout=10
)
if response.status_code == 200:
print("釘釘消息發(fā)送成功")
else:
print(f"釘釘消息發(fā)送失敗: {response.text}")
except Exception as e:
print(f"發(fā)送釘釘消息時(shí)出錯(cuò): {str(e)}")
- 添加時(shí)間戳便于問(wèn)題追蹤
- 包含直接訪(fǎng)問(wèn)監(jiān)控面板的鏈接
- 使用emoji增強(qiáng)可讀性
- 支持Markdown格式(加粗、換行等)
監(jiān)控指標(biāo)采集技術(shù)詳解
1. CPU使用率采集
top -bn1 | grep 'Cpu(s)' | awk -F'[ ,]+' '{print $8}' | tr -d '%' | awk '{print 100 - $1}'
命令解析:
top -bn1:非交互模式運(yùn)行top命令grep 'Cpu(s)':過(guò)濾CPU行awk處理:提取空閑CPU百分比100 - 空閑值:計(jì)算實(shí)際使用率
2. 內(nèi)存使用率采集
free | awk 'NR==2{printf "%.2f", $3*100/$2 }'
計(jì)算原理:
總內(nèi)存 = $2
已用內(nèi)存 = $3
使用率 = (已用內(nèi)存 / 總內(nèi)存) * 100
3. 磁盤(pán)使用率采集
df -h | awk '$NF=="/"{printf "%d", $5}'
關(guān)鍵參數(shù):
$NF=="/":只監(jiān)控根分區(qū)$5:使用率列(已去除%符號(hào))- 可根據(jù)不同服務(wù)器掛載的分區(qū)自行調(diào)整
4. 進(jìn)程監(jiān)控
processes = ["kubelet", "dockerd", "kube-proxy"]
for process in processes:
stdin, stdout, stderr = ssh.exec_command(f"pgrep -x {process}")
if not stdout.read().decode().strip():
missing_processes.append(process)
進(jìn)程檢測(cè)邏輯:
- 使用
pgrep -x精確匹配進(jìn)程名 - 檢查返回結(jié)果是否為空
- 支持?jǐn)U展添加關(guān)鍵進(jìn)程
生產(chǎn)環(huán)境部署指南
系統(tǒng)架構(gòu)建議

部署步驟
環(huán)境準(zhǔn)備
# 創(chuàng)建專(zhuān)用用戶(hù) sudo useradd -m -s /bin/bash monitor sudo passwd monitor # 安裝依賴(lài) sudo apt-get update sudo apt-get install python3-pip sudo -u monitor pip install paramiko requests
SSH密鑰配置
# 生成監(jiān)控專(zhuān)用密鑰
sudo -u monitor ssh-keygen -t ed25519 -f /home/monitor/.ssh/server_monitor_key
# 分發(fā)公鑰到目標(biāo)服務(wù)器
for server in ${SERVERS[@]}; do
sudo -u monitor ssh-copy-id -i /home/monitor/.ssh/server_monitor_key.pub ${server}
done
配置文件調(diào)整
# 修改服務(wù)器配置
SERVERS = [
{
"host": "10.0.1.101",
"ssh_port": 22,
"ssh_user": "monitor", # 使用專(zhuān)用賬戶(hù)
"ssh_key": "/home/monitor/.ssh/server_monitor_key" # 正確路徑
},
# 更多服務(wù)器...
]
系統(tǒng)服務(wù)化
# 創(chuàng)建systemd服務(wù)文件 sudo tee /etc/systemd/system/server-monitor.service <<EOF [Unit] Description=Server Monitoring Service After=network.target [Service] User=monitor ExecStart=/usr/bin/python3 /opt/monitor/new_server_monitor.py Restart=always RestartSec=30 [Install] WantedBy=multi-user.target EOF # 啟動(dòng)服務(wù) sudo systemctl daemon-reload sudo systemctl enable server-monitor sudo systemctl start server-monitor
日志管理方案
# 查看實(shí)時(shí)日志
journalctl -u server-monitor -f
# 日志輪轉(zhuǎn)配置
sudo tee /etc/logrotate.d/server-monitor <<EOF
/var/log/server-monitor.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 monitor adm
sharedscripts
postrotate
systemctl restart server-monitor > /dev/null
endscript
}
EOF
到此這篇關(guān)于從原理到生產(chǎn)部署解析Python多服務(wù)器監(jiān)控告警系統(tǒng)開(kāi)發(fā)的文章就介紹到這了,更多相關(guān)Python多服務(wù)器監(jiān)控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django+Ajax異步刷新/定時(shí)自動(dòng)刷新實(shí)例詳解
AJAX是前端技術(shù)的集合,包括JavaScript、XML、HTML、CSS等,下面這篇文章主要給大家介紹了關(guān)于Django+Ajax異步刷新/定時(shí)自動(dòng)刷新的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
python實(shí)現(xiàn)搜索指定目錄下文件及文件內(nèi)搜索指定關(guān)鍵詞的方法
這篇文章主要介紹了python實(shí)現(xiàn)搜索指定目錄下文件及文件內(nèi)搜索指定關(guān)鍵詞的方法,可實(shí)現(xiàn)針對(duì)文件夾及文件內(nèi)關(guān)鍵詞的搜索功能,需要的朋友可以參考下2015-06-06
Pandas的read_csv函數(shù)參數(shù)分析詳解
這篇文章主要介紹了Pandas的read_csv函數(shù)參數(shù)分析詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python實(shí)現(xiàn)文件分片上傳的接口自動(dòng)化
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)文件分片上傳的接口自動(dòng)化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
Python單元測(cè)試unittest模塊使用終極指南
本文將詳細(xì)介紹unittest模塊的各個(gè)方面,包括測(cè)試用例、斷言、測(cè)試套件、setUp和tearDown方法、跳過(guò)和期望異常、測(cè)試覆蓋率、持續(xù)集成等內(nèi)容,我們將提供豐富的示例代碼,以便讀者更好地理解如何使用unittest進(jìn)行單元測(cè)試2023-12-12
Python實(shí)現(xiàn)二叉搜索樹(shù)增刪改查
二叉搜索樹(shù)是一種特殊的二叉樹(shù),在本文中,我將介紹如何用Python語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的二叉搜索樹(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-08-08
Python使用qrcode二維碼庫(kù)生成二維碼方法詳解
這篇文章主要介紹了Python使用qrcode二維碼庫(kù)生成二維碼方法詳解,需要的朋友可以參考下2020-02-02

