diff --git a/src/Monolog/Handler/NewRelicHandler.php b/src/Monolog/Handler/NewRelicHandler.php index 865e4029..a79f9557 100644 --- a/src/Monolog/Handler/NewRelicHandler.php +++ b/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? @@ -41,12 +48,18 @@ class NewRelicHandler extends AbstractProcessingHandler * @param string $appName * @param boolean $implodeArrays */ - 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 +75,10 @@ class NewRelicHandler extends AbstractProcessingHandler $this->setNewRelicAppName($appName); } + if ($transactionName = $this->getTransactionName($record['context'])) { + $this->setNewRelicTransactionName($transactionName); + } + if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) { newrelic_notice_error($record['message'], $record['context']['exception']); unset($record['context']['exception']); @@ -69,6 +86,11 @@ class NewRelicHandler extends AbstractProcessingHandler newrelic_notice_error($record['message']); } + if (isset($record['context']['transaction_name'])) { + newrelic_name_transaction($record['context']['transaction_name']); + unset($record['context']['transaction_name']); + } + foreach ($record['context'] as $key => $parameter) { if (is_array($parameter) && $this->explodeArrays) { foreach ($parameter as $paramKey => $paramValue) { @@ -116,6 +138,15 @@ class NewRelicHandler extends AbstractProcessingHandler return $this->appName; } + 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 +156,9 @@ class NewRelicHandler extends AbstractProcessingHandler { newrelic_set_appname($appName); } + + protected function setNewRelicTransactionName($transactionName) + { + newrelic_name_transaction($transactionName); + } } diff --git a/tests/Monolog/Handler/NewRelicHandlerTest.php b/tests/Monolog/Handler/NewRelicHandlerTest.php index 4ff81f38..22014908 100644 --- a/tests/Monolog/Handler/NewRelicHandlerTest.php +++ b/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;