插桩队列
了解如何手动插桩您的代码以使用 Sentry 的 Queues 模块。
Sentry 提供了一个 队列监控仪表板,可以通过我们的 Laravel SDK 自动插桩。
如果您使用的是其他工具,可以手动插桩您的队列生产者和消费者,以确保您有关于消息队列的性能数据。
将您的队列生产者代码包装在一个跨度中。您的跨度 op
必须设置为 queue.publish
。包含以下跨度数据以丰富生产者跨度的额外指标:
数据属性 | 类型 | 描述 |
---|---|---|
messaging.message.id | string | 消息标识符 |
messaging.destination.name | string | 队列或主题名称 |
messaging.message.body.size | int | 消息体大小(字节) |
确保在创建跨度时有一个事务正在运行。更多信息请参阅 追踪。
您还必须在队列任务的有效负载中包含 Sentry 的跟踪头 (sentry-trace
和 baggage
),以便在任务被处理时,消费者可以继续您的跟踪。
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.id | string | 消息标识符 |
messaging.destination.name | string | 队列或主题名称 |
messaging.message.body.size | number | 消息体大小(字节) |
messaging.message.retry.count | number | 消息尝试处理的次数 |
messaging.message.receive.latency | number | 消息在队列中等待处理的时间(毫秒) |
确保在创建跨度时有一个事务正在运行。更多信息请参阅 追踪。
使用 \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();