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  }