Passed
Pull Request — master (#19)
by
unknown
04:48 queued 01:58
created

SentryTraceLogTarget   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 47
Duplicated Lines 0 %

Test Coverage

Coverage 93.1%

Importance

Changes 0
Metric Value
eloc 31
dl 0
loc 47
ccs 27
cts 29
cp 0.931
rs 10
c 0
b 0
f 0
wmc 10

1 Method

Rating   Name   Duplication   Size   Complexity  
B export() 0 45 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Yii\Sentry\Tracing;
6
7
use Sentry\Tracing\SpanContext;
8
use Yiisoft\Log\Message;
9
use Yiisoft\Log\Target;
10
use Yiisoft\Yii\Sentry\Integration\Integration;
11
12
final class SentryTraceLogTarget extends Target
13
{
14 4
    protected function export(): void
15
    {
16 4
        array_map(function (Message $message): Message {
17
            /** @var array<string, mixed> $context */
18 4
            $context = $message->context();
19 4
            $category = (string)($context['category'] ?? 'log');
20 4
            $time = (float)($message->context()['time'] ?? microtime(true));
21 4
            unset($context['category'], $context['time']);
22
            if (
23 4
                array_key_exists('trace', $context)
24 4
                && empty($context['trace'])
25
            ) {
26 4
                unset($context['trace']);
27
            }
28 4
            if (!empty($context['memory']) && is_numeric($context['memory'])) {
29 4
                $context['memory'] = round(
30 4
                    ((float)$context['memory'] / (1024 * 1024)),
31
                    2
32
                ) . 'MB';
33
            }
34 4
            $parentSpan = Integration::currentTracingSpan();
35
36
            // If there is no tracing span active there is no need to handle the event
37 4
            if ($parentSpan === null) {
38 3
                return $message;
39
            }
40 1
            $spanContext = new SpanContext();
41 1
            if (isset($context['tags']) && is_array($context['tags'])) {
42
                /**  @psalm-suppress MixedArgumentTypeCoercion */
43
                $spanContext->setTags($context['tags']);
44
                unset($context['tags']);
45
            }
46 1
            $spanContext->setOp($category);
47 1
            $spanContext->setDescription($message->message());
48 1
            $spanContext->setStartTimestamp($time);
49 1
            $elapsed = empty($context['elapsed']) ? null : (float)$context['elapsed'];
50 1
            if ($elapsed) {
51 1
                $spanContext->setEndTimestamp($time + $elapsed);
52
            }
53 1
            $spanContext->setData($context);
54
55 1
            $parentSpan->startChild($spanContext);
56
57 1
            return $message;
58 4
        }, $this->getMessages());
59
    }
60
}
61