pkg/inst-api-semconv/instrumenter/http/http_status_code_extractor.go (43 lines of code) (raw):
// Copyright (c) 2024 Alibaba Group Holding Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package http
import (
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
semconv "go.opentelemetry.io/otel/semconv/v1.30.0"
"go.opentelemetry.io/otel/trace"
"strconv"
)
const invalidHttpStatusCode = "INVALID_HTTP_STATUS_CODE"
type HttpClientSpanStatusExtractor[REQUEST any, RESPONSE any] struct {
Getter HttpCommonAttrsGetter[REQUEST, RESPONSE]
}
func (h HttpClientSpanStatusExtractor[REQUEST, RESPONSE]) Extract(span trace.Span, request REQUEST, response RESPONSE, err error) {
statusCode := h.Getter.GetHttpResponseStatusCode(request, response, err)
if statusCode >= 400 || statusCode < 100 {
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
} else {
span.SetStatus(codes.Error, invalidHttpStatusCode)
}
span.SetAttributes(attribute.KeyValue{Key: semconv.ErrorTypeKey, Value: attribute.StringValue(strconv.Itoa(statusCode))})
} else if statusCode >= 200 && statusCode < 300 {
span.SetStatus(codes.Ok, "success")
}
}
type HttpServerSpanStatusExtractor[REQUEST any, RESPONSE any] struct {
Getter HttpCommonAttrsGetter[REQUEST, RESPONSE]
}
func (h HttpServerSpanStatusExtractor[REQUEST, RESPONSE]) Extract(span trace.Span, request REQUEST, response RESPONSE, err error) {
statusCode := h.Getter.GetHttpResponseStatusCode(request, response, err)
if statusCode >= 500 || statusCode < 100 {
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
} else {
span.SetStatus(codes.Error, invalidHttpStatusCode)
}
span.SetAttributes(attribute.KeyValue{Key: semconv.ErrorTypeKey, Value: attribute.StringValue(strconv.Itoa(statusCode))})
} else if statusCode >= 200 && statusCode < 300 {
span.SetStatus(codes.Ok, "success")
}
}