1
0
mirror of https://git.zx2c4.com/wireguard-go synced 2024-11-14 16:55:15 +01:00

device: add PeerStats

Per-peer statistics are the sort of thing
clients refresh very frequently, for UIs.

They are available via UAPI, but the serialization
and deserialization is quite heavy for frequent use.

This commit adds a very cheap, direct means of
retrieving peer stats.

Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
This commit is contained in:
Josh Bleecher Snyder 2021-01-26 10:54:59 -08:00
parent 23b2790aa0
commit cda9f6e73a

39
device/stats.go Normal file
View File

@ -0,0 +1,39 @@
/* SPDX-License-Identifier: MIT
*
* Copyright (C) 2017-2020 WireGuard LLC. All Rights Reserved.
*/
package device
import (
"sync/atomic"
"time"
)
// PeerStats are connection statistics for a given Peer.
type PeerStats struct {
RxBytes uint64
TxBytes uint64
LastHandshakeInitiated time.Time
}
// PeerStats returns statistics for the peer with public key pk,
// and reports whether the peer lookup succeeded.
func (device *Device) PeerStats(pk NoisePublicKey) (stats PeerStats, ok bool) {
device.peers.RLock()
peer := device.peers.keyMap[pk]
device.peers.RUnlock()
if peer == nil {
return PeerStats{}, false
}
peer.RLock()
defer peer.RUnlock()
stats = PeerStats{
RxBytes: atomic.LoadUint64(&peer.stats.rxBytes),
TxBytes: atomic.LoadUint64(&peer.stats.txBytes),
LastHandshakeInitiated: time.Unix(0, atomic.LoadInt64(&peer.stats.lastHandshakeNano)),
}
return stats, true
}