Jmeter+influxdb+Grafana实现可视化压测

267 阅读5分钟
  1. 背景

本文主要是记录最近对系统进行压测时,搭建和使用Jmeter对系统进行压测,以及通过部署influxdb来收集压测数据,并通过配置Grafana面板来展示压测时的数据

  1. Jmeter GUI 使用

对于刚接触Jmeter的用户来说,先通过Jmeter GUI来熟悉Jmeter是一种比较好的途径

  1. 实现一个简单的Jmeter压测

  1. 下载并配置JDK并配置PATH

此处自行进行下载并配置系统path

  1. 下载并配置Jmeter Path

此处自行进行下载Jmeter压缩包,并配置系统配置

  1. 启动Jmeter GUI并配置压测

windows环境下打开bin目录下的Jmeter.bat,之后会打开Jmeter GUI,如图所示

在 apache-jmeter-5.6.3\bin\Jmeter.properties 文件中包含了Jmeter的很多配置,包括语言环境等

  1. Jmeter Plugs Manager的配置和使用

1、下载jmeter-plugins-manager-1.9.jar、JMeterPlugins-Extras.jar、JMeterPlugins-Standard.jar

链接:pan.baidu.com/s/1XY8o7F2c…

提取码:t1m6

将其放置 Jmeter安装目录 lib/ext 下 2、然后重新打开Jmeter

点击 Options – Plugins Manager

选择需要安装的插件信息,jpgc-Standard Set

点击右下角 Install 3、安装后重启Jmeter 4、点击添加线程组页面、可查到

5、监控jp@gc - PerfMon Metrics Collector的使用 链接:pan.baidu.com/s/1SVw9IDP_… 提取码:2dvc a.下载“ServerAgent-2.2.3”,解压到复制到要监控的服务器上,windows和linux通用,使用这个代理服务之前要JDK已经安装配置成功。我这边以centos为例。

若无解压工具、先安装 yum -y install zip unzip 解压 unzip ServerAgent-2.2.3.zip b.进入解压后的ServerAgent-2.2.3文件中 执行 命令 ./startAgent.sh 注意:如果权限不够、就进行权限赋值 chmod 775 startAgent.sh 然后再次启动代理服务,出现如下提示证明成功了,默认端口4444。

查看启动脚本 为非后台启动 可以修改为 后台启动 nohup java -jar CMDRunner.jar --tool PerfMonAgent “$@” & 6、添加资源监控 在JMeter脚本中添加“jp@gc - PerfMon Metrics Collector”监听器

Metric to Collect:根据监控的要求可以选择CPU,Disks I/O,Network I/O等,一次只能选择一个,如果要监控多种资源,可以点击“Add Row”继续添加

  1. 配置一个Jmeter的压测

一个简单的Http请求的压测配置如图所示,一般包含以下配置原件

  • 线程组 - 工作线程的容器可以理解为线程池,用来执行发起请求的能力

    • Http请求 - 配置你的要压测的http请求接口配置

      • http相关的请求头的配置
    • 查看结果树 - 记录压测的每一个请求的详情,包括请求头,请求体,响应

    • 聚合树 - 查看请求的统计信息

配置好之后可以对你的压测配置进行保存到本地,形成一个jmx文件,后续可以直接使用这个文件在非GUI环境,比如Linux机器上使用这个配置文件进行压测

  1. Linux下Jmeter使用

首先是配置,同样需要Linux机器上有相应的JDK 以及 Jmeter解压包,最好都配置下PATH,之后就可以在Linux上通过压测脚本进行压测了,一个参考的压测脚本如下:

然后执行 jmeter_test_script_6k.sh start 进行启动压测

#!/bin/bash

# JMeter压力测试执行脚本
# 作者: 
# 日期: $(date +%Y-%m-%d)

# 配置变量
JMETER_HOME="/root/jmeter/apache-jmeter-5.6.3"
TEST_PLAN="/root/jmeter/fepPress6k.jmx"
BASE_DIR="/root/jmeter"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

# 结果文件路径
RESULT_FILE="${BASE_DIR}/results/fep_test_${TIMESTAMP}.jtl"
REPORT_DIR="${BASE_DIR}/reports/fep_report_${TIMESTAMP}"
LOG_FILE="${BASE_DIR}/logs/fep_test_${TIMESTAMP}.log"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印带颜色的信息
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查函数
check_prerequisites() {
    print_info "检查运行环境..."
    
    # 检查Java
    if ! command -v java &> /dev/null; then
        print_error "Java未安装或未在PATH中"
        exit 1
    fi
    
    # 检查JMeter
    if [ ! -f "${JMETER_HOME}/bin/jmeter" ]; then
        print_error "JMeter不存在: ${JMETER_HOME}/bin/jmeter"
        exit 1
    fi
    
    # 检查测试计划文件
    if [ ! -f "${TEST_PLAN}" ]; then
        print_error "测试计划文件不存在: ${TEST_PLAN}"
        exit 1
    fi
    
    print_success "环境检查通过"
}

# 创建目录
create_directories() {
    print_info "创建必要的目录..."
    mkdir -p "${BASE_DIR}/results"
    mkdir -p "${BASE_DIR}/reports"
    mkdir -p "${BASE_DIR}/logs"
    print_success "目录创建完成"
}

# 显示配置信息
show_config() {
    echo ""
    print_info "=== 测试配置信息 ==="
    echo "JMeter路径: ${JMETER_HOME}"
    echo "测试计划: ${TEST_PLAN}"
    echo "结果文件: ${RESULT_FILE}"
    echo "报告目录: ${REPORT_DIR}"
    echo "日志文件: ${LOG_FILE}"
    echo "时间戳: ${TIMESTAMP}"
    echo ""
}

# 执行测试
run_test() {
    print_info "开始执行JMeter压力测试..."
    
    # 切换到JMeter目录
    cd "${JMETER_HOME}/bin" || exit 1
    
    # 执行JMeter测试
    nohup ./jmeter -n -t "${TEST_PLAN}" \
        -l "${RESULT_FILE}" \
        -e -o "${REPORT_DIR}" \
        -Juser.timezone=Asia/Shanghai \
        > "${LOG_FILE}" 2>&1 &
    
    # 获取进程ID
    JMETER_PID=$!
    
    print_success "JMeter测试已在后台启动"
    print_info "进程ID: ${JMETER_PID}"
    
    # 将PID保存到文件
    echo "${JMETER_PID}" > "${BASE_DIR}/jmeter.pid"
    
    return 0
}

# 监控测试状态
monitor_test() {
    if [ ! -f "${BASE_DIR}/jmeter.pid" ]; then
        print_error "找不到JMeter进程ID文件"
        return 1
    fi
    
    JMETER_PID=$(cat "${BASE_DIR}/jmeter.pid")
    
    print_info "监控测试进程 (PID: ${JMETER_PID})"
    print_info "按 Ctrl+C 退出监控(不会停止测试)"
    
    while kill -0 "${JMETER_PID}" 2>/dev/null; do
        if [ -f "${RESULT_FILE}" ]; then
            LINES=$(wc -l < "${RESULT_FILE}" 2>/dev/null || echo "0")
            print_info "当前已执行请求数: $((LINES-1))"
        fi
        sleep 10
    done
    
    print_success "测试已完成"
}

# 显示测试结果
show_results() {
    if [ -f "${RESULT_FILE}" ]; then
        print_success "测试结果文件: ${RESULT_FILE}"
        TOTAL_REQUESTS=$(wc -l < "${RESULT_FILE}")
        print_info "总请求数: $((TOTAL_REQUESTS-1))"
    fi
    
    if [ -d "${REPORT_DIR}" ]; then
        print_success "HTML报告目录: ${REPORT_DIR}"
        print_info "可以通过浏览器打开: ${REPORT_DIR}/index.html"
    fi
    
    if [ -f "${LOG_FILE}" ]; then
        print_success "日志文件: ${LOG_FILE}"
    fi
}

# 停止测试
stop_test() {
    if [ -f "${BASE_DIR}/jmeter.pid" ]; then
        JMETER_PID=$(cat "${BASE_DIR}/jmeter.pid")
        if kill -0 "${JMETER_PID}" 2>/dev/null; then
            print_warning "正在停止JMeter测试 (PID: ${JMETER_PID})"
            kill "${JMETER_PID}"
            sleep 5
            if kill -0 "${JMETER_PID}" 2>/dev/null; then
                print_warning "强制停止JMeter测试"
                kill -9 "${JMETER_PID}"
            fi
            print_success "JMeter测试已停止"
        else
            print_info "JMeter测试已经停止"
        fi
        rm -f "${BASE_DIR}/jmeter.pid"
    else
        print_warning "找不到JMeter进程ID文件"
    fi
}

# 清理旧文件
cleanup_old_files() {
    print_info "清理7天前的测试文件..."
    find "${BASE_DIR}/results" -name "*.jtl" -mtime +7 -delete 2>/dev/null
    find "${BASE_DIR}/reports" -type d -mtime +7 -exec rm -rf {} + 2>/dev/null
    find "${BASE_DIR}/logs" -name "*.log" -mtime +7 -delete 2>/dev/null
    print_success "清理完成"
}

# 显示帮助信息
show_help() {
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  start     启动JMeter压力测试"
    echo "  stop      停止JMeter压力测试"
    echo "  monitor   监控测试进度"
    echo "  status    查看测试状态"
    echo "  cleanup   清理旧的测试文件"
    echo "  help      显示此帮助信息"
    echo ""
}

# 查看测试状态
show_status() {
    if [ -f "${BASE_DIR}/jmeter.pid" ]; then
        JMETER_PID=$(cat "${BASE_DIR}/jmeter.pid")
        if kill -0 "${JMETER_PID}" 2>/dev/null; then
            print_success "JMeter测试正在运行 (PID: ${JMETER_PID})"
            
            # 显示最新的结果文件信息
            LATEST_RESULT=$(ls -t "${BASE_DIR}/results"/*.jtl 2>/dev/null | head -1)
            if [ -f "${LATEST_RESULT}" ]; then
                LINES=$(wc -l < "${LATEST_RESULT}")
                print_info "当前请求数: $((LINES-1))"
                print_info "结果文件: ${LATEST_RESULT}"
            fi
        else
            print_warning "JMeter进程不存在,但PID文件存在"
            rm -f "${BASE_DIR}/jmeter.pid"
        fi
    else
        print_info "JMeter测试未运行"
    fi
}

# 主函数
main() {
    case "${1:-start}" in
        "start")
            check_prerequisites
            create_directories
            show_config
            run_test
            print_info "使用 '$0 monitor' 监控测试进度"
            print_info "使用 '$0 stop' 停止测试"
            ;;
        "stop")
            stop_test
            ;;
        "monitor")
            monitor_test
            show_results
            ;;
        "status")
            show_status
            ;;
        "cleanup")
            cleanup_old_files
            ;;
        "help"|"-h"|"--help")
            show_help
            ;;
        *)
            print_error "未知选项: $1"
            show_help
            exit 1
            ;;
    esac
}

# 脚本入口
main "$@"

  1. 使用influxdb收集并配置Grafana展示面板

同时可以使用influxdb来对Jmeter的压测信息进行收集,并使用Grafana 配置influxdb 数据源进行展示Jmeter的压测数据

  1. 安装Influxdb

tar.gz安装包安装

wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.4_linux_amd64.tar.gz

[root@iZ8vb7u9c6qu93ecd45frhZ media]# ll
total 289780
-rw-r--r-- 1 root root 83911070 Mar  1 21:36 grafana-enterprise-8.4.2.linux-amd64.tar.gz
-rw-r--r-- 1 root root 63153191 May  6  2021 influxdb-1.7.9.x86_64.rpm
-rw-r--r-- 1 root root 64420310 Jan 28  2021 influxdb-1.8.4_linux_amd64.tar.gz
-rw-r--r-- 1 root root  9033415 Dec  8 16:52 node_exporter-1.3.1.linux-amd64.tar.gz
-rw-r--r-- 1 root root 76202164 Feb 28 23:58 prometheus-2.34.0-rc.0.linux-amd64.tar.gz

解压并移动到/usr/local下

tar -zxvf influxdb-1.8.4_linux_amd64.tar.gz
mv influxdb-1.8.4_linux_amd64  /usr/local/influxdb

设置软连接

ln -s /usr/local/influxdb/usr/bin/influx /usr/local/bin/influx
ln -s /usr/local/influxdb/usr/bin/influx /usr/local/bin/influxd

启动influxdb

#启动
influxd

#进入数据库命令行
influx

进入数据库命令行创建数据库、用户、密码为空

influx
>create database jmeter
>show databases
>use jmeter
>CREATE USER "root" WITH PASSWORD 'root' WITH ALL PRIVILEGES 
>exit

rpm包安装

下载安装包

wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.9.x86_64.rpm

[root@iZ8vb7u9c6qu93ecd45frhZ media]# ll
total 289780
-rw-r--r-- 1 root root 83911070 Mar  1 21:36 grafana-enterprise-8.4.2.linux-amd64.tar.gz
-rw-r--r-- 1 root root 63153191 May  6  2021 influxdb-1.7.9.x86_64.rpm
-rw-r--r-- 1 root root 64420310 Jan 28  2021 influxdb-1.8.4_linux_amd64.tar.gz
-rw-r--r-- 1 root root  9033415 Dec  8 16:52 node_exporter-1.3.1.linux-amd64.tar.gz
-rw-r--r-- 1 root root 76202164 Feb 28 23:58 prometheus-2.34.0-rc.0.linux-amd64.tar.gz

安装

yum localinstall -y grafana-6.5.1-1.x86_64.rpm

启动influxdb

systemctl start influxd &

安装启动后同样需要创建数据库及账号,同上

  1. 配置Grafana

填写数据库及账号密码(根据实际创建填写)后点击,save&test

Granfana导入jmeter面板

选择一个写好的面板Apache JMeter Dashboard using Core InfluxdbBackendListenerClient dashboard for Grafana | Grafana Labs导入即可

填写数据库类型及数据库名称,点击import

配置Jmeter

在Jmeter中添加后端监听器配置如图,启动jmeter后查看Grafana面板数据

参考:

blog.csdn.net/weixin_4591…

blog.csdn.net/u012002125/…