Laravel Pulse: мониторинг здоровья вашего Laravel-приложения

в 14:16, , рубрики: laravel, мониторинг проекта, мониторинг сервера

В современной разработке критически важно отслеживать состояние всех компонентов приложения. Особенно это актуально для 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 AdbLaravelPulseEnumsPulseEnum;

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

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

AdbLaravelPulse
├── ConsoleCommandsPulseCommand      # Artisan команда
├── EnumsPulseEnum                     # Константы компонентов
├── ExceptionsApiException             # Кастомные исключения
├── Http
│   ├── ControllersApiPulseController # API контроллер
│   └── MiddlewareApiAuth             # Middleware для авторизации
├── ModelsLaravelPulse                 # Модель для хранения данных
├── ProvidersServiceProvider          # 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 в репозитории. Буду рад обратной связи!


Автор: adb13

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js