bushlanov-dev/laravel-prometheus-exporter

Laravel and Lumen prometheus exporter

0.3.0 2024-12-10 19:03 UTC

This package is auto-updated.

Last update: 2025-01-10 19:21:04 UTC


README

Packagist Version PHP Version Laravel Version Lumen Version Software License

A prometheus exporter for the Laravel and the Lumen.

This package is a wrapper bridging promphp/prometheus_client_php

Installation

composer require bushlanov-dev/laravel-prometheus-exporter

Laravel

Laravel 11+ register the service provider in bootstrap/providers.php:

return [
    // ...
    BushlanovDev\LaravelPrometheusExporter\Providers\PrometheusServiceProvider::class,
];

Old versions of laravel register the service provider in config/app.php:

'providers' => [
    // ...
    BushlanovDev\LaravelPrometheusExporter\Providers\PrometheusServiceProvider::class,
];

Laravel 11+ register the middleware in bootstrap/app.php:

// ...
->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'prometheus' => BushlanovDev\LaravelPrometheusExporter\Middleware\PrometheusLaravelMiddleware::class,
    ]);
})

Old versions of laravel register the middleware in app/Http/Kernel.php:

protected $routeMiddleware = [
    // ...
    'prometheus' => BushlanovDev\LaravelPrometheusExporter\Middleware\PrometheusLaravelMiddleware::class,
];

Register metrics route routes/web.php:

Route::get('metrics', [BushlanovDev\LaravelPrometheusExporter\Controllers\LaravelMetricsController::class, 'metrics']);

Add middleware to routes. It is advisable to give names to all routes:

Route::get('/', function () {
// ...
})->middleware('prometheus')->name('route_name');

Lumen

Register the service provider and middleware in bootstrap/app.php:

$app->register(BushlanovDev\LaravelPrometheusExporter\Providers\PrometheusServiceProvider::class);
$app->routeMiddleware([
    'prometheus' => BushlanovDev\LaravelPrometheusExporter\Middleware\PrometheusLumenMiddleware::class,
]);

Register metrics route:

$app->router->group(['namespace' => '\BushlanovDev\LaravelPrometheusExporter\Controllers'], function ($router) {
    $router->get('metrics', ['as' => 'metrics', 'uses'=> 'LumenMetricsController' . '@metrics']);
});

Add middleware to routes. It is advisable to give names to all routes:

$router->get('/', ['middleware' => 'prometheus', 'as' => 'route_name', function () use ($router) {/*...*/}]);

Guzzle metrics

To observe Guzzle metrics, you should register the following provider:

BushlanovDev\LaravelPrometheusExporter\Providers\GuzzleServiceProvider::class

And register the middleware for Http facade or Guzzle client:

Http::globalMiddleware(function ($handler) {
    return $this->app['prometheus.guzzle.middleware']($handler);
});

$this->app->alias('prometheus.guzzle.client', Client::class);

Configuration

The package has a default configuration which uses the following environment variables.

PROMETHEUS_NAMESPACE=app
PROMETHEUS_STORAGE_ADAPTER=redis
PROMETHEUS_REDIS_HOST=localhost
PROMETHEUS_REDIS_PORT=6379
PROMETHEUS_REDIS_DATABASE=0
PROMETHEUS_REDIS_TIMEOUT=0.1
PROMETHEUS_REDIS_READ_TIMEOUT=10
PROMETHEUS_REDIS_PERSISTENT_CONNECTIONS=0
PROMETHEUS_REDIS_PREFIX=PROMETHEUS_

To customize the configuration file, publish the package configuration using Artisan:

php artisan vendor:publish --provider="BushlanovDev\LaravelPrometheusExporter\Providers\PrometheusServiceProvider"

Protect metrics endpoint

If you need to prevent others from accessing your /metrics routes, you can enable the corresponding setting. Currently, only basic_auth is supported to secure your metrics endpoint.

PROMETHEUS_ROUTE_AUTH_ENABLED=true
PROMETHEUS_ROUTE_AUTH_USERNAME=username
PROMETHEUS_ROUTE_AUTH_PASSWORD=password