@@ -33,6 +33,7 @@ import (
3333#include <netinet/tcp.h>
3434#include <netinet/tcp_var.h>
3535#include <netinet/udp.h>
36+ #include <netinet/udp_var.h>
3637#include <netinet/ip_var.h>
3738#include <netinet6/ip6_var.h>
3839*/
4243 sysctlRaw = unix .SysctlRaw
4344 tcpSendTotal = "bsdNetstatTcpSendPacketsTotal"
4445 tcpRecvTotal = "bsdNetstatTcpRecvPacketsTotal"
46+ udpSendTotal = "bsdNetstatUdpSendPacketsTotal"
47+ udpRecvTotal = "bsdNetstatUdpRecvPacketsTotal"
4548 ipv4SendTotal = "bsdNetstatIPv4SendPacketsTotal"
4649 ipv4RawSendTotal = "bsdNetstatIPv4RawSendPacketsTotal"
4750 ipv4RecvTotal = "bsdNetstatIPv4RecvPacketsTotal"
6568 prometheus .BuildFQName (namespace , "netstat" , "tcp_receive_packets_total" ),
6669 "TCP packets received" , nil , nil ),
6770
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+
6879 // IPv4 stats
6980 ipv4SendTotal : prometheus .NewDesc (
7081 prometheus .BuildFQName (namespace , "netstat" , "ip4_transmit_packets_total" ),
@@ -140,6 +151,29 @@ func (netstatMetric *NetstatTCPData) GetData() (NetstatMetrics, error) {
140151 }, nil
141152}
142153
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+
143177type NetstatIPv4Data NetstatData
144178
145179func NewIPv4Stat () * NetstatIPv4Data {
@@ -234,6 +268,11 @@ func (c *netStatCollector) Update(ch chan<- prometheus.Metric) error {
234268 return err
235269 }
236270
271+ udpStats , err := NewUDPStat ().GetData ()
272+ if err != nil {
273+ return err
274+ }
275+
237276 ipv4Stats , err := NewIPv4Stat ().GetData ()
238277 if err != nil {
239278 return err
@@ -250,6 +289,10 @@ func (c *netStatCollector) Update(ch chan<- prometheus.Metric) error {
250289 allStats [k ] = v
251290 }
252291
292+ for k , v := range udpStats {
293+ allStats [k ] = v
294+ }
295+
253296 for k , v := range ipv4Stats {
254297 allStats [k ] = v
255298 }
@@ -280,6 +323,14 @@ func getFreeBSDDataMock(sysctl string) []byte {
280323 size := int (unsafe .Sizeof (C.struct_tcpstat {}))
281324
282325 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 )
283334 } else if sysctl == "net.inet.ip.stats" {
284335 ipStats := C.struct_ipstat {
285336 ips_localout : 1234 ,
0 commit comments