Source File
trace.go
Belonging Package
go.opencensus.io/plugin/ochttp
package ochttp
import (
)
var defaultFormat propagation.HTTPFormat = &b3.HTTPFormat{}
const (
HostAttribute = "http.host"
MethodAttribute = "http.method"
PathAttribute = "http.path"
URLAttribute = "http.url"
UserAgentAttribute = "http.user_agent"
StatusCodeAttribute = "http.status_code"
)
type traceTransport struct {
base http.RoundTripper
startOptions trace.StartOptions
format propagation.HTTPFormat
formatSpanName func(*http.Request) string
newClientTrace func(*http.Request, *trace.Span) *httptrace.ClientTrace
}
, := trace.StartSpan(.Context(), ,
trace.WithSampler(.startOptions.Sampler),
trace.WithSpanKind(trace.SpanKindClient))
if .newClientTrace != nil {
= .WithContext(httptrace.WithClientTrace(, .newClientTrace(, )))
} else {
= .WithContext()
}
:= make(http.Header)
for , := range .Header {
[] =
}
.Header =
.format.SpanContextToRequest(.SpanContext(), )
}
.AddAttributes(requestAttrs()...)
, := .base.RoundTrip()
if != nil {
.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: .Error()})
.End()
return ,
}
.AddAttributes(responseAttrs()...)
.SetStatus(TraceStatus(.StatusCode, .Status))
:= &bodyTracker{rc: .Body, span: }
.Body = wrappedBody(, .Body)
return ,
}
type bodyTracker struct {
rc io.ReadCloser
span *trace.Span
}
var _ io.ReadCloser = (*bodyTracker)(nil)
func ( *bodyTracker) ( []byte) (int, error) {
, := .rc.Read()
switch {
case nil:
return , nil
case io.EOF:
.span.End()
func ( *traceTransport) ( *http.Request) {
type interface {
(*http.Request)
}
if , := .base.(); {
.()
}
}
func ( *http.Request) string {
return .URL.Path
}
func ( *http.Request) []trace.Attribute {
:= .UserAgent()
:= make([]trace.Attribute, 0, 5)
= append(,
trace.StringAttribute(PathAttribute, .URL.Path),
trace.StringAttribute(URLAttribute, .URL.String()),
trace.StringAttribute(HostAttribute, .Host),
trace.StringAttribute(MethodAttribute, .Method),
)
if != "" {
= append(, trace.StringAttribute(UserAgentAttribute, ))
}
return
}
func ( *http.Response) []trace.Attribute {
return []trace.Attribute{
trace.Int64Attribute(StatusCodeAttribute, int64(.StatusCode)),
}
}
func ( int, string) trace.Status {
var int32
if < 200 || >= 400 {
= trace.StatusCodeUnknown
}
switch {
case 499:
= trace.StatusCodeCancelled
case http.StatusBadRequest:
= trace.StatusCodeInvalidArgument
case http.StatusUnprocessableEntity:
= trace.StatusCodeInvalidArgument
case http.StatusGatewayTimeout:
= trace.StatusCodeDeadlineExceeded
case http.StatusNotFound:
= trace.StatusCodeNotFound
case http.StatusForbidden:
= trace.StatusCodePermissionDenied
case http.StatusUnauthorized: // 401 is actually unauthenticated.
= trace.StatusCodeUnauthenticated
case http.StatusTooManyRequests:
= trace.StatusCodeResourceExhausted
case http.StatusNotImplemented:
= trace.StatusCodeUnimplemented
case http.StatusServiceUnavailable:
= trace.StatusCodeUnavailable
case http.StatusOK:
= trace.StatusCodeOK
case http.StatusConflict:
= trace.StatusCodeAlreadyExists
}
return trace.Status{Code: , Message: codeToStr[]}
}
var codeToStr = map[int32]string{
trace.StatusCodeOK: `OK`,
trace.StatusCodeCancelled: `CANCELLED`,
trace.StatusCodeUnknown: `UNKNOWN`,
trace.StatusCodeInvalidArgument: `INVALID_ARGUMENT`,
trace.StatusCodeDeadlineExceeded: `DEADLINE_EXCEEDED`,
trace.StatusCodeNotFound: `NOT_FOUND`,
trace.StatusCodeAlreadyExists: `ALREADY_EXISTS`,
trace.StatusCodePermissionDenied: `PERMISSION_DENIED`,
trace.StatusCodeResourceExhausted: `RESOURCE_EXHAUSTED`,
trace.StatusCodeFailedPrecondition: `FAILED_PRECONDITION`,
trace.StatusCodeAborted: `ABORTED`,
trace.StatusCodeOutOfRange: `OUT_OF_RANGE`,
trace.StatusCodeUnimplemented: `UNIMPLEMENTED`,
trace.StatusCodeInternal: `INTERNAL`,
trace.StatusCodeUnavailable: `UNAVAILABLE`,
trace.StatusCodeDataLoss: `DATA_LOSS`,
trace.StatusCodeUnauthenticated: `UNAUTHENTICATED`,
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |