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

FriendsOfOpenTelemetry / opentelemetry-bundle / 7651959499

25 Jan 2024 08:44AM UTC coverage: 64.731% (-12.5%) from 77.211%
7651959499

push

github

gaelreyrol
fix(github/ci): set XDEBUG_MODE to coverage in phpunit job

1349 of 2084 relevant lines covered (64.73%)

11.94 hits per line

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

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

40
        $this->loadService($mergedConfig['service'], $container);
12✔
41
        $this->loadInstrumentationParams($mergedConfig['instrumentation'], $container);
12✔
42

43
        (new OpenTelemetryTracesExtension())($mergedConfig['traces'], $container);
12✔
44
        (new OpenTelemetryMetricsExtension())($mergedConfig['metrics'], $container);
12✔
45
        (new OpenTelemetryLogsExtension())($mergedConfig['logs'], $container);
12✔
46

47
        $this->loadMonologHandlers($mergedConfig['logs'], $container);
12✔
48
    }
49

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

66
    /**
67
     * @param array{
68
     *     cache: InstrumentationConfig,
69
     *     console: InstrumentationConfig,
70
     *     doctrine: InstrumentationConfig,
71
     *     http_client: InstrumentationConfig,
72
     *     http_kernel: InstrumentationConfig,
73
     *     mailer: InstrumentationConfig,
74
     *     messenger: InstrumentationConfig,
75
     *     twig: InstrumentationConfig,
76
     * } $config
77
     */
78
    private function loadInstrumentationParams(array $config, ContainerBuilder $container): void
79
    {
80
        foreach ($config as $name => $instrumentation) {
12✔
81
            $container->setParameter(
12✔
82
                sprintf('open_telemetry.instrumentation.%s.enabled', $name),
12✔
83
                $instrumentation['enabled'],
12✔
84
            );
12✔
85
            $container->setParameter(
12✔
86
                sprintf('open_telemetry.instrumentation.%s.tracing.enabled', $name),
12✔
87
                $instrumentation['tracing']['enabled'],
12✔
88
            );
12✔
89
            $container->setParameter(
12✔
90
                sprintf('open_telemetry.instrumentation.%s.tracing.request_headers', $name),
12✔
91
                $instrumentation['tracing']['request_headers'],
12✔
92
            );
12✔
93
            $container->setParameter(
12✔
94
                sprintf('open_telemetry.instrumentation.%s.tracing.response_headers', $name),
12✔
95
                $instrumentation['tracing']['response_headers'],
12✔
96
            );
12✔
97
            $container->setParameter(
12✔
98
                sprintf('open_telemetry.instrumentation.%s.metering.enabled', $name),
12✔
99
                $instrumentation['metering']['enabled'],
12✔
100
            );
12✔
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
    {
116
        if (false === $config['monolog']['enabled']) {
12✔
117
            return;
12✔
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([
×
130
                    '$loggerProvider' => new Reference(sprintf('open_telemetry.logs.providers.%s', $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

© 2025 Coveralls, Inc