Skip to main content

Сбор метрик с приложений

Сервисы ensi отдают метрики производительности в формате prometheus.
Метрики собираются с помощью пакетов ensi/laravel-metrics и ensi/laravel-prometheus.

Настройка сбора метрик

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

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
spec:
additionalScrapeConfigs:
key: scrape_config
name: ensi-metrics-scrape-config
// ...

Здесь ensi-metrics-scrape-config это название секрета, а scrape_config ключ, под которым в секерете хранится врнучную написанный кусочек scrape_config'a прометеуса.

apiVersion: v1
kind: Secret
metadata:
name: ensi-metrics-scrape-config
type: Opaque
stringData:
scrape_config: |
- job_name: ensi-metrics
static_configs:
- targets:
- "admin-auth-master.ensi-stage-1.svc.cluster.local"
- "admin-gui-backend-master.ensi-stage-1.svc.cluster.local"
- "baskets-master.ensi-stage-1.svc.cluster.local"
- "bu-master.ensi-stage-1.svc.cluster.local"

Соотвественно вы можете указать любые настройки сбора метрик согласно документации prometheus scrape config.

После применения этих правок, проверить что прометеус подтянул новые настройки можно зайдя в дашборд прометеуса и откры раздел Status > Targets. Новые таргеты должны появиться в списке.

tip

При добавлении нового сервиса, нужно не забыть добавить таргет в этот конфиг.

Стандартные метрики приложения

метрикатиплейблыописание
app_http_requests_totalcounterendpoint, codeколичество http запросов
app_http_request_duration_secondscounterendpoint, type, codeвремя потраченное сервисом на обработку http запросов с разделением по типу выполняемой работы (php, db, http)
app_http_stats_defaultsummaryquantileстатистика по времени ответа сервиса, по умолчанию 0.5, 0.75 и 0.95 перцентили
app_http_stats_<name>histogram или summaryle или quantileстатистика по времени ответа некоторой группы эндопинтов, добавляется на усмотрение разработчика
app_queue_sizegaugequeueколичество задач в очереди queue
app_queue_job_failed_totalcounterqueueколичество упавших задач в очереди queue
app_log_messages_countcounterendpoint, levelколичество сообщений, записанных в лог

Определение переменных в дашборде

Чтобы вывести в дашборде в графане переменную, нужно зайти в настройки дашборда, в раздел Variables и добавить там переменные, выбрав тип query и введя соответствующий запрос.
Чтобы получить список значений лейблов, нужно использовать функцию label_values(<metric>, <label_name>).

Вот пара примеров:

Переменная $namespace. Используем метрику, которая содержит нужный лейбл и есть у всех сервисов.

label_values(app_queue_size,namespace)

Переменная $app. Список приложений зависит от неймспейса, поэтому фильтруем метрику используя соответствующую переменну.

label_values(app_queue_size{namespace="$namespace"}, app)

Примеры запросов

Показанные ниже запросы используются в стандартном дашборде ensi. Здесь объясняется как что они означают и как работают.

Время потраченное на обработку запроса

Делим сумму секунд, потраченных на обработку http запрсов на количество обработанных http запросов. Получаем среднее время обработки запроса. Всё это отфильтровано по типу работы (php, pgsql, http_client) и взято за одну минуту.

sum(increase(app_http_request_duration_seconds{namespace="$namespace",app="$app",type="php"}[1m]))
/
sum(increase(app_http_requests_total{namespace="$namespace",app="$app"}[1m]))

Для того чтобы показать общую картину затрат времени на обработку запросов, помещаем на график несколько таких запросов, выставляя им режим наложения stack, потому что общее время обработки запроса это сумма по всем типам.

Если нужно посчитать среднее время обработки запроса, то просто убираем фильтр по типу работы.

sum(increase(app_http_request_duration_seconds{namespace="$namespace",app="$app"}[1m]))
/
sum(increase(app_http_requests_total{namespace="$namespace",app="$app"}[1m]))

Перцентили

Метрика содержит уже рассчитанные значения для перцентилей 0.5, 0.75 и 0.95.
Соответственно такой запрос выдаст три графика.

app_http_stats_default{namespace="$namespace",app="$app"}

RPS

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

sum(rate(app_http_requests_total{namespace="$namespace",app="$app"}[1m]))

HTTP коды

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

sum(rate(app_http_requests_total{namespace="$namespace",app="$app"}[1m])) by (code)

Количество сообщений в логах

sum(rate(app_log_messages_count{namespace="$namespace",app="$app"}[1m])) by (level)

Потребление CPU подами выбранного приложения

Здесь мы используем метрики по подам, но фильтруем данные используя имя приложения

sum(
node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace="$namespace"}
* on(namespace,pod)
group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace="$namespace", workload="$app-ms"}
) by (pod)

Потребеление памяти подами текущего приложения

sum(
container_memory_working_set_bytes{namespace="$namespace", container!="", image!=""}
* on(namespace,pod)
group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace="$namespace", workload="$app-ms"}
) by (pod)