Синтетический мониторинг
Updated Jul 2026
Что такое синтетический мониторинг?
Синтетический мониторинг означает непрерывный запуск автоматизированных тестов против продакшена — не только во время деплоев, а 24/7. Это не нагрузочные тесты; это легковесные пробы, которые проверяют, что критичные пользовательские сценарии остаются функциональными, обнаруживая проблемы между деплоями, которые ни один CI-пайплайн не обнаружит.
Примеры того, что обнаруживает синтетический мониторинг:
- Деградация стороннего сервиса (платёжный провайдер недоступен)
- Истечение сертификата
- Неправильная конфигурация CDN
- Сбои разрешения DNS
- Региональные проблемы с подключением
- Исчерпание пула соединений с базой данных
- Медленные утечки памяти, накапливающиеся за часы
Архитектура синтетического мониторинга
+-------------------+
| Scheduler (cron) | -- Every 5 minutes from 3 regions
+---------+---------+
|
v
+---------+---------+ +---------+---------+ +---------+---------+
| us-east-1 runner | | eu-west-1 runner | | ap-south-1 runner |
| - Login flow | | - Login flow | | - Login flow |
| - Search flow | | - Search flow | | - Search flow |
| - Checkout flow | | - Checkout flow | | - Checkout flow |
+---------+---------+ +---------+---------+ +---------+---------+
| | |
+------------+------------+------------+------------+
|
v
+----------+----------+
| Metrics / Alerting | <-- Grafana, Datadog, PagerDuty
| - Pass/fail status |
| - Response times |
| - Screenshot diffs |
+---------------------+
Скрипт синтетического мониторинга на Playwright
// synthetic/checkout-flow.spec.ts
// Runs every 5 minutes against production
import { test, expect } from '@playwright/test';
test.describe('Production Checkout Flow', () => {
test.setTimeout(30_000); // 30s hard timeout for synthetic tests
test('complete purchase of a test product', async ({ page }) => {
// Step 1: Navigate and verify homepage
const startTime = Date.now();
await page.goto('https://store.example.com');
await expect(page.locator('h1')).toContainText('Welcome');
const homepageLoadTime = Date.now() - startTime;
console.log(`METRIC homepage_load_ms=${homepageLoadTime}`);
// Step 2: Search for test product
await page.fill('[data-testid="search-input"]', 'synthetic-test-product');
await page.click('[data-testid="search-button"]');
await expect(page.locator('[data-testid="search-results"]')).toBeVisible();
// Step 3: Add to cart
await page.click(
'[data-testid="product-card"]:first-child [data-testid="add-to-cart"]'
);
await expect(page.locator('[data-testid="cart-count"]')).toHaveText('1');
// Step 4: Begin checkout (using test payment method)
await page.click('[data-testid="cart-icon"]');
await page.click('[data-testid="checkout-button"]');
// Use test payment method that does not charge
await page.fill('[data-testid="card-number"]', '4242424242424242');
await page.fill('[data-testid="card-expiry"]', '12/28');
await page.fill('[data-testid="card-cvc"]', '123');
await page.click('[data-testid="place-order"]');
// Step 5: Verify order confirmation
await expect(page.locator('[data-testid="order-confirmation"]')).toBeVisible({
timeout: 15_000,
});
await expect(page.locator('[data-testid="order-id"]')).toBeVisible();
const totalFlowTime = Date.now() - startTime;
console.log(`METRIC checkout_flow_total_ms=${totalFlowTime}`);
// Assert performance budget
expect(totalFlowTime).toBeLessThan(15_000);
});
});
Запуск синтетических тестов по расписанию в CI
# .github/workflows/synthetic-monitor.yml
name: Synthetic Monitoring
on:
schedule:
- cron: '*/5 * * * *' # every 5 minutes
workflow_dispatch: {} # allow manual trigger
jobs:
synthetic-us-east:
runs-on: ubuntu-latest # GitHub-hosted runner (US East)
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- name: Install Playwright browsers
run: npx playwright install --with-deps chromium
- name: Run synthetic tests
run: npx playwright test synthetic/ --reporter=json
env:
BASE_URL: https://store.example.com
SYNTHETIC_MODE: true
- name: Push metrics to Datadog
if: always()
run: |
python scripts/push_synthetic_metrics.py \
--results playwright-report/results.json \
--region us-east-1 \
--datadog-api-key ${{ secrets.DATADOG_API_KEY }}
- name: Alert on failure
if: failure()
run: |
curl -X POST "${{ secrets.PAGERDUTY_EVENTS_URL }}" \
-H "Content-Type: application/json" \
-d '{
"routing_key": "${{ secrets.PD_ROUTING_KEY }}",
"event_action": "trigger",
"payload": {
"summary": "Synthetic checkout flow FAILED in us-east-1",
"severity": "critical",
"source": "github-actions-synthetic"
}
}'
Проектирование эффективных синтетических тестов
Что мониторить
| Сценарий | Приоритет | Частота | Таймаут |
|---|---|---|---|
| Загрузка главной страницы | Критический | Каждую 1 мин | 10 с |
| Вход пользователя | Критический | Каждые 2 мин | 15 с |
| Поиск продукта | Высокий | Каждые 5 мин | 15 с |
| Добавление в корзину | Высокий | Каждые 5 мин | 15 с |
| Оформление заказа | Критический | Каждые 5 мин | 30 с |
| Health-эндпоинты API | Критический | Каждые 30 с | 5 с |
Лучшие практики
Используйте выделенные тестовые данные. Создайте «synthetic-test-product», который всегда в наличии, никогда не на распродаже и легко идентифицируется в фильтрах аналитики.
Помечайте синтетический трафик. Добавьте заголовок или параметр запроса (
?synthetic=true), чтобы аналитика и системы биллинга могли фильтровать синтетическую активность.Запускайте из нескольких регионов. Тест, проходящий в us-east-1 и проваливающийся в ap-south-1, немедленно указывает на региональные проблемы.
Держите тесты простыми. Синтетические тесты должны быть простейшим возможным путём через критичный сценарий. Сложная многоветвистая логика тестов принадлежит CI, а не продакшен-мониторингу.
Устанавливайте жёсткие таймауты. Если оформление заказа занимает более 30 секунд в продакшене, оно фактически сломано независимо от того, завершится ли оно успешно в итоге.
Делайте скриншоты при сбое. Прикрепляйте скриншоты к уведомлениям алертов, чтобы дежурный инженер мог видеть, что увидел бы пользователь.
Платформы синтетического мониторинга
| Платформа | Тип | Поддержка браузеров | Регионы | Стоимость |
|---|---|---|---|---|
| Datadog Synthetic | SaaS | Chrome, API | 100+ локаций | За тест |
| Grafana Synthetic | SaaS / Self-hosted | Chrome, API | 30+ локаций | Включено в Grafana Cloud |
| Checkly | SaaS | Нативная поддержка Playwright | 20+ локаций | За проверку |
| GitHub Actions (DIY) | Self-hosted | Любой (Playwright) | Регионы раннеров GitHub | За минуты раннера |
| AWS CloudWatch Synthetics | SaaS | Chrome (Puppeteer) | Все регионы AWS | За канарейку |
Выбор платформы
- Checkly — лучший выбор для команд, уже использующих Playwright, поскольку он запускает скрипты Playwright нативно
- Datadog Synthetic бесшовно интегрируется, если вы уже используете Datadog для мониторинга
- GitHub Actions DIY — экономичный вариант для небольших команд, готовых построить свой пайплайн отчётности
- Grafana Synthetic идеален для команд, инвестировавших в экосистему Grafana
Метрики для отслеживания из синтетического мониторинга
| Метрика | Назначение | Порог алерта |
|---|---|---|
| Доля прохождения/провала по сценарию | Общее здоровье | Любой сбой |
| Доступность (% проходящих прогонов) | Соответствие SLO | < 99,5% за 7 дней |
| Время ответа по шагам | Отслеживание производительности | > 2x от базовой линии |
| Региональная доступность | Географическое здоровье | Любой регион < 99% |
| Оценка различий скриншотов | Визуальная регрессия | > 10% разницы в пикселях |
Синтетический мониторинг — это ночной дозорный вашей продакшен-среды. Когда ваша команда спит, синтетические тесты проверяют, что критичные пользовательские сценарии по-прежнему работают.