# Управление интервалами сбора метрик №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` будет совпадать с интерфейсом.