当前位置: 首页 > article >正文

Python学习笔记之IP监控及告警

一、需求说明

  作为一名运维工程师,监控系统必不可少。不过我们的监控系统往往都是部署在内网的,如果互联网出口故障,监控系统即使发现了问题,也会告警不出来,这个时候我们就需要补充监控措施,增加从外到内的监控,主要监控互联网出口IP地址的通断性。监控需求如下:
1、可以根据需要自定义监控IP地址;
2、监控可达秒级,比如间隔3秒,5次不通就告警;
3、可以通过邮件进行告警;
4、监控记录日志存档。

二、监控脚本实现思路

  本次需求实现使用Python语言,Python的安装可以参考博文Ubuntu之Anaconda3安装,这里不再赘述。

1、确定模块依赖

  日志记录和格式化输出需要使用logging库;系统日志目录获取等需要用到os模块;监控使用ping,需要用到ping模块;邮件告警需要用到smtplib。

2、定义监控参数和邮件参数

  主要是用配置待监控IP地址,ping检查间隔,不可达次数,邮件参数等。

3、日志文件检查和定义日志格式

  检查日志文件目录是否存在,不存在则创建。

3、定义邮件告警发生函数

  使用Python中的smptlib库创建邮件告警函数,调用上述步骤参数中的信息。

4、定义监控函数

  这个是最重要的函数,主要是创建一个true循环,通过ping记录响应时间,超时则认为不可达,连续超过5次则发送告警邮件。

  • 初始化不可达次数为0
  • 获取日期,创建日志文件
  • ping检查目标地址,获取响应时间
  • 如果不可达则不可达次数+1
  • 如果不可达次数超过参数定义次数则发生告警邮件
  • 如果ping检测结果正常不可达次数归零
  • 服务暂停监控间隔时间后继续

5、定义主函数

三、监控脚本内容

# -*- coding: utf-8 -*
import time
import logging
import os
from datetime import datetime
from ping3 import ping
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# 监控及邮件参数
TARGET_IP = "36.158.39.200"  # 待监控IP
CHECK_INTERVAL = 3         # Ping监控间隔
UNREACHABLE_THRESHOLD = 5  # 不可达次数记录
LOG_DIR = "./checklog"  #日志存储目录
EMAIL_SENDER = "wuhongsheng@email.com"     # 发件邮箱
EMAIL_RECEIVER = "wuhongsheng@email.com" # 收件邮箱
SMTP_SERVER = "smtp.qiye.aliyun.com"        # SMTP邮件服务器地址
SMTP_PORT = 465                         # SMTP服务端口
EMAIL_USER = "wuhongsheng@email.com"       # 邮箱账户
EMAIL_PASSWORD = "Wuhs@20240603"             # 邮箱密码


# 日志检查和格式化
if not os.path.exists(LOG_DIR):
    os.makedirs(LOG_DIR)

logging.basicConfig(
    filename=os.path.join(LOG_DIR, f"{datetime.now().strftime('%Y-%m-%d')}.log"),
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
)

# 定义邮件告警函数
def send_alert():
    msg = MIMEMultipart()
    msg['From'] = EMAIL_SENDER
    msg['To'] = EMAIL_RECEIVER
    msg['Subject'] = f"Ping Alert: {TARGET_IP} is Unreachable"
    body = f"Warning: {TARGET_IP} has been unreachable for {UNREACHABLE_THRESHOLD} consecutive attempts."
    msg.attach(MIMEText(body, 'plain'))
    
    with smtplib.SMTP_SSL(SMTP_SERVER, 465) as server:
        server.login(EMAIL_USER, EMAIL_PASSWORD)
        server.sendmail(EMAIL_SENDER, EMAIL_RECEIVER, msg.as_string())

# 定义监控函数
def monitor():
    unreachable_count = 0
    while True:
        #日志按天记录
        today = datetime.now().strftime("%Y-%m-%d")
        logging.root.handlers[0].baseFilename = os.path.join(LOG_DIR, f"{today}.log")
        
        # ping结果判断,记录连续中断次数
        response = ping(TARGET_IP, timeout=1)
        if response is None:
            unreachable_count += 1
            logging.warning(f"{TARGET_IP} is unreachable ({unreachable_count}/{UNREACHABLE_THRESHOLD})")
            if unreachable_count >= UNREACHABLE_THRESHOLD:
                send_alert()
                unreachable_count = 0  # 
        else:
            unreachable_count = 0
            latency = round(response * 1000, 2)  # 

            logging.info(f"{TARGET_IP} is reachable, latency: {latency} ms")
        
        time.sleep(CHECK_INTERVAL)

# 主函数
if __name__ == "__main__":
    monitor()

四、运行测试

1、启动检查脚本

(base) wuhs@jj100:~/python_scripts/test$ python InternetIpCheck.py &

2、检查输出日志

在这里插入图片描述

3、验证邮件告警

  修改一个不可ping地址,然后重启监控脚本,3秒一次,连续5次不可达之后收到了监控告警邮件。
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/417253.html

相关文章:

  • 解决 ssh: connect to host github.com port 22: Connection timed out
  • 甘肃省医保刷脸设备激活步骤
  • Verilog代码实例
  • 【Elasticsearch】allow_no_indices
  • OSPF基础(2):数据包详解
  • android 打包AAR-引入资源layout-安卓封包
  • C/C++ 数据结构与算法【线性表】 顺序表+链表详细解析【日常学习,考研必备】带图+详细代码
  • 【AI系统】传统编译器发展
  • 使用1panel一键安装Ollama WebUI连接本地Ollama使用开源ai模型
  • 软件测试之bug分析定位技巧
  • 元器件选型与参数13 电源的分类-线性电源参数 RT9013 AMS1117 PCB布局布线
  • 基于HTML和CSS的校园网页设计与实现
  • Streamlit 应用从本地部署到服务器并进行访问
  • 深度学习:梯度下降法
  • CTF-PWN glibc源码阅读[1]: 寻找libc中堆结构的定义(2.31-0ubuntu9.16)
  • Spacy小笔记:zh_core_web_trf、zh_core_web_lg、zh_core_web_md 和 zh_core_web_sm区别
  • 在鸿蒙应用中 Debug 对开发者的帮助
  • Spring AOP相关知识详解
  • 3d扫描建模产品开发-三维扫描检测蓝光检测
  • 基于大数据python 社团管理系统(源码+LW+部署讲解+数据库+ppt)
  • 【北京迅为】iTOP-4412全能版使用手册-第二十四章 进程创建与回收
  • mind+自定义库编写注意事项
  • Gradle vs. Maven: 到底哪个更适合java 项目?
  • LeetCode 力扣 热题 100道(十一)字母异位词分组(C++)
  • 力扣_876. 链表的中间结点
  • UE5 打包报错 Unknown structure 的解决方法