{"id":294831,"date":"2019-11-19T09:00:26","date_gmt":"2019-11-19T09:00:26","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=294831"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=294831","title":{"rendered":"Nginx VTS Stats, Mockify \u2014 mock API, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 Wiremock \u0438 Mockify"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\" id=\"post-content-body\">\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0435\u043c\u043e <a href=\"https:\/\/github.com\/vozlt\/nginx-module-vts\">Nginx VTS<\/a> + Prometheus + Grafana. \u0414\u043b\u044f \u0434\u0435\u043c\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0447\u0442\u043e\u0431\u044b upstream \u043c\u043e\u0433\u043b\u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 http \u043a\u043e\u0434\u044b. \u042d\u0442\u043e \u043c\u043e\u0433\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b: <a href=\"https:\/\/github.com\/brianmoran\/mockify\">Mockify<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Golang, \u0438 <a href=\"https:\/\/github.com\/tomakehurst\/wiremock\">WireMock<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Java. <\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Nginx VTS + Prometheus + Grafana;<\/li>\n<li>Mockify \u2014 \u043b\u0435\u0433\u043a\u043e\u0435, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 API, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 Golang;<\/li>\n<li>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f CPU \u0434\u043b\u044f Mockify, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Golang, \u0438 WireMock, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Java.<\/li>\n<\/ul>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">inxi CPU: 8x Single Core Intel Xeon E312xx (Sandy Bridge) (-SMP-) speed: 2594 MHz Kernel: 3.10.0-957.1.3.el7.x86_64 x86_64 Up: 58m  Mem: 474.9\/32011.6 MiB (1.5%) Storage: 80.00 GiB (2.7% used) Procs: 149 Shell: bash 4.2.46 inxi: 3.0.35 <\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433 prometheus:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">global:   scrape_interval:     5s # Set the scrape interval to every 15 seconds. Default is every 1 minute.   evaluation_interval: 5s # Evaluate rules every 15 seconds. The default is every 1 minute.   # scrape_timeout is set to the global default (10s).  # Alertmanager configuration alerting:   alertmanagers:   - static_configs:     - targets:       # - alertmanager:9093  # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files:   # - \"first_rules.yml\"   # - \"second_rules.yml\"  scrape_configs:   - job_name: 'prometheus'     static_configs:     - targets: ['localhost:9090']   - job_name: \u2018nginx_vts_exporter\u2019     static_configs:     - targets: ['localhost:9913']<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433 Grafana \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439. ID \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 2949.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f Nginx VTS \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c nginx \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c nginx-module-vts. \u0414\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/habr.com\/ru\/company\/tinkoff\/blog\/452336\/\">Nginx-builder<\/a>. \u0415\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">nginx_version: 1.16.1 output_package: rpm modules:   - module:       name: nginx-module-vts       git_url: https:\/\/github.com\/vozlt\/nginx-module-vts.git       git_tag: v0.1.18<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 nginx. \u0412\u043e\u0442 \u0435\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 (\u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c vhost_traffic_status_zone;):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">user  nginx; worker_processes  auto; worker_rlimit_nofile 40960;  error_log  \/var\/log\/nginx\/error.log warn; pid        \/var\/run\/nginx.pid;  events {     use epoll;     worker_connections 1024;     multi_accept on; }  http {     vhost_traffic_status_zone;     include       \/etc\/nginx\/mime.types;     default_type  application\/octet-stream;      log_format  main  '$remote_addr - $remote_user [$time_local] \"$request\" '                       '$status $body_bytes_sent \"$http_referer\" '                       '\"$http_user_agent\" \"$http_x_forwarded_for\"';      #access_log \/var\/log\/nginx\/access.log main;     access_log off;     sendfile on;     tcp_nodelay on;     tcp_nopush on;     keepalive_timeout  65;     include \/etc\/nginx\/conf.d\/*.conf;     open_file_cache max=200000 inactive=20s;     open_file_cache_valid 30s;     open_file_cache_min_uses 2;     open_file_cache_errors on; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0441\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">touch vhost1.conf  vhost2.conf  vhost3.conf  vhost4.conf  vhost5.conf<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435:<\/p>\n<p>  <\/p>\n<p>vhost1.conf:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">server {         listen   80;         server_name vhost1;         location \/ {                 proxy_pass http:\/\/127.0.0.1:8001\/102;         } }<\/code><\/pre>\n<p>  <\/p>\n<p>vhost2.conf:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">server {         listen   80;         server_name vhost2;         location \/ {                 proxy_pass http:\/\/127.0.0.1:8001\/204;         } }<\/code><\/pre>\n<p>  <\/p>\n<p>vhost3.conf:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">server {         listen   80;         server_name vhost3;         location \/ {                 proxy_pass http:\/\/localhost:8001\/304;         } }<\/code><\/pre>\n<p>  <\/p>\n<p>vhost4.conf:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">server {         listen   80;         server_name vhost4;         location \/ {                 proxy_pass http:\/\/localhost:8001\/403;         } }<\/code><\/pre>\n<p>  <\/p>\n<p>vhost5.conf:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">server {         listen   80;         server_name vhost5;         location \/ {                 proxy_pass http:\/\/localhost:8001\/503;         } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c nginx-vts-exporter:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">wget https:\/\/github.com\/hnlq715\/nginx-vts-exporter\/releases\/download\/v0.10.3\/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz tar zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz cp nginx-vts-exporter-0.10.3.linux-amd64\/nginx-vts-exporter \/usr\/local\/bin\/nginx-vts-exporter<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \/etc\/systemd\/system\/nginx_vts_exporter.service:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">[Unit] Description=Nginx vts exporter   Wants=network-online.target After=network-online.target [Service] ExecStart=\/usr\/local\/bin\/nginx-vts-exporter -nginx.scrape_uri=http:\/\/localhost:7070\/status\/format\/json Restart=always RestartSec=3 [Install] WantedBy=default.target<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 VTS \/etc\/nginx\/conf.d\/vts-exporter.conf<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">server {  listen 7070;  listen [::]:7070;   location \/ {  }   location \/status {    vhost_traffic_status_display;    vhost_traffic_status_display_format html;   }  }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c DNS \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0441\u0442\u043e\u0432 \u0432 \/etc\/hosts:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">127.0.0.1 vhost1 127.0.0.1 vhost2 127.0.0.1 vhost3 127.0.0.1 vhost4 127.0.0.1 vhost5<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043f\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u044f\u0434\u0440\u043e \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a wiremock \u0432\u044b\u0434\u0430\u0432\u0430\u043b timeout \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439. \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u043e\u043d\u043e \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 apache benchmark. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \/etc\/sysctl.d\/90-nginx.conf \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">fs.file-max=100000 net.netfilter.nf_conntrack_max=1548576 net.ipv4.ip_local_port_range=10000 65000 net.ipv4.tcp_tw_reuse=1 net.core.somaxconn=15600 net.ipv4.tcp_fin_timeout=15 net.ipv4.tcp_tw_recycle=1 net.core.rmem_default=31457280 net.core.rmem_max=12582912 net.core.wmem_default=31457280 net.core.wmem_max=12582912 net.core.netdev_max_backlog=65536 net.core.optmem_max=25165824 net.ipv4.tcp_rmem=8192 87380 16777216 net.ipv4.udp_rmem_min=16384 net.ipv4.tcp_wmem=8192 65536 16777216<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">sysctl -p \/etc\/sysctl.d\/90-nginx.conf <\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c mockify-rpm<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">yum -y install yum-plugin-copr yum copr enable antonpatsev\/mockify-rpm yum -y install mockify systemctl start mockify<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Apache Benchmark:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">yum install -y httpd-tools<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 nginx:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">while true; do ab -c 1 -n 1 -t 1 http:\/\/vhost1\/; sleep 2; done while true; do ab -c 1 -n 1 -t 1 http:\/\/vhost2\/; sleep 2; done while true; do ab -c 1 -n 1 -t 1 http:\/\/vhost3\/; sleep 2; done while true; do ab -c 1 -n 1 -t 1 http:\/\/vhost4\/; sleep 2; done while true; do ab -c 1 -n 1 -t 1 http:\/\/vhost5\/; sleep 2; done<\/code><\/pre>\n<p>  <\/p>\n<p>C\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mn\/cg\/vd\/mncgvdh6qi9z2jfgz9xsjp7wlrm.png\"><\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/y_\/oq\/ec\/y_oqecj8n7dkcuhsuswtrvaq0ry.png\"><\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ai\/2v\/ob\/ai2vobsdod8zhpad0nff347qmsk.png\"><\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mg\/gx\/pr\/mggxpr38h0dec5wt7inx00ahd6e.png\"><\/p>\n<p>  <\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 wiremock:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">yum -y install yum-plugin-copr yum copr enable antonpatsev\/wiremock-rpm yum -y install wiremock wiremock-popular-json systemctl start wiremock<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 vhost1-vhost5 \u0432 nginx \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0440\u0442 \u0441 8001 \u043d\u0430 8080.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0437\u0430 \u043d\u0435\u0440\u043e\u0432\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b.<\/p>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU \u0438 MEM mockify \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 vhost1-vhost5<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ni\/ef\/cr\/niefcrrzubziumsublmzz3kqz8q.png\"><\/p>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU \u0438 MEM wiremock \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 vhost1<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ji\/_8\/u_\/ji_8u_argra8h0gh34yyknnxqd8.png\"><\/p>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU \u0438 MEM wiremock \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 vhost1-vhost2<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/-n\/ts\/s-\/-ntss-moi6ybktxg8o6zfgn-ik0.png\"><\/p>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU \u0438 MEM wiremock \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 vhost1-vhost3<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/zq\/g4\/u6\/zqg4u6b8aowhewmqkejrb5cygqw.png\"><\/p>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU \u0438 MEM wiremock \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 vhost1-vhost4<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/eg\/jk\/78\/egjk781xzuh3xswxbugk_oeo-um.png\"><\/p>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU \u0438 MEM wiremock \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 vhost1-vhost5. \u0418\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 CPU \u0432\u044b\u0440\u043e\u0441\u0442\u0430\u043b\u0430 \u0434\u043e 700%.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ga\/vh\/d9\/gavhd9o27zy-s2cpcvfx52gbrmw.png\"><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434\u044b:<\/p>\n<p>  <\/p>\n<p>\u041f\u043e <a href=\"https:\/\/github.com\/vozlt\/nginx-module-vts\">Nginx VTS<\/a> \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0442\u0440\u0438\u043a \u0431\u0435\u0437 \u043f\u0440\u0430\u0432\u043e\u043a \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e Wiremock vs Mockify: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 Mockify. \u041e\u043d \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 CPU \u0438 MEM.<\/p>\n<p>  <\/p>\n<p>\u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u0441\u0431\u043e\u0440\u043a\u0430 Golang \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 Fedora Copr \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 Mockify.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 <a href=\"https:\/\/github.com\/patsevanton\/mockify-rpm\">https:\/\/github.com\/patsevanton\/mockify-rpm<\/a>.<\/p>\n<\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d() } } }t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>      <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/476428\/\"> https:\/\/habr.com\/ru\/post\/476428\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\" id=\"post-content-body\">\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0435\u043c\u043e <a href=\"https:\/\/github.com\/vozlt\/nginx-module-vts\">Nginx VTS<\/a> + Prometheus + Grafana. \u0414\u043b\u044f \u0434\u0435\u043c\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0447\u0442\u043e\u0431\u044b upstream \u043c\u043e\u0433\u043b\u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 http \u043a\u043e\u0434\u044b. \u042d\u0442\u043e \u043c\u043e\u0433\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b: <a href=\"https:\/\/github.com\/brianmoran\/mockify\">Mockify<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Golang, \u0438 <a href=\"https:\/\/github.com\/tomakehurst\/wiremock\">WireMock<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Java. <\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Nginx VTS + Prometheus + Grafana;<\/li>\n<li>Mockify \u2014 \u043b\u0435\u0433\u043a\u043e\u0435, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 API, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 Golang;<\/li>\n<li>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f CPU \u0434\u043b\u044f Mockify, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Golang, \u0438 WireMock, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Java.<\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-294831","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/294831","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=294831"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/294831\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=294831"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=294831"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=294831"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}