Neustar Website Load Testing
米国の Neustar 社が提供しているサービスの一つで、Webサイトに対する負荷試験が行えます。 日本ではあまり馴染みが無いようで情報が少ないです。
有償サービスです。30日間のトライアルがあります。コーポレートサイトからは以下のようにリンクを辿ると行き着きます。
- Marketing, Risk, Security, Registry, and Communications | Neustar
- [Solutions] -> [Security Solutions] -> [Website Performance Management] -> [Website Load Testing]
有償サービスだけあって至れり尽くせりな感じなので、ある程度大きな規模、複雑なシナリオの負荷試験を行う場合は選択肢の一つになると思います。
- 負荷試験スケジュール設定が容易
- スクリプトの並列実行、実行割合設定
- 実行ロケーションが豊富
- 試験結果レポート自動生成
- 結果データをMySQL形式でダウンロード可能
test script
負荷試験実行には実行するスクリプトを作成する必要があります。
以前は neustar_script_recorder により Selenium IDE からスクリプト生成ができましたが、 Firefox 55 からは Selenium IDE が動作しなくなっています。
neustar の Scripting ページにあったリンクも既に消えています。
スクリプトの公式ドキュメントは以下になりますが、一から作成するのは中々骨が折れます。
biz.neustar.wpm.api (Neustar Web Performance Management Scripting API)
VirtualUser
GETやPOSTコマンドを使用してHTTPトラフィックをシミュレートします。 対して RealUser は実際のブラウザを使用したテストを行えます。が、VirtualUserより割高です。
サンプルスクリプト生成
本題です。
負荷試験用のスクリプトを作成するに当たり、ベースとなるサンプルスクリプトを生成します。
Neustar のアカウント登録は済ませている必要があります。
- Scripting Overview ページから [CREATE SAMPLE SCRIPT]
- 対象URLを入力
Google先生にご協力いただいています。
- CHECK 対象URL でスクリプトが生成される
この時点では RealUser 用のスクリプトです。 以下のようなスクリプトとなります(コメント行を除外したもの)。 openBrowser を基点としています。
var driver = openBrowser(); var c = driver.getHttpClient(); c.blacklistCommonUrls(); beginTransaction(function() { beginStep("Check Website", 30000, function() { driver.get("https://google.com"); waitForNetworkTrafficToStop(2000, 15000); }); });
- ページ下部にある [GENERATE BASIC SCRIPT] で VirtualUser 用に変換
そのまま押下すると名前重複エラーとなるため、Name: に任意の名前を入力後、 [GENERATE BASIC SCRIPT] を押下します。
変換されたものが別スクリプトとして作成されます。
以下のようなスクリプトとなります(一部抜粋)。 openHttpClient を基点としています。
var c = test.openHttpClient(); c.setFollowRedirects(false); test.beginTransaction(); test.beginStep("Check Website"); c.get("https://google.com/", 301); c.get("https://www.google.com/", 200); c.get("https://www.google.com/logos/doodles/2018/elizabeth-blackwells-197th-birthday-5658618786480128.3-s.png", 200); c.get("https://www.google.com/logos/doodles/2018/elizabeth-blackwells-197th-birthday-5658618786480128-l.png", 200); c.get("https://ssl.gstatic.com/gb/images/i1_1967ca6a.png", 200); c.get("https://www.google.com/xjs/_/js/k=xjs.s.en_US.raf7LOu-P_4.O/m=sx,sb,cdos,cr,elog,hsm,jsa,r,d,csi/am=wCLkeMEBEP8TgogEKwgsSAphGBA/rt=j/d=1/t=zcms/rs=ACT90oE6NwsHXuZlmER-n1nX33KRrVCWFQ", 200); var req = c.newPost("https://www.google.com/gen_204?s=webaft&atyp=csi&ei=3mx2WrTeFOrA5gLhtIjABQ&rt=wsrt.574,aft.263,prt.118"); req.setRequestBody("", "text/plain", "UTF-8"); req.execute(); c.get("https://www.google.com/textinputassistant/tia.png", 200); c.get("https://www.google.com/xjs/_/js/k=xjs.s.en_US.raf7LOu-P_4.O/m=d3l,aa,abd,async,dvl,foot,fpe,ifl,ipv6,lu,m,mu,sf,sonic/am=wCLkeMEBEP8TgogEKwgsSAphGBA/exm=sx,sb,cdos,cr,elog,hsm,jsa,r,d,csi/rt=j/d=1/ed=1/t=zcms/rs=ACT90oE6NwsHXuZlmER-n1nX33KRrVCWFQ?xjs=s1", 200); c.get("https://www.gstatic.com/og/_/js/k=og.og2.en_US.1KX-mFknZ_0.O/rt=j/m=def/exm=in,fot/d=1/ed=1/rs=AA2YrTuYBNXI2WfsWOZ7BwnBUE80MWT3Og", 200); c.get("https://apis.google.com/_/scs/abc-static/_/js/k=gapi.gapi.en.HtLvrA_npCQ.O/m=gapi_iframes,googleapis_client,plusone/rt=j/sv=1/d=1/ed=1/am=AAE/rs=AHpOoo8wHQU_A1WtgGgcOpQEfGjHuD8e-g/cb=gapi.loaded_0", 200); c.get("https://www.google.com/images/nav_logo242.png", 200); var req = c.newPost("https://www.google.com/gen_204?atyp=csi&ei=3mx2WrTeFOrA5gLhtIjABQ&s=webhp&imc=3&imn=3&imp=3&adh=&ima=2&ime=0&rt=aft.263,dcl.211,iml.263,ol.796,prt.118,xjs.529,xjsee.529,xjses.331,xjsls.176,wsrt.574,cst.0,dnst.0,rqst.266,rspt.302,rqstt.286,unt.249,cstt.249,dit.717&zx=1517710556974"); req.setRequestBody("", "null", "UTF-8"); req.execute(); c.get("https://adservice.google.com/adsid/google/ui", 204); var req = c.newPost("https://shavar.services.mozilla.com/downloads?client=navclient-auto-ffox&appver=45.9.0&pver=2.2"); req.setRequestBody("mozstd-track-digest256; mozstd-trackwhite-digest256; ", "text/plain", "UTF-8"); req.execute(); c.get("https://tracking-protection.cdn.mozilla.net/mozstd-track-digest256/1512580265", 200); c.get("https://tracking-protection.cdn.mozilla.net/mozstd-trackwhite-digest256/1512580265", 200); test.endStep(); test.endTransaction();
Validation Status: Invalid となっている通り、そのままだと実行できません。 残念ながら変換処理は完全な物では無いようです。
- [View Validation Results] からエラー参照
エラー内容に従いスクリプトを修正して、Validationを通します。
$ diff check.google.com.basic.js.org check.google.com.basic.js 37,38c37,38 < c.get("https://google.com/", 301); < c.get("https://www.google.com/", 200); --- > c.get("https://google.com/", 302); > c.get("https://www.google.com/", 302); 56,58c56 < req.setRequestBody("mozstd-track-digest256; < mozstd-trackwhite-digest256; < ", "text/plain", "UTF-8"); --- > req.setRequestBody("mozstd-track-digest256; mozstd-trackwhite-digest256; ", "text/plain", "UTF-8");
- [REVALIDATE]
正常に実行できると実行結果を参照できます。
Local Validator
VALIDATE をローカルで実行するツールが用意されています。
ローカルで VALIDATE を通した後、Neustar上で VALIDATE を通すのが基本になるかと思います。 NeustarのWEB画面はお世辞にも軽いとは言えないので、何度も実行する事を考えると辛いです。
- 実行例
# ダウンロードした local-validator.tar.gz を解凍後 # ./bin/validator "ScriptFile" $ ./bin/validator check.google.com.basic.js Neustar Web Performance Script Validator 4.27.33 Copyright (c) Neustar Inc - All Rights Reserved. VNC Support is NOT Available INFO 02/04 17:49:59 b.n.w.a.s.JavaScrip~ - LITE mode starting up INFO 02/04 17:49:59 b.n.w.a.s.JavaScrip~ - Starting script executor 0 INFO 02/04 17:49:59 b.n.w.a.a.Webmetric~ - Using DNS Server: [10.0.2.4, 10.0.130.4] INFO 02/04 17:50:04 b.n.w.a.s.JavaScrip~ - Script complete. INFO 02/04 17:50:04 b.n.w.v.ValidationR~ - Saving validation logs to 'validation.txt'... INFO 02/04 17:50:04 b.n.w.v.ValidationR~ - Saving Http Archive(HAR) to 'har.js'... # 結果確認 $ cat validation.txt ***** TEST PASSED ***** ===================================================== Script Log ===================================================== Tip: Calls to test.log('text') will log the supplied text to this field - great for debugging! ===================================================== Transaction information ===================================================== Start: Mon Feb 04 17:21:13 JST 2018 End: Mon Feb 04 17:21:20 JST 2018 Time Active: 6917ms Time Paused: 0ms Bytes Transfered: 1195973 Total Steps: 1 ===================================================== Check Website, 1 ===================================================== Start: Mon Feb 04 17:21:13 JST 2018 End: Mon Feb 04 17:21:20 JST 2018 Time Active: 6909ms Time Paused: 0ms Bytes Transferred: 1195973 Total Objects: 17 272b 302 467ms https://google.com/ 272b 302 505ms https://www.google.com/ 4480b 200 143ms https://www.google.com/logos/doodles/2018/elizabeth-blackwells-197th-birthday-5658618786480128.3-s.png 42566b 200 280ms https://www.google.com/logos/doodles/2018/elizabeth-blackwells-197th-birthday-5658618786480128-l.png 7325b 200 147ms https://ssl.gstatic.com/gb/images/i1_1967ca6a.png 424795b 200 721ms https://www.google.com/xjs/_/js/k=xjs.s.en_US.raf7LOu-P_4.O/m=sx,sb,cdos,cr,elog,hsm,jsa,r,d,csi/am=wCLkeMEBEP8TgogEKwgsSAphGBA/rt=j/d=1/t=zcms/rs=ACT90oE6NwsHXuZlmER-n1nX33KRrVCWFQ 0b 204 164ms https://www.google.com/gen_204?s=webaft&atyp=csi&ei=3mx2WrTeFOrA5gLhtIjABQ&rt=wsrt.574,aft.263,prt.118 258b 200 129ms https://www.google.com/textinputassistant/tia.png 74553b 200 198ms https://www.google.com/xjs/_/js/k=xjs.s.en_US.raf7LOu-P_4.O/m=d3l,aa,abd,async,dvl,foot,fpe,ifl,ipv6,lu,m,mu,sf,sonic/am=wCLkeMEBEP8TgogEKwgsSAphGBA/exm=sx,sb,cdos,cr,elog,hsm,jsa,r,d,csi/rt=j/d=1/ed=1/t=zcms/rs=ACT90oE6NwsHXuZlmER-n1nX33KRrVCWFQ?xjs=s1 138813b 200 629ms https://www.gstatic.com/og/_/js/k=og.og2.en_US.1KX-mFknZ_0.O/rt=j/m=def/exm=in,fot/d=1/ed=1/rs=AA2YrTuYBNXI2WfsWOZ7BwnBUE80MWT3Og 138670b 200 1034ms https://apis.google.com/_/scs/abc-static/_/js/k=gapi.gapi.en.HtLvrA_npCQ.O/m=gapi_iframes,googleapis_client,plusone/rt=j/sv=1/d=1/ed=1/am=AAE/rs=AHpOoo8wHQU_A1WtgGgcOpQEfGjHuD8e-g/cb=gapi.loaded_0 16786b 200 198ms https://www.google.com/images/nav_logo242.png 0b 204 299ms https://www.google.com/gen_204?atyp=csi&ei=3mx2WrTeFOrA5gLhtIjABQ&s=webhp&imc=3&imn=3&imp=3&adh=&ima=2&ime=0&rt=aft.263,dcl.211,iml.263,ol.796,prt.118,xjs.529,xjsee.529,xjses.331,xjsls.176,wsrt.574,cst.0,dnst.0,rqst.266,rspt.302,rqstt.286,unt.249,cstt.249,dit.717&zx=1517710556974 0b 204 514ms https://adservice.google.com/adsid/google/ui 162b 400 578ms https://shavar.services.mozilla.com/downloads?client=navclient-auto-ffox&appver=45.9.0&pver=2.2 57526b 200 411ms https://tracking-protection.cdn.mozilla.net/mozstd-track-digest256/1512580265 289495b 200 405ms https://tracking-protection.cdn.mozilla.net/mozstd-trackwhite-digest256/1512580265
WPM API
Neustar のWeb画面での各種操作(スクリプトやテスト実行)のAPIもあります。
まとめ
Neustar自体は負荷試験を欠ける側に気を使わなくて良いのは利点ですが、想定通りのテスト実行までの道のりは結構長く感じます。
実際の負荷試験シナリオはもっと複雑になるので、出力された物そのまま利用するだけでは不十分ですが、 取っ掛かりとしてサンプルスクリプト生成を行い修正していくのが楽なのかなと思います。