vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

Neustar Website Load Testing のサンプルスクリプト(VirtualUser)生成

Neustar Website Load Testing

米国の Neustar 社が提供しているサービスの一つで、Webサイトに対する負荷試験が行えます。 日本ではあまり馴染みが無いようで情報が少ないです。

有償サービスです。30日間のトライアルがあります。コーポレートサイトからは以下のようにリンクを辿ると行き着きます。

有償サービスだけあって至れり尽くせりな感じなので、ある程度大きな規模、複雑なシナリオの負荷試験を行う場合は選択肢の一つになると思います。

  • 負荷試験スケジュール設定が容易
  • 実行ロケーションが豊富
  • 試験結果レポート自動生成
    • 結果データをMySQL形式でダウンロード可能

test script

負荷試験実行には実行するスクリプトを作成する必要があります。

以前は neustar_script_recorder により Selenium IDE からスクリプト生成ができましたが、 Firefox 55 からは Selenium IDE が動作しなくなっています。

f:id:htnosm:20180205031417p:plain

neustar の Scripting ページにあったリンクも既に消えています。

f:id:htnosm:20180205031418p:plain

スクリプトの公式ドキュメントは以下になりますが、一から作成するのは中々骨が折れます。

biz.neustar.wpm.api (Neustar Web Performance Management Scripting API)

VirtualUser

GETやPOSTコマンドを使用してHTTPトラフィックをシミュレートします。 対して RealUser は実際のブラウザを使用したテストを行えます。が、VirtualUserより割高です。

サンプルスクリプト生成

本題です。
負荷試験用のスクリプトを作成するに当たり、ベースとなるサンプルスクリプトを生成します。
Neustar のアカウント登録は済ませている必要があります。

  • Scripting Overview ページから [CREATE SAMPLE SCRIPT]

f:id:htnosm:20180205031419p:plain

  • 対象URLを入力

f:id:htnosm:20180205031420p:plain

Google先生にご協力いただいています。

f:id:htnosm:20180205031421p:plain

この時点では 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 用に変換

f:id:htnosm:20180205031422p:plain

そのまま押下すると名前重複エラーとなるため、Name: に任意の名前を入力後、 [GENERATE BASIC SCRIPT] を押下します。

f:id:htnosm:20180205031423p:plain

変換されたものが別スクリプトとして作成されます。

以下のようなスクリプトとなります(一部抜粋)。 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] からエラー参照

f:id:htnosm:20180205031424p:plain

エラー内容に従いスクリプトを修正して、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]

f:id:htnosm:20180205031425p:plain

正常に実行できると実行結果を参照できます。

f:id:htnosm:20180205031426p:plain

Local Validator

VALIDATE をローカルで実行するツールが用意されています。

f:id:htnosm:20180205031427p:plain

ローカルで 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自体は負荷試験を欠ける側に気を使わなくて良いのは利点ですが、想定通りのテスト実行までの道のりは結構長く感じます。
実際の負荷試験シナリオはもっと複雑になるので、出力された物そのまま利用するだけでは不十分ですが、 取っ掛かりとしてサンプルスクリプト生成を行い修正していくのが楽なのかなと思います。