mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2024-12-14 10:13:10 +02:00
cf7a4d909c
* Remove binary propagators They are in process of being dropped from the specification and we haven't be using them anywhere in the project. Can reintroduce them later. * Rename Supplier to HTTPSupplier The supplier is used only in HTTP propagators currently. It's not clear if it will be useful for binary propagators if they get to be specified at some point. * Rework propagation interfaces The biggest change here is that HTTP extractors return a new context with whatever information the propagator is able to retrieve from the supplier. Such interface does not hardcode any extractor's functionality (like it was before by explicitly returning a span context and correlation context) and makes it easy to chain multiple propagators. Injection part hasn't changed. * Add Propagators interface This interface (and its default implementation) is likely going to be the propagation API used the most. Single injectors, extractors or propagators are likely going to be used just as parameters to the Option functions that configure the Propagators implementation. * Drop noop propagator It's rather pointless - just create an empty Propagators instance. * Fix wrong name in docs Co-authored-by: Joshua MacDonald <jmacd@users.noreply.github.com>
98 lines
2.4 KiB
Go
98 lines
2.4 KiB
Go
// Copyright 2019, OpenTelemetry Authors
|
|
//
|
|
// 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 othttp
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"net/http"
|
|
|
|
"go.opentelemetry.io/otel/api/propagation"
|
|
)
|
|
|
|
var _ io.ReadCloser = &bodyWrapper{}
|
|
|
|
// bodyWrapper wraps a http.Request.Body (an io.ReadCloser) to track the number
|
|
// of bytes read and the last error
|
|
type bodyWrapper struct {
|
|
io.ReadCloser
|
|
record func(n int64) // must not be nil
|
|
|
|
read int64
|
|
err error
|
|
}
|
|
|
|
func (w *bodyWrapper) Read(b []byte) (int, error) {
|
|
n, err := w.ReadCloser.Read(b)
|
|
n1 := int64(n)
|
|
w.read += n1
|
|
w.err = err
|
|
w.record(n1)
|
|
return n, err
|
|
}
|
|
|
|
func (w *bodyWrapper) Close() error {
|
|
return w.ReadCloser.Close()
|
|
}
|
|
|
|
var _ http.ResponseWriter = &respWriterWrapper{}
|
|
|
|
// respWriterWrapper wraps a http.ResponseWriter in order to track the number of
|
|
// bytes written, the last error, and to catch the returned statusCode
|
|
// TODO: The wrapped http.ResponseWriter doesn't implement any of the optional
|
|
// types (http.Hijacker, http.Pusher, http.CloseNotifier, http.Flusher, etc)
|
|
// that may be useful when using it in real life situations.
|
|
type respWriterWrapper struct {
|
|
http.ResponseWriter
|
|
record func(n int64) // must not be nil
|
|
|
|
// used to inject the header
|
|
ctx context.Context
|
|
|
|
props propagation.Propagators
|
|
|
|
written int64
|
|
statusCode int
|
|
err error
|
|
wroteHeader bool
|
|
}
|
|
|
|
func (w *respWriterWrapper) Header() http.Header {
|
|
return w.ResponseWriter.Header()
|
|
}
|
|
|
|
func (w *respWriterWrapper) Write(p []byte) (int, error) {
|
|
if !w.wroteHeader {
|
|
w.WriteHeader(http.StatusOK)
|
|
w.wroteHeader = true
|
|
}
|
|
n, err := w.ResponseWriter.Write(p)
|
|
n1 := int64(n)
|
|
w.record(n1)
|
|
w.written += n1
|
|
w.err = err
|
|
return n, err
|
|
}
|
|
|
|
func (w *respWriterWrapper) WriteHeader(statusCode int) {
|
|
if w.wroteHeader {
|
|
return
|
|
}
|
|
w.wroteHeader = true
|
|
w.statusCode = statusCode
|
|
propagation.InjectHTTP(w.ctx, w.props, w.Header())
|
|
w.ResponseWriter.WriteHeader(statusCode)
|
|
}
|