composer require arxus/messenger-newrelic
config/packages/messenger.yaml:
framework:
messenger:
buses:
default:
middleware:
- Arxus\NewrelicMessengerBundle\Middleware\NewRelicMiddleware
Middleware Execution:
NewRelicMiddleware wraps message handling in a New Relic transaction.App\Message\SendEmailMessage).NameableNewrelicTransactionInterface to customize transaction names (see below).Custom Transaction Names:
Implement NameableNewrelicTransactionInterface in your message class:
use Arxus\NewrelicMessengerBundle\Middleware\NameableNewrelicTransactionInterface;
class SendEmailMessage implements NameableNewrelicTransactionInterface
{
public function getNewRelicTransactionName(): string
{
return 'custom.email.sender';
}
}
Asynchronous vs. Synchronous:
doctrine, amqp) and sync transports.Conditional Usage:
Disable the middleware in config/packages/dev/messenger.yaml for local development:
framework:
messenger:
buses:
default:
middleware:
- ~ # Disable NewRelicMiddleware in dev
newrelic.ini includes:
transaction_tracer.record_sql=obey_transaction_name
transaction_tracer.record_ajax=true
doctrine, amqp, sync) to verify consistency.Transaction Naming Collisions:
App\Message\SendEmailMessage). Override with NameableNewrelicTransactionInterface if names are ambiguous.SendEmailMessage and SendNewsletterMessage) may blend into one transaction in dashboards.New Relic Agent Version:
if (!class_exists(\NewRelic::class)) {
throw new \RuntimeException('New Relic PHP agent not installed.');
}
Performance Overhead:
config/packages/prod/messenger.yaml if monitoring isn’t critical.Symfony 6/7 Specifics:
symfony/messenger:^6.0 or ^7.0. Ensure your composer.json aligns:
"require": {
"symfony/messenger": "^7.0"
}
php -r "var_dump(\NewRelic::isEnabled());").dd($message::class) in your handler to confirm the FQCN matches expectations.Custom Transaction Attributes: Extend the middleware to add custom attributes (e.g., message ID, payload size):
use Arxus\NewrelicMessengerBundle\Middleware\NewRelicMiddleware;
class CustomNewRelicMiddleware extends NewRelicMiddleware
{
protected function startTransaction(object $message): void
{
\NewRelic\Agent::addCustomParameters([
'message_id' => $message->getId(),
'payload_size' => strlen(serialize($message)),
]);
parent::startTransaction($message);
}
}
Then replace the default middleware in messenger.yaml with your custom class.
Conditional Middleware: Skip the middleware for specific messages (e.g., health checks):
framework:
messenger:
buses:
default:
middleware:
- Arxus\NewrelicMessengerBundle\Middleware\NewRelicMiddleware
- App\Middleware\SkipForHealthCheckMiddleware
Testing: Mock New Relic in tests to avoid real API calls:
use Arxus\NewrelicMessengerBundle\Middleware\NewRelicMiddleware;
$middleware = new NewRelicMiddleware();
$middleware->handle($message, new TestHandler(), function () {
// Test logic here
});
How can I help you explore Laravel packages today?