-
Notifications
You must be signed in to change notification settings - Fork 0
/
http_middleware.go
56 lines (47 loc) · 1.4 KB
/
http_middleware.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package core
import (
"context"
"fmt"
"net/http"
"strings"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/propagation"
"google.golang.org/grpc/metadata"
)
func tracingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
method := r.Method
path := r.URL.Path
host := r.Host
ctx, span := Trace(r.Context(), "http", fmt.Sprintf("[%s]%s:%s", method, host, path))
defer span.End()
span.SetAttributes(attribute.String("http.method", method))
span.SetAttributes(attribute.String("http.path", path))
span.SetAttributes(attribute.String("http.host", host))
otel.GetTextMapPropagator().Inject(ctx, propagation.HeaderCarrier(r.Header))
w.Header().Set("x-request-id", span.SpanContext().SpanID().String())
rwh := NewResponseWriterHandler(w)
defer rwh.Finalize()
r = r.WithContext(ctx)
next.ServeHTTP(rwh, r)
})
}
func forwardHeaders(ctx context.Context, req *http.Request) metadata.MD {
md := metadata.MD{}
excludeHeaders := map[string]bool{
"connection": true,
"keep-alive": true,
"proxy-connection": true,
"transfer-encoding": true,
"upgrade": true,
}
for name, values := range req.Header {
if _, ok := excludeHeaders[strings.ToLower(name)]; !ok {
for _, value := range values {
md.Append(strings.ToLower(name), value)
}
}
}
return md
}