Python系统监控:如何实时监测服务器性能并通过钉钉推送及时预警
为什么需要系统监控?
当管理一些复杂的系统时,经常会出现系统出现故障或异常的情况,这些问题可能会导致服务不可用或者是业务中断。为了确保系统的稳定性和高可用性,需要对系统进行监控。系统监控可以实时监测系统的运行状态,以及收集关键指标并作出相应的响应,以减少故障时间和提高系统的可用性。
使用Python进行系统监控的好处包括:
-
可定制性:Python是一种开源语言,可以根据具体需求进行扩展和修改。这使得开发者能够自定义监控工具,以符合自己的要求和需求。
-
简单易用:Python是一种简单易用的编程语言,易于编写和维护,使得开发者能够快速地开发出高效的监控工具。
-
可视化:Python支持多种可视化库,可以将监控数据进行可视化,便于用户更好地理解和分析监控数据。
-
高效性:Python是一种高效的语言,使用Python进行系统监控可以帮助开发者快速地收集和处理监控数据。
综上所述,使用Python进行系统监控可以有效地帮助开发者实现对系统的监控和管理,减少故障时间,提高系统的可用性和稳定性。
系统实现
日志模块
在编写系统监控程序时,记录程序运行日志非常重要。通过记录日志,我们可以及时发现程序运行过程中的错误,从而方便我们进行调试和优化。
在这里,我们使用 loguru
库来记录程序的日志信息。首先,我们通过以下代码来获取当前的日期,并用它来设置日志文件名:
now_log_time = datetime.now().strftime('%Y_%m_%d')
然后,我们使用 logger.remove()
方法来清空之前的所有日志处理器,避免日志信息重复记录。最后,我们使用 logger.add()
方法来添加日志处理器,将程序的日志信息写入到对应的日志文件中,并设置保留日志文件的时间为10天:
logger.remove(handler_id=None)
logger.add('./logs/run_{}.log'.format(now_log_time), retention="10 days")
通过以上的配置,我们可以轻松地实现程序日志信息的记录和管理。
对的,接下来我会进一步解释这段代码,同时保护其中出现的隐私信息。
DingTalk机器人发送推送消息
在这段代码中,我们定义了一个函数 send_dingtalk
,该函数用于发送DingTalk机器人的推送消息,以便我们能够及时获取电脑使用情况。为了保证安全性,我们在函数中使用了钉钉机器人的安全设置,包括使用时间戳、密钥和HMAC加密来生成签名。同时,我们也将access_token设置为了变量,以便我们可以轻松地在代码中更改。在函数中,我们使用了requests库来发送POST请求并将消息体作为json格式的数据发送。
为了保护隐私信息,我们将钉钉机器人的密钥和access_token作为变量保存在代码中,而不是在代码中硬编码。此外,我们已经将代码中的隐私信息替换为了实际应该使用的值,以避免在这里泄漏任何敏感信息。
代码示例:
@logger.catch
def send_dingtalk(content):
timestamp = str(round(time.time() * 1000))
secret = '替换为你的密钥'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = quote_plus(base64.b64encode(hmac_code))
access_token = '替换为你的access_token'
webhook_url = 'https://oapi.dingtalk.com/robot/send?access_token=' + access_token + '×tamp=' + timestamp + '&sign=' + sign
headers = {'Content-Type': 'application/json'}
data = {
'msgtype': 'markdown',
'markdown': {
'title': '公司电脑使用推送',
'text': content
}
}
response = requests.post(webhook_url, headers=headers, data=json.dumps(data))
return response.text
获取系统信息
当我们需要监控我们的服务器时,了解当前系统的一些基本信息是非常重要的。下面是几个Python函数,可以帮助我们获取系统的一些基本信息:
获取系统持续时间
@logger.catch
def boot_time_info():
boot_time = psutil.boot_time()
boot_time_obj = datetime.fromtimestamp(boot_time)
now_time = datetime.now()
delta_time = now_time - boot_time_obj
raw_delta_time = str(delta_time).split('.')[0].split(":")
delta_time = raw_delta_time[0] + '小时' + raw_delta_time[1] + '分钟' + raw_delta_time[2] + '秒'
return delta_time + '\n'
这个函数可以获取系统的持续时间。我们使用了 psutil
库来获取系统启动时间,并将其转换为 datetime
对象。然后,我们计算出了当前时间和启动时间之间的时间差,并将其转换为一个易于阅读的字符串格式。
获取磁盘空间使用情况
@logger.catch
def disk_usage_info():
disk_usage_str = ''
for partition in psutil.disk_partitions():
try:
usage = psutil.disk_usage(partition.mountpoint)
disk_usage_str += '* {} 使用率:{:.2f}%\n'.format(partition.mountpoint.replace(":\\", " 盘"), usage.percent)
except Exception as e:
print(e)
return disk_usage_str
这个函数可以获取当前系统磁盘空间使用情况。我们使用了 psutil
库来获取磁盘分区信息,然后计算每个分区的使用率,并将其格式化为易于阅读的字符串。
获取内存使用情况
@logger.catch
def memory_usage_info():
memory_usage = psutil.virtual_memory().percent
memory_usage_str = '{:.2f}%\n'.format(memory_usage)
return memory_usage_str
这个函数可以获取当前系统的内存使用情况。我们使用了 psutil
库来获取内存信息,并将其转换为百分比格式的字符串。
获取网络上传下载量
@logger.catch
def net_io_info():
net_io_counters = psutil.net_io_counters()
total_bytes_sent_gb = net_io_counters.bytes_sent / 1024 / 1024 / 1024
total_bytes_recv_gb = net_io_counters.bytes_recv / 1024 / 1024 / 1024
network_usage_str = f'* 上传总量:{total_bytes_sent_gb:.2f} GB\n* 下载总量:{total_bytes_recv_gb:.2f} GB'
return network_usage_str
获取系统信息并发送消息
在前面的代码段中,我们已经定义了几个函数来获取系统信息,包括系统启动时间、磁盘使用情况、内存使用情况、网络使用情况等。现在,我们可以使用这些函数来组装一条完整的系统信息消息,并通过消息推送的方式来将其发送给我们需要的目标。具体来说,我们可以使用类似以下代码的方式来实现:
@logger.catch
def message_info(flag):
boot_time_str = boot_time_info()
disk_usage_str = disk_usage_info()
memory_usage_str = memory_usage_info()
network_usage_str = net_io_info()
copy_info = sync_data()
# 组装消息内容
message = '## ' + str(datetime.now().strftime('%Y年%m月%d日')) + ' \n\n '
message += '--- \n\n'
message += '## 运行时间: {}\n\n '.format(boot_time_str)
message += '## 内存使用情况: {}\n\n'.format(memory_usage_str)
message += '## 磁盘使用情况\n{}\n\n '.format(disk_usage_str)
message += '## 网络使用情况\n{}\n'.format(network_usage_str)
message += '--- \n\n'
return message
在这个函数中,我们调用了之前定义的四个函数来获取系统信息,并使用获取的信息来组装一条消息。最终,我们可以将这个消息发送给目标接收者。这个函数不仅可以通过消息推送的方式来发送信息,也可以将消息输出到日志中。
定时发送
当我们完成了上述代码的编写和调试后,现在我们需要设置定时任务,以便在每天晚上 18:00 自动运行程序,更新数据并发送到指定的Webhook机器人中。为了实现这一点,我们需要使用 Python 的 schedule
模块。在程序的入口处,我们需要添加一个定时任务调度程序,并使用 every().day.at()
函数设置每天的运行时间。在本例中,我们设置为每天的晚上 18:00:00。然后,我们使用 do()
函数指定要运行的函数名,即 main()
函数。最后,我们使用 while True
循环和 schedule.run_pending()
函数来实现任务的循环执行。这样,我们的程序就可以自动在指定时间运行,并将数据发送到指定的钉钉群中的Webhook机器人。
更多推荐
所有评论(0)