{"id":10092,"date":"2023-01-17T18:32:32","date_gmt":"2023-01-17T09:32:32","guid":{"rendered":"https:\/\/www.ecomottblog.com\/?p=10092"},"modified":"2023-01-17T18:32:32","modified_gmt":"2023-01-17T09:32:32","slug":"k6-%e5%bf%9c%e7%94%a8%e4%be%8b%e3%81%9d%e3%81%ae%ef%bc%91%ef%bc%9a%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e8%aa%8d%e8%a8%bc%e5%9e%8bweb%e3%82%b5%e3%82%a4%e3%83%88%e3%81%b8%e3%81%ae%e8%b2%a0%e8%8d%b7","status":"publish","type":"post","link":"https:\/\/www.ecomottblog.com\/?p=10092","title":{"rendered":"k6 \u5fdc\u7528\u4f8b\u305d\u306e\uff11\uff1a\u30ed\u30b0\u30a4\u30f3\u8a8d\u8a3c\u578bWeb\u30b5\u30a4\u30c8\u3078\u306e\u8ca0\u8377\u8a66\u9a13\u306e\u4e00\u62ec\u5b9f\u884c"},"content":{"rendered":"<p>\u30af\u30e9\u30a6\u30c9\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u90e8\u306e\u85e4\u4e95\u3067\u3059\u3002<\/p>\n<p>\u8ca0\u8377\u8a66\u9a13\u30c4\u30fc\u30eb k6 \u306e\u7d39\u4ecb\u8a18\u4e8b\u306e\u7b2c\uff12\u5f3e\u3068\u3057\u3066\u3001\u5fdc\u7528\u4f8b\u3092\u89e3\u8aac\u3055\u305b\u3066\u3044\u305f\u3060\u304d\u307e\u3059\u3002<br \/>\nk6 \u3063\u3066\u4f55\u3060\u308d\u3046\u3068\u3044\u3046\u65b9\u306f\u3001\u305c\u3072<a href=\"https:\/\/www.ecomottblog.com\/?p=9962\">\u3053\u3061\u3089\u306e\u8a18\u4e8b<\/a>\u3092\u3054\u53c2\u7167\u304f\u3060\u3055\u3044\u3002<\/p>\n<p><!--more--><br \/>\nk6 \u306f\u516c\u5f0f\u30b5\u30a4\u30c8\u306b\u300c<a href=\"https:\/\/k6.io\/our-beliefs\/#simple-testing-is-better-than-no-testing\">\u30b7\u30f3\u30d7\u30eb\u306a\u30c6\u30b9\u30c8\u3067\u3082\u3001\u7121\u3044\u3088\u308a\u306f\u307e\u3057<\/a>\u300d\u3068\u3042\u308b\u3088\u3046\u306b\u3001\u6700\u521d\u304b\u3089\u8907\u96d1\u306a\u8a2d\u5b9a\u3084\u30b3\u30fc\u30c9\u304c\u30d5\u30eb\u30bb\u30c3\u30c8\u3067\u5fc5\u8981\u3067\u306f\u306a\u304f\u3001JavaScript\u3067\u63d0\u4f9b\u3055\u308c\u3066\u3044\u308b\u5c0f\u3055\u306a\u72ec\u7acb\u3057\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u67d4\u8edf\u306b\u7d44\u307f\u5408\u308f\u305b\u3066\u4f7f\u3046\u3053\u3068\u304c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306f\u8a66\u9a13\u5bfe\u8c61\u3068\u3057\u3066\u3001Cookie\u3092\u4f7f\u3063\u305f\u30ed\u30b0\u30a4\u30f3\u6a5f\u80fd\u3092\u6301\u3064\u5178\u578b\u7684\u306aWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u60f3\u5b9a\u3057\u3001\u5c11\u3057\u8907\u96d1\u306a\u4ee5\u4e0b\u306e\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3001\u30b3\u30fc\u30c9\u306e\u4f8b\u3092\u4ea4\u3048\u3066\u89e3\u8aac\u81f4\u3057\u307e\u3059\u3002<\/p>\n<p>\u30fbHAR\u30d5\u30a1\u30a4\u30eb\u5229\u7528\u306b\u3088\u308b\u8a66\u9a13\u30b7\u30ca\u30ea\u30aa\u5b9a\u7fa9\u306e\u7c21\u7565\u5316<br \/>\n\u30fb\u4e00\u62ec\u5b9f\u884c\u3068Group\u5225\u306e\u5b9f\u884c\u7d50\u679c\u306e\u8868\u793a<br \/>\n\u30fbVUS\u3054\u3068\u306e\u30ed\u30b0\u30a4\u30f3\u60c5\u5831\u306e\u4e8b\u524d\u5b9a\u7fa9<br \/>\n\u30fbCookie\u3068\u52d5\u7684\u30c7\u30fc\u30bf\u306e\u5229\u7528\uff08\u30ed\u30b0\u30a4\u30f3\u8a8d\u8a3c\u3068\u30af\u30ed\u30b9\u30b5\u30a4\u30c8\u30b9\u30af\u30ea\u30d7\u30c6\u30a3\u30f3\u30b0\u5bfe\u7b56\u306b\u3088\u308b\u610f\u56f3\u3057\u306a\u3044\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u306e\u6291\u5236\u5bfe\u5fdc\uff09<\/p>\n<h2>HAR\u30d5\u30a1\u30a4\u30eb\u306e\u5229\u7528<\/h2>\n<h3>HAR\u306e\u4f5c\u6210<\/h3>\n<p>k6 \u306e\u8a66\u9a13\u30b7\u30ca\u30ea\u30aa\u3092\u4f5c\u6210\u30fb\u5b9f\u884c\u3059\u308b\u306b\u3042\u305f\u308a\u3001\uff11\u30ea\u30af\u30a8\u30b9\u30c8\u305a\u3064 JavaScript\u3067\u5b9a\u7fa9\u3057\u3066\u3044\u304f\u306e\u3067\u306f\u306a\u304f\u3001\u30d6\u30e9\u30a6\u30b6\u3067\u5b9f\u969b\u306b\u52d5\u304b\u3057\u305f\u3068\u304d\u306e\u30af\u30ed\u30fc\u30eb\u30c7\u30fc\u30bf\u3092\u5143\u306b\u3057\u3066\u5b9f\u884c\u3059\u308b\u3088\u3046\u306b\u3057\u305f\u3044\u5834\u5408\u306b\u3001HAR(HTTP \u30a2\u30fc\u30ab\u30a4\u30d6) \u3092\u5229\u7528\u3059\u308b\u3068\u3044\u3046\u624b\u6bb5\u304c\u3042\u308a\u307e\u3059\u3002HAR\u306b\u306f HTTP\u30ea\u30af\u30a8\u30b9\u30c8\u3068\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u60c5\u5831\u304c\u8a18\u9332\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>HAR\u306b\u3064\u3044\u3066\u306f k6 \u516c\u5f0f\u304b\u3089\u3001 <a href=\"https:\/\/k6.io\/docs\/test-authoring\/recording-a-session\/browser-recorder\/\">Google Chrome \u3084 Firefox \u306e\u62e1\u5f35\u6a5f\u80fd<\/a>\u3084\u3001<a href=\"https:\/\/k6.io\/docs\/test-authoring\/recording-a-session\/har-converter\/\">HAR\u30b3\u30f3\u30d0\u30fc\u30bf\u30fc<\/a> \u304c\u63d0\u4f9b\u3055\u308c\u3066\u3044\u307e\u3059\u304c\u3001\u4eca\u56de\u306f\u516c\u5f0f\u306e\u30c4\u30fc\u30eb\u7fa4\u306f\u4f7f\u308f\u305a\u306b Chrome\u306e\u958b\u767a\u8005\u30c4\u30fc\u30eb\u3068\u30c6\u30ad\u30b9\u30c8\u30a8\u30c7\u30a3\u30bf\u3067 HAR\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u3053\u308c\u306f\u3001\u666e\u6bb5\u306f\u4f7f\u308f\u306a\u3044\u30d6\u30e9\u30a6\u30b6\u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u305f\u304f\u306a\u3044\u3053\u3068\u3068\u3001\u3072\u3068\u3064\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u3067\u4e00\u62ec\u5b9f\u884c\u3057\u305f\u3044\u305f\u3081\u3067\u3059\u3002<\/p>\n<p>Chrome\u306e\u958b\u767a\u8005\u30c4\u30fc\u30eb\u3067\u306f\u3001\u9001\u53d7\u4fe1\u3055\u308c\u308b\u753b\u50cf\u30c7\u30fc\u30bf\u306a\u3069\u3082\u542b\u3081\u3066\u300c\u30b3\u30f3\u30c6\u30f3\u30c4\u3068\u4e00\u7dd2\u306bHAR\u3068\u3057\u3066\u3059\u3079\u3066\u4fdd\u5b58\u300d\u3059\u308b\u65b9\u6cd5\u3082\u63d0\u4f9b\u3055\u308c\u3066\u3044\u307e\u3059\u304c\u3001\u3053\u306e\u8a18\u4e8b\u3067\u306f\u7c21\u7565\u5316\u306e\u305f\u3081\u3001\u753b\u50cf\u306a\u3069\uff08\u3044\u308f\u3086\u308b\u30e1\u30c7\u30a3\u30a2\u30c7\u30fc\u30bf\uff09\u306e\u30c6\u30b9\u30c8\u306f\u4e0d\u8981\u3068\u3057\u307e\u3059\u3002\u3067\u3059\u306e\u3067\u4ee3\u308f\u308a\u306b\u3001\u53f3\u30af\u30ea\u30c3\u30af\u30e1\u30cb\u30e5\u30fc\u306e\u300c\u30b3\u30d4\u30fc\u300d\u2192\u300cHAR\u3068\u3057\u3066\u3059\u3079\u3066\u30b3\u30d4\u30fc\u300d\u3067\u3001\u8efd\u91cf\u306a\u30c6\u30ad\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u307f\u3067 HAR\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<p>\u4ee5\u4e0b\u306e\u624b\u9806\u3067\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002<\/p>\n<h4>1. Chrome\u958b\u767a\u8005\u30c4\u30fc\u30eb\u3092 F12 \u7b49\u3067\u958b\u304d\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30bf\u30d6\u3092\u958b\u304d\u307e\u3059<\/h4>\n<h4>2. \u958b\u304d\u305f\u3044\u753b\u9762\u3092\u958b\u304f\u524d\u306b\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30bf\u30d6\u306e\u300c\u6d88\u53bb\u300d\u30dc\u30bf\u30f3\u3092\u62bc\u4e0b\u3057\u3066\u3001\u7dba\u9e97\u306b\u3057\u3066\u304a\u304d\u307e\u3059<\/h4>\n<div id=\"attachment_10169\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_01.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-10169\" class=\"wp-image-10169 size-medium\" src=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_01-300x148.png\" alt=\"\" width=\"300\" height=\"148\" srcset=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_01-300x148.png 300w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_01-768x378.png 768w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_01-304x150.png 304w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_01-282x139.png 282w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_01.png 934w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-10169\" class=\"wp-caption-text\">\u203b\u30af\u30ea\u30c3\u30af\u3067\u62e1\u5927\u3057\u307e\u3059<\/p><\/div>\n<h4>3. \u958b\u304d\u305f\u3044\u753b\u9762\u3092\u958b\u304f\u3068\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u901a\u4fe1\u304c\u8d70\u308a\u307e\u3059<\/h4>\n<h4>4. \u901a\u4fe1\u304c\u843d\u3061\u7740\u3044\u305f\u6642\u70b9\u3067\u3001\u4e00\u89a7\u90e8\u5206\u3092\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3066\u300cHAR\u3068\u3057\u3066\u3059\u3079\u3066\u30b3\u30d4\u30fc\u300d\u3057\u307e\u3059<\/h4>\n<div id=\"attachment_10168\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_02.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-10168\" class=\"wp-image-10168 size-medium\" src=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_02-300x176.png\" alt=\"\" width=\"300\" height=\"176\" srcset=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_02-300x176.png 300w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_02-768x451.png 768w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_02-304x179.png 304w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_02-282x166.png 282w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2023\/01\/ecomottblog_k6_grp_02.png 974w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-10168\" class=\"wp-caption-text\">\u203b\u30af\u30ea\u30c3\u30af\u3067\u62e1\u5927\u3057\u307e\u3059<\/p><\/div>\n<h4>5. \u30b3\u30d4\u30fc\u3057\u305f\u5185\u5bb9\u3092\u4efb\u610f\u306e\u30c6\u30ad\u30b9\u30c8\u30a8\u30c7\u30a3\u30a2\u306b\u5f35\u308a\u4ed8\u3051\u3066\u3001HAR\u30d5\u30a1\u30a4\u30eb\u683c\u7d0d\u5148\u306e\u30d5\u30a9\u30eb\u30c0\uff08\u4eca\u56de\u306f .\/hars \uff09\u306b\u4efb\u610f\u306e\u30d5\u30a1\u30a4\u30eb\u540d\u3067\u4fdd\u5b58\u3057\u307e\u3059<\/h4>\n<div id=\"attachment_10095\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_03.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-10095\" class=\"wp-image-10095 size-medium\" src=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_03-300x153.png\" alt=\"\" width=\"300\" height=\"153\" srcset=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_03-300x153.png 300w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_03-768x392.png 768w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_03-1024x522.png 1024w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_03-304x155.png 304w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_03-282x144.png 282w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_03.png 1063w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-10095\" class=\"wp-caption-text\">\u203b\u30af\u30ea\u30c3\u30af\u3067\u62e1\u5927\u3057\u307e\u3059<\/p><\/div>\n<blockquote><p>\u203b\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u540d\u306f\u3001\u7d50\u679c\u8868\u793a\u6642\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u540d\u306b\u306f\u30c6\u30b9\u30c8\u5bfe\u8c61\u306eURL\u306e\u4e00\u90e8\u3092\u4f7f\u3046\u306e\u304c\u624b\u3063\u53d6\u308a\u65e9\u3044\u3067\u3059\uff08\u4f8b\u3048\u3070\u30d9\u30fc\u30b9URL\u304c https:\/\/example.com\/testapp\/ \u306eWeb\u30b5\u30a4\u30c8\u306e\u5834\u5408\u306f https:\/\/example.com\/testapp\/user\/ \u306e\u30af\u30ed\u30fc\u30ebHAR\u30d5\u30a1\u30a4\u30eb\u306f user.har \u306b\u3059\u308b\u7b49\uff09\u3002\u57fa\u672c\u7684\u306b\u3069\u306eOS\u3067\u3082\u30d5\u30a1\u30a4\u30eb\u540d\u306b\u534a\u89d2\u30b9\u30e9\u30c3\u30b7\u30e5\u306f\u4f7f\u3048\u307e\u305b\u3093\u3002\u305d\u306e\u305f\u3081\u3001\u4f8b\u3048\u3070&nbsp; user\/create \u3068\u3057\u3066\u7d50\u679c\u8868\u793a\u3057\u305f\u3044\u30af\u30ed\u30fc\u30eb\u306eHAR\u306e\u5834\u5408\u306f\u3001\u5c11\u3057\u5f37\u5f15\u3067\u3059\u304c\u534a\u89d2\u30b9\u30e9\u30c3\u30b7\u30e5\u3092\u300c___\uff08\uff13\u9023\u7d9a\u306e\u534a\u89d2\u4e0b\u7dda\uff09\u300d\u306b\u7f6e\u63db\u3057\u3066 user___create.har \u3068\u3057\u3066\u4fdd\u5b58\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u305d\u3046\u3059\u308c\u3070\u5f8c\u8ff0\u3059\u308bHAR\u30d5\u30a1\u30a4\u30eb\u8aad\u8fbc\u51e6\u7406\u306b\u3066\u534a\u89d2\u30b9\u30e9\u30c3\u30b7\u30e5\u3078\u623b\u3055\u308c\u307e\u3059\u3002<\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10096 size-full\" src=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_03_hars.png\" alt=\"\" width=\"265\" height=\"224\" srcset=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_03_hars.png 265w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_03_hars-253x214.png 253w\" sizes=\"(max-width: 265px) 100vw, 265px\" \/><\/p>\n<h3>\u8a66\u9a13\u5bfe\u8c61URL\u306e\u7f6e\u63db\u3068\u62bd\u51fa<\/h3>\n<p>HAR\u30d5\u30a1\u30a4\u30eb\u306b\u306f\u3001\u5bfe\u8c61Web\u30b5\u30a4\u30c8\u306e\u30db\u30b9\u30c8\u540d\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002\u305d\u306e\u305f\u3081\u3001\u5358\u7d14\u306bHAR\u30d5\u30a1\u30a4\u30eb\u304b\u3089URL\u3092\u62fe\u3063\u3066\u3057\u307e\u3046\u3068\u3001HAR\u3092\u4f5c\u6210\u3057\u305f\u74b0\u5883\u3067\u3057\u304b\u8a66\u9a13\u3067\u304d\u307e\u305b\u3093\u3002<\/p>\n<p>\u5b9f\u52d9\u3067\u3088\u304f\u3042\u308b\u69cb\u6210\u3068\u3057\u3066\u3001\u672c\u756a\u74b0\u5883\u3068\u306f\u5225\u306b\u3001\u958b\u767a\u74b0\u5883\u3084\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u74b0\u5883\u3092\u72ec\u7acb\u3057\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4e0a\u306b\uff08URL\u3082\u5225\u3067\uff09\u7528\u610f\u3059\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u540c\u3058\u5185\u5bb9\u306a\u306e\u306b\u74b0\u5883\u3054\u3068\u306bHAR\u3092\u4f5c\u308b\u306e\u306f\u975e\u52b9\u7387\u3067\u3059\u3002<\/p>\n<p>\u307e\u305f\u5225\u306a\u554f\u984c\u3068\u3057\u3066\u3001\u5916\u90e8URL\u304b\u3089\u306e\u30ea\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u8aad\u307f\u3053\u307f\uff08jQuery, Bootstrap, GoogleMap \u306a\u3069, CDN\u7d4c\u7531\u306eCSS\u3084JavaScript\u306e\u5229\u7528\u7b49\uff09\u304c\u3042\u308b\u5834\u5408\u3001\u305d\u308c\u306b\u5bfe\u3057\u3066\u8ca0\u8377\u3092\u304b\u3051\u3066\u3057\u307e\u3046\u3068DoS\u653b\u6483\u3068\u898b\u306a\u3055\u308c\u308b\u6050\u308c\u304c\u3042\u308b\u305f\u3081\u3001\u57fa\u672c\u7684\u306b\u306f\u8ca0\u8377\u8a66\u9a13\u5bfe\u8c61\u304b\u3089\u5916\u3059\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u305d\u308c\u3092\u8e0f\u307e\u3048\u3066\u4eca\u56de\u306f\u3001HAR\u4f5c\u6210\u6642\u306eURL(\u4f8b\u3067\u306f harUrl )\u3092\u3001\u5b9f\u969b\u306e\u8a66\u9a13\u5bfe\u8c61\u306eURL(\u4f8b\u3067\u306f targetUrl )\u306b\u7f6e\u63db\u3057\u307e\u3059\u3002\u305d\u308c\u3068\u540c\u6642\u306b\u3001HAR\u306bharUrl\u4ee5\u5916\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u8a18\u9332\u3055\u308c\u3066\u3044\u305f\u5834\u5408\u306f\u3001\u8a66\u9a13\u5bfe\u8c61\u304b\u3089\u5916\u3057\u307e\u3059\u3002\u3055\u3089\u306b\u3001\u958b\u767a\u74b0\u5883\u3067\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u4f5c\u6210\u3057\u3001\u305d\u306e\u307e\u307e\u5225\u74b0\u5883\u3078\u30c6\u30b9\u30c8\u3092\u6295\u3052\u3089\u308c\u308b\u3088\u3046\u306b\u3001targetUrl \u306f\u30d5\u30a1\u30a4\u30eb\u3078\u30cf\u30fc\u30c9\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3059\u308b\u306e\u3067\u306f\u306a\u304f\u3001\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u5f15\u6570 URL \u304b\u3089\u6307\u5b9a\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n<p>HAR\u4f5c\u6210\u306f http:\/\/localhost \u3067\u884c\u3044\u3001\u8a66\u9a13\u5bfe\u8c61\u306f http:\/\/192.168.56.10\/ \u3068\u3044\u3046\u30ed\u30fc\u30ab\u30ebIP \u3068\u3059\u308b\u5834\u5408\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"\"><code>\/\/ \u5b9a\u6570\u5b9a\u7fa9\n\/\/ \u9069\u5b9c\u8abf\u6574\u3059\u308b\u3053\u3068\n\n\/\/ \u5bfe\u8c61URL\uff08\u74b0\u5883\u5909\u6570URL\u3068\u3057\u3066\u6e21\u3059\u3053\u3068\uff09\nconst targetUrl = __ENV.URL;\n\n \/\/ \u30ed\u30b0\u30a4\u30f3URL\nconst loginUrl = targetUrl+\"\/login\/\";\n\n\/\/ HAR\u30d5\u30a1\u30a4\u30eb\u751f\u6210\u6642\u306e\u30d9\u30fc\u30b9URL\u3002HAR\u30d5\u30a1\u30a4\u30eb\u4e2d\u306eURL\u3068\u4e00\u81f4\u3057\u3066\u3044\u306a\u3044\u3068\u5bfe\u8c61URL\u3078\u306e\u7f6e\u63db\u6642\u306b\u7a7a\u632f\u308a\u306b\u306a\u308b\u306e\u3067\u6ce8\u610f\nconst harUrl = \"http:\/\/192.168.56.10\";\n\n\/\/(\u7701\u7565\uff09\n\n\/\/ \u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u306eSharedArray\u3092Har\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u4f5c\u6210\u3059\u308b\n\/\/ \u305d\u308c\u305e\u308c\u4ee5\u4e0b\u3092\u6301\u3064\n\/\/   name: \u30c6\u30b9\u30c8\u540d (= Group Name)\n\/\/   method: HTTP\u30ea\u30af\u30a8\u30b9\u30c8\u30e1\u30bd\u30c3\u30c9\uff08GET or POST\uff09\n\/\/   url:  HAR\u304b\u3089\u30d9\u30fc\u30b9URL\u3092\u524a\u9664\u3057\u305f url\n\/\/   body: \u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u7b49\uff08\u30d5\u30a9\u30fc\u30e0\u3067\u306e\u9001\u4fe1\u30c7\u30fc\u30bf\u306fdecodeURI\u6e08\uff09\n\/\/   params: \u30ea\u30af\u30a8\u30b9\u30c8\u30d8\u30c3\u30c0\nconst testCases = new SharedArray('testCases', function () {\n\n\/\/(\u7701\u7565\uff09\n\n      if( !ent.request.url.startsWith(harUrl) ) continue;\n\n\/\/(\u7701\u7565\uff09\n      \/\/ \u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u3054\u3068\u306b\u4e0b\u6e96\u5099\u3057\u305f\u5024\u3092\u8a70\u3081\u308b\n      arr.push( {\n         name: baseName(filename).replace(\/\\_\\_\\_\/g, '\/'), \/\/ HAR\u30d5\u30a1\u30a4\u30eb\u540d\u306e___ \u306f \/ \u306b\u7f6e\u63db\u3059\u308b\n         method: ent.request.method,\n         url: ent.request.url.slice( harUrl.length ),\n         body: (Object.keys(bodyParam).length === 0)? null:bodyParam,\n         params: { headers: obj }\n      } );\n    }\n  }\n  \n  if( arr.length === 0 ) fail('testCases is empty. Check har files contain harUrl[' + harUrl +']');\n  return arr;\n});\n<\/code><\/pre>\n<pre># bash \u3067\u306e\u30c6\u30b9\u30c8\u5b9f\u884c\u4f8b\nk6 run -e URL=http:\/\/192.168.56.10 -e FILELIST=\".\/hars\/Test.har;\" k6-with-chrome-hars.js\n<\/pre>\n<h3>\u8907\u6570HAR\u306e\u4e00\u62ec\u5b9f\u884c<\/h3>\n<p>\u540c\u3058HAR\u3092\u5358\u767a\u3067\u7e70\u308a\u8fd4\u3057\u3066\u5b9f\u884c\u3057\u305f\u5834\u5408\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u306a\u3069\u3067\u6027\u80fd\u304c\u610f\u56f3\u305b\u305a\u5e95\u4e0a\u3052\u3055\u308c\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u6027\u80fd\u304c\u4e0a\u304c\u308b\u306e\u306f\u6b53\u8fce\u3059\u3079\u304d\u3053\u3068\u3067\u3059\u304c\u3001\u5b9f\u969b\u306e\u904b\u7528\u3067\u306f\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u8907\u6570\u306eURL\u306b\u5206\u6563\u3059\u308b\u305f\u3081\u306b\u3001\u5358\u767a\u8a66\u9a13\u6642\u3088\u308a\u3082\u30ad\u30e3\u30c3\u30b7\u30e5\u304c\u6709\u52b9\u306b\u52b9\u304b\u305a\u3001\u60f3\u5b9a\u3057\u3066\u3044\u305f\u3088\u308a\u3082\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u304c\u60aa\u304f\u306a\u308b\u5371\u967a\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u305d\u308c\u3092\u907f\u3051\u308b\u305f\u3081\u3001\u4f5c\u6210\u3057\u305fHAR\u306f\u4eca\u56de\u306f\u30e9\u30f3\u30c0\u30e0\u306b\u8907\u6570\u4e00\u62ec\u5b9f\u884c\u3055\u305b\u307e\u3059\u3002<\/p>\n<p>\u6b8b\u5ff5\u306a\u304c\u3089\u3001ES2015\/ES6 \u306eJavaScript\u306b\u306f\u3001\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304b\u3089\u30d5\u30a1\u30a4\u30eb\u4e00\u89a7\u3092\u53d6\u5f97\u3059\u308b\u3046\u307e\u3044\u65b9\u6cd5\u304c\u306a\u304f\u3001k6 \u306b\u3082\u305d\u306e\u624b\u306e\u30c4\u30fc\u30eb\u306f\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002npm module \u3092\u4f7f\u3048\u3070 glob \u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5229\u7528\u3059\u308b\u3053\u3068\u3067\u30d5\u30a1\u30a4\u30eb\u4e00\u89a7\u306e\u53d6\u5f97\u304c\u53ef\u80fd\u3067\u3059\u304c\u3001k6 \u306fNode.js\u4e0a\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u306f\u306a\u304f golang \u306e\u5b9f\u884c\u7cfb\u3092\u4f7f\u3063\u3066\u3044\u308b\u305f\u3081\u3001\u305d\u306e\u307e\u307e\u3067\u306f npm \u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u4f7f\u3048\u307e\u305b\u3093\u3002\u73fe\u72b6\u3067\u306f npm \u3067\u3001<a href=\"https:\/\/k6.io\/docs\/using-k6\/modules\/\">Webpack<\/a> \u3084 browserify \u306a\u3069\u3092\u4f7f\u3063\u3066\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3059\u308b\u3057\u304b\u306a\u3044\u305f\u3081\u3001HAR\u30d5\u30a1\u30a4\u30eb\u306e\u4e00\u62ec\u53d6\u5f97\u306e\u305f\u3081\u3060\u3051\u306b\u305d\u308c\u3092\u884c\u3046\u306b\u306f\u624b\u9593\u304c\u304b\u304b\u308a\u3059\u304e\u307e\u3059\u3002<\/p>\n<p>\u305d\u308c\u3092\u8e0f\u307e\u3048\u3066\u3001\u4eca\u56de\u306f\u89e3\u6c7a\u65b9\u6cd5\u3068\u3057\u3066\u3001find\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u3063\u3066\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u30bb\u30df\u30b3\u30ed\u30f3\u3067\u9023\u7d50\u3057\u305f\u6587\u5b57\u5217\u3092\u751f\u6210\u3057\u3001k6\u30b9\u30af\u30ea\u30d7\u30c8\u306b\u74b0\u5883\u5909\u6570\u3067\u6e21\u3059\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/p>\n<p>\u203b<a href=\"https:\/\/github.com\/grafana\/k6\/issues\/1005#issue-435623902\">\u516c\u5f0f\u306e\u30ea\u30dd\u30b8\u30c8\u30ea\u306eissues\u306b\u53c2\u8003\u4f8b\u304c\u63b2\u8f09\u3055\u308c\u3066\u3044\u307e\u3059<\/a>\u3002\u30ea\u30f3\u30af\u5148\u306b\u306f\u4ed6\u306b\u3082\u3001JSON\u3067\u30d5\u30a1\u30a4\u30eb\u4e00\u89a7\u3092\u4f5c\u3063\u3066\u304a\u304f\u65b9\u6cd5\u3082\u7d39\u4ecb\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>HAR\u30d5\u30a1\u30a4\u30eb\u304c .\/hars \u4ee5\u4e0b\u306b aaa.har, bbb.har, ccc.har \u306e\u30d5\u30a1\u30a4\u30eb\u540d\u3067\u5b58\u5728\u3059\u308b\u3068\u304d\u3001bash \u306b\u3066<\/p>\n<pre class=\"\">find .\/hars -type f -print0 | tr '\\0' ';'\n<\/pre>\n<p>\u3092\u5b9f\u884c\u3059\u308b\u3068\u3001\u6587\u5b57\u5217\u300caaa.har;bbb.har;ccc.har;\u300d\u3092\u751f\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u3053\u308c\u3092\u5229\u7528\u3057\u3066 k6 \u3092\u4e0b\u8a18\u306e\u3088\u3046\u306b\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<pre>k6 run -e URL=http:\/\/192.168.56.10 -e FILELIST=\"$(find .\/hars -type f -print0 | tr '\\0' ';')\" k6-with-chrome-hars.js\n<\/pre>\n<p>\u306a\u304a\u3001\u4eca\u56de\u306f\u30d5\u30a1\u30a4\u30eb\u540d\u306b\u4f7f\u3048\u306a\u304b\u3063\u305f\u534a\u89d2\u30b9\u30e9\u30c3\u30b7\u30e5\u306e\u4ee3\u7406\u3068\u3057\u3066___\u304c\u3042\u3063\u305f\u5834\u5408\u3001\u5143\u306e\u6587\u5b57\u306b\u7f6e\u63db\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3059\uff08\u524d\u63b2\u306e testCases \u306e\u4ee5\u4e0b\u306e\u7b87\u6240\uff09\u3002<\/p>\n<pre>         name: baseName(filename).replace(\/\\_\\_\\_\/g, '\/'), \/\/ HAR\u30d5\u30a1\u30a4\u30eb\u540d\u306e___ \u306f \/ \u306b\u7f6e\u63db\u3059\u308b\n<\/pre>\n<h2>VUS\u30e6\u30fc\u30b6\u306e\u30ed\u30b0\u30a4\u30f3\u60c5\u5831\u306e\u4e8b\u524d\u5b9a\u7fa9<\/h2>\n<p>\u30ed\u30b0\u30a4\u30f3\u6a5f\u80fd\u3092\u6301\u3064Web\u30b5\u30a4\u30c8\u306e\u8a66\u9a13\u306e\u5834\u5408\u3001Web\u30b5\u30a4\u30c8\u5074\u3067\u4e8b\u524d\u306b\u4f5c\u6210\u3055\u308c\u305f\u30e6\u30fc\u30b6\u3092\u4f7f\u3063\u3066\u30ed\u30b0\u30a4\u30f3\u3057\u3066\u8a66\u9a13\u3057\u305f\u3044\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306f\u3001Web\u30b5\u30a4\u30c8\u5074\u306e\u30e6\u30fc\u30b6\u5b9a\u7fa9\u3092 users.csv \u3068\u3044\u3046CSV\u30d5\u30a1\u30a4\u30eb\u3068\u3057\u3066\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3057\u3066\u4f7f\u7528\u3057\u307e\u3057\u305f\u3002\u3053\u306eCSV\u30d5\u30a1\u30a4\u30eb\u306b\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306bID\u3068\u5e73\u6587\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u5b9a\u7fa9\u3057\u3066\u3042\u308a\u307e\u3059\u3002<\/p>\n<pre>\"id\",\"password\"\n\"id-admin01\",\"adminPasswordExample1\"\n\"id-u000001\",\"userPasswordExample1\"\n\"id-u000002\",\"userPasswordExample2\"\n<\/pre>\n<p>k6 \u306e \u5916\u90e8\u30e9\u30a4\u30d6\u30e9\u30ea\u306b\u7528\u610f\u3055\u308c\u3066\u3044\u308b Papa Parse \u3092\u5229\u7528\u3057\u3066\u30d1\u30fc\u30b9\u3057\u3001<a href=\"https:\/\/k6.io\/docs\/javascript-api\/k6-data\/sharedarray\/\">SharedArray<\/a> \u578b\u3067\u4fdd\u6301\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<p>SharedArray \u306f k6 \u306e\u914d\u5217\u7684\u306a\u4f7f\u3044\u65b9\u306e\u3067\u304d\u308b\u7701\u30e1\u30e2\u30ea\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u3001\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3067\u306f1000\u8981\u7d20\u4ee5\u4e0a\u3042\u308b\u5834\u5408\u306b\u30e1\u30e2\u30ea\u30fbCPU\u52b9\u7387\u304c\u4e0a\u304c\u308b\u3068\u306e\u3053\u3068\u3067\u3059\u3002\u305f\u3060\u3057 const \u306e\u3088\u3046\u306b\u3001\u521d\u671f\u5316\u306f\uff11\u5ea6\u3057\u304b\u3067\u304d\u305a\u3001\u4ee5\u964d\u306f\u8aad\u53d6\u5c02\u7528\u306a\u306e\u3067\u3054\u6ce8\u610f\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre>import { SharedArray } from 'k6\/data';\nimport papaparse from 'https:\/\/jslib.k6.io\/papaparse\/5.1.1\/index.js';\n\n\/\/ \u30e6\u30fc\u30b6\u30ea\u30b9\u30c8CSV\u3092\u30d1\u30fc\u30b9\u3057\u3066\u3001k6 \u306e SharedArray \u306b\u4fdd\u5b58\u3057\u3066\u304a\u304f\n\/\/ \u73fe\u5728\u306ek6 \u3067\u306f\u3001SharedArray \u306f1\u5ea6\u3057\u304b\u521d\u671f\u5316\u3067\u304d\u306a\u3044\u3001\u8aad\u53d6\u5c02\u7528\u306a\u306e\u3067\u6ce8\u610f\u3059\u308b\u3053\u3068\n\nconst csvUsers = new SharedArray('csvUsers', function () {\n  \/\/ Papa Parse \u3092\u4f7f\u3063\u3066CSV\u3092\u30d1\u30fc\u30b9\u3057\u307e\u3059\u3002BOM\u3084\u6539\u884c\u30b3\u30fc\u30c9\u306f\u843d\u3068\u3057\u307e\u3059\u3002\n  \/\/ CSV\u30ab\u30e9\u30e0\u3054\u3068\u306bJSON\u306e\u3088\u3046\u306b\u8a2d\u5b9a\u3055\u308c\u308b\u305f\u3081\u3001\n  \/\/ csvUsers[0].id, csvUsers[0].password \u306e\u3088\u3046\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059\n  return papaparse.parse(open(users_csv).replace(\/^\\ufeff\/,\"\").replace(\/^\\r?\\n*|\\r?\\n*$\/g, ''), { header: true }).data;\n});\n<\/pre>\n<p>k6 \u306f\u3001VUS\uff08Virtual UserS\uff09\u3068\u547c\u3070\u308c\u308b\u7121\u9650\u30eb\u30fc\u30d7\u304c\u72ec\u7acb\u3057\u3066 iteration \uff08\u7e70\u308a\u8fd4\u3057\uff09\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306e\u8a66\u9a13\u5bfe\u8c61\u306eWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u4e00\u5ea6\u30ed\u30b0\u30a4\u30f3\u3057\u305f\u30e6\u30fc\u30b6\u306f\u30ed\u30b0\u30a2\u30a6\u30c8\u3059\u308b\u307e\u3067\u518d\u30ed\u30b0\u30a4\u30f3\u306f\u3057\u306a\u3044\u4f5c\u308a\u306b\u306a\u3063\u3066\u3044\u308b\u305f\u3081\u3001\u3088\u308a\u5b9f\u904b\u7528\u306b\u8fd1\u3065\u3051\u308b\u305f\u3081\u306b\u3001\u30ed\u30b0\u30a4\u30f3\u60c5\u5831\u3092VU\u3054\u3068\u306bCookie\u3078\u6301\u305f\u305b\u308b\u3088\u3046\u306b\u3057\u307e\u3059\uff08Cookie\u306e\u5229\u7528\u306b\u3064\u3044\u3066\u306f\u3001\u5f8c\u307b\u3069\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\uff09\u3002<\/p>\n<p>\u306a\u304a\u3001VU\u5171\u901a\u306e\u5909\u6570\u3092\u6301\u3061\u305f\u3044\uff08\u5024\u3092\u5909\u66f4\u3057\u305f\u3044\uff09\u5834\u5408\u306f\u3001\u30b0\u30ed\u30fc\u30d0\u30eb\u30b9\u30b3\u30fc\u30d7\u3067 let, var \u3067\u5b9a\u7fa9\u3059\u308b\u306e\u3067\u306f\u306a\u304f\u3001<br \/>\n\u4e0a\u306e\u30b3\u30fc\u30c9\u4f8b\u3067\u3082\u4f7f\u3063\u305f globalThis \u3092\u4f7f\u3046\u307b\u3046\u304c\u5b89\u5168\u3067\u3059( \u7406\u7531\u306b\u3064\u3044\u3066\u306f<a href=\"https:\/\/github.com\/grafana\/k6\/releases\/tag\/v0.40.0\">v0.40.0 \u30ea\u30ea\u30fc\u30b9\u30ce\u30fc\u30c8\u306e Main module\/script no longer pollutes the global scope <\/a>\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\uff09\u3002<\/p>\n<pre class=\"\">\/\/ \u4ee5\u4e0b\u306fk6\u306eVUS\u3054\u3068\u306b\u5171\u6709\u3059\u308b\u305f\u3081\u306e\u30b0\u30ed\u30fc\u30d0\u30eb\u5909\u6570\nglobalThis.cookies = [];\nglobalThis.token=[];\nglobalThis.xsrf_token = [];\nglobalThis.fit_session = [];\n\n\/\/\uff08\u7701\u7565\uff09\n\n\/\/ \u30c6\u30b9\u30c8\u672c\u4f53\nexport default function() {\n  \/\/ \u30a4\u30c6\u30ec\u30fc\u30b7\u30e7\u30f3\u3054\u3068\u306b\u3001VU \u3067\u4f7f\u3046\u30e6\u30fc\u30b6ID\u3092\u30e9\u30f3\u30c0\u30e0\u306b\u6c7a\u3081\u308b\n  let user = (function(){\n    let userOption;\n    if(exec.test.options.scenarios.default.stages)\n      userOption = csvUsers[__VU % exec.test.options.scenarios.default.stages[0].target];\n    else\n      userOption = csvUsers[__VU % exec.test.options.scenarios.default.vus];\n      \n    return userOption;\n  })();\n\n  console.debug(`VU ${__VU} on iteration ${__ITER} has user ID ${user.id}...`);\n  \n  \/\/ \u30e6\u30fc\u30b6\u3054\u3068\u306b\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u3092\u4fdd\u6301\u3059\u308b\u305f\u3081 cookie \u3092\u8a2d\u5b9a\u3059\u308b\n  \/\/ 1\u5ea6\u8aad\u3093\u3060\u3089\u30b0\u30ed\u30fc\u30d0\u30eb\u5909\u6570\u306b\u4fdd\u6301\u3057\u3066\u304a\u304d\u3001\u5225\u30a4\u30c6\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u518d\u30ed\u30b0\u30a4\u30f3\u3057\u306a\u3044\n  \/\/ \u3082\u3057\u3053\u3053\u3067\u30a8\u30e9\u30fc\u306b\u306a\u3063\u305f\u5834\u5408\u3001\u6bce\u56deNG\u3068\u306a\u308a\u3001\n  \/\/ \u8a66\u9a13\u304c\u304b\u306a\u308a\u9045\u304f\u306a\u308b\u306e\u3067\u6ce8\u610f\u3059\u308b\u3053\u3068\n  if (globalThis.cookies[user.id] === undefined) {\n    const res = http.get(loginUrl);\n\n    \/\/ \u4e0b\u8a18\u306fxsrf\u5bfe\u7b56\u306e\u305f\u3081\u306etoken\u3092\u6301\u3064\u3088\u3046\u306a\u30b5\u30a4\u30c8\u306e\u5834\u5408\u3092\u60f3\u5b9a\u3057\u3066\u3044\u307e\u3059\n    \/\/ find path \u3068 \u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u3001\u30e1\u30bd\u30c3\u30c9\u30bf\u30a4\u30d7 \u306f\u9069\u5b9c\u8abf\u6574\u3057\u3066\u304f\u3060\u3055\u3044\n    const elem = res.html().find('input[name=_token]');\n    console.debug('globalThis.cookies[user.id] is undefined: ' + user.id);\n    const formdata = {\n        email: user.id,\n        password: user.password,\n        _token: elem.attr('value')\n      };\n\n    const headers = { 'Referer': loginUrl };\n    const response = http.post(loginUrl, formdata, { headers: headers });\n    sleep(5);\n\n    const checkRes = check(response, {\n      'status was 200': (r) =&gt; r.status == 200,\n    }) || fail('status was not 200 ' + res.url );\n\n    console.debug('VU ' + __VU + ' response ' + JSON.stringify(response));\n\n    \/\/ cookie \u3068 token \u3092 VU\u3054\u3068\u306b\u4fdd\u6301\u3059\u308b\n    \/\/ token\u306e\u30bb\u30ec\u30af\u30bf\u3084\u3001\u5404 Set-Cookie \u306e\u9805\u76ee\u306f\u30b1\u30fc\u30b9\u30d0\u30a4\u30b1\u30fc\u30b9\u306a\u306e\u3067\u6ce8\u610f\u3059\u308b\u3053\u3068\n    globalThis.cookies[user.id] = http.cookieJar().cookiesForURL(targetUrl);\n    globalThis.token[user.id] = response.html().find('input[name=_token]').attr('value');\n \n    if( response.headers.hasOwnProperty('Set-Cookie') ){\n      if( response.headers['Set-Cookie'].match(\/XSRF-TOKEN=(.+?);\/) ){\n        globalThis.xsrf_token[user.id] = response.headers['Set-Cookie'].match(\/XSRF-TOKEN=(.+?);\/)[1];\n        globalThis.cookies[user.id]['XSRF-TOKEN'] = [ globalThis.xsrf_token[user.id] ];\n      }\n      if( response.headers['Set-Cookie'].match(\/globalThis.fit_session=(.+?);\/) ){\n        globalThis.fit_session[user.id] = response.headers['Set-Cookie'].match(\/globalThis.fit_session=(.+?);\/)[1];\n        globalThis.cookies[user.id]['globalThis.fit_session'] = [ globalThis.fit_session[user.id] ];\n      }\n      console.debug('VU ' + __VU + ' set cookie. ' + JSON.stringify(globalThis.cookies[user.id]));\n    }\n  } else {\n    console.debug('globalThis.cookies[user.id] is defined: ' + user.id);\n  }\n\n<\/pre>\n<p>\u9001\u4fe1\u3059\u308b\u30d5\u30a9\u30fc\u30e0\u30c7\u30fc\u30bf\u306f\u3001\u8a66\u9a13\u5bfe\u8c61\u306e\u30b7\u30b9\u30c6\u30e0\u306e\u30ed\u30b0\u30a4\u30f3\u6642\u306ePOST\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u540d\u306b\u3042\u308f\u305b\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306e\u4f8b\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u540d\u304c email\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u304c password \u3001\u5f8c\u8ff0\u306e\u30c8\u30fc\u30af\u30f3\u304c _token \u3068\u3044\u3046\u30d1\u30e9\u30e1\u30fc\u30bf\u30ad\u30fc\u306e\u5834\u5408\u3067\u3059\u3002<\/p>\n<pre>    const formdata = {\n        email: user.id,\n        password: user.password,\n        _token: elem.attr('value')\n      };\n<\/pre>\n<h2>Cookie\u3068\u52d5\u7684\u30c7\u30fc\u30bf\u306e\u5229\u7528<\/h2>\n<p>\u30ed\u30b0\u30a4\u30f3\u6642\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u30ad\u30fc\u3084\u3001\u30af\u30ed\u30b9\u30b5\u30a4\u30c8\u30b9\u30af\u30ea\u30d7\u30c6\u30a3\u30f3\u30b0\u5bfe\u7b56\u306e\u305f\u3081\u306e\u30c8\u30fc\u30af\u30f3\u306a\u3069\u3092Cookie\u306b\u6301\u3064\u3088\u3046\u306aWeb\u30b5\u30a4\u30c8\u3092\u8a66\u9a13\u3059\u308b\u5834\u5408\u3001\u4f55\u3082\u8003\u616e\u3057\u306a\u3044\u3067\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u6295\u3052\u308b\u3068\u3001Web\u30b5\u30a4\u30c8\u5074\u306e\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u6a5f\u80fd\u3067\u30a8\u30e9\u30fc\u30da\u30fc\u30b8\u3084\u30ed\u30b0\u30a4\u30f3\u753b\u9762\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3055\u308c\u3066\u3057\u307e\u3044\u3001\u610f\u56f3\u3057\u305f\u8a66\u9a13\u306b\u306a\u3089\u306a\u3044\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>k6 \u516c\u5f0f\u30b5\u30a4\u30c8\u306b\u305d\u308c\u305e\u308c\u3001<a href=\"https:\/\/k6.io\/docs\/examples\/cookies-example\/\">Cookie<\/a> \u3068<a href=\"https:\/\/k6.io\/docs\/examples\/correlation-and-dynamic-data\/\">\u52d5\u7684\u30c7\u30fc\u30bf\u5229\u7528<\/a>\u306b\u3064\u3044\u3066\u306e\u5b9f\u88c5\u4f8b\u304c\u3042\u308a\u307e\u3059\u3002\u524d\u6bb5\u306e HAR\u3092\u5229\u7528\u3059\u308b\u70b9\u3082\u8e0f\u307e\u3048\u3066\u3001\u5c11\u3057\u8907\u96d1\u306b\u306a\u308a\u307e\u3059\u304c\u3001\u4eca\u56de\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u5b9f\u88c5\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u2460\u30ed\u30b0\u30a4\u30f3\u6642\u306a\u3069\u3001\u30ec\u30b9\u30dd\u30f3\u30b9\u30d8\u30c3\u30c0\u306b Set-Cookie \u304c\u3042\u308c\u3070 VU \u3054\u3068\u306b\u305d\u306e\u5024\u3092\u4fdd\u6301\u3059\u308b<br \/>\n\u2461VU \u3054\u3068\u306b\u3001\u4fdd\u6301\u3057\u3066\u3044\u308b Cookie \u304c\u306a\u308c\u3051\u3070\u3001\u5148\u306b\u30ed\u30b0\u30a4\u30f3\u753b\u9762\u3092\u30ea\u30af\u30a8\u30b9\u30c8\u3057\u3066\u30ed\u30b0\u30a4\u30f3\u3059\u308b\u3002Cookie\u304c\u65e2\u306b\u3042\u308c\u3070\u30ed\u30b0\u30a4\u30f3\u753b\u9762\u3092\u30b9\u30ad\u30c3\u30d7\u3059\u308b<br \/>\n\u2462\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u969b\u306b\u3001HTML\u306eINPUT\u8981\u7d20\u3067name\u300c_token\u300d\u5c5e\u6027\u3092\u6301\u3064INPUT\u8981\u7d20\u304c\u3042\u308c\u3070\u3001\u305d\u306e\u5024\u3092\u30ea\u30af\u30a8\u30b9\u30c8\u30d8\u30c3\u30c0\u300cx-csrf-token\u300d\u304a\u3088\u3073\u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30fc\u30e1\u30fc\u30bf\u30fc\u300ctoken\u300d\u306e\u5024\u3068\u3057\u3066\u8a2d\u5b9a\u3059\u308b\u203b<br \/>\n\u2463\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u969b\u306b\u3001Cookie\u306b XSRF-TOKEN \u5024\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308c\u3070\u3001\u305d\u306e\u5024\u3092\u30ea\u30af\u30a8\u30b9\u30c8\u30d8\u30c3\u30c0\u300cx-xsrf-token\u300d\u306e\u5024\u3068\u3057\u3066\u8a2d\u5b9a\u3059\u308b\u203b<\/p>\n<p><em>\u203b\u305f\u3060\u3057\u30ea\u30af\u30a8\u30b9\u30c8\u30d8\u30c3\u30c0\u3082\u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u2015\u3082\u3001HAR\u3067\u306e\u5143\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u3001\u305d\u306e\u30ad\u30fc\u304c\u4f7f\u7528\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u306e\u307f\u8a2d\u5b9a\u3059\u308b<\/em><\/p>\n<p>\u2460\u306f\u3001\u524d\u63b2\u3057\u305f\u30ed\u30b0\u30a4\u30f3\u51e6\u7406\u306e51\u884c\u76ee\u4ee5\u964d\u3067\u884c\u3063\u3066\u3044\u307e\u3059\u3002<br \/>\n\u2461\u3082\u3001\u30ed\u30b0\u30a4\u30f3\u51e6\u7406\u306e28\u884c\u76ee\u306e\u30d6\u30ed\u30c3\u30af\u3067\u3059\u3002<br \/>\n\u2462\u3068\u2463\u306b\u3064\u3044\u3066\u306f\u4ee5\u4e0b\u306e\u51e6\u7406\u3067\u884c\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"\">    \/\/ Har\u306e token\u3092\u5b9f\u969b\u306e\u3082\u306e\u306b\u4ed8\u3051\u66ff\u3048\u308b\uff08\u30ea\u30af\u30a8\u30b9\u30c8\u30d8\u30c3\u30c0\u4e2d\u306e\u3082\u306e\u3082\u5168\u90e8\u5909\u3048\u308b\uff09\n    batch.forEach( item =&gt; {\n      item[1] = item[1].replace(\/token%5B%5D=(.+?)&amp;\/g,'token%5B%5D=' + globalThis.token[user.id] + '&amp;');\n\n      if( item[2] !== null ){\n        item[2]._token = globalThis.token[user.id];\n      }\n\n      console.debug('VU ' + __VU + ' current cookie. ' + JSON.stringify(globalThis.cookies[user.id]));\n      item[3].headers.cookie = JSON.stringify(globalThis.cookies[user.id]).replace(\/\\[|\\||\\]|\"|\\{|\\}\/g,'').replace(\/,\/g,'; ').replace(\/:\/g,'=');\n      item[3].jar = globalThis.cookies[user.id];\n      item[3].headers.referer = globalThis.url + '\/' + gName;\n      if( item[3].headers.hasOwnProperty('x-csrf-token') ){\n        console.debug('VU ' + __VU + 'x-csrf-token :' + globalThis.token[user.id] );\n        item[3].headers['x-csrf-token'] = [ globalThis.token[user.id] ];\n      }\n      if( item[3].headers.hasOwnProperty('x-xsrf-token') ){\n        console.debug('VU ' + __VU + 'x-xsrf-token :' + globalThis.cookies[user.id]['XSRF-TOKEN'] );\n        item[3].headers['x-xsrf-token'] = [ decodeURIComponent(globalThis.cookies[user.id]['XSRF-TOKEN']) ] ;\n      }\n      console.debug('VU ' + __VU + ' header cookie. ' + item[3].headers.cookie);\n\n      \/\/ \u30d0\u30c3\u30c1\u5b9f\u884c\n      let res = http.batch([item])[0];\n\n\/\/\uff08\u7701\u7565\uff09\n\n      \/\/ Set-Cookie \u30ec\u30b9\u30dd\u30f3\u30b9\u30d8\u30c3\u30c0\u304c\u3042\u308c\u3070\u30b0\u30ed\u30fc\u30d0\u30eb\u5909\u6570\u3092\u66f4\u65b0\u3059\u308b\n      if( res.status == 200 &amp;&amp; res.headers.hasOwnProperty('Set-Cookie') ){\n        if( res.headers['Set-Cookie'].match(\/XSRF-TOKEN=(.+?);\/) ){\n          console.debug('VU ' + __VU + ' Response has Set-Cookie header . ' + res.headers['Set-Cookie']);\n          console.debug('VU ' + __VU + ' updated current cookie. ' + JSON.stringify(globalThis.cookies[user.id]));\n          globalThis.xsrf_token[user.id] = res.headers['Set-Cookie'].match(\/XSRF-TOKEN=(.+?);\/)[1];\n          globalThis.cookies[user.id]['XSRF-TOKEN'] = [ globalThis.xsrf_token[user.id] ];\n        }\n        if( res.headers['Set-Cookie'].match(\/globalThis.fit_session=(.+?);\/) ){\n          console.debug('VU ' + __VU + ' updated current cookie. ' + JSON.stringify(globalThis.cookies[user.id]));\n          globalThis.fit_session[user.id] = res.headers['Set-Cookie'].match(\/globalThis.fit_session=(.+?);\/)[1];\n          globalThis.cookies[user.id]['globalThis.fit_session'] = [ globalThis.fit_session[user.id] ];\n        } \n      }\n\n      \/\/ \u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u5148\u306b token \u306eINPUT\u8981\u7d20\u304c\u3042\u308c\u3070\u30b0\u30ed\u30fc\u30d0\u30eb\u5909\u6570\u3092\u66f4\u65b0\u3059\u308b\n      if( res.html().find('input[name=_token]') !== undefined &amp;&amp; res.html().find('input[name=_token]').attr('value') !== undefined){\n        console.debug('VU ' + __VU + ' globalThis.token( updated ) : ' + res.html().find('input[name=_token]').attr('value') );\n        globalThis.token[user.id] = res.html().find('input[name=_token]').attr('value');\n      }\n      \n<\/pre>\n<h2>Group\u5225\u306e\u7d50\u679c\u8868\u793a<\/h2>\n<p><a href=\"https:\/\/k6.io\/docs\/using-k6\/metrics\/#built-in-metrics\">\u6a19\u6e96\u306e\u30e1\u30c8\u30ea\u30af\u30b9<\/a>\u3067\u306f check \u9805\u76ee\u3054\u3068\u306b\u30b0\u30eb\u30fc\u30d7\u5358\u4f4d\u3067\u6210\u529f\u7387\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u304c\u3001\u305d\u306e\u4ed6\u306e\u30e1\u30c8\u30ea\u30af\u30b9\u306f\u30b0\u30eb\u30fc\u30d7\u5358\u4f4d\u3067\u306f\u8868\u793a\u3055\u308c\u305a\u3001\u5168\u3066\u307e\u3068\u3081\u3066\u306e\u7d50\u679c\u3057\u304b\u8868\u793a\u3067\u304d\u307e\u305b\u3093\u3002\u3067\u3059\u306e\u3067\u4eca\u56de\u306f\u3001\u30b0\u30eb\u30fc\u30d7\u5225\u306b\u4e3b\u8981\u306a\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u8868\u793a\u3055\u305b\u308b\u305f\u3081\u3001\u30ab\u30b9\u30bf\u30e0\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u5229\u7528\u3057\u307e\u3059\u3002<\/p>\n<pre>import { sleep, check, fail, group } from \"k6\";\nimport { Trend } from 'k6\/metrics';\n\n\/\/\uff08\u7701\u7565\uff09\n\n\/\/ \u30b0\u30eb\u30fc\u30d7\u540d\u306e\u30ea\u30b9\u30c8\u3092\u4f5c\u3063\u3066\u304a\u304f\nconst groupNames = [...new Set(testCases.map(item =&gt; item.name))];\n\n\/\/ \u30b0\u30eb\u30fc\u30d7\u3054\u3068\u306b\u30ab\u30b9\u30bf\u30e0\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u5b9a\u7fa9\u3059\u308b\n(function(){\n  for( const gName of groupNames ){\n    globalThis[gName+'_trend_http_req_blocked'] = new Trend('  ' + gName + ' ... http_req_blocked', true);\n    globalThis[gName+'_trend_http_req_connecting'] = new Trend('  ' + gName + ' ... http_req_connecting', true);\n    globalThis[gName+'_trend_http_req_duration'] = new Trend('  ' + gName + ' ... http_req_duration', true);\n    globalThis[gName+'_trend_http_req_receiving'] = new Trend('  ' + gName + ' ... http_req_receiving', true);\n    globalThis[gName+'_trend_http_req_sending'] = new Trend('  ' + gName + ' ... http_req_sending', true);\n    globalThis[gName+'_trend_http_req_waiting'] = new Trend('  ' + gName + ' ... http_req_waiting', true);\n  }\n})();\n\n\/\/\uff08\u7701\u7565\uff09\n\n\/\/ \u30c6\u30b9\u30c8\u672c\u4f53\nexport default function() {\n\n  \/\/ \u5b9f\u65bd\u3059\u308b\u30b0\u30eb\u30fc\u30d7\u540d\u3092\u30e9\u30f3\u30c0\u30e0\u306b\u6c7a\u5b9a\u3059\u308b\n  let gName = groupNames[ randomIntBetween(1, groupNames.length) -1 ];\n\n  \/\/ \u4ee5\u4e0b\u3001\u30b0\u30eb\u30fc\u30d7\u3054\u3068\u306b\u5b9f\u884c\u3059\u308b\n  group(gName, function(){\n\n      \/\/\uff08\u7701\u7565\uff09\n\n      \/\/ \u30d0\u30c3\u30c1\u5b9f\u884c\n      let res = http.batch([item])[0];\n\n      check(res,\n        {\n          'status was 200': (r) =&gt; {\n            return r.status == 200;\n          }\n        },\n\n      \/\/\uff08\u7701\u7565\uff09\n\n      \/\/ \u30b0\u30eb\u30fc\u30d7\u3054\u3068\u306b\u30ab\u30b9\u30bf\u30e0\u30e1\u30c8\u30ea\u30af\u30b9\u3068\u3057\u3066\u96c6\u8a08\u3059\u308b\n      globalThis[gName+'_trend_http_req_blocked'].add(res.timings.blocked);\n      globalThis[gName+'_trend_http_req_connecting'].add(res.timings.connecting);\n      globalThis[gName+'_trend_http_req_duration'].add(res.timings.duration);\n      globalThis[gName+'_trend_http_req_receiving'].add(res.timings.receiving);\n      globalThis[gName+'_trend_http_req_sending'].add(res.timings.sending);\n      globalThis[gName+'_trend_http_req_waiting'].add(res.timings.waiting);\n\n<\/pre>\n<h2>\u5b9f\u884c\u7d50\u679c<\/h2>\n<div id=\"attachment_10097\" style=\"width: 610px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_04.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-10097\" class=\"wp-image-10097\" src=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_04-195x300.png\" alt=\"\" width=\"600\" height=\"923\" srcset=\"https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_04-195x300.png 195w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_04-768x1181.png 768w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_04-666x1024.png 666w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_04-139x214.png 139w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_04-169x260.png 169w, https:\/\/www.ecomottblog.com\/wp-content\/uploads\/2022\/12\/ecomottblog_k6_grp_04.png 1057w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><p id=\"caption-attachment-10097\" class=\"wp-caption-text\">\u203b\u30af\u30ea\u30c3\u30af\u3067\u62e1\u5927\u3057\u307e\u3059<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>\u4eca\u56de\u306f\u52d5\u4f5c\u78ba\u8a8d\u3068\u3044\u3046\u3053\u3068\u3067\u8ca0\u8377\u3068\u3057\u3066\u306f\u6975\u63a7\u3048\u3081\u306b\u30013VUS\u30015\u5206\u9593\u3067\u5b9f\u884c\u3057\u307e\u3057\u305f\u3002\u4e0a\u8ff0\u306e\u901a\u308a\u3001\u30b0\u30eb\u30fc\u30d7\u3054\u3068\uff08HAR\u3054\u3068\uff09\u306e\u7d50\u679c\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u4f7f\u7528\u3057\u305f\u30b9\u30af\u30ea\u30d7\u30c8\u306e\u5b8c\u5168\u7248\u306f\u3053\u3061\u3089\u3067\u3059\u3002<\/p>\n<pre>import http from \"k6\/http\";\nimport { sleep, check, fail, group } from \"k6\";\nimport { Trend } from 'k6\/metrics';\nimport { SharedArray } from 'k6\/data';\nimport exec from 'k6\/execution';\nimport papaparse from 'https:\/\/jslib.k6.io\/papaparse\/5.1.1\/index.js';\nimport { normalDistributionStages, randomIntBetween } from 'https:\/\/jslib.k6.io\/k6-utils\/1.2.0\/index.js';\n\n\n\/*******************************************************************************************************************************\nk6 \u8ca0\u8377\u8a66\u9a13\u7528\u30b9\u30af\u30ea\u30d7\u30c8\uff08HAR\u30d5\u30a1\u30a4\u30eb\u5229\u7528 Group\u5225\u8868\u793a\u7248\uff09\n=========\n\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u3092cookie\u3067\u6301\u3061\u3001xsrf\u5bfe\u7b56\u306e\u305f\u3081token\u6a5f\u80fd\u3092\u6301\u3064\u3088\u3046\u306aWeb\u30b7\u30b9\u30c6\u30e0\u3067\u306e\u3001\u8ca0\u8377\u8a66\u9a13\u30b9\u30af\u30ea\u30d7\u30c8\u3067\u3059\u3002\n\u30b7\u30ca\u30ea\u30aa\u5b9a\u7fa9\u306f\u3001Chrome \u958b\u767a\u8005\u30c4\u30fc\u30eb\u3067\u4f5c\u6210\u3057\u305f HAR\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u3046\u60f3\u5b9a\u3067\u3059\u3002\n\n## author\n\necomott.inc\n\n## example\n\n```\nk6 run -e URL=https:\/\/xxxx -e FILELIST=&quot;$(find .\/hars -type f -print0 | tr &#039;\\0&#039; &#039;;&#039;)&quot; k6-with-chrome-hars.js\n```\n\n## license\n\nMIT\n\n*******************************************************************************************************************************\/\n\n\/\/ \u5b9a\u6570\u5b9a\u7fa9\n\/\/ \u9069\u5b9c\u8abf\u6574\u3059\u308b\u3053\u3068\n\n\/\/ \u5bfe\u8c61URL\uff08\u74b0\u5883\u5909\u6570URL\u3068\u3057\u3066\u6e21\u3059\u3053\u3068\uff09\nconst targetUrl = __ENV.URL;\n\n \/\/ \u30ed\u30b0\u30a4\u30f3URL\nconst loginUrl = targetUrl+\"\/login\/\";\n\n\/\/ HAR\u30d5\u30a1\u30a4\u30eb\u751f\u6210\u6642\u306e\u30d9\u30fc\u30b9URL\u3002HAR\u30d5\u30a1\u30a4\u30eb\u4e2d\u306eURL\u3068\u4e00\u81f4\u3057\u3066\u3044\u306a\u3044\u3068\u5bfe\u8c61URL\u3078\u306e\u7f6e\u63db\u6642\u306b\u7a7a\u632f\u308a\u306b\u306a\u308b\u306e\u3067\u6ce8\u610f\nconst harUrl = \"http:\/\/192.168.56.10\";\n\n\/\/ \u30e6\u30fc\u30b6\u5b9a\u7fa9\u30d5\u30a1\u30a4\u30eb\nconst users_csv = '.\/users.csv'; \/\/ \u30e6\u30fc\u30b6\u30ea\u30b9\u30c8\n\n\n\/\/ \u4ee5\u4e0b\u306fk6\u306eVUS\u3054\u3068\u306b\u5171\u6709\u3059\u308b\u305f\u3081\u306e\u30b0\u30ed\u30fc\u30d0\u30eb\u5909\u6570\nglobalThis.cookies = [];\nglobalThis.token=[];\nglobalThis.xsrf_token = [];\nglobalThis.fit_session = [];\n\nexport const options = {\n  scenarios: {\n    default: {\n      \/\/ Note: \u30c6\u30b9\u30c8\u3057\u305f\u3044 executor \u30d6\u30ed\u30c3\u30af\u3054\u3068\u306b\u3001\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3092\u5207\u308a\u66ff\u3048\u308b\u3053\u3068\n\n      \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n      \/\/ executor: 'ramping-vus',\n      \/\/ startVUs: 0,\n      \/\/ stages: normalDistributionStages(5, 60, 5), \/\/maxVus, durationSeconds, [numberOfStages]\n      \/\/ gracefulRampDown: '30s',\n      \n      \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n      \/\/ executor: 'ramping-vus',\n      \/\/ startVUs: 10,\n      \/\/ stages: [\n      \/\/   { duration: '2m', target: 10 },\n      \/\/   { duration: '5m', target: 50 },\n      \/\/   { duration: '5m', target: 500 },\n      \/\/   { duration: '5m', target: 10 },\n      \/\/ ],\n      \/\/ gracefulRampDown: '0s',\n      \n      \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n      executor: 'constant-vus',\n      vus: 3,\n      duration: '5m',\n      gracefulStop: '0s',\n    }\n  },\n  thresholds: {\n    http_req_duration: ['p(90)&lt;60000'], \/\/ 90% of requests should be below 60,000ms(1m) } }; \/\/ \u30e6\u30fc\u30b6\u30ea\u30b9\u30c8CSV\u3092\u30d1\u30fc\u30b9\u3057\u3066\u3001k6 \u306e SharedArray \u306b\u4fdd\u5b58\u3057\u3066\u304a\u304f \/\/ \u73fe\u5728\u306ek6 \u3067\u306f\u3001SharedArray \u306f1\u5ea6\u3057\u304b\u521d\u671f\u5316\u3067\u304d\u306a\u3044\u3001\u8aad\u53d6\u5c02\u7528\u306a\u306e\u3067\u6ce8\u610f\u3059\u308b\u3053\u3068 const csvUsers = new SharedArray('csvUsers', function () { \/\/ Papa Parse \u3092\u4f7f\u3063\u3066CSV\u3092\u30d1\u30fc\u30b9\u3057\u307e\u3059\u3002BOM\u3084\u6539\u884c\u30b3\u30fc\u30c9\u306f\u843d\u3068\u3057\u307e\u3059\u3002 \/\/ CSV\u30ab\u30e9\u30e0\u3054\u3068\u306bJSON\u306e\u3088\u3046\u306b\u8a2d\u5b9a\u3055\u308c\u308b\u305f\u3081\u3001 \/\/ csvUsers[0].id, csvUsers[0].password \u306e\u3088\u3046\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059 return papaparse.parse(open(users_csv).replace(\/^\\ufeff\/,\"\").replace(\/^\\r?\\n*|\\r?\\n*$\/g, ''), { header: true }).data; }); \/\/ \u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u306eSharedArray\u3092Har\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u4f5c\u6210\u3059\u308b \/\/ \u305d\u308c\u305e\u308c\u4ee5\u4e0b\u3092\u6301\u3064 \/\/ name: \u30c6\u30b9\u30c8\u540d (= Group Name) \/\/ method: HTTP\u30ea\u30af\u30a8\u30b9\u30c8\u30e1\u30bd\u30c3\u30c9\uff08GET or POST\uff09 \/\/ url: HAR\u304b\u3089\u30d9\u30fc\u30b9URL\u3092\u524a\u9664\u3057\u305f url \/\/ body: \u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u7b49\uff08\u30d5\u30a9\u30fc\u30e0\u3067\u306e\u9001\u4fe1\u30c7\u30fc\u30bf\u306fdecodeURI\u6e08\uff09 \/\/ params: \u30ea\u30af\u30a8\u30b9\u30c8\u30d8\u30c3\u30c0 const testCases = new SharedArray('testCases', function () { let baseName = (function (str) { let base = new String(str).substring(str.lastIndexOf('\/') + 1); if(base.lastIndexOf(\".\") != -1) base = base.substring(0, base.lastIndexOf(\".\")); return base; }); if( __ENV.FILELIST === undefined ) fail('Must Required FILELIST EnvironmentVar'); let arr = []; const files = __ENV.FILELIST.split(';'); for ( const filename of files ){ if( filename === '' ) continue; let tmpJson = JSON.parse(open(filename)); for( const ent of tmpJson.log.entries ){ if( !ent.request.url.startsWith(harUrl) ) continue; \/\/ console.log( 'name: ' + baseName(filename) + ', url : ' + ent.request.url.slice( harUrl.length ) ); let bodyParam = {}; if( ent.request.postData !== undefined &amp;&amp; ent.request.postData.params !== undefined ){ ent.request.postData.params.forEach( item =&gt; { \n           if( ent.request.postData.mimeType === 'application\/x-www-form-urlencoded' ){\n             \/\/ form post \u30c7\u30fc\u30bf\u306f\u30c7\u30b3\u30fc\u30c9\u3059\u308b\n             bodyParam[item.name] = decodeURIComponent(item.value);\n           } else {\n             \/\/ multipart \u306e\u5834\u5408\n             \/\/ Chrome \u3067 HAR \u3092\u4fdd\u5b58\u3057\u305f\u5834\u5408\u3001\u30d0\u30a4\u30ca\u30ea\u30c7\u30fc\u30bf\u306e\u3068\u304d\u306f\u65e5\u672c\u8a9e\u30ed\u30b1\u30fc\u30eb\u3060\u3068\u56fa\u5b9a\u6587\u5b57\u3067\u3053\u306e\u6587\u5b57\u5217\u304c\u5165\u308b\uff082022\/11\/16\u6642\u70b9\uff09\n             if( !item.value === '\uff08\u30d0\u30a4\u30ca\u30ea\uff09' ){\n               bodyParam[item.name] = '';\n             } else {\n               bodyParam[item.name] = item.value;\n             }\n           }\n         });\n      }\n      let obj = {};\n      \/\/ k6 \u306e\u30ea\u30af\u30a8\u30b9\u30c8\u30d8\u30c3\u30c0\u306f HTTP1\u3057\u304b\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u306a\u3044\uff082022\/11\/16\u6642\u70b9\uff09\u306e\u3067\u3001\n      \/\/ HTTP2\u4ed5\u69d8\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u30d8\u30c3\u30c0\u306f\u7701\u3044\u3066\u3044\u308b\n      ent.request.headers.forEach( item =&gt; { if( !item.name.startsWith(':') &amp;&amp; !item.name.startsWith('content-length') ) obj[item.name] = item.value; });\n      \n      \/\/ \u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u3054\u3068\u306b\u4e0b\u6e96\u5099\u3057\u305f\u5024\u3092\u8a70\u3081\u308b\n      arr.push( {\n         name: baseName(filename).replace(\/\\_\\_\\_\/g, '\/'), \/\/ HAR\u30d5\u30a1\u30a4\u30eb\u540d\u306e___ \u306f \/ \u306b\u7f6e\u63db\u3059\u308b\n         method: ent.request.method,\n         url: ent.request.url.slice( harUrl.length ),\n         body: (Object.keys(bodyParam).length === 0)? null:bodyParam,\n         params: { headers: obj }\n      } );\n    }\n  }\n  \n  if( arr.length === 0 ) fail('testCases is empty. Check har files contain harCreatedUrl[' + harUrl +']');\n  return arr;\n});\n\n\/\/ \u30b0\u30eb\u30fc\u30d7\u540d\u306e\u30ea\u30b9\u30c8\u3092\u4f5c\u3063\u3066\u304a\u304f\nconst groupNames = [...new Set(testCases.map(item =&gt; item.name))];\n\n\/\/ \u30b0\u30eb\u30fc\u30d7\u3054\u3068\u306b\u30ab\u30b9\u30bf\u30e0\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u5b9a\u7fa9\u3059\u308b\n(function(){\n  for( const gName of groupNames ){\n    globalThis[gName+'_trend_http_req_blocked'] = new Trend('  ' + gName + ' ... http_req_blocked', true);\n    globalThis[gName+'_trend_http_req_connecting'] = new Trend('  ' + gName + ' ... http_req_connecting', true);\n    globalThis[gName+'_trend_http_req_duration'] = new Trend('  ' + gName + ' ... http_req_duration', true);\n    globalThis[gName+'_trend_http_req_receiving'] = new Trend('  ' + gName + ' ... http_req_receiving', true);\n    globalThis[gName+'_trend_http_req_sending'] = new Trend('  ' + gName + ' ... http_req_sending', true);\n    globalThis[gName+'_trend_http_req_waiting'] = new Trend('  ' + gName + ' ... http_req_waiting', true);\n  }\n})();\n\n\/\/ \u3053\u3053\u304b\u3089 k6 \u6a19\u6e96\u306e\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u30e1\u30bd\u30c3\u30c9\u958b\u59cb\nexport function setup() {\n  \/\/ for (const userPwdPair of csvUsers) {\n  \/\/   console.debug(JSON.stringify(userPwdPair));\n  \/\/ }\n}\n\n\/\/ \u30c6\u30b9\u30c8\u672c\u4f53\nexport default function() {\n  \/\/ \u30a4\u30c6\u30ec\u30fc\u30b7\u30e7\u30f3\u3054\u3068\u306b\u3001VU \u3067\u4f7f\u3046\u30e6\u30fc\u30b6ID\u3092\u30e9\u30f3\u30c0\u30e0\u306b\u6c7a\u3081\u308b\n  let user = (function(){\n    let userOption;\n    if(exec.test.options.scenarios.default.stages)\n      userOption = csvUsers[__VU % exec.test.options.scenarios.default.stages[0].target];\n    else\n      userOption = csvUsers[__VU % exec.test.options.scenarios.default.vus];\n      \n    return userOption;\n  })();\n\n  console.debug(`VU ${__VU} on iteration ${__ITER} has user ID ${user.id}...`);\n  \n  \/\/ \u30e6\u30fc\u30b6\u3054\u3068\u306b\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u3092\u4fdd\u6301\u3059\u308b\u305f\u3081 cookie \u3092\u8a2d\u5b9a\u3059\u308b\n  \/\/ 1\u5ea6\u8aad\u3093\u3060\u3089\u30b0\u30ed\u30fc\u30d0\u30eb\u5909\u6570\u306b\u4fdd\u6301\u3057\u3066\u304a\u304d\u3001\u5225\u30a4\u30c6\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u518d\u30ed\u30b0\u30a4\u30f3\u3057\u306a\u3044\n  \/\/ \u3082\u3057\u3053\u3053\u3067\u30a8\u30e9\u30fc\u306b\u306a\u3063\u305f\u5834\u5408\u3001\u6bce\u56deNG\u3068\u306a\u308a\u3001\n  \/\/ \u8a66\u9a13\u304c\u304b\u306a\u308a\u9045\u304f\u306a\u308b\u306e\u3067\u6ce8\u610f\u3059\u308b\u3053\u3068\n  if (globalThis.cookies[user.id] === undefined) {\n    const res = http.get(loginUrl);\n\n    \/\/ \u4e0b\u8a18\u306fxsrf\u5bfe\u7b56\u306e\u305f\u3081\u306etoken\u3092\u6301\u3064\u3088\u3046\u306a\u30b5\u30a4\u30c8\u306e\u5834\u5408\u3092\u60f3\u5b9a\u3057\u3066\u3044\u307e\u3059\n    \/\/ find path \u3068 \u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u3001\u30e1\u30bd\u30c3\u30c9\u30bf\u30a4\u30d7 \u306f\u9069\u5b9c\u8abf\u6574\u3057\u3066\u304f\u3060\u3055\u3044\n    const elem = res.html().find('input[name=_token]');\n    console.debug('globalThis.cookies[user.id] is undefined: ' + user.id);\n    const formdata = {\n        email: user.id,\n        password: user.password,\n        _token: elem.attr('value')\n      };\n\n    const headers = { 'Referer': loginUrl };\n    const response = http.post(loginUrl, formdata, { headers: headers });\n    sleep(5);\n\n    const checkRes = check(response, {\n      'status was 200': (r) =&gt; r.status == 200,\n    }) || fail('status was not 200 ' + res.url );\n\n    console.debug('VU ' + __VU + ' response ' + JSON.stringify(response));\n\n    \/\/ cookie \u3068 token \u3092 VU\u3054\u3068\u306b\u4fdd\u6301\u3059\u308b\n    \/\/ token\u306e\u30bb\u30ec\u30af\u30bf\u3084\u3001\u5404 Set-Cookie \u306e\u9805\u76ee\u306f\u30b1\u30fc\u30b9\u30d0\u30a4\u30b1\u30fc\u30b9\u306a\u306e\u3067\u6ce8\u610f\u3059\u308b\u3053\u3068\n    globalThis.cookies[user.id] = http.cookieJar().cookiesForURL(targetUrl);\n    globalThis.token[user.id] = response.html().find('input[name=_token]').attr('value');\n \n    if( response.headers.hasOwnProperty('Set-Cookie') ){\n      if( response.headers['Set-Cookie'].match(\/XSRF-TOKEN=(.+?);\/) ){\n        globalThis.xsrf_token[user.id] = response.headers['Set-Cookie'].match(\/XSRF-TOKEN=(.+?);\/)[1];\n        globalThis.cookies[user.id]['XSRF-TOKEN'] = [ globalThis.xsrf_token[user.id] ];\n      }\n      if( response.headers['Set-Cookie'].match(\/globalThis.fit_session=(.+?);\/) ){\n        globalThis.fit_session[user.id] = response.headers['Set-Cookie'].match(\/globalThis.fit_session=(.+?);\/)[1];\n        globalThis.cookies[user.id]['globalThis.fit_session'] = [ globalThis.fit_session[user.id] ];\n      }\n      console.debug('VU ' + __VU + ' set cookie. ' + JSON.stringify(globalThis.cookies[user.id]));\n    }\n  } else {\n    console.debug('globalThis.cookies[user.id] is defined: ' + user.id);\n  }\n\n  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  \/\/ main\n\n  \/\/ \u5b9f\u65bd\u3059\u308b\u30b0\u30eb\u30fc\u30d7\u540d\u3092\u30e9\u30f3\u30c0\u30e0\u306b\u6c7a\u5b9a\u3059\u308b\n  let gName = groupNames[ randomIntBetween(1, groupNames.length) -1 ];\n\n  \/\/ \u4ee5\u4e0b\u3001\u30b0\u30eb\u30fc\u30d7\u3054\u3068\u306b\u5b9f\u884c\u3059\u308b\n  group(gName, function(){\n    \/\/ testCases is readonly, so deepcopy body and headers.\n    let batch = [\n      ...new Set( testCases.filter(item=&gt;item.name === gName).map(item =&gt; [\n        item.method,\n        `${targetUrl}${item.url}`,\n        JSON.parse(JSON.stringify(item.body)),\n        JSON.parse(JSON.stringify(item.params))\n      ]) )\n    ];\n    \n    \/\/ Har\u306e token\u3092\u5b9f\u969b\u306e\u3082\u306e\u306b\u4ed8\u3051\u66ff\u3048\u308b\uff08\u30ea\u30af\u30a8\u30b9\u30c8\u30d8\u30c3\u30c0\u4e2d\u306e\u3082\u306e\u3082\u5168\u90e8\u5909\u3048\u308b\uff09\n    batch.forEach( item =&gt; {\n      item[1] = item[1].replace(\/token%5B%5D=(.+?)&amp;\/g,'token%5B%5D=' + globalThis.token[user.id] + '&amp;');\n\n      if( item[2] !== null ){\n        item[2]._token = globalThis.token[user.id];\n      }\n\n      console.debug('VU ' + __VU + ' current cookie. ' + JSON.stringify(globalThis.cookies[user.id]));\n      item[3].headers.cookie = JSON.stringify(globalThis.cookies[user.id]).replace(\/\\[|\\||\\]|\"|\\{|\\}\/g,'').replace(\/,\/g,'; ').replace(\/:\/g,'=');\n      item[3].jar = globalThis.cookies[user.id];\n      item[3].headers.referer = targetUrl + '\/' + gName;\n      if( item[3].headers.hasOwnProperty('x-csrf-token') ){\n        console.debug('VU ' + __VU + 'x-csrf-token :' + globalThis.token[user.id] );\n        item[3].headers['x-csrf-token'] = [ globalThis.token[user.id] ];\n      }\n      if( item[3].headers.hasOwnProperty('x-xsrf-token') ){\n        console.debug('VU ' + __VU + 'x-xsrf-token :' + globalThis.cookies[user.id]['XSRF-TOKEN'] );\n        item[3].headers['x-xsrf-token'] = [ decodeURIComponent(globalThis.cookies[user.id]['XSRF-TOKEN']) ] ;\n      }\n      console.debug('VU ' + __VU + ' header cookie. ' + item[3].headers.cookie);\n\n      \/\/ \u30d0\u30c3\u30c1\u5b9f\u884c\n      let res = http.batch([item])[0];\n\n      \/\/ \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u30c7\u30d0\u30c3\u30b0\u304c\u3057\u305f\u3044\u5834\u5408\u306e\u4f8b(ajax\u547c\u3073\u51fa\u3057\u5185\u5bb9\u306e\u78ba\u8a8d\uff09\n      \/\/ if( res.url.startsWith( targetUrl+'\/' + gName + '?draw' ) ){\n      \/\/   console.debug('\\u001b[32m' +'----------------------------------------' + '\\u001b[0m' + JSON.stringify(res));\n      \/\/   sleep(30);\n      \/\/ }\n\n      check(res,\n        {\n          'status was 200': (r) =&gt; {\n            return r.status == 200;\n          }\n        },\n        {\n          status: res.status,\n          name: item[0],\n          failure_reason: res.error,\n        }\n      ) || fail(\n        'VU '\n           + __VU\n           + '(' + +')'\n           + ' status was not 200 '\n           + res.url\n           + res.body\n           + res.header\n           + ' item[0]: ' +  JSON.stringify(item[0])\n           + ' item[1]: ' +  JSON.stringify(item[1])\n           + ' item[2]: ' +  JSON.stringify(item[2])\n           + ' item[3]: ' +  JSON.stringify(item[3])\n      );\n\n      \/\/ Set-Cookie \u30ec\u30b9\u30dd\u30f3\u30b9\u30d8\u30c3\u30c0\u304c\u3042\u308c\u3070\u30b0\u30ed\u30fc\u30d0\u30eb\u5909\u6570\u3092\u66f4\u65b0\u3059\u308b\n      if( res.status == 200 &amp;&amp; res.headers.hasOwnProperty('Set-Cookie') ){\n        if( res.headers['Set-Cookie'].match(\/XSRF-TOKEN=(.+?);\/) ){\n          console.debug('VU ' + __VU + ' Response has Set-Cookie header . ' + res.headers['Set-Cookie']);\n          console.debug('VU ' + __VU + ' updated current cookie. ' + JSON.stringify(globalThis.cookies[user.id]));\n          globalThis.xsrf_token[user.id] = res.headers['Set-Cookie'].match(\/XSRF-TOKEN=(.+?);\/)[1];\n          globalThis.cookies[user.id]['XSRF-TOKEN'] = [ globalThis.xsrf_token[user.id] ];\n        }\n        if( res.headers['Set-Cookie'].match(\/globalThis.fit_session=(.+?);\/) ){\n          console.debug('VU ' + __VU + ' updated current cookie. ' + JSON.stringify(globalThis.cookies[user.id]));\n          globalThis.fit_session[user.id] = res.headers['Set-Cookie'].match(\/globalThis.fit_session=(.+?);\/)[1];\n          globalThis.cookies[user.id]['globalThis.fit_session'] = [ globalThis.fit_session[user.id] ];\n        } \n      }\n\n      \/\/ \u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u5148\u306b token \u306eINPUT\u8981\u7d20\u304c\u3042\u308c\u3070\u30b0\u30ed\u30fc\u30d0\u30eb\u5909\u6570\u3092\u66f4\u65b0\u3059\u308b\n      if( res.html().find('input[name=_token]') !== undefined &amp;&amp; res.html().find('input[name=_token]').attr('value') !== undefined){\n        console.debug('VU ' + __VU + ' globalThis.token( updated ) : ' + res.html().find('input[name=_token]').attr('value') );\n        globalThis.token[user.id] = res.html().find('input[name=_token]').attr('value');\n      }\n\n      \/\/ \u30b0\u30eb\u30fc\u30d7\u3054\u3068\u306b\u30ab\u30b9\u30bf\u30e0\u30e1\u30c8\u30ea\u30af\u30b9\u3068\u3057\u3066\u96c6\u8a08\u3059\u308b\n      globalThis[gName+'_trend_http_req_blocked'].add(res.timings.blocked);\n      globalThis[gName+'_trend_http_req_connecting'].add(res.timings.connecting);\n      globalThis[gName+'_trend_http_req_duration'].add(res.timings.duration);\n      globalThis[gName+'_trend_http_req_receiving'].add(res.timings.receiving);\n      globalThis[gName+'_trend_http_req_sending'].add(res.timings.sending);\n      globalThis[gName+'_trend_http_req_waiting'].add(res.timings.waiting);\n    });\n  });\n}\n<\/pre>\n<p>\u6b21\u56de\u306f\u53ef\u8996\u5316\u30c4\u30fc\u30eb Grafana \u3092\u5229\u7528\u3057\u3066\u3001\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u306b\u30b0\u30eb\u30fc\u30d7\u5225\u306e\u5b9f\u884c\u72b6\u614b\u3092\u8868\u793a\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u7d39\u4ecb\u3059\u308b\u4e88\u5b9a\u3067\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u30af\u30e9\u30a6\u30c9\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u90e8\u306e\u85e4\u4e95\u3067\u3059\u3002 \u8ca0\u8377\u8a66\u9a13\u30c4\u30fc\u30eb k6 \u306e\u7d39\u4ecb\u8a18\u4e8b\u306e\u7b2c\uff12\u5f3e\u3068\u3057\u3066\u3001\u5fdc\u7528\u4f8b\u3092\u89e3\u8aac\u3055\u305b\u3066\u3044\u305f\u3060\u304d\u307e\u3059\u3002 k6 \u3063\u3066\u4f55\u3060\u308d\u3046\u3068\u3044\u3046\u65b9\u306f\u3001\u305c\u3072\u3053\u3061\u3089\u306e\u8a18\u4e8b\u3092\u3054\u53c2\u7167\u304f\u3060\u3055\u3044\u3002<\/p>\n","protected":false},"author":94,"featured_media":10098,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[140,141,139],"_links":{"self":[{"href":"https:\/\/www.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/posts\/10092"}],"collection":[{"href":"https:\/\/www.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/users\/94"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ecomottblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10092"}],"version-history":[{"count":12,"href":"https:\/\/www.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/posts\/10092\/revisions"}],"predecessor-version":[{"id":10173,"href":"https:\/\/www.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/posts\/10092\/revisions\/10173"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/media\/10098"}],"wp:attachment":[{"href":"https:\/\/www.ecomottblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ecomottblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ecomottblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}