Prometheus Exporters: мониторим запросы

Всем привет! В этой статье поговорим о том, как можно мониторить запросы в Prometheus Exporter.

Видео по статье можно посмотреть здесь.

Prometheus Exporter идет в двух версиях: Lite (бесплатная версия) и Pro (платная версия).

Существует 4 Lite версии – Prometheus Exporter for Jira LitePrometheus Exporter for Confluence LitePrometheus Exporter for Bitbucket LitePrometheus Exporter for Bamboo. И 3 Pro версии – Prometheus Exporter For Jira Pro, Prometheus Exporter for Confluence ProPrometheus Exporter for Bitbucket Pro.

Prometheus Exporter for Bitbucket Lite и Prometheus Exporter for Bamboo не поддерживают мониторинг запросов.

В остальных версиях мониторинг запросов поддерживается из коробки и метрики собираются по умолчанию.

Метрики называются вот так: jira_request_duration_on_path для Prometheus Exporter for Jira Lite и Pro, confluence_request_duration_on_path for Prometheus Exporter для Confluence Lite и Pro, bitbucket_request_duration_on_path для Prometheus Exporter for Bitbucket Pro.

Эти метрики являются гистограммами. Про гистограммы можно подробнее почитать вот  здесь.

Мы будем рассматривать мониторинг запросов на примере Jira, но все тоже самое можно применить и к Confluence и Bitbucket.

Мониторинг из коробки

Из коробки мы видим следующие метрики:

bitbucket_request_duration_on_path_bucket{path="/rest",le="0.005",} 3.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.01",} 22.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.025",} 36.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.05",} 37.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.075",} 39.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.1",} 39.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.25",} 39.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.5",} 39.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.75",} 41.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="1.0",} 41.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="2.5",} 41.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="5.0",} 42.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="7.5",} 42.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="10.0",} 42.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="+Inf",} 42.0
bitbucket_request_duration_on_path_count{path="/rest",} 42.0
bitbucket_request_duration_on_path_sum{path="/rest",} 5.382160883
bitbucket_request_duration_on_path_bucket{path="/plugins",le="0.005",} 0.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="0.01",} 6.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="0.025",} 13.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="0.05",} 13.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="0.075",} 13.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="0.1",} 13.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="0.25",} 18.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="0.5",} 19.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="0.75",} 19.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="1.0",} 20.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="2.5",} 20.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="5.0",} 20.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="7.5",} 20.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="10.0",} 21.0
bitbucket_request_duration_on_path_bucket{path="/plugins",le="+Inf",} 21.0
bitbucket_request_duration_on_path_count{path="/plugins",} 21.0
bitbucket_request_duration_on_path_sum{path="/plugins",} 10.423385203000002
bitbucket_request_duration_on_path_bucket{path="/download",le="0.005",} 32.0
bitbucket_request_duration_on_path_bucket{path="/download",le="0.01",} 32.0
bitbucket_request_duration_on_path_bucket{path="/download",le="0.025",} 33.0
bitbucket_request_duration_on_path_bucket{path="/download",le="0.05",} 35.0
bitbucket_request_duration_on_path_bucket{path="/download",le="0.075",} 35.0
bitbucket_request_duration_on_path_bucket{path="/download",le="0.1",} 35.0
bitbucket_request_duration_on_path_bucket{path="/download",le="0.25",} 35.0
bitbucket_request_duration_on_path_bucket{path="/download",le="0.5",} 38.0
bitbucket_request_duration_on_path_bucket{path="/download",le="0.75",} 39.0
bitbucket_request_duration_on_path_bucket{path="/download",le="1.0",} 41.0
bitbucket_request_duration_on_path_bucket{path="/download",le="2.5",} 52.0
bitbucket_request_duration_on_path_bucket{path="/download",le="5.0",} 56.0
bitbucket_request_duration_on_path_bucket{path="/download",le="7.5",} 56.0
bitbucket_request_duration_on_path_bucket{path="/download",le="10.0",} 56.0
bitbucket_request_duration_on_path_bucket{path="/download",le="+Inf",} 56.0
bitbucket_request_duration_on_path_count{path="/download",} 56.0
bitbucket_request_duration_on_path_sum{path="/download",} 33.799080099

Давайте рассмотрим подробно метрику bitbucket_request_duration_on_path_bucket с меткой /rest:

bitbucket_request_duration_on_path_bucket{path="/rest",le="0.005",} 3.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.01",} 22.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.025",} 36.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.05",} 37.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.075",} 39.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.1",} 39.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.25",} 39.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.5",} 39.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="0.75",} 41.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="1.0",} 41.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="2.5",} 41.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="5.0",} 42.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="7.5",} 42.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="10.0",} 42.0
bitbucket_request_duration_on_path_bucket{path="/rest",le="+Inf",} 42.0
bitbucket_request_duration_on_path_count{path="/rest",} 42.0
bitbucket_request_duration_on_path_sum{path="/rest",} 5.382160883

Мы видим, что путь /rest был вызван 42 раза (bitbucket_request_duration_on_path_count). Общее время выполнения 5.38 секунды ( bitbucket_request_duration_on_path_sum) и мы видим сколько запросов попали в какую корзину (корзина разбиваются по времени выполнения запросов). Например, мы видим что 41 запрос был выполнен меньше 1 секунды и один запрос больше 5 секунд.

Почему эти метрики были собраны? Эти метрики были собраны потому что, пользователи передвигались по Jira, и эти движения вызывали под собой Jira Rest Api. Кроме того, пользователи или программы могли напрямую вызывать Jira Rest API.

Вы можете видеть, какое количество раз REST API вызвалось, но Вы не видите, какое именно REST API вызвалось.

Например, пользователь вызвал  http://localhost:2990/jira/rest/api/2/projecthttp://localhost:2990/jira будет отрезан, так как это адрес сервера и контектс, а останется только /rest/api/2/project. Затем из того, что осталось, возьмем только первый уровень, что есть /rest, и запишем это первый уровень в качестве метки.

Тоже самое случится, если мы перейдем в шестеренку -> Manager Apps. В этом случае будет вызван юрл http://localhost:2990/jira/plugins/servlet/upm/marketplace/featured?source=side_nav_find_new_addons. Опять удалим http://localhost:2990/jira(так как это адрес сервера и контектс) и останется /plugins/servlet/upm/marketplace/featured?source=side_nav_find_new_addons. Теперь возьмем первый уровень /plugins и запишем его как метку.

В результате мы видим сколько времени исполнялся запрос на каждом из первых уровней.

Такой мониторинг доступен во всех версиях Prometheus Exporter кроме Prometheus Exporter for Bitbucket Lite и Prometheus Exporter for Bamboo.

the PRO way: отключаем мониторинг запросов

В версии PRO Вы можете дополнительно делать следующие вещи.

Прежде всего, Вы можете отключать мониторинг запросов. Если Вам эта метрика не нужна, то отключайте мониториг запросов. Это Вам позволит сэкономить ресурсы Вашего экземпляра Jira.

Для отключения зайдите в шестеренка -> Manage Apps -> Prometheus Exporter Settings -> General и уберите галку с поля “Collect duration for default urls”.

Теперь метрики по мониторингу запросов собираться на будут.

the PRO way: кастомные юрл

Следующая опция возволяет Вам добавлять свои собственные юрл для мониторинга. Допустим, Вы хотите знать сколько выполняется /rest/api/2/project. По умолчанию Вы не видите такой информации, так как все юрл отрезаются по первому уровню.

В PRO версии Вы можете добиться желаемого. Переходим в шестеренка-> Manage Apps -> Prometheus Exporter Settings -> General и добавляем  /rest/api/2/project в качестве нового юрл для собирания метрик:

Теперь если Вы выполните /rest/api/2/project, то увидите вот такие метрики:

jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="0.005",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="0.01",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="0.025",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="0.05",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="0.075",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="0.1",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="0.25",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="0.5",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="0.75",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="1.0",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="2.5",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="5.0",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="7.5",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="10.0",} 1.0
jira_request_duration_on_path_bucket{path="/rest/api/2/project",le="+Inf",} 1.0
jira_request_duration_on_path_count{path="/rest/api/2/project",} 1.0
jira_request_duration_on_path_sum{path="/rest/api/2/project",} 0.003581214

Важно знать, что теперь jira_request_duration_on_path_bucket с меткой /rest не будет содержать информацию о /rest/api/2/project. Т.е там будет информация по всем REST API кроме project.

the PRO way: шаблоны

Хорошо. Усложним задачу. Допустим нам нужно знать, сколько раз пользователи вызывали фильтры, которые создаются по умолчанию в Jira и время их выполнения.

У всех фильтров по умолчанию id меньше 0. И все юрл имеют параметр filter. Например:

http://localhost:2990/jira/browse/TEST-7?filter=-6
http://localhost:2990/jira/issues/?filter=-1

Единственное, что объединяет эти юрл это:

filter=-

Поэтому мы в качестве юрл можем добавить вот такой шаблон:

/*filter=-*

Как Вы видите, у нас в начале и в конце есть звездочка. Она означает любое количество любых символом. Например,  /issues/?filter=-1, /issues/?filter=-10, /issues/?filter=-3 будет удовлетворять этому шаблону. Звездочка может быть в любом месте шаблона.

Добавим шаблон:

Теперь откроем фильтр по умолчанию и увидим вот такие метрики:

jira_request_duration_on_path_bucket{path="/*filter=-*",le="0.005",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="0.01",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="0.025",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="0.05",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="0.075",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="0.1",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="0.25",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="0.5",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="0.75",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="1.0",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="2.5",} 1.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="5.0",} 1.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="7.5",} 1.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="10.0",} 1.0
jira_request_duration_on_path_bucket{path="/*filter=-*",le="+Inf",} 1.0
jira_request_duration_on_path_count{path="/*filter=-*",} 1.0
jira_request_duration_on_path_sum{path="/*filter=-*",} 1.451636186

Хорошо. Метрики по фильтрам по умолчанию мы увидели.

Теперь усложним задачу. Мы хотим отдельно получать метрики по фильтру “Open Issues”. Id фильтра “Open Issues” равно -5. Поэтому добавим вот такой шаблон:

/*filter=-5*

Теперь если вызовем http://localhost:2990/jira/issues/?filter=-5 , мы увидим вот такие метрики:

jira_request_duration_on_path_bucket{path="/*filter=-5*",le="0.005",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="0.01",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="0.025",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="0.05",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="0.075",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="0.1",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="0.25",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="0.5",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="0.75",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="1.0",} 0.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="2.5",} 1.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="5.0",} 1.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="7.5",} 1.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="10.0",} 1.0
jira_request_duration_on_path_bucket{path="/*filter=-5*",le="+Inf",} 1.0
jira_request_duration_on_path_count{path="/*filter=-5*",} 1.0
jira_request_duration_on_path_sum{path="/*filter=-5*",} 1.517880473

Отлично.

Теперь может возникнуть такой вопрос. Мы вызвали юрл http://localhost:2990/jira/issues/?filter=-5. Этот юрл удовлетворяет двум шаблонам: /*filter=-5* и /*filter=-*. Почему был выбран /*filter=-5*? Ответ такой. Это произошло потому, что всегда выбирается шаблон с большим количеством символов. /*filter=-* имеет 11 символов, /*filter=-5* – 12, поэтому был выбран /*filter=-5*.

На этом все. Надеюсь эта информация Вам пригодится.

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Leave a Reply

%d bloggers like this:

Spelling error report

The following text will be sent to our editors: