@@ -3,11 +3,9 @@ package otelfox
3
3
import (
4
4
"fmt"
5
5
"github.com/tigerwill90/fox"
6
- "go.opentelemetry.io/otel/propagation"
7
6
semconv "go.opentelemetry.io/otel/semconv/v1.18.0"
8
7
"go.opentelemetry.io/otel/semconv/v1.18.0/httpconv"
9
8
"go.opentelemetry.io/otel/trace"
10
- "net/http"
11
9
)
12
10
13
11
const (
@@ -16,11 +14,9 @@ const (
16
14
17
15
// Tracer is a Fox middleware that traces HTTP requests using OpenTelemetry.
18
16
type Tracer struct {
19
- service string
20
- tracer trace.Tracer
21
- propagator propagation.TextMapPropagator
22
- carrier func (r * http.Request ) propagation.TextMapCarrier
23
- spanFmt func (r * http.Request ) string
17
+ service string
18
+ tracer trace.Tracer
19
+ cfg * config
24
20
}
25
21
26
22
// New creates a new Tracer middleware for the given service.
@@ -33,39 +29,50 @@ func New(service string, opts ...Option) *Tracer {
33
29
34
30
tracer := cfg .provider .Tracer (tracerName , trace .WithInstrumentationVersion (SemVersion ()))
35
31
return & Tracer {
36
- service : service ,
37
- tracer : tracer ,
38
- propagator : cfg .propagator ,
39
- carrier : cfg .carrier ,
40
- spanFmt : cfg .spanFmt ,
32
+ service : service ,
33
+ tracer : tracer ,
34
+ cfg : cfg ,
41
35
}
42
36
}
43
37
38
+ // Middleware is a convenience function that creates a new Tracer middleware instance
39
+ // for the specified service and returns the Trace middleware function.
40
+ // Options can be provided to configure the tracer.
44
41
func Middleware (service string , opts ... Option ) fox.MiddlewareFunc {
45
42
tracer := New (service , opts ... )
46
43
return tracer .Trace
47
44
}
48
45
46
+ // Trace is a middleware function that wraps the provided HandlerFunc with tracing capabilities.
47
+ // It captures and records HTTP request information using OpenTelemetry.
49
48
func (t * Tracer ) Trace (next fox.HandlerFunc ) fox.HandlerFunc {
50
49
return func (c fox.Context ) {
51
50
52
51
req := c .Request ()
53
- ctx := t .propagator .Extract (req .Context (), t .carrier (req ))
52
+
53
+ for _ , f := range t .cfg .filters {
54
+ if ! f (req ) {
55
+ next (c )
56
+ return
57
+ }
58
+ }
59
+
60
+ ctx := t .cfg .propagator .Extract (req .Context (), t .cfg .carrier (req ))
54
61
55
62
opts := []trace.SpanStartOption {
56
63
trace .WithAttributes (httpconv .ServerRequest (t .service , req )... ),
57
64
trace .WithSpanKind (trace .SpanKindServer ),
58
65
}
59
66
60
67
var spanName string
61
- if t .spanFmt == nil {
68
+ if t .cfg . spanFmt == nil {
62
69
spanName = c .Path ()
63
70
} else {
64
- spanName = t .spanFmt (req )
71
+ spanName = t .cfg . spanFmt (req )
65
72
}
66
73
67
74
if spanName == "" {
68
- spanName = fmt .Sprintf ("HTTP %s route not found" , c . Request () .Method )
75
+ spanName = fmt .Sprintf ("HTTP %s route not found" , req .Method )
69
76
} else {
70
77
opts = append (opts , trace .WithAttributes (semconv .HTTPRoute (spanName )))
71
78
}
0 commit comments