@@ -33,6 +33,7 @@ import (
33
33
#include <netinet/tcp.h>
34
34
#include <netinet/tcp_var.h>
35
35
#include <netinet/udp.h>
36
+ #include <netinet/udp_var.h>
36
37
#include <netinet/ip_var.h>
37
38
#include <netinet6/ip6_var.h>
38
39
*/
42
43
sysctlRaw = unix .SysctlRaw
43
44
tcpSendTotal = "bsdNetstatTcpSendPacketsTotal"
44
45
tcpRecvTotal = "bsdNetstatTcpRecvPacketsTotal"
46
+ udpSendTotal = "bsdNetstatUdpSendPacketsTotal"
47
+ udpRecvTotal = "bsdNetstatUdpRecvPacketsTotal"
45
48
ipv4SendTotal = "bsdNetstatIPv4SendPacketsTotal"
46
49
ipv4RawSendTotal = "bsdNetstatIPv4RawSendPacketsTotal"
47
50
ipv4RecvTotal = "bsdNetstatIPv4RecvPacketsTotal"
65
68
prometheus .BuildFQName (namespace , "netstat" , "tcp_receive_packets_total" ),
66
69
"TCP packets received" , nil , nil ),
67
70
71
+ // UDP stats
72
+ udpSendTotal : prometheus .NewDesc (
73
+ prometheus .BuildFQName (namespace , "netstat" , "udp_transmit_packets_total" ),
74
+ "UDP packets sent" , nil , nil ),
75
+ udpRecvTotal : prometheus .NewDesc (
76
+ prometheus .BuildFQName (namespace , "netstat" , "udp_receive_packets_total" ),
77
+ "UDP packets received" , nil , nil ),
78
+
68
79
// IPv4 stats
69
80
ipv4SendTotal : prometheus .NewDesc (
70
81
prometheus .BuildFQName (namespace , "netstat" , "ip4_transmit_packets_total" ),
@@ -140,6 +151,29 @@ func (netstatMetric *NetstatTCPData) GetData() (NetstatMetrics, error) {
140
151
}, nil
141
152
}
142
153
154
+ type NetstatUDPData NetstatData
155
+
156
+ func NewUDPStat () * NetstatUDPData {
157
+ return & NetstatUDPData {
158
+ structSize : int (unsafe .Sizeof (C.struct_udpstat {})),
159
+ sysctl : "net.inet.udp.stats" ,
160
+ }
161
+ }
162
+
163
+ func (netstatMetric * NetstatUDPData ) GetData () (NetstatMetrics , error ) {
164
+ data , err := getData (netstatMetric .sysctl , netstatMetric .structSize )
165
+ if err != nil {
166
+ return nil , err
167
+ }
168
+
169
+ udpStats := * (* C .struct_udpstat )(unsafe .Pointer (& data [0 ]))
170
+
171
+ return NetstatMetrics {
172
+ udpSendTotal : float64 (udpStats .udps_opackets ),
173
+ udpRecvTotal : float64 (udpStats .udps_ipackets ),
174
+ }, nil
175
+ }
176
+
143
177
type NetstatIPv4Data NetstatData
144
178
145
179
func NewIPv4Stat () * NetstatIPv4Data {
@@ -234,6 +268,11 @@ func (c *netStatCollector) Update(ch chan<- prometheus.Metric) error {
234
268
return err
235
269
}
236
270
271
+ udpStats , err := NewUDPStat ().GetData ()
272
+ if err != nil {
273
+ return err
274
+ }
275
+
237
276
ipv4Stats , err := NewIPv4Stat ().GetData ()
238
277
if err != nil {
239
278
return err
@@ -250,6 +289,10 @@ func (c *netStatCollector) Update(ch chan<- prometheus.Metric) error {
250
289
allStats [k ] = v
251
290
}
252
291
292
+ for k , v := range udpStats {
293
+ allStats [k ] = v
294
+ }
295
+
253
296
for k , v := range ipv4Stats {
254
297
allStats [k ] = v
255
298
}
@@ -280,6 +323,14 @@ func getFreeBSDDataMock(sysctl string) []byte {
280
323
size := int (unsafe .Sizeof (C.struct_tcpstat {}))
281
324
282
325
return unsafe .Slice ((* byte )(unsafe .Pointer (& tcpStats )), size )
326
+ } else if sysctl == "net.inet.udp.stats" {
327
+ udpStats := C.struct_udpstat {
328
+ udps_opackets : 1234 ,
329
+ udps_ipackets : 4321 ,
330
+ }
331
+ size := int (unsafe .Sizeof (C.struct_udpstat {}))
332
+
333
+ return unsafe .Slice ((* byte )(unsafe .Pointer (& udpStats )), size )
283
334
} else if sysctl == "net.inet.ip.stats" {
284
335
ipStats := C.struct_ipstat {
285
336
ips_localout : 1234 ,
0 commit comments