From ab01eb0d9ef3f33923982b0e7440c4461e6b9cc3 Mon Sep 17 00:00:00 2001 From: Julian Kornberger Date: Thu, 22 Dec 2016 03:14:51 +0100 Subject: [PATCH] Add wireless statistics (airtime) --- data/airtime.go | 28 +++++++++++++++++----------- data/airtime_test.go | 40 +++++++++++++++++++++++++++++----------- data/statistics.go | 2 +- models/node.go | 26 +++++++++----------------- respond/collector.go | 1 - 5 files changed, 56 insertions(+), 41 deletions(-) diff --git a/data/airtime.go b/data/airtime.go index 2e8f679..0c8ef3b 100644 --- a/data/airtime.go +++ b/data/airtime.go @@ -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 } diff --git a/data/airtime_test.go b/data/airtime_test.go index e0b2955..ed00cd1 100644 --- a/data/airtime_test.go +++ b/data/airtime_test.go @@ -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) } diff --git a/data/statistics.go b/data/statistics.go index 1a7fae8..a97c63d 100644 --- a/data/statistics.go +++ b/data/statistics.go @@ -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 { diff --git a/models/node.go b/models/node.go index 5359ac6..31427f1 100644 --- a/models/node.go +++ b/models/node.go @@ -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 diff --git a/respond/collector.go b/respond/collector.go index 61aa0ee..c2c4959 100644 --- a/respond/collector.go +++ b/respond/collector.go @@ -4,7 +4,6 @@ import ( "bytes" "compress/flate" "encoding/json" - "io/ioutil" "log" "net" "reflect"