@@ -48,15 +48,52 @@ export class WebsocketCronService {
4848 @Cron ( '*/1 * * * * *' )
4949 handleWebsocketMetrics ( ) {
5050 const connectedClients = this . server . sockets . sockets . size ?? 0 ;
51- // TODO: add more metrics in the future
52- // const subscriptions: Record<string, number> = {};
5351
54- // this.server.sockets.adapter.rooms.forEach((socketsSet, roomName) => {
55- // subscriptions[roomName] = socketsSet.size;
56- // });
52+ // Efficient unique-listener counts per topic
53+ const adapter = this . server . sockets . adapter as any ;
54+ const sids : Map < string , Set < string > > = adapter ?. sids ?? new Map ( ) ;
55+
56+ const topicPrefixes : Array < { key : string ; prefix ?: string ; room ?: string } > = [
57+ { key : 'tx' , prefix : TransactionsGateway . keyPrefix } ,
58+ { key : 'customTx' , prefix : TransactionsCustomGateway . keyPrefix } ,
59+ { key : 'events' , prefix : EventsGateway . keyPrefix } ,
60+ { key : 'customEvents' , prefix : EventsCustomGateway . keyPrefix } ,
61+ { key : 'blocks' , prefix : BlocksGateway . keyPrefix } ,
62+ { key : 'pool' , prefix : PoolGateway . keyPrefix } ,
63+ { key : 'stats' , room : 'statsRoom' } ,
64+ ] ;
65+
66+ const topics : Record < string , number > = { } ;
67+ for ( const { key } of topicPrefixes ) topics [ key ] = 0 ;
68+
69+ // Count unique sockets per prefix-based topic by scanning socket -> rooms map once
70+ if ( sids && sids . size > 0 ) {
71+ for ( const [ , rooms ] of sids ) {
72+ // Track whether this socket has been counted for a given topic key
73+ const matched : Record < string , boolean > = { } ;
74+
75+ for ( const roomName of rooms ) {
76+ for ( const { key, prefix } of topicPrefixes ) {
77+ if ( ! prefix || matched [ key ] ) continue ;
78+ if ( roomName . startsWith ( prefix ) ) {
79+ topics [ key ] += 1 ;
80+ matched [ key ] = true ;
81+ }
82+ }
83+ }
84+ }
85+ }
86+
87+ // Handle exact-room topics (like statsRoom) directly from rooms map
88+ const rooms : Map < string , Set < string > > = adapter ?. rooms ?? new Map ( ) ;
89+ const statsRoomSet = rooms . get ( 'statsRoom' ) ;
90+ if ( statsRoomSet ) {
91+ topics [ 'stats' ] = statsRoomSet . size ;
92+ }
5793
5894 this . eventEmitter . emit ( MetricsEvents . SetWebsocketMetrics , {
5995 connectedClients,
96+ topics,
6097 } ) ;
6198 }
6299
0 commit comments