tracer.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package logging
  2. import "net"
  3. // A Tracer traces events.
  4. type Tracer struct {
  5. SentPacket func(net.Addr, *Header, ByteCount, []Frame)
  6. SentVersionNegotiationPacket func(_ net.Addr, dest, src ArbitraryLenConnectionID, _ []VersionNumber)
  7. DroppedPacket func(net.Addr, PacketType, ByteCount, PacketDropReason)
  8. }
  9. // NewMultiplexedTracer creates a new tracer that multiplexes events to multiple tracers.
  10. func NewMultiplexedTracer(tracers ...*Tracer) *Tracer {
  11. if len(tracers) == 0 {
  12. return nil
  13. }
  14. if len(tracers) == 1 {
  15. return tracers[0]
  16. }
  17. return &Tracer{
  18. SentPacket: func(remote net.Addr, hdr *Header, size ByteCount, frames []Frame) {
  19. for _, t := range tracers {
  20. if t.SentPacket != nil {
  21. t.SentPacket(remote, hdr, size, frames)
  22. }
  23. }
  24. },
  25. SentVersionNegotiationPacket: func(remote net.Addr, dest, src ArbitraryLenConnectionID, versions []VersionNumber) {
  26. for _, t := range tracers {
  27. if t.SentVersionNegotiationPacket != nil {
  28. t.SentVersionNegotiationPacket(remote, dest, src, versions)
  29. }
  30. }
  31. },
  32. DroppedPacket: func(remote net.Addr, typ PacketType, size ByteCount, reason PacketDropReason) {
  33. for _, t := range tracers {
  34. if t.DroppedPacket != nil {
  35. t.DroppedPacket(remote, typ, size, reason)
  36. }
  37. }
  38. },
  39. }
  40. }