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

FriendsOfOpenTelemetry / opentelemetry-bundle / 7707420518

30 Jan 2024 06:55AM UTC coverage: 66.178% (+1.7%) from 64.527%
7707420518

Pull #38

github

gaelreyrol
wip
Pull Request #38: Refactor services injection

145 of 148 new or added lines in 9 files covered. (97.97%)

27 existing lines in 6 files now uncovered.

1444 of 2182 relevant lines covered (66.18%)

11.91 hits per line

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

74.47
/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
    {
36
        $loader = new PhpFileLoader($container, new FileLocator(dirname(__DIR__).'/Resources/config'));
12✔
37
        $loader->load('services.php');
12✔
38
        $loader->load('services_logs.php');
12✔
39
        $loader->load('services_metrics.php');
12✔
40
        $loader->load('services_traces.php');
12✔
41
        $loader->load('services_tracing_instrumentation.php');
12✔
42

43
        $this->loadService($mergedConfig['service'], $container);
12✔
44
        $this->loadInstrumentationParams($mergedConfig['instrumentation'], $container);
12✔
45

46
        (new OpenTelemetryTracesExtension())($mergedConfig['traces'], $container);
12✔
47
        (new OpenTelemetryMetricsExtension())($mergedConfig['metrics'], $container);
12✔
48
        (new OpenTelemetryLogsExtension())($mergedConfig['logs'], $container);
12✔
49

50
        $this->loadMonologHandlers($mergedConfig['logs'], $container);
12✔
51
    }
52

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

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

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

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

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

134
            //            $container->setParameter('monolog.handlers.open_telemetry', [
135
            //                'type' => 'service',
136
            //                'id' => $handlerId,
137
            //            ]);
138
        }
139
    }
140
}
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