Coder Social home page Coder Social logo

goldenclone / nginx-sla Goto Github PK

View Code? Open in Web Editor NEW
105.0 21.0 17.0 315 KB

Модуль nginx, реализующий сбор расширенной статистики по HTTP-кодам и временам ответов апстримов для дальнейшей передачи в средства мониторинга типа zabbix.

Shell 1.55% C 98.45%

nginx-sla's Introduction

nginx-sla

English version

Модуль nginx, реализующий сбор расширенной статистики по HTTP-кодам и временам ответов апстримов для дальнейшей передачи в средства мониторинга типа zabbix.

Модуль отвечает на следующие вопросы:

  • Какое среднее время ответа апстрима (backend-а)?
  • Сколько было ответов с HTTP-статусом - 200, 404?
  • Сколько было ответов в различных классах HTTP-статусов - 2xx, 5xx?
  • На сколько запросов апстрим ответил за время до 300ms? На сколько с 300ms до 500ms?
  • За какое время апстрим обработал 90%, 99% запросов?

Сборка

Для сборки необходимо сконфигурировать nginx с дополнительным параметром:

./configure --add-module=/path/to/nginx-sla

Конфигурация

синтаксис: sla_pool название [timings=время:время:...:время]
                             [http=статус:статус:...:статус]
                             [avg_window=число] [min_timing=число] [default];
умолчание: timings=300:500:2000,
           http=200:301:302:304:400:401:403:404:499:500:502:503:504,
           avg_window=1600,
           min_timing=0
контекст:  http

Задает именованный пул для сбора статистики. Должен быть задан хотя бы один пул.

  • название - имя пула, использующееся в выводе статистики и директиве sla_pass;
  • timings - интервалы времени в ms, в которые отсчитывается "попадание" времени запроса;
  • http - отслеживаемые статусы http;
  • avg_window - размер окна для вычисления скользящего среднего времени ответа;
  • min_timing - время в ms, меньше которого времена ответов апстримов не учитываются;
  • default - задает пул по умолчанию - в этот пул попадают все запросы, для которых не указан явно другой пул директивой sla_pass.

Размер окна для вычисления скользящего среднего времени ответа рекомендуется выбирать исходя из среднего количества динамических запросов в секунду помноженное на интервал времени сбора данных.

синтаксис: sla_alias название алиас;
умолчание: -
контекст:  http

Позволяет задать алиас для имени апстрима. Может использоваться для объединения нескольких апстримов под одним именем или для задания привычных имен вместо IP адресов.

синтаксис: sla_pass название
умолчание: -
контекст:  http, server, location

Указывает имя пула, в который требуется собирать статистику. В случае значения off отключает сбор статистики (в т.ч. и в пул по умолчанию).

синтаксис: sla_status
умолчание: -
контекст:  server, location

Обработчик вывода статистики.

синтаксис: sla_purge
умолчание: -
контекст:  server, location

Обработчик обнуления счетчиков статистики.

Пример конфигурации

sla_pool main timings=100:200:300:500:1000:2000 http=200:404 default;

sla_alias 192.168.1.1:80 frontends;
sla_alias 192.168.1.2:80 frontends;

server {
    listen [::1]:80;
    location / {
        sla_pass main;
        ...
    }
    location /sla_status {
        sla_status;
        sla_pass off;
        allow ::1;
        deny all;
    }
    location /sla_purge {
        sla_purge;
        sla_pass off;
        allow ::1;
        deny all;
    }
}

Ограничения

Ограничения могут быть изменены на этапе компиляции указанием соответствующих директив препроцессора:

  • NGX_HTTP_SLA_MAX_NAME_LEN - максимальная длина имени апстрима (по умолчанию 256 байт);
  • NGX_HTTP_SLA_MAX_HTTP_LEN - максимальное количество отслеживаемых статусов HTTP (по умолчанию 32);
  • NGX_HTTP_SLA_MAX_TIMINGS_LEN - максимальное количество отслеживаемых таймингов (по умолчанию 32);
  • NGX_HTTP_SLA_MAX_COUNTERS_LEN - максимальное количество счетчиков (апстримов) в пуле (по умолчанию 16).

Содержимое статистики

main.all.http = 1024
main.all.http_200 = 914
...
main.all.http_xxx = 2048
main.all.http_2xx = 914
...
main.all.time.avg = 125
main.all.time.avg.mov = 124
main.all.300 = 233
main.all.300.agg = 233
main.all.500 = 33
main.all.500.agg = 266
main.all.2000 = 40
main.all.2000.agg = 306
main.all.inf = 0
main.all.inf.agg = 306
main.all.25% = 124
main.all.75% = 126
main.all.90% = 126
main.all.99% = 130
...
main.<upstream>.http_200 = 270
...
  • Здесь первое значение является именем пула статистики;
  • Второе значение является именем апстрима или all для всех апстримов пула (включая локальную статику);
  • Третье значение - имя ключа статистики:
    • http - количество обработанных ответов с известными HTTP статусами;
    • http_200 - количество ответов с HTTP-статусом 200 (может быть http_301, http_404, http_500 и т.д.);
    • http_xxx - количество обработанных ответов в группах статусов HTTP (фактически, количество всех обработанных ответов);
    • http_2xx - количество ответов в группе с HTTP-статусом 2xx (всего 5 групп соответствующих 1xx, 2xx ... 5xx);
    • time - характеристика времени ответов;
    • 500 - количество ответов апстримов в интервале времени 300-500 ms;
    • 90% - время ответа в ms для 90% запросов (процентиль, может принимать значения 25%, 50%, 75%, 90%, 95%, 98%, 99%);
    • inf - алиас для "бесконечного" интервала времени;
  • Четвертое и пятое значение - тип статистики:
    • avg - среднее;
    • mov - скользящее (среднее);
    • agg - аггрегированная статистика по всем интервалам до текущего. Так, например, в 500.agg попадают все запросы, которые выполнились от 0 и до 500 ms;

Используемые алгоритмы

Для вычисления процентилей используется алгоритм EWSA ("Exponentially Weighted Stochastic Approximation") - подробности см. "Incremental Quantile Estimation for Massive Tracking", Fei Chen, Diane Lambert, и Jose C. Pinheiro (2000).

Параметры алгоритма могут быть изменены на этапе компиляции указанием соответствующих директив препроцессора:

  • NGX_HTTP_SLA_QUANTILE_M - размер буфера FIFO для обновления данных (по умолчанию 100);
  • NGX_HTTP_SLA_QUANTILE_W - весовой коэффициент обновления вычисляемых квантилей (по умолчанию 0.01).

Перед изменением данных параметров имеет смысл внимательно ознакомиться с описанием алгоритма.

nginx-sla's People

Contributors

abbat avatar asp24 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nginx-sla's Issues

Bug in ngx_http_sla_add_counter()

It seems, only half of NGX_HTTP_SLA_MAX_COUNTERS_LEN counters may be effectively used.

In function ngx_http_sla_add_counter(), parameter 'hint' sets 'i' start value in loop, but start value of 'result' pointer doesn't use 'hint' offset.

ngx_http_sla.c:1250
should be
result = pool->shm_ctx + hint;
instead of
result = pool->shm_ctx;

Seven upstream limitation?

Is there a limitation that constrains you to having seven upstreams in particular? I tested it with and without an alias: without an alias, only seven of twenty (random order) upstreams showed up in my sla_status, and with an alias, six of twenty (again, random order) upstreams and one alias showed up in my sla_status.

Statistic virtual host

Good day.
Have some trouble. We have many virtual host (sites) in independent configs.
/sla_status - collects statistics from whole server upstream, but we need collect statistic
independently for each domain.
nginx 1.8.0

Multiple sla_pool

When defined more then one sla_pool in http section and write: sla_pass {not_first_pool_in_list};
then got error during nginx (re)start:

nginx: [emerg] sla_pool "{pool_name_here}" not found in /etc/nginx/nginx-test-sla.conf:18

Debian 6, 32 bit, nginx 1.4.1.

Simple config:

user www-data;
worker_processes 1;
pid /var/run/nginx.pid;

events {
    worker_connections 768;
}

http {

    sla_pool main timings=100:200:300:500:1000:2000 default;
    sla_pool second;

    server {
        server_name sla-stats.dev;

        location /test {
            sla_pass second;
            return 200 test;
        }
    }
}

nginx: [emerg] sla_pool "second" not found in /etc/nginx/nginx-test-sla.conf:18

with sla_pass main no errors.

If change pools order to:

sla_pool second;
sla_pool main timings=100:200:300:500:1000:2000 default;

then nginx start without errors, but main pool stay unavailable in sla_pass directive.

And one question, can sla_pass receive variable as param ?
I mean:

set $sla_pool poll_name;
sla_pass $sla_pool;

now i got similar error "nginx: [emerg] sla_pool "$sla_pool" not found in ...."

sla_status not working after sla_purge

Hi.

It seems like sla_purge command breaks sla_status.
After querying sla_purge and receiving OK any other request to sla_status doesn't return anything.

I'm using CentOS 6.4 x86_64 and nginx 1.4.0 rebuilt with nginx-sla module using spec file and sources from atomic repo.

Build with nginx 1.4.0 failed

cc1: warnings being treated as errors
../nginx-sla/ngx_http_sla.c: In function 'ngx_http_sla_set_http_time':
../nginx-sla/ngx_http_sla.c:1425: warning: 'quantile_25' may be used uninitialized in this function
../nginx-sla/ngx_http_sla.c:1426: warning: 'quantile_75' may be used uninitialized in this function

nginx 1.4.0 + Debian 6

Похоже не работает c 1.4.0 на Debian 6, 32bit.

в секции http указано:
sla_pool main timings=100:200:300:500:1000:2000 http=200:404 default;

есть локейшн у одного из хостов
location /stats {
sla_status;
}

при обращении curl -v http://sla-stats.dev/stats получаю

GET /stats HTTP/1.1
User-Agent: curl/7.21.0 (i486-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6
Host: sla-stats.dev
Accept: /

< HTTP/1.1 405 Not Allowed
< Server: nginx/1.4.0
< Date: Tue, 30 Apr 2013 15:59:47 GMT
< Content-Type: text/html
< Content-Length: 172
< Connection: keep-alive

в error логе nginx ничего, в access обращение к урлу и 405 response.

коментирую в файле ngx_http_sla.c строки 743-745:
if (r->method != NGX_HTTP_GET && r->method != NGX_HTTP_HEAD) {
return NGX_HTTP_NOT_ALLOWED;
}

и перекомпилирую, теперь в ответ получаю
curl: (52) Empty reply from server
и в error.log'е:
worker process 24595 exited on signal 11

насколько я понял, что-то происходит при вызове
result = ngx_http_send_header(r); в строке 810, но я не специалист в C и коде nginx, могу ошибаться

no memory when NGX_HTTP_SLA_MAX_TIMINGS_LEN increased

I'm getting the error below when I increase the TIMINGS and HTTP length to 64

2015/06/05 21:51:09 [crit] 4065#0: ngx_slab_alloc() failed: no memory

And I'm having segmentation fault with sla_pool enabled and NGX_HTTP_SLA_MAX_COUNTERS_LEN set to 256. If I drop the length then I miss some metrics since this server run many upstreams.

Потеря информации об алисах при reload

Под нагрузкой, при выполнении reload сервера может теряться информация об алиасах и данные по апстримам начинают группироваться по прямому имени апстрима, а не по имени алиаса.

Bug from habrahabr user

Добрый день.

А вы тестировали модуль для случае, когда количество виртуальных хостов > 4?
У вас в модуле есть баг на эту тему. Когда инициализируется конфигурация main, то создается array на 4 элемента типа pool: ngx_array_init(&config->pools, cf->pool, 4, sizeof(ngx_http_sla_pool_t).
Когда встречается директива sla_pool, вызывается ngx_http_sla_pool(), вконце которой происходит следующее:
shm_zone = ngx_shared_memory_add(cf, &pool->name, size, &ngx_http_sla_module);
shm_zone->data = pool;
shm_zone->init = ngx_http_sla_init_zone;

т.е. адрес очередного пула ngx_http_sla_pool_t добавляется в описатель зоны. НО, как только количество виртуальных серверов становится больше чем было инициализировано в ngx_http_sla_create_main_conf, то создается новый array, а старый уничтожается, при этом все ранее созданные описатели зоны хранят указатели на старые пулы…
и начинает происходить SIGSEGV.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.