@@ -37,19 +37,63 @@ import (
3737import "C"
3838
3939var (
40- bsdNetstatTcpSendPacketsTotal = prometheus .NewDesc (
41- prometheus .BuildFQName (namespace , "netstat" , "tcp_transmit_packets_total" ),
42- "TCP packets sent" ,
43- nil , nil ,
44- )
45-
46- bsdNetstatTcpRecvPacketsTotal = prometheus .NewDesc (
47- prometheus .BuildFQName (namespace , "netstat" , "tcp_receive_packets_total" ),
48- "TCP packets received" ,
49- nil , nil ,
50- )
40+ sysctlRaw = unix .SysctlRaw
41+ tcpSendTotal = "bsdNetstatTcpSendPacketsTotal"
42+ tcpRecvTotal = "bsdNetstatTcpRecvPacketsTotal"
43+
44+ counterMetrics = map [string ]* prometheus.Desc {
45+ tcpSendTotal : prometheus .NewDesc (
46+ prometheus .BuildFQName (namespace , "netstat" , "tcp_transmit_packets_total" ),
47+ "TCP packets sent" , nil , nil ),
48+ tcpRecvTotal : prometheus .NewDesc (
49+ prometheus .BuildFQName (namespace , "netstat" , "tcp_receive_packets_total" ),
50+ "TCP packets received" , nil , nil ),
51+ }
5152)
5253
54+ type NetstatData struct {
55+ structSize int
56+ sysctl string
57+ }
58+
59+ type NetstatMetrics map [string ]float64
60+
61+ type NetstatTCPData NetstatData
62+
63+ func NewTCPStat () * NetstatTCPData {
64+ return & NetstatTCPData {
65+ structSize : int (unsafe .Sizeof (C.struct_tcpstat {})),
66+ sysctl : "net.inet.tcp.stats" ,
67+ }
68+ }
69+
70+ func (netstatMetric * NetstatTCPData ) GetData () (NetstatMetrics , error ) {
71+ data , err := getData (netstatMetric .sysctl , netstatMetric .structSize )
72+ if err != nil {
73+ return nil , err
74+ }
75+
76+ tcpStats := * (* C .struct_tcpstat )(unsafe .Pointer (& data [0 ]))
77+
78+ return NetstatMetrics {
79+ tcpSendTotal : float64 (tcpStats .tcps_sndtotal ),
80+ tcpRecvTotal : float64 (tcpStats .tcps_rcvtotal ),
81+ }, nil
82+ }
83+
84+ func getData (queryString string , expectedSize int ) ([]byte , error ) {
85+ data , err := sysctlRaw (queryString )
86+ if err != nil {
87+ fmt .Println ("Error:" , err )
88+ return nil , err
89+ }
90+
91+ if len (data ) < expectedSize {
92+ return nil , errors .New ("Data Size mismatch" )
93+ }
94+ return data , nil
95+ }
96+
5397type netStatCollector struct {
5498 netStatMetric * prometheus.Desc
5599}
@@ -70,39 +114,41 @@ func (c *netStatCollector) Collect(ch chan<- prometheus.Metric) {
70114 _ = c .Update (ch )
71115}
72116
73- func getData ( queryString string ) ([] byte , error ) {
74- data , err := unix . SysctlRaw ( queryString )
117+ func ( c * netStatCollector ) Update ( ch chan <- prometheus. Metric ) error {
118+ tcpStats , err := NewTCPStat (). GetData ( )
75119 if err != nil {
76- fmt .Println ("Error:" , err )
77- return nil , err
120+ return err
78121 }
79122
80- if len (data ) < int (unsafe .Sizeof (C.struct_tcpstat {})) {
81- return nil , errors .New ("Data Size mismatch" )
82- }
83- return data , nil
84- }
123+ allStats := make (map [string ]float64 )
85124
86- func (c * netStatCollector ) Update (ch chan <- prometheus.Metric ) error {
125+ for k , v := range tcpStats {
126+ allStats [k ] = v
127+ }
87128
88- tcpData , err := getData ("net.inet.tcp.stats" )
89- if err != nil {
90- return err
129+ for metricKey , metricData := range counterMetrics {
130+ ch <- prometheus .MustNewConstMetric (
131+ metricData ,
132+ prometheus .CounterValue ,
133+ allStats [metricKey ],
134+ )
91135 }
92136
93- tcpStats := * (* C .struct_tcpstat )(unsafe .Pointer (& tcpData [0 ]))
137+ return nil
138+ }
94139
95- ch <- prometheus .MustNewConstMetric (
96- bsdNetstatTcpSendPacketsTotal ,
97- prometheus .CounterValue ,
98- float64 (tcpStats .tcps_sndtotal ),
99- )
140+ // Used by tests to mock unix.SysctlRaw
141+ func getFreeBSDDataMock (sysctl string ) []byte {
100142
101- ch <- prometheus .MustNewConstMetric (
102- bsdNetstatTcpRecvPacketsTotal ,
103- prometheus .CounterValue ,
104- float64 (tcpStats .tcps_rcvtotal ),
105- )
143+ if sysctl == "net.inet.tcp.stats" {
144+ tcpStats := C.struct_tcpstat {
145+ tcps_sndtotal : 1234 ,
146+ tcps_rcvtotal : 4321 ,
147+ }
148+ size := int (unsafe .Sizeof (C.struct_tcpstat {}))
106149
107- return nil
150+ return unsafe .Slice ((* byte )(unsafe .Pointer (& tcpStats )), size )
151+ }
152+
153+ return make ([]byte , 0 , 0 )
108154}
0 commit comments