saschahemleb / laravel-prometheus-exporter
Laravel 的 Prometheus 导出器
Requires
- php: ^7.2.5 || ^8.0 || ^8.1
- guzzlehttp/guzzle: ^6.3 || ^7.0
- illuminate/routing: ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0
- illuminate/support: ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0
- promphp/prometheus_client_php: ^2.2.1
Requires (Dev)
- mockery/mockery: ^1.3.3
- nunomaduro/collision: ^6.1
- orchestra/testbench: ^4.0 || ^5.0 || ^6.0 || ^7.0
- phpunit/phpunit: ^8.0 || ^9.0
README
Laravel 的 Prometheus 导出器包。
简介
Prometheus 是一个具有用户界面和复杂查询语言(PromQL)的时间序列数据库,可以通过 HTTP 抓取指标、计数器、仪表和直方图。
此包是一个桥接器,将 promphp/prometheus_client_php 包装到 Laravel 中。
安装
通过 composer 安装此包
composer require saschahemleb/laravel-prometheus-exporter
有关如何在应用程序路由中启用指标的操作指南,请参阅以下内容。
配置
该包具有默认配置,使用以下环境变量。
PROMETHEUS_NAMESPACE=app
PROMETHEUS_METRICS_ROUTE_ENABLED=true
PROMETHEUS_METRICS_ROUTE_PATH=metrics
PROMETHEUS_COLLECT_FULL_SQL_QUERY=true
PROMETHEUS_STORAGE_ADAPTER=memory
PROMETHEUS_REDIS_CONNECTION=default
PROMETHEUS_REDIS_PREFIX=PROMETHEUS_
要自定义配置值,您可以覆盖上述环境变量(通常在应用程序的 .env
文件中完成),或者可以将包含的 prometheus.php 发布到 config/prometheus.php
。
$ php artisan vendor:publish --provider "Saschahemleb\\LaravelPrometheusExporter\\PrometheusServiceProvider"
指标
该包允许您观察以下指标:
- 应用程序路由。关于请求方法、请求路径和状态码的指标。
- SQL 查询。关于 SQL 查询和查询类型的指标。
为了在应用程序路由中观察指标(请求和响应之间的时间),您应该在应用程序的 app/Http/Kernel.php
中注册以下中间件:
protected $middleware = [ \Saschahemleb\LaravelPrometheusExporter\Http\Middleware\ObserveResponseTime::class, // [...] ];
导出的标签是
[ 'method', 'route', 'status_code', ]
SQL 指标是开箱即用的。导出的标签是
[ 'query', 'query_type', ]
注意:您可以通过禁用 PROMETHEUS_COLLECT_FULL_SQL_QUERY
的配置来禁用记录完整的查询。
存储适配器
存储适配器用于在请求之间持久化指标。默认情况下启用 memory
适配器,这意味着数据只会持久化到当前请求。
我们建议在生产环境中使用 redis
或 apc
适配器。当然,您的安装必须提供 Redis 或 APC 实现。
使用 PROMETHEUS_STORAGE_ADAPTER
环境变量指定存储适配器。
导出指标
该包添加了一个 /metrics
端点,默认启用,可暴露所有收集器收集的指标。
您可以使用 PROMETHEUS_METRICS_ROUTE_ENABLED
环境变量打开/关闭此功能,也可以使用 PROMETHEUS_METRICS_ROUTE_PATH
环境变量更改此功能。
收集器
收集器是一个类,实现了 CollectorInterface,负责收集一个或多个指标的指标。
请参阅以下 示例。
您可以通过将它们添加到 prometheus.php
配置中的 collectors
数组来自动加载您的收集器。
示例
收集器
这是一个收集器实现的示例
<?php declare(strict_types = 1); namespace Saschahemleb\LaravelPrometheusExporter; use Prometheus\Gauge;use Saschahemleb\LaravelPrometheusExporter\Contracts\CollectorInterface; class ExampleCollector implements CollectorInterface { /** * @var Gauge */ protected $usersRegisteredGauge; /** * Return the name of the collector. * * @return string */ public function getName() : string { return 'users'; } /** * Register all metrics associated with the collector. * * The metrics needs to be registered on the exporter object. * eg: * ```php * $exporter->registerCounter('search_requests_total', 'The total number of search requests.'); * ``` * * @param PrometheusExporter $exporter */ public function registerMetrics(PrometheusExporter $exporter) : void { $this->usersRegisteredGauge = $exporter->registerGauge( 'users_registered_total', 'The total number of registered users.', ['group'] ); } /** * Collect metrics data, if need be, before exporting. * * As an example, this may be used to perform time consuming database queries and set the value of a counter * or gauge. */ public function collect() : void { // retrieve the total number of staff users registered // eg: $totalUsers = Users::where('group', 'staff')->count(); $this->usersRegisteredGauge->set(36, ['staff']); // retrieve the total number of regular users registered // eg: $totalUsers = Users::where('group', 'regular')->count(); $this->usersRegisteredGauge->set(192, ['regular']); } }