Комментарий пользователя
Здравствуйте! Хочу собирать latency и status по страницам и отправлять в Prometheus. Но у нас сотни и тысячи URL — не хочу, чтобы Prometheus съел всю память. Как сделать все правильно?
Ответ специалиста
Добрый день, Данила! Опасаться cardinality стоит, каждая уникальная комбинация лейблов — отдельная временная серия. Нельзя использовать в лейблах произвольные URL или id.
Советую придерживаться принципа: метрики — агрегаты по заранее определенным категориям. Если нужно мониторить URL, делаю либо ограниченный набор endpoint-лейблов (/health, /api/search, /login), либо группирую URL (top pages) и оставляю детальную информацию в логах/ELK.
Минимальный пример на prometheus_client:
from prometheus_client import start_http_server, Counter, Histogram
REQUESTS = Counter('app_requests_total', 'Total requests', ['endpoint'])
LATENCY = Histogram('app_request_latency_seconds', 'Request latency', ['endpoint'])
start_http_server(9100)
def handle(endpoint):
REQUESTS.labels(endpoint=endpoint).inc()
with LATENCY.labels(endpoint=endpoint).time():
# работа
pass
Если нужно проверять множество страниц на availability, экспортируйте только агрегаты: например page_up{group="top"} 1/0 и счетчик ошибок по группе.
В случае, если нужно собрать детальные URL-метрики используйте внешнюю систему (logs → ClickHouse/ES) и деривации. А в Prometheus оставляйте только ключевые агрегаты. Это дает вам нужные дашборды и алерты без риска OOM на TSDB.
Больше полезных статей и курсов по разработке и администрированию вы всегда найдете в Академии Selectel.