fjogeleit/prometheus-messenger-middleware

Symfony Messenger 组件的 Prometheus 中间件

v0.9.1 2023-12-19 13:55 UTC

README

CodeStyle

一个简单的中间件,用于通过两个 Prometheus 计数器指标监控您的 Symfony Messenger 组件。

  • 执行消息总数计数器
  • 失败消息计数器

依赖项

  • PHP >= 7.2.5
  • promphp/prometheus_client_php
  • symfony/messenger

安装

composer require fjogeleit/prometheus-messenger-middleware

使用方法

将此中间件配置到您的 MessageBus

Symfony 基本示例

注册您的服务

services:
    Prometheus\Storage\InMemory: ~
    Prometheus\CollectorRegistry: ['@Prometheus\Storage\InMemory']

    PrometheusMiddleware\PrometheusMiddleware: ~

配置中间件

framework:
    messenger:
        buses:
            message.bus.commands:
                middleware:
                    - 'PrometheusMiddleware\PrometheusMiddleware'

默认标签 "message" 作为完全限定的 MessageName,"label" 作为 Message ClassName 生成示例计数器响应

# HELP message_bus_commands_messenger Executed Messages
# TYPE message_bus_commands_messenger counter
message_bus_commands_messenger{message="PrometheusMiddleware\\\\Tests\\\\Example\\\\FooMessage",label="FooMessage"} 2
message_bus_commands_messenger{message="PrometheusMiddleware\\\\Tests\\\\Example\\\\FooMessage",label="BarMessage"} 1

高级使用

您还可以配置自己的标签并提供相关值

作为附加服务参数配置自己的标签

services:
    ...

    PrometheusMiddleware\PrometheusMiddleware:
      arguments:
        $labels: ['message', 'label','value']
        

创建一个 LabelValueProvider

通过实现 LabelValueProviderInterface 创建您自己的 LabelValueProvider

<?php

declare(strict_types=1);

namespace PrometheusMiddleware\Tests\Example\LabelValueProvider;

use PrometheusMiddleware\LabelValueProviderInterface;
use PrometheusMiddleware\Tests\Example\FooMessage;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\StackInterface;

class FooLabelValueProvider implements LabelValueProviderInterface
{
    public function __invoke(Envelope $envelope, StackInterface $stack): array
    {
        /** @var FooMessage $message */
        $message = $envelope->getMessage();

        return [
            \get_class($message),
            substr(strrchr(get_class($message), '\\'), 1),
            $message->getBar()
        ];
    }
}

将您的新 LabelValueProvider 添加到您的服务配置中

services:
    ...
    PrometheusMiddleware\Tests\Example\FooLabelValueProvider: ~

    PrometheusMiddleware\PrometheusMiddleware:
      arguments:
        $labels: ['message', 'label','value']
        $labelValueProvider: '@PrometheusMiddleware\Tests\Example\FooLabelValueProvider'

您还可以使用 ErrorLabelValueProviderInterface 为 ErrorCounter 提供自定义标签

<?php

declare(strict_types=1);

namespace PrometheusMiddleware\Tests\Example\LabelValueProvider;

use PrometheusMiddleware\ErrorLabelValueProviderInterface;
use PrometheusMiddleware\Tests\Example\FooMessage;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\StackInterface;

class FooExceptionLabelValueProvider implements ErrorLabelValueProviderInterface
{
    public function __invoke(Envelope $envelope, StackInterface $stack, \Throwable $exception): array
    {
        /** @var FooMessage $message */
        $message = $envelope->getMessage();

        return [
            \get_class($message),
            substr(strrchr(get_class($message), '\\'), 1),
            $exception->getMessage()
        ];
    }
}

以及更新的服务配置

services:
    ...
    PrometheusMiddleware\Tests\Example\FooExceptionLabelValueProvider: ~

    PrometheusMiddleware\PrometheusMiddleware:
      arguments:
        $errorLabels: ['message', 'label','value']
        $errorLabelValueProvider: '@PrometheusMiddleware\Tests\Example\LabelValueProvider'

完整的 PrometheusMiddleware API