-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinterface.go
More file actions
138 lines (123 loc) · 3.02 KB
/
Copy pathinterface.go
File metadata and controls
138 lines (123 loc) · 3.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package mc
import (
"bufio"
"time"
//"fmt"
"net"
"os"
"strconv"
"strings"
)
/*
cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo:120309825211 699253920 0 0 0 0 0 0 120309825211 699253920 0 0 0 0 0 0
*/
const (
BYTES_IN_IDX = iota
PACKETS_IN_IDX
ERRS_IN_IDX
DROP_IN_IDX
FIFO_IN_IDX
FRAME_IN_IDX
COMPRESSED_IN_IDX
MULTICAST_IN_IDX
BYTES_OUT_IDX
PACKETS_OUT_IDX
ERRS_OUT_IDX
DROP_OUT_IDX
FIFO_OUT_IDX
COLLS_OUT_IDX
CARRIER_OUT_IDX
COMPRESSED_OUT_IDX
)
var INTER_NAME_ADDRS_MAP = make(map[string][]string)
func init() {
//get all interface name and ip address when start up
interfaces, err := net.Interfaces()
if err != nil {
os.Exit(-1)
}
for _, inter := range interfaces {
addrsArr := make([]string, 0)
addrs, err := inter.Addrs()
if err != nil {
continue
}
for _, addr := range addrs {
addrsArr = append(addrsArr, addr.String())
}
INTER_NAME_ADDRS_MAP[inter.Name] = addrsArr
}
}
type MetricInterface struct {
Timestamp int64
Name string
Ip string
TotalByteIn uint64
TotalPacketIn uint64
TotalErrorIn uint64
TotalDropIn uint64
TotalByteOut uint64
TotalPacketOut uint64
TotalErrorOut uint64
TotalDropOut uint64
}
func GetInterfaceInfo() (map[string]*MetricInterface, error) {
interMap := make(map[string]*MetricInterface)
file, err := os.Open("/proc/net/dev")
if err != nil {
return interMap, err
}
defer file.Close()
reader := bufio.NewReader(file)
scanner := bufio.NewScanner(reader)
lineno := 0
for scanner.Scan() {
lineno++
if lineno <= 2 {
continue
}
fields := strings.Split(scanner.Text(), ":")
if len(fields) < 2 {
continue
}
inter := &MetricInterface{Timestamp: time.Now().Unix(), Name: strings.TrimSpace(fields[0])}
metrics := strings.Fields(fields[1])
inter.TotalByteIn, err = strconv.ParseUint(metrics[BYTES_IN_IDX], 10, 64)
if err != nil {
return interMap, err
}
inter.TotalPacketIn, err = strconv.ParseUint(metrics[PACKETS_IN_IDX], 10, 64)
if err != nil {
return interMap, err
}
inter.TotalErrorIn, err = strconv.ParseUint(metrics[ERRS_IN_IDX], 10, 64)
if err != nil {
return interMap, err
}
inter.TotalDropIn, err = strconv.ParseUint(metrics[DROP_IN_IDX], 10, 64)
if err != nil {
return interMap, err
}
inter.TotalByteOut, err = strconv.ParseUint(metrics[BYTES_OUT_IDX], 10, 64)
if err != nil {
return interMap, err
}
inter.TotalPacketOut, err = strconv.ParseUint(metrics[PACKETS_OUT_IDX], 10, 64)
if err != nil {
return interMap, err
}
inter.TotalErrorOut, err = strconv.ParseUint(metrics[ERRS_OUT_IDX], 10, 64)
if err != nil {
return interMap, err
}
inter.TotalDropOut, err = strconv.ParseUint(metrics[DROP_OUT_IDX], 10, 64)
if err != nil {
return interMap, err
}
interMap[inter.Name] = inter
}
return interMap, nil
}