From 99eb11f2efaeaff4ad614c5035ad9f2ae9ec8666 Mon Sep 17 00:00:00 2001 From: Martin/Geno Date: Tue, 28 May 2019 19:27:48 +0200 Subject: [PATCH] [TASK] improve neighbours stats (+ babel support) --- database/graphite/node.go | 37 ++++++++++++++++++---------- database/influxdb/node.go | 39 ++++++++++++++++++++---------- database/influxdb/node_test.go | 44 +++++++++++++++++++++------------- 3 files changed, 78 insertions(+), 42 deletions(-) diff --git a/database/graphite/node.go b/database/graphite/node.go index d5db231..5f9dca7 100644 --- a/database/graphite/node.go +++ b/database/graphite/node.go @@ -30,25 +30,36 @@ func (c *Connection) InsertNode(node *runtime.Node) { fields = append(fields, graphigo.Metric{Name: node_prefix + "." + name, Value: value}) } + vpnInterfaces := make(map[string]bool) + for _, mIface := range nodeinfo.Network.Mesh { + for _, tunnel := range mIface.Interfaces.Tunnel { + vpnInterfaces[tunnel] = true + } + } + if neighbours := node.Neighbours; neighbours != nil { vpn := 0 - if meshvpn := stats.MeshVPN; meshvpn != nil { - for _, group := range meshvpn.Groups { - for _, link := range group.Peers { - if link != nil && link.Established > 1 { - vpn++ - } - } - } - } - addField("neighbours.vpn", vpn) + // protocol: Batman Advance batadv := 0 - for _, batadvNeighbours := range neighbours.Batadv { + for mac, batadvNeighbours := range neighbours.Batadv { batadv += len(batadvNeighbours.Neighbours) + if _, ok := vpnInterfaces[mac]; ok { + vpn += len(batadvNeighbours.Neighbours) + } } addField("neighbours.batadv", batadv) + // protocol: Babel + babel := 0 + for _, babelNeighbours := range neighbours.Babel { + babel += len(babelNeighbours.Neighbours) + if _, ok := vpnInterfaces[babelNeighbours.LinkLocalAddress]; ok { + vpn += len(babelNeighbours.Neighbours) + } + } + addField("neighbours.babel", babel) + // protocol: LLDP lldp := 0 for _, lldpNeighbours := range neighbours.LLDP { @@ -56,8 +67,10 @@ func (c *Connection) InsertNode(node *runtime.Node) { } addField("neighbours.lldp", lldp) + addField("neighbours.vpn", vpn) + // total is the sum of all protocols - addField("neighbours.total", batadv+lldp) + addField("neighbours.total", batadv+babel+lldp) } if t := stats.Traffic.Rx; t != nil { diff --git a/database/influxdb/node.go b/database/influxdb/node.go index daf3c83..9c69d5c 100644 --- a/database/influxdb/node.go +++ b/database/influxdb/node.go @@ -48,7 +48,15 @@ func (conn *Connection) InsertNode(node *runtime.Node) { "memory.available": stats.Memory.Available, } + vpnInterfaces := make(map[string]bool) + if nodeinfo := node.Nodeinfo; nodeinfo != nil { + for _, mIface := range nodeinfo.Network.Mesh { + for _, tunnel := range mIface.Interfaces.Tunnel { + vpnInterfaces[tunnel] = true + } + } + tags.SetString("hostname", nodeinfo.Hostname) if nodeinfo.System.SiteCode != "" { tags.SetString("site", nodeinfo.System.SiteCode) @@ -75,28 +83,30 @@ func (conn *Connection) InsertNode(node *runtime.Node) { } } - if neighbours := node.Neighbours; neighbours != nil { // VPN Neighbours are Neighbours but includet in one protocol vpn := 0 - if meshvpn := stats.MeshVPN; meshvpn != nil { - for _, group := range meshvpn.Groups { - for _, link := range group.Peers { - if link != nil && link.Established > 1 { - vpn++ - } - } - } - } - fields["neighbours.vpn"] = vpn // protocol: Batman Advance batadv := 0 - for _, batadvNeighbours := range neighbours.Batadv { + for mac, batadvNeighbours := range neighbours.Batadv { batadv += len(batadvNeighbours.Neighbours) + if _, ok := vpnInterfaces[mac]; ok { + vpn += len(batadvNeighbours.Neighbours) + } } fields["neighbours.batadv"] = batadv + // protocol: Babel + babel := 0 + for _, babelNeighbours := range neighbours.Babel { + babel += len(babelNeighbours.Neighbours) + if _, ok := vpnInterfaces[babelNeighbours.LinkLocalAddress]; ok { + vpn += len(babelNeighbours.Neighbours) + } + } + fields["neighbours.babel"] = babel + // protocol: LLDP lldp := 0 for _, lldpNeighbours := range neighbours.LLDP { @@ -104,8 +114,11 @@ func (conn *Connection) InsertNode(node *runtime.Node) { } fields["neighbours.lldp"] = lldp + // vpn wait for babel + fields["neighbours.vpn"] = vpn + // total is the sum of all protocols - fields["neighbours.total"] = batadv + lldp + fields["neighbours.total"] = batadv + babel + lldp } if procstat := stats.ProcStats; procstat != nil { fields["stat.cpu.user"] = procstat.CPU.User diff --git a/database/influxdb/node_test.go b/database/influxdb/node_test.go index f2286dd..cfc5768 100644 --- a/database/influxdb/node_test.go +++ b/database/influxdb/node_test.go @@ -39,18 +39,6 @@ func TestToInflux(t *testing.T) { MgmtTx: &data.Traffic{Packets: 2327}, MgmtRx: &data.Traffic{Bytes: 2331}, }, - MeshVPN: &data.MeshVPN{ - Groups: map[string]*data.MeshVPNPeerGroup{ - "ffhb": { - Peers: map[string]*data.MeshVPNPeerLink{ - "vpn01": {Established: 3}, - "vpn02": {}, - "trash": nil, - "vpn03": {Established: 0}, - }, - }, - }, - }, }, Nodeinfo: &data.Nodeinfo{ NodeID: "deadbeef", @@ -67,6 +55,17 @@ func TestToInflux(t *testing.T) { }, Network: data.Network{ Mac: "DEADMAC", + Mesh: map[string]*data.NetworkInterface{ + "bat0": { + Interfaces: struct { + Wireless []string `json:"wireless,omitempty"` + Other []string `json:"other,omitempty"` + Tunnel []string `json:"tunnel,omitempty"` + }{ + Tunnel: []string{"a-interface-mac", "fe80::1"}, + }, + }, + }, }, Software: data.Software{ Autoupdater: struct { @@ -81,7 +80,7 @@ func TestToInflux(t *testing.T) { Neighbours: &data.Neighbours{ NodeID: "deadbeef", Batadv: map[string]data.BatadvNeighbours{ - "a-interface": { + "a-interface-mac": { Neighbours: map[string]data.BatmanLink{ "BAFF1E5": { Tq: 204, @@ -89,8 +88,18 @@ func TestToInflux(t *testing.T) { }, }, }, + Babel: map[string]data.BabelNeighbours{ + "wg-01": { + LinkLocalAddress: "fe80::1", + Neighbours: map[string]data.BabelLink{ + "fe80::2": { + Cost: 0, + }, + }, + }, + }, LLDP: map[string]data.LLDPNeighbours{ - "b-interface": {}, + "b-interface-mac": {}, }, }, } @@ -144,9 +153,10 @@ func TestToInflux(t *testing.T) { assert.EqualValues("city", tags["domain"]) assert.EqualValues(0.5, fields["load"]) assert.EqualValues(0, fields["neighbours.lldp"]) + assert.EqualValues(1, fields["neighbours.babel"]) assert.EqualValues(1, fields["neighbours.batadv"]) - assert.EqualValues(1, fields["neighbours.vpn"]) - assert.EqualValues(1, fields["neighbours.total"]) + assert.EqualValues(2, fields["neighbours.vpn"]) + assert.EqualValues(2, fields["neighbours.total"]) assert.EqualValues(uint32(3), fields["wireless.txpower24"]) assert.EqualValues(uint32(5500), fields["airtime11a.frequency"]) @@ -165,7 +175,7 @@ func TestToInflux(t *testing.T) { assert.EqualValues("link", nPoint.Name()) assert.EqualValues(map[string]string{ "source.id": "deadbeef", - "source.addr": "a-interface", + "source.addr": "a-interface-mac", "target.id": "foobar", "target.addr": "BAFF1E5", }, tags)