40 lines
1.0 KiB
Go
40 lines
1.0 KiB
Go
package middleware
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/opentracing/opentracing-go"
|
|
"github.com/opentracing/opentracing-go/ext"
|
|
|
|
"github.com/goravel/framework/contracts/http"
|
|
)
|
|
|
|
const (
|
|
OpentracingTracer = "opentracing_tracer"
|
|
OpentracingCtx = "opentracing_ctx"
|
|
)
|
|
|
|
func Opentracing(tracer opentracing.Tracer) http.Middleware {
|
|
return func(ctx http.Context) {
|
|
var parentSpan opentracing.Span
|
|
|
|
spCtx, err := opentracing.GlobalTracer().Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(ctx.Request().Headers()))
|
|
if err != nil {
|
|
parentSpan = tracer.StartSpan(ctx.Request().Path())
|
|
defer parentSpan.Finish()
|
|
} else {
|
|
parentSpan = opentracing.StartSpan(
|
|
ctx.Request().Path(),
|
|
opentracing.ChildOf(spCtx),
|
|
opentracing.Tag{Key: string(ext.Component), Value: "HTTP"},
|
|
ext.SpanKindRPCServer,
|
|
)
|
|
defer parentSpan.Finish()
|
|
}
|
|
|
|
ctx.WithValue(OpentracingTracer, tracer)
|
|
ctx.WithValue(OpentracingCtx, opentracing.ContextWithSpan(context.Background(), parentSpan))
|
|
ctx.Request().Next()
|
|
}
|
|
}
|