(см. Обновленное, более четкое объяснение ниже: перейдите к разделу "Обновление на 2019-09-20")
Я ищу способ для Графаны запросить мой Прометейисточник данных с переменными метками, которые ГГГГ-ММ-ДД даты и, более того, дата относительно текущего дня.
Я хочу увидеть последние 4 дня, я мог бы создать ГрафануГрафик с 4 запросами с правильными метками, как показано ниже, и он будет работать, но мне нужно будет обновлять мой график каждый день:
myapp_metric_foo{task_date="2019-09-16"}
myapp_metric_foo{task_date="2019-09-17"}
myapp_metric_foo{task_date="2019-09-18"}
myapp_metric_foo{task_date="2019-09-19"}
Чтобы избежать этого, я ищу некоторую формулу для вычисления даты, например: now - 1 day | format_date "YYYY-MM-DD"
Итак, мой график ГрафанаПример запросов:
myapp_metric_foo{task_date="{{ now | format_date "YYYY-MM-DD" }}"}
myapp_metric_foo{task_date="{{ now - 1 day | format_date "YYYY-MM-DD" }}"}
myapp_metric_foo{task_date="{{ now - 2 day | format_date "YYYY-MM-DD" }}"}
myapp_metric_foo{task_date="{{ now - 3 day | format_date "YYYY-MM-DD" }}"}
Я не смог найти ничего в Grafana, которое, по-видимому, допускало бы такую вещь.
Другая идея состояла бы в том, чтобы обновить существующий график из внешнего скрипта через API Grafana ...
Обновление на 2019-09-20:
Похоже, мне нужно дать более подробное описание приложения.
Контекст приложения
Инструментированное приложение myapp запускает задачи / задания (скажем, это расчётные задания, которые могут занять некоторое время).Каждое задание имеет task_date
(идентификатор, когда оно было отправлено. Установлено при создании задания: оно никогда не изменится ) и может находиться в одном из 3 следующих состояний / состояний:
Когда Прометей соскоб myapp , myapp сообщает Прометей сколько задач:
- находятся в состоянии
new
, сгруппированы по task_date
- в состоянии
running
, сгруппированные по task_date
- , находятся в состоянии
done
, сгруппированные по task_date
Приложение удаляет done
задач старше 7 дней.
Данные приложения
Предположим, что приложение имеет в 2019-09-19 14:00 следующие задачи в своей базе данных:
+----+------------+---------+---+
| ID | task_date | status | … |
+----+------------+---------+---+
| 42 | 2019-09-12 | done | … |
| 43 | 2019-09-12 | done | … |
| 44 | 2019-09-12 | done | … |
| 45 | 2019-09-13 | done | … |
| 46 | 2019-09-15 | done | … |
| 47 | 2019-09-15 | done | … |
| 48 | 2019-09-16 | done | … |
| 49 | 2019-09-17 | running | … |
| 50 | 2019-09-17 | done | … |
| 51 | 2019-09-17 | done | … |
| 52 | 2019-09-18 | new | … |
| 53 | 2019-09-18 | running | … |
| 54 | 2019-09-18 | running | … |
| 55 | 2019-09-18 | done | … |
| 56 | 2019-09-18 | done | … |
| 57 | 2019-09-19 | new | … |
| 58 | 2019-09-19 | new | … |
| 59 | 2019-09-19 | running | … |
+----+------------+---------+---+
Показанные метрики Prometheus от myapp , в 2019-09-19 18:00 будет (текстовый формат):
myapp_tasks_total{task_date="2019-09-12",status="done"} 3
myapp_tasks_total{task_date="2019-09-13",status="done"} 1
myapp_tasks_total{task_date="2019-09-15",status="done"} 2
myapp_tasks_total{task_date="2019-09-16",status="done"} 1
myapp_tasks_total{task_date="2019-09-17",status="running"} 1
myapp_tasks_total{task_date="2019-09-17",status="done"} 2
myapp_tasks_total{task_date="2019-09-18",status="new"} 1
myapp_tasks_total{task_date="2019-09-18",status="running"} 2
myapp_tasks_total{task_date="2019-09-18",status="done"} 2
myapp_tasks_total{task_date="2019-09-19",status="new"} 2
myapp_tasks_total{task_date="2019-09-19",status="running"} 1
Предположим, что в приложении происходит следующеепотом:
- Задание, отправленное на адресy 2019-09-18 начинается (перемещается с
new
на running
) - Завершается задание, поданное в день 2019-09-19 (перемещается с
running
на done
) - Задачи, имеющие
task_date
старше 7 дней, удаляются (здесь задачи на 2019-09-12) - Новое задание отправляется в 2019-09-20 00h43m
Несколько часов спустя, в 2019-09-20 02:00, новый выходной показатель будет:
myapp_tasks_total{task_date="2019-09-12",status="done"} 3
myapp_tasks_total{task_date="2019-09-13",status="done"} 1
myapp_tasks_total{task_date="2019-09-15",status="done"} 2
myapp_tasks_total{task_date="2019-09-16",status="done"} 1
myapp_tasks_total{task_date="2019-09-17",status="running"} 1
myapp_tasks_total{task_date="2019-09-17",status="done"} 2
myapp_tasks_total{task_date="2019-09-18",status="running"} 3
myapp_tasks_total{task_date="2019-09-18",status="done"} 2
myapp_tasks_total{task_date="2019-09-19",status="new"} 2
myapp_tasks_total{task_date="2019-09-19",status="done"} 1
myapp_tasks_total{task_date="2019-09-20",status="done"} 1
Мой Графан График (тип визуализации = График) будет использовать следующий4 PromQL запросов ( 4 , потому что я хочу видеть только последние 4 дней):
- Запрос A
- Метрики:
myapp_tasks_total{task_date="2019-09-17"}
- Легенда:
{{status}} tasks submitted 3 days ago
- Запрос B
- Метрики:
myapp_tasks_total{task_date="2019-09-18"}
- Легенда:
{{status}} tasks submitted 2 days ago
- Запрос C
- Метрики:
myapp_tasks_total{task_date="2019-09-19"}
- Легенда:
{{status}} tasks submitted yesterday
- Запрос D
- Метрики:
myapp_tasks_total{task_date="2019-09-20"}
- Легенда:
{{status}} tasks submitted today
Это приведет к 4 * 3 = 12кривыеmax (в зависимости от того, сколько различных статусов существует для каждого дня), что поможет мне отслеживать загрузку приложения (количество задач) и скорость ( время выполнения ).
Вопрос
Инструментальная часть Prometheus для меня не проблема: я знаю, как получить мои данные из моей базы данных и как выставить их на Prometheus.
Моя проблема связана с запросами PromQL для Grafana: 4 запроса, которые я дал выше, будут относиться только к Grafana в 2019-09-20: мне нужен способдинамически «менять» критерии task_date=
в каждом запросе.
Я надеялся, что Графана имеет собственный DSL, который позволит мне сказать ему:
Эй, возьмите переменную $__to
, удалите x дней и отформатируйте его в «ГГГГ-ММ-ДД».
Что-то вроде: {{ $__to - x * 86400000 | format_date "YYYY-MM-DD" }}
(1 день = 86400000 мс)
Другая идеябыло бы вручную создать график и периодически обновлять его из внешнего скрипта через API Grafana ...