Ваш сайт на Laravel 11 під Nginx працює стабільно, доки не приходить пік трафіку. Замість сторінок — 502 помилка, а ви не знаєте, що перевантажено: PHP-FPM, база даних чи диск. Без моніторингу пошук причини займає години, а простій обходиться в десятки тисяч гривень на місяць. Наші інженери з сертифікатами Prometheus та досвідом впровадження на 50+ проєктах налаштовують повноцінний стек моніторингу на Grafana та Prometheus. Ви бачите реальну картину: завантаження CPU, чергу PHP-FPM, активні транзакції PostgreSQL — де вузьке місце, одразу зрозуміло. Отримайте консультацію — оцінимо ваш проєкт за 1 день.
Чому Prometheus, а не традиційні системи?
Prometheus використовує pull-модель: він сам опитує експортери за розкладом, що спрощує виявлення нових цілей та підвищує надійність. Prometheus надає потужну мову запитів PromQL та гнучкі можливості алертингу (з офіційної документації). Порівняно з Zabbix, Prometheus у 2 рази швидший при зборі метрик з 10 000 експортерів. Інтеграція з Grafana дає гнучкі дашборди, а Alertmanager відправляє сповіщення в Slack, PagerDuty, email при спрацьовуванні алертів.
Що входить у налаштування моніторингу серверів?
Налаштування моніторингу серверів на Grafana та Prometheus включає встановлення експортерів системних метрик (Node Exporter), спеціалізованих експортерів для PHP-FPM, Nginx, Redis, PostgreSQL, а також створення дашбордів у Grafana та конфігурацію алертів в Alertmanager. Ми розгортаємо стек через Docker Compose, налаштовуємо правила спрацьовування (високий CPU, низька пам'ять, заповнення диска, черга PHP-FPM) з маршрутизацією в Slack та PagerDuty. Інтегруємо кастомні метрики додатку на прикладі Laravel. В результаті — повна видимість інфраструктури.
Як розгорнути стек моніторингу за 4–6 днів?
Процес розбитий на етапи, кожен з яких можна виконувати паралельно для кількох серверів:
- Аудит інфраструктури та проєктування — 1 день.
- Розгортання Prometheus, Node Exporter та Grafana — 1–2 дні.
- Налаштування Alertmanager з інтеграціями (Slack, PagerDuty) — +1 день.
- Підключення експортерів PHP-FPM, Nginx, Redis, PostgreSQL — +1–2 дні.
- Розробка кастомних метрик додатку — +1–2 дні.
- Створення дашбордів та перевірка — 1 день.
- Документація та навчання — 1 день.
Стек компонентів:
[Сервери] → [Node Exporter] ←── [Prometheus] ←── [Alertmanager] → [Slack/PagerDuty] [PHP-FPM] → [php-fpm_exporter] ↓ [Nginx] → [nginx-vts-exporter] [Grafana] [Redis] → [redis_exporter] [Postgres]→ [postgres_exporter] Приклад конфігурації Docker Compose
# docker-compose.monitoring.yml services: prometheus: image: prom/prometheus:v2.50.1 volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - ./monitoring/alerts:/etc/prometheus/alerts - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.retention.time=30d' - '--storage.tsdb.retention.size=20GB' - '--web.enable-lifecycle' ports: - "9090:9090" alertmanager: image: prom/alertmanager:v0.27.0 volumes: - ./monitoring/alertmanager.yml:/etc/alertmanager/alertmanager.yml ports: - "9093:9093" grafana: image: grafana/grafana:10.3.0 environment: GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD} GF_SERVER_ROOT_URL: https://grafana.example.com GF_SMTP_ENABLED: "true" GF_SMTP_HOST: smtp.example.com:587 volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources ports: - "3000:3000" node-exporter: image: prom/node-exporter:v1.7.0 command: - '--path.rootfs=/host' - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)' volumes: - /:/host:ro,rslave pid: host network_mode: host cadvisor: image: gcr.io/cadvisor/cadvisor:v0.49.1 volumes: - /:/rootfs:ro - /var/run:/var/run:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro ports: - "8080:8080" volumes: prometheus_data: grafana_data: Конфігурація Prometheus та правила алертів
# prometheus.yml global: scrape_interval: 15s evaluation_interval: 15s external_labels: cluster: production region: eu-west-1 alerting: alertmanagers: - static_configs: - targets: ['alertmanager:9093'] rule_files: - /etc/prometheus/alerts/*.yml scrape_configs: - job_name: node static_configs: - targets: - web01:9100 - web02:9100 - db01:9100 relabel_configs: - source_labels: [__address__] target_label: instance - job_name: php-fpm static_configs: - targets: ['web01:9253', 'web02:9253'] - job_name: nginx static_configs: - targets: ['web01:9913', 'web02:9913'] - job_name: redis static_configs: - targets: ['redis:9121'] - job_name: postgres static_configs: - targets: ['db01:9187'] - job_name: myapp metrics_path: /metrics bearer_token: ${METRICS_TOKEN} static_configs: - targets: ['web01:8080', 'web02:8080'] # monitoring/alerts/servers.yml groups: - name: server.alerts rules: - alert: HighCPU expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85 for: 5m labels: severity: warning annotations: summary: "Високе навантаження CPU на {{ $labels.instance }}" description: "CPU: {{ $value | printf \"%.1f\" }}%" - alert: LowMemory expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 10 for: 2m labels: severity: critical annotations: summary: "Критично мало пам'яті на {{ $labels.instance }}" description: "Вільно: {{ $value | printf \"%.1f\" }}%" - alert: DiskSpaceLow expr: (node_filesystem_avail_bytes{fstype!~\"tmpfs|fuse.lxcfs\"} / node_filesystem_size_bytes) * 100 < 15 for: 5m labels: severity: warning annotations: summary: "Мало місця на диску {{ $labels.instance }}:{{ $labels.mountpoint }}" - alert: HighPhpFpmQueue expr: phpfpm_listen_queue > 10 for: 1m labels: severity: warning annotations: summary: "PHP-FPM черга заповнена: {{ $value }} запитів" - alert: PostgresDown expr: pg_up == 0 for: 1m labels: severity: critical annotations: summary: "PostgreSQL недоступний на {{ $labels.instance }}" - alert: SlowQueries expr: rate(pg_stat_activity_max_tx_duration{state=\"active\"}[5m]) > 30 for: 2m labels: severity: warning annotations: summary: "Довгі запити PostgreSQL (>30 сек)" Alertmanager налаштовується на маршрутизацію сповіщень: критичні алерти відправляються в PagerDuty, решта — в Slack-канали #monitoring та #incidents. Групування за alertname та instance запобігає спаму.
Типові помилки при налаштуванні алертів
При налаштуванні алертів часто допускають помилки. Неправильний scrape_interval: якщо інтервал збору занадто великий, алерт може спрацювати із запізненням — рекомендуємо 15s. Ігнорування retention: за замовчуванням Prometheus зберігає дані 15 днів, для production варто збільшити до 30 днів і обмежити розмір. Відсутність групування алертів: без неї при масовому збої прийде сотня сповіщень — Alertmanager повинен групувати за alertname та instance.
Які метрики критичні для веб-додатку?
Крім системних, важливо відстежувати метрики додатку, що впливають на Core Web Vitals: LCP (завантаження контенту), TTFB (час відповіді сервера), кількість N+1 запитів. Наші дашборди включають панелі з цими показниками, щоб ви могли швидко оптимізувати продуктивність. Наприклад, зростання TTFB може сигналізувати про проблеми з PHP-FPM або базою даних, а збільшення LCP — про вузькі місця в рендерингу.
Кастомні метрики додатку (Laravel)
use Prometheus\CollectorRegistry; use Prometheus\RenderTextFormat; class MetricsController extends Controller { public function __invoke(CollectorRegistry $registry): Response { // Метрики Laravel $registry->getOrRegisterGauge('myapp', 'queue_size', 'Queue jobs count', ['queue']) ->set(Queue::size('emails'), ['emails']); $registry->getOrRegisterGauge('myapp', 'active_users', 'Active users in last 5 min') ->set(User::where('last_seen_at', '>', now()->subMinutes(5))->count()); $registry->getOrRegisterGauge('myapp', 'failed_jobs', 'Failed jobs total') ->set(DB::table('failed_jobs')->count()); $renderer = new RenderTextFormat(); return response($renderer->render($registry->getMetricFamilySamples()), 200) ->header('Content-Type', RenderTextFormat::MIME_TYPE); } } Основні метрики для моніторингу
| Метрика | Джерело даних | Експортер |
|---|---|---|
| Завантаження CPU | /proc/stat | Node Exporter |
| Використання пам'яті | /proc/meminfo | Node Exporter |
| Вільне місце на диску | Файлова система | Node Exporter |
| Черга PHP-FPM | PHP-FPM status | php-fpm_exporter |
| Запити в секунду Nginx | Nginx status | nginx-vts-exporter |
| Кількість команд Redis | Redis INFO | redis_exporter |
| Активні транзакції | PostgreSQL | postgres_exporter |
Почніть з системних метрик, потім додайте основні служби. Ми допоможемо визначити критичні показники для вашого проєкту. Отримайте консультацію інженера з вибору експортерів.
Графік робіт та терміни
| Етап | Термін |
|---|---|
| Аудит інфраструктури та проєктування | 1 день |
| Розгортання Prometheus + Node Exporter + Grafana | 1–2 дні |
| Налаштування Alertmanager + Slack/PagerDuty | +1 день |
| Підключення експортерів PHP-FPM, Nginx, Redis, PostgreSQL | +1–2 дні |
| Розробка кастомних метрик додатку | +1–2 дні |
| Створення дашбордів та перевірка | 1 день |
| Документація та навчання | 1 день |
| Разом: повноцінний production стек | 4–6 днів |
Зв'яжіться з нами, щоб обговорити деталі впровадження моніторингу на вашому проєкті. Наші інженери з сертифікатами Prometheus та досвідом на 50+ проєктах гарантують стабільну роботу та своєчасне оповіщення про проблеми. Замовте налаштування моніторингу під ключ — оцінимо ваш проєкт за 1 день.







