From bc2d882967453536dd128f005f4a123cb6b10586 Mon Sep 17 00:00:00 2001 From: Mark Garrett Date: Tue, 30 Sep 2014 16:42:07 -0500 Subject: [PATCH] Account for context and extra params that are sent as arrays (GitProcessor for one). New __construct param is optional and set to false to emulate current feature set. --- src/Monolog/Handler/NewRelicHandler.php | 34 +++++++++++++++---- tests/Monolog/Handler/NewRelicHandlerTest.php | 28 +++++++++++++++ 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/Monolog/Handler/NewRelicHandler.php b/src/Monolog/Handler/NewRelicHandler.php index 052c407a..865e4029 100644 --- a/src/Monolog/Handler/NewRelicHandler.php +++ b/src/Monolog/Handler/NewRelicHandler.php @@ -16,7 +16,7 @@ use Monolog\Logger; /** * Class to record a log on a NewRelic application * - * @see https://newrelic.com/docs/php/new-relic-for-php + * @see https://docs.newrelic.com/docs/agents/php-agent */ class NewRelicHandler extends AbstractProcessingHandler { @@ -27,16 +27,26 @@ class NewRelicHandler extends AbstractProcessingHandler */ protected $appName; + /** + * 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? + * + * @var boolean + */ + protected $explodeArrays; + /** * {@inheritDoc} * - * @param string $appName + * @param string $appName + * @param boolean $implodeArrays */ - public function __construct($level = Logger::ERROR, $bubble = true, $appName = null) + public function __construct($level = Logger::ERROR, $bubble = true, $appName = null, $explodeArrays = false) { parent::__construct($level, $bubble); - $this->appName = $appName; + $this->appName = $appName; + $this->explodeArrays = $explodeArrays; } /** @@ -60,11 +70,23 @@ class NewRelicHandler extends AbstractProcessingHandler } foreach ($record['context'] as $key => $parameter) { - newrelic_add_custom_parameter('context_' . $key, $parameter); + if (is_array($parameter) && $this->explodeArrays) { + foreach ($parameter as $paramKey => $paramValue) { + newrelic_add_custom_parameter('context_' . $key . '_' . $paramKey, $paramValue); + } + } else { + newrelic_add_custom_parameter('context_' . $key, $parameter); + } } foreach ($record['extra'] as $key => $parameter) { - newrelic_add_custom_parameter('extra_' . $key, $parameter); + if (is_array($parameter) && $this->explodeArrays) { + foreach ($parameter as $paramKey => $paramValue) { + newrelic_add_custom_parameter('extra_' . $key . '_' . $paramKey, $paramValue); + } + } else { + newrelic_add_custom_parameter('extra_' . $key, $parameter); + } } } diff --git a/tests/Monolog/Handler/NewRelicHandlerTest.php b/tests/Monolog/Handler/NewRelicHandlerTest.php index 3f3c07e2..1b854b66 100644 --- a/tests/Monolog/Handler/NewRelicHandlerTest.php +++ b/tests/Monolog/Handler/NewRelicHandlerTest.php @@ -48,6 +48,20 @@ class NewRelicHandlerTest extends TestCase $this->assertEquals(array('context_a' => 'b'), self::$customParameters); } + public function testThehandlerCanAddExplodedContextParamsToTheNewRelicTrace() + { + $handler = new StubNewRelicHandler(Logger::ERROR, true, self::$appname, true); + $handler->handle($this->getRecord( + Logger::ERROR, + 'log message', + array('a' => array('key1' => 'value1', 'key2' => 'value2')) + )); + $this->assertEquals( + array('context_a_key1' => 'value1', 'context_a_key2' => 'value2'), + self::$customParameters + ); + } + public function testThehandlerCanAddExtraParamsToTheNewRelicTrace() { $record = $this->getRecord(Logger::ERROR, 'log message'); @@ -59,6 +73,20 @@ class NewRelicHandlerTest extends TestCase $this->assertEquals(array('extra_c' => 'd'), self::$customParameters); } + public function testThehandlerCanAddExplodedExtraParamsToTheNewRelicTrace() + { + $record = $this->getRecord(Logger::ERROR, 'log message'); + $record['extra'] = array('c' => array('key1' => 'value1', 'key2' => 'value2')); + + $handler = new StubNewRelicHandler(Logger::ERROR, true, self::$appname, true); + $handler->handle($record); + + $this->assertEquals( + array('extra_c_key1' => 'value1', 'extra_c_key2' => 'value2'), + self::$customParameters + ); + } + public function testThehandlerCanAddExtraContextAndParamsToTheNewRelicTrace() { $record = $this->getRecord(Logger::ERROR, 'log message', array('a' => 'b'));