Вычисление даты для запросов в Графане - PullRequest
0 голосов
/ 19 сентября 2019

(см. Обновленное, более четкое объяснение ниже: перейдите к разделу "Обновление на 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 следующих состояний / состояний:

  • new
  • running
  • done

Когда Прометей соскоб 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 ...

1 Ответ

0 голосов
/ 20 сентября 2019

Поскольку они имеют разные значения меток (`task_date``), они считаются разными метриками.Необходимо удалить размер (метку).

Удалить метку во время запроса

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

label_replace(up{job="myapp_metric_foo, "task_date", "", "task_date", ".*")

или агрегирует метрики :

max(myapp_metric_foo) WITHOUT(task_date)

Удалите метку во время приема

В конфигурации Prometheus вы можете использовать метрическое перемаркирование , чтобы сбросить метку

metric_relabel_configs:
- regex: 'container_label_com_amazonaws_ecs_task_arn'
  action: labeldrop

На мой взгляд, вам лучше оставить ее при приемевремя.Различать ярлыки на день не имеет смысла;если это не какая-то очень долгая запланированная работа.

...