From b439707cbb09e04c174c651d6f46417c8c1e4f02 Mon Sep 17 00:00:00 2001 From: Alessandro Nadalin Date: Thu, 23 Aug 2012 00:43:49 +0400 Subject: [PATCH 1/5] Added an handler for NewRelic: * implemented a test which verifies that the fallback handler handles records when the NewRelic PHP extension is not installes * implemented the actual handler --- src/Monolog/Handler/NewRelicHandler.php | 49 +++++++++++++++++++ tests/Monolog/Handler/NewRelicHandlerTest.php | 33 +++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/Monolog/Handler/NewRelicHandler.php create mode 100644 tests/Monolog/Handler/NewRelicHandlerTest.php diff --git a/src/Monolog/Handler/NewRelicHandler.php b/src/Monolog/Handler/NewRelicHandler.php new file mode 100644 index 00000000..33931822 --- /dev/null +++ b/src/Monolog/Handler/NewRelicHandler.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Base class for all mail handlers + * + * @author Gyula Sallai + */ +class NewRelicHandler extends AbstractProcessingHandler +{ + protected $fallbackHandler; + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + if (extension_loaded('newrelic')) { + newrelic_notice_error($record['message']); + + foreach ($record['context'] as $key => $parameter) { + newrelic_add_custom_parameter($key, $parameter); + } + } elseif ($this->fallbackHandler instanceOf AbstractProcessingHandler) { + $this->fallbackHandler->write($record); + } + } + + /** + * Sets the fallback handler to be used to log informations if the New Relic + * extension is not available. + * + * @param Monolog\Handler\AbstractProcessingHandler $handler + */ + public function setFallbackHandler(AbstractProcessingHandler $handler) + { + $this->fallbackHandler = $handler; + } +} diff --git a/tests/Monolog/Handler/NewRelicHandlerTest.php b/tests/Monolog/Handler/NewRelicHandlerTest.php new file mode 100644 index 00000000..b0033380 --- /dev/null +++ b/tests/Monolog/Handler/NewRelicHandlerTest.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\TestCase; +use Monolog\Logger; + +class NewRelicHandlerTest extends TestCase +{ + public function testFallbackHandler() + { + $handler = new NewRelicHandler(); + $fallbackHandler = new TestHandler(); + $handler->setFallbackHandler($fallbackHandler); + $record = array( + 'level' => Logger::DEBUG, + 'extra' => array(), + ); + + $handler->handle($record); + + $this->assertCount(1, $fallbackHandler->getRecords()); + } +} From 33ea09eb6a19efca3580bfd04a4be5567e2e7198 Mon Sep 17 00:00:00 2001 From: Alessandro Nadalin Date: Thu, 23 Aug 2012 01:36:36 +0400 Subject: [PATCH 2/5] updated the documentation --- README.mdown | 1 + nbproject/private/private.properties | 2 ++ nbproject/project.properties | 7 +++++++ nbproject/project.xml | 9 +++++++++ src/Monolog/Handler/NewRelicHandler.php | 4 ++-- 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 nbproject/private/private.properties create mode 100644 nbproject/project.properties create mode 100644 nbproject/project.xml diff --git a/README.mdown b/README.mdown index f1fb8a2d..56f3177f 100644 --- a/README.mdown +++ b/README.mdown @@ -134,6 +134,7 @@ Handlers - _RavenHandler_: Logs records to a [Sentry](http://getsentry.com/) server using [raven](https://packagist.org/packages/raven/raven). - _ZendMonitorHandler_: Logs records to the Zend Monitor present in Zend Server. +- _NewRelicHandler_: Logs records to a [NewRelic](http://newrelic.com/) application. ### Logging in development diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties new file mode 100644 index 00000000..a5085ea2 --- /dev/null +++ b/nbproject/private/private.properties @@ -0,0 +1,2 @@ +index.file=index.php +url=http://localhost/monolog/ diff --git a/nbproject/project.properties b/nbproject/project.properties new file mode 100644 index 00000000..94429c9b --- /dev/null +++ b/nbproject/project.properties @@ -0,0 +1,7 @@ +include.path=${php.global.include.path} +php.version=PHP_53 +source.encoding=UTF-8 +src.dir=. +tags.asp=false +tags.short=true +web.root=. diff --git a/nbproject/project.xml b/nbproject/project.xml new file mode 100644 index 00000000..e49f9b6f --- /dev/null +++ b/nbproject/project.xml @@ -0,0 +1,9 @@ + + + org.netbeans.modules.php.project + + + monolog + + + diff --git a/src/Monolog/Handler/NewRelicHandler.php b/src/Monolog/Handler/NewRelicHandler.php index 33931822..c3bd3959 100644 --- a/src/Monolog/Handler/NewRelicHandler.php +++ b/src/Monolog/Handler/NewRelicHandler.php @@ -12,9 +12,9 @@ namespace Monolog\Handler; /** - * Base class for all mail handlers + * Class to record a log on a NewRelic application * - * @author Gyula Sallai + * @see https://newrelic.com/docs/php/new-relic-for-php */ class NewRelicHandler extends AbstractProcessingHandler { From 394b0bf872968875e02379d0036d9bc63d19bfb4 Mon Sep 17 00:00:00 2001 From: odino Date: Sat, 29 Jun 2013 02:05:03 +0400 Subject: [PATCH 3/5] removed the logic for the fallback handler, its out of place, adapted the "test" --- src/Monolog/Handler/NewRelicHandler.php | 17 +---------------- tests/Monolog/Handler/NewRelicHandlerTest.php | 3 +-- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/Monolog/Handler/NewRelicHandler.php b/src/Monolog/Handler/NewRelicHandler.php index c3bd3959..157fcbb8 100644 --- a/src/Monolog/Handler/NewRelicHandler.php +++ b/src/Monolog/Handler/NewRelicHandler.php @@ -17,9 +17,7 @@ namespace Monolog\Handler; * @see https://newrelic.com/docs/php/new-relic-for-php */ class NewRelicHandler extends AbstractProcessingHandler -{ - protected $fallbackHandler; - +{ /** * {@inheritdoc} */ @@ -31,19 +29,6 @@ class NewRelicHandler extends AbstractProcessingHandler foreach ($record['context'] as $key => $parameter) { newrelic_add_custom_parameter($key, $parameter); } - } elseif ($this->fallbackHandler instanceOf AbstractProcessingHandler) { - $this->fallbackHandler->write($record); } } - - /** - * Sets the fallback handler to be used to log informations if the New Relic - * extension is not available. - * - * @param Monolog\Handler\AbstractProcessingHandler $handler - */ - public function setFallbackHandler(AbstractProcessingHandler $handler) - { - $this->fallbackHandler = $handler; - } } diff --git a/tests/Monolog/Handler/NewRelicHandlerTest.php b/tests/Monolog/Handler/NewRelicHandlerTest.php index b0033380..ac415de7 100644 --- a/tests/Monolog/Handler/NewRelicHandlerTest.php +++ b/tests/Monolog/Handler/NewRelicHandlerTest.php @@ -20,7 +20,6 @@ class NewRelicHandlerTest extends TestCase { $handler = new NewRelicHandler(); $fallbackHandler = new TestHandler(); - $handler->setFallbackHandler($fallbackHandler); $record = array( 'level' => Logger::DEBUG, 'extra' => array(), @@ -28,6 +27,6 @@ class NewRelicHandlerTest extends TestCase $handler->handle($record); - $this->assertCount(1, $fallbackHandler->getRecords()); + $this->assertTrue($handler->isHandling($record)); } } From b422bb1c5bd21fe8b1048b14e41bbe425a91d2e5 Mon Sep 17 00:00:00 2001 From: odino Date: Wed, 24 Jul 2013 10:14:35 +0400 Subject: [PATCH 4/5] refactored the implementation of the NR handler and its test: * the test now checks that if the extension is not loaded, an exception is thrown * the test now mocks the new relic native functions * moved some parameters as constants in the handler class --- src/Monolog/Handler/NewRelicHandler.php | 21 ++++++- tests/Monolog/Handler/NewRelicHandlerTest.php | 55 +++++++++++++++---- 2 files changed, 63 insertions(+), 13 deletions(-) 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; +} From 929522cc6b76c06117529ddf4a333ac31716a3dd Mon Sep 17 00:00:00 2001 From: odino Date: Sun, 28 Jul 2013 09:35:46 +0400 Subject: [PATCH 5/5] removed netbeans files committed by mistake --- nbproject/private/private.properties | 2 -- nbproject/project.properties | 7 ------- nbproject/project.xml | 9 --------- 3 files changed, 18 deletions(-) delete mode 100644 nbproject/private/private.properties delete mode 100644 nbproject/project.properties delete mode 100644 nbproject/project.xml diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties deleted file mode 100644 index a5085ea2..00000000 --- a/nbproject/private/private.properties +++ /dev/null @@ -1,2 +0,0 @@ -index.file=index.php -url=http://localhost/monolog/ diff --git a/nbproject/project.properties b/nbproject/project.properties deleted file mode 100644 index 94429c9b..00000000 --- a/nbproject/project.properties +++ /dev/null @@ -1,7 +0,0 @@ -include.path=${php.global.include.path} -php.version=PHP_53 -source.encoding=UTF-8 -src.dir=. -tags.asp=false -tags.short=true -web.root=. diff --git a/nbproject/project.xml b/nbproject/project.xml deleted file mode 100644 index e49f9b6f..00000000 --- a/nbproject/project.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - org.netbeans.modules.php.project - - - monolog - - -