2021-05-18 17:03:10 -04:00
// Copyright The OpenTelemetry Authors
2024-02-29 07:05:28 +01:00
// SPDX-License-Identifier: Apache-2.0
2021-05-18 17:03:10 -04:00
2021-09-28 04:37:26 +02:00
package handler // import "go.opentelemetry.io/otel/example/passthrough/handler"
2021-05-18 17:03:10 -04:00
import (
"context"
"log"
"net/http"
"time"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/trace"
)
// Handler is a minimal implementation of the handler and client from
// go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp for demonstration purposes.
// It handles an incoming http request, and makes an outgoing http request.
type Handler struct {
propagators propagation . TextMapPropagator
tracer trace . Tracer
next func ( r * http . Request )
}
2022-05-19 13:15:07 -07:00
// New returns a new Handler that will trace requests before handing them off
// to next.
2021-05-18 17:03:10 -04:00
func New ( next func ( r * http . Request ) ) * Handler {
// Like most instrumentation packages, this handler defaults to using the
2024-09-09 16:53:15 +10:00
// global propagators and tracer providers.
2021-05-18 17:03:10 -04:00
return & Handler {
propagators : otel . GetTextMapPropagator ( ) ,
2024-07-12 11:53:18 -07:00
tracer : otel . Tracer ( "go.opentelemetry.io/otel/example/passthrough/handler" ) ,
2021-05-18 17:03:10 -04:00
next : next ,
}
}
2022-04-25 13:22:49 -07:00
// HandleHTTPReq mimics what an instrumented http server does.
2021-05-18 17:03:10 -04:00
func ( h * Handler ) HandleHTTPReq ( r * http . Request ) {
ctx := h . propagators . Extract ( r . Context ( ) , propagation . HeaderCarrier ( r . Header ) )
var span trace . Span
log . Println ( "The \"handle passthrough request\" span should NOT be recorded, because it is recorded by a TracerProvider not backed by the SDK." )
ctx , span = h . tracer . Start ( ctx , "handle passthrough request" )
defer span . End ( )
// Pretend to do work
time . Sleep ( time . Second )
h . makeOutgoingRequest ( ctx )
}
2022-04-25 13:22:49 -07:00
// makeOutgoingRequest mimics what an instrumented http client does.
2021-05-18 17:03:10 -04:00
func ( h * Handler ) makeOutgoingRequest ( ctx context . Context ) {
// make a new http request
r , err := http . NewRequest ( "" , "" , nil )
if err != nil {
panic ( err )
}
log . Println ( "The \"make outgoing request from passthrough\" span should NOT be recorded, because it is recorded by a TracerProvider not backed by the SDK." )
ctx , span := h . tracer . Start ( ctx , "make outgoing request from passthrough" )
defer span . End ( )
r = r . WithContext ( ctx )
h . propagators . Inject ( ctx , propagation . HeaderCarrier ( r . Header ) )
h . next ( r )
}