---
# System prepended metadata

title: Управление интервалами сбора метрик №2

---

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