diff --git a/modules/wireguard/collect.go b/modules/wireguard/collect.go index faa2b50b2..cbcc180ec 100644 --- a/modules/wireguard/collect.go +++ b/modules/wireguard/collect.go @@ -61,6 +61,10 @@ func (w *WireGuard) collectDevicesPeers(mx map[string]int64, devices []*wgtypes. } for _, p := range d.Peers { + if p.LastHandshakeTime.IsZero() { + continue + } + pubKey := p.PublicKey.String() id := peerID(d.Name, pubKey) diff --git a/modules/wireguard/wireguard_test.go b/modules/wireguard/wireguard_test.go index 9fdfc953f..5e6434dcc 100644 --- a/modules/wireguard/wireguard_test.go +++ b/modules/wireguard/wireguard_test.go @@ -199,6 +199,37 @@ func TestWireGuard_Collect(t *testing.T) { }, }, }, + "peers without last handshake time": { + { + prepareMock: func(m *mockClient) { + d1 := prepareDevice(1) + d1.Peers = append(d1.Peers, preparePeer("11")) + d1.Peers = append(d1.Peers, preparePeer("12")) + d1.Peers = append(d1.Peers, prepareNoLastHandshakePeer("13")) + d1.Peers = append(d1.Peers, prepareNoLastHandshakePeer("14")) + m.devices = append(m.devices, d1) + }, + check: func(t *testing.T, w *WireGuard) { + mx := w.Collect() + + expected := map[string]int64{ + "device_wg1_peers": 4, + "device_wg1_receive": 0, + "device_wg1_transmit": 0, + "peer_wg1_cGVlcjExAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=_latest_handshake_ago": 60, + "peer_wg1_cGVlcjExAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=_receive": 0, + "peer_wg1_cGVlcjExAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=_transmit": 0, + "peer_wg1_cGVlcjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=_latest_handshake_ago": 60, + "peer_wg1_cGVlcjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=_receive": 0, + "peer_wg1_cGVlcjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=_transmit": 0, + } + + copyLatestHandshake(mx, expected) + assert.Equal(t, expected, mx) + assert.Equal(t, len(deviceChartsTmpl)+len(peerChartsTmpl)*2, len(*w.Charts())) + }, + }, + }, "device added at runtime": { { prepareMock: func(m *mockClient) { @@ -431,6 +462,13 @@ func preparePeer(s string) wgtypes.Peer { } } +func prepareNoLastHandshakePeer(s string) wgtypes.Peer { + p := preparePeer(s) + var lh time.Time + p.LastHandshakeTime = lh + return p +} + func copyLatestHandshake(dst, src map[string]int64) { for k, v := range src { if strings.HasSuffix(k, "latest_handshake_ago") {