| 1 |
<?php |
| 2 |
|
| 3 |
declare (strict_types=1); |
| 4 |
namespace WCPOS\Vendor\Sentry\Serializer; |
| 5 |
|
| 6 |
use WCPOS\Vendor\Sentry\Event; |
| 7 |
use WCPOS\Vendor\Sentry\EventType; |
| 8 |
use WCPOS\Vendor\Sentry\Options; |
| 9 |
use WCPOS\Vendor\Sentry\Serializer\EnvelopItems\AttachmentItem; |
| 10 |
use WCPOS\Vendor\Sentry\Serializer\EnvelopItems\CheckInItem; |
| 11 |
use WCPOS\Vendor\Sentry\Serializer\EnvelopItems\ClientReportItem; |
| 12 |
use WCPOS\Vendor\Sentry\Serializer\EnvelopItems\EventItem; |
| 13 |
use WCPOS\Vendor\Sentry\Serializer\EnvelopItems\LogsItem; |
| 14 |
use WCPOS\Vendor\Sentry\Serializer\EnvelopItems\MetricsItem; |
| 15 |
use WCPOS\Vendor\Sentry\Serializer\EnvelopItems\ProfileItem; |
| 16 |
use WCPOS\Vendor\Sentry\Serializer\EnvelopItems\TransactionItem; |
| 17 |
use WCPOS\Vendor\Sentry\Tracing\DynamicSamplingContext; |
| 18 |
use WCPOS\Vendor\Sentry\Util\JSON; |
| 19 |
/** |
| 20 |
* This is a simple implementation of a serializer that takes in input an event |
| 21 |
* object and returns a serialized string ready to be sent off to Sentry. |
| 22 |
* |
| 23 |
* @internal |
| 24 |
*/ |
| 25 |
final class PayloadSerializer implements PayloadSerializerInterface |
| 26 |
{ |
| 27 |
/** |
| 28 |
* @var Options The SDK client options |
| 29 |
*/ |
| 30 |
private $options; |
| 31 |
public function __construct(Options $options) |
| 32 |
{ |
| 33 |
$this->options = $options; |
| 34 |
} |
| 35 |
/** |
| 36 |
* {@inheritdoc} |
| 37 |
*/ |
| 38 |
public function serialize(Event $event) : string |
| 39 |
{ |
| 40 |
$envelopeHeader = null; |
| 41 |
if ($event->getType() !== EventType::clientReport()) { |
| 42 |
// @see https://develop.sentry.dev/sdk/envelopes/#envelope-headers |
| 43 |
$envelopeHeader = ['sent_at' => \gmdate('Y-m-d\\TH:i:s\\Z'), 'dsn' => (string) $this->options->getDsn(), 'sdk' => $event->getSdkPayload()]; |
| 44 |
if ($event->getType()->requiresEventId()) { |
| 45 |
$envelopeHeader['event_id'] = (string) $event->getId(); |
| 46 |
} |
| 47 |
$dynamicSamplingContext = $event->getSdkMetadata('dynamic_sampling_context'); |
| 48 |
if ($dynamicSamplingContext instanceof DynamicSamplingContext) { |
| 49 |
$entries = $dynamicSamplingContext->getEntries(); |
| 50 |
if (!empty($entries)) { |
| 51 |
$envelopeHeader['trace'] = $entries; |
| 52 |
} |
| 53 |
} |
| 54 |
} |
| 55 |
$items = []; |
| 56 |
switch ($event->getType()) { |
| 57 |
case EventType::event(): |
| 58 |
$items[] = EventItem::toEnvelopeItem($event); |
| 59 |
foreach ($event->getAttachments() as $attachment) { |
| 60 |
$items[] = AttachmentItem::toAttachmentItem($attachment); |
| 61 |
} |
| 62 |
break; |
| 63 |
case EventType::transaction(): |
| 64 |
$items[] = TransactionItem::toEnvelopeItem($event); |
| 65 |
if ($event->getSdkMetadata('profile') !== null) { |
| 66 |
$items[] = ProfileItem::toEnvelopeItem($event); |
| 67 |
} |
| 68 |
foreach ($event->getAttachments() as $attachment) { |
| 69 |
$items[] = AttachmentItem::toAttachmentItem($attachment); |
| 70 |
} |
| 71 |
break; |
| 72 |
case EventType::checkIn(): |
| 73 |
$items[] = CheckInItem::toEnvelopeItem($event); |
| 74 |
break; |
| 75 |
case EventType::logs(): |
| 76 |
$items[] = LogsItem::toEnvelopeItem($event); |
| 77 |
break; |
| 78 |
case EventType::metrics(): |
| 79 |
$items[] = MetricsItem::toEnvelopeItem($event); |
| 80 |
break; |
| 81 |
case EventType::clientReport(): |
| 82 |
$items[] = ClientReportItem::toEnvelopeItem($event); |
| 83 |
break; |
| 84 |
} |
| 85 |
if ($envelopeHeader === null) { |
| 86 |
return \sprintf("{}\n%s", \implode("\n", \array_filter($items))); |
| 87 |
} |
| 88 |
return \sprintf("%s\n%s", JSON::encode($envelopeHeader), \implode("\n", \array_filter($items))); |
| 89 |
} |
| 90 |
} |
| 91 |
|