Просмотр исходного кода

Merge remote-tracking branch 'flowpl/add_newrelic_name_transaction'

Jordi Boggiano 11 лет назад
Родитель
Сommit
dcfae95e6b

+ 50 - 4
src/Monolog/Handler/NewRelicHandler.php

@@ -27,6 +27,13 @@ class NewRelicHandler extends AbstractProcessingHandler
      */
     protected $appName;
 
+    /**
+     * Name of the current transaction
+     *
+     * @var string
+     */
+    protected $transactionName;
+
     /**
      * Some context and extra data is passed into the handler as arrays of values. Do we send them as is
      * (useful if we are using the API), or explode them for display on the NewRelic RPM website?
@@ -39,14 +46,21 @@ class NewRelicHandler extends AbstractProcessingHandler
      * {@inheritDoc}
      *
      * @param string  $appName
-     * @param boolean $implodeArrays
+     * @param boolean $explodeArrays
+     * @param string  $transactionName
      */
-    public function __construct($level = Logger::ERROR, $bubble = true, $appName = null, $explodeArrays = false)
-    {
+    public function __construct(
+        $level = Logger::ERROR,
+        $bubble = true,
+        $appName = null,
+        $explodeArrays = false,
+        $transactionName = null
+    ) {
         parent::__construct($level, $bubble);
 
         $this->appName       = $appName;
         $this->explodeArrays = $explodeArrays;
+        $this->transactionName = $transactionName;
     }
 
     /**
@@ -62,6 +76,11 @@ class NewRelicHandler extends AbstractProcessingHandler
             $this->setNewRelicAppName($appName);
         }
 
+        if ($transactionName = $this->getTransactionName($record['context'])) {
+            $this->setNewRelicTransactionName($transactionName);
+            unset($record['context']['transaction_name']);
+        }
+
         if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) {
             newrelic_notice_error($record['message'], $record['context']['exception']);
             unset($record['context']['exception']);
@@ -102,7 +121,7 @@ class NewRelicHandler extends AbstractProcessingHandler
 
     /**
      * Returns the appname where this log should be sent. Each log can override the default appname, set in this
-     * handler's constructor, by providing the appname in its context.
+     * handler's constructor, by providing the appname in it's context.
      *
      * @param  array       $context
      * @return null|string
@@ -116,6 +135,23 @@ class NewRelicHandler extends AbstractProcessingHandler
         return $this->appName;
     }
 
+    /**
+     * Returns the name of the current transaction. Each log can override the default transaction name, set in this
+     * handler's constructor, by providing the transaction_name in it's context
+     *
+     * @param array $context
+     *
+     * @return null|string
+     */
+    protected function getTransactionName(array $context)
+    {
+        if (isset($context['transaction_name'])) {
+            return $context['transaction_name'];
+        }
+
+        return $this->transactionName;
+    }
+
     /**
      * Sets the NewRelic application that should receive this log.
      *
@@ -125,4 +161,14 @@ class NewRelicHandler extends AbstractProcessingHandler
     {
         newrelic_set_appname($appName);
     }
+
+    /**
+     * Overwrites the name of the current transaction
+     *
+     * @param $transactionName
+     */
+    protected function setNewRelicTransactionName($transactionName)
+    {
+        newrelic_name_transaction($transactionName);
+    }
 }

+ 31 - 0
tests/Monolog/Handler/NewRelicHandlerTest.php

@@ -18,11 +18,13 @@ class NewRelicHandlerTest extends TestCase
 {
     public static $appname;
     public static $customParameters;
+    public static $transactionName;
 
     public function setUp()
     {
         self::$appname = null;
         self::$customParameters = array();
+        self::$transactionName = null;
     }
 
     /**
@@ -125,6 +127,30 @@ class NewRelicHandlerTest extends TestCase
 
         $this->assertEquals('logAppName', self::$appname);
     }
+
+    public function testTheTransactionNameIsNullByDefault()
+    {
+        $handler = new StubNewRelicHandler();
+        $handler->handle($this->getRecord(Logger::ERROR, 'log message'));
+
+        $this->assertEquals(null, self::$transactionName);
+    }
+
+    public function testTheTransactionNameCanBeInjectedFromtheConstructor()
+    {
+        $handler = new StubNewRelicHandler(Logger::DEBUG, false, null, false, 'myTransaction');
+        $handler->handle($this->getRecord(Logger::ERROR, 'log message'));
+
+        $this->assertEquals('myTransaction', self::$transactionName);
+    }
+
+    public function testTheTransactionNameCanBeOverriddenFromEachLog()
+    {
+        $handler = new StubNewRelicHandler(Logger::DEBUG, false, null, false, 'myTransaction');
+        $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('transaction_name' => 'logTransactName')));
+
+        $this->assertEquals('logTransactName', self::$transactionName);
+    }
 }
 
 class StubNewRelicHandlerWithoutExtension extends NewRelicHandler
@@ -153,6 +179,11 @@ function newrelic_set_appname($appname)
     return NewRelicHandlerTest::$appname = $appname;
 }
 
+function newrelic_name_transaction($transactionName)
+{
+    return NewRelicHandlerTest::$transactionName = $transactionName;
+}
+
 function newrelic_add_custom_parameter($key, $value)
 {
     NewRelicHandlerTest::$customParameters[$key] = $value;