diff --git a/src/Monolog/Handler/NewRelicHandler.php b/src/Monolog/Handler/NewRelicHandler.php index 157fcbb8..df798dea 100644 --- a/src/Monolog/Handler/NewRelicHandler.php +++ b/src/Monolog/Handler/NewRelicHandler.php @@ -11,6 +11,8 @@ namespace Monolog\Handler; +use Monolog\Handler\MissingExtensionException; + /** * Class to record a log on a NewRelic application * @@ -18,17 +20,34 @@ namespace Monolog\Handler; */ class NewRelicHandler extends AbstractProcessingHandler { + const ERROR_MISSING_EXTENSION = "The NewRelic PHP extension is not installed on this system, therefore you can't use the NewRelicHandler"; + const NEWRELIC_EXTENSION_NAME = 'newrelic'; + /** * {@inheritdoc} */ protected function write(array $record) { - if (extension_loaded('newrelic')) { + if ($this->isNewRelicEnabled()) { newrelic_notice_error($record['message']); foreach ($record['context'] as $key => $parameter) { newrelic_add_custom_parameter($key, $parameter); } + + return; } + + throw new MissingExtensionException(self::ERROR_MISSING_EXTENSION); + } + + /** + * Checks whether the NewRelic extension is enabled in the system. + * + * @return bool + */ + protected function isNewRelicEnabled() + { + return (bool) extension_loaded(self::NEWRELIC_EXTENSION_NAME); } } diff --git a/tests/Monolog/Handler/NewRelicHandlerTest.php b/tests/Monolog/Handler/NewRelicHandlerTest.php index ac415de7..249fbad1 100644 --- a/tests/Monolog/Handler/NewRelicHandlerTest.php +++ b/tests/Monolog/Handler/NewRelicHandlerTest.php @@ -15,18 +15,49 @@ use Monolog\TestCase; use Monolog\Logger; class NewRelicHandlerTest extends TestCase -{ - public function testFallbackHandler() +{ + /** + * @expectedException Monolog\Handler\MissingExtensionException + */ + public function testThehandlerThrowsAnExceptionIfTheNRExtensionIsNotLoaded() { - $handler = new NewRelicHandler(); - $fallbackHandler = new TestHandler(); - $record = array( - 'level' => Logger::DEBUG, - 'extra' => array(), - ); - - $handler->handle($record); - - $this->assertTrue($handler->isHandling($record)); + $handler = new StubNewRelicHandlerWithoutExtension(); + $handler->handle($this->getRecord()); + } + + public function testThehandlerCanHandleTheRecord() + { + $handler = new StubNewRelicHandler(); + $handler->handle($this->getRecord()); + } + + public function testThehandlerCanAddParamsToTheNewRelicTrace() + { + $handler = new StubNewRelicHandler(); + $handler->handle($this->getRecord(100, 'log message', array('a' => 'b'))); } } + +class StubNewRelicHandlerWithoutExtension extends NewRelicHandler +{ + protected function isNewRelicEnabled() + { + return false; + } +} + +class StubNewRelicHandler extends NewRelicHandler +{ + protected function isNewRelicEnabled() + { + return true; + } +} + +function newrelic_notice_error() { + return true; +} + +function newrelic_add_custom_parameter() { + return true; +}