• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

FriendsOfOpenTelemetry / opentelemetry-bundle / 7745013499

01 Feb 2024 05:11PM UTC coverage: 38.549% (-26.0%) from 64.527%
7745013499

Pull #38

github

gaelreyrol
wip
Pull Request #38: Refactor services injection

114 of 459 new or added lines in 44 files covered. (24.84%)

255 existing lines in 18 files now uncovered.

813 of 2109 relevant lines covered (38.55%)

8.96 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/DependencyInjection/OpenTelemetryExtension.php
1
<?php
2

3
namespace FriendsOfOpenTelemetry\OpenTelemetryBundle\DependencyInjection;
4

5
use Monolog\Level;
6
use OpenTelemetry\Contrib\Logs\Monolog\Handler;
7
use Symfony\Component\Config\FileLocator;
8
use Symfony\Component\DependencyInjection\ChildDefinition;
9
use Symfony\Component\DependencyInjection\ContainerBuilder;
10
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
11
use Symfony\Component\DependencyInjection\Reference;
12
use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension;
13

14
/**
15
 * @phpstan-type InstrumentationConfig array{
16
 *     enabled: bool,
17
 *     tracing: TracingInstrumentationConfig,
18
 *     metering: MeteringInstrumentationConfig,
19
 * }
20
 * @phpstan-type TracingInstrumentationConfig array{
21
 *     enabled: bool,
22
 *     tracer: string,
23
 *     request_headers: array<string, mixed>,
24
 *     response_headers: array<string, mixed>,
25
 * }
26
 * @phpstan-type MeteringInstrumentationConfig array{
27
 *     enabled: bool,
28
 *     meter: string,
29
 * }
30
 */
31
final class OpenTelemetryExtension extends ConfigurableExtension
32
{
33
    /** @phpstan-ignore-next-line */
34
    protected function loadInternal(array $mergedConfig, ContainerBuilder $container): void
35
    {
UNCOV
36
        $loader = new PhpFileLoader($container, new FileLocator(dirname(__DIR__).'/Resources/config'));
×
UNCOV
37
        $loader->load('services.php');
×
NEW
38
        $loader->load('services_transports.php');
×
NEW
39
        $loader->load('services_logs.php');
×
NEW
40
        $loader->load('services_metrics.php');
×
NEW
41
        $loader->load('services_traces.php');
×
UNCOV
42
        $loader->load('services_tracing_instrumentation.php');
×
43

NEW
44
        $this->loadServiceParams($mergedConfig['service'], $container);
×
UNCOV
45
        $this->loadInstrumentationParams($mergedConfig['instrumentation'], $container);
×
46

UNCOV
47
        (new OpenTelemetryTracesExtension())($mergedConfig['traces'], $container);
×
UNCOV
48
        (new OpenTelemetryMetricsExtension())($mergedConfig['metrics'], $container);
×
UNCOV
49
        (new OpenTelemetryLogsExtension())($mergedConfig['logs'], $container);
×
50

UNCOV
51
        $this->loadMonologHandlers($mergedConfig['logs'], $container);
×
52
    }
53

54
    /**
55
     * @param array{
56
     *     namespace: string,
57
     *     name: string,
58
     *     version: string,
59
     *     environment: string
60
     * } $config
61
     */
62
    private function loadServiceParams(array $config, ContainerBuilder $container): void
63
    {
UNCOV
64
        $container->setParameter('open_telemetry.service.namespace', $config['namespace']);
×
UNCOV
65
        $container->setParameter('open_telemetry.service.name', $config['name']);
×
UNCOV
66
        $container->setParameter('open_telemetry.service.version', $config['version']);
×
UNCOV
67
        $container->setParameter('open_telemetry.service.environment', $config['environment']);
×
68
    }
69

70
    /**
71
     * @param array{
72
     *     cache: InstrumentationConfig,
73
     *     console: InstrumentationConfig,
74
     *     doctrine: InstrumentationConfig,
75
     *     http_client: InstrumentationConfig,
76
     *     http_kernel: InstrumentationConfig,
77
     *     mailer: InstrumentationConfig,
78
     *     messenger: InstrumentationConfig,
79
     *     twig: InstrumentationConfig,
80
     * } $config
81
     */
82
    private function loadInstrumentationParams(array $config, ContainerBuilder $container): void
83
    {
UNCOV
84
        foreach ($config as $name => $instrumentation) {
×
UNCOV
85
            $container->setParameter(
×
UNCOV
86
                sprintf('open_telemetry.instrumentation.%s.tracing.enabled', $name),
×
UNCOV
87
                $instrumentation['tracing']['enabled'],
×
UNCOV
88
            );
×
UNCOV
89
            $container->setParameter(
×
UNCOV
90
                sprintf('open_telemetry.instrumentation.%s.tracing.request_headers', $name),
×
UNCOV
91
                $instrumentation['tracing']['request_headers'],
×
UNCOV
92
            );
×
UNCOV
93
            $container->setParameter(
×
UNCOV
94
                sprintf('open_telemetry.instrumentation.%s.tracing.response_headers', $name),
×
UNCOV
95
                $instrumentation['tracing']['response_headers'],
×
UNCOV
96
            );
×
UNCOV
97
            $container->setParameter(
×
UNCOV
98
                sprintf('open_telemetry.instrumentation.%s.metering.enabled', $name),
×
UNCOV
99
                $instrumentation['metering']['enabled'],
×
UNCOV
100
            );
×
101
        }
102
    }
103

104
    /**
105
     * @param array{
106
     *     default_logger?: string,
107
     *     monolog: array{enabled: bool, handlers: array<array{handler: string, provider: string, level: string, bubble: bool}>},
108
     *     loggers: array<string, mixed>,
109
     *     exporters: array<string, mixed>,
110
     *     processors: array<string, mixed>,
111
     *     providers: array<string, mixed>
112
     * } $config
113
     */
114
    private function loadMonologHandlers(array $config, ContainerBuilder $container): void
115
    {
UNCOV
116
        if (false === $config['monolog']['enabled']) {
×
UNCOV
117
            return;
×
118
        }
119

120
        if (!class_exists(Handler::class)) {
×
121
            throw new \LogicException('To configure the Monolog handler, you must first install the open-telemetry/opentelemetry-logger-monolog package.');
×
122
        }
123

124
        foreach ($config['monolog']['handlers'] as $name => $handler) {
×
125
            $handlerId = sprintf('open_telemetry.logs.monolog.handlers.%s', $name);
×
126
            $container
×
127
                ->setDefinition($handlerId, new ChildDefinition('open_telemetry.logs.monolog.handler'))
×
128
                ->setPublic(true)
×
129
                ->setArguments([
×
NEW
130
                    '$loggerProvider' => new Reference($handler['provider']),
×
131
                    '$level' => Level::fromName(ucfirst($handler['level'])),
×
132
                    '$bubble' => $handler['bubble'],
×
133
                ]);
×
134

135
            //            $container->setParameter('monolog.handlers.open_telemetry', [
136
            //                'type' => 'service',
137
            //                'id' => $handlerId,
138
            //            ]);
139
        }
140
    }
141
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc