2026-03-08 20:19:40 +08:00
|
|
|
package starnet
|
|
|
|
|
|
|
|
|
|
import "sync/atomic"
|
|
|
|
|
|
|
|
|
|
// StatsSnapshot is a read-only copy of runtime counters.
|
|
|
|
|
type StatsSnapshot struct {
|
2026-03-27 12:05:23 +08:00
|
|
|
Accepted uint64
|
|
|
|
|
TLSDetected uint64
|
|
|
|
|
PlainDetected uint64
|
|
|
|
|
InitFailures uint64
|
|
|
|
|
SniffFailures uint64
|
|
|
|
|
TLSConfigFailures uint64
|
|
|
|
|
PlainRejected uint64
|
|
|
|
|
Closed uint64
|
2026-03-08 20:19:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Stats provides lock-free counters.
|
|
|
|
|
type Stats struct {
|
2026-03-27 12:05:23 +08:00
|
|
|
accepted uint64
|
|
|
|
|
tlsDetected uint64
|
|
|
|
|
plainDetected uint64
|
|
|
|
|
initFailures uint64
|
|
|
|
|
sniffFailures uint64
|
|
|
|
|
tlsConfigFailures uint64
|
|
|
|
|
plainRejected uint64
|
|
|
|
|
closed uint64
|
2026-03-08 20:19:40 +08:00
|
|
|
}
|
|
|
|
|
|
2026-03-27 12:05:23 +08:00
|
|
|
func (s *Stats) incAccepted() { atomic.AddUint64(&s.accepted, 1) }
|
|
|
|
|
func (s *Stats) incTLSDetected() { atomic.AddUint64(&s.tlsDetected, 1) }
|
|
|
|
|
func (s *Stats) incPlainDetected() { atomic.AddUint64(&s.plainDetected, 1) }
|
|
|
|
|
func (s *Stats) incInitFailures() { atomic.AddUint64(&s.initFailures, 1) }
|
|
|
|
|
func (s *Stats) incClosed() { atomic.AddUint64(&s.closed, 1) }
|
|
|
|
|
func (s *Stats) incSniffFailures() { atomic.AddUint64(&s.sniffFailures, 1); s.incInitFailures() }
|
|
|
|
|
func (s *Stats) incTLSConfigFailures() { atomic.AddUint64(&s.tlsConfigFailures, 1); s.incInitFailures() }
|
|
|
|
|
func (s *Stats) incPlainRejected() { atomic.AddUint64(&s.plainRejected, 1); s.incInitFailures() }
|
2026-03-08 20:19:40 +08:00
|
|
|
|
|
|
|
|
// Snapshot returns a stable view of counters.
|
|
|
|
|
func (s *Stats) Snapshot() StatsSnapshot {
|
|
|
|
|
return StatsSnapshot{
|
2026-03-27 12:05:23 +08:00
|
|
|
Accepted: atomic.LoadUint64(&s.accepted),
|
|
|
|
|
TLSDetected: atomic.LoadUint64(&s.tlsDetected),
|
|
|
|
|
PlainDetected: atomic.LoadUint64(&s.plainDetected),
|
|
|
|
|
InitFailures: atomic.LoadUint64(&s.initFailures),
|
|
|
|
|
SniffFailures: atomic.LoadUint64(&s.sniffFailures),
|
|
|
|
|
TLSConfigFailures: atomic.LoadUint64(&s.tlsConfigFailures),
|
|
|
|
|
PlainRejected: atomic.LoadUint64(&s.plainRejected),
|
|
|
|
|
Closed: atomic.LoadUint64(&s.closed),
|
2026-03-08 20:19:40 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Logger is a minimal logging abstraction.
|
|
|
|
|
type Logger interface {
|
|
|
|
|
Printf(format string, v ...interface{})
|
|
|
|
|
}
|