# Управление интервалами сбора метрик №2 ## Настройки метрик В настройки метрик добавляем параметр: * interval - Желаемый интервал опроса в секундах. По умолчанию имеет значение 0 - (считать равным periodic) Параметры `is_box` и `is_periodic` ликвидируются за ненадобностью. Необходимо реализовать миграцию следующего вида: * Если `is_box` выставлен, а `is_periodic` снят - прописать в интервал минимальный интервал box среди всех затронутых железок. * В противном случае interval = минимальный интервал periodic ## metrics job Сбор метрик выносится в отдельный job discovery - metrics discovery. В Managed Object Profile добавляеся настройка: * `enable_metrics` - включение/выключение сбора метрик на уровне профиля. В отличии от box и periodic интервал опрос включается при наличии хоть каких-то метрик для сбора и интервал опроса является плавающим. Статус job и интервал опроса пересчитывается при изменении настроек метрик на worker. Интервал опроса считаем равным минимальному интервалу метрик. ## Сбор метрик Для каждой метрики высчитывается эффективный интервал сбора: $$ IE = {interval}\cdot\max(1, round[\frac{metrics\_interval}{interval}]) $$ где: * $interval$ - период запуска job. * $metrics\_interval$ - заданный период опроса для метрики. Метрики определяются на *источниках*. К источникам относятся: * managed object - метки в M.O.Profile * interface - в interface profile * subinterface - в subinterface profile * ... Крайне желательно, чтобы все метрики с одного источника, имеющие одинаковый интервал, собирались в один опрос. Для этого генерируем *код источника* $sc$ в виде строки: `<тип>:<id>:<IE>`: | Источник | Тип | id | | --- | --- | --- | | Managed Object | mo | mo.id | | Interface | i | i.name | | Subinterface | si | si.name или si.interface.name | Каждый запуск job'а для managed object имеет свой порядковый номер запуска - $i$, кроме того, мы имеем интерывал запуска job - $interval$. При планировании очередного сбора мы производим группировку по *коду источника*. Каждый код источника $sc$ имее свой эффективный интервал $IE_{sc}$ вычисляемый по формуле выше. Если $IE_{sc}$ равен $interval$ - задача ставится на опрос. В противном случае нам необходимо определить кратность периода опроса $P_{sc}$ и сдвиг $O_{sc}$. $$ P_{sc} = \frac{IE_{sc}}{interval}$$ $$ O_{sc} = hash(sc)\mod{P_{sc}}$$ где $hash$ - заранее зафиксированный хеш-алгоритм, преобразовывающий сроку в целое число (не менее 32 bit). Можно взять уже используемый siphash. Таким образом, все метрики источника ставятся в опрос при соблюдении условия: $$i\mod{P_{sc}} = O_{sc}$$ Note: В случае необходимости в профиле сабинтерфейса можно сделать настройку - "собирать вместе с интерфейсов", тогда `id` будет совпадать с интерфейсом.