瀏覽代碼

Add LoadAverageProcessor (#1803)

Co-authored-by: johan Vlaar <johan@adivare.nl>
Co-authored-by: Jordi Boggiano <j.boggiano@seld.be>
Johan Vlaar 2 年之前
父節點
當前提交
dc4bc7e660

+ 1 - 0
doc/02-handlers-formatters-processors.md

@@ -160,6 +160,7 @@
 ## Processors
 
 - [_PsrLogMessageProcessor_](https://github.com/Seldaek/monolog/blob/main/src/Monolog/Processor/PsrLogMessageProcessor.php): Processes a log record's message according to PSR-3 rules, replacing `{foo}` with the value from `$context['foo']`.
+- [_LoadAverageProcessor_](https://github.com/Seldaek/monolog/blob/main/src/Monolog/Processor/LoadAverageProcessor.php): Adds the current system load average to a log record.
 - [_ClosureContextProcessor_](https://github.com/Seldaek/monolog/blob/main/src/Monolog/Processor/ClosureContextProcessor.php): Allows delaying the creation of context data by setting a Closure in context which is called when the log record is used
 - [_IntrospectionProcessor_](https://github.com/Seldaek/monolog/blob/main/src/Monolog/Processor/IntrospectionProcessor.php): Adds the line/file/class/method from which the log call originated.
 - [_WebProcessor_](https://github.com/Seldaek/monolog/blob/main/src/Monolog/Processor/WebProcessor.php): Adds the current request URI, request method and client IP to a log record.

+ 66 - 0
src/Monolog/Processor/LoadAverageProcessor.php

@@ -0,0 +1,66 @@
+<?php declare(strict_types=1);
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+use Monolog\LogRecord;
+
+/**
+ * Injects sys_getloadavg in all records @see https://www.php.net/manual/en/function.sys-getloadavg.php
+ *
+ * @author Johan Vlaar <johan.vlaar.1994@gmail.com>
+ */
+class LoadAverageProcessor implements ProcessorInterface
+{
+    public const LOAD_1_MINUTE = 0;
+    public const LOAD_5_MINUTE = 1;
+    public const LOAD_15_MINUTE = 2;
+
+    private const AVAILABLE_LOAD = [
+        self::LOAD_1_MINUTE,
+        self::LOAD_5_MINUTE,
+        self::LOAD_15_MINUTE,
+    ];
+
+    /**
+     * @var int
+     */
+    protected $avgSystemLoad;
+
+    /**
+     * @param self::LOAD_* $avgSystemLoad
+     */
+    public function __construct(int $avgSystemLoad = self::LOAD_1_MINUTE)
+    {
+        if (!in_array($avgSystemLoad, self::AVAILABLE_LOAD, true)) {
+            throw new \InvalidArgumentException(sprintf('Invalid average system load: `%s`', $avgSystemLoad));
+        }
+        $this->avgSystemLoad = $avgSystemLoad;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __invoke(LogRecord $record): LogRecord
+    {
+        if (!function_exists('sys_getloadavg')) {
+            return $record;
+        }
+        $usage = sys_getloadavg();
+        if (false === $usage) {
+            return $record;
+        }
+
+        $record->extra['load_average'] = $usage[$this->avgSystemLoad];
+
+        return $record;
+    }
+}

+ 38 - 0
tests/Monolog/Processor/LoadAverageProcessorTest.php

@@ -0,0 +1,38 @@
+<?php declare(strict_types=1);
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+use Monolog\Test\TestCase;
+
+class LoadAverageProcessorTest extends TestCase
+{
+    /**
+     * @covers Monolog\Processor\LoadAverageProcessor::__invoke
+     */
+    public function testProcessor()
+    {
+        $processor = new LoadAverageProcessor();
+        $record = $processor($this->getRecord());
+        $this->assertArrayHasKey('load_average', $record->extra);
+        $this->assertIsFloat($record->extra['load_average']);
+    }
+
+    /**
+     * @covers Monolog\Processor\LoadAverageProcessor::__invoke
+     */
+    public function testProcessorWithInvalidAvgSystemLoad()
+    {
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Invalid average system load: `3`');
+        new LoadAverageProcessor(3);
+    }
+}