Настройка синтетического мониторинга
Синтетический мониторинг имитирует действия пользователя в браузере по расписанию — из разных географических точек. В отличие от ping-мониторинга, проверяет реальные сценарии: вход в аккаунт, загрузка данных, заполнение формы.
Datadog Synthetic Tests
# Создание browser test через API
import datadog
from datadog import api
datadog.initialize(
api_key='YOUR_DATADOG_API_KEY',
app_key='YOUR_DATADOG_APP_KEY'
)
test = api.Synthetics.create_test({
'name': 'Login Flow - Production',
'type': 'browser',
'status': 'live',
'locations': [
'aws:eu-west-1',
'aws:us-east-1',
'aws:ap-southeast-1',
],
'options': {
'tick_every': 900, # каждые 15 минут
'min_failure_duration': 300, # алерт после 5 минут сбоя
'min_location_failed': 1,
'retry': {'count': 2, 'interval': 300},
'monitor_options': {
'notify_audit': False,
'renotify_interval': 60,
}
},
'config': {
'start_url': 'https://mysite.com/login',
'steps': [
{
'type': 'typeText',
'name': 'Enter email',
'params': {
'element': {'type': 'css', 'value': 'input[name="email"]'},
'value': '[email protected]'
}
},
{
'type': 'typeText',
'name': 'Enter password',
'params': {
'element': {'type': 'css', 'value': 'input[name="password"]'},
'value': '{{ MONITOR_PASSWORD }}' # Из secret
}
},
{'type': 'click', 'params': {'element': {'type': 'css', 'value': '[type=submit]'}}},
{
'type': 'assertElementPresent',
'name': 'Dashboard loaded',
'params': {'element': {'type': 'css', 'value': '[data-testid="dashboard"]'}}
}
]
},
'message': 'Login flow failed! @pagerduty-production'
})
Checkly: code-first синтетический мониторинг
// checkly.config.ts
import { defineConfig } from 'checkly';
import { Frequency } from 'checkly/constructs';
export default defineConfig({
projectName: 'My Site',
logicalId: 'my-site',
repoUrl: 'https://github.com/myorg/my-site',
checks: {
activated: true,
muted: false,
runtimeId: '2024.02',
frequency: Frequency.EVERY_10M,
locations: ['eu-west-1', 'us-east-1'],
tags: ['production'],
browserChecks: {
testMatch: '**/__checks__/**/*.check.ts',
},
},
});
// __checks__/login.check.ts
import { BrowserCheck, Frequency } from 'checkly/constructs';
import { expect, test } from '@playwright/test';
export const loginCheck = new BrowserCheck('login-flow', {
name: 'Login Flow',
frequency: Frequency.EVERY_10M,
locations: ['eu-west-1', 'us-east-1', 'ap-southeast-1'],
code: {
entrypoint: './login.spec.ts',
},
});
// __checks__/login.spec.ts
import { test, expect } from '@playwright/test';
test('Login flow works', async ({ page }) => {
await page.goto('https://mysite.com/login');
await page.fill('[name="email"]', process.env.MONITOR_EMAIL!);
await page.fill('[name="password"]', process.env.MONITOR_PASSWORD!);
await page.click('[type="submit"]');
await expect(page).toHaveURL(/\/dashboard/);
await expect(page.locator('h1')).toContainText('Dashboard');
});
# Деплой checks из CI
npx checkly deploy --preview
npx checkly deploy # Production
Grafana + k6: синтетические нагрузочные тесты
// k6/synthetic-load.js
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
scenarios: {
synthetic_monitoring: {
executor: 'constant-arrival-rate',
rate: 1, // 1 итерация в минуту
timeUnit: '1m',
duration: '24h', // Непрерывно
preAllocatedVUs: 2,
},
},
thresholds: {
http_req_duration: ['p(95)<2000'], // 95% запросов < 2s
http_req_failed: ['rate<0.01'], // < 1% ошибок
},
};
export default function () {
// Homepage
let res = http.get('https://mysite.com');
check(res, {
'homepage status 200': (r) => r.status === 200,
'homepage < 2s': (r) => r.timings.duration < 2000,
});
sleep(10);
// API health
res = http.get('https://api.mysite.com/health');
check(res, {
'api healthy': (r) => r.status === 200 && r.json('status') === 'ok',
});
}
Алерты и эскалация
# Grafana Alerting: оповещения при сбое
alert_rules:
- name: Synthetic Monitor Failure
condition: "avg(synthetic_check_success) < 0.9"
for: 5m
annotations:
summary: "Synthetic monitor failing for {{ $labels.check_name }}"
labels:
severity: critical
notifications:
- pagerduty
- slack-ops-channel
Метрики синтетического мониторинга:
- Доступность (uptime %) из каждого региона
- TTFB (Time to First Byte)
- Время загрузки страницы
- Время выполнения пользовательского сценария
- Количество последовательных отказов до алерта
Настройка Checkly с браузерными checks из 3 регионов и Slack/PagerDuty алертами — 1–2 рабочих дня.







