WEBKT

告别盲人摸象:用 Flask 快速打造服务器监控可视化面板

19 0 0 0

运维兄弟们,是不是还在用 top、free 这些命令吭哧吭哧地盯着服务器?数据是有了,但不够直观,排查问题效率太低!今天,咱们就撸起袖子,用 Python Flask 框架,快速打造一个属于自己的服务器监控可视化面板,让服务器状态一目了然!

一、明确需求:我们要监控哪些指标?

在开始之前,先别急着敲代码。 咱们得先明确一下,到底要监控哪些指标?这些指标对咱们的日常运维工作最有帮助?

  • CPU 使用率: 看看 CPU 是不是被哪个进程给占满了,是不是需要优化代码或者升级配置了。
  • 内存使用率: 内存够不够用,是不是有内存泄漏,是不是该加内存条了。
  • 磁盘使用率: 磁盘空间还剩多少,是不是该清理一下日志文件或者扩容磁盘了。
  • 网络流量: 看看网络带宽是不是被打满了,是不是有恶意流量攻击。
  • 进程状态: 关键进程是不是都在正常运行,有没有挂掉需要重启的。
  • 服务器负载: 了解服务器的整体压力情况,判断是否需要进行负载均衡。

这些只是最基础的,实际工作中,你可能还需要监控数据库连接数、Redis 缓存命中率等等。总之,根据你的实际需求来确定监控指标。

二、技术选型:为什么选择 Flask?

监控面板的技术方案有很多,为什么我推荐 Flask 呢?

  • 轻量级: Flask 非常轻量级,学习曲线平缓,容易上手。对于快速搭建原型系统非常有利。
  • 灵活: Flask 提供了足够的灵活性,可以根据自己的需求进行定制,不会被框架束缚。
  • Python 生态: Python 拥有丰富的第三方库,可以方便地获取服务器的各种监控数据,比如 psutil、netifaces 等。
  • 易于部署: Flask 应用部署起来也很方便,可以使用 Gunicorn、uWSGI 等 WSGI 服务器。

当然,如果你对 Django 更熟悉,或者需要更强大的功能,也可以选择 Django。但对于快速搭建一个简单的监控面板来说,Flask 绝对是首选。

三、环境搭建:撸起袖子,开始干!

  1. 安装 Python 和 pip: 确保你的服务器上已经安装了 Python 和 pip。如果没有,请自行安装,这个就不赘述了。

  2. 创建项目目录: 在你喜欢的位置创建一个项目目录,比如 server_monitor

  3. 创建虚拟环境: 强烈建议使用虚拟环境,避免不同项目之间的依赖冲突。在项目目录下执行以下命令:

    python3 -m venv venv
    source venv/bin/activate
  4. 安装 Flask 和其他依赖:

    pip install Flask psutil netifaces
    
    • Flask:Web 框架。
    • psutil:用于获取系统信息的库。
    • netifaces:用于获取网络接口信息的库。

四、代码实现:核心功能模块

接下来,就是最核心的部分了:编写代码!

  1. 创建 Flask 应用:app.py

    from flask import Flask, render_template
    import psutil
    import netifaces
    app = Flask(__name__)
    @app.route('/')
    def index():
    # 获取 CPU 使用率
    cpu_usage = psutil.cpu_percent(interval=1)
    # 获取内存使用率
    memory = psutil.virtual_memory()
    memory_usage = memory.percent
    memory_total = memory.total / (1024 * 1024) # MB
    memory_used = memory.used / (1024 * 1024) # MB
    # 获取磁盘使用率
    disk = psutil.disk_usage('/')
    disk_usage = disk.percent
    disk_total = disk.total / (1024 * 1024 * 1024) # GB
    disk_used = disk.used / (1024 * 1024 * 1024) # GB
    # 获取网络流量
    net_io = psutil.net_io_counters()
    bytes_sent = net_io.bytes_sent / (1024 * 1024) # MB
    bytes_recv = net_io.bytes_recv / (1024 * 1024) # MB
    # 获取服务器负载
    load_average = psutil.getloadavg()
    # 获取进程列表(只显示前 10 个)
    processes = []
    for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):
    try:
    processes.append(proc.info)
    except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
    pass
    processes = sorted(processes, key=lambda p: p['cpu_percent'], reverse=True)[:10]
    return render_template('index.html',
    cpu_usage=cpu_usage,
    memory_usage=memory_usage,
    memory_total=memory_total,
    memory_used=memory_used,
    disk_usage=disk_usage,
    disk_total=disk_total,
    disk_used=disk_used,
    bytes_sent=bytes_sent,
    bytes_recv=bytes_recv,
    load_average=load_average,
    processes=processes)
    if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

    代码解释:

    • 导入 Flask、render_template、psutil 和 netifaces 库。
    • 创建 Flask 应用实例 app
    • 定义路由 /,对应 index 函数。
    • index 函数中,使用 psutilnetifaces 获取 CPU 使用率、内存使用率、磁盘使用率、网络流量等信息。
    • 使用 render_template 函数渲染 index.html 模板,并将获取到的数据传递给模板。
    • 最后,运行 Flask 应用,debug=True 开启调试模式,host='0.0.0.0' 允许外部访问。
  2. 创建 HTML 模板:templates/index.html

    在项目目录下创建一个 templates 目录,并在其中创建 index.html 文件。

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>服务器监控面板</title>
    <style>
    body {
    font-family: sans-serif;
    }
    .container {
    width: 80%;
    margin: 0 auto;
    }
    .metric {
    margin-bottom: 20px;
    border: 1px solid #ccc;
    padding: 10px;
    }
    .metric h2 {
    margin-top: 0;
    }
    .process-table {
    width: 100%;
    border-collapse: collapse;
    }
    .process-table th, .process-table td {
    border: 1px solid #ccc;
    padding: 8px;
    text-align: left;
    }
    </style>
    </head>
    <body>
    <div class="container">
    <h1>服务器监控面板</h1>
    <div class="metric">
    <h2>CPU 使用率</h2>
    <p>{{ cpu_usage }}%</p>
    </div>
    <div class="metric">
    <h2>内存使用率</h2>
    <p>{{ memory_usage }}% ({{ memory_used:.2f }}MB / {{ memory_total:.2f }}MB)</p>
    </div>
    <div class="metric">
    <h2>磁盘使用率</h2>
    <p>{{ disk_usage }}% ({{ disk_used:.2f }}GB / {{ disk_total:.2f }}GB)</p>
    </div>
    <div class="metric">
    <h2>网络流量</h2>
    <p>发送: {{ bytes_sent:.2f }}MB, 接收: {{ bytes_recv:.2f }}MB</p>
    </div>
    <div class="metric">
    <h2>服务器负载</h2>
    <p>1分钟: {{ load_average[0]:.2f }}, 5分钟: {{ load_average[1]:.2f }}, 15分钟: {{ load_average[2]:.2f }}</p>
    </div>
    <div class="metric">
    <h2>进程列表 (CPU 占用前 10)</h2>
    <table class="process-table">
    <thead>
    <tr>
    <th>PID</th>
    <th>进程名</th>
    <th>CPU 使用率</th>
    <th>内存使用率</th>
    </tr>
    </thead>
    <tbody>
    {% for process in processes %}
    <tr>
    <td>{{ process.pid }}</td>
    <td>{{ process.name }}</td>
    <td>{{ process.cpu_percent }}%</td>
    <td>{{ process.memory_percent }}%</td>
    </tr>
    {% endfor %}
    </tbody>
    </table>
    </div>
    </div>
    </body>
    </html>

    代码解释:

    • 使用 HTML 和 CSS 定义了页面的结构和样式。
    • 使用 Flask 的模板语法 {{ ... }} 将 Python 代码中的数据渲染到页面上。
    • 使用 {% for ... in ... %} 循环遍历进程列表,并将每个进程的信息显示在表格中。
  3. 运行 Flask 应用:

    在项目目录下执行以下命令:

    python app.py
    

    然后在浏览器中访问 http://服务器IP:5000,就可以看到服务器监控面板了!

五、进阶功能:让监控面板更强大

上面的代码只是一个最简单的原型,还有很多可以改进和扩展的地方。

  1. 使用图表展示数据:

    使用 ECharts、Chart.js 等图表库,可以将 CPU 使用率、内存使用率等数据以图表的形式展示出来,更加直观。

  2. 添加历史数据查询功能:

    将监控数据存储到数据库中,比如 MySQL、InfluxDB 等,然后提供一个界面,可以查询历史数据。

  3. 添加报警功能:

    当某个指标超过阈值时,发送邮件、短信等报警通知,及时发现问题。

  4. 使用 Celery 实现异步任务:

    有些监控任务可能比较耗时,可以使用 Celery 将这些任务放到后台异步执行,避免阻塞 Web 应用。

  5. 美化界面:

    使用 Bootstrap、Vue.js 等前端框架,可以美化界面,提升用户体验。

六、总结:运维不再是苦力活

通过本文,我们学习了如何使用 Flask 快速打造一个服务器监控可视化面板。虽然这只是一个简单的示例,但它已经能够帮助我们更好地了解服务器的状态,提高运维效率。希望大家能够在此基础上,不断学习和探索,打造出更加强大的监控系统,让运维工作不再是苦力活!记住,技术是为了解放生产力,而不是让我们成为技术的奴隶!

监控小能手 Flask服务器监控运维

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/9991