From 919b3ddd4a30070a406c9e24d751f4be213db757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joachim=20L=C3=B8vgaard?= Date: Mon, 7 Sep 2026 13:42:15 +0200 Subject: [PATCH] Log why an event was dropped Four filters and three consent gates discarded events silently, which made 'my events do not show up' impossible to answer without a debugger. Each now logs the reason at debug level on a dedicated Monolog channel. Fixes #25 --- README.md | 17 ++ .../AddEventToTagBagSubscriber.php | 11 ++ .../AddLibraryToTagBagSubscriber.php | 10 ++ .../DispatchOnCommandBusSubscriber.php | 11 ++ src/EventSubscriber/FilterBotsSubscriber.php | 17 +- .../FilterConfiguredUserAgentsSubscriber.php | 14 +- .../FilterEmptyUserAgentSubscriber.php | 14 ++ ...gationIfNoPixelsHasBeenAddedSubscriber.php | 14 ++ .../services/conditional/client_side.xml | 6 +- .../services/conditional/server_side.xml | 2 + .../config/services/event_subscriber.xml | 10 ++ .../ConsentGateLoggingTest.php | 151 ++++++++++++++++++ .../FilterBotsSubscriberTest.php | 20 +++ ...lterConfiguredUserAgentsSubscriberTest.php | 13 ++ .../FilterEmptyUserAgentSubscriberTest.php | 10 ++ ...onIfNoPixelsHasBeenAddedSubscriberTest.php | 50 ++++++ 16 files changed, 366 insertions(+), 4 deletions(-) create mode 100644 tests/Unit/EventSubscriber/ConsentGateLoggingTest.php create mode 100644 tests/Unit/EventSubscriber/StopPropagationIfNoPixelsHasBeenAddedSubscriberTest.php diff --git a/README.md b/README.md index f2ce4e2..9f64ed5 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,23 @@ final class AddCustomerToConversionsApiEvent You can also replace a step instead of adding to it: alias `PixelProviderInterface`, `FbpContextInterface` or `FbcContextInterface` to your own service, or register a listener above the corresponding populate priority. +### Why did my event not show up? + +Every listener that drops an event says so at debug level on the `setono_meta_conversions_api` Monolog channel: the +bot filter, the user agent filters, the no-pixels check, and each of the three consent gates. The send handler logs a +warning when a pixel has no access token. + +```yaml +# config/packages/monolog.yaml +monolog: + handlers: + meta: + type: stream + path: '%kernel.logs_dir%/meta.log' + level: debug + channels: ['setono_meta_conversions_api'] +``` + ### Events that are not raised in a browser request The pipeline assumes the event belongs to the request being handled. `PopulateRequestPropertiesSubscriber` therefore diff --git a/src/EventSubscriber/AddEventToTagBagSubscriber.php b/src/EventSubscriber/AddEventToTagBagSubscriber.php index 9394af4..0017708 100644 --- a/src/EventSubscriber/AddEventToTagBagSubscriber.php +++ b/src/EventSubscriber/AddEventToTagBagSubscriber.php @@ -4,6 +4,8 @@ namespace Setono\MetaConversionsApiBundle\EventSubscriber; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; use Setono\MetaConversionsApi\Event\Parameters; use Setono\MetaConversionsApi\Generator\FbqGeneratorInterface; use Setono\MetaConversionsApiBundle\ConsentChecker\ConsentCheckerInterface; @@ -15,11 +17,15 @@ final class AddEventToTagBagSubscriber implements EventSubscriberInterface { + private readonly LoggerInterface $logger; + public function __construct( private readonly TagBagInterface $tagBag, private readonly FbqGeneratorInterface $fbqGenerator, private readonly ConsentCheckerInterface $consentChecker, + ?LoggerInterface $logger = null, ) { + $this->logger = $logger ?? new NullLogger(); } public static function getSubscribedEvents(): array @@ -32,6 +38,11 @@ public static function getSubscribedEvents(): array public function add(ConversionsApiEventRaised $event): void { if (!$this->consentChecker->isGranted()) { + $this->logger->debug('The event {event_name} ({event_id}) was not rendered client side because consent was not granted', [ + 'event_name' => $event->event->eventName, + 'event_id' => $event->event->eventId, + ]); + return; } diff --git a/src/EventSubscriber/AddLibraryToTagBagSubscriber.php b/src/EventSubscriber/AddLibraryToTagBagSubscriber.php index 114a756..6e59d43 100644 --- a/src/EventSubscriber/AddLibraryToTagBagSubscriber.php +++ b/src/EventSubscriber/AddLibraryToTagBagSubscriber.php @@ -4,6 +4,8 @@ namespace Setono\MetaConversionsApiBundle\EventSubscriber; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; use Setono\MetaConversionsApi\Generator\FbqGeneratorInterface; use Setono\MetaConversionsApiBundle\ConsentChecker\ConsentCheckerInterface; use Setono\MetaConversionsApiBundle\Provider\PixelProviderInterface; @@ -17,12 +19,16 @@ final class AddLibraryToTagBagSubscriber implements EventSubscriberInterface { + private readonly LoggerInterface $logger; + public function __construct( private readonly TagBagInterface $tagBag, private readonly FbqGeneratorInterface $fbqGenerator, private readonly ConsentCheckerInterface $consentChecker, private readonly PixelProviderInterface $pixelProvider, + ?LoggerInterface $logger = null, ) { + $this->logger = $logger ?? new NullLogger(); } public static function getSubscribedEvents(): array @@ -39,11 +45,15 @@ public function add(RequestEvent $event): void } if (!$this->consentChecker->isGranted()) { + $this->logger->debug('The Meta pixel library was not rendered because consent was not granted'); + return; } $pixels = $this->pixelProvider->getPixels(); if ([] === $pixels) { + $this->logger->debug('The Meta pixel library was not rendered because no pixels are available. Did you configure any?'); + return; } diff --git a/src/EventSubscriber/DispatchOnCommandBusSubscriber.php b/src/EventSubscriber/DispatchOnCommandBusSubscriber.php index e52fe95..90cbdc9 100644 --- a/src/EventSubscriber/DispatchOnCommandBusSubscriber.php +++ b/src/EventSubscriber/DispatchOnCommandBusSubscriber.php @@ -4,6 +4,8 @@ namespace Setono\MetaConversionsApiBundle\EventSubscriber; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; use Setono\MetaConversionsApiBundle\ConsentChecker\ConsentCheckerInterface; use Setono\MetaConversionsApiBundle\Event\ConversionsApiEventRaised; use Setono\MetaConversionsApiBundle\Message\Command\SendEvent; @@ -12,10 +14,14 @@ final class DispatchOnCommandBusSubscriber implements EventSubscriberInterface { + private readonly LoggerInterface $logger; + public function __construct( private readonly MessageBusInterface $commandBus, private readonly ConsentCheckerInterface $consentChecker, + ?LoggerInterface $logger = null, ) { + $this->logger = $logger ?? new NullLogger(); } public static function getSubscribedEvents(): array @@ -28,6 +34,11 @@ public static function getSubscribedEvents(): array public function dispatch(ConversionsApiEventRaised $event): void { if (!$this->consentChecker->isGranted()) { + $this->logger->debug('The event {event_name} ({event_id}) was not sent server side because consent was not granted', [ + 'event_name' => $event->event->eventName, + 'event_id' => $event->event->eventId, + ]); + return; } diff --git a/src/EventSubscriber/FilterBotsSubscriber.php b/src/EventSubscriber/FilterBotsSubscriber.php index f3b629d..1210fc4 100644 --- a/src/EventSubscriber/FilterBotsSubscriber.php +++ b/src/EventSubscriber/FilterBotsSubscriber.php @@ -4,6 +4,8 @@ namespace Setono\MetaConversionsApiBundle\EventSubscriber; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; use Setono\BotDetectionBundle\BotDetector\BotDetectorInterface; use Setono\MetaConversionsApi\Event\Event; use Setono\MetaConversionsApiBundle\Event\ConversionsApiEventRaised; @@ -11,8 +13,13 @@ final class FilterBotsSubscriber implements EventSubscriberInterface { - public function __construct(private readonly BotDetectorInterface $botDetector) - { + private readonly LoggerInterface $logger; + + public function __construct( + private readonly BotDetectorInterface $botDetector, + ?LoggerInterface $logger = null, + ) { + $this->logger = $logger ?? new NullLogger(); } public static function getSubscribedEvents(): array @@ -31,6 +38,12 @@ public function filter(ConversionsApiEventRaised $event): void } if ($this->botDetector->isBotRequest()) { + $this->logger->debug('The event {event_name} ({event_id}) was dropped because the request comes from a bot: {user_agent}', [ + 'event_name' => $event->event->eventName, + 'event_id' => $event->event->eventId, + 'user_agent' => $event->event->userData->clientUserAgent, + ]); + $event->stopPropagation(); } } diff --git a/src/EventSubscriber/FilterConfiguredUserAgentsSubscriber.php b/src/EventSubscriber/FilterConfiguredUserAgentsSubscriber.php index 4ce047c..9fa09ca 100644 --- a/src/EventSubscriber/FilterConfiguredUserAgentsSubscriber.php +++ b/src/EventSubscriber/FilterConfiguredUserAgentsSubscriber.php @@ -4,6 +4,8 @@ namespace Setono\MetaConversionsApiBundle\EventSubscriber; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; use Setono\MetaConversionsApiBundle\Event\ConversionsApiEventRaised; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -14,13 +16,17 @@ final class FilterConfiguredUserAgentsSubscriber implements EventSubscriberInter */ private readonly ?string $pattern; + private readonly LoggerInterface $logger; + /** * @param list $userAgents Regular expression fragments without delimiters * * @throws \InvalidArgumentException if the fragments do not compile into a valid regular expression */ - public function __construct(array $userAgents) + public function __construct(array $userAgents, ?LoggerInterface $logger = null) { + $this->logger = $logger ?? new NullLogger(); + if ([] === $userAgents) { $this->pattern = null; @@ -60,6 +66,12 @@ public function filter(ConversionsApiEventRaised $event): void } if (1 === preg_match($this->pattern, $userAgent)) { + $this->logger->debug('The event {event_name} ({event_id}) was dropped because the user agent matches the configured filters: {user_agent}', [ + 'event_name' => $event->event->eventName, + 'event_id' => $event->event->eventId, + 'user_agent' => $userAgent, + ]); + $event->stopPropagation(); } } diff --git a/src/EventSubscriber/FilterEmptyUserAgentSubscriber.php b/src/EventSubscriber/FilterEmptyUserAgentSubscriber.php index 6039dd1..a1945fd 100644 --- a/src/EventSubscriber/FilterEmptyUserAgentSubscriber.php +++ b/src/EventSubscriber/FilterEmptyUserAgentSubscriber.php @@ -4,12 +4,21 @@ namespace Setono\MetaConversionsApiBundle\EventSubscriber; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; use Setono\MetaConversionsApi\Event\Event; use Setono\MetaConversionsApiBundle\Event\ConversionsApiEventRaised; use Symfony\Component\EventDispatcher\EventSubscriberInterface; final class FilterEmptyUserAgentSubscriber implements EventSubscriberInterface { + private readonly LoggerInterface $logger; + + public function __construct(?LoggerInterface $logger = null) + { + $this->logger = $logger ?? new NullLogger(); + } + public static function getSubscribedEvents(): array { return [ @@ -28,6 +37,11 @@ public function filter(ConversionsApiEventRaised $event): void $userAgent = $event->event->userData->clientUserAgent; if (null === $userAgent || '' === $userAgent) { + $this->logger->debug('The event {event_name} ({event_id}) was dropped because the request has no user agent', [ + 'event_name' => $event->event->eventName, + 'event_id' => $event->event->eventId, + ]); + $event->stopPropagation(); } } diff --git a/src/EventSubscriber/StopPropagationIfNoPixelsHasBeenAddedSubscriber.php b/src/EventSubscriber/StopPropagationIfNoPixelsHasBeenAddedSubscriber.php index d111744..06c995b 100644 --- a/src/EventSubscriber/StopPropagationIfNoPixelsHasBeenAddedSubscriber.php +++ b/src/EventSubscriber/StopPropagationIfNoPixelsHasBeenAddedSubscriber.php @@ -4,11 +4,20 @@ namespace Setono\MetaConversionsApiBundle\EventSubscriber; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; use Setono\MetaConversionsApiBundle\Event\ConversionsApiEventRaised; use Symfony\Component\EventDispatcher\EventSubscriberInterface; final class StopPropagationIfNoPixelsHasBeenAddedSubscriber implements EventSubscriberInterface { + private readonly LoggerInterface $logger; + + public function __construct(?LoggerInterface $logger = null) + { + $this->logger = $logger ?? new NullLogger(); + } + public static function getSubscribedEvents(): array { return [ @@ -19,6 +28,11 @@ public static function getSubscribedEvents(): array public function filter(ConversionsApiEventRaised $event): void { if ([] === $event->event->pixels) { + $this->logger->debug('The event {event_name} ({event_id}) was dropped because no pixels are associated with it. Did you configure any?', [ + 'event_name' => $event->event->eventName, + 'event_id' => $event->event->eventId, + ]); + $event->stopPropagation(); } } diff --git a/src/Resources/config/services/conditional/client_side.xml b/src/Resources/config/services/conditional/client_side.xml index 336451f..72f872e 100644 --- a/src/Resources/config/services/conditional/client_side.xml +++ b/src/Resources/config/services/conditional/client_side.xml @@ -7,17 +7,21 @@ + + - + + + diff --git a/src/Resources/config/services/conditional/server_side.xml b/src/Resources/config/services/conditional/server_side.xml index fec6183..dabb149 100644 --- a/src/Resources/config/services/conditional/server_side.xml +++ b/src/Resources/config/services/conditional/server_side.xml @@ -6,8 +6,10 @@ + + diff --git a/src/Resources/config/services/event_subscriber.xml b/src/Resources/config/services/event_subscriber.xml index b6b260f..290588f 100644 --- a/src/Resources/config/services/event_subscriber.xml +++ b/src/Resources/config/services/event_subscriber.xml @@ -5,18 +5,25 @@ + + %setono_meta_conversions_api.filters.user_agent% + + + + + @@ -47,7 +54,10 @@ + + + diff --git a/tests/Unit/EventSubscriber/ConsentGateLoggingTest.php b/tests/Unit/EventSubscriber/ConsentGateLoggingTest.php new file mode 100644 index 0000000..dfee05f --- /dev/null +++ b/tests/Unit/EventSubscriber/ConsentGateLoggingTest.php @@ -0,0 +1,151 @@ +createMock(LoggerInterface::class); + $logger->expects(self::once())->method('debug')->with(self::stringContains('consent')); + + $tagBag = self::tagBag(); + + (new AddEventToTagBagSubscriber($tagBag, new FbqGenerator(), self::consentChecker(false), $logger)) + ->add(new ConversionsApiEventRaised(new Event(Event::EVENT_VIEW_CONTENT))); + + self::assertSame('', $tagBag->renderAll()); + } + + #[Test] + public function the_library_says_why_it_was_not_rendered(): void + { + $logger = $this->createMock(LoggerInterface::class); + $logger->expects(self::once())->method('debug')->with(self::stringContains('consent')); + + $tagBag = self::tagBag(); + + (new AddLibraryToTagBagSubscriber($tagBag, new FbqGenerator(), self::consentChecker(false), self::pixelProvider([new Pixel('1234')]), $logger)) + ->add(self::requestEvent()); + + self::assertSame('', $tagBag->renderAll()); + } + + #[Test] + public function the_library_says_when_there_are_no_pixels(): void + { + $logger = $this->createMock(LoggerInterface::class); + $logger->expects(self::once())->method('debug')->with(self::stringContains('no pixels')); + + $tagBag = self::tagBag(); + + (new AddLibraryToTagBagSubscriber($tagBag, new FbqGenerator(), self::consentChecker(true), self::pixelProvider([]), $logger)) + ->add(self::requestEvent()); + + self::assertSame('', $tagBag->renderAll()); + } + + #[Test] + public function the_command_says_why_it_was_not_dispatched(): void + { + $logger = $this->createMock(LoggerInterface::class); + $logger->expects(self::once())->method('debug')->with(self::stringContains('consent')); + + $bus = $this->createMock(MessageBusInterface::class); + $bus->expects(self::never())->method('dispatch'); + + (new DispatchOnCommandBusSubscriber($bus, self::consentChecker(false), $logger)) + ->dispatch(new ConversionsApiEventRaised(new Event(Event::EVENT_VIEW_CONTENT))); + } + + #[Test] + public function it_dispatches_when_consent_is_granted(): void + { + $bus = $this->createMock(MessageBusInterface::class); + $bus->expects(self::once())->method('dispatch')->willReturnCallback( + static fn (object $message): Envelope => new Envelope($message), + ); + + (new DispatchOnCommandBusSubscriber($bus, self::consentChecker(true))) + ->dispatch(new ConversionsApiEventRaised(new Event(Event::EVENT_VIEW_CONTENT))); + } + + /** + * setono/tag-bag ^2.2 requires a renderer while ^2.5 defaults it. Every tag the bundle produces is content + * aware, so one renderer covers both ends of the supported range + */ + private static function tagBag(): TagBag + { + return new TagBag(new ContentAwareRenderer()); + } + + private static function requestEvent(): RequestEvent + { + return new RequestEvent(self::createStub(HttpKernelInterface::class), new Request(), HttpKernelInterface::MAIN_REQUEST); + } + + private static function consentChecker(bool $granted): ConsentCheckerInterface + { + return new class($granted) implements ConsentCheckerInterface { + public function __construct(private readonly bool $granted) + { + } + + public function isGranted(): bool + { + return $this->granted; + } + }; + } + + /** + * @param list $pixels + */ + private static function pixelProvider(array $pixels): PixelProviderInterface + { + return new class($pixels) implements PixelProviderInterface { + /** + * @param list $pixels + */ + public function __construct(private readonly array $pixels) + { + } + + public function getPixels(): array + { + return $this->pixels; + } + }; + } +} diff --git a/tests/Unit/EventSubscriber/FilterBotsSubscriberTest.php b/tests/Unit/EventSubscriber/FilterBotsSubscriberTest.php index 1b7ce24..446dfed 100644 --- a/tests/Unit/EventSubscriber/FilterBotsSubscriberTest.php +++ b/tests/Unit/EventSubscriber/FilterBotsSubscriberTest.php @@ -7,6 +7,7 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\TestCase; +use Psr\Log\LoggerInterface; use Setono\BotDetectionBundle\BotDetector\BotDetectorInterface; use Setono\MetaConversionsApi\Event\Event; use Setono\MetaConversionsApiBundle\Event\ConversionsApiEventRaised; @@ -61,6 +62,25 @@ static function () use (&$enriched): void { self::assertFalse($enriched); } + #[Test] + public function it_logs_why_the_event_was_dropped(): void + { + // 'why did my events stop showing up' is the number one support question, so a dropped event must say so + $logger = $this->createMock(LoggerInterface::class); + $logger->expects(self::once())->method('debug')->with(self::stringContains('bot')); + + (new FilterBotsSubscriber(self::botDetector(true), $logger))->filter(new ConversionsApiEventRaised(new Event(Event::EVENT_VIEW_CONTENT))); + } + + #[Test] + public function it_does_not_log_when_the_event_passes(): void + { + $logger = $this->createMock(LoggerInterface::class); + $logger->expects(self::never())->method(self::anything()); + + (new FilterBotsSubscriber(self::botDetector(false), $logger))->filter(new ConversionsApiEventRaised(new Event(Event::EVENT_VIEW_CONTENT))); + } + /** * An event raised from a console command or a message handler is not a request, so the bot check does not * apply to it diff --git a/tests/Unit/EventSubscriber/FilterConfiguredUserAgentsSubscriberTest.php b/tests/Unit/EventSubscriber/FilterConfiguredUserAgentsSubscriberTest.php index 8dfb110..5f38de5 100644 --- a/tests/Unit/EventSubscriber/FilterConfiguredUserAgentsSubscriberTest.php +++ b/tests/Unit/EventSubscriber/FilterConfiguredUserAgentsSubscriberTest.php @@ -7,6 +7,7 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\TestCase; +use Psr\Log\LoggerInterface; use Setono\MetaConversionsApi\Event\Event; use Setono\MetaConversionsApiBundle\Event\ConversionsApiEventRaised; use Setono\MetaConversionsApiBundle\EventSubscriber\FilterConfiguredUserAgentsSubscriber; @@ -40,6 +41,18 @@ public function it_does_not_stop_when_user_agent_does_not_match(): void self::assertFalse($event->isPropagationStopped()); } + #[Test] + public function it_logs_why_the_event_was_dropped(): void + { + $metaEvent = new Event(Event::EVENT_VIEW_CONTENT); + $metaEvent->userData->clientUserAgent = 'i_am_a_bot'; + + $logger = $this->createMock(LoggerInterface::class); + $logger->expects(self::once())->method('debug')->with(self::stringContains('user agent')); + + (new FilterConfiguredUserAgentsSubscriber(['i_am_a_bot'], $logger))->filter(new ConversionsApiEventRaised($metaEvent)); + } + #[Test] public function it_matches_case_insensitively(): void { diff --git a/tests/Unit/EventSubscriber/FilterEmptyUserAgentSubscriberTest.php b/tests/Unit/EventSubscriber/FilterEmptyUserAgentSubscriberTest.php index 8fb9921..3fc1ad3 100644 --- a/tests/Unit/EventSubscriber/FilterEmptyUserAgentSubscriberTest.php +++ b/tests/Unit/EventSubscriber/FilterEmptyUserAgentSubscriberTest.php @@ -8,6 +8,7 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\TestCase; +use Psr\Log\LoggerInterface; use Setono\MetaConversionsApi\Event\Event; use Setono\MetaConversionsApiBundle\Event\ConversionsApiEventRaised; use Setono\MetaConversionsApiBundle\EventSubscriber\FilterEmptyUserAgentSubscriber; @@ -51,6 +52,15 @@ public function it_does_not_stop_a_website_event_with_a_user_agent(): void self::assertFalse($event->isPropagationStopped()); } + #[Test] + public function it_logs_why_the_event_was_dropped(): void + { + $logger = $this->createMock(LoggerInterface::class); + $logger->expects(self::once())->method('debug')->with(self::stringContains('user agent')); + + (new FilterEmptyUserAgentSubscriber($logger))->filter(new ConversionsApiEventRaised(new Event(Event::EVENT_VIEW_CONTENT))); + } + /** * Events raised from a console command, a message handler or a webhook have no user agent by definition */ diff --git a/tests/Unit/EventSubscriber/StopPropagationIfNoPixelsHasBeenAddedSubscriberTest.php b/tests/Unit/EventSubscriber/StopPropagationIfNoPixelsHasBeenAddedSubscriberTest.php new file mode 100644 index 0000000..e076005 --- /dev/null +++ b/tests/Unit/EventSubscriber/StopPropagationIfNoPixelsHasBeenAddedSubscriberTest.php @@ -0,0 +1,50 @@ +filter($event); + + self::assertTrue($event->isPropagationStopped()); + } + + #[Test] + public function it_does_not_stop_when_a_pixel_has_been_added(): void + { + $metaEvent = new Event(Event::EVENT_VIEW_CONTENT); + $metaEvent->pixels = [new Pixel('1234', 's3cr3t')]; + + $event = new ConversionsApiEventRaised($metaEvent); + + (new StopPropagationIfNoPixelsHasBeenAddedSubscriber())->filter($event); + + self::assertFalse($event->isPropagationStopped()); + } + + #[Test] + public function it_logs_why_the_event_was_dropped(): void + { + $logger = $this->createMock(LoggerInterface::class); + $logger->expects(self::once())->method('debug')->with(self::stringContains('no pixels')); + + (new StopPropagationIfNoPixelsHasBeenAddedSubscriber($logger))->filter(new ConversionsApiEventRaised(new Event(Event::EVENT_VIEW_CONTENT))); + } +}