Issues (6)

src/Builder/TransactionBuilder.php (1 issue)

Severity
1
<?php
2
3
namespace SamuelBednarcik\ElasticAPMAgent\Builder;
4
5
use SamuelBednarcik\ElasticAPMAgent\Events\Transaction;
6
use SamuelBednarcik\ElasticAPMAgent\Exception\InvalidTraceContextHeaderException;
7
use SamuelBednarcik\ElasticAPMAgent\TraceParent;
8
use Symfony\Component\HttpFoundation\Request;
9
use Symfony\Component\HttpFoundation\Response;
10
11
class TransactionBuilder extends AbstractEventBuilder
12
{
13
    /**
14
     * @param Request|null $request
15
     * @return Transaction
16
     * @throws \Exception
17
     */
18
    public static function buildFromRequest(Request $request = null): Transaction
19
    {
20
        if ($request === null) {
21
            $request = Request::createFromGlobals();
22
        }
23
24
        $transaction = new Transaction();
25
        $transaction->setName($request->getMethod() . ' ' . $request->getPathInfo());
26
        $transaction->setTimestamp($request->server->get('REQUEST_TIME_FLOAT') * 1000000);
27
        $transaction->setType(Transaction::TYPE_REQUEST);
28
        $transaction->setId(self::generateRandomBitsInHex(self::TRANSACTION_ID_SIZE));
29
30
        /** @var string|null $traceparentHeader */
31
        $traceparentHeader = $request->headers->get(TraceParent::HEADER_NAME, null, true);
32
33
        if ($traceparentHeader !== null) {
0 ignored issues
show
The condition $traceparentHeader !== null is always true.
Loading history...
34
            try {
35
                $traceParent = TraceParent::createFromHeader($traceparentHeader);
36
                $transaction->setTraceId($traceParent->getTraceId());
37
                $transaction->setParentId($traceParent->getSpanId());
38
            } catch (InvalidTraceContextHeaderException $e) {
39
                $transaction->setTraceId(self::generateRandomBitsInHex(self::TRACE_ID_SIZE));
40
            }
41
        } else {
42
            $transaction->setTraceId(self::generateRandomBitsInHex(self::TRACE_ID_SIZE));
43
        }
44
45
        return $transaction;
46
    }
47
48
    /**
49
     * @param Response $response
50
     * @return string
51
     */
52
    public static function getResultStringFromResponse(Response $response): string
53
    {
54
        return sprintf(
55
            'HTTP/%s %s %s',
56
            $response->getProtocolVersion(),
57
            $response->getStatusCode(),
58
            Response::$statusTexts[$response->getStatusCode()]
59
        );
60
    }
61
62
    /**
63
     * @param float $now Current unix timestamp in microseconds
64
     * @param float $transactionTimestamp
65
     * @return float
66
     */
67
    public static function calculateDuration(float $now, float $transactionTimestamp): float
68
    {
69
        return round(($now - $transactionTimestamp) / 1000, 3);
70
    }
71
}
72