1+ from prometheus_client import Counter , Histogram
2+
3+ from libp2p .pubsub .gossipsub import GossipsubEvent
4+
5+
6+ class GossipsubMetrics :
7+ delivered : Counter
8+ dropped : Counter
9+ validated_fail : Counter
10+ msg_size : Histogram
11+
12+ def __init__ (self ):
13+ self .delivered = Counter (
14+ "gossipsub_delivered_total" ,
15+ "Messages successfully delivered" ,
16+ labelnames = ["topic" ],
17+ )
18+
19+ self .dropped = Counter (
20+ "gossipsub_dropped_total" ,
21+ "Messages dropped" ,
22+ labelnames = ["topic" , "reason" ],
23+ )
24+
25+ self .validated_fail = Counter (
26+ "gossipsub_validation_failed_total" ,
27+ "Messages rejected by validator" ,
28+ labelnames = ["topic" , "error" ],
29+ )
30+
31+ self .msg_size = Histogram (
32+ "gossipsub_message_bytes" ,
33+ "Message size in bytes" ,
34+ buckets = [64 , 128 , 256 , 512 , 1024 , 2048 , 4096 ],
35+ )
36+
37+ def record (self , event : GossipsubEvent ) -> None :
38+ if event .delivered :
39+ self .delivered .labels (topic = event .topic ).inc ()
40+
41+ if event .message_size is not None :
42+ self .msg_size .observe (event .message_size )
43+
44+ if event .dropped_reason :
45+ self .dropped .labels (
46+ topic = event .topic ,
47+ reason = event .dropped_reason ,
48+ ).inc ()
49+
50+ if event .validation_error :
51+ self .validated_fail .labels (
52+ topic = event .topic ,
53+ error = type (event .validation_error ).__name__ ,
54+ ).inc ()
0 commit comments