/api/query/exp
Этот конечный пункт позволяет выполнять запросы к данным с использованием выражений. Запрос разбивается на различные разделы.
Разрешены две операции объединения (или соединения). Объединение всех временных рядов или пересечение.
Например, мы можем вычислить «a + b» с группировкой по полю хоста. Обе метрики, запрошенные по отдельности, будут генерировать временной ряд на хост, например, возможно, по «web01», «web02» и «web03». Предположим, что метрика «a» имеет значения для всех 3 хостов, но метрика «b» отсутствует для «web03».
При использовании оператора пересечения выражение будет эффективно добавлять «a.web01 + b.web01» и «a.web02 + b.web02», но пропускать генерацию чего-либо для «web03». Имейте это в виду, если вы увидите меньше выходных данных, чем ожидали, или увидите ошибки о недоступных рядах после пересечения.
При использовании оператора объединения выражение будет добавлять web01 и web02 ряды, но для метрики «b» оно будет подставлять значение политики заполнения метрики для результатов.
Примечание
Поддерживается начиная с версии 2.3
Глаголы
- POST
Запросы
Реализованные разделы включают:
"time"
Раздел "time" обязателен и представляет собой один JSON-объект. Это влияет на временной диапазон и необязательные сокращения для всех запрашиваемых метрик.
| Имя | Тип данных | Обязательно | Описание | По умолчанию | Пример |
|---|---|---|---|---|---|
| start | Целое число | Обязательно | Начальное время для запроса. Может быть относительным, абсолютным в читаемом формате или абсолютным значением эпохи Unix. | 1h-ago, 2015/05/05-00:00:00 | |
| aggregator | Строка | Обязательно | Глобальная функция агрегирования для всех метрик. Она может быть переопределена для каждой метрики. | sum | |
| end | Целое число | Необязательно | Конечное время для запроса. Если не указано, конечное время — сейчас. | now | 1h-ago, 2015/05/05-00:00:00 |
| downsampler | Объект | Необязательно | Уменьшает количество возвращаемых точек данных. Формат определен ниже | None | См. ниже |
| rate | Булево | Необязательно | Вычислять ли все метрики как скорости, т.е. значение за секунду. Это вычисляется перед выражениями. | false | true |
Например:
"time":{ "start":"1h-ago", "end":"10m-ago", "downsampler":{"interval":"15m","aggregator":"max"}
Downsampler
| Имя | Тип данных | Обязательно | Описание | По умолчанию | Пример |
|---|---|---|---|---|---|
| interval | Строка | Обязательно | Интервал усреднения, т.е. какой временной интервал использовать для объединения исходных значений. Формат <#><unit>, например 15m
| 1h | |
| aggregator | Строка | Обязательно | Функция агрегирования для уменьшения количества точек данных | avg | |
| fillPolicy | Объект | Необязательно | Политика для заполнения пустых интервалов, в которых отсутствуют точки данных | None | См. ниже |
Политики заполнения
Используются для замены «пропущенных» значений, т.е. когда ожидалась точка данных, но не была найдена в хранилище.
| Имя | Тип данных | Обязательно | Описание | По умолчанию | Пример |
|---|---|---|---|---|---|
| policy | Строка | Обязательно | Имя используемой политики. Значения указаны в таблице ниже | zero | |
| value | Двойное | Необязательно | Для скалярных заполнений, необязательное значение, которое можно использовать при подстановке | NaN | 42 |
| Имя | Описание |
|---|---|
| nan | Генерирует NaN, если все значения в функции агрегирования были NaN или «пропущенными». Для агрегаторов NaN рассматриваются как «значения-маяки», из-за которых функция пропускает значения. Обратите внимание, что если ряд генерирует NaN в выражении, NaN становится заразным и приводит к тому, что результат этого выражения становится NaN. При сериализации NaN будет сгенерирован. |
| null | Генерирует Null во время сериализации. Во время вычислений значения обрабатываются как NaN. |
| zero | Генерирует ноль, когда значение отсутствует |
| scalar | Генерирует пользовательское значение, когда отсутствует точка данных. Необходимо указать значение с помощью value. Значение может быть целым или с плавающей точкой. |
Обратите внимание, что при попытке предоставить несовместимое с типом значение запрос выбросит исключение. Например, предоставление значения с NaN, которое не является NaN, вызовет ошибку.
Например:
{"policy":"scalar","value":"1"}
"filters"
Фильтры предназначены для выбора различных временных рядов на основе ключей и значений тегов. Сейчас необходимо указать хотя бы один фильтр (пока) с хотя бы одной заданной функцией агрегирования. Поля включают:
| Имя | Тип данных | Обязательно | Описание | По умолчанию | Пример |
|---|---|---|---|---|---|
| id | Строка | Обязательно | Уникальный идентификатор фильтра. Не может совпадать с идентификатором метрики или выражения | f1 | |
| tags | Массив | Необязательно | Список фильтров по значениям тегов | None | См. ниже |
Например:
"filters":[
"id":"f1",
"tags":[
{
"type":"wildcard",
"tagk":"host",
"filter":"*",
"groupBy":true
},
{
"type":"literal_or",
"tagk":"colo",
"filter":"lga",
"groupBy":false
}
]
]
Поля фильтра
В поле "tags" может быть один или несколько фильтров. Список фильтров можно найти по адресу /api/config/filters.
| Имя | Тип данных | Обязательно | Описание | По умолчанию | Пример |
|---|---|---|---|---|---|
| type | Строка | Обязательно | Имя фильтра из API | regexp | |
| tagk | Строка | Обязательно | Имя ключа тега, например, host или colo, по которому выполняется фильтрация | host | |
| filter | Строка | Обязательно | Значение для фильтрации. Зависит от используемого фильтра. Подробности см. в API | web.*mysite.com | |
| groupBy | Булево | Необязательно | Группировать ли результаты по значениям тегов, соответствующим этому фильтру. Например, группировка по хосту вернет один результат на хост. Без группировки по хосту будут агрегированы (с использованием функции агрегирования) все результаты для метрики в один ряд | false | true |
"metrics"
Список метрик определяет, какие метрики включаются в выражение. Должна быть хотя бы одна метрика.
| Имя | Тип данных | Обязательно | Описание | По умолчанию | Пример |
|---|---|---|---|---|---|
| id | Строка | Обязательно | Уникальный идентификатор метрики. ДОЛЖЕН быть простой строкой, без знаков препинания или пробелов | cpunice | |
| filter | Строка | Обязательно | Фильтр, используемый при получении этой метрики. Должен совпадать с фильтром в массиве filters | f1 | |
| metric | Строка | Обязательно | Имя метрики в OpenTSDB | system.cpu.nice | |
| aggregator | Строка | Необязательно | Необязательная функция агрегирования для перегрузки глобальной функции в time только для этой метрики |
time's aggregator | count |
| fillPolicy | Объект | Необязательно | Если усреднение не используется, это поле может быть включено, чтобы определить, что отображать в вычислениях. Оно также переопределит политику заполнения при усреднении | zero fill | См. выше |
Например:
{"id":"cpunice", "filter":"f1", "metric":"system.cpu.nice"}
"expressions"
Список из одного или нескольких выражений над метриками. Переменные в выражении ДОЛЖНЫ ссылаться на поле ID метрики или поле ID выражения. Вложенные выражения поддерживаются, но исключения будут выброшены, если обнаружена ссылка на себя или циклическая зависимость. На данный момент поддерживаются только базовые операции, такие как сложение, вычитание, умножение, деление, модуль.
| Имя | Тип данных | Обязательно | Описание | По умолчанию | Пример |
|---|---|---|---|---|---|
| id | Строка | Обязательно | Уникальный идентификатор выражения | cpubusy | |
| expr | Строка | Обязательно | Выражение для выполнения | a + b / 1024 | |
| join | Объект | Необязательно | Операция объединения или "join" для выполнения над сериями по наборам. | union | См. ниже |
| fillPolicy | Объект | Необязательно | Необязательная политика заполнения для выражения, когда оно используется вложенным выражением и не имеет значения | NaN | См. выше |
Например:
{
"id": "cpubusy",
"expr": "(((a + b + c + d + e + f + g) - g) / (a + b + c + d + e + f + g)) * 100",
"join": {
"operator": "intersection",
"useQueryTags": true,
"includeAggTags": false
}
}
Объединения (Joins)
Объект объединения управляет тем, как различные временные ряды для заданной метрики объединяются в рамках выражения. На данный момент поддерживаются две основные операции: операторы объединения (union) и пересечения (intersection). Дополнительные флаги контролируют поведение объединения.
| Имя | Тип данных | Обязательно | Описание | По умолчанию | Пример |
|---|---|---|---|---|---|
| operator | Строка | Обязательно | Оператор для использования, либо объединение (union), либо пересечение (intersection) | intersection | |
| useQueryTags | Булево | Необязательно | Использовать только те метки, которые явно определены в фильтрах при вычислении ключей объединения | false | true |
| includeAggTags | Булево | Необязательно | Включать ли ключи меток, которые были агрегированы из серии в ключ объединения | true | false |
"outputs"
Они определяют поведение вывода и позволяют исключить некоторые выражения из результатов или включить исходные метрики. По умолчанию, если этот раздел отсутствует, все выражения и только выражения будут сериализованы. Поле представляет собой список одного или нескольких объектов вывода. В дальнейшем будут добавлены другие поля с флагами для влияния на вывод.
| Имя | Тип данных | Обязательно | Описание | По умолчанию | Пример |
|---|---|---|---|---|---|
| id | Строка | Обязательно | Идентификатор метрики или выражения | e | |
| alias | Строка | Необязательно | Необязательное описательное имя для рядов | Загрузка системы |
Например:
{"id":"e", "alias":"System Busy"}
Примечание
Поле id для всех объектов в данный момент не может содержать пробелы, специальные символы или точки.
Полный пример
{
"time": {
"start": "1y-ago",
"aggregator":"sum"
},
"filters": [
{
"tags": [
{
"type": "wildcard",
"tagk": "host",
"filter": "web*",
"groupBy": true
}
],
"id": "f1"
}
],
"metrics": [
{
"id": "a",
"metric": "sys.cpu.user",
"filter": "f1",
"fillPolicy":{"policy":"nan"}
},
{
"id": "b",
"metric": "sys.cpu.iowait",
"filter": "f1",
"fillPolicy":{"policy":"nan"}
}
],
"expressions": [
{
"id": "e",
"expr": "a + b"
},
{
"id":"e2",
"expr": "e * 2"
},
{
"id":"e3",
"expr": "e2 * 2"
},
{
"id":"e4",
"expr": "e3 * 2"
},
{
"id":"e5",
"expr": "e4 + e2"
}
],
"outputs":[
{"id":"e5", "alias":"Mega expression"},
{"id":"a", "alias":"CPU User"}
]
}
Ответ
Вывод будет содержать список объектов в массиве outputs, с результатами в массиве массивов, представляющих каждый временной ряд, за которым следуют метаданные для каждой серии и запроса в целом. Также включены исходный запрос и некоторые сводные статистические данные. Поля включают:
| Имя | Описание |
|---|---|
| id | Идентификатор выражения, которому соответствует вывод |
| dps | Массив результатов. Каждый подмассив начинается со значения отметки времени в мс (смещение 0). Остальные значения — результаты для каждой серии, когда была применена группировка. |
| dpsMeta | Метаданные запроса, включая начальную и конечную отметки времени, количество результатных «наборов» (или подмассивов) и количество представленных серий. |
| datapoints | Общее количество точек данных, возвращенных пользователю после агрегации |
| meta | Данные о каждой временной серии в наборе результатов. Поля перечислены ниже |
Раздел meta содержит упорядоченную информацию о каждой временной серии в массивах вывода. Первый элемент массива всегда будет иметь значение metrics равное timestamp и не будет содержать других данных.
| Имя | Описание |
|---|---|
| index | Индекс в массивах точек данных, к которому относится meta |
| metrics | Различные имена метрик, включенные в выражение |
| commonTags | Ключи и значения меток, которые были общими для всех временных рядов, которые были агрегированы в результирующей серии |
| aggregatedTags | Ключи меток, которые присутствовали во всех сериях в результирующей серии, но имели разные значения |
| dps | Количество выпущенных точек данных |
| rawDps | Количество исходных значений, обернутых в результат |
Примеры ответов
{
"outputs": [
{
"id": "Mega expression",
"dps": [
[
1431561600000,
1010,
1030
],
[
1431561660000,
"NaN",
"NaN"
],
[
1431561720000,
"NaN",
"NaN"
],
[
1431561780000,
1120,
1140
]
],
"dpsMeta": {
"firstTimestamp": 1431561600000,
"lastTimestamp": 1431561780000,
"setCount": 4,
"series": 2
},
"meta": [
{
"index": 0,
"metrics": [
"timestamp"
]
},
{
"index": 1,
"metrics": [
"sys.cpu",
"sys.iowait"
],
"commonTags": {
"host": "web01"
},
"aggregatedTags": []
},
{
"index": 2,
"metrics": [
"sys.cpu",
"sys.iowait"
],
"commonTags": {
"host": "web02"
},
"aggregatedTags": []
}
]
},
{
"id": "sys.cpu",
"dps": [
[
1431561600000,
1,
2
],
[
1431561660000,
3,
0
],
[
1431561720000,
5,
0
],
[
1431561780000,
7,
8
]
],
"dpsMeta": {
"firstTimestamp": 1431561600000,
"lastTimestamp": 1431561780000,
"setCount": 4,
"series": 2
},
"meta": [
{
"index": 0,
"metrics": [
"timestamp"
]
},
{
"index": 1,
"metrics": [
"sys.cpu"
],
"commonTags": {
"host": "web01"
},
"aggregatedTags": []
},
{
"index": 2,
"metrics": [
"sys.cpu"
],
"commonTags": {
"host": "web02"
},
"aggregatedTags": []
}
]
}
],
"statsSummary": {
"datapoints": 0,
"rawDatapoints": 0,
"aggregationTime": 0,
"serializationTime": 33,
"storageTime": 77,
"timeTotal": 148.63
},
"query": {
"name": null,
"time": {
"start": "1y-ago",
"end": null,
"timezone": null,
"downsampler": null,
"aggregator": "sum"
},
"filters": [
{
"id": "f1",
"tags": [
{
"tagk": "host",
"filter": "web*",
"group_by": true,
"type": "wildcard"
}
]
}
],
"metrics": [
{
"metric": "sys.cpu",
"id": "a",
"filter": "f1",
"aggregator": null,
"fillPolicy": {
"policy": "nan",
"value": "NaN"
},
"timeOffset": null
},
{
"metric": "sys.iowait",
"id": "b",
"filter": "f1",
"aggregator": null,
"fillPolicy": {
"policy": "nan",
"value": "NaN"
},
"timeOffset": null
}
],
"expressions": [
{
"id": "e",
"expr": "a + b"
},
{
"id": "e2",
"expr": "e * 2"
},
{
"id": "e3",
"expr": "e2 * 2"
},
{
"id": "e4",
"expr": "e3 * 2"
},
{
"id": "e5",
"expr": "e4 + e2"
}
],
"outputs": [
{
"id": "e5",
"alias": "Woot!"
},
{
"id": "a",
"alias": "Woot!2"
}
]
}
}
© 2010–2016 The OpenTSDB Authors
Licensed under the GNU LGPLv2.1+ and GPLv3+ licenses.
http://opentsdb.net/docs/build/html/api_http/query/exp.html