Сбор метрик с приложений
Сервисы 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. Новые таргеты должны появиться в списке.
При добавлении нового сервиса, нужно не забыть добавить таргет в этот конфиг.
Стандартные метрики приложения
метрика | тип | лейблы | описание |
---|---|---|---|
app_http_requests_total | counter | endpoint, code | количество http запросов |
app_http_request_duration_seconds | counter | endpoint, type, code | время потраченное сервисом на обработку http запросов с разделением по типу выполняемой работы (php, db, http) |
app_http_stats_default | summary | quantile | статистика по времени ответа сервиса, по умолчанию 0.5, 0.75 и 0.95 перцентили |
app_http_stats_<name> | histogram или summary | le или quantile | статистика по времени ответа некоторой группы эндопинтов, добавляется на усмотрение разработчика |
app_queue_size | gauge | queue | количество задач в очереди queue |
app_queue_job_failed_total | counter | queue | количество упавших задач в очереди queue |
app_log_messages_count | counter | endpoint, 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)