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

FriendsOfOpenTelemetry / opentelemetry-bundle / 7739220651

01 Feb 2024 09:44AM UTC coverage: 38.028% (-26.5%) from 64.527%
7739220651

Pull #38

github

gaelreyrol
wip
Pull Request #38: Refactor services injection

103 of 459 new or added lines in 44 files covered. (22.44%)

255 existing lines in 18 files now uncovered.

802 of 2109 relevant lines covered (38.03%)

8.63 hits per line

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

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

3
namespace FriendsOfOpenTelemetry\OpenTelemetryBundle\DependencyInjection;
4

5
use FriendsOfOpenTelemetry\OpenTelemetryBundle\OpenTelemetry\Exporter\ExporterOptionsInterface;
6
use FriendsOfOpenTelemetry\OpenTelemetryBundle\OpenTelemetry\Metric\ExemplarFilterEnum;
7
use Symfony\Component\DependencyInjection\ChildDefinition;
8
use Symfony\Component\DependencyInjection\ContainerBuilder;
9
use Symfony\Component\DependencyInjection\Reference;
10

11
/**
12
 * @phpstan-import-type ExporterOptions from ExporterOptionsInterface
13
 */
14
final class OpenTelemetryMetricsExtension
15
{
16
    /**
17
     * @var array<string, mixed>
18
     */
19
    private array $config;
20

21
    private ContainerBuilder $container;
22

23
    /**
24
     * @param array{
25
     *     default_meter?: string,
26
     *     meters: array<string, mixed>,
27
     *     exporters: array<string, mixed>,
28
     *     providers: array<string, mixed>
29
     * }|array<string, mixed> $config
30
     */
31
    public function __invoke(array $config, ContainerBuilder $container): void
32
    {
UNCOV
33
        $this->config = $config;
×
UNCOV
34
        $this->container = $container;
×
35

UNCOV
36
        foreach ($this->config['exporters'] as $name => $exporter) {
×
UNCOV
37
            $this->loadMetricExporter($name, $exporter);
×
38
        }
39

UNCOV
40
        foreach ($this->config['providers'] as $name => $provider) {
×
UNCOV
41
            $this->loadMetricProvider($name, $provider);
×
42
        }
43

UNCOV
44
        foreach ($this->config['meters'] as $name => $meter) {
×
UNCOV
45
            $this->loadMetricMeter($name, $meter);
×
46
        }
47

UNCOV
48
        $defaultMeter = null;
×
UNCOV
49
        if (0 < count($this->config['meters'])) {
×
UNCOV
50
            $defaultMeter = array_key_first($this->config['meters']);
×
51
        }
52

UNCOV
53
        if (null !== $defaultMeter) {
×
UNCOV
54
            $this->container->setAlias('open_telemetry.metrics.default_meter', new Reference(sprintf('open_telemetry.metrics.meters.%s', $defaultMeter)));
×
55
        }
56
    }
57

58
    /**
59
     * @param array{
60
     *     dsn: string,
61
     *     options?: ExporterOptions
62
     * } $options
63
     */
64
    private function loadMetricExporter(string $name, array $options): void
65
    {
NEW
66
        $dsn = $this->container->getDefinition('open_telemetry.exporter_dsn')->setArguments([$options['dsn']]);
×
NEW
67
        $exporterOptions = $this->container->getDefinition('open_telemetry.metric_exporter_options')->setArguments([$options['options'] ?? []]);
×
68

UNCOV
69
        $this->container
×
NEW
70
            ->setDefinition(
×
NEW
71
                sprintf('open_telemetry.metrics.exporters.%s', $name),
×
NEW
72
                new ChildDefinition('open_telemetry.metrics.exporter_interface'),
×
NEW
73
            )
×
NEW
74
            ->setArguments([$dsn, $exporterOptions]);
×
75
    }
76

77
    /**
78
     * @param array{
79
     *     type: string,
80
     *     exporter?: string,
81
     *     filter?: string
82
     * } $provider
83
     */
84
    private function loadMetricProvider(string $name, array $provider): void
85
    {
NEW
86
        $filter = $this->container->getDefinition('open_telemetry.metrics.exemplar_factory')->setArguments([$provider['filter'] ?? ExemplarFilterEnum::All->value]);
×
87

UNCOV
88
        $this->container
×
NEW
89
            ->setDefinition(
×
NEW
90
                sprintf('open_telemetry.metrics.providers.%s', $name),
×
NEW
91
                new ChildDefinition('open_telemetry.metrics.provider_interface'),
×
NEW
92
            )
×
NEW
93
            ->setFactory([new Reference(sprintf('open_telemetry.metrics.provider_factory.%s', $provider['type'])), 'createProvider'])
×
UNCOV
94
            ->setArguments([
×
NEW
95
                new Reference($provider['exporter'] ?? '', ContainerBuilder::NULL_ON_INVALID_REFERENCE),
×
NEW
96
                $filter,
×
UNCOV
97
            ]);
×
98
    }
99

100
    /**
101
     * @param array{
102
     *     provider: string,
103
     *     name?: string,
104
     *     version?: string,
105
     * } $meter
106
     */
107
    private function loadMetricMeter(string $name, array $meter): void
108
    {
UNCOV
109
        $this->container
×
NEW
110
            ->setDefinition(
×
NEW
111
                sprintf('open_telemetry.metrics.meters.%s', $name),
×
NEW
112
                new ChildDefinition('open_telemetry.metrics.meter')
×
NEW
113
            )
×
UNCOV
114
            ->setPublic(true)
×
NEW
115
            ->setFactory([new Reference($meter['provider']), 'getMeter'])
×
UNCOV
116
            ->setArguments([
×
UNCOV
117
                $meter['name'] ?? $this->container->getParameter('open_telemetry.bundle.name'),
×
UNCOV
118
                $meter['version'] ?? $this->container->getParameter('open_telemetry.bundle.version'),
×
UNCOV
119
            ]);
×
120
    }
121
}
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