1
0
mirror of https://github.com/Seldaek/monolog.git synced 2025-08-10 07:06:40 +02:00

Merge remote-tracking branch 'flowpl/add_newrelic_name_transaction'

This commit is contained in:
Jordi Boggiano
2014-12-29 19:24:06 +00:00
2 changed files with 81 additions and 4 deletions

View File

@@ -27,6 +27,13 @@ class NewRelicHandler extends AbstractProcessingHandler
*/ */
protected $appName; 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 * 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? * (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} * {@inheritDoc}
* *
* @param string $appName * @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); parent::__construct($level, $bubble);
$this->appName = $appName; $this->appName = $appName;
$this->explodeArrays = $explodeArrays; $this->explodeArrays = $explodeArrays;
$this->transactionName = $transactionName;
} }
/** /**
@@ -62,6 +76,11 @@ class NewRelicHandler extends AbstractProcessingHandler
$this->setNewRelicAppName($appName); $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) { if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) {
newrelic_notice_error($record['message'], $record['context']['exception']); newrelic_notice_error($record['message'], $record['context']['exception']);
unset($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 * 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 * @param array $context
* @return null|string * @return null|string
@@ -116,6 +135,23 @@ class NewRelicHandler extends AbstractProcessingHandler
return $this->appName; 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. * Sets the NewRelic application that should receive this log.
* *
@@ -125,4 +161,14 @@ class NewRelicHandler extends AbstractProcessingHandler
{ {
newrelic_set_appname($appName); newrelic_set_appname($appName);
} }
/**
* Overwrites the name of the current transaction
*
* @param $transactionName
*/
protected function setNewRelicTransactionName($transactionName)
{
newrelic_name_transaction($transactionName);
}
} }

View File

@@ -18,11 +18,13 @@ class NewRelicHandlerTest extends TestCase
{ {
public static $appname; public static $appname;
public static $customParameters; public static $customParameters;
public static $transactionName;
public function setUp() public function setUp()
{ {
self::$appname = null; self::$appname = null;
self::$customParameters = array(); self::$customParameters = array();
self::$transactionName = null;
} }
/** /**
@@ -125,6 +127,30 @@ class NewRelicHandlerTest extends TestCase
$this->assertEquals('logAppName', self::$appname); $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 class StubNewRelicHandlerWithoutExtension extends NewRelicHandler
@@ -153,6 +179,11 @@ function newrelic_set_appname($appname)
return NewRelicHandlerTest::$appname = $appname; return NewRelicHandlerTest::$appname = $appname;
} }
function newrelic_name_transaction($transactionName)
{
return NewRelicHandlerTest::$transactionName = $transactionName;
}
function newrelic_add_custom_parameter($key, $value) function newrelic_add_custom_parameter($key, $value)
{ {
NewRelicHandlerTest::$customParameters[$key] = $value; NewRelicHandlerTest::$customParameters[$key] = $value;