mirror of
https://github.com/hanzoai/telemetry.git
synced 2026-10-30 20:01:49 +00:00
47 lines
1.4 KiB
Go
47 lines
1.4 KiB
Go
// Copyright The OpenTelemetry Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package statusutil // import "go.opentelemetry.io/collector/internal/statusutil"
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"google.golang.org/genproto/googleapis/rpc/errdetails"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
// NewStatusFromMsgAndHTTPCode returns a gRPC status based on an error message string and a http status code.
|
|
// This function is shared between the http receiver and http exporter for error propagation.
|
|
func NewStatusFromMsgAndHTTPCode(errMsg string, statusCode int) *status.Status {
|
|
var c codes.Code
|
|
// Mapping based on https://github.com/grpc/grpc/blob/master/doc/http-grpc-status-mapping.md
|
|
// 429 mapping to ResourceExhausted and 400 mapping to StatusBadRequest are exceptions.
|
|
switch statusCode {
|
|
case http.StatusBadRequest:
|
|
c = codes.InvalidArgument
|
|
case http.StatusUnauthorized:
|
|
c = codes.Unauthenticated
|
|
case http.StatusForbidden:
|
|
c = codes.PermissionDenied
|
|
case http.StatusNotFound:
|
|
c = codes.Unimplemented
|
|
case http.StatusTooManyRequests:
|
|
c = codes.ResourceExhausted
|
|
case http.StatusBadGateway, http.StatusServiceUnavailable, http.StatusGatewayTimeout:
|
|
c = codes.Unavailable
|
|
default:
|
|
c = codes.Unknown
|
|
}
|
|
return status.New(c, errMsg)
|
|
}
|
|
|
|
func GetRetryInfo(status *status.Status) *errdetails.RetryInfo {
|
|
for _, detail := range status.Details() {
|
|
if t, ok := detail.(*errdetails.RetryInfo); ok {
|
|
return t
|
|
}
|
|
}
|
|
return nil
|
|
}
|