Passed
Pull Request — master (#3)
by
unknown
02:51
created

php$0 ➔ extendJobsDispatcher()   A

Complexity

Conditions 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

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