Golang: как добавить в трейс OpenTelemetry данные об ошибке
В OpenTelemetry можно добавлять данные об ошибках в трейс с помощью событий и атрибутов Span
. Это помогает фиксировать ошибки и предоставлять подробную информацию для анализа.
Добавление информации об ошибке в Span
- Добавить событие об ошибке: Вы можете использовать метод
AddEvent
с предопределённым названием"exception"
и набором атрибутов для описания ошибки. - Установить статус Span как
Error
: Если ошибка критична, вы можете установить статусError
для всего Span.
Пример добавления ошибки в Span
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package main import ( "context" "errors" "log" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" ) func main() { tracer := otel.Tracer("example-tracer") // Создаем корневой контекст и Span ctx, span := tracer.Start(context.Background(), "main-operation") defer span.End() // Пример обработки с ошибкой err := ProcessTask(ctx) if err != nil { // Устанавливаем статус ошибки в Span span.SetStatus(codes.Error, err.Error()) // Добавляем информацию об ошибке span.AddEvent("exception", trace.WithAttributes( attribute.String("exception.type", "ProcessingError"), attribute.String("exception.message", err.Error()), ), ) } log.Println("Main operation finished") } // ProcessTask - пример функции, которая возвращает ошибку func ProcessTask(ctx context.Context) error { tracer := otel.Tracer("example-tracer") ctx, span := tracer.Start(ctx, "ProcessTask") defer span.End() // Имитация ошибки err := errors.New("something went wrong") span.AddEvent("Processing failed", trace.WithAttributes( attribute.String("reason", err.Error()), ), ) return err } |
Объяснение кода
- Добавление события об ошибке (
AddEvent
):- Метод
AddEvent
используется для записи событий в Span. - Рекомендуется использовать атрибуты, такие как:
exception.type
: Тип ошибки.exception.message
: Сообщение об ошибке.exception.stacktrace
: (опционально) Стек-трейс, если доступен.
- Метод
- Установка статуса ошибки (
SetStatus
):- Устанавливаем статус Span как
codes.Error
, чтобы указать на ошибку. - Это особенно полезно для автоматического анализа трейсинга.
- Устанавливаем статус Span как
- Детали ошибки в атрибутах:
- Атрибуты дают более структурированную информацию об ошибке.
- Можно добавить любой ключ-значение, полезное для диагностики.
Рекомендации
- Используйте стандартные ключи: OpenTelemetry рекомендует использовать ключи в формате:
exception.type
: Тип или категория ошибки.exception.message
: Сообщение об ошибке.exception.stacktrace
: (если доступен) Стек вызовов.
- Устанавливайте статус ошибки: Это помогает чётко сигнализировать, что операция завершилась неудачно, и упрощает фильтрацию при анализе трассировок.
- Логируйте события об ошибках: Для незначительных ошибок используйте
AddEvent
без изменения статусаSpan
.
Вывод
Добавление данных об ошибках в трейс OpenTelemetry позволяет улучшить видимость и диагностику системы. Используйте:
SetStatus
для критичных ошибок.AddEvent
с атрибутами для детализированной информации об ошибке.