saschahemleb/laravel-prometheus-exporter

Laravel 的 Prometheus 导出器

v2.0.1 2024-09-24 08:19 UTC

This package is auto-updated.

Last update: 2024-09-24 08:21:24 UTC


README

Laravel 的 Prometheus 导出器包。

Software License

简介

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 适配器,这意味着数据只会持久化到当前请求。

我们建议在生产环境中使用 redisapc 适配器。当然,您的安装必须提供 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']);
    }
}