Copy data structs from node-informant/gluon-collector/data
Some fields are missing there
This commit is contained in:
parent
0bfcd8a720
commit
d1b315aa6e
|
@ -0,0 +1,26 @@
|
||||||
|
package data
|
||||||
|
|
||||||
|
type Neighbours struct {
|
||||||
|
Batadv map[string]BatadvNeighbours `json:"batadv"`
|
||||||
|
//WifiNeighbours map[string]WifiNeighbours `json:"wifi"`
|
||||||
|
NodeId string `json:"node_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type WifiLink struct {
|
||||||
|
Inactive int `json:"inactive"`
|
||||||
|
Noise int `json:"nois"`
|
||||||
|
Signal int `json:"signal"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type BatmanLink struct {
|
||||||
|
Lastseen float64 `json:"lastseen"`
|
||||||
|
Tq int `json:"tq"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type BatadvNeighbours struct {
|
||||||
|
Neighbours map[string]BatmanLink `json:"neighbours"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type WifiNeighbours struct {
|
||||||
|
Neighbours map[string]WifiLink `json:"neighbours"`
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package data
|
||||||
|
|
||||||
|
type NodeInfo struct {
|
||||||
|
NodeId string `json:"node_id"`
|
||||||
|
Network Network `json:"network"`
|
||||||
|
Owner *Owner `json:"owner,omitempty"`
|
||||||
|
System System `json:"system"`
|
||||||
|
Hostname string `json:"hostname"`
|
||||||
|
Location *Location `json:"location,omitempty"`
|
||||||
|
Software Software `json:"software"`
|
||||||
|
Hardware Hardware `json:"hardware"`
|
||||||
|
VPN bool `json:"vpn"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Network struct {
|
||||||
|
Mac string `json:"mac"`
|
||||||
|
Addresses []string `json:"addresses"`
|
||||||
|
Mesh struct {
|
||||||
|
Bat0 struct {
|
||||||
|
Interfaces struct {
|
||||||
|
Wireless []string `json:"wireless,omitempty"`
|
||||||
|
Other []string `json:"other,omitempty"`
|
||||||
|
Tunnel []string `json:"tunnel,omitempty"`
|
||||||
|
} `json:"interfaces"`
|
||||||
|
} `json:"bat0"`
|
||||||
|
} `json:"mesh"`
|
||||||
|
MeshInterfaces []string `json:"mesh_interfaces"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Owner struct {
|
||||||
|
Contact string `json:"contact"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type System struct {
|
||||||
|
SiteCode string `json:"site_code"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Location struct {
|
||||||
|
Longtitude float64 `json:"longitude"`
|
||||||
|
Latitude float64 `json:"latitude"`
|
||||||
|
Altitude float64 `json:"altitude,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Software struct {
|
||||||
|
Autoupdater *struct {
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
Branch string `json:"branch"`
|
||||||
|
} `json:"autoupdater,omitempty"`
|
||||||
|
BatmanAdv *struct {
|
||||||
|
Version string `json:"version"`
|
||||||
|
Compat int `json:"compat"`
|
||||||
|
} `json:"batman-adv,omitempty"`
|
||||||
|
Fastd *struct {
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
Version string `json:"version"`
|
||||||
|
} `json:"fastd,omitempty"`
|
||||||
|
Firmware *struct {
|
||||||
|
Base string `json:"base"`
|
||||||
|
Release string `json:"release"`
|
||||||
|
} `json:"firmware,omitempty"`
|
||||||
|
StatusPage *struct {
|
||||||
|
Api int `json:"api"`
|
||||||
|
} `json:"status-page,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Hardware struct {
|
||||||
|
Nproc int `json:"nproc"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
package data
|
||||||
|
|
||||||
|
type Statistics struct {
|
||||||
|
NodeId string `json:"node_id"`
|
||||||
|
Clients Clients `json:"clients"`
|
||||||
|
RootFsUsage float64 `json:"rootfs_usage"`
|
||||||
|
Traffic *Traffic `json:"traffic"`
|
||||||
|
Memory Memory `json:"memory"`
|
||||||
|
Uptime float64 `json:"uptime"`
|
||||||
|
Idletime float64 `json:"idletime"`
|
||||||
|
Gateway string `json:"gateway"`
|
||||||
|
Processes struct {
|
||||||
|
Total uint32 `json:"total"`
|
||||||
|
Running uint32 `json:"running"`
|
||||||
|
} `json:"processes"`
|
||||||
|
LoadAverage float64 `json:"loadavg"`
|
||||||
|
MeshVpn *MeshVPN `json:"mesh_vpn,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MeshVPNPeerLink struct {
|
||||||
|
Established float64 `json:"established"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MeshVPNPeerGroup struct {
|
||||||
|
Peers map[string]*MeshVPNPeerLink `json:"peers"`
|
||||||
|
Groups map[string]*MeshVPNPeerGroup `json:"groups"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MeshVPN struct {
|
||||||
|
Groups map[string]*MeshVPNPeerGroup `json:"groups,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type TrafficEntry struct {
|
||||||
|
// Some nodes return bytes as float value
|
||||||
|
Bytes float64 `json:"bytes,omitempty"`
|
||||||
|
Packets float64 `json:"packets,omitempty"`
|
||||||
|
Dropped float64 `json:"dropped,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Traffic struct {
|
||||||
|
Tx *TrafficEntry `json:"tx"`
|
||||||
|
Rx *TrafficEntry `json:"rx"`
|
||||||
|
Forward *TrafficEntry `json:"forward"`
|
||||||
|
MgmtTx *TrafficEntry `json:"mgmt_tx"`
|
||||||
|
MgmtRx *TrafficEntry `json:"mgmt_rx"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Clients struct {
|
||||||
|
Wifi uint32 `json:"wifi"`
|
||||||
|
Wifi24 uint32 `json:"wifi24"`
|
||||||
|
Wifi5 uint32 `json:"wifi5"`
|
||||||
|
Total uint32 `json:"total"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Memory struct {
|
||||||
|
Cached uint64 `json:"cached"`
|
||||||
|
Total uint64 `json:"total"`
|
||||||
|
Buffers uint64 `json:"buffers"`
|
||||||
|
Free uint64 `json:"free"`
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package data
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"io/ioutil"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStatistics(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
obj := &Statistics{}
|
||||||
|
testfile("statistics.json", obj)
|
||||||
|
|
||||||
|
assert.Equal("f81a67a601ea", obj.NodeId)
|
||||||
|
assert.Equal("52:54:00:a9:f7:6e", obj.Gateway)
|
||||||
|
assert.Equal(float64(57861871176), obj.Traffic.Rx.Bytes)
|
||||||
|
assert.Equal(uint32(35), obj.Clients.Total)
|
||||||
|
assert.Equal(uint32(35), obj.Clients.Wifi)
|
||||||
|
assert.Equal(uint32(30), obj.Clients.Wifi24)
|
||||||
|
assert.Equal(uint32(8), obj.Clients.Wifi5)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testfile(name string, obj interface{}) {
|
||||||
|
file, err := ioutil.ReadFile("testdata/" + name)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := json.Unmarshal(file, obj); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
{
|
||||||
|
"software": {
|
||||||
|
"autoupdater": {
|
||||||
|
"branch": "stable",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"batman-adv": {
|
||||||
|
"version": "2013.4.0",
|
||||||
|
"compat": 14
|
||||||
|
},
|
||||||
|
"fastd": {
|
||||||
|
"version": "v17",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"firmware": {
|
||||||
|
"base": "gluon-v2016.1.2",
|
||||||
|
"release": "2016.1.2+bremen1"
|
||||||
|
},
|
||||||
|
"status-page": {
|
||||||
|
"api": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"network": {
|
||||||
|
"addresses": [
|
||||||
|
"fd2f:5119:f2c:0:fa1a:67ff:fea6:1ea",
|
||||||
|
"2a06:8782:ffbb:1337:fa1a:67ff:fea6:1ea",
|
||||||
|
"fe80::fa1a:67ff:fea6:1ea"
|
||||||
|
],
|
||||||
|
"mesh": {
|
||||||
|
"bat0": {
|
||||||
|
"interfaces": {
|
||||||
|
"wireless": [
|
||||||
|
"fa:1d:69:a6:01:ea",
|
||||||
|
"fa:1d:68:a6:01:ea"
|
||||||
|
],
|
||||||
|
"tunnel": [
|
||||||
|
"fa:1e:67:a6:01:ea"
|
||||||
|
],
|
||||||
|
"other": [
|
||||||
|
"fa:1b:68:a6:01:ea"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mac": "f8:1a:67:a6:01:ea"
|
||||||
|
},
|
||||||
|
"location": {
|
||||||
|
"latitude": 53.079362250000006,
|
||||||
|
"longitude": 8.88002693
|
||||||
|
},
|
||||||
|
"owner": {
|
||||||
|
"contact": "freifunk@example.com"
|
||||||
|
},
|
||||||
|
"system": {
|
||||||
|
"site_code": "ffhb"
|
||||||
|
},
|
||||||
|
"node_id": "f81a67a601ea",
|
||||||
|
"hostname": "foo-bar",
|
||||||
|
"hardware": {
|
||||||
|
"model": "TP-Link TL-WDR4900 v1",
|
||||||
|
"nproc": 1
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
{
|
||||||
|
"clients": {
|
||||||
|
"total": 35,
|
||||||
|
"wifi": 35,
|
||||||
|
"wifi24": 30,
|
||||||
|
"wifi5": 8
|
||||||
|
},
|
||||||
|
"traffic": {
|
||||||
|
"rx": {
|
||||||
|
"packets": 66182267,
|
||||||
|
"bytes": 57861871176
|
||||||
|
},
|
||||||
|
"tx": {
|
||||||
|
"packets": 26751682,
|
||||||
|
"bytes": 3669258402.9999998,
|
||||||
|
"dropped": 23764
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"packets": 2223,
|
||||||
|
"bytes": 252299
|
||||||
|
},
|
||||||
|
"mgmt_rx": {
|
||||||
|
"packets": 3461523,
|
||||||
|
"bytes": 427521481
|
||||||
|
},
|
||||||
|
"mgmt_tx": {
|
||||||
|
"packets": 7694493,
|
||||||
|
"bytes": 1500526811
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gateway": "52:54:00:a9:f7:6e",
|
||||||
|
"mesh_vpn": {
|
||||||
|
"groups": {
|
||||||
|
"backbone": {
|
||||||
|
"peers": {
|
||||||
|
"vpn02": null,
|
||||||
|
"vpn01": null,
|
||||||
|
"vpn06": {
|
||||||
|
"established": 138270.378
|
||||||
|
},
|
||||||
|
"vpn05": null,
|
||||||
|
"vpn04": null,
|
||||||
|
"vpn03": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_id": "f81a67a601ea",
|
||||||
|
"rootfs_usage": 0.04178994082840237,
|
||||||
|
"memory": {
|
||||||
|
"total": 126200,
|
||||||
|
"free": 86452,
|
||||||
|
"buffers": 2308,
|
||||||
|
"cached": 8596
|
||||||
|
},
|
||||||
|
"uptime": 138355.13,
|
||||||
|
"idletime": 106305.02,
|
||||||
|
"loadavg": 0.48,
|
||||||
|
"processes": {
|
||||||
|
"running": 3,
|
||||||
|
"total": 47
|
||||||
|
}
|
||||||
|
}
|
6
main.go
6
main.go
|
@ -10,7 +10,7 @@ import (
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ffdo/node-informant/gluon-collector/data"
|
"github.com/monitormap/micro-daemon/data"
|
||||||
"github.com/monitormap/micro-daemon/models"
|
"github.com/monitormap/micro-daemon/models"
|
||||||
"github.com/monitormap/micro-daemon/respond"
|
"github.com/monitormap/micro-daemon/respond"
|
||||||
"github.com/monitormap/micro-daemon/websocketserver"
|
"github.com/monitormap/micro-daemon/websocketserver"
|
||||||
|
@ -82,10 +82,10 @@ func onReceive(addr net.UDPAddr, msg interface{}) {
|
||||||
case *data.NodeInfo:
|
case *data.NodeInfo:
|
||||||
nodes.Get(msg.NodeId).Nodeinfo = msg
|
nodes.Get(msg.NodeId).Nodeinfo = msg
|
||||||
|
|
||||||
case *data.NeighbourStruct:
|
case *data.Neighbours:
|
||||||
nodes.Get(msg.NodeId).Neighbours = msg
|
nodes.Get(msg.NodeId).Neighbours = msg
|
||||||
|
|
||||||
case *data.StatisticsStruct:
|
case *data.Statistics:
|
||||||
nodes.Get(msg.NodeId).Statistics = msg
|
nodes.Get(msg.NodeId).Statistics = msg
|
||||||
|
|
||||||
// store data?
|
// store data?
|
||||||
|
|
|
@ -8,16 +8,16 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ffdo/node-informant/gluon-collector/data"
|
"github.com/monitormap/micro-daemon/data"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Node struct
|
// Node struct
|
||||||
type Node struct {
|
type Node struct {
|
||||||
Firstseen time.Time `json:"firstseen"`
|
Firstseen time.Time `json:"firstseen"`
|
||||||
Lastseen time.Time `json:"lastseen"`
|
Lastseen time.Time `json:"lastseen"`
|
||||||
Statistics *data.StatisticsStruct `json:"statistics"`
|
Statistics *data.Statistics `json:"statistics"`
|
||||||
Nodeinfo *data.NodeInfo `json:"nodeinfo"`
|
Nodeinfo *data.NodeInfo `json:"nodeinfo"`
|
||||||
Neighbours *data.NeighbourStruct `json:"-"`
|
Neighbours *data.Neighbours `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type NodeElement struct {
|
type NodeElement struct {
|
||||||
|
@ -53,8 +53,8 @@ func (nodes *Nodes) Get(nodeID string) *Node {
|
||||||
node = &Node{
|
node = &Node{
|
||||||
Firstseen: now,
|
Firstseen: now,
|
||||||
Nodeinfo: &data.NodeInfo{},
|
Nodeinfo: &data.NodeInfo{},
|
||||||
Statistics: &data.StatisticsStruct{},
|
Statistics: &data.Statistics{},
|
||||||
Neighbours: &data.NeighbourStruct{},
|
Neighbours: &data.Neighbours{},
|
||||||
}
|
}
|
||||||
nodes.List[nodeID] = node
|
nodes.List[nodeID] = node
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,7 +104,7 @@ func (coll *Collector) parser() {
|
||||||
if err := json.Unmarshal(obj.Raw, data); err == nil {
|
if err := json.Unmarshal(obj.Raw, data); err == nil {
|
||||||
coll.onReceive(obj.Address, data)
|
coll.onReceive(obj.Address, data)
|
||||||
} else {
|
} else {
|
||||||
log.Println("unable to decode response from", obj.Address.String(), err)
|
log.Println("unable to decode response from", obj.Address.String(), err, "\n", string(obj.Raw))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package respond
|
package respond
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/ffdo/node-informant/gluon-collector/data"
|
"github.com/monitormap/micro-daemon/data"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -14,9 +14,9 @@ type MultiCollector struct {
|
||||||
func NewMultiCollector(interval time.Duration, onReceive OnReceive) *MultiCollector {
|
func NewMultiCollector(interval time.Duration, onReceive OnReceive) *MultiCollector {
|
||||||
return &MultiCollector{
|
return &MultiCollector{
|
||||||
collectors: []*Collector{
|
collectors: []*Collector{
|
||||||
NewCollector("statistics", interval, data.StatisticsStruct{}, onReceive),
|
NewCollector("statistics", interval, data.Statistics{}, onReceive),
|
||||||
NewCollector("nodeinfo", interval, data.NodeInfo{}, onReceive),
|
NewCollector("nodeinfo", interval, data.NodeInfo{}, onReceive),
|
||||||
NewCollector("neighbours", interval, data.NeighbourStruct{}, onReceive),
|
NewCollector("neighbours", interval, data.Neighbours{}, onReceive),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
45
stats_db.go
45
stats_db.go
|
@ -5,8 +5,8 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ffdo/node-informant/gluon-collector/data"
|
|
||||||
"github.com/influxdata/influxdb/client/v2"
|
"github.com/influxdata/influxdb/client/v2"
|
||||||
|
"github.com/monitormap/micro-daemon/data"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -43,24 +43,45 @@ func NewStatsDb() *StatsDb {
|
||||||
return db
|
return db
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *StatsDb) Add(stats *data.StatisticsStruct) {
|
func (c *StatsDb) Add(stats *data.Statistics) {
|
||||||
tags := map[string]string{
|
tags := map[string]string{
|
||||||
"nodeid": stats.NodeId,
|
"nodeid": stats.NodeId,
|
||||||
}
|
}
|
||||||
fields := map[string]interface{}{
|
fields := map[string]interface{}{
|
||||||
"load": stats.LoadAverage,
|
"load": stats.LoadAverage,
|
||||||
"processes.open": stats.Processes.Running,
|
"idletime": uint64(stats.Idletime),
|
||||||
|
"uptime": uint64(stats.Uptime),
|
||||||
|
"processes.running": stats.Processes.Running,
|
||||||
"clients.wifi": stats.Clients.Wifi,
|
"clients.wifi": stats.Clients.Wifi,
|
||||||
|
"clients.wifi24": stats.Clients.Wifi24,
|
||||||
|
"clients.wifi5": stats.Clients.Wifi5,
|
||||||
"clients.total": stats.Clients.Total,
|
"clients.total": stats.Clients.Total,
|
||||||
"traffic.forward": stats.Traffic.Forward,
|
"memory.buffers": stats.Memory.Buffers,
|
||||||
"traffic.rx": stats.Traffic.Rx,
|
"memory.cached": stats.Memory.Cached,
|
||||||
"traffic.tx": stats.Traffic.Tx,
|
"memory.free": stats.Memory.Free,
|
||||||
"traffic.mgmt.rx": stats.Traffic.MgmtRx,
|
"memory.total": stats.Memory.Total,
|
||||||
"traffic.mgmt.tx": stats.Traffic.MgmtTx,
|
}
|
||||||
"traffic.memory.buffers": stats.Memory.Buffers,
|
|
||||||
"traffic.memory.cached": stats.Memory.Cached,
|
if t := stats.Traffic.Rx; t != nil {
|
||||||
"traffic.memory.free": stats.Memory.Free,
|
fields["traffic.rx.bytes"] = uint64(t.Bytes)
|
||||||
"traffic.memory.total": stats.Memory.Total,
|
fields["traffic.rx.packets"] = t.Packets
|
||||||
|
}
|
||||||
|
if t := stats.Traffic.Tx; t != nil {
|
||||||
|
fields["traffic.tx.bytes"] = uint64(t.Bytes)
|
||||||
|
fields["traffic.tx.packets"] = t.Packets
|
||||||
|
fields["traffic.tx.dropped"] = t.Dropped
|
||||||
|
}
|
||||||
|
if t := stats.Traffic.Forward; t != nil {
|
||||||
|
fields["traffic.forward.bytes"] = uint64(t.Bytes)
|
||||||
|
fields["traffic.forward.packets"] = t.Packets
|
||||||
|
}
|
||||||
|
if t := stats.Traffic.MgmtRx; t != nil {
|
||||||
|
fields["traffic.mgmt_rx.bytes"] = uint64(t.Bytes)
|
||||||
|
fields["traffic.mgmt_rx.packets"] = t.Packets
|
||||||
|
}
|
||||||
|
if t := stats.Traffic.MgmtTx; t != nil {
|
||||||
|
fields["traffic.mgmt_tx.bytes"] = uint64(t.Bytes)
|
||||||
|
fields["traffic.mgmt_tx.packets"] = t.Packets
|
||||||
}
|
}
|
||||||
|
|
||||||
point, err := client.NewPoint("node", tags, fields, time.Now())
|
point, err := client.NewPoint("node", tags, fields, time.Now())
|
||||||
|
|
Loading…
Reference in New Issue