{"id":228,"date":"2023-01-26T00:31:31","date_gmt":"2023-01-25T15:31:31","guid":{"rendered":"https:\/\/hirabay.net\/?p=228"},"modified":"2025-01-06T14:16:29","modified_gmt":"2025-01-06T05:16:29","slug":"%e3%80%90locust%e3%80%91%e3%82%b3%e3%83%94%e3%83%9a%e3%81%a7%e4%bd%bf%e3%81%88%e3%82%8b%e3%82%b3%e3%83%bc%e3%83%89%e3%83%bb%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e9%9b%86","status":"publish","type":"post","link":"https:\/\/hirabay.net\/?p=228","title":{"rendered":"\u3010Locust\u3011\u30b3\u30d4\u30da\u3067\u4f7f\u3048\u308b\u30b3\u30fc\u30c9\u30fb\u30b3\u30de\u30f3\u30c9\u96c6"},"content":{"rendered":"\n<p>\u3053\u308c\u307e\u3067Jmeter\u3092\u4f7f\u3063\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001<br>\u697d\u306b\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u304c\u3067\u304d\u305d\u3046\u3068\u3044\u3046\u3053\u3068\u3067\u6700\u8fd1\u306fLocust\u3092\u4f7f\u3046\u3088\u3046\u306b\u306a\u3063\u305f\u306e\u3067\u3001<br>\u5099\u5fd8\u9332\u3092\u517c\u306d\u3066\u4f7f\u3044\u65b9\u3092\u307e\u3068\u3081\u307e\u3059\uff01<\/p>\n\n\n\n<p>\u81ea\u5206\u306e\u73fe\u5834\u3067\u3082\u4f7f\u3063\u3066\u3044\u308b\u3088\u3046\u306a\u30b3\u30fc\u30c9\u30fb\u30b3\u30de\u30f3\u30c9\u3092\u30b3\u30d4\u30da\u3067\u305d\u306e\u307e\u307e\u4f7f\u3048\u308b\u3088\u3046\u307e\u3068\u3081\u3066\u307f\u3066\u3044\u307e\u3059\u306e\u3067\u3001<br>\u8aad\u8005\u306e\u307f\u306a\u3055\u307e\u306e\u300cLocust\u3092\u4f7f\u3063\u3066\u307f\u308b\u300d\u30cf\u30fc\u30c9\u30eb\u3092\u4e0b\u3052\u3089\u308c\u305f\u3089\u5e78\u3044\u3067\u3059\uff01<\/p>\n\n\n\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/c4179872\/public_html\/hirabay.net\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>110<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/c4179872\/public_html\/hirabay.net\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>115<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/c4179872\/public_html\/hirabay.net\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>122<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">\n  <li class=\"first\">\n    <a href=\"#i-0\">\u74b0\u5883\u69cb\u7bc9<\/a>\n  <\/li>\n  <li>\n    <a href=\"#i-1\">\u3068\u308a\u3042\u3048\u305a\u52d5\u304f\u3068\u3053\u308d\u307e\u3067<\/a>\n    <ul class=\"menu_level_1\">\n      <li class=\"first\">\n        <a href=\"#i-2\">\u6e96\u5099<\/a>\n      <\/li>\n      <li class=\"last\">\n        <a href=\"#i-3\">\u8d77\u52d5<\/a>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li>\n    <a href=\"#i-4\">master \/ slave\u69cb\u6210<\/a>\n    <ul class=\"menu_level_1\">\n      <li class=\"first\">\n        <a href=\"#i-5\">docker\u6e96\u5099<\/a>\n      <\/li>\n      <li>\n        <a href=\"#i-6\">\u8d77\u52d5sh\u4f5c\u6210<\/a>\n      <\/li>\n      <li>\n        <a href=\"#i-7\">Dockerfile<\/a>\n      <\/li>\n      <li>\n        <a href=\"#i-8\">docker-compose.yml<\/a>\n      <\/li>\n      <li class=\"last\">\n        <a href=\"#i-9\">\u8d77\u52d5<\/a>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li class=\"last\">\n    <a href=\"#i-10\">\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/a>\n    <ul class=\"menu_level_1\">\n      <li class=\"first\">\n        <a href=\"#i-11\">\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u30ed\u30b0\u306b\u51fa\u529b<\/a>\n      <\/li>\n      <li class=\"last\">\n        <a href=\"#i-12\">\u30ec\u30b9\u30dd\u30f3\u30b9\u304c\u4e00\u5b9a\u30e9\u30a4\u30f3\u3092\u8d85\u3048\u305f\u3089\u5f37\u5236\u7d42\u4e86<\/a>\n      <\/li>\n    <\/ul>\n  <\/li>\n<\/ul>\n\n      \n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">\u74b0\u5883\u69cb\u7bc9<\/h2>\n\n\n\n<p>\u3053\u3053\u3067\u306fCentOS\u30d9\u30fc\u30b9\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u69cb\u7bc9\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-bash\" data-lang=\"Bash\"><code># python\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u78ba\u8a8d\uff082023\/01\u6642\u70b9\u3067\u306f3.7\u4ee5\u4e0a\u304c\u5fc5\u8981\uff09\n$ python --version\nPython 3.11.0\n\n# \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n$ pip3 install locust<\/code><\/pre><\/div>\n\n\n\n<p>\u516c\u5f0f\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806\u306f\u3053\u3061\u3089\u3067\u3059<\/p>\n\n\n<p><\/p><div class=\"linkcard\"><div class=\"lkc-external-wrap\"><a class=\"lkc-link no_icon\" href=\"https:\/\/docs.locust.io\/en\/stable\/installation.html\" target=\"_blank\" rel=\"external noopener\"><div class=\"lkc-card\"><div class=\"lkc-info\"><img loading=\"lazy\" decoding=\"async\" class=\"lkc-favicon\" src=\"https:\/\/www.google.com\/s2\/favicons?domain=docs.locust.io\" alt=\"\" width=\"16\" height=\"16\"><div class=\"lkc-domain\">docs.locust.io<\/div>&nbsp;<div class=\"lkc-share\"> <div class=\"lkc-sns-hb\">2 Users<\/div> <div class=\"lkc-sns-po\">36 Pockets<\/div><\/div><\/div><div class=\"lkc-content\"><figure class=\"lkc-thumbnail\"><img decoding=\"async\" class=\"lkc-thumbnail-img\" src=\"https:\/\/s.wordpress.com\/mshots\/v1\/https%3A%2F%2Fdocs.locust.io%2Fen%2Fstable%2Finstallation.html?w=200\" alt=\"\"><\/figure><div class=\"lkc-title\"><div class=\"lkc-title-text\">Installation \u2014 Locust 2.14.2 documentation<\/div><\/div><div class=\"lkc-url\">https:\/\/docs.locust.io\/en\/stable\/installation.html<\/div><div class=\"lkc-excerpt\"><\/div><\/div><div class=\"clear\"><\/div><\/div><\/a><\/div><\/div>\n\n\n\n<p>\u9ad8\u8ca0\u8377\u306a\u30c6\u30b9\u30c8\u3092\u884c\u3044\u305f\u3044\u5834\u5408\u3001file open\u6570\u3082\u6c17\u306b\u3057\u3066\u304a\u304f\u3068\u3088\u3044\u3067\u3059\u3002<br>\u4eee\u306b\u540c\u6642\u306b300\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u5b9f\u52b9\u3059\u308b\u30c6\u30b9\u30c8\u3092\u884c\u3044\u305f\u3044\u5834\u5408file open\u3082300\u4ee5\u4e0a\u306b\u3057\u3066\u304a\u304f\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-bash\" data-lang=\"Bash\"><code># \u78ba\u8a8d\nulimit -n\n&gt; 65535\n\n# \u5909\u66f4\u3057\u305f\u3044\u5834\u5408\nvi \/etc\/security\/limits.conf<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-1\">\u3068\u308a\u3042\u3048\u305a\u52d5\u304f\u3068\u3053\u308d\u307e\u3067<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u6e96\u5099<\/h3>\n\n\n\n<p>Locust\u306e\u52d5\u4f5c\u306b\u95a2\u308f\u308b\u5b9a\u7fa9\u306f<code>locustfile.py<\/code>\u306b\u8a18\u8f09\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3072\u3068\u307e\u305aget\u3068post\u306eAPI\u306b\u30ea\u30af\u30a8\u30b9\u30c8\u3059\u308b\u30b5\u30f3\u30d7\u30eb\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-python\" data-file=\"locustfile.py\" data-lang=\"Python\"><code>from locust import task, constant_throughput, HttpUser\n\n# \u30af\u30e9\u30b9\u540d\u306f\u4efb\u610f\uff08HttpUser\uff09\u3092\u7d99\u627f\u3059\u308b\nclass SampleUser(HttpUser):\n    # API(\u30b7\u30ca\u30ea\u30aa)\u3054\u3068\u306b@task\u3092\u4ed8\u4e0e\u3057\u305f\u30e1\u30bd\u30c3\u30c9\u3092\u5b9a\u7fa9\u3059\u308b\n    # @task\u306e\u5f15\u6570\u306b\u306f\u8ca0\u8377\u3092\u304b\u3051\u308b\u6bd4\u91cd\u3092\u6307\u5b9a\uff08\u3053\u306e\u5b9f\u88c5\u3060\u3068get:post = 2:1\u306e\u5272\u5408\u3067API\u30b3\u30fc\u30eb\u3059\u308b\uff09\n    @task(2)\n    def get_request(self):\n        value = \"value\"\n        self.client.get(f\"\/sample?key={value}\")\n\n    @task(1)\n    def post_request(self):\n        self.client.post(\"\/sample\", json={\"key\": \"value\"})\n\n    # 1\u30b9\u30ec\u30c3\u30c9\u5f53\u305f\u308a\u306e1\u79d2\u9593\u306e\u6700\u5927\u5b9f\u884c\u6570\u3092\u6307\u5b9a\n    # 1\u306b\u6307\u5b9a\u3057\u3066\u304a\u3051\u3070\u30b9\u30ec\u30c3\u30c9\u6570\u4ee5\u4e0a\u306e\u6027\u80fd\u304c\u3067\u306a\u3044\u306e\u3067\u3001\u8ca0\u8377\u3092\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u3057\u3084\u3059\u3044\n    wait_time = constant_throughput(1)\n    # \uff08\u4efb\u610f\uff09UI\u4e0a\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30db\u30b9\u30c8\u3092\u6307\u5b9a\u3059\u308b\n    host = 'http:\/\/localhost:8080'<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">\u8d77\u52d5<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-bash\" data-lang=\"Bash\"><code>$ locust\n# \u3053\u308c\u3068\u4e00\u7dd2\n# locust -f .\/locustfile.py<\/code><\/pre><\/div>\n\n\n\n<p>8089\u30dd\u30fc\u30c8\u3067UI\u304c\u8d77\u52d5\u3059\u308b\u306e\u3067 <a rel=\"noreferrer noopener\" href=\"http:\/\/localhost:8089\" target=\"_blank\">http:\/\/localhost:8089<\/a> \u306b\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"459\" src=\"https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-4-1024x459.png\" alt=\"\" class=\"wp-image-233\" style=\"width:788px;height:353px\" srcset=\"https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-4-1024x459.png 1024w, https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-4-300x134.png 300w, https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-4-768x344.png 768w, https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-4-1536x688.png 1536w, https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-4-940x421.png 940w, https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-4.png 1887w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\"><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Number of users\n<ul class=\"wp-block-list\">\n<li>\u60f3\u5b9a\u30e6\u30fc\u30b6\u30fc\u6570<\/li>\n\n\n\n<li>\u30a2\u30af\u30bb\u30b9\u5143\u306e\u30b9\u30ec\u30c3\u30c9\u6570\u3068\u8003\u3048\u308c\u3070OK<\/li>\n\n\n\n<li>\u76ee\u6a19rps = \u30e6\u30fc\u30b6\u30fc\u6570 \/ (\u30ec\u30b9\u30dd\u30f3\u30b9\u30bf\u30a4\u30e0 + time wait)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Spawn rate\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u3048\u307010\u3068\u8a2d\u5b9a\u3059\u308b\u30681\u79d2\u9593\u306b10\u305a\u3064\u30e6\u30fc\u30b6\u30fc\u6570\u304c\u5897\u3048\u3066\u3044\u304f<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Host\n<ul class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30c8\u30b3\u30eb\uff0b\u30db\u30b9\u30c8\uff0b\u30dd\u30fc\u30c8\u3092\u6307\u5b9a<\/li>\n\n\n\n<li><code>http:\/\/localhost:8080<\/code>\u3068\u304b<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Start swarming\u3067\u8d77\u52d5\uff01<\/p>\n\n\n\n<p>Charts\u30bf\u30d6\u3092\u898b\u308b\u3068\u8a66\u9a13\u72b6\u6cc1\u304c\u78ba\u8a8d\u3067\u304d\u307e\u3059\uff01<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"466\" src=\"https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-5-1024x466.png\" alt=\"\" class=\"wp-image-234\" srcset=\"https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-5-1024x466.png 1024w, https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-5-300x137.png 300w, https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-5-768x350.png 768w, https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-5-1536x700.png 1536w, https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-5-940x428.png 940w, https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/image-5.png 1879w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\"><\/figure>\n\n\n\n<p>\u7c21\u5358\u306b\u898b\u65b9\u3084\u4f7f\u3044\u65b9\u3092<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>STATUS\n<ul class=\"wp-block-list\">\n<li>\u3007\u3007users\u90e8\u5206\u3067\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u6570\uff08\u30b9\u30ec\u30c3\u30c9\u6570\uff09\u3092\u628a\u63e1\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u300cEdit\u300d\u3067\u300cNumber of users\u300d\u3068\u300cSpawn rate\u300d\u3092\u518d\u8a2d\u5b9a\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u2192\u6bb5\u968e\u7684\u306b\u8ca0\u8377\u3092\u4e0a\u3052\u305f\u3044\u5834\u5408\u306b\u306f\u3053\u306eEdit\u304b\u3089<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>RPS\n<ul class=\"wp-block-list\">\n<li>\u73fe\u5728\u306eRPS\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u307e\u3059<\/li>\n\n\n\n<li>\u8907\u6570\u306eAPI\u306e\u5408\u8a08\u306erps\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u500b\u5225\u306e\u60c5\u5831\u304c\u898b\u305f\u3044\u5834\u5408\u306f\u300cStatistics\u300d\u30bf\u30d6\u304b\u3089<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>FAILURES\n<ul class=\"wp-block-list\">\n<li>HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u304c200\u4ee5\u5916\u306e\u5272\u5408\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u307e\u3059<\/li>\n\n\n\n<li>\u57fa\u672c200\u4ee5\u5916\u304c\u3042\u3063\u305f\u3089\u8ca0\u8377\u306b\u8010\u3048\u304d\u308c\u3066\u306a\u3044\u7cfb\u3060\u3068\u601d\u3044\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\"><br>master \/ slave\u69cb\u6210<\/h2>\n\n\n\n<p>Locust\u306fmaster\/slave\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u53ef\u80fd\u3067\u3059\uff01<\/p>\n\n\n\n<p>\u3053\u3053\u3067\u306fDocker\u3092\u4f7f\u7528\u3057\u3066\u69cb\u6210\u3057\u3066\u307f\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<br>\u203bKubernetes\u3068\u304b\u306b\u3082\u5fdc\u7528\u304c\u5229\u304f\u306f\u305a\u2026\uff01<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">docker\u6e96\u5099<\/h3>\n\n\n\n<p>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806\u306f\u7701\u7565\u3057\u307e\u3059\u304c\u3001<br>\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u304c\u53e9\u3051\u3066\u3044\u308c\u3070OK\u3067\u3059\uff01<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-bash\" data-lang=\"Bash\"><code>$ docker --version\nDocker version 20.10.23, build 7155243\n$ docker-compose --version\ndocker-compose version 1.28.2, build 67630359<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u8d77\u52d5sh\u4f5c\u6210<\/h3>\n\n\n\n<p>\u74b0\u5883\u5909\u6570\u306b\u3088\u3063\u3066\u8d77\u52d5\u30e2\u30fc\u30c9\u3092\u5909\u66f4\u3067\u304d\u308b\u3088\u3046\u30b7\u30a7\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-bash\" data-file=\"run.sh\" data-lang=\"Bash\"><code>#!\/bin\/bash\n\necho \"mode: $MODE\"\n\nif [ \"$MODE\" == 'master' ]; then\n  locust --master\nelif [ \"$MODE\" == 'slave' ]; then\n  locust --slave --master-host=locust-master\nfi<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">Dockerfile<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-dockerfile\" data-file=\"Dockerfile\" data-lang=\"Docker\"><code>FROM python:3.11.0\n\nRUN pip3 install locust\n\nWORKDIR \/locust\nCOPY .\/locustfile.py .\nCOPY .\/run.sh .\nRUN chmod +x .\/run.sh\n\nENTRYPOINT [\".\/run.sh\"]<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">docker-compose.yml<\/h3>\n\n\n\n<p>slave\u3092\uff13\u53f0\u8d77\u52d5\u3059\u308b\u4f8b\u3067\u3059\uff01<\/p>\n\n\n\n<p>\u203b\u30b3\u30de\u30f3\u30c9\u7684\u306b\u306fslave \u2192 worker\u3068\u306a\u3063\u3066\u3044\u305f\u306e\u3067worker\u304c\u6b63\u3057\u3044\u8a00\u8449\u306a\u306e\u304b\u3082\u2026<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-yaml\" data-file=\"docker-compose.yml\" data-lang=\"Yaml\"><code>version: '2'\nx-locust-service: &amp;locust-service\n  build: .\nservices:\n  locust-master:\n    &lt;&lt;: *locust-service\n    ports:\n      - \"8089:8089\"\n    environment:\n      MODE: master\n  locust-slave-1:\n    &lt;&lt;: *locust-service\n    environment:\n      MODE: slave\n  locust-slave-2:\n    &lt;&lt;: *locust-service\n    environment:\n      MODE: slave\n  locust-slave-3:\n    &lt;&lt;: *locust-service\n    environment:\n      MODE: slave<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u8d77\u52d5<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-plain\"><code>docker-compose -f docker-compose.yml up -d\n# \u958b\u767a\u6642\u306f\u6bce\u56debuild\n# docker-compose -f docker-compose.yml up -d --build<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-10\">\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/h2>\n\n\n\n<p>\u3053\u3053\u304b\u3089\u306f\u300c\u3084\u308a\u305f\u3044\u3053\u3068\u300d\u3092\u30d9\u30fc\u30b9\u306bLocust\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5\u3092\u307e\u3068\u3081\u307e\u3059\uff01<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u30ed\u30b0\u306b\u51fa\u529b<\/h3>\n\n\n\n<p>UI\u306e\u300cFailures\u300d\u3067\u3082\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\u3053\u3068\u306f\u308f\u304b\u308b\u306e\u3067\u3059\u304c\u3001<br>\u539f\u56e0\u307e\u3067\u8ffd\u304a\u3046\u3068\u3059\u308b\u3068\u60c5\u5831\u304c\u8db3\u308a\u306a\u3044\u3053\u3068\u304c\u591a\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u305d\u3093\u306a\u3068\u304d\u306f<code>@events.request.add_listener<\/code>\u3092\u4f7f\u7528\u3057\u3066\u30ed\u30b0\u3092\u51fa\u529b\u3059\u308b\u3068\u3088\u3044\u3067\u3059\uff01<br>\u203b\u30b3\u30fc\u30c9\u306f\u5909\u66f4\u70b9\u306e\u307f<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-python\" data-file=\"locustfile.py\" data-lang=\"Python\"><code>from locust import events\nimport uuid\nimport logging\n\nclass SampleUser(HttpUser):\n    @task(1)\n    def error(self):\n        # listener\u3067\u30ea\u30af\u30a8\u30b9\u30c8\u30fb\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u7d10\u3065\u3051\u3092\u3059\u308b\u305f\u3081\u306bcontext\u3092\u8a2d\u5b9a\u3057\u3066\u304a\u304f\n        self.client.get(\"\/ng\", context={\"requestId\": str(uuid.uuid4())})\n\n# 1\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u5b8c\u4e86\u3057\u305f\u6bb5\u968e\u3067\u547c\u3070\u308c\u308bListener\u306e\u5b9a\u7fa9\n@events.request.add_listener\ndef logging_response(request_type, name, response_time, response_length, response,\n                     context, exception, **kwargs):\n    # \u30a8\u30e9\u30fc\u767a\u751f\u6642\u306e\u307f\u30ed\u30b0\u51fa\u529b\n    if not response.ok:\n        requestId = context[\"requestId\"]\n        logging.info(f\"[request event] path: {name} status: {response.status_code} body: {response.text} requestId: {requestId}\")<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-plain\" data-file=\"\u5b9f\u969b\u306e\u30ed\u30b0\"><code>[2023-01-26 10:53:49,471] XXXX-XXXXXXXX\/INFO\/root: [request event] path: \/ng status: 500 body: ng requestId: f92ccc00-a970-41e5-9a68-b434474f705f\n[2023-01-26 10:53:50,471] XXXX-XXXXXXXX\/INFO\/root: [request event] path: \/ng status: 500 body: ng requestId: ac01dd82-ab75-4af6-874c-fb793c72e2fb<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">\u30ec\u30b9\u30dd\u30f3\u30b9\u304c\u4e00\u5b9a\u30e9\u30a4\u30f3\u3092\u8d85\u3048\u305f\u3089\u5f37\u5236\u7d42\u4e86<\/h3>\n\n\n\n<p>\u3082\u3057\u8ca0\u8377\u8a66\u9a13\u3092\u6700\u60aa\u30e6\u30fc\u30b6\u306b\u3082\u5f71\u97ff\u304c\u51fa\u304b\u306d\u306a\u3044\u74b0\u5883\u3067\u5b9f\u65bd\u3057\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044\u5834\u5408\u3001<br>\u51e6\u7406\u304c\u8a70\u307e\u308a\u59cb\u3081\u305f\u3089\uff1d\u30ec\u30b9\u30dd\u30f3\u30b9\u304c\u60aa\u5316\u3057\u59cb\u3081\u305f\u3089\u30c6\u30b9\u30c8\u3092\u4e2d\u65ad\u3057\u305f\u3044\u3068\u3044\u3046\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>UI\u3060\u3068\u30dc\u30bf\u30f3\u3067\u6b62\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u304c\u3001\u4e3b\u306bCLI\u5411\u3051\u306b<\/p>\n\n\n\n<p><code>\u5e73\u5747\u30ec\u30b9\u30dd\u30f3\u30b9\u304c 60s\u3092\u8d85\u3048\u305f\u3089STOP<\/code><\/p>\n\n\n\n<p>\u3068\u3044\u3046\u8981\u4ef6\u3092\u5b9f\u88c5\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u65e2\u5b58\u306elocustfile.py\u306b\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8ffd\u8a18\u3059\u308b\u3060\u3051\u3067\u3059\uff01<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-plain\"><code>def check_percentile(environment):\n    while not environment.runner.state in [STATE_STOPPING, STATE_STOPPED, STATE_CLEANUP]:\n        # 50%ile (median) response time\n        median_response_time = environment.stats.total.median_response_time\n\n        # Check if the median response time exceeds the threshold\n        if median_response_time &gt; 60_000:  # 60s\n            print(f\"Median response time {int(median_response_time)} exceeded threshold. Stopping test.\")\n            environment.runner.quit()\n            return\n\n        # Sleep for a short period before checking again\n        gevent.sleep(1)\n\n@events.init.add_listener\ndef on_locust_init(environment, **kwargs):\n    # Start a greenlet to monitor the response times\n    gevent.spawn(check_percentile, environment)<\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u308c\u307e\u3067Jmeter\u3092\u4f7f\u3063\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001\u697d\u306b\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u304c\u3067\u304d\u305d\u3046\u3068\u3044\u3046\u3053\u3068\u3067\u6700\u8fd1\u306fLocust\u3092\u4f7f\u3046\u3088\u3046\u306b\u306a\u3063\u305f\u306e\u3067\u3001\u5099\u5fd8\u9332\u3092\u517c\u306d\u3066\u4f7f\u3044\u65b9\u3092\u307e\u3068\u3081\u307e\u3059\uff01 \u81ea\u5206\u306e\u73fe\u5834\u3067\u3082\u4f7f\u3063\u3066\u3044\u308b\u3088\u3046\u306a\u30b3\u30fc\u30c9\u30fb\u30b3\u30de\u30f3\u30c9\u3092\u30b3\u30d4\u30da\u3067\u305d\u306e\u307e &#8230; <\/p>\n","protected":false},"author":1,"featured_media":237,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[49,51,50],"class_list":{"0":"post-228","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-6","8":"tag-locust","9":"tag-python","10":"tag-50"},"jetpack_featured_media_url":"https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/locust.png","_links":{"self":[{"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/posts\/228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hirabay.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=228"}],"version-history":[{"count":11,"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/posts\/228\/revisions"}],"predecessor-version":[{"id":778,"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/posts\/228\/revisions\/778"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/media\/237"}],"wp:attachment":[{"href":"https:\/\/hirabay.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hirabay.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hirabay.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}