Golang OpenTelemetry: span.SetStatus надо вызывать после span.RecordError ?
Да, рекомендуется вызывать span.SetStatus
после span.RecordError
, чтобы явно установить статус спана в зависимости от записанной ошибки. Это не обязательное требование, но такой порядок помогает сделать код более читаемым и логичным. Вот почему:
Причины вызывать span.SetStatus
после span.RecordError
- Последовательность действий:
- Сначала фиксируем детали ошибки с помощью
span.RecordError
, чтобы сохранить её контекст. - Затем устанавливаем общий статус спана (
codes.Error
), чтобы указать, что операция завершилась с ошибкой.
- Сначала фиксируем детали ошибки с помощью
- Ясность кода:
- Этот порядок делает намерения разработчика понятными: «Сначала мы фиксируем ошибку, затем говорим системе, что весь спан должен быть помечен как завершившийся с ошибкой.»
- Избежание путаницы:
- Если сначала вызывается
span.SetStatus
, а потомspan.RecordError
, может возникнуть вопрос: «Какой статус будет иметь спан, еслиRecordError
не обновляет статус?»
- Если сначала вызывается
Пример: Правильный порядок вызовов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
func process(ctx context.Context) error { ctx, span := tracer.Start(ctx, "Process") defer span.End() err := doWork() if err != nil { // Сначала записываем ошибку span.RecordError(err) // Затем устанавливаем статус спана как ошибочный span.SetStatus(codes.Error, err.Error()) return err } // Для успешной операции можно явно установить статус (опционально) span.SetStatus(codes.Ok, "Operation successful") return nil } |
Можно ли вызывать только RecordError
?
Да, можно, если вам не нужно устанавливать статус. Однако это может быть неинтуитивным:
- Некоторые системы наблюдения (например, Jaeger) могут отображать
Span
как успешный, если не установлен статусcodes.Error
, даже если была вызванаRecordError
.
Можно ли вызывать только SetStatus
?
Да, но вы потеряете возможность записать детали ошибки. Это полезно только в случаях, когда ошибка ожидаема и её запись в трейс избыточна.
Что произойдёт, если поменять порядок?
Если вызвать span.SetStatus
перед span.RecordError
, технически всё будет работать, но:
RecordError
не обновляет статус спана, так что порядок вызовов не повлияет на конечный статус.- Код станет менее читаемым для других разработчиков, которые могут ожидать логичного порядка: «Сначала фиксируем ошибку, потом ставим статус».
Итог
Вызывать span.SetStatus
после span.RecordError
— это хорошая практика:
- Она делает код более логичным.
- Упрощает анализ кода и устранение ошибок.
- Гарантирует, что статус отражает зафиксированную ошибку.