File "TransactionItem.php"
Full Path: /var/www/drive/sentry/sentry/src/Serializer/TransactionItem.php
File size: 6.37 KB
MIME-type: text/x-php
Charset: utf-8
<?php
declare(strict_types=1);
namespace Sentry\Serializer\EnvelopItems;
use Sentry\Event;
use Sentry\Serializer\Traits\BreadcrumbSeralizerTrait;
use Sentry\Tracing\Span;
use Sentry\Tracing\TransactionMetadata;
use Sentry\Util\JSON;
/**
* @internal
*
* @phpstan-type MetricsSummary array{
* min: int|float,
* max: int|float,
* sum: int|float,
* count: int,
* tags: array<string>,
* }
*/
class TransactionItem implements EnvelopeItemInterface
{
use BreadcrumbSeralizerTrait;
public static function toEnvelopeItem(Event $event): string
{
$header = [
'type' => (string) $event->getType(),
'content_type' => 'application/json',
];
$payload = [
'timestamp' => $event->getTimestamp(),
'platform' => 'php',
'sdk' => [
'name' => $event->getSdkIdentifier(),
'version' => $event->getSdkVersion(),
],
];
if ($event->getStartTimestamp() !== null) {
$payload['start_timestamp'] = $event->getStartTimestamp();
}
if ($event->getLevel() !== null) {
$payload['level'] = (string) $event->getLevel();
}
if ($event->getTransaction() !== null) {
$payload['transaction'] = $event->getTransaction();
}
if ($event->getServerName() !== null) {
$payload['server_name'] = $event->getServerName();
}
if ($event->getRelease() !== null) {
$payload['release'] = $event->getRelease();
}
if ($event->getEnvironment() !== null) {
$payload['environment'] = $event->getEnvironment();
}
if (!empty($event->getFingerprint())) {
$payload['fingerprint'] = $event->getFingerprint();
}
if (!empty($event->getModules())) {
$payload['modules'] = $event->getModules();
}
if (!empty($event->getExtra())) {
$payload['extra'] = $event->getExtra();
}
if (!empty($event->getTags())) {
$payload['tags'] = $event->getTags();
}
$user = $event->getUser();
if ($user !== null) {
$payload['user'] = array_merge($user->getMetadata(), [
'id' => $user->getId(),
'username' => $user->getUsername(),
'email' => $user->getEmail(),
'ip_address' => $user->getIpAddress(),
'segment' => $user->getSegment(),
]);
}
$osContext = $event->getOsContext();
if ($osContext !== null) {
$payload['contexts']['os'] = [
'name' => $osContext->getName(),
'version' => $osContext->getVersion(),
'build' => $osContext->getBuild(),
'kernel_version' => $osContext->getKernelVersion(),
];
}
$runtimeContext = $event->getRuntimeContext();
if ($runtimeContext !== null) {
$payload['contexts']['runtime'] = [
'name' => $runtimeContext->getName(),
'sapi' => $runtimeContext->getSAPI(),
'version' => $runtimeContext->getVersion(),
];
}
if (!empty($event->getContexts())) {
$payload['contexts'] = array_merge($payload['contexts'] ?? [], $event->getContexts());
}
if (!empty($event->getBreadcrumbs())) {
$payload['breadcrumbs']['values'] = array_map([self::class, 'serializeBreadcrumb'], $event->getBreadcrumbs());
}
if (!empty($event->getRequest())) {
$payload['request'] = $event->getRequest();
}
$payload['spans'] = array_values(array_map([self::class, 'serializeSpan'], $event->getSpans()));
if (!empty($event->getMetricsSummary())) {
$payload['_metrics_summary'] = self::serializeMetricsSummary($event->getMetricsSummary());
}
$transactionMetadata = $event->getSdkMetadata('transaction_metadata');
if ($transactionMetadata instanceof TransactionMetadata) {
$payload['transaction_info']['source'] = (string) $transactionMetadata->getSource();
}
return sprintf("%s\n%s", JSON::encode($header), JSON::encode($payload));
}
/**
* @return array<string, mixed>
*
* @psalm-return array{
* span_id: string,
* trace_id: string,
* parent_span_id?: string,
* start_timestamp: float,
* timestamp?: float,
* status?: string,
* description?: string,
* op?: string,
* data?: array<string, mixed>,
* tags?: array<string, string>
* _metrics_summary?: array<string, mixed>
* }
*/
protected static function serializeSpan(Span $span): array
{
$result = [
'span_id' => (string) $span->getSpanId(),
'trace_id' => (string) $span->getTraceId(),
'start_timestamp' => $span->getStartTimestamp(),
];
if ($span->getParentSpanId() !== null) {
$result['parent_span_id'] = (string) $span->getParentSpanId();
}
if ($span->getEndTimestamp() !== null) {
$result['timestamp'] = $span->getEndTimestamp();
}
if ($span->getStatus() !== null) {
$result['status'] = (string) $span->getStatus();
}
if ($span->getDescription() !== null) {
$result['description'] = $span->getDescription();
}
if ($span->getOp() !== null) {
$result['op'] = $span->getOp();
}
if (!empty($span->getData())) {
$result['data'] = $span->getData();
}
if (!empty($span->getTags())) {
$result['tags'] = $span->getTags();
}
if (!empty($span->getMetricsSummary())) {
$result['_metrics_summary'] = self::serializeMetricsSummary($span->getMetricsSummary());
}
return $result;
}
/**
* @param array<string, array<string, MetricsSummary>> $metricsSummary
*
* @return array<string, mixed>
*/
protected static function serializeMetricsSummary(array $metricsSummary): array
{
$formattedSummary = [];
foreach ($metricsSummary as $mri => $metrics) {
foreach ($metrics as $metric) {
$formattedSummary[$mri][] = $metric;
}
}
return $formattedSummary;
}
}