Для интеграции Puppeteer с Prometheus важно сначала подготовить окружение. Puppeteer устанавливается через npm:
npm install puppeteer
Также понадобится библиотека для экспорта метрик в Prometheus, например
prom-client:
npm install prom-client
После установки создаётся базовая структура проекта: файл для сценариев тестирования и отдельный модуль для метрик. Основной подход заключается в том, чтобы каждая ключевая операция Puppeteer была обёрнута в сбор метрик.
Prometheus работает с тремя основными типами метрик: Counter, Gauge, Histogram. В тестировании с Puppeteer чаще всего используются:
Пример инициализации метрик:
const client = require(&
const pageLoadTime = new client.Histogram({
name: 'page_load_time_seconds',
help: 'Время загрузки страницы в секундах',
buckets: [0.1, 0.5, 1, 2, 5, 10] // определение диапазонов
});
const browserInstances = new client.Gauge({
name: 'active_browser_instances',
help: 'Количество активных экземпляров браузера'
});
const testErrors = new client.Counter({
name: 'test_errors_total',
help: 'Общее количество ошибок тестирования'
});
Для измерения метрик важно оборачивать ключевые операции Puppeteer. Пример измерения времени загрузки страницы:
const puppeteer = require('puppeteer');
async function measurePageLoad(url) {
const browser = await puppeteer.launch();
browserInstances.inc();
const page = await browser.newPage();
const start = Date.now();
try {
await page.goto(url, { waitUntil: 'networkidle2' });
const duration = (Date.now() - start) / 1000;
pageLoadTime.observe(duration);
} catch (error) {
testErrors.inc();
throw error;
} finally {
await browser.close();
browserInstances.dec();
}
}
В этом примере каждая попытка открыть страницу фиксирует время загрузки и учитывает ошибки, а также количество запущенных браузеров.
Для того чтобы Prometheus мог собирать данные, требуется HTTP-сервер,
отдающий метрики в формате Prometheus. Используется встроенный
prom-client с экспресс-сервером:
const express = require('express');
const client = require('prom-client');
const app = express();
const register = client.register;
app.get('/metrics', async (req, res) => {
res.set('Content-Type', register.contentType);
res.end(await register.metrics());
});
app.listen(3000, () => {
console.log('Метрики доступны на http://localhost:3000/metrics');
});
Каждый вызов /metrics возвращает актуальные значения всех
метрик: счетчиков, гейджей и гистограмм.
Для больших проектов рекомендуется создать обёртку для всех тестов Puppeteer, которая автоматически:
Пример структуры обёртки:
async function runTest(url, action) {
const browser = await puppeteer.launch();
browserInstances.inc();
const page = await browser.newPage();
const start = Date.now();
try {
await page.goto(url, { waitUntil: 'networkidle2' });
const duration = (Date.now() - start) / 1000;
pageLoadTime.observe(duration);
await action(page);
} catch (error) {
testErrors.inc();
throw error;
} finally {
await browser.close();
browserInstances.dec();
}
}
Такой подход позволяет собирать единые метрики для всех сценариев без дублирования кода.
Для комплексного тестирования можно добавлять дополнительные метрики:
Пример метрики для действий на странице:
const actionDuration = new client.Histogram({
name: 'action_duration_seconds',
help: 'Время выполнения действий на странице',
labelNames: ['action']
});
async function measureAction(page, actionName, callback) {
const start = Date.now();
await callback(page);
const duration = (Date.now() - start) / 1000;
actionDuration.labels(actionName).observe(duration);
}
Использование:
await measureAction(page, 'login_button_click', async (page) => {
await page.click('#login-button');
});
Метрики Prometheus, собираемые Puppeteer, идеально подходят для мониторинга в пайплайнах CI/CD:
Метрики можно визуализировать через Grafana, создавая дашборды с историей тестов и нагрузкой на браузерные инстансы.
Эта структура позволяет объединить автоматизированное тестирование Puppeteer и систему мониторинга Prometheus, превращая тесты в инструмент для непрерывного контроля качества и производительности веб-приложений.