Ваш сайт на 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 день.







