From f004f2774a11b6a31707117f9fd52aa4d276918c Mon Sep 17 00:00:00 2001 From: Quentin Devos <4972091+Okhoshi@users.noreply.github.com> Date: Mon, 6 Nov 2023 14:59:20 +0100 Subject: [PATCH] Add configuration support for SamplingHandler Signed-off-by: Quentin Devos <4972091+Okhoshi@users.noreply.github.com> --- DependencyInjection/Configuration.php | 9 +++++++-- DependencyInjection/MonologExtension.php | 10 ++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 4a4cbe9b..bf67d015 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -366,6 +366,10 @@ * - [split_long_messages]: bool, defaults to false, split messages longer than 4096 bytes into multiple messages * - [delay_between_messages]: bool, defaults to false, adds a 1sec delay/sleep between sending split messages * + * - sampling: + * - handler: the wrapped handler's name + * - factor: the sampling factor (e.g. 10 means every ~10th record is sampled) + * * All handlers can also be marked with `nested: true` to make sure they are never added explicitly to the stack * * @author Jordi Boggiano @@ -591,6 +595,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->booleanNode('disable_notification')->defaultNull()->end() // telegram ->booleanNode('split_long_messages')->defaultFalse()->end() // telegram ->booleanNode('delay_between_messages')->defaultFalse()->end() // telegram + ->integerNode('factor')->defaultValue(1)->min(1)->end() // sampling ->arrayNode('tags') // loggly ->beforeNormalization() ->ifString() @@ -650,8 +655,8 @@ public function getConfigTreeBuilder(): TreeBuilder ->thenInvalid('Service handlers can not have a formatter configured in the bundle, you must reconfigure the service itself instead') ->end() ->validate() - ->ifTrue(function ($v) { return ('fingers_crossed' === $v['type'] || 'buffer' === $v['type'] || 'filter' === $v['type']) && empty($v['handler']); }) - ->thenInvalid('The handler has to be specified to use a FingersCrossedHandler or BufferHandler or FilterHandler') + ->ifTrue(function ($v) { return ('fingers_crossed' === $v['type'] || 'buffer' === $v['type'] || 'filter' === $v['type'] || 'sampling' === $v['type']) && empty($v['handler']); }) + ->thenInvalid('The handler has to be specified to use a FingersCrossedHandler or BufferHandler or FilterHandler or SamplingHandler') ->end() ->validate() ->ifTrue(function ($v) { return 'fingers_crossed' === $v['type'] && !empty($v['excluded_404s']) && !empty($v['activation_strategy']); }) diff --git a/DependencyInjection/MonologExtension.php b/DependencyInjection/MonologExtension.php index a20b558a..ca19c3a0 100644 --- a/DependencyInjection/MonologExtension.php +++ b/DependencyInjection/MonologExtension.php @@ -890,6 +890,15 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler $handler['bubble'], ]); break; + case 'sampling': + $nestedHandlerId = $this->getHandlerId($handler['handler']); + $this->markNestedHandler($nestedHandlerId); + + $definition->setArguments([ + new Reference($nestedHandlerId), + $handler['factor'], + ]); + break; // Handlers using the constructor of AbstractHandler without adding their own arguments case 'browser_console': @@ -990,6 +999,7 @@ private function getHandlerClassByType($handlerType) 'redis' => 'Monolog\Handler\RedisHandler', 'predis' => 'Monolog\Handler\RedisHandler', 'insightops' => 'Monolog\Handler\InsightOpsHandler', + 'sampling' => 'Monolog\Handler\SamplingHandler', ]; $v2HandlerTypesAdded = [