Passed
Pull Request — master (#3)
by
unknown
14:26
created

JaravelServiceProvider.php$0 ➔ getHostName()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 3
rs 10
cc 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Umbrellio\Jaravel;
6
7
use Illuminate\Console\Events\CommandFinished;
8
use Illuminate\Console\Events\CommandStarting;
9
use Illuminate\Contracts\Bus\Dispatcher;
10
use Illuminate\Log\Events\MessageLogged;
11
use Illuminate\Support\Facades\Config as ConfigRepository;
12
use Illuminate\Support\Facades\Event;
13
use Illuminate\Support\ServiceProvider;
14
use Jaeger;
15
use Jaeger\Config;
16
use Jaeger\Reporter\InMemoryReporter;
17
use Jaeger\Sampler\ConstSampler;
18
use Jaeger\ScopeManager;
19
use OpenTracing\GlobalTracer;
20
use OpenTracing\Tracer;
21
use Umbrellio\Jaravel\Listeners\ConsoleCommandFinishedListener;
22
use Umbrellio\Jaravel\Listeners\ConsoleCommandStartedListener;
23
use Umbrellio\Jaravel\Services\ConsoleCommandFilter;
24
use Umbrellio\Jaravel\Services\Job\JobWithTracingInjectionDispatcher;
25
26
class JaravelServiceProvider extends ServiceProvider
27
{
28
    public function boot()
29
    {
30
        $config = __DIR__ . '/config/jaravel.php';
31
32
        $this->publishes([
33
            $config => base_path('config/jaravel.php'),
34
        ], 'config');
35
36
        if (!ConfigRepository::get('jaravel.enabled', false)) {
37
            $this->configureFakeTracer();
38
39
            return;
40
        }
41
42
        $this->configureTracer();
43
44
        $this->listenLogs();
45
        $this->listenConsoleEvents();
46
        $this->extendJobsDispatcher();
47
    }
48
49
    public function configureFakeTracer(): void
50
    {
51
        $tracer = new class(
52
            'fake-tracer',
53
            new InMemoryReporter(),
54
            new ConstSampler(),
55
            new ScopeManager()) extends \Jaeger\Tracer {
0 ignored issues
show
Bug introduced by
new Jaeger\ScopeManager() of type Jaeger\ScopeManager is incompatible with the type boolean expected by parameter $oneSpanPerRpc of anonymous//src/JaravelSe...er.php$0::__construct(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

55
            /** @scrutinizer ignore-type */ new ScopeManager()) extends \Jaeger\Tracer {
Loading history...
56
57
            protected function getHostName()
58
            {
59
                return null;
60
            }
61
        };
62
63
        $this->app->instance(Tracer::class, $tracer);
64
    }
65
66
    public function extendJobsDispatcher(): void
67
    {
68
        $dispatcher = $this->app->make(Dispatcher::class);
69
        $this->app->extend(Dispatcher::class, function () use ($dispatcher) {
70
            return $this->app->make(JobWithTracingInjectionDispatcher::class, [
71
                'dispatcher' => $dispatcher,
72
            ]);
73
        });
74
    }
75
76
    private function configureTracer(): void
77
    {
78
        if ($tracerCallable = ConfigRepository::get('jaravel.custom_tracer_callable', null)) {
79
            $this->app->singleton(Tracer::class, $tracerCallable);
80
81
            return;
82
        }
83
84
        $config = new Config(
85
            [
86
                'sampler' => [
87
                    'type' => Jaeger\SAMPLER_TYPE_CONST,
88
                    'param' => true,
89
                ],
90
                'logging' => false,
91
                "local_agent" => [
92
                    "reporting_host" => ConfigRepository::get('jaravel.agent_host', '127.0.0.1'),
93
                    "reporting_port" => ConfigRepository::get('jaravel.agent_port', 6831),
94
                ],
95
            ],
96
            ConfigRepository::get('jaravel.tracer_name', 'application'),
97
        );
98
99
        $config->initializeTracer();
100
101
        $tracer = GlobalTracer::get();
102
103
        $this->app->instance(Tracer::class, $tracer);
104
    }
105
106
    private function listenLogs(): void
107
    {
108
        if (!ConfigRepository::get('jaravel.logs_enabled', true)) {
109
            return;
110
        }
111
112
        Event::listen(MessageLogged::class, function (MessageLogged $e) {
113
            $span = $this->app->make(Tracer::class)->getActiveSpan();
114
            if (!$span) {
115
                return;
116
            }
117
118
            $span->log([
119
                'message' => $e->message,
120
                'context' => $e->context,
121
                'level' => $e->level,
122
            ]);
123
        });
124
    }
125
126
    private function listenConsoleEvents(): void
127
    {
128
        if (!$this->app->runningInConsole()) {
129
            return;
130
        }
131
132
        /** @var ConsoleCommandFilter $filter */
133
        $filter = $this->app->make(ConsoleCommandFilter::class);
134
135
        if (!$filter->allow()) {
136
            return;
137
        }
138
139
        Event::listen(
140
            CommandStarting::class,
141
            ConfigRepository::get('jaravel.console.listeners.started', ConsoleCommandStartedListener::class)
142
        );
143
144
        Event::listen(
145
            CommandFinished::class,
146
            ConfigRepository::get('jaravel.console.listeners.finished', ConsoleCommandFinishedListener::class)
147
        );
148
    }
149
}
150