File size: 1,211 Bytes
6380833
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
package server

import (
	"net"
	"net/http"

	"github.com/go-chi/chi/v5/middleware"
	semconv "go.opentelemetry.io/otel/semconv/v1.27.0"
)

// GetRequestAttributes returns a map of attributes for a request.
// Requires `middleware.RequestID` middleware to be used.
func GetRequestAttributes(r *http.Request) map[string]string {
	ctx := r.Context()

	attrs := map[string]string{
		// HTTP attributes
		string(semconv.HTTPRequestMethodKey): r.Method,
		string(semconv.URLFullKey):           r.URL.String(),

		// Net attributes
		string(semconv.NetworkProtocolNameKey): r.Proto,

		// User attributes
		string(semconv.UserAgentOriginalKey): r.UserAgent(),
	}

	peerAddr, peerPort, err := net.SplitHostPort(r.RemoteAddr)
	if err == nil {
		attrs[string(semconv.NetworkPeerAddressKey)] = peerAddr
		attrs[string(semconv.NetworkPeerPortKey)] = peerPort
	}

	if clientAddr := middleware.GetClientIPAddr(ctx); clientAddr.IsValid() {
		attrs[string(semconv.ClientAddressKey)] = clientAddr.String()
	}

	if reqID := middleware.GetReqID(ctx); reqID != "" {
		// There is no semantic convention for request ID, so we use our own
		// Alternatively, we could use rpc.message.id
		attrs["req_id"] = reqID
	}

	return attrs
}