aranyasen / laravel-prometheus-exporter
A prometheus exporter for Laravel
Installs: 7 754
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: >=8.1
- illuminate/routing: ^10.0|^11.0
- illuminate/support: ^10.0|^11.0
- promphp/prometheus_client_php: ^2
Requires (Dev)
- mockery/mockery: ^1.4
- phpunit/phpunit: ^9
README
A prometheus exporter for Laravel.
Installation
composer require aranyasen/laravel-prometheus-exporter
Register the service provider in app.php
'providers' => [ // ... Aranyasen\LaravelPrometheusExporter\PrometheusServiceProvider::class, ]
Register the facade in app.php
'aliases' => [ // ... 'Prometheus' => Aranyasen\LaravelPrometheusExporter\PrometheusFacade::class, ]
Configuration
The package has a default configuration which uses the following environment variables.
PROMETHEUS_NAMESPACE=app
PROMETHEUS_METRICS_ROUTE_ENABLED=true
PROMETHEUS_METRICS_ROUTE_PATH=metrics
PROMETHEUS_METRICS_ROUTE_MIDDLEWARE=null
PROMETHEUS_STORAGE_ADAPTER=redis
REDIS_HOST=localhost
REDIS_PORT=6379
PROMETHEUS_REDIS_PREFIX=PROMETHEUS_
To customize the configuration file, publish the package configuration using Artisan.
php artisan vendor:publish --provider="Aranyasen\LaravelPrometheusExporter\PrometheusServiceProvider"
You can then edit the generated config at app/config/prometheus.php
.
Storage Adapters
The storage adapter is used to persist metrics across requests.
The PROMETHEUS_STORAGE_ADAPTER
env var is used to specify the storage adapter.
The memory
adapter lets data persist only across the current request. For production, redis
or apc
are recommended.
If redis
is used, the REDIS_HOST
and REDIS_PORT
vars also need to be configured.
Exporting Metrics
The package adds a /metrics
end-point, enabled by default, which exposes all metrics gathered by collectors.
This can be turned on/off using the PROMETHEUS_METRICS_ROUTE_ENABLED
var, and can also be changed using the
PROMETHEUS_METRICS_ROUTE_PATH
var.
If you would like to protect this end-point, you can write any custom middleware and enable it using
PROMETHEUS_METRICS_ROUTE_MIDDLEWARE
. Multiple middleware can be supplied as comma-separated values, e.g. PROMETHEUS_METRICS_ROUTE_MIDDLEWARE=auth.basic,superadmin
Collectors
A collector is a class, implementing the CollectorInterface, which is responsible for collecting data for one or many metrics.
Please see the ExampleCollector included in this repository.
You can auto-load your collectors by adding them to the collectors
array in the prometheus.php config.
Usage
// retrieve the exporter $exporter = app(\Aranyasen\LaravelPrometheusExporter::class); // or $exporter = app('prometheus'); // or $exporter = Prometheus::getFacadeRoot(); // register a new collector $collector = new \My\New\Collector(); $exporter->registerCollector($collector); // retrieve all collectors var_dump($exporter->getCollectors()); // retrieve a collector by name $collector = $exporter->getCollector('user'); // export all metrics // this is called automatically when the /metrics end-point is hit var_dump($exporter->export()); // the following methods can be used to create and interact with counters, gauges and histograms directly // these methods will typically be called by collectors, but can be used to register any custom metrics directly, // without the need of a collector // create a counter $counter = $exporter->registerCounter('search_requests_total', 'The total number of search requests.'); $counter->inc(); // increment by 1 $counter->incBy(2); // create a counter (with labels) $counter = $exporter->registerCounter('search_requests_total', 'The total number of search requests.', ['request_type']); $counter->inc(['GET']); // increment by 1 $counter->incBy(2, ['GET']); // retrieve a counter $counter = $exporter->getCounter('search_requests_total'); // create a gauge $gauge = $exporter->registerGauge('users_online_total', 'The total number of users online.'); $gauge->inc(); // increment by 1 $gauge->incBy(2); $gauge->dec(); // decrement by 1 $gauge->decBy(2); $gauge->set(36); // create a gauge (with labels) $gauge = $exporter->registerGauge('users_online_total', 'The total number of users online.', ['group']); $gauge->inc(['staff']); // increment by 1 $gauge->incBy(2, ['staff']); $gauge->dec(['staff']); // decrement by 1 $gauge->decBy(2, ['staff']); $gauge->set(36, ['staff']); // retrieve a gauge $counter = $exporter->getGauge('users_online_total'); // create a histogram $histogram = $exporter->registerHistogram( 'response_time_seconds', 'The response time of a request.', [], [0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0] ); // the buckets must be in asc order // if buckets aren't specified, the default 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0 buckets will be used $histogram->observe(5.0); // create a histogram (with labels) $histogram = $exporter->registerHistogram( 'response_time_seconds', 'The response time of a request.', ['request_type'], [0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0] ); // the buckets must be in asc order // if buckets aren't specified, the default 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0 buckets will be used $histogram->observe(5.0, ['GET']); // retrieve a histogram $counter = $exporter->getHistogram('response_time_seconds');