github.com/netdata/go.d.plugin@v0.58.1/modules/openvpn/collect.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package openvpn 4 5 import ( 6 "fmt" 7 "time" 8 ) 9 10 func (o *OpenVPN) collect() (map[string]int64, error) { 11 var err error 12 13 if err := o.client.Connect(); err != nil { 14 return nil, err 15 } 16 defer func() { _ = o.client.Disconnect() }() 17 18 mx := make(map[string]int64) 19 20 if err = o.collectLoadStats(mx); err != nil { 21 return nil, err 22 } 23 24 if o.perUserMatcher != nil { 25 if err = o.collectUsers(mx); err != nil { 26 return nil, err 27 } 28 } 29 30 return mx, nil 31 } 32 33 func (o *OpenVPN) collectLoadStats(mx map[string]int64) error { 34 stats, err := o.client.LoadStats() 35 if err != nil { 36 return err 37 } 38 39 mx["clients"] = stats.NumOfClients 40 mx["bytes_in"] = stats.BytesIn 41 mx["bytes_out"] = stats.BytesOut 42 return nil 43 } 44 45 func (o *OpenVPN) collectUsers(mx map[string]int64) error { 46 users, err := o.client.Users() 47 if err != nil { 48 return err 49 } 50 51 now := time.Now().Unix() 52 var name string 53 54 for _, user := range users { 55 if user.Username == "UNDEF" { 56 name = user.CommonName 57 } else { 58 name = user.Username 59 } 60 61 if !o.perUserMatcher.MatchString(name) { 62 continue 63 } 64 if !o.collectedUsers[name] { 65 o.collectedUsers[name] = true 66 if err := o.addUserCharts(name); err != nil { 67 o.Warning(err) 68 } 69 } 70 mx[name+"_bytes_received"] = user.BytesReceived 71 mx[name+"_bytes_sent"] = user.BytesSent 72 mx[name+"_connection_time"] = now - user.ConnectedSince 73 } 74 return nil 75 } 76 77 func (o *OpenVPN) addUserCharts(userName string) error { 78 cs := userCharts.Copy() 79 80 for _, chart := range *cs { 81 chart.ID = fmt.Sprintf(chart.ID, userName) 82 chart.Fam = fmt.Sprintf(chart.Fam, userName) 83 84 for _, dim := range chart.Dims { 85 dim.ID = fmt.Sprintf(dim.ID, userName) 86 } 87 chart.MarkNotCreated() 88 } 89 return o.charts.Add(*cs...) 90 }