Можете ли вы рассчитывать активных пользователей, используя временные ряды - PullRequest
0 голосов
/ 06 апреля 2019

Мой клиент Atomist предоставляет метрики для запускаемых команд. Каждая команда представляет собой метрику с элементом имени пользователя и элементом статуса.

Я месяцами отбирал эти данные, не сбрасывая счет.

Мое требование - показать количество активных пользователей за период времени. то есть 1h, 1d, 7d и 30d в Графане.

Первоначальный запрос был:

count(count({Username=~".+"}) by (Username))

это проблема, потому что я не очищаю метрики, поэтому она всегда считается с момента ее создания.

Затем я попробовал это:

count(max_over_time(help_command{job=“Application
Name”,Username=~“.+“}[1w]) -
max_over_time(help_command{job=“Application name”,Username=~“.+“}[1w]
offset 1w) > 0)

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

Я попробовал:

"{__name__=~".+_command",job="app name"}[1w] offset 1w"

но это, очевидно, очень дорого (время ожидания в браузере) и есть проблемы с интеграцией max_over_time, которая не поддерживает его.

Любая помощь, я неправильно использую метрику. Есть ли лучший способ сделать запрос ... моя единственная опция на данный момент - count (формат работает выше для каждой команды)

Заранее спасибо.

1 Ответ

0 голосов
/ 11 апреля 2019

Для начала я укажу на ряд проблем с вашим подходом.

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

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

В-третьих, высобирать отдельные показатели для каждой команды (например, help_command, foo_command) вместо одной метрики с именем команды в качестве метки (например, command_usage{commmand="help"}, command_usage{commmand="foo"})

Чтобы вернуться к вашему вопросу,вам не нужен max_over_time, вы можете просто написать свой запрос следующим образом:

count by(__name__)(
  (
    {__name__=~".+_command",job=“Application Name”}
      - 
    {__name__=~".+_command",job=“Application name”} offset 1w
  ) > 0
)

Это работает только потому, что вы говорите, что независимо от того, что экспортирует число, оно никогда не сбрасывает их.Если это просто потому, что этот экспортер никогда не перезапускается, и когда это будет, счетчик упадет до нуля, тогда вам нужно будет использовать increase вместо минус, и вы столкнетесь с точно такими же проблемами с производительностью, что и с max_over_time.

count by(__name__)(
  increase({__name__=~".+_command",job=“Application Name”}[1w]) > 0
)
...