status-im/status-go

View on GitHub
wakuv2/tracer.go

Summary

Maintainability
A
0 mins
Test Coverage
A
90%
package wakuv2

import (
    "fmt"

    "github.com/btcsuite/btcutil/base58"
    pubsub_pb "github.com/libp2p/go-libp2p-pubsub/pb"

    "go.uber.org/zap"
)

// Trace implements EventTracer interface.
// We use custom logging, because we want to base58-encode the peerIDs. And also make the messageIDs readable.
func (w *Waku) Trace(evt *pubsub_pb.TraceEvent) {

    f := []zap.Field{
        zap.String("type", evt.Type.String()),
    }

    encode := func(peerID []byte) string {
        return base58.Encode(peerID)
    }

    encodeMeta := func(meta *pubsub_pb.TraceEvent_RPCMeta) []zap.Field {
        if meta == nil {
            return nil
        }
        var out []zap.Field
        for i, msg := range meta.Messages {
            out = append(out, zap.String(fmt.Sprintf("MessageID[%d]", i), encode(msg.GetMessageID())))
            out = append(out, zap.Stringp(fmt.Sprintf("Topic[%d]", i), msg.Topic))
        }
        for i, sub := range meta.Subscription {
            out = append(out, zap.Boolp(fmt.Sprintf("Subscribe[%d]", i), sub.Subscribe))
            out = append(out, zap.Stringp(fmt.Sprintf("Topic[%d]", i), sub.Topic))
        }
        if meta.Control != nil {
            out = append(out, zap.Any("Control", meta.Control))
        }
        return out
    }

    if evt.PublishMessage != nil {
        f = append(f, zap.String("MessageID", encode(evt.PublishMessage.MessageID)))
    }
    if evt.RejectMessage != nil {
        f = append(f, zap.String("MessageID", encode(evt.RejectMessage.MessageID)))
    }
    if evt.DuplicateMessage != nil {
        f = append(f, zap.String("MessageID", encode(evt.DuplicateMessage.MessageID)))
    }
    if evt.DeliverMessage != nil {
        f = append(f, zap.String("MessageID", encode(evt.DeliverMessage.MessageID)))
    }

    if evt.AddPeer != nil {
        f = append(f, zap.String("PeerID", encode(evt.AddPeer.GetPeerID())))
    }
    if evt.RemovePeer != nil {
        f = append(f, zap.String("PeerID", encode(evt.RemovePeer.GetPeerID())))
    }

    if evt.RecvRPC != nil {
        f = append(f, zap.String("ReceivedFrom", encode(evt.RecvRPC.GetReceivedFrom())))
        f = append(f, encodeMeta(evt.RecvRPC.Meta)...)
    }
    if evt.SendRPC != nil {
        f = append(f, zap.String("SendTo", encode(evt.SendRPC.GetSendTo())))
        f = append(f, encodeMeta(evt.SendRPC.Meta)...)
    }
    if evt.DropRPC != nil {
        f = append(f, zap.String("SendTo", encode(evt.DropRPC.GetSendTo())))
        f = append(f, encodeMeta(evt.DropRPC.Meta)...)
    }

    if evt.Join != nil {
        f = append(f, zap.String("Topic", evt.Join.GetTopic()))
    }
    if evt.Leave != nil {
        f = append(f, zap.String("Topic", evt.Leave.GetTopic()))
    }
    if evt.Graft != nil {
        f = append(f, zap.String("PeerID", encode(evt.Graft.GetPeerID())))
        f = append(f, zap.String("Topic", evt.Graft.GetTopic()))
    }
    if evt.Prune != nil {
        f = append(f, zap.String("PeerID", encode(evt.Prune.GetPeerID())))
        f = append(f, zap.String("Topic", evt.Prune.GetTopic()))
    }

    w.logger.With(f...).Debug("pubsub trace")
}