В современной разработке критически важно отслеживать состояние всех компонентов приложения. Особенно это актуально для production-окружений, где каждая минута простоя может стоить денег и репутации. Сегодня я хочу рассказать о пакете Laravel Pulse — инструменте для комплексного мониторинга здоровья Laravel-приложений.

Laravel Pulse — это пакет для Laravel, который позволяет отслеживать состояние различных компонентов вашего приложения: базы данных, Redis, файловых хранилищ, Horizon, Node.js окружения и даже проверять безопасность зависимостей через Security Checker.

Пакет предоставляет:

  • ✅ Команды Artisan для проверки всех компонентов

  • ✅ REST API для получения данных о состоянии системы

  • ✅ Возможность сохранения результатов в базу данных

  • ✅ Интеграцию с системами мониторинга (Zabbix, Nagios и т.д.)

Установка и настройка

Установка через Composer

composer require adb/laravel-pulse

Публикация конфигурации

php artisan vendor:publish --tag=pulse

После публикации в проекте появится файл config/pulse.php со следующей структурой:

<?php use Adb\LaravelPulse\Enums\PulseEnum; return [ 'config' => [ PulseEnum::PROJECT => true, // PHP и Laravel версии PulseEnum::DB => true, // Подключения к БД PulseEnum::REDIS => true, // Redis соединения PulseEnum::NODE => false, // Node.js и npm PulseEnum::HORIZON => true, // Laravel Horizon PulseEnum::STORAGES => false, // Файловые хранилища PulseEnum::SECURITY => false, // Проверка безопасности пакетов ], 'api_token' => env('API_TOKEN'), 'routes' => [ 'prefix' => 'api/pulse', 'middleware' => ['api', 'pulse.auth.api'], 'as' => 'api.pulse.', ], 'connections_db' => [ 'mongodb' ], 'connections_redis' => [ 'default' ], 'discs' => array_filter(explode(',', env('DISCS_FOR_PULSE', '')), function($disk) { return !empty(trim($disk)); }), 'save_to_db' => false, ];

Настройка окружения

В файле .env добавьте:

# Токен для API доступа
API_TOKEN=your-secret-token-here

# Список дисков для проверки (через запятую)
DISCS_FOR_PULSE=local,input1,archive

Использование

Команда Artisan

Основной способ использования пакета — через команду pulse:info:

# Проверка всех включенных компонентов
php artisan pulse:info

# Проверка конкретного компонента
php artisan pulse:info project
php artisan pulse:info db
php artisan pulse:info redis
php artisan pulse:info horizon
php artisan pulse:info storages
php artisan pulse:info security
php artisan pulse:info node

Пример вывода

{
    "project": {
        "php": "8.3.30",
        "laravel": "10.48.0"
    },
    "db": {
        "mongodb": {
            "driver": "mongodb",
            "host": "localhost",
            "name": "mongodb",
            "db": "my_database",
            "success": true
        }
    },
    "redis": {
        "default": {
            "redis_name": "default",
            "redis_version": "7.4.2",
            "os": "Linux 6.10.14-linuxkit aarch64",
            "port": "6379",
            "host": "redis",
            "success": true
        }
    },
    "horizon": {
        "success": true
    }
}

Интеграция с системами мониторинга

Сохранение в файл для Zabbix

php artisan pulse:info > /tmp/pulse.json

Автоматизация через Task Scheduler

В файле app/Console/Kernel.php:

protected function schedule(Schedule $schedule)
{
    $schedule->command('pulse:info')
        ->everyThirtyMinutes()
        ->sendOutputTo('/tmp/pulse.json');
}

Или для более частых проверок:

$schedule->command('pulse:info')
    ->everyFiveMinutes()
    ->sendOutputTo('/tmp/pulse.json')
    ->emailOutputOnFailure('admin@example.com');

REST API

Пакет предоставляет REST API для получения последних данных о состоянии системы.

Настройка сохранения в БД

Для активации API необходимо включить сохранение результатов в базу данных:

// config/pulse.php
'save_to_db' => true,

Использование API

Endpoint: POST /api/pulse/pulse

Авторизация: Bearer Token

Заголовки:

Authorization: Bearer your-api-token-from-env
Content-Type: application/json

Пример запроса:

curl -X POST https://your-domain.com/api/pulse/pulse \
  -H "Authorization: Bearer your-api-token" \
  -H "Content-Type: application/json"

Ответ:

{
    "project": {
        "php": "8.3.30",
        "laravel": "10.48.0"
    },
    "db": {
        "mongodb": {
            "driver": "mongodb",
            "host": "localhost",
            "db": "my_database",
            "success": true
        }
    },
    "redis": {
        "default": {
            "redis_version": "7.4.2",
            "success": true
        }
    },
    "horizon": {
        "success": true
    },
    "created_at": "2025-02-04T14:27:56.000000Z",
    "updated_at": "2025-02-04T14:27:56.000000Z"
}

Компоненты мониторинга

1. Project (Проект)

Проверяет версии PHP и Laravel:

{
    "project": {
        "php": "8.3.30",
        "laravel": "10.48.0"
    }
}

2. Database (База данных)

Проверяет доступность и конфигурацию подключений к БД. Поддерживает любые драйверы Laravel (MySQL, PostgreSQL, MongoDB и т.д.):

{
    "db": {
        "mongodb": {
            "driver": "mongodb",
            "host": "localhost",
            "db": "database",
            "success": true
        },
        "mysql": {
            "driver": "mysql",
            "host": "127.0.0.1",
            "database": "laravel",
            "success": true
        }
    }
}

3. Redis

Проверяет подключения к Redis и получает информацию о версии:

{
    "redis": {
        "default": {
            "redis_name": "default",
            "redis_version": "7.4.2",
            "os": "Linux 6.10.14-linuxkit aarch64",
            "port": "6379",
            "host": "redis",
            "success": true
        }
    }
}

4. Horizon

Проверяет статус Laravel Horizon:

{
    "horizon": {
        "success": true
    }
}

5. Storages (Файловые хранилища)

Проверяет доступность настроенных дисков из config/filesystems.php:

{
    "storages": {
        "local": true,
        "input": true,
        "archive": true
    }
}

6. Node.js

Проверяет наличие и версии Node.js и npm:

{
    "node": {
        "node": {
            "version": "v20.11.0",
            "success": true
        },
        "npm": {
            "version": "10.2.4",
            "success": true
        }
    }
}

7. Security (Безопасность)

Проверяет уязвимости в зависимостях через Enlightn Security Checker:

{
    "security": {
        "erusev/parsedown": {
            "version": "1.7.1",
            "time": "2018-03-08T01:11:30+00:00",
            "advisories": [
                {
                    "title": "Class-Name Injection",
                    "link": "https://github.com/erusev/parsedown/issues/699",
                    "cve": "CVE-2019-10905"
                }
            ]
        }
    }
}

Архитектура пакета

Пакет построен на принципах SOLID и использует:

  • Dependency Injection — все зависимости инжектируются через конструкторы

  • Interface Segregation — используется PulseInterface для абстракции

  • Service Layer — бизнес-логика вынесена в сервисы

  • Enum для констант — все константы вынесены в PulseEnum

Структура классов

Adb\LaravelPulse\
├── Console\Commands\PulseCommand      # Artisan команда
├── Enums\PulseEnum                     # Константы компонентов
├── Exceptions\ApiException             # Кастомные исключения
├── Http\
│   ├── Controllers\Api\PulseController # API контроллер
│   └── Middleware\ApiAuth             # Middleware для авторизации
├── Models\LaravelPulse                 # Модель для хранения данных
├── Providers\ServiceProvider          # Service Provider
└── Services\
    ├── Pulse                           # Реализация проверок
    ├── PulseInterface                  # Интерфейс для проверок
    └── PulseService                    # Сервис-оркестратор

Конфигурация

// config/pulse.php для production
'config' => [
    PulseEnum::PROJECT => true,
    PulseEnum::DB => true,
    PulseEnum::REDIS => true,
    PulseEnum::HORIZON => true,
    PulseEnum::STORAGES => true,
    PulseEnum::SECURITY => true,  // Включаем проверку безопасности
    PulseEnum::NODE => true,
],
'save_to_db' => true,  // Сохраняем для API

Заключение

Laravel Pulse — это мощный инструмент для мониторинга состояния Laravel-приложений. Он позволяет:

  • ✅ Быстро диагностировать проблемы с компонентами системы

  • ✅ Интегрироваться с существующими системами мониторинга

  • ✅ Получать данные через удобный REST API

  • ✅ Автоматизировать проверки через Task Scheduler

  • ✅ Отслеживать безопасность зависимостей

Пакет активно развивается и поддерживается. Исходный код доступен на GitFlic.

Если у вас есть вопросы или предложения по улучшению пакета — создавайте issues в репозитории. Буду рад обратной связи!