插桩队列

了解如何手动插桩您的代码以使用 Sentry 的 Queues 模块。

Sentry 提供了一个 队列监控仪表板,可以通过我们的 Laravel SDK 自动插桩。

如果您使用的是其他工具,可以手动插桩您的队列生产者和消费者,以确保您有关于消息队列的性能数据。

将您的队列生产者代码包装在一个跨度中。您的跨度 op 必须设置为 queue.publish。包含以下跨度数据以丰富生产者跨度的额外指标:

数据属性类型描述
messaging.message.idstring消息标识符
messaging.destination.namestring队列或主题名称
messaging.message.body.sizeint消息体大小(字节)

确保在创建跨度时有一个事务正在运行。更多信息请参阅 追踪

您还必须在队列任务的有效负载中包含 Sentry 的跟踪头 (sentry-tracebaggage),以便在任务被处理时,消费者可以继续您的跟踪。

Copied
$parentSpan = \Sentry\SentrySdk::getCurrentHub()->getSpan();

if ($parentSpan !== null) {
    $context = \Sentry\Tracing\SpanContext::make()
        ->setOp('queue.publish')
        ->setDescription('App\Jobs\MyJob');

    $span = $parentSpan->startChild($context);

    \Sentry\SentrySdk::getCurrentHub()->setSpan($span);

    // Publish your job to the queue
    Queue::push($job, [
        'publish_time' => microtime(true),
        'sentry_trace' => \Sentry\getTraceparent(),
        'baggage' => \Sentry\getBaggage(),
    ]);
    
    $span
        ->setData([
            'messaging.message.id' => $job->getId(),
            'messaging.destination.name' => $job->getQueue(),
            'messaging.message.body.size' => $job->getSize(),
        ])
        ->finish();

    \Sentry\SentrySdk::getCurrentHub()->setSpan($parentSpan);
}

将您的队列消费者代码包装在一个跨度中。您的跨度 op 必须设置为 queue.process。包含以下跨度数据以丰富消费者跨度的额外指标:

数据属性类型描述
messaging.message.idstring消息标识符
messaging.destination.namestring队列或主题名称
messaging.message.body.sizenumber消息体大小(字节)
messaging.message.retry.countnumber消息尝试处理的次数
messaging.message.receive.latencynumber消息在队列中等待处理的时间(毫秒)

确保在创建跨度时有一个事务正在运行。更多信息请参阅 追踪

使用 \Sentry\continueTrace() 将您的消费者事务连接到相应的生产者跨度,并使用 $transaction->setStatus() 标记您的消息跟踪为成功或失败。

Copied
$context = \Sentry\continueTrace(
    $job->getMetadata('sentry_trace'),
    $job->getMetadata('baggage')
)
    ->setOp('queue.process')
    ->setName('App\Jobs\MyJob');

$transaction = \Sentry\startTransaction($context);

\Sentry\SentrySdk::getCurrentHub()->setSpan($transaction);

$job = Queue::pop();

try {
    // Continue job processing...
} catch (\Throwable $e) {
    $transaction->setStatus(\Sentry\Tracing\SpanStatus::internalError());
}

$transaction
    ->setData([
        'messaging.message.id' => $job->getId(),
        'messaging.destination.name' => $job->getQueue(),
        'messaging.message.body.size' => $job->getSize(),
        'messaging.message.receive.latency' =>  microtime(true) - $job->getMetadata('publish_time'),
        'messaging.message.retry.count' => $job->getRetryCount(),
    ])
    ->finish();