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