• 使用Grafana与MySQL监控监控网络延迟



    前言

    在网络应用中,网络延迟是一个重要的指标,它影响着用户体验和系统性能。本文将介绍如何使用Python编写一个程序来监控网络延迟(Ping)并将结果存储到MySQL数据库中。然后,我们将使用Grafana来创建仪表盘,实时展示网络延迟的数据。

    当监控网络连接并将数据存储到数据库后,我们可以使用 Grafana 这样的工具来可视化数据并创建仪表盘,以便更直观地查看和分析监控结果。以下是将 Grafana 与上述代码结合使用的步骤:

    python程序

    当我们需要监控网络连接并记录 Ping 响应时间、丢包率和抖动等指标时,可以使用 Python 编程语言和一些相关库来实现。下面是一个示例代码,用于监控 Ping 并将数据存储到数据库中。

    首先,确保已安装以下库:

    • ping3:用于执行 Ping 操作并获取响应时间。
    • pymysql:用于与 MySQL 数据库建立连接和执行 SQL 操作。
    • pytz:用于处理时区转换。

    然后,创建一个配置文件 ping_config.ini,其中包含以下内容:

    [ping]
    target_address = 目标地址
    
    • 1
    • 2

    target_address 替换为要 Ping 的目标地址。

    接下来,将以下代码保存为 Python 脚本文件(例如,ping_monitor.py):

    import ping3
    import time
    import statistics
    from configparser import ConfigParser
    import pymysql
    from datetime import datetime
    import pytz
    
    # 计算平均绝对偏差(Mean Absolute Deviation)
    def calculate_mad(data):
        mean = sum(data) / len(data)
        deviations = [abs(x - mean) for x in data]
        mad = sum(deviations) / len(deviations)
        return mad
    
    # 监控 Ping 并将数据存储到数据库
    def monitor_ping(config_file):
        # 读取配置文件
        config = ConfigParser()
        config.read(config_file)
        target_address = config.get('ping', 'target_address')
    
        # 建立与数据库的连接
        conn = pymysql.connect(user='用户名', password='密码', host='数据库主机', database='数据库名')
        cursor = conn.cursor()
    
        min_rtt = float('inf')
        max_rtt = 0
        total_rtt = 0
        rtt_values = []
    
        sent_packets = 0
        received_packets = 0
    
        while True:
            result = ping3.ping(target_address, size=64)
    
            sent_packets += 1
            if result is not None:
                result = result * 1000
                print(f"往返时间: {result}ms")
                min_rtt = min(min_rtt, result)
                max_rtt = max(max_rtt, result)
                total_rtt += result
                received_packets += 1
    
                # 抖动
                rtt_values.append(result)
            else:
                print("请求超时")
    
            if received_packets > 0:
                avg_rtt = total_rtt / received_packets
                print(f"最小值: {min_rtt}ms || 最大值: {max_rtt}ms || 平均值: {avg_rtt}ms")
                packet_loss = (sent_packets - received_packets) / sent_packets * 100
                print(f"丢包率: {packet_loss}%")
                jitter = calculate_mad(rtt_values)
                print(f"抖动: {jitter}ms")
    
                # 将指标插入数据库表
                insert_query = "INSERT INTO ping_data (timestamp, target_address, min_rtt, max_rtt, avg_rtt, jitter, packet_loss, rtt) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
    
                # 获取中国上海的时区对象
                shanghai_tz = pytz.timezone('Asia/Shanghai')
    
                # 获取当前时间
                current_time = datetime.now(shanghai_tz)
    
                # 将时间格式化为字符串,并应用于插入语句中的 timestamp 值
                insert_values = (current_time.strftime('%Y-%m-%d %H:%M:%S'), target_address, min_rtt, max_rtt, avg_rtt, jitter, packet_loss, result)
    
                # 执行插入操作
                cursor.execute(insert_query, insert_values)
                conn.commit()
    
            time.sleep(1)  # 每秒执行一次 Ping 操作
    
    # 配置文件路径
    config_file = 'ping_config.ini'
    
    # 开始监控 Ping
    monitor_ping(config_file)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    使用时,确保将以下内容替换为正确的值:

    • 用户名:数据库用户名。
    • 密码:数据库密码。
    • 数据库主机:数据库主机地址。
    • 数据库名:要使用的数据库名称。

    运行脚本后,它将每秒执行一次 Ping 操作,并将结果记录到数据库表 ping_data 中。表结构可以根据你的需求进行创建,包含以下字段:

    • timestamp:时间戳,记录插入数据的时间。
    • target_address:目标地址,记录 Ping 的目标地址。
    • min_rtt:最小往返时间。
    • max_rtt:最大往返时间。
    • avg_rtt:平均往返时间。
    • jitter:抖动。
    • packet_loss:丢包率。
    • rtt:Ping 的往返时间。

    通过运行该脚本,你将获得每次 Ping 的往返时间、最小值、最大值、平均值、抖动和丢包率等信息,并将其存储在数据库中。你可以根据需要自定义数据库表的结构,

    使用Grafana

    步骤1:安装和配置 Grafana

    1. 下载并安装 Grafana,你可以从 Grafana 官方网站(https://grafana.com)获取适合你操作系统的安装程序。
    2. 启动 Grafana 服务。
    3. 在 Web 浏览器中访问 Grafana 的地址(默认为 http://localhost:3000)。
    4. 使用默认的用户名和密码(admin/admin)登录 Grafana。
    5. 在首次登录时,将提示修改密码。按照指示进行操作。

    步骤2:配置 Grafana 数据源

    1. 在 Grafana 中,点击左侧导航栏中的 “Configuration”(配置)图标,然后选择 “Data Sources”(数据源)。
    2. 点击 “Add data source”(添加数据源)按钮。
    3. 选择适合你的数据库类型(如 MySQL)作为数据源类型。
    4. 根据你的数据库配置填写相关字段,如主机地址、用户名、密码和数据库名。
    5. 点击 “Save & Test”(保存并测试)按钮,确保连接成功。

    步骤3:创建 Grafana 仪表盘

    1. 在 Grafana 中,点击左侧导航栏中的 “Create”(创建)图标,然后选择 “Dashboard”(仪表盘)。
    2. 点击 “Add new panel”(添加新面板)按钮。
    3. 在 “Visualization”(可视化)选项卡中,选择适当的图表类型,如折线图或仪表盘。
    4. 在 “Queries”(查询)选项卡中,选择之前配置的数据源,并编写查询语句以获取所需的数据。
    5. 在 “Panel”(面板)选项卡中,根据你的需求设置图表的标题、样式和其他属性。
    6. 点击 “Apply”(应用)按钮,保存仪表盘设置。

    步骤4:将 Grafana 仪表盘嵌入到博客中

    1. 在 Grafana 中打开你创建的仪表盘。
    2. 点击右上角的 “Share”(分享)按钮。
    3. 在 “Share panel”(分享面板)选项卡中,选择适当的分享选项,如 “Direct link with time range”(带有时间范围的直接链接)。
    4. 复制生成的链接地址。
    5. 在你的博客文章中插入该链接地址,以嵌入 Grafana 仪表盘。

    完成上述步骤后,你将能够在 Grafana 中创建自定义的仪表盘,并将其嵌入到博客文章中,以便读者可以直接查看监控结果的可视化图表。

  • 相关阅读:
    Vue3的新特性总结
    在Bender对偶算法的时候出现bilinear项怎么办?
    【Python】AppUI自动化—appium自动化开发环境部署、APP测试案例(17)上
    【贪吃蛇小游戏】宝塔面板快速搭建贪吃蛇小游戏Web网站 - 无需云服务器
    ABP: 工作单元unitOfWork
    TiDB Lightning 命令行参数
    制作一个简单HTML旅游网站(HTML+CSS+JS)无锡旅游网页设计与实现8个页面
    Hive恢复误删数据表
    一种简单通用的获取函数栈空间大小的方法
    曲线任意里程中边桩坐标正反算4800P计算序
  • 原文地址:https://blog.csdn.net/weixin_44545838/article/details/134289673