目录

在谷歌浏览器使用switchOmega设置Charles监听端口
下载地址:https://proxy-switchyomega.com/
安装:下载完成以后进入chrome浏览器-点击右上角“…”图标-点击更多根据-扩展程序-把刚刚下载的crx文件拖进来
配置:装上后点击浏览器右上角扩展程序图标-选择omega小程序-点击选项进行配置-可以查看到这个页面,127.0.0.1默认是本地的,端口输入8888是因为我们在上图配置的默认端口就是8888

这里记得选择HTTP,否则会连不上!!
接着,我们点击右上角的proxy工具,选择我们配置的代理,即可使用
这个时候去访问网页会出现这个提示,是因为我们jemter代理目前没启动,是正常的,大家不要慌

首先我们先来熟悉下jmeter页面的基础配置

1、HTTPS Domains:如果想要抓取http协议,这里可以不用配置,只有抓取https协议才需要配置,支持通配符
2、Target Controller:设置接收请求后要把参数写入的地方,默认是Use Recording Controller,支持选择其他配置
3、配置完后我们可以点击Start按钮进行启动,启动后它会自动的生成一个证书,并放在bin目录下


我们在没有导入证书的时候,访问时候是会报错的,会提示代理服务器出现问题,我们需要导入证书。需要进入刚刚那个文件夹目录,双击crt后缀的证书,进行如下操作


选择受信任的根证书办法机构,点击下一页,点击完成,它会弹出导入成功的弹框,至此证书安装完成!这个时候我们点击start按钮,然后运行代理以后,就可以正常的访问网页,进行抓包啦!

这里是我开启录制以后抓的包,非常多,很多没用的数据,我们可以过滤掉!我这边在url patterns to exclude/include里的过滤功能啦~这里支持正则表达式

拿到我们要的数据以后,我们可以点击点击上方绿色的运行的图标,这个时候它会运行线程组里的请求,为了方便查看,我们可以添加查看结果树(Thread Group-Add-Listener-View Results Tree)

我们新建线程组以后,可以对线程组一些参数进行配置:



尝试用单机操作了一下,当内存不够的时候会报错。因为单机的性能是很有限的,我们可以进行分布式测试。比如一台机器做jmeter控制端,再配置几台负载服务器。在发起几万个请求的时候,就可以均匀分布在这几台机器上做并发,可以给服务器造成更大压力
想要看下服务器有多大内存,我们可以去修改jmeter.sh的配置,这里默认是512,我们可以把它修改为4g然后保存

除了之前那个Thread Group线程组,jmeter还提供了另外2个线程组,分别是setUp和tearDown线程组

首先我们先来介绍导入功能:
如果我们在服务器上进行压测时,想要查看压测结果,可以把服务器生成的jtl文件导入这里进行展示

然后我们再来介绍3种监听器,分别是Listener View Result Tree,
AggreGate Report和Backend Listener
作用:把请求的返回结果在当前界面进行显示
路径:Thread Group-Add-Listener-View Results Tree
常用功能:
功能演示:

基于正则:

基于Json path:

作用:聚合报告,显示请求的响应时间,tps,传输数据大小,百分比等
路径:Thread Group-Add-Listener-AggreGate Report
参数:

作用:把想要显示的内容写入数据库里,通过图形化展示工具从数据库读取进行图形化展示,使之更为美观
使用命令行进行压测
在实际测试过程中我们很少使用图形化界面,还有查看结果树之类的选项,因为会占用资源,影响测试结果。我们一般把它部署到服务器上。下面我们来介绍如何使用命令行进行压测。
1、测试环境准备:确保服务器上已经安装了jdk和jmeter
检查linux系统上是否安装JDK,输入命令:java -version

上传 apache-jmeter-5.2.1.tgz 至linux服务器(可以使用sftp工具)
使用命令 tar -zxvf apache-jmeter-5.2.1.tgz 解压文件

将jmeter添加至配置文件中,使用命令 vim /etc/profile 打开配置文件,添加以下内容至配置文件中(环境变量不是必须配置的,如果不配置环境变量,运行脚本的时候要在bin目录下运行)
#jmeter 环境变量
export JMETER_HOME=/usr/local/jmeter/apache-jmeter-5.3
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH:$HOME/bin
:wq,回到控制台,使用命令 source /etc/profile 使配置文件生效(这里如果保存失败,大概率是权限问题,记得sudo -i)chmod +x jmeter 赋予权限./jmeter -v 查看jmeter是否正确安装,如果显示下图就表示安装成功啦~
/jmeter.sh -n -t test.jmx -l result.jtl| 参数 | 含义 |
|---|---|
| -n | 使用命令行运行 |
| -t | 指定测试计划 |
| -l | 指定结果的存放位置 |
测试计划是一个xml格式的文件,我们可以打开看下,我们可以在上传服务器后,我们也可以在这里修改文件的配置

压测界面:

为什么要使用分布式?
负载机(slaves):端口 tcp 1099(有防火墙的话尽量要开启该端口)
server.rmi.ssl.disable=truejava.rmi.server.hostname=192.168.31.61(ip地址修改为自己本机的,如果是window系统,可以cmd然后输入ipconfig进行查看,linux可以通过ifconfig查看)./jmeter-server
打开另一台服务器,编辑控制端的jmeter
1、控制端(master):端口 udp 4445
remote_hosts=192.168.31.61,192.168.31.63(支持多个,用逗号隔开)server.rmi.ssl.disable=true./jmeter-server,这个时候打开GUI,在运行这边即可查看到控制机器,我们就可以使用这些进行分布式压测啦~
/jmeter.sh -n -t test.jmx -l result.jtl -R 192.168.31.61,多个ip可以用逗号隔开| 参数 | 含义 |
|---|---|
| -n | 使用命令行运行 |
| -t | 指定测试计划 |
| -l | 指定结果的存放位置 |
| -R | 指定负载机ip |

jmeter运行的时候会产生很多数据,我们可以通过jmeter的组件backend listener,实时的把数据写入InfluxDB,然后Grafana工具会从InfluxDB读取数据,然后使用图形界面进行展示,具体架构如下:

docker network create grafana(不同容器想要互相通信必须在一个网络,所以需要新建容器网络)docker run -d --name=influxdb --network grafana -p 8086:8086 -v ${PWD}/influxdb/:/var/lib/influxdb/ influxdb:1.7.10| 语法 | 含义 |
|---|---|
| -d | 后台运行 |
| –name | 相当于域名,我们可以通过名字找到容器实际的ip地址 |
| –network | 指定具体网络 |
| -p | 指定端口号,jmeter通过这个端口写入数据到influxdb |
| -v | 把容器的数据库文件挂载在当前目录的influxdb目录 |
curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE jmeter"docker exec -it influxdb influx,执行语句 create dataase jmeter;


告警信息(如果是监控主机,设置规则cpu使用率超过80%要告警,一旦超过了这边会有告警提示,目前暂时用不到)

侧边栏的设置图标:这里可以用来配置数据源

侧边栏最后一个:系统管理(暂时用不到)

闲言少叙,我们进行操作
一、导入数据源配置
1、点击倒数第二个图标-Data Sources-Add data source-选择influxDB

参数如下:
url:写的容器名+端口号
ip:因为之前创建容器的时候容器名我们指定是influxdb,所以这里我们直接写的influxdb,端口号就填写之前我们映射的

当然这里也可以使用ip地址+端口号:172.18.0.2:8086(比较麻烦,不推荐)

Auth:认证方面的因为我们没有设置,所以略过
database:这里我们之前在influxdb创建了jmeter这个表,所以这里填写这个

Min time interval:提取/刷新时间,jmeter默认写数据到influxdb是5s一次,grafana去读取influxdb是10s一次,这里存在误差,想要精确读取数据,我们这里可以配置5s,这样就不会出现偏差。写完可以点击底下的sava&test按钮测试下

二、导入dashboard
dashboard支持自定义,但是比较麻烦,推荐使用别的开发者提供的jmeter的展示面板(https://grafana.com/grafana/dashboards/5496)
如果用不了可以看下版本是否符合要求

添加控制面板:进入dashboard-manage-import-输入上面的网址-点击load(第一次会提示失败,等几秒就好了)然后会进入下面的页面


三、执行jmeter脚本
现在我们去启动一个jmeter,执行下再来看grafana。这里注意,我们需要把influxdb和grafana都是要放到服务器里面的,然后需要公网ip。如果没有公网ip,可以放在同一个局域网,这样jmeter才能访问。
1、新建一个线程组-添加一个http请求-添加一个监听器-后端监听器实现选择influxdb的,见截图
这里我们需要修改一些配置,其他就默认先不改了

接着,我们点击运行按钮发起请求

这里我们注意下右上角的选项,比如我们选择last 5 mins,那5分钟后,如果没有新请求产生,这边就会显示空的数据

这边可以指定刷新频率,默认是关闭的,我们可以选择刷新频率

错误面板展示

在application里面选择刚刚新建的

这里可以看到事务的展示

接着,我们来关注下influxdb


存储具体的测试结果参数
本节介绍的是如何使用Prometheus监控被测服务器的相关性能指标
global:
scrape_interval: 15s # 抓取间隔
evaluation_interval: 15s # 收集时间间隔,配置报警时候这个值才起作用
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
# 指定服务器的ip地址和端口号
static_configs:
- targets: ['localhost:9091']
我们先在服务器vim prometheus.yml,然后把它上面的脚本黏贴进去,保存
docker run -d --name prometheus --network grafana -p 9091:9090 -v ${PWD}/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus:v2.16.0 --config.file=/etc/prometheus/prometheus.yml(-v xxx:把当前编辑的yml文件挂载到容器里的/etc/prometheus/promethues.yml文件里,后面再跟上Prometheus的镜像版本,config.file=/etc/prometheus/prometheus.yml:Prometheus运行时去指定容器里的配置文件)

Prometheus提供多种exporter来监控不同类型数据,比如jmx_exporter,snmp_exporter,mysqld_exporter…本次我们演示使用node exporter来监控主机的性能数据
下面我们进行安装
./node_exporter --help查看帮助信息
./node_exporter --web.listen-address=":9102"。如果服务器下有多个ip,比如内网外网,只想在内网显示出来,前面还可以加上ip地址./node_exporter --web.listen-address="192.234.2.2:9102",但是这样就会一直在前台运行,运行期间我们做不了其他操作,除非退出。我们可以加上nohub参数让它在后台运行:nohup ./node_exporter --web.listen-address=":9102" &安装成功以后我们可以输入被测机ip+端口号进行访问。
点进去时候显示的内容和Prometheus里显示的是一样的,都是一些性能参数,Prometheus会定期抓取,然后存入数据库

编辑prometheus.yml配置文件,在末尾添加上刚刚的exporter:vim prometheus.yml ,保存
- job_name: 'exporter http://10.218.220.218:9100/'
static_configs:
- targets: ['10.218.220.218:9100']
job_name支持自定义,targets里面填写exporter那台机器的ip和配置的端口号

重启docker,使其生效:docker restart prometheus
我们回到页面,可以看到此时多了1个我们刚刚配的

因为这个界面不太好看,我们这边用grafana进行展示。

https://grafana.com/grafana/dashboards/8919,点击load


我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h