# Prometheus и Grafana ## Навигация - [🏠 Главная страница курса](../../../README.md) - [📚 Модуль 5](../README.md) --- ## Prometheus **Prometheus** — система мониторинга и база данных временных рядов. ### Архитектура Prometheus ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Application │ │ Application │ │ Application │ │ (Metrics) │ │ (Metrics) │ │ (Metrics) │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ └───────────────────────┼───────────────────────┘ │ ┌─────────────────┐ │ Prometheus │ │ Server │ └─────────────────┘ │ ┌─────────────────┐ │ Grafana │ │ (Dashboard) │ └─────────────────┘ ``` ### PromQL (Язык запросов Prometheus) #### Основные запросы: ```promql # Простая метрика http_requests_total # Метрика с фильтрами http_requests_total{method="GET", status="200"} # Агрегация sum(http_requests_total) by (method) # Rate (скорость изменения) rate(http_requests_total[5m]) # Histogram quantiles histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) ``` #### Примеры запросов: ```promql # Количество запросов в секунду rate(http_requests_total[5m]) # Среднее время ответа rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m]) # 95-й перцентиль времени ответа histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) # Ошибки в процентах rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) * 100 ``` ### Spring Boot + Prometheus ```java @Configuration public class PrometheusConfig { @Bean public MeterRegistry meterRegistry() { return new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); } } @RestController public class MetricsController { private final MeterRegistry meterRegistry; public MetricsController(MeterRegistry meterRegistry) { this.meterRegistry = meterRegistry; } @GetMapping("/metrics") public String metrics() { return ((PrometheusMeterRegistry) meterRegistry).scrape(); } } ``` ## Grafana **Grafana** — платформа для визуализации метрик и создания дашбордов. ### Создание дашборда ```json { "dashboard": { "title": "Application Metrics", "panels": [ { "title": "Request Rate", "type": "graph", "targets": [ { "expr": "rate(http_requests_total[5m])", "legendFormat": "{{method}} {{endpoint}}" } ] }, { "title": "Response Time", "type": "graph", "targets": [ { "expr": "histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))", "legendFormat": "95th percentile" } ] } ] } } ``` ### Алерты в Grafana ```json { "alert": { "name": "High Error Rate", "message": "Error rate is above 5%", "conditions": [ { "query": { "params": ["A", "5m", "now"] }, "reducer": { "type": "last", "params": [] }, "evaluator": { "params": [0.05], "type": "gt" } } ] } } ```