为什么需要系统监控?

当管理一些复杂的系统时,经常会出现系统出现故障或异常的情况,这些问题可能会导致服务不可用或者是业务中断。为了确保系统的稳定性和高可用性,需要对系统进行监控。系统监控可以实时监测系统的运行状态,以及收集关键指标并作出相应的响应,以减少故障时间和提高系统的可用性。

使用Python进行系统监控的好处包括:

  1. 可定制性:Python是一种开源语言,可以根据具体需求进行扩展和修改。这使得开发者能够自定义监控工具,以符合自己的要求和需求。

  2. 简单易用:Python是一种简单易用的编程语言,易于编写和维护,使得开发者能够快速地开发出高效的监控工具。

  3. 可视化:Python支持多种可视化库,可以将监控数据进行可视化,便于用户更好地理解和分析监控数据。

  4. 高效性: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 + '&timestamp=' + 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机器人。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐