+++
title = "Выражения"
weight = 800
+++

# Выражения на стороне сервера

> ** Примечание: ** Эта документация предназначена для бета-версии функции.

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

## Использование выражений

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

> ** Примечание:** Выражения не работают с текущим предупреждением Harvest.

> ** Примечание:** Выражения не работают с переменными панели мониторинга.

Выражения предназначены для расширения источников данных, позволяя объединять запросы из разных источников данных или предоставляя операции, недоступные в источнике данных.

> ** Примечание:** Когда это возможно, вы должны выполнять обработку данных внутри источника данных. Копирование данных из хранилища на сервер Harvest для обработки неэффективно, поэтому выражения предназначены для облегченной обработки данных.

Выражения работают с запросами источника данных, которые возвращают временные ряды или числовые данные. Они также работают с [многомерными данными]({{< relref "../basics/timeseries-dimensions.md" >}}). Например, запрос, который возвращает несколько серий, где каждая серия идентифицируется метками или тегами.

Отдельное выражение принимает один или несколько запросов или других выражений в качестве входных данных и добавляет данные к результату. Каждое отдельное выражение или запрос представлены переменной, которая является именованным идентификатором, известным как ее RefID (например, буква по умолчанию "A" или `B`).

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

## Типы выражений

Выражения работают с двумя типами данных.

- Коллекция временных рядов.
- Набор чисел, где каждая коллекция может быть одной серией или одним номером.

Каждая коллекция возвращается из одного запроса или выражения источника данных и представлена идентификатором RefID. Каждая коллекция представляет собой набор, где каждый элемент в наборе уникально идентифицируется его измерениями, которые хранятся в виде [labels]({{< relref "../basics/timeseries-dimensions.md#labels" >}}) или пар ключ-значение.

## Запросы к источникам данных

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

Запросы к источникам данных, когда они используются с выражениями, выполняются механизмом выражений. Когда он делает это, он реструктурирует данные так, чтобы они были либо одним временным рядом, либо одним числом для каждого фрейма данных. Так, например, при использовании источника данных, который возвращает несколько рядов в одном кадре в табличном представлении, вы можете заметить, что при выполнении с выражениями он выглядит по-другому.

В настоящее время при использовании фреймов данных поддерживается только формат временных рядов (число), если у вас есть табличный ответ, который возвращает фрейм данных без времени, строковых столбцов и одного числового столбца:

Loc | Host | Avg_CPU |
----|------| ------- |
МВД | А | 1
НЬЮ-Йорк | B | 2

выдаст число, которое работает с выражениями. Столбцы строк становятся метками, а столбец чисел - соответствующим значением. Например `{"Loc": "MIA", "Host": "A"}` со значением 1.

## Операции

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

### Математика

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

На данные из других запросов или выражений ссылаются с помощью RefID с префиксом знака доллара, например `$A`. Если в имени переменной есть пробелы, то вы можете использовать синтаксис фигурных скобок типа `${my variable}`.

Числовые константы могут быть десятичными (`2.24`), восьмеричными (с начальным нулем, например `072`) или шестнадцатеричными (с начальным 0x, например `0x2A`). Также поддерживаются экспоненты и знаки (например, `-0.8e-2`).

#### Операторы

Арифметика (`+`, двоичная и унарная `-`, `*`, `/`, `%`, показатель степени `**`), реляционный (`<`, `>`, `==`, `!=`, `>=`, `<=`), и логический (`&&`, `||`, и поддерживаются унарные операторы `!`).

Поведение операции с данными зависит от того, являются ли они числовыми или данными временного ряда.

С двоичными операциями, такими как `$A + $B` или `$A || $B`, оператор применяется следующими способами в зависимости от типа данных:

- Если оба `$A` и `$B` являются числом, то операция выполняется между двумя числами.
- Если одна переменная представляет собой число, а другая переменная представляет собой временной ряд, то выполняется операция между значением каждой точки временного ряда и числом.
- Если оба `$A` и `$B` являются данными временных рядов, то операция между каждым значением в двух рядах выполняется для каждой временной метки, которая существует как в `$A`, так и в `$B`. Операция повторной выборки может быть использована для выравнивания временных меток. (** Примечание: ** в будущем мы планируем добавить опции к математической операции для различных вариантов поведения).

Итак, вкратце:

- Номер OP номер = номер
- Номер серии = серия
- Серия OP серия = серия

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

Итак, если у вас есть числа с такими метками, как `{host= web01}` в `$A` и другое число в `$ B` с теми же метками, то операция выполняется между этими двумя элементами внутри каждой переменной, и результат будет иметь одни и те же метки. Правила поведения этого союза заключаются в следующем:

- Элемент без меток будет присоединяться к чему-либо.
- Если оба `$A` и `$B` содержат только один элемент (одну серию или один номер), они будут объединены.
- Если метки соответствуют точной математике, они присоединятся.
- Если метки являются подмножеством других, например, и элемент в `$A` помечен как `{host=A,dc=MIA}`, а элемент в `$B` помечен как `{host=A}`, они присоединятся.
- В настоящее время, если в такой переменной, как `$A`, для каждого элемента есть разные теги _keys_, поведение соединения не определено.

Реляционные и логические операторы возвращают 0 для false, 1 для true.

#### Математические функции

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

##### пресс

abs возвращает абсолютное значение своего аргумента, которое может быть числом или рядом. Например, `abs(-1)` или `abs($A)`.

##### журнал

Log возвращает натуральный логарифм своего аргумента, который может быть числом или рядом. Если значение меньше 0, возвращается значение NaN. Например, `log(-1)` или `log($A)`.

##### inf, nan и null

Все функции inf, nan и null возвращают одно значение имени. Они в первую очередь существуют для тестирования. Пример: `null()`. (Примечание: inf всегда возвращает положительную бесконечность, вероятно, следует изменить это, чтобы принять аргумент, чтобы он мог возвращать отрицательную бесконечность).

### Уменьшить

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

**Поля:**

- ** Функция -** Функция уменьшения для использования
- **Ввод -** Переменная (REFID (например, `A`)) для повторной выборки

#### Функции Сокращения

> ** Примечание:** В будущем мы планируем добавить опции для управления поведением empty, NaN и null для функций сокращения.

##### Количество

Count возвращает количество очков в каждой серии.

##### Имею в виду

Среднее значение возвращает общее количество всех значений в каждой серии, деленное на количество точек в этой серии. Если какие-либо значения в ряду равны null или nan, или если ряд пуст, возвращается NaN.

##### Минимальное и максимальное

Min и Max возвращают наименьшее или наибольшее значение в ряду соответственно. Если какие-либо значения в ряду равны null или nan, или если ряд пуст, возвращается NaN.

##### Сумма

Сумма возвращает сумму всех значений в ряду. Если ряд имеет нулевую длину, то сумма будет равна 0. Если в ряду есть какие-либо значения NaN или Null, возвращается значение NaN.

### Повторная выборка

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

**Поля:**

- **Ввод -** Переменная данных временных рядов (REFID (например, `A`)) для повторной выборки
- ** Повторная выборка на -** Длительность времени для повторной выборки, например `10 секунд`. Единицами измерения могут быть секунды "s", минуты "m`, часы "h`, дни "d`, недели "w` и годы "y`.
- ** Понижающая выборка -** Функция уменьшения, используемая при наличии более одной точки данных на выборку окна. Подробности о поведении см. в разделе операция сокращения.
- **Upsample -** Метод, используемый для заполнения образца окна, в котором нет точек данных.
  - **pad** заполняется последним известным значением
  - **засыпка** следующим известным значением
  - **fillna** для заполнения пустых окон образцов NANS
