netconv.go raw
1 // Code generated by gotmpl. DO NOT MODIFY.
2 // source: internal/shared/semconvutil/netconv.go.tmpl
3
4 // Copyright The OpenTelemetry Authors
5 // SPDX-License-Identifier: Apache-2.0
6
7 package semconvutil // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
8
9 import (
10 "net"
11 "strconv"
12 "strings"
13
14 "go.opentelemetry.io/otel/attribute"
15 semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
16 )
17
18 // NetTransport returns a trace attribute describing the transport protocol of the
19 // passed network. See the net.Dial for information about acceptable network
20 // values.
21 func NetTransport(network string) attribute.KeyValue {
22 return nc.Transport(network)
23 }
24
25 // netConv are the network semantic convention attributes defined for a version
26 // of the OpenTelemetry specification.
27 type netConv struct {
28 NetHostNameKey attribute.Key
29 NetHostPortKey attribute.Key
30 NetPeerNameKey attribute.Key
31 NetPeerPortKey attribute.Key
32 NetProtocolName attribute.Key
33 NetProtocolVersion attribute.Key
34 NetSockFamilyKey attribute.Key
35 NetSockPeerAddrKey attribute.Key
36 NetSockPeerPortKey attribute.Key
37 NetSockHostAddrKey attribute.Key
38 NetSockHostPortKey attribute.Key
39 NetTransportOther attribute.KeyValue
40 NetTransportTCP attribute.KeyValue
41 NetTransportUDP attribute.KeyValue
42 NetTransportInProc attribute.KeyValue
43 }
44
45 var nc = &netConv{
46 NetHostNameKey: semconv.NetHostNameKey,
47 NetHostPortKey: semconv.NetHostPortKey,
48 NetPeerNameKey: semconv.NetPeerNameKey,
49 NetPeerPortKey: semconv.NetPeerPortKey,
50 NetProtocolName: semconv.NetProtocolNameKey,
51 NetProtocolVersion: semconv.NetProtocolVersionKey,
52 NetSockFamilyKey: semconv.NetSockFamilyKey,
53 NetSockPeerAddrKey: semconv.NetSockPeerAddrKey,
54 NetSockPeerPortKey: semconv.NetSockPeerPortKey,
55 NetSockHostAddrKey: semconv.NetSockHostAddrKey,
56 NetSockHostPortKey: semconv.NetSockHostPortKey,
57 NetTransportOther: semconv.NetTransportOther,
58 NetTransportTCP: semconv.NetTransportTCP,
59 NetTransportUDP: semconv.NetTransportUDP,
60 NetTransportInProc: semconv.NetTransportInProc,
61 }
62
63 func (c *netConv) Transport(network string) attribute.KeyValue {
64 switch network {
65 case "tcp", "tcp4", "tcp6":
66 return c.NetTransportTCP
67 case "udp", "udp4", "udp6":
68 return c.NetTransportUDP
69 case "unix", "unixgram", "unixpacket":
70 return c.NetTransportInProc
71 default:
72 // "ip:*", "ip4:*", and "ip6:*" all are considered other.
73 return c.NetTransportOther
74 }
75 }
76
77 // Host returns attributes for a network host address.
78 func (c *netConv) Host(address string) []attribute.KeyValue {
79 h, p := splitHostPort(address)
80 var n int
81 if h != "" {
82 n++
83 if p > 0 {
84 n++
85 }
86 }
87
88 if n == 0 {
89 return nil
90 }
91
92 attrs := make([]attribute.KeyValue, 0, n)
93 attrs = append(attrs, c.HostName(h))
94 if p > 0 {
95 attrs = append(attrs, c.HostPort(p))
96 }
97 return attrs
98 }
99
100 func (c *netConv) HostName(name string) attribute.KeyValue {
101 return c.NetHostNameKey.String(name)
102 }
103
104 func (c *netConv) HostPort(port int) attribute.KeyValue {
105 return c.NetHostPortKey.Int(port)
106 }
107
108 func family(network, address string) string {
109 switch network {
110 case "unix", "unixgram", "unixpacket":
111 return "unix"
112 default:
113 if ip := net.ParseIP(address); ip != nil {
114 if ip.To4() == nil {
115 return "inet6"
116 }
117 return "inet"
118 }
119 }
120 return ""
121 }
122
123 // Peer returns attributes for a network peer address.
124 func (c *netConv) Peer(address string) []attribute.KeyValue {
125 h, p := splitHostPort(address)
126 var n int
127 if h != "" {
128 n++
129 if p > 0 {
130 n++
131 }
132 }
133
134 if n == 0 {
135 return nil
136 }
137
138 attrs := make([]attribute.KeyValue, 0, n)
139 attrs = append(attrs, c.PeerName(h))
140 if p > 0 {
141 attrs = append(attrs, c.PeerPort(p))
142 }
143 return attrs
144 }
145
146 func (c *netConv) PeerName(name string) attribute.KeyValue {
147 return c.NetPeerNameKey.String(name)
148 }
149
150 func (c *netConv) PeerPort(port int) attribute.KeyValue {
151 return c.NetPeerPortKey.Int(port)
152 }
153
154 func (c *netConv) SockPeerAddr(addr string) attribute.KeyValue {
155 return c.NetSockPeerAddrKey.String(addr)
156 }
157
158 func (c *netConv) SockPeerPort(port int) attribute.KeyValue {
159 return c.NetSockPeerPortKey.Int(port)
160 }
161
162 // splitHostPort splits a network address hostport of the form "host",
163 // "host%zone", "[host]", "[host%zone], "host:port", "host%zone:port",
164 // "[host]:port", "[host%zone]:port", or ":port" into host or host%zone and
165 // port.
166 //
167 // An empty host is returned if it is not provided or unparsable. A negative
168 // port is returned if it is not provided or unparsable.
169 func splitHostPort(hostport string) (host string, port int) {
170 port = -1
171
172 if strings.HasPrefix(hostport, "[") {
173 addrEnd := strings.LastIndex(hostport, "]")
174 if addrEnd < 0 {
175 // Invalid hostport.
176 return
177 }
178 if i := strings.LastIndex(hostport[addrEnd:], ":"); i < 0 {
179 host = hostport[1:addrEnd]
180 return
181 }
182 } else {
183 if i := strings.LastIndex(hostport, ":"); i < 0 {
184 host = hostport
185 return
186 }
187 }
188
189 host, pStr, err := net.SplitHostPort(hostport)
190 if err != nil {
191 return
192 }
193
194 p, err := strconv.ParseUint(pStr, 10, 16)
195 if err != nil {
196 return
197 }
198 return host, int(p) // nolint: gosec // Bitsize checked to be 16 above.
199 }
200
201 func netProtocol(proto string) (name string, version string) {
202 name, version, _ = strings.Cut(proto, "/")
203 switch name {
204 case "HTTP":
205 name = "http"
206 case "QUIC":
207 name = "quic"
208 case "SPDY":
209 name = "spdy"
210 default:
211 name = strings.ToLower(name)
212 }
213 return name, version
214 }
215