Как стать автором
Обновить

Nginx VTS Stats, Mockify — mock API, сравнение Wiremock и Mockify

Время на прочтение4 мин
Количество просмотров6.1K

В этом посте я хотел сделать демо Nginx VTS + Prometheus + Grafana. Для демо необходимо было чтобы upstream могли выдавать разные http коды. Это могли сделать следующие проекты: Mockify, написанный на Golang, и WireMock, написанный на Java.


Небольшое оглавление


  • установка и настройка Nginx VTS + Prometheus + Grafana;
  • Mockify — легкое, конфигурируемое эмулирование API, написанное на Golang;
  • Сравнение использования CPU для Mockify, написанный на Golang, и WireMock, написанный на Java.

Тестовый стенд виртуальная машина:


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 

Конфиг prometheus:


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: ‘nginx_vts_exporter’
    static_configs:
    - targets: ['localhost:9913']

Конфиг Grafana стандартный. ID дашборда 2949.


Для Nginx VTS нужно скомпилировать nginx с модулем nginx-module-vts. Делаем это с помощью Nginx-builder. Его конфиг:


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

Устанавливаем собранный nginx. Вот его главный конфиг (не забываем указать vhost_traffic_status_zone;):


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;
}

Создаем конфиги виртуальных хостов:


touch vhost1.conf  vhost2.conf  vhost3.conf  vhost4.conf  vhost5.conf

Их содержимое:


vhost1.conf:


server {
        listen   80;
        server_name vhost1;
        location / {
                proxy_pass http://127.0.0.1:8001/102;
        }
}

vhost2.conf:


server {
        listen   80;
        server_name vhost2;
        location / {
                proxy_pass http://127.0.0.1:8001/204;
        }
}

vhost3.conf:


server {
        listen   80;
        server_name vhost3;
        location / {
                proxy_pass http://localhost:8001/304;
        }
}

vhost4.conf:


server {
        listen   80;
        server_name vhost4;
        location / {
                proxy_pass http://localhost:8001/403;
        }
}

vhost5.conf:


server {
        listen   80;
        server_name vhost5;
        location / {
                proxy_pass http://localhost:8001/503;
        }
}

Устанавливаем nginx-vts-exporter:


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

Создаем файл /etc/systemd/system/nginx_vts_exporter.service:


[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

Создаем файл конфигурации VTS /etc/nginx/conf.d/vts-exporter.conf


server {
 listen 7070;
 listen [::]:7070;

 location / {
 }

 location /status {
   vhost_traffic_status_display;
   vhost_traffic_status_display_format html; 
 }

}

Добавляем DNS виртуальных хостов в /etc/hosts:


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

Оптизируем ядро для тестирования, так как wiremock выдавал timeout при большом количестве соединений. Сейчас может оно и не нужно, так как уменьшил количество соединений при запуске apache benchmark. Создаем файл /etc/sysctl.d/90-nginx.conf с содержимым:


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

Применяем настройки


sysctl -p /etc/sysctl.d/90-nginx.conf 

Устанавливаем mockify-rpm


yum -y install yum-plugin-copr
yum copr enable antonpatsev/mockify-rpm
yum -y install mockify
systemctl start mockify

Устанавливаем Apache Benchmark:


yum install -y httpd-tools

Запускаем небольшое тестирование nginx:


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

Cкриншоты:






Установка wiremock:


yum -y install yum-plugin-copr
yum copr enable antonpatsev/wiremock-rpm
yum -y install wiremock wiremock-popular-json
systemctl start wiremock

Также в файлах vhost1-vhost5 в nginx нужно поменять порт с 8001 на 8080.


Прошу прощения за неровные скриншоты.


Ниже загрузка CPU и MEM mockify при тестировании vhost1-vhost5



Ниже загрузка CPU и MEM wiremock при тестировании vhost1



Ниже загрузка CPU и MEM wiremock при тестировании vhost1-vhost2



Ниже загрузка CPU и MEM wiremock при тестировании vhost1-vhost3



Ниже загрузка CPU и MEM wiremock при тестировании vhost1-vhost4



Ниже загрузка CPU и MEM wiremock при тестировании vhost1-vhost5. Иногда нагрузка на CPU выростала до 700%.



Выводы:


По Nginx VTS хотелось бы больше метрик без правок конфигов.


По Wiremock vs Mockify: используйте Mockify. Он меньше использует CPU и MEM.


И напоследок сборка Golang приложений в Fedora Copr на примере Mockify.


В качестве примера используйте репозиторий https://github.com/patsevanton/mockify-rpm.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какими self-hosted утилитами/проектами вы получаете метрики по статус кодам и по виртуальным хостам с Nginx?
33.33% Zabbix5
6.67% Collectd1
33.33% nginx-module-vts5
33.33% nginx_exporter5
Проголосовали 15 пользователей. Воздержались 8 пользователей.
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+8
Комментарии2

Публикации

Истории

Работа

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн