diff --git a/DependencyInjection/AlliesOroBugsnagExtension.php b/DependencyInjection/AlliesOroBugsnagExtension.php index 6ea7aed..90df310 100644 --- a/DependencyInjection/AlliesOroBugsnagExtension.php +++ b/DependencyInjection/AlliesOroBugsnagExtension.php @@ -19,5 +19,7 @@ public function load(array $configs, ContainerBuilder $container) $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('services.yml'); + + $container->prependExtensionConfig($this->getAlias(), array_intersect_key($config, array_flip(['settings']))); } } \ No newline at end of file diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 7a35d45..8a677df 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -4,6 +4,9 @@ use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; +use Monolog\Logger; + +use Oro\Bundle\ConfigBundle\DependencyInjection\SettingsBuilder; class Configuration implements ConfigurationInterface { @@ -14,7 +17,20 @@ public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('allies_oro_bugsnag'); - + + SettingsBuilder::append( + $rootNode, + [ + 'reporting_level' => ['value' => [ + Logger::EMERGENCY, + Logger::ALERT, + Logger::CRITICAL, + Logger::ERROR, + Logger::WARNING, + ]], + ] + ); + return $treeBuilder; } } \ No newline at end of file diff --git a/Handler/BugsnagHandler.php b/Handler/BugsnagHandler.php index f3cc6bf..933fc5f 100644 --- a/Handler/BugsnagHandler.php +++ b/Handler/BugsnagHandler.php @@ -6,64 +6,109 @@ use Monolog\Handler\AbstractProcessingHandler; use Monolog\Logger; use Bugsnag\Client as BugsnagClient; +use Bugsnag\Report as BugsnagReport; +use Oro\Bundle\ConfigBundle\Config\ConfigManager; class BugsnagHandler extends AbstractProcessingHandler { + +/****************************************************************************** + * PROPERTIES + ******************************************************************************/ + /** - * monolog error codes mapped on to bugSnag severities. - * @var string[] + * @var ContainerInterface */ - protected $severityMapping = array( - Logger::DEBUG => 'info', - Logger::INFO => 'info', - Logger::NOTICE => 'info', - Logger::WARNING => 'warning', - Logger::ERROR => 'error', - Logger::CRITICAL => 'error', - Logger::ALERT => 'error', - Logger::EMERGENCY => 'error' - ); - protected $container; /** - * @var \Bugsnag\Client + * @var BugsnagClient */ protected $client; - public function setContainer(ContainerInterface $container) - { - $this->container = $container; - - return $this; - } - - public function getClient() + /** + * @var ConfigManager + */ + protected $configManager; + +/****************************************************************************** + * STATICS + ******************************************************************************/ + + /** + * @param integer $errorCode + * @return string + */ + public static function getSeverity($errorCode) { - if (is_null($this->client)) { - if (!$this->container) { - throw new \RuntimeException("Container must be defined"); - } - - $this->client = $this->container->get('bugsnag'); + switch ($errorCode) { + case Logger::EMERGENCY : + case Logger::ALERT : + case Logger::CRITICAL : + case Logger::ERROR : + return 'error'; + break; + + case Logger::WARNING : + return 'warning'; + break; + + case Logger::NOTICE : + case Logger::INFO : + case Logger::DEBUG : + return 'info'; + break; + + default : + throw new \InvalidArgumentException(sprintf( + "Unknown errorCode %s passed", + (is_object($errorCode)) ? get_class($errorCode) : $errorCode + )); + break; } + } + +/****************************************************************************** + * MAGIC + ******************************************************************************/ + + /** + * @param BugsnagClient $client + * @param ConfigManager $configManager + * @param integer $level + * @param boolean $bubble + */ + public function __construct( + BugsnagClient $client, + ConfigManager $configManager, + $level = Logger::ERROR, + $bubble = true + ) { + parent::__construct($level, $bubble); - return $this->client; + $this->client = $client; + $this->configManager = $configManager; } + +/****************************************************************************** + * ACTIONS + ******************************************************************************/ /** - * Writes the record down to the log of the implementing handler - * - * @param array $record + * @param array $record * @return void */ protected function write(array $record) - { - $severity = $this->getSeverity($record['level']); + { + if (!in_array($record['level'], $this->configManager->get('allies_oro_bugsnag.reporting_level'))) { + return; + } + $severity = self::getSeverity($record['level']); + if (isset($record['context']['exception'])) { - $this->getClient()->notifyException( + $this->client->notifyException( $record['context']['exception'], - function (\Bugsnag\Report $report) use ($record, $severity) { + function (BugsnagReport $report) use ($record, $severity) { $report->setSeverity($severity); if (isset($record['extra'])) { $report->setMetaData($record['extra']); @@ -71,10 +116,10 @@ function (\Bugsnag\Report $report) use ($record, $severity) { } ); } else { - $this->getClient()->notifyError( - (string) $record['message'], - (string) $record['formatted'], - function (\Bugsnag\Report $report) use ($record, $severity) { + $this->client->notifyError( + (string)$record['message'], + (string)$record['formatted'], + function (BugsnagReport $report) use ($record, $severity) { $report->setSeverity($severity); if (isset($record['extra'])) { $report->setMetaData($record['extra']); @@ -83,18 +128,4 @@ function (\Bugsnag\Report $report) use ($record, $severity) { ); } } - - /** - * Returns the Bugsnag severiry from a monolog error code. - * @param int $errorCode - one of the Logger:: constants. - * @return string - */ - protected function getSeverity($errorCode) - { - if (isset($this->severityMapping[$errorCode])) { - return $this->severityMapping[$errorCode]; - } else { - return $this->severityMapping[Logger::ERROR]; - } - } } diff --git a/README.md b/README.md index 3129a16..79dfbdd 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,5 @@ Bugsnag for OroCRM A simple wrapper to push exceptions and errors logged through Monolog to the (Bugsnag)[https://www.bugsnag.com/] service. -Utilises - -* `bugsnag/bugsnag-symfony` : [Bugsnag Symfony Bundle](https://github.com/bugsnag/bugsnag-symfony) -* `mead-steve/mono-snag` : [MonoSnag Bundle](https://github.com/meadsteve/MonoSnag) - +Utilises [Bugsnag Symfony Bundle](https://github.com/bugsnag/bugsnag-symfony) `bugsnag/bugsnag-symfony` +Credit to [MonoSnag Bundle](https://github.com/meadsteve/MonoSnag) `mead-steve/mono-snag` for references \ No newline at end of file diff --git a/Resources/config/oro/system_configuration.yml b/Resources/config/oro/system_configuration.yml new file mode 100644 index 0000000..76a5df5 --- /dev/null +++ b/Resources/config/oro/system_configuration.yml @@ -0,0 +1,33 @@ +system_configuration: + groups: + allies_oro_bugsnag: + title: allies.oro_bugsnag.system_configuration.groups.allies_oro_bugsnag.title + fields: + allies_oro_bugsnag.reporting_level: + data_type: string + type: choice + priority: 10 + options: + label: allies.oro_bugsnag.system_configuration.fields.reporting_level.label + required: false + multiple: true + choices: + 600: Emergency + 550: Alert + 500: Critical + 400: Error + 300: Warning + 250: Notice + 200: Info + 100: Debug + tree: + system_configuration: + platform: + children: + general_setup: + children: + application_settings: + children: + allies_oro_bugsnag: + children: + - allies_oro_bugsnag.reporting_level \ No newline at end of file diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 05393ca..8ff4b30 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -4,5 +4,33 @@ parameters: services: allies_orobugsnag.handler: class: %allies_orobugsnag.handler.class% - calls: - - [setContainer, [@service_container]] \ No newline at end of file + arguments: + - @allies_orobugsnag.client + - @oro_config.manager + + allies_orobugsnag.client: + parent: bugsnag + factory: ['@allies_orobugsnag.factory', make] + + allies_orobugsnag.factory: + class: %bugsnag.factory% + arguments: + - @bugsnag.resolver + - null + - null + - '%bugsnag.api_key%' + - '%bugsnag.endpoint%' + - '%bugsnag.callbacks%' + - '%bugsnag.user%' + - '%bugsnag.app_type%' + - '%bugsnag.app_version%' + - '%bugsnag.batch_sending%' + - '%bugsnag.hostname%' + - '%bugsnag.send_code%' + - '%bugsnag.strip_path%' + - '%bugsnag.project_root%' + - '%kernel.root_dir%' + - '%kernel.environment%' + - '%bugsnag.release_stage%' + - '%bugsnag.notify_release_stages%' + - '%bugsnag.filters%' \ No newline at end of file diff --git a/Resources/translations/messages.en.yml b/Resources/translations/messages.en.yml new file mode 100644 index 0000000..6e8c5d6 --- /dev/null +++ b/Resources/translations/messages.en.yml @@ -0,0 +1,6 @@ +allies_oro_bugsnag: + system_configuration: + groups: + allies_oro_bugsnag.title: Bugsnag + fields: + reporting_level.label: Reporting Level \ No newline at end of file diff --git a/composer.json b/composer.json index b0898cc..bdce4dc 100644 --- a/composer.json +++ b/composer.json @@ -7,11 +7,10 @@ "require": { "php": ">=5.6", "oro/platform": "2.*", - "bugsnag/bugsnag-symfony": "1.*", - "mead-steve/mono-snag": "^3.0.0" + "bugsnag/bugsnag-symfony": "1.*" }, "autoload": { - "psr-0": { "Allies\\Bundle\\LogViewerBundle": "src/" } + "psr-0": { "Allies\\Bundle\\OroBugsnagBundle": "src/" } }, "target-dir": "src/Allies/Bundle/OroBugsnagBundle", "minimum-stability": "dev",