Асинхронные операции
При асинхронном взаимодействии через очереди сообщений (Kafka, RabbitMQ и др.) вместо отношения «родитель — потомок» между спанами используются связи спанов (Span Links). Это позволяет связать спаны из разных трейсов: например, когда несколько продюсеров отправляют сообщения, а консьюмер обрабатывает их одним батчем.
Конвенция именования
Имя спана формируется как {messaging.operation.name} {destination}, например send orders или process orders. Если имя топика имеет высокую кардинальность, используйте шаблон (messaging.destination.template). Если топик неизвестен, вместо него указывается unknown. Подробнее см. в спецификации именования messaging-спанов
Атрибуты
|
Атрибут |
Описание |
|
|
Система обмена сообщениями: |
|
|
Имя топика или очереди: |
|
|
Системное имя операции: |
|
|
Стандартизированный тип: |
|
|
Идентификатор сообщения |
|
|
Количество сообщений в батче |
Полный перечень атрибутов см. в спецификации OpenTelemetry для messaging-спанов
Примеры
Несколько продюсеров, один консьюмер
Продюсер A и продюсер B отправляют по сообщению в топик orders в Kafka. Консьюмер получает оба сообщения в одном батче (спан poll orders), а затем создает отдельный спан process orders для обработки каждого сообщения. Span Links вешаются на спаны process, связывая каждое сообщение с его продюсером:
|
Атрибут |
Продюсер A |
Продюсер B |
Консьюмер: получение |
Консьюмер: обработка A |
Консьюмер: обработка B |
|
Name |
|
|
|
|
|
|
Kind |
|
|
|
|
|
|
Status |
|
|
|
|
|
|
Links |
— |
— |
— |
→ |
→ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
— |
|
|
|
|
— |
— |
|
— |
— |
Один продюсер, несколько консьюмеров
Продюсер отправляет сообщение в топик orders. Консьюмер X и консьюмер Y из разных consumer group обрабатывают его независимо. Каждый спан process связан со спаном продюсера через Span Link:
|
Атрибут |
Продюсер |
Консьюмер X |
Консьюмер Y |
|
Name |
|
|
|
|
Kind |
|
|
|
|
Status |
|
|
|
|
Links |
— |
→ |
→ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|