Passed
Pull Request — master (#8)
by
unknown
03:37 queued 48s
created

php$0 ➔ configureFakeTracer()   A

Complexity

Conditions 1

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 17
rs 9.7
cc 1

2 Methods

Rating   Name   Duplication   Size   Complexity  
A JaravelServiceProvider::configureFakeTracer() 0 3 1
A JaravelServiceProvider::extendJobsDispatcher() 0 5 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 OpenTelemetry\API\Trace\NoopTracer;
15
use OpenTelemetry\API\Trace\TracerInterface;
16
use OpenTelemetry\Contrib\Jaeger\AgentExporter;
17
use OpenTelemetry\SDK\Common\Time\SystemClock;
18
use OpenTelemetry\SDK\Common\Util\ShutdownHandler;
19
use OpenTelemetry\SDK\Trace\Span;
20
use OpenTelemetry\SDK\Trace\SpanProcessor\BatchSpanProcessor;
21
use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;
22
use OpenTelemetry\SDK\Trace\TracerProvider;
23
use Umbrellio\Jaravel\Listeners\ConsoleCommandFinishedListener;
24
use Umbrellio\Jaravel\Listeners\ConsoleCommandStartedListener;
25
use Umbrellio\Jaravel\Services\ConsoleCommandFilter;
26
use Umbrellio\Jaravel\Services\Job\JobWithTracingInjectionDispatcher;
27
28
class JaravelServiceProvider extends ServiceProvider
29
{
30
    public function boot()
31
    {
32
        $config = __DIR__ . '/config/jaravel.php';
33
34
        $this->publishes([
35
            $config => base_path('config/jaravel.php'),
36
        ], 'config');
37
38
        if (!ConfigRepository::get('jaravel.enabled', false)) {
39
            $this->configureFakeTracer();
40
41
            return;
42
        }
43
44
        $this->configureTracer();
45
46
        $this->listenLogs();
47
        $this->listenConsoleEvents();
48
        $this->extendJobsDispatcher();
49
    }
50
51
    public function configureFakeTracer(): void
52
    {
53
        $this->app->instance(TracerInterface::class, NoopTracer::getInstance());
54
    }
55
56
    public function extendJobsDispatcher(): void
57
    {
58
        $dispatcher = $this->app->make(Dispatcher::class);
59
        $this->app->extend(Dispatcher::class, function () use ($dispatcher) {
60
            return $this->app->make(JobWithTracingInjectionDispatcher::class, compact('dispatcher'));
61
        });
62
    }
63
64
    private function configureTracer(): void
65
    {
66
        if ($tracerCallable = ConfigRepository::get('jaravel.custom_tracer_callable', null)) {
67
            $this->app->singleton(TracerInterface::class, $tracerCallable);
68
69
            return;
70
        }
71
72
        $host = ConfigRepository::get('jaravel.agent_host', '127.0.0.1');
73
        $port = ConfigRepository::get('jaravel.agent_port', 6832);
74
        $tracerName = ConfigRepository::get('jaravel.tracer_name', 'application');
75
        $exporter = new AgentExporter($tracerName, "{$host}:{$port}");
76
77
        $tracerProvider = new TracerProvider(new SimpleSpanProcessor($exporter));
78
        ShutdownHandler::register([$tracerProvider, 'shutdown']);
79
        $tracer = $tracerProvider->getTracer($tracerName);
80
81
        $this->app->instance(TracerInterface::class, $tracer);
82
    }
83
84
    private function listenLogs(): void
85
    {
86
        if (!ConfigRepository::get('jaravel.logs_enabled', true)) {
87
            return;
88
        }
89
90
        Event::listen(MessageLogged::class, function (MessageLogged $e) {
91
            $span = Span::getCurrent();
92
93
            $span->addEvent('Log', [
94
                'message' => $e->message,
95
                'context' => $e->context,
96
                'level' => $e->level,
97
            ]);
98
        });
99
    }
100
101
    private function listenConsoleEvents(): void
102
    {
103
        if (!$this->app->runningInConsole()) {
104
            return;
105
        }
106
107
        /** @var ConsoleCommandFilter $filter */
108
        $filter = $this->app->make(ConsoleCommandFilter::class);
109
110
        if (!$filter->allow()) {
111
            return;
112
        }
113
114
        Event::listen(
115
            CommandStarting::class,
116
            ConfigRepository::get('jaravel.console.listeners.started', ConsoleCommandStartedListener::class)
117
        );
118
119
        Event::listen(
120
            CommandFinished::class,
121
            ConfigRepository::get('jaravel.console.listeners.finished', ConsoleCommandFinishedListener::class)
122
        );
123
    }
124
}
125