From a6a2a81711722482dcd5f5a7705f18a81f6f99e3 Mon Sep 17 00:00:00 2001 From: Giovanni Petrantoni Date: Sun, 7 Jun 2020 16:15:21 +0900 Subject: [PATCH] Start adding some metrics to pubsub (#192) * Start adding some metrics to pubsub In order to visualize it's functionality Still WIP * more metrics * add per topic metrics * finishup with requested metrics * add a metrisServer define to start local server * PR fixes and cleanup --- libp2p/protocols/pubsub/floodsub.nim | 2 +- libp2p/protocols/pubsub/gossipsub.nim | 20 +++++++++++++++++- libp2p/protocols/pubsub/pubsub.nim | 28 +++++++++++++++++++++++-- libp2p/protocols/pubsub/pubsubpeer.nim | 10 +++++++++ libp2p/protocols/pubsub/rpc/message.nim | 9 ++++++++ 5 files changed, 65 insertions(+), 4 deletions(-) diff --git a/libp2p/protocols/pubsub/floodsub.nim b/libp2p/protocols/pubsub/floodsub.nim index 3619f72..0f0ad5f 100644 --- a/libp2p/protocols/pubsub/floodsub.nim +++ b/libp2p/protocols/pubsub/floodsub.nim @@ -8,7 +8,7 @@ ## those terms. import sequtils, tables, sets, strutils -import chronos, chronicles +import chronos, chronicles, metrics import pubsub, pubsubpeer, timedcache, diff --git a/libp2p/protocols/pubsub/gossipsub.nim b/libp2p/protocols/pubsub/gossipsub.nim index 5d70970..cbe932c 100644 --- a/libp2p/protocols/pubsub/gossipsub.nim +++ b/libp2p/protocols/pubsub/gossipsub.nim @@ -8,7 +8,7 @@ ## those terms. import tables, sets, options, sequtils, random -import chronos, chronicles +import chronos, chronicles, metrics import pubsub, floodsub, pubsubpeer, @@ -56,6 +56,10 @@ type heartbeatCancel*: Future[void] # cancellation future for heartbeat interval heartbeatLock: AsyncLock # heartbeat lock to prevent two consecutive concurrent heartbeats +declareGauge(libp2p_gossipsub_peers_per_topic_mesh, "gossipsub peers per topic in mesh", labels = ["topic"]) +declareGauge(libp2p_gossipsub_peers_per_topic_fanout, "gossipsub peers per topic in fanout", labels = ["topic"]) +declareGauge(libp2p_gossipsub_peers_per_topic_gossipsub, "gossipsub peers per topic in gossipsub", labels = ["topic"]) + method init(g: GossipSub) = proc handler(conn: Connection, proto: string) {.async.} = ## main protocol handler that gets triggered on every @@ -79,6 +83,7 @@ proc replenishFanout(g: GossipSub, topic: string) {.async.} = if topic in g.gossipsub: for p in g.gossipsub[topic]: if not g.fanout[topic].containsOrIncl(p): + libp2p_gossipsub_peers_per_topic_fanout.inc(labelValues = [topic]) if g.fanout[topic].len == GossipSubD: break @@ -100,16 +105,19 @@ proc rebalanceMesh(g: GossipSub, topic: string) {.async.} = if topic in g.fanout and g.fanout[topic].len > 0: id = sample(toSeq(g.fanout[topic])) g.fanout[topic].excl(id) + libp2p_gossipsub_peers_per_topic_fanout.dec(labelValues = [topic]) trace "got fanout peer", peer = id elif topic in g.gossipsub and g.gossipsub[topic].len > 0: id = sample(toSeq(g.gossipsub[topic])) g.gossipsub[topic].excl(id) + libp2p_gossipsub_peers_per_topic_gossipsub.dec(labelValues = [topic]) trace "got gossipsub peer", peer = id else: trace "no more peers" break g.mesh[topic].incl(id) + libp2p_gossipsub_peers_per_topic_mesh.inc(labelValues = [topic]) if id in g.peers: let p = g.peers[id] # send a graft message to the peer @@ -122,6 +130,7 @@ proc rebalanceMesh(g: GossipSub, topic: string) {.async.} = trace "pruning peers", peers = g.mesh[topic].len let id = toSeq(g.mesh[topic])[rand(0..