Explorar o código

HipChatHandler: combine batch records and send as one

pkraeutli %!s(int64=12) %!d(string=hai) anos
pai
achega
f1af2c484a

+ 66 - 0
src/Monolog/Handler/HipChatHandler.php

@@ -150,4 +150,70 @@ class HipChatHandler extends SocketHandler
         $this->closeSocket();
     }
 
+    /**
+     * {@inheritdoc}
+     */
+    public function handleBatch(array $records)
+    {
+        if (count($records) == 0) {
+            return true;
+        }
+
+        $batchRecord = $this->combineRecords($records);
+
+        if (!$this->isHandling($batchRecord)) {
+            return false;
+        }
+
+        $this->write($batchRecord);
+
+        return false === $this->bubble;
+    }
+
+    /**
+     * Combines multiple records into one. Error level of the combined record
+     * will be the highest level from the given records. Datetime will be taken
+     * from the first record.
+     *
+     * @param $records
+     * @return array
+     */
+    private function combineRecords($records)
+    {
+        $messages = array();
+        $formattedMessages = array();
+        $level = 0;
+        $levelName = null;
+        $datetime = null;
+
+        foreach ($records as $record) {
+
+            $record = $this->processRecord($record);
+            $record['formatted'] = $this->getFormatter()->format($record);
+
+            $messages[] = $record['message'];
+            $formattedMessages[] = $record['formatted'];
+
+            if ($record['level'] > $level) {
+                $level = $record['level'];
+                $levelName = $record['level_name'];
+            }
+
+            if (null == $datetime) {
+                $datetime = $record['datetime'];
+            }
+        }
+
+        $batchRecord = array(
+            'message' => implode(PHP_EOL, $messages),
+            'formatted' => implode('', $formattedMessages),
+            'level' => $level,
+            'level_name' => $levelName,
+            'datetime' => $datetime,
+            'context' => array(),
+            'extra' => array(),
+        );
+
+        return $batchRecord;
+    }
 }

+ 49 - 0
tests/Monolog/Handler/HipChatHandlerTest.php

@@ -81,6 +81,55 @@ class HipChatHandlerTest extends TestCase
         );
     }
 
+    /**
+     * @dataProvider provideBatchRecords
+     */
+    public function testHandleBatch($records, $expectedColor)
+    {
+        $this->createHandler();
+
+        $this->handler->handleBatch($records);
+
+        fseek($this->res, 0);
+        $content = fread($this->res, 1024);
+
+        $this->assertRegexp('/color='.$expectedColor.'/', $content);
+    }
+
+    public function provideBatchRecords()
+    {
+        return array(
+            array(
+                array(
+                    array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \DateTime()),
+                    array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()),
+                    array('level' => Logger::CRITICAL, 'message' => 'Everything is broken!', 'level_name' => 'critical', 'datetime' => new \DateTime())
+                ),
+                'red',
+            ),
+            array(
+                array(
+                    array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \DateTime()),
+                    array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()),
+                ),
+                'yellow',
+            ),
+            array(
+                array(
+                    array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \DateTime()),
+                    array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()),
+                ),
+                'green',
+            ),
+            array(
+                array(
+                    array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \DateTime()),
+                ),
+                'gray',
+            ),
+        );
+    }
+
     private function createHandler($token = 'myToken', $room = 'room1', $name = 'Monolog', $notify = false)
     {
         $constructorArgs = array($token, $room, $name, $notify, Logger::DEBUG);