mirror of
https://github.com/tailscale/tailscale.git
synced 2025-12-05 04:11:59 +00:00
sockstats: refactor validation to be opt-in
Followup to #7499 to make validation a separate function ( GetWithValidation vs. Get). This way callers that don't need it don't pay the cost of a syscall per active TCP socket. Also clears the conn on close, so that we don't double-count the stats. Also more consistently uses Go doc comments for the exported API of the sockstats package. Updates tailscale/corp#9230 Updates #3363 Signed-off-by: Mihai Parparita <mihai@tailscale.com>
This commit is contained in:
committed by
Mihai Parparita
parent
ea81bffdeb
commit
b64d78d58f
@@ -96,6 +96,7 @@ func withSockStats(ctx context.Context, label Label) context.Context {
|
||||
tx, rx := tcpConnStats(c)
|
||||
counters.validationTxBytes.Add(tx)
|
||||
counters.validationRxBytes.Add(rx)
|
||||
counters.validationConn.Store(nil)
|
||||
}
|
||||
|
||||
// Don't bother adding these hooks if we can't get stats that they end up
|
||||
@@ -167,14 +168,6 @@ func get() *SockStats {
|
||||
RxBytes: counters.rxBytes.Load(),
|
||||
TxBytesByInterface: make(map[string]uint64),
|
||||
RxBytesByInterface: make(map[string]uint64),
|
||||
|
||||
ValidationTxBytes: counters.validationTxBytes.Load(),
|
||||
ValidationRxBytes: counters.validationRxBytes.Load(),
|
||||
}
|
||||
if c := counters.validationConn.Load(); c != nil && tcpConnStats != nil {
|
||||
tx, rx := tcpConnStats(*c)
|
||||
s.ValidationTxBytes += tx
|
||||
s.ValidationRxBytes += rx
|
||||
}
|
||||
for iface, a := range counters.rxBytesByInterface {
|
||||
ifName := sockStats.knownInterfaces[iface]
|
||||
@@ -190,6 +183,30 @@ func get() *SockStats {
|
||||
return r
|
||||
}
|
||||
|
||||
func getValidation() *ValidationSockStats {
|
||||
sockStats.mu.Lock()
|
||||
defer sockStats.mu.Unlock()
|
||||
|
||||
r := &ValidationSockStats{
|
||||
Stats: make(map[Label]ValidationSockStat),
|
||||
}
|
||||
|
||||
for label, counters := range sockStats.countersByLabel {
|
||||
s := ValidationSockStat{
|
||||
TxBytes: counters.validationTxBytes.Load(),
|
||||
RxBytes: counters.validationRxBytes.Load(),
|
||||
}
|
||||
if c := counters.validationConn.Load(); c != nil && tcpConnStats != nil {
|
||||
tx, rx := tcpConnStats(*c)
|
||||
s.TxBytes += tx
|
||||
s.RxBytes += rx
|
||||
}
|
||||
r.Stats[label] = s
|
||||
}
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
func setLinkMonitor(lm LinkMonitor) {
|
||||
sockStats.mu.Lock()
|
||||
defer sockStats.mu.Unlock()
|
||||
|
||||
Reference in New Issue
Block a user