bugsnag / bugsnag-php

BugSnag error monitoring and crash reporting tool for PHP apps
https://docs.bugsnag.com/platforms/php
MIT License
554 stars 77 forks source link

Error: The breadcrumb name must be a non-empty string. #426

Closed tamer-hassan closed 6 years ago

tamer-hassan commented 6 years ago

After integrating bugsnag-php with OctoberCMS, whenever I access a specific backend update page that uses raw DB queries, I get error 'The breadcrumb name must be a non-empty string.'

This is the case with the bugsnag-php versions I tested ( 3.5.0 - 3.9.0 )

The only workaround I can come up with to avoid this error is: replace the line: https://github.com/bugsnag/bugsnag-php/blob/master/src/Client.php#L294 $this->leaveBreadcrumb($report->getName(), Breadcrumb::ERROR_TYPE, $report->getSummary()); with: $this->leaveBreadcrumb(empty($report->getName()) ? "Unknown" : $report->getName(), Breadcrumb::ERROR_TYPE, $report->getSummary());

Hope that helps.

kattrali commented 6 years ago

Thanks for the detailed report, @jasminhassan. This is something we should fix!

Cawllec commented 6 years ago

Hi @jasminhassan, I'm looking into this issue at the moment. Can you give me any more information about the report that's missing a name? Can you find which factory method is creating it (i.e. fromPHPError, fromPHPThrowable, fromNamedError)?

tamer-hassan commented 6 years ago

Hi @Cawllec, Would a stack trace from OctoberCMS (based on Laravel 5.5) log be useful?

[2017-11-24 07:31:14] production.ERROR: InvalidArgumentException: The breadcrumb name must be a non-empty string. in /var/www/html/services/internal-october/vendor/bugsnag/bugsnag/src/Breadcrumbs/Breadcrumb.php:121
Stack trace:
#0 /var/www/html/services/internal-october/vendor/bugsnag/bugsnag/src/Client.php(214): Bugsnag\Breadcrumbs\Breadcrumb->_
_construct('', 'error', Array)
#1 /var/www/html/services/internal-october/vendor/bugsnag/bugsnag/src/Client.php(294): Bugsnag\Client->leaveBreadcrumb('', 'error', Array)
#2 /var/www/html/services/internal-october/vendor/bugsnag/bugsnag/src/Client.php(255): Bugsnag\Client->notify(Object(Bugsnag\Report), Object(Closure))
#3 /var/www/html/services/internal-october/vendor/mead-steve/mono-snag/src/BugsnagHandler.php(65): Bugsnag\Client->notifyError('', '[2017-11-24 07:...', Object(Closure))
#4 /var/www/html/services/internal-october/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php(37): MeadSteve\MonoSnag\BugsnagHandler->write(Array)
#5 /var/www/html/services/internal-october/vendor/monolog/monolog/src/Monolog/Logger.php(337): Monolog\Handler\AbstractProcessingHandler->handle(Array)
#6 /var/www/html/services/internal-october/vendor/monolog/monolog/src/Monolog/Logger.php(616): Monolog\Logger->addRecord(400, NULL, Array)
#7 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Log/Writer.php(203): Monolog\Logger->error(NULL, Array)
#8 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Log/Writer.php(114): Illuminate\Log\Writer->writeLog('error', NULL, Array)
#9 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(221): Illuminate\Log\Writer->error(NULL)
#10 /var/www/html/services/internal-october/plugins/myorganization/dbtransfer/controllers/LoadSets.php(56): Illuminate\Support\Facades\Facade::__callStatic('error', Array)
#11 [internal function]: myorganization\DBTransfer\Controllers\LoadSets->onLoad('7')
#12 /var/www/html/services/internal-october/modules/backend/classes/Controller.php(536): call_user_func_array(Array, Array)
#13 /var/www/html/services/internal-october/modules/backend/classes/Controller.php(419): Backend\Classes\Controller->runAjaxHandler('onLoad')
#14 /var/www/html/services/internal-october/modules/backend/classes/Controller.php(229): Backend\Classes\Controller->execAjaxHandlers()
#15 /var/www/html/services/internal-october/modules/backend/classes/BackendController.php(112): Backend\Classes\Controller->run('dumps', Array)
#16 [internal function]: Backend\Classes\BackendController->run('myorganization...')
#17 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
#18 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction('run', Array)
#19 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Route.php(212): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Backend\Classes\BackendController), 'run')
#20 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Route.php(169): Illuminate\Routing\Route->runController()
#21 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Router.php(658): Illuminate\Routing\Route->run()
#22 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#23 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#24 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))
#25 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#26 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#27 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#28 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#29 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(63): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#30 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#31 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#32 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#33 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#34 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#35 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(59): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#36 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#37 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#38 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#39 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Router.php(660): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#40 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Router.php(635): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#41 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Router.php(601): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))
#42 /var/www/html/services/internal-october/vendor/october/rain/src/Router/CoreRouter.php(20): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#43 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): October\Rain\Router\CoreRouter->dispatch(Object(Illuminate\Http\Request))
#44 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#45 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(46): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#46 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#47 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#48 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#49 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#50 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#51 /var/www/html/services/internal-october/index.php(43): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#52 {main}  
GrahamCampbell commented 6 years ago

The bug is here:

9 /var/www/html/services/internal-october/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(221): Illuminate\Log\Writer->error(NULL)

10 /var/www/html/services/internal-october/plugins/myorganization/dbtransfer/controllers/LoadSets.php(56): Illuminate\Support\Facades\Facade::__callStatic('error', Array)

You are trying to write null to the logs. You must pass non-null arguments to the PSR logger.

GrahamCampbell commented 6 years ago

We should probably skip recording such breadcrumbs? That said, this did uncover a bug in october that you wouldn't have otherwise found.

GrahamCampbell commented 6 years ago

We should probably skip recording such breadcrumbs?

By that I mean, skip calling leaveBreadcrumb for such cases, rather than leaveBreadcrumb silently skipping.

Cawllec commented 6 years ago

In terms of the actual issue with the notifier, it currently allows you to set an empty string as a valid report name, which then throws an exception as empty strings are invalid for breadcrumb names.

I would propose either allowing empty strings as breadcrumb names (not very useful but doesn't lose any data), or dropping nameless breadcrumbs with a debug log message.

GrahamCampbell commented 6 years ago

I would not recommend either of those recommendations I'm afraid, but instead do the variant I suggested where we skip calling the breadcrumb method.