@@ -33,21 +33,53 @@ import (
3333#include <netinet/tcp.h>
3434#include <netinet/tcp_var.h>
3535#include <netinet/udp.h>
36+ #include <netinet/ip_var.h>
3637*/
3738import "C"
3839
3940var (
40- sysctlRaw = unix .SysctlRaw
41- tcpSendTotal = "bsdNetstatTcpSendPacketsTotal"
42- tcpRecvTotal = "bsdNetstatTcpRecvPacketsTotal"
41+ sysctlRaw = unix .SysctlRaw
42+ tcpSendTotal = "bsdNetstatTcpSendPacketsTotal"
43+ tcpRecvTotal = "bsdNetstatTcpRecvPacketsTotal"
44+ ipv4SendTotal = "bsdNetstatIPv4SendPacketsTotal"
45+ ipv4RawSendTotal = "bsdNetstatIPv4RawSendPacketsTotal"
46+ ipv4RecvTotal = "bsdNetstatIPv4RecvPacketsTotal"
47+ ipv4RecvFragmentsTotal = "bsdNetstatIPv4RecvFragmentsTotal"
48+ ipv4ForwardTotal = "bsdNetstatIPv4ForwardTotal"
49+ ipv4FastForwardTotal = "bsdNetstatIPv4FastForwardTotal"
50+ ipv4DeliveredTotal = "bsdNetstatIPv4DeliveredTotal"
4351
4452 counterMetrics = map [string ]* prometheus.Desc {
53+ // TCP stats
4554 tcpSendTotal : prometheus .NewDesc (
4655 prometheus .BuildFQName (namespace , "netstat" , "tcp_transmit_packets_total" ),
4756 "TCP packets sent" , nil , nil ),
4857 tcpRecvTotal : prometheus .NewDesc (
4958 prometheus .BuildFQName (namespace , "netstat" , "tcp_receive_packets_total" ),
5059 "TCP packets received" , nil , nil ),
60+
61+ // IPv4 stats
62+ ipv4SendTotal : prometheus .NewDesc (
63+ prometheus .BuildFQName (namespace , "netstat" , "ip4_transmit_packets_total" ),
64+ "IPv4 packets sent from this host" , nil , nil ),
65+ ipv4RawSendTotal : prometheus .NewDesc (
66+ prometheus .BuildFQName (namespace , "netstat" , "ip4_transmit_raw_packets_total" ),
67+ "IPv4 raw packets generated" , nil , nil ),
68+ ipv4RecvTotal : prometheus .NewDesc (
69+ prometheus .BuildFQName (namespace , "netstat" , "ip4_receive_packets_total" ),
70+ "IPv4 packets received" , nil , nil ),
71+ ipv4RecvFragmentsTotal : prometheus .NewDesc (
72+ prometheus .BuildFQName (namespace , "netstat" , "ip4_receive_fragments_total" ),
73+ "IPv4 fragments received" , nil , nil ),
74+ ipv4ForwardTotal : prometheus .NewDesc (
75+ prometheus .BuildFQName (namespace , "netstat" , "ip4_forward_total" ),
76+ "IPv4 packets forwarded" , nil , nil ),
77+ ipv4FastForwardTotal : prometheus .NewDesc (
78+ prometheus .BuildFQName (namespace , "netstat" , "ip4_fast_forward_total" ),
79+ "IPv4 packets fast forwarded" , nil , nil ),
80+ ipv4DeliveredTotal : prometheus .NewDesc (
81+ prometheus .BuildFQName (namespace , "netstat" , "ip4_delivered_total" ),
82+ "IPv4 packets delivered to the upper layer (packets for this host)" , nil , nil ),
5183 }
5284)
5385
@@ -81,6 +113,34 @@ func (netstatMetric *NetstatTCPData) GetData() (NetstatMetrics, error) {
81113 }, nil
82114}
83115
116+ type NetstatIPv4Data NetstatData
117+
118+ func NewIPv4Stat () * NetstatIPv4Data {
119+ return & NetstatIPv4Data {
120+ structSize : int (unsafe .Sizeof (C.struct_ipstat {})),
121+ sysctl : "net.inet.ip.stats" ,
122+ }
123+ }
124+
125+ func (netstatMetric * NetstatIPv4Data ) GetData () (NetstatMetrics , error ) {
126+ data , err := getData (netstatMetric .sysctl , netstatMetric .structSize )
127+ if err != nil {
128+ return nil , err
129+ }
130+
131+ ipStats := * (* C .struct_ipstat )(unsafe .Pointer (& data [0 ]))
132+
133+ return NetstatMetrics {
134+ ipv4SendTotal : float64 (ipStats .ips_localout ),
135+ ipv4RawSendTotal : float64 (ipStats .ips_rawout ),
136+ ipv4RecvTotal : float64 (ipStats .ips_total ),
137+ ipv4RecvFragmentsTotal : float64 (ipStats .ips_fragments ),
138+ ipv4ForwardTotal : float64 (ipStats .ips_forward ),
139+ ipv4FastForwardTotal : float64 (ipStats .ips_fastforward ),
140+ ipv4DeliveredTotal : float64 (ipStats .ips_delivered ),
141+ }, nil
142+ }
143+
84144func getData (queryString string , expectedSize int ) ([]byte , error ) {
85145 data , err := sysctlRaw (queryString )
86146 if err != nil {
@@ -120,12 +180,21 @@ func (c *netStatCollector) Update(ch chan<- prometheus.Metric) error {
120180 return err
121181 }
122182
183+ ipv4Stats , err := NewIPv4Stat ().GetData ()
184+ if err != nil {
185+ return err
186+ }
187+
123188 allStats := make (map [string ]float64 )
124189
125190 for k , v := range tcpStats {
126191 allStats [k ] = v
127192 }
128193
194+ for k , v := range ipv4Stats {
195+ allStats [k ] = v
196+ }
197+
129198 for metricKey , metricData := range counterMetrics {
130199 ch <- prometheus .MustNewConstMetric (
131200 metricData ,
@@ -148,6 +217,19 @@ func getFreeBSDDataMock(sysctl string) []byte {
148217 size := int (unsafe .Sizeof (C.struct_tcpstat {}))
149218
150219 return unsafe .Slice ((* byte )(unsafe .Pointer (& tcpStats )), size )
220+ } else if sysctl == "net.inet.ip.stats" {
221+ ipStats := C.struct_ipstat {
222+ ips_localout : 1234 ,
223+ ips_rawout : 1235 ,
224+ ips_total : 1236 ,
225+ ips_fragments : 1237 ,
226+ ips_forward : 1238 ,
227+ ips_fastforward : 1239 ,
228+ ips_delivered : 1240 ,
229+ }
230+ size := int (unsafe .Sizeof (C.struct_ipstat {}))
231+
232+ return unsafe .Slice ((* byte )(unsafe .Pointer (& ipStats )), size )
151233 }
152234
153235 return make ([]byte , 0 , 0 )
0 commit comments