API метрик — выражения метрик

Материал из Документация Ключ-АСТРОМ

API метрик — выражения метрик

Метрические выражения позволяют использовать простые арифметические операции прямо в селекторе метрики.

Например, это выражение вычисляет отношение (в процентах) двух показателей:

metric1 / metric2 * 100

В качестве операндов выражения можно использовать метрики или числа.

  • Для обеспечения соблюдения порядка выполнения операций необходимо использовать скобки.
  • Все метрики, содержащие более одной точки данных в выражении, должны иметь одинаковое разрешение.
  • В качестве операнда можно использовать любую метрику, включая метрики, измененные любой цепочкой преобразований, и можно применять преобразования к результату выражения.

Ограничения

  • Селектор должен содержать как минимум один ключ метрики.
  • В одном запросе можно запросить данные по 10 показателям. Для целей этого ограничения одно выражение (например, metric2 + metric2) считается одной метрикой.

Приоритет

Применяются стандартные математические правила очередности операций:

  1. Скобки, метрические преобразования
  2. Отрицание
  3. Умножение, деление
  4. Сложение, вычитание
  5. Агрегация

Если в цепочке преобразований было применено агрегирование, используется именно это агрегирование. Если преобразование не применялось, используется агрегирование по умолчанию. Ваши операнды метрик могут иметь разные агрегирования. Например, metric:max - metric:min.

Разрешение выражений

Метрические выражения обрабатываются следующим образом:

  1. Сформируйте пары кортежей для каждой пары метрик.
  2. Выровняйте точки данных в каждом кортеже.
  3. Примените арифметические операции к выровненным точкам данных.

Кортежи

Арифметические операции используют данные кортежей (уникальных комбинаций метрики — измерения — значения измерения) метрик. Идентичные кортежи каждой метрики объединяются в пары, а затем их данные выравниваются.

Если одна метрика безразмерна (содержит только один кортеж без измерений и значений измерений), то этот единственный кортеж сопоставляется со всеми кортежами других метрик. То же самое относится и к числам.

Непарные кортежи игнорируются выражением и не отображаются в результате.

Точки данных

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

  • Если хотя бы одна из выровненных точек данных равна null, выражение преобразуется в null.
  • Если в операции используется число, оно выравнивается с каждой точкой данных операнда метрики.
  • Если один показатель представляет собой отдельную точку данных, а другой — ряд данных, то эта отдельная точка данных соответствует каждой точке данных ряда.
  • Если оба показателя представляют собой одну точку данных, то точки данных совпадают, и результирующий временной интервал охватывает обе точки данных.
  • Если оба показателя являются последовательными рядами, то точки данных выравниваются по временным меткам.
  • Для любых невыровненных точек данных выражение преобразуется в null.

Передовые методы

Использовать только при необходимости

Используйте выражение метрики только в том случае, если без него вы не сможете достичь своей цели. Допустим, вы хотите рассчитать среднее использование ЦП двумя хостами, HOST-001 и HOST-002. Вы можете сделать это с помощью выражения метрики:

(
    builtin:host.cpu.usage:filter(eq("dt.entity.host","HOST-001")):splitBy()
    +
    builtin:host.cpu.usage:filter(eq("dt.entity.host","HOST-002")):splitBy()
)
/2

У этого подхода есть две проблемы. Во-первых, выражение трудночитаемо и, следовательно, подвержено синтаксическим ошибкам. Во-вторых, если один из хостов находится в автономном режиме, результат выражения будет пустым. Хотя вторую проблему можно было бы решить с помощью преобразования по умолчанию, использование агрегирования по среднему значению более эффективно:

builtin:host.cpu.usage
:filter(
    or(
        eq("dt.entity.host","HOST-001"),
        eq("dt.entity.host","HOST-002")
    )
)
:splitBy()
:avg

Не переводите единицы измерения

Не используйте метрические выражения для преобразования единиц измерения данных. Вместо этого используйте преобразование toUnit. Единственное исключение из этого правила — единицы измерения, которые не поддерживаются Ключ-АСТРОМ. Используйте запрос GET all units, чтобы получить список поддерживаемых единиц измерения.

Ограничить использование преобразований

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

Рассмотрим следующий запрос, который пытается сложить 10 периодов наибольшего использования ЦП с 10 периодами простоя ЦП.

builtin:host.cpu.usage:sort(value(avg,descending)):limit(10)
+
builtin:host.cpu.idle:sort(value(avg,descending)):limit(10)

Если у вас большая среда с сотнями хостов, маловероятно, что 10 хостов с самым высоким уровнем загрузки ЦП окажутся среди 10 хостов с самым длительным временем простоя ЦП. Операнды не будут иметь совпадающих кортежей, поэтому результат выражения будет пустым. Решение состоит в том, чтобы применить ограничение к результату выражения:

(
    builtin:host.cpu.usage
    +
    builtin:host.cpu.idle
)
:sort(value(auto,descending))
:limit(10)

Устраните пробелы в данных с помощью преобразования по умолчанию

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

Рассмотрим пример выражения для расчета коэффициента ошибок для ключевых действий пользователя:

builtin:apps.other.keyUserActions.reportedErrorCount.os
/
builtin:apps.other.keyUserActions.requestCount.os

Если за указанный вами период времени было много запросов, но ни одной ошибки, результат будет пустым, хотя коэффициент ошибок 0 был бы более информативным. Этого можно добиться с помощью преобразования default(0):

builtin:apps.other.keyUserActions.reportedErrorCount.os:default(0)
/
builtin:apps.other.keyUserActions.requestCount.os