Примеры запросов
Ниже приведен список примеров запросов, использующих примерный набор данных. Мы проиллюстрируем ряд распространённых типов запросов, с которыми вы можете столкнуться, чтобы вы могли понять, как работает система запросов. В каждом временном ряду в примере хранится только одна точка данных, а идентификаторы пользователей (UID) сокращены до одного байта для удобства чтения. Все примерные запросы — это запросы Метрики из API HTTP и отображают только компонент m=. Подробности см. в /api/query. Если вы используете инструмент командной строки, формат запроса будет немного отличаться, поэтому ознакомьтесь с документацией для конкретной команды.
Примерные данные
Временной ряд
| TS# | Метрика | Теги | TSUID |
|---|---|---|---|
| 1 | sys.cpu.system | dc=dal host=web01 | 0102040101 |
| 2 | sys.cpu.system | dc=dal host=web02 | 0102040102 |
| 3 | sys.cpu.system | dc=dal host=web03 | 0102040103 |
| 4 | sys.cpu.system | host=web01 | 010101 |
| 5 | sys.cpu.system | host=web01 owner=jdoe | 0101010306 |
| 6 | sys.cpu.system | dc=lax host=web01 | 0102050101 |
| 7 | sys.cpu.system | dc=lax host=web02 | 0102050102 |
| 8 | sys.cpu.user | dc=dal host=web01 | 0202040101 |
| 9 | sys.cpu.user | dc=dal host=web02 | 0202040102 |
UID
| Имя | UID |
|---|---|
| Метрики | |
| cpu.system | 01 |
| cpu.user | 02 |
| Теги | |
| host | 01 |
| dc | 02 |
| owner | 03 |
| Значения тегов | |
| web01 | 01 |
| web02 | 02 |
| web03 | 03 |
| dal | 04 |
| lax | 05 |
| doe | 06 |
Предупреждение
Это не обязательно лучший способ настройки метрик и тегов, а скорее иллюстративное представление о том, как работает система запросов. В частности, TS #4 и 5, хотя и являются законными временными рядами, могут испортить ваши запросы, если вы не знаете, как они работают. В общем, старайтесь поддерживать одинаковое количество и тип тегов для каждого временного ряда.
Под капотом
Вы можете прочитать о том, как OpenTSDB хранит данные временных рядов здесь: Хранилище. В противном случае, помните, что каждая строка в хранилище имеет уникальный ключ в формате:
<metricID><normalized_timestamp><tagkID1><tagvID1>[...<tagkIDN><tagvIDN>]
Таблица данных выше хранилась бы как:
01<ts>0101 01<ts>01010306 01<ts>02040101 01<ts>02040102 01<ts>02040103 01<ts>02050101 01<ts>02050102 02<ts>02040101 02<ts>02040102
При запросе к OpenTSDB происходит следующее.
- Запрос анализируется и проверяется, чтобы убедиться, что формат правильный, а метрики, имена тегов и значения тегов существуют. Если одна метрика, имя тега или значение не существует в системе, возвращается ошибка.
- Затем создаётся сканер для базовой системы хранения.
- Если в запросе нет тегов или значений тегов, то берутся все строки данных, которые соответствуют
<metricID><timestamp>, поэтому если у вас много временных рядов для определённой метрики, это может быть очень много строк. - Если в запросе определён один или несколько тегов, то он всё ещё сканирует все строки, соответствующие
<metricID><timestamp>, но также выполняет поиск по регулярному выражению, чтобы вернуть только строки, содержащие запрашиваемый тег.
- Если в запросе нет тегов или значений тегов, то берутся все строки данных, которые соответствуют
- После того, как все данные возвращены, OpenTSDB организует их в группы, если это необходимо.
- Если запрашивалась выборка данных, каждый отдельный временной ряд выборки данных в меньшие временные отрезки с использованием соответствующего агрегатора.
- Затем каждая группа данных агрегируется с использованием конкретной функции агрегирования.
- Если был обнаружен флаг
rate, каждое агрегирование будет затем скорректировано для получения скорости. - Результаты возвращаются вызывающему элементу.
Запрос 1 — Все временные ряды для метрики
m=sum:cpu.system
Это самый простой запрос. TSDB создаст сканер для извлечения всех точек данных для метрики UID 01 между <start> и <end>. Результатом будет один набор данных с временными рядами от #1 до #7, суммированными вместе. Если у вас тысячи уникальных комбинаций тегов для данной метрики, они все будут добавлены в один временной ряд.
[
{
"metric": "cpu.system",
"tags": {},
"aggregated_tags": [
"host"
],
"tsuids": [
"010101",
"0101010306",
"0102050101",
"0102040101",
"0102040102",
"0102040103",
"0102050102"
],
"dps": {
"1346846400": 130.29999923706055
}
}
]
Запрос 2 — Фильтр по тегу
Обычно агрегирование всех временных рядов для метрики не особенно полезно. Вместо этого мы можем немного углубиться, отфильтровав временные ряды, содержащие определённую комбинацию тег/значение. Просто поместите пару в фигурные скобки:
m=sum:cpu.system{host=web01}
Это вернёт агрегированные временные ряды #1, #4, #5 и #6, поскольку они единственные, которые содержат host=web01.
[
{
"metric": "cpu.system",
"tags": {
"host": "web01"
},
"aggregated_tags": [],
"tsuids": [
"010101",
"0101010306",
"0102040101",
"0102050101"
],
"dps": {
"1346846400": 63.59999942779541
}
}
]
Запрос 3 — Конкретный временной ряд
А что, если вам нужен конкретный временной ряд? Вам нужно включить каждый тег и соответствующее значение.
m=sum:cpu.system{host=web01,dc=lax}
Это вернёт данные только из временного ряда #6.
[
{
"metric": "cpu.system",
"tags": {
"dc": "lax",
"host": "web01"
},
"aggregated_tags": [],
"tsuids": [
"0102050101"
],
"dps": {
"1346846400": 15.199999809265137
}
}
]
Предупреждение
Здесь схема тегов будет стоять или падать. Допустим, вы хотите получить только данные из временного ряда #4. В рамках текущей системы это невозможно. Вы отправите запрос #2 m=sum:cpu.system{host=web01} , думая, что он вернёт только данные из #4, но как мы видели, вы получите агрегированные результаты для #1, #4, #5 и #6. Чтобы предотвратить такую ситуацию, вам нужно будет добавить ещё один тег в #4, который отличал бы его от других временных рядов в группе. Или, если вы уже зафиксировали, вы можете использовать запросы TSUID.
Запрос 4 — Запрос TSUID
Если вы знаете точный TSUID временного ряда, который хотите получить, вы можете просто передать его следующим образом:
tsuids=sum:0102040102
Результатом будут запрошенные вами точки данных.
[
{
"metric": "cpu.system",
"tags": {
"dc": "lax",
"host": "web01"
},
"aggregated_tags": [],
"tsuids": [
"0102050101"
],
"dps": {
"1346846400": 15.199999809265137
}
}
]
Запрос 5 — Многомерный запрос TSUID
Вы также можете агрегировать несколько TSUID в одном запросе, при условии, что они относятся к одной и той же метрике. Если вы попытаетесь агрегировать несколько метрик, API вернёт ошибку.
tsuids=sum:0102040101,0102050101
[
{
"metric": "cpu.system",
"tags": {
"host": "web01"
},
"aggregated_tags": [
"dc"
],
"tsuids": [
"0102040101",
"0102050101"
],
"dps": {
"1346846400": 33.19999980926514
}
}
]
Запрос 6 — Группировка
m=sum:cpu.system{host=*}
Оператор * (звёздочка) — это оператор группировки, который возвращает набор данных для каждого уникального значения заданного имени тега. Каждый временной ряд, включающий заданную метрику и заданное имя тега, независимо от других тегов или значений, будет включён в результаты. После группировки индивидуальных результатов временных рядов они будут агрегированы и возвращены.
В этом примере будет возвращено 3 группы:
| Группа | Включённые временные ряды |
|---|---|
| web01 | #1, #4, #5, #6 |
| web02 | #2, #7 |
| web03 | #3 |
TSDB обнаружил 7 временных рядов, которые включали тег «host». Было 3 уникальных значения для этого тега (web01, web02 и web03).
[
{
"metric": "cpu.system",
"tags": {
"host": "web01"
},
"aggregated_tags": [],
"tsuids": [
"010101",
"0101010306",
"0102040101",
"0102050101"
],
"dps": {
"1346846400": 63.59999942779541
}
},
{
"metric": "cpu.system",
"tags": {
"host": "web02"
},
"aggregated_tags": [
"dc"
],
"tsuids": [
"0102040102",
"0102050102"
],
"dps": {
"1346846400": 24.199999809265137
}
},
{
"metric": "cpu.system",
"tags": {
"dc": "dal",
"host": "web03"
},
"aggregated_tags": [],
"tsuids": [
"0102040103"
],
"dps": {
"1346846400": 42.5
}
}
]
Запрос 7 — Группировка и фильтрация
Обратите внимание, что в примере #2 группа web01 включала нестандартные временные ряды #4 и #5. Мы можем исключить их, указав второй тег, например:
m=sum:cpu.nice{host=*,dc=dal}
Теперь мы получим результаты только для #1-#3, но потеряем значения dc=lax.
[
{
"metric": "cpu.system",
"tags": {
"dc": "dal",
"host": "web01"
},
"aggregated_tags": [],
"tsuids": [
"0102040101"
],
"dps": {
"1346846400": 18
}
},
{
"metric": "cpu.system",
"tags": {
"dc": "dal",
"host": "web02"
},
"aggregated_tags": [],
"tsuids": [
"0102040102"
],
"dps": {
"1346846400": 9
}
},
{
"metric": "cpu.system",
"tags": {
"dc": "dal",
"host": "web03"
},
"aggregated_tags": [],
"tsuids": [
"0102040103"
],
"dps": {
"1346846400": 42.5
}
}
]
Запрос 8 — Группировка с оператором OR
Оператор * жадный и вернёт *все* значения, назначенные имени тега. Если вы хотите получить только несколько значений тегов, используйте оператор | (пайп) вместо этого.
m=sum:cpu.nice{host=web01|web02}
Это найдёт все временные ряды, которые содержат значения «host» «web01» ИЛИ «web02», затем сгруппирует их по значению, аналогично оператору *. Наши группы на этот раз будут выглядеть так:
| Группа | Включённые временные ряды |
|---|---|
| web01 | #1, #4, #5, #6 |
| web02 | #2, #7 |
[
{
"metric": "cpu.system",
"tags": {
"host": "web01"
},
"aggregated_tags": [],
"tsuids": [
"010101",
"0101010306",
"0102040101",
"0102050101"
],
"dps": {
"1346846400": 63.59999942779541
}
},
{
"metric": "cpu.system",
"tags": {
"host": "web02"
},
"aggregated_tags": [
"dc"
],
"tsuids": [
"0102040102",
"0102050102"
],
"dps": {
"1346846400": 24.199999809265137
}
}
]
© 2010–2016 The OpenTSDB Authors
Licensed under the GNU LGPLv2.1+ and GPLv3+ licenses.
http://opentsdb.net/docs/build/html/user_guide/query/examples.html