Skip to content

Commit fc4d2e8

Browse files
tristanbesjderusse
authored andcommitted
Add Datadog monolog integration
1 parent 78eb259 commit fc4d2e8

File tree

3 files changed

+50
-6
lines changed

3 files changed

+50
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## 3.7.0 (xxxx-xx-xx)
22

3+
* Add support for `datadog` handler
34
* Use `ActivationStrategy` instead of `actionLevel` when available
45
* Register resettable processors (`ResettableInterface`) for autoconfiguration (tag: `kernel.reset`)
56
* Drop support for Symfony 3.4

DependencyInjection/Configuration.php

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,18 @@
326326
* - [level]: level name or int value, defaults to DEBUG
327327
* - [bubble]: bool, defaults to true
328328
*
329+
* - datadog:
330+
* - token: Api Key supplied by Datadog
331+
* - region: Region where Datadog data are hosted. Could be 'us' or 'eu'. Defaults to 'us'
332+
* - [app_name]: Application name used as the "source" Datadog attribute inside the DatadogFormatter. Defaults to null
333+
* - [system_name]: The system/machine name, used as the "host" Datadog attribute inside the DatadogFormatter. Defaults to null
334+
* - [environment]: The environment, used as the "env" Datadog attribute. Defaults to null
335+
* - [source]: This corresponds to the integration name: the technology from which the log originated. Must be one of the following list: https://app.datadoghq.eu/logs/pipelines/pipeline/library. If not set, the formatter uses 'php'.
336+
* - [logger_name]: Name of the logger, used as the "logger.name" Datadog attribute inside the DatadogFormatter. Defaults to 'monolog'
337+
* - [use_ssl]: whether or not SSL encryption should be used, defaults to true
338+
* - [level]: level name or int value, defaults to DEBUG
339+
* - [bubble]: bool, defaults to true
340+
*
329341
* - server_log:
330342
* - host: server log host. ex: 127.0.0.1:9911
331343
* - [level]: level name or int value, defaults to DEBUG
@@ -381,7 +393,7 @@ public function getConfigTreeBuilder()
381393
->scalarNode('priority')->defaultValue(0)->end()
382394
->scalarNode('level')->defaultValue('DEBUG')->end()
383395
->booleanNode('bubble')->defaultTrue()->end()
384-
->scalarNode('app_name')->defaultNull()->end()
396+
->scalarNode('app_name')->defaultNull()->end() // newrelic & datadog
385397
->booleanNode('include_stacktraces')->defaultFalse()->end()
386398
->booleanNode('process_psr_3_messages')->defaultNull()->end()
387399
->scalarNode('path')->defaultValue('%kernel.logs_dir%/%kernel.environment%.log')->end() // stream and rotating
@@ -472,10 +484,12 @@ public function getConfigTreeBuilder()
472484
->scalarNode('team')->end() // slackbot
473485
->scalarNode('notify')->defaultFalse()->end() // hipchat
474486
->scalarNode('nickname')->defaultValue('Monolog')->end() // hipchat
475-
->scalarNode('token')->end() // pushover & hipchat & loggly & logentries & flowdock & rollbar & slack & slackbot & insightops
476-
->scalarNode('region')->end() // insightops
477-
->scalarNode('source')->end() // flowdock
478-
->booleanNode('use_ssl')->defaultTrue()->end() // logentries & hipchat & insightops
487+
->scalarNode('token')->end() // pushover & hipchat & loggly & logentries & flowdock & rollbar & slack & slackbot & insightops & datadog
488+
->scalarNode('region')->end() // insightops & datadog
489+
->scalarNode('source')->end() // flowdock & datadog
490+
->scalarNode('system_name')->defaultNull()->end() // datadog
491+
->scalarNode('logger_name')->defaultValue('monolog')->end() // datadog
492+
->booleanNode('use_ssl')->defaultTrue()->end() // logentries & hipchat & insightops & datadog
479493
->variableNode('user') // pushover
480494
->validate()
481495
->ifTrue(function ($v) {
@@ -643,7 +657,7 @@ public function getConfigTreeBuilder()
643657
->scalarNode('client_id')->defaultNull()->end() // raven_handler, sentry_handler
644658
->scalarNode('auto_log_stacks')->defaultFalse()->end() // raven_handler
645659
->scalarNode('release')->defaultNull()->end() // raven_handler, sentry_handler
646-
->scalarNode('environment')->defaultNull()->end() // raven_handler, sentry_handler
660+
->scalarNode('environment')->defaultNull()->end() // raven_handler, sentry_handler, datadog
647661
->scalarNode('message_type')->defaultValue(0)->end() // error_log
648662
->arrayNode('tags') // loggly
649663
->beforeNormalization()
@@ -923,6 +937,10 @@ public function getConfigTreeBuilder()
923937
->ifTrue(function ($v) { return 'insightops' === $v['type'] && empty($v['token']); })
924938
->thenInvalid('The token has to be specified to use a InsightOpsHandler')
925939
->end()
940+
->validate()
941+
->ifTrue(function ($v) { return 'datadog' === $v['type'] && empty($v['token']); })
942+
->thenInvalid('The token (Api Key) has to be specified to use a DatadogHandler')
943+
->end()
926944
->validate()
927945
->ifTrue(function ($v) { return 'flowdock' === $v['type'] && empty($v['token']); })
928946
->thenInvalid('The token has to be specified to use a FlowdockHandler')

DependencyInjection/MonologExtension.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -884,6 +884,30 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler
884884
$handler['bubble'],
885885
]);
886886
break;
887+
case 'datadog':
888+
$definition->setArguments([
889+
$handler['token'],
890+
$handler['region'] ? $handler['region'] : 'us',
891+
$handler['use_ssl'],
892+
$handler['level'],
893+
$handler['bubble'],
894+
]);
895+
896+
if (empty($handler['formatter'])) {
897+
$formatter = new Definition('Monolog\Formatter\DatadogFormatter', [
898+
$handler['app_name'],
899+
$handler['system_name'],
900+
$handler['environment'],
901+
isset($handler['source']) ? $handler['source'] : 'php',
902+
$handler['logger_name'],
903+
]);
904+
$formatterId = 'monolog.datadog.formatter';
905+
$formatter->setPublic(false);
906+
$container->setDefinition($formatterId, $formatter);
907+
908+
$definition->addMethodCall('setFormatter', [new Reference($formatterId)]);
909+
}
910+
break;
887911

888912
// Handlers using the constructor of AbstractHandler without adding their own arguments
889913
case 'browser_console':
@@ -983,6 +1007,7 @@ private function getHandlerClassByType($handlerType)
9831007
'redis' => 'Monolog\Handler\RedisHandler',
9841008
'predis' => 'Monolog\Handler\RedisHandler',
9851009
'insightops' => 'Monolog\Handler\InsightOpsHandler',
1010+
'datadog' => 'Monolog\Handler\DatadogHandler',
9861011
];
9871012

9881013
$v2HandlerTypesAdded = [

0 commit comments

Comments
 (0)