You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kratos/middleware/tracing/tracing.go

63 lines
1.8 KiB

4 years ago
package tracing
import (
"context"
"github.com/go-kratos/kratos/v2/middleware"
"github.com/go-kratos/kratos/v2/transport"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/trace"
4 years ago
)
// Option is tracing option.
type Option func(*options)
type options struct {
TracerProvider trace.TracerProvider
Propagators propagation.TextMapPropagator
4 years ago
}
// WithPropagators with tracer proagators.
func WithPropagators(propagators propagation.TextMapPropagator) Option {
return func(opts *options) {
opts.Propagators = propagators
4 years ago
}
}
// WithTracerProvider with tracer privoder.
func WithTracerProvider(provider trace.TracerProvider) Option {
return func(opts *options) {
opts.TracerProvider = provider
}
}
// Server returns a new server middleware for OpenTelemetry.
4 years ago
func Server(opts ...Option) middleware.Middleware {
tracer := NewTracer(trace.SpanKindServer, opts...)
4 years ago
return func(handler middleware.Handler) middleware.Handler {
return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
if tr, ok := transport.FromServerContext(ctx); ok {
var span trace.Span
ctx, span = tracer.Start(ctx, tr.Kind(), tr.Method(), tr.Metadata())
defer func() { tracer.End(ctx, span, err) }()
4 years ago
}
return handler(ctx, req)
4 years ago
}
}
}
// Client returns a new client middleware for OpenTelemetry.
4 years ago
func Client(opts ...Option) middleware.Middleware {
tracer := NewTracer(trace.SpanKindClient, opts...)
4 years ago
return func(handler middleware.Handler) middleware.Handler {
return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
if tr, ok := transport.FromClientContext(ctx); ok {
var span trace.Span
ctx, span = tracer.Start(ctx, tr.Kind(), tr.Method(), tr.Metadata())
defer func() { tracer.End(ctx, span, err) }()
4 years ago
}
return handler(ctx, req)
4 years ago
}
}
}