Prometheus интеграция

Для интеграции Puppeteer с Prometheus важно сначала подготовить окружение. Puppeteer устанавливается через npm:

npm install puppeteer

Также понадобится библиотека для экспорта метрик в Prometheus, например prom-client:

npm install prom-client

После установки создаётся базовая структура проекта: файл для сценариев тестирования и отдельный модуль для метрик. Основной подход заключается в том, чтобы каждая ключевая операция Puppeteer была обёрнута в сбор метрик.


Создание метрик Prometheus

Prometheus работает с тремя основными типами метрик: Counter, Gauge, Histogram. В тестировании с Puppeteer чаще всего используются:

  • Counter — считает количество выполненных действий или ошибок;
  • Gauge — измеряет текущие значения, например, количество активных браузеров;
  • Histogram — измеряет распределение времени выполнения операций.

Пример инициализации метрик:

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

Для измерения метрик важно оборачивать ключевые операции 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

Для того чтобы 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, которая автоматически:

  • запускает браузер и отслеживает количество экземпляров;
  • замеряет время загрузки страниц и действий;
  • фиксирует ошибки;
  • обновляет метрики Prometheus.

Пример структуры обёртки:

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');
});

Интеграция с CI/CD

Метрики Prometheus, собираемые Puppeteer, идеально подходят для мониторинга в пайплайнах CI/CD:

  • Сбор статистики времени загрузки страниц после деплоя;
  • Анализ частоты ошибок тестов при изменении кода;
  • Выявление узких мест и медленных сценариев.

Метрики можно визуализировать через Grafana, создавая дашборды с историей тестов и нагрузкой на браузерные инстансы.


Эта структура позволяет объединить автоматизированное тестирование Puppeteer и систему мониторинга Prometheus, превращая тесты в инструмент для непрерывного контроля качества и производительности веб-приложений.