Add wireless statistics (airtime)
This commit is contained in:
		
							parent
							
								
									ed6e67fa13
								
							
						
					
					
						commit
						ab01eb0d9e
					
				@ -11,10 +11,7 @@ type Wireless struct {
 | 
			
		||||
	Channel5  uint32 `json:"channel5,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type WirelessStatistics struct {
 | 
			
		||||
	Airtime24 *WirelessAirtime `json:"airtime24,omitempty"`
 | 
			
		||||
	Airtime5  *WirelessAirtime `json:"airtime5,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
type WirelessStatistics []*WirelessAirtime
 | 
			
		||||
 | 
			
		||||
type WirelessAirtime struct {
 | 
			
		||||
	ChanUtil float32 // Channel utilization
 | 
			
		||||
@ -29,19 +26,28 @@ type WirelessAirtime struct {
 | 
			
		||||
	Frequency   uint32 `json:"frequency"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Calculates the utilization values in regard to the previous values
 | 
			
		||||
func (cur *WirelessStatistics) SetUtilization(prev *WirelessStatistics) {
 | 
			
		||||
	if cur.Airtime24 != nil {
 | 
			
		||||
		cur.Airtime24.SetUtilization(prev.Airtime24)
 | 
			
		||||
func (airtime WirelessAirtime) FrequencyName() string {
 | 
			
		||||
	if airtime.Frequency < 5000 {
 | 
			
		||||
		return "11g"
 | 
			
		||||
	} else {
 | 
			
		||||
		return "11a"
 | 
			
		||||
	}
 | 
			
		||||
	if cur.Airtime5 != nil {
 | 
			
		||||
		cur.Airtime5.SetUtilization(prev.Airtime5)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Calculates the utilization values in regard to the previous values
 | 
			
		||||
func (current WirelessStatistics) SetUtilization(previous WirelessStatistics) {
 | 
			
		||||
	for _, c := range current {
 | 
			
		||||
		for _, p := range previous {
 | 
			
		||||
			if c.Frequency == p.Frequency {
 | 
			
		||||
				c.SetUtilization(p)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Calculates the utilization values in regard to the previous values
 | 
			
		||||
func (cur *WirelessAirtime) SetUtilization(prev *WirelessAirtime) {
 | 
			
		||||
	if prev == nil || cur.Active_time <= prev.Active_time {
 | 
			
		||||
	if cur.Active_time <= prev.Active_time {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -6,6 +6,14 @@ import (
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestFrequencyName(t *testing.T) {
 | 
			
		||||
	assert := assert.New(t)
 | 
			
		||||
 | 
			
		||||
	assert.Equal("11a", WirelessAirtime{Frequency: 5000}.FrequencyName())
 | 
			
		||||
	assert.Equal("11g", WirelessAirtime{Frequency: 4999}.FrequencyName())
 | 
			
		||||
	assert.Equal("11g", WirelessAirtime{Frequency: 2412}.FrequencyName())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestUtilization(t *testing.T) {
 | 
			
		||||
	assert := assert.New(t)
 | 
			
		||||
 | 
			
		||||
@ -45,18 +53,28 @@ func TestUtilization(t *testing.T) {
 | 
			
		||||
	assert.EqualValues(0, t3.TxUtil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestUtilizationStatistics(t *testing.T) {
 | 
			
		||||
func TestWirelessStatistics(t *testing.T) {
 | 
			
		||||
	assert := assert.New(t)
 | 
			
		||||
	stats := WirelessStatistics{
 | 
			
		||||
		Airtime24: &WirelessAirtime{Active_time: 20},
 | 
			
		||||
		Airtime5:  &WirelessAirtime{Active_time: 20},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	stats.SetUtilization(&WirelessStatistics{
 | 
			
		||||
		Airtime24: &WirelessAirtime{},
 | 
			
		||||
		Airtime5:  &WirelessAirtime{},
 | 
			
		||||
	})
 | 
			
		||||
	stats := WirelessStatistics([]*WirelessAirtime{{
 | 
			
		||||
		Frequency:   2400,
 | 
			
		||||
		Active_time: 20,
 | 
			
		||||
		Tx_time:     10,
 | 
			
		||||
	}})
 | 
			
		||||
 | 
			
		||||
	assert.Equal(20, int(stats.Airtime24.Active_time))
 | 
			
		||||
	assert.Equal(20, int(stats.Airtime5.Active_time))
 | 
			
		||||
	// Different Frequency, should not change anything
 | 
			
		||||
	stats.SetUtilization([]*WirelessAirtime{{
 | 
			
		||||
		Frequency:   5000,
 | 
			
		||||
		Active_time: 15,
 | 
			
		||||
		Tx_time:     1,
 | 
			
		||||
	}})
 | 
			
		||||
	assert.EqualValues(0, stats[0].ChanUtil)
 | 
			
		||||
 | 
			
		||||
	// Same Frequency, should set the utilization
 | 
			
		||||
	stats.SetUtilization([]*WirelessAirtime{{
 | 
			
		||||
		Frequency:   2400,
 | 
			
		||||
		Active_time: 10,
 | 
			
		||||
		Tx_time:     5,
 | 
			
		||||
	}})
 | 
			
		||||
	assert.EqualValues(50, stats[0].ChanUtil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ type Statistics struct {
 | 
			
		||||
		MgmtRx  *Traffic `json:"mgmt_rx"`
 | 
			
		||||
	} `json:"traffic,omitempty"`
 | 
			
		||||
	Switch   map[string]*SwitchPort `json:"switch,omitempty"`
 | 
			
		||||
	Wireless *WirelessStatistics    `json:"wireless,omitempty"`
 | 
			
		||||
	Wireless WirelessStatistics     `json:"wireless,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type MeshVPNPeerLink struct {
 | 
			
		||||
 | 
			
		||||
@ -1,12 +1,11 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"github.com/FreifunkBremen/respond-collector/data"
 | 
			
		||||
	"github.com/FreifunkBremen/respond-collector/jsontime"
 | 
			
		||||
	"github.com/FreifunkBremen/respond-collector/meshviewer"
 | 
			
		||||
	imodels "github.com/influxdata/influxdb/models"
 | 
			
		||||
	"strconv"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Node struct
 | 
			
		||||
@ -73,22 +72,15 @@ func (node *Node) ToInflux() (tags imodels.Tags, fields imodels.Fields) {
 | 
			
		||||
		fields["traffic.mgmt_tx.bytes"] = int64(t.Bytes)
 | 
			
		||||
		fields["traffic.mgmt_tx.packets"] = t.Packets
 | 
			
		||||
	}
 | 
			
		||||
	if w := stats.Wireless; w != nil {
 | 
			
		||||
		addAirtime := func(suffix string, time *data.WirelessAirtime) {
 | 
			
		||||
			fields["airtime"+suffix+".chan_util"] = time.ChanUtil
 | 
			
		||||
			fields["airtime"+suffix+".rx_util"] = time.RxUtil
 | 
			
		||||
			fields["airtime"+suffix+".tx_util"] = time.TxUtil
 | 
			
		||||
			fields["airtime"+suffix+".noise"] = time.Noise
 | 
			
		||||
			fields["airtime"+suffix+".frequency"] = time.Frequency
 | 
			
		||||
			tags.SetString("frequency"+suffix, strconv.Itoa(int(time.Frequency)))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if time := w.Airtime24; time != nil {
 | 
			
		||||
			addAirtime("24", w.Airtime24)
 | 
			
		||||
		}
 | 
			
		||||
		if time := w.Airtime5; time != nil {
 | 
			
		||||
			addAirtime("5", w.Airtime5)
 | 
			
		||||
		}
 | 
			
		||||
	for _, airtime := range stats.Wireless {
 | 
			
		||||
		suffix := airtime.FrequencyName()
 | 
			
		||||
		fields["airtime"+suffix+".chan_util"] = airtime.ChanUtil
 | 
			
		||||
		fields["airtime"+suffix+".rx_util"] = airtime.RxUtil
 | 
			
		||||
		fields["airtime"+suffix+".tx_util"] = airtime.TxUtil
 | 
			
		||||
		fields["airtime"+suffix+".noise"] = airtime.Noise
 | 
			
		||||
		fields["airtime"+suffix+".frequency"] = airtime.Frequency
 | 
			
		||||
		tags.SetString("frequency"+suffix, strconv.Itoa(int(airtime.Frequency)))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,6 @@ import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"compress/flate"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net"
 | 
			
		||||
	"reflect"
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user