Skip to content

Commit 80fb47f

Browse files
authored
fix: reduce dht logging and update metrics (#2725)
Make some more verbose logging trace logging and switch metrics to use separate operation/error metrics. Refs: https://promlabs.com/blog/2023/09/19/errors-successes-totals-which-metrics-should-i-expose-to-prometheus/
1 parent c5988cc commit 80fb47f

File tree

7 files changed

+38
-23
lines changed

7 files changed

+38
-23
lines changed

packages/kad-dht/src/kad-dht.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -333,12 +333,12 @@ export class KadDHT extends TypedEventEmitter<PeerDiscoveryEvents> implements Ka
333333
}
334334

335335
async onPeerConnect (peerData: PeerInfo): Promise<void> {
336-
this.log('peer %p connected', peerData.id)
336+
this.log.trace('peer %p connected', peerData.id)
337337

338338
peerData = this.peerInfoMapper(peerData)
339339

340340
if (peerData.multiaddrs.length === 0) {
341-
this.log('ignoring %p as there were no valid addresses in %s after filtering', peerData.id, peerData.multiaddrs.map(addr => addr.toString()))
341+
this.log.trace('ignoring %p as there were no valid addresses in %s after filtering', peerData.id, peerData.multiaddrs.map(addr => addr.toString()))
342342
return
343343
}
344344

@@ -366,7 +366,12 @@ export class KadDHT extends TypedEventEmitter<PeerDiscoveryEvents> implements Ka
366366
/**
367367
* If 'server' this node will respond to DHT queries, if 'client' this node will not
368368
*/
369-
async setMode (mode: 'client' | 'server'): Promise<void> {
369+
async setMode (mode: 'client' | 'server', force = false): Promise<void> {
370+
if (mode === this.getMode() && !force) {
371+
this.log('already in %s mode', mode)
372+
return
373+
}
374+
370375
await this.components.registrar.unhandle(this.protocol)
371376

372377
if (mode === 'client') {
@@ -389,7 +394,7 @@ export class KadDHT extends TypedEventEmitter<PeerDiscoveryEvents> implements Ka
389394
this.running = true
390395

391396
// Only respond to queries when not in client mode
392-
await this.setMode(this.clientMode ? 'client' : 'server')
397+
await this.setMode(this.clientMode ? 'client' : 'server', true)
393398

394399
await start(
395400
this.querySelf,

packages/kad-dht/src/network.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,13 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
122122
}, options)
123123
} catch (err: any) {
124124
stream?.abort(err)
125-
this.log.error('could not send %s to %p', msg.type, to, err)
125+
126+
// only log if the incoming signal was not aborted - this means we were
127+
// no longer interested in the query result
128+
if (options.signal?.aborted !== true) {
129+
this.log.error('could not send %s to %p - %e', msg.type, to, err)
130+
}
131+
126132
yield queryErrorEvent({ from: to, error: err }, options)
127133
} finally {
128134
this.timeout.cleanUp(signal)

packages/kad-dht/src/query/query-path.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ export async function * queryPath (options: QueryPathOptions): AsyncGenerator<Qu
135135
if (event.name === 'PEER_RESPONSE') {
136136
for (const closerPeer of event.closer) {
137137
if (peersSeen.has(closerPeer.id)) { // eslint-disable-line max-depth
138-
log('already seen %p in query', closerPeer.id)
138+
log.trace('already seen %p in query', closerPeer.id)
139139
continue
140140
}
141141

@@ -154,11 +154,11 @@ export async function * queryPath (options: QueryPathOptions): AsyncGenerator<Qu
154154

155155
// only continue query if closer peer is actually closer
156156
if (uint8ArrayXorCompare(closerPeerXor, peerXor) !== -1) { // eslint-disable-line max-depth
157-
log('skipping %p as they are not closer to %b than %p', closerPeer.id, key, peer)
157+
log.trace('skipping %p as they are not closer to %b than %p', closerPeer.id, key, peer)
158158
continue
159159
}
160160

161-
log('querying closer peer %p', closerPeer.id)
161+
log.trace('querying closer peer %p', closerPeer.id)
162162
queryPeer(closerPeer.id, closerPeerKadId)
163163
}
164164
}

packages/kad-dht/src/routing-table/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
346346

347347
this.kb.add({ kadId, peerId })
348348

349-
this.log('added %p with kad id %b', peerId, kadId)
349+
this.log.trace('added %p with kad id %b', peerId, kadId)
350350

351351
this.updateMetrics()
352352
}

packages/kad-dht/src/rpc/handlers/add-provider.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ export class AddProviderHandler implements DHTMessageHandler {
2727
}
2828

2929
async handle (peerId: PeerId, msg: Message): Promise<Message | undefined> {
30-
this.log('start')
31-
3230
if (msg.key == null || msg.key.length === 0) {
3331
throw new InvalidMessageError('Missing key')
3432
}
@@ -45,6 +43,8 @@ export class AddProviderHandler implements DHTMessageHandler {
4543
this.log.error('no providers found in message')
4644
}
4745

46+
this.log('%p asked us to store provider record for for %c', peerId, cid)
47+
4848
await Promise.all(
4949
msg.providers.map(async (pi) => {
5050
// Ignore providers not from the originator
@@ -58,7 +58,7 @@ export class AddProviderHandler implements DHTMessageHandler {
5858
return
5959
}
6060

61-
this.log('received provider %p for %s (addrs %s)', peerId, cid, pi.multiaddrs.map((m) => multiaddr(m).toString()))
61+
this.log.trace('received provider %p for %s (addrs %s)', peerId, cid, pi.multiaddrs.map((m) => multiaddr(m).toString()))
6262

6363
const multihash = Digest.decode(pi.id)
6464

packages/kad-dht/src/rpc/index.ts

+13-9
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,17 @@ export class RPC {
3535
private readonly handlers: Record<string, DHTMessageHandler>
3636
private readonly routingTable: RoutingTable
3737
private readonly log: Logger
38-
private readonly metrics?: CounterGroup
38+
private readonly metrics: {
39+
operations?: CounterGroup
40+
errors?: CounterGroup
41+
}
3942

4043
constructor (components: RPCComponents, init: RPCInit) {
4144
const { providers, peerRouting, validators, logPrefix, peerInfoMapper } = init
42-
this.metrics = components.metrics?.registerCounterGroup(`${logPrefix.replaceAll(':', '_')}_inbound_rpc_requests`)
45+
this.metrics = {
46+
operations: components.metrics?.registerCounterGroup(`${logPrefix.replaceAll(':', '_')}_inbound_rpc_requests_total`),
47+
errors: components.metrics?.registerCounterGroup(`${logPrefix.replaceAll(':', '_')}_inbound_rpc_errors_total`)
48+
}
4349

4450
this.log = components.logger.forComponent(`${logPrefix}:rpc`)
4551
this.routingTable = init.routingTable
@@ -72,16 +78,14 @@ export class RPC {
7278
}
7379

7480
try {
75-
const value = await handler.handle(peerId, msg)
76-
77-
this.metrics?.increment({
78-
[`${msg.type}_SUCCESS`]: true
81+
this.metrics.operations?.increment({
82+
[msg.type]: true
7983
})
8084

81-
return value
85+
return await handler.handle(peerId, msg)
8286
} catch {
83-
this.metrics?.increment({
84-
[`${msg.type}_ERROR`]: true
87+
this.metrics.errors?.increment({
88+
[msg.type]: true
8589
})
8690
}
8791
}

packages/kad-dht/test/kad-dht.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ describe('KadDHT', () => {
135135
expect(registrarHandleSpy).to.have.property('callCount', 1)
136136

137137
await dht.setMode('server')
138-
// we were already in server mode
139-
expect(registrarHandleSpy).to.have.property('callCount', 2)
138+
// we were already in server mode, should have been a no-op
139+
expect(registrarHandleSpy).to.have.property('callCount', 1)
140140

141141
await dht.stop()
142142
})

0 commit comments

Comments
 (0)