@lodestar/reqresp 1.33.0 → 1.34.0-dev.07d20103f0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/ReqResp.d.ts +3 -2
- package/lib/ReqResp.js +24 -2
- package/lib/ReqResp.js.map +1 -1
- package/lib/metrics.d.ts +24 -7
- package/lib/metrics.js +29 -0
- package/lib/metrics.js.map +1 -1
- package/lib/rate_limiter/selfRateLimiter.d.ts +43 -0
- package/lib/rate_limiter/selfRateLimiter.js +87 -0
- package/lib/rate_limiter/selfRateLimiter.js.map +1 -0
- package/lib/request/errors.d.ts +8 -2
- package/lib/request/errors.js +15 -0
- package/lib/request/errors.js.map +1 -1
- package/lib/request/index.js +6 -1
- package/lib/request/index.js.map +1 -1
- package/lib/response/index.js +9 -1
- package/lib/response/index.js.map +1 -1
- package/lib/utils/errorMessage.d.ts +1 -1
- package/lib/utils/errorMessage.js +20 -3
- package/lib/utils/errorMessage.js.map +1 -1
- package/package.json +7 -7
package/lib/ReqResp.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PeerId } from "@libp2p/interface";
|
|
2
|
-
import { Logger,
|
|
2
|
+
import { Logger, MetricsRegisterExtra } from "@lodestar/utils";
|
|
3
3
|
import type { Libp2p } from "libp2p";
|
|
4
4
|
import { Metrics } from "./metrics.js";
|
|
5
5
|
import { RequestError, SendRequestOpts } from "./request/index.js";
|
|
@@ -9,7 +9,7 @@ export declare const DEFAULT_PROTOCOL_PREFIX = "/eth2/beacon_chain/req";
|
|
|
9
9
|
export interface ReqRespProtocolModules {
|
|
10
10
|
libp2p: Libp2p;
|
|
11
11
|
logger: Logger;
|
|
12
|
-
metricsRegister:
|
|
12
|
+
metricsRegister: MetricsRegisterExtra | null;
|
|
13
13
|
}
|
|
14
14
|
export interface ReqRespOpts extends SendRequestOpts, ReqRespRateLimiterOpts {
|
|
15
15
|
/** Custom prefix for `/ProtocolPrefix/MessageName/SchemaVersion/Encoding` */
|
|
@@ -28,6 +28,7 @@ export declare class ReqResp {
|
|
|
28
28
|
protected readonly logger: Logger;
|
|
29
29
|
protected readonly metrics: Metrics | null;
|
|
30
30
|
private readonly rateLimiter;
|
|
31
|
+
private readonly selfRateLimiter;
|
|
31
32
|
private controller;
|
|
32
33
|
/** Tracks request and responses in a sequential counter */
|
|
33
34
|
private reqCount;
|
package/lib/ReqResp.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { setMaxListeners } from "node:events";
|
|
2
2
|
import { getMetrics } from "./metrics.js";
|
|
3
3
|
import { ReqRespRateLimiter } from "./rate_limiter/ReqRespRateLimiter.js";
|
|
4
|
+
import { SelfRateLimiter } from "./rate_limiter/selfRateLimiter.js";
|
|
4
5
|
import { RequestError, RequestErrorCode, sendRequest } from "./request/index.js";
|
|
5
6
|
import { handleRequest } from "./response/index.js";
|
|
6
7
|
import { formatProtocolID } from "./utils/protocolId.js";
|
|
@@ -25,6 +26,10 @@ export class ReqResp {
|
|
|
25
26
|
this.metrics = modules.metricsRegister ? getMetrics(modules.metricsRegister) : null;
|
|
26
27
|
this.protocolPrefix = opts.protocolPrefix ?? DEFAULT_PROTOCOL_PREFIX;
|
|
27
28
|
this.rateLimiter = new ReqRespRateLimiter(opts);
|
|
29
|
+
this.selfRateLimiter = new SelfRateLimiter();
|
|
30
|
+
this.metrics?.selfRateLimiterPeerCount.addCollect(() => {
|
|
31
|
+
this.metrics?.selfRateLimiterPeerCount.set(this.selfRateLimiter.getPeerCount());
|
|
32
|
+
});
|
|
28
33
|
}
|
|
29
34
|
/**
|
|
30
35
|
* Register protocol which will be used only to dial to other peers
|
|
@@ -77,32 +82,45 @@ export class ReqResp {
|
|
|
77
82
|
async start() {
|
|
78
83
|
this.controller = new AbortController();
|
|
79
84
|
this.rateLimiter.start();
|
|
85
|
+
this.selfRateLimiter.start();
|
|
80
86
|
// We set infinity to prevent MaxListenersExceededWarning which get logged when listeners > 10
|
|
81
87
|
// Since it is perfectly fine to have listeners > 10
|
|
82
88
|
setMaxListeners(Infinity, this.controller.signal);
|
|
83
89
|
}
|
|
84
90
|
async stop() {
|
|
85
91
|
this.rateLimiter.stop();
|
|
92
|
+
this.selfRateLimiter.stop();
|
|
86
93
|
this.controller.abort();
|
|
87
94
|
}
|
|
88
95
|
// Helper to reduce code duplication
|
|
89
96
|
async *sendRequest(peerId, method, versions, encoding, body) {
|
|
90
|
-
const
|
|
97
|
+
const peerIdStr = peerId.toString();
|
|
98
|
+
const peerClient = this.opts.getPeerLogMetadata?.(peerIdStr);
|
|
91
99
|
this.metrics?.outgoingRequests.inc({ method });
|
|
92
100
|
const timer = this.metrics?.outgoingRequestRoundtripTime.startTimer({ method });
|
|
93
101
|
const protocols = [];
|
|
94
102
|
const protocolIDs = [];
|
|
103
|
+
// don't increase this.reqCount until we know request will be sent
|
|
104
|
+
const requestId = this.reqCount + 1;
|
|
95
105
|
for (const version of versions) {
|
|
96
106
|
const protocolID = this.formatProtocolID({ method, version, encoding });
|
|
97
107
|
const protocol = this.registeredProtocols.get(protocolID);
|
|
98
108
|
if (!protocol) {
|
|
99
109
|
throw Error(`Request to send to protocol ${protocolID} but it has not been declared`);
|
|
100
110
|
}
|
|
111
|
+
if (!this.selfRateLimiter.allows(peerIdStr, protocolID, requestId)) {
|
|
112
|
+
// we technically don't send request in this case but would be nice just to track this in the same `outgoingErrorReasons` metric
|
|
113
|
+
this.metrics?.outgoingErrorReasons.inc({ reason: RequestErrorCode.REQUEST_SELF_RATE_LIMITED });
|
|
114
|
+
throw new RequestError({ code: RequestErrorCode.REQUEST_SELF_RATE_LIMITED });
|
|
115
|
+
// don't call this.onOutgoingRequestError() to penalize peer
|
|
116
|
+
}
|
|
101
117
|
protocols.push(protocol);
|
|
102
118
|
protocolIDs.push(protocolID);
|
|
103
119
|
}
|
|
120
|
+
// requestId is now the same to reqCount
|
|
121
|
+
this.reqCount++;
|
|
104
122
|
try {
|
|
105
|
-
yield* sendRequest({ logger: this.logger, libp2p: this.libp2p, metrics: this.metrics, peerClient }, peerId, protocols, protocolIDs, body, this.controller.signal, this.opts,
|
|
123
|
+
yield* sendRequest({ logger: this.logger, libp2p: this.libp2p, metrics: this.metrics, peerClient }, peerId, protocols, protocolIDs, body, this.controller.signal, this.opts, requestId);
|
|
106
124
|
}
|
|
107
125
|
catch (e) {
|
|
108
126
|
this.metrics?.outgoingErrors.inc({ method });
|
|
@@ -110,11 +128,15 @@ export class ReqResp {
|
|
|
110
128
|
if (e.type.code === RequestErrorCode.DIAL_ERROR || e.type.code === RequestErrorCode.DIAL_TIMEOUT) {
|
|
111
129
|
this.metrics?.dialErrors.inc();
|
|
112
130
|
}
|
|
131
|
+
this.metrics?.outgoingErrorReasons.inc({ reason: e.type.code });
|
|
113
132
|
this.onOutgoingRequestError(peerId, method, e);
|
|
114
133
|
}
|
|
115
134
|
throw e;
|
|
116
135
|
}
|
|
117
136
|
finally {
|
|
137
|
+
for (const protocolID of protocolIDs) {
|
|
138
|
+
this.selfRateLimiter.requestCompleted(peerIdStr, protocolID, requestId);
|
|
139
|
+
}
|
|
118
140
|
timer?.();
|
|
119
141
|
}
|
|
120
142
|
}
|
package/lib/ReqResp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReqResp.js","sourceRoot":"","sources":["../src/ReqResp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,aAAa,CAAC;AAI5C,OAAO,EAAU,UAAU,EAAC,MAAM,cAAc,CAAC;AACjD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAmB,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAUlD,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AAIvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,wBAAwB,CAAC;AAchE;;;;;GAKG;AACH,MAAM,OAAO,OAAO;
|
|
1
|
+
{"version":3,"file":"ReqResp.js","sourceRoot":"","sources":["../src/ReqResp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,aAAa,CAAC;AAI5C,OAAO,EAAU,UAAU,EAAC,MAAM,cAAc,CAAC;AACjD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAC,eAAe,EAAC,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAmB,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAUlD,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AAIvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,wBAAwB,CAAC;AAchE;;;;;GAKG;AACH,MAAM,OAAO,OAAO;IAoBlB,YACE,OAA+B,EACd,OAAoB,EAAE;QAAtB,SAAI,GAAJ,IAAI,CAAkB;QAXjC,eAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,2DAA2D;QACnD,aAAQ,GAAG,CAAC,CAAC;QAGrB,2DAA2D;QAC1C,wBAAmB,GAAG,IAAI,GAAG,EAA6B,CAAC;QAC3D,sBAAiB,GAAG,IAAI,GAAG,EAAuB,CAAC;QAMlE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpF,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,uBAAuB,CAAC;QACrE,IAAI,CAAC,WAAW,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAE7C,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC,UAAU,CAAC,GAAG,EAAE;YACrD,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,wBAAwB,CAAC,QAA0B;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEnD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAkB;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,EAAC,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,IAAI,EAAC,GAAG,QAAQ,CAAC;QAEjE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAE9C,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;IACrG,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CAAC,UAAsB;QAC7C,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE5C,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB;QAC1B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC;YACzD,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,sBAAsB;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1G,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACxC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,8FAA8F;QAC9F,oDAAoD;QACpD,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,CAAC,WAAW,CAChB,MAAc,EACd,MAAc,EACd,QAAkB,EAClB,QAAkB,EAClB,IAAgB;QAEhB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,4BAA4B,CAAC,UAAU,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC;QAE9E,MAAM,SAAS,GAAyC,EAAE,CAAC;QAC3D,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,kEAAkE;QAClE,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAEpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAC,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,KAAK,CAAC,+BAA+B,UAAU,+BAA+B,CAAC,CAAC;YACxF,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;gBACnE,gIAAgI;gBAChI,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAC,MAAM,EAAE,gBAAgB,CAAC,yBAAyB,EAAC,CAAC,CAAC;gBAC7F,MAAM,IAAI,YAAY,CAAC,EAAC,IAAI,EAAE,gBAAgB,CAAC,yBAAyB,EAAC,CAAC,CAAC;gBAC3E,4DAA4D;YAC9D,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,KAAK,CAAC,CAAC,WAAW,CAChB,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAC,EAC7E,MAAM,EACN,SAAS,EACT,WAAW,EACX,IAAI,EACJ,IAAI,CAAC,UAAU,CAAC,MAAM,EACtB,IAAI,CAAC,IAAI,EACT,SAAS,CACV,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC;YAE3C,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;gBAC9B,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,YAAY,EAAE,CAAC;oBACjG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC;gBACjC,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAC,CAAC,CAAC;gBAE9D,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,CAAC,CAAC;QACV,CAAC;gBAAS,CAAC;YACT,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;YAC1E,CAAC;YACD,KAAK,EAAE,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,QAAuB,EAAE,UAAkB;QACnE,OAAO,KAAK,EAAE,EAAC,UAAU,EAAE,MAAM,EAA2C,EAAE,EAAE;YAC9E,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,2CAA2C,UAAU,GAAG,CAAC,CAAC;YAC5E,CAAC;YAED,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrE,MAAM,EAAC,MAAM,EAAC,GAAG,QAAQ,CAAC;YAE1B,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,0BAA0B,CAAC,UAAU,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC;YAE5E,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAE3C,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC;oBAClB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM;oBACN,MAAM;oBACN,QAAQ,EAAE,QAAoB;oBAC9B,UAAU;oBACV,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;oBAC9B,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE;oBAC1B,UAAU;oBACV,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB;iBAC7C,CAAC,CAAC;gBACH,qCAAqC;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC;gBAE3C,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;oBAChC,IAAI,CAAC,sBAAsB,CAAC,QAA8B,EAAE,GAAG,CAAC,CAAC;gBACnE,CAAC;gBAED,mCAAmC;gBACnC,gDAAgD;YAClD,CAAC;oBAAS,CAAC;gBACT,KAAK,EAAE,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAES,iBAAiB,CAAC,OAAe,EAAE,SAA6B;QACxE,WAAW;IACb,CAAC;IAES,sBAAsB,CAAC,SAA6B,EAAE,MAAoB;QAClF,WAAW;IACb,CAAC;IAES,sBAAsB,CAAC,OAAe,EAAE,OAAe,EAAE,MAAoB;QACrF,WAAW;IACb,CAAC;IAED;;;;;OAKG;IACO,gBAAgB,CAAC,QAAgE;QACzF,OAAO,gBAAgB,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrG,CAAC;CACF"}
|
package/lib/metrics.d.ts
CHANGED
|
@@ -1,25 +1,41 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MetricsRegisterExtra } from "@lodestar/utils";
|
|
2
|
+
import { RequestErrorCode } from "./request/errors.js";
|
|
2
3
|
export type Metrics = ReturnType<typeof getMetrics>;
|
|
3
4
|
/**
|
|
4
5
|
* A collection of metrics used throughout the Gossipsub behaviour.
|
|
5
6
|
*/
|
|
6
|
-
export declare function getMetrics(register:
|
|
7
|
-
outgoingRequests: import("@lodestar/utils").
|
|
7
|
+
export declare function getMetrics(register: MetricsRegisterExtra): {
|
|
8
|
+
outgoingRequests: import("@lodestar/utils").GaugeExtra<{
|
|
9
|
+
method: string;
|
|
10
|
+
}>;
|
|
11
|
+
outgoingOpenedStreams: import("@lodestar/utils").Counter<{
|
|
12
|
+
method: string;
|
|
13
|
+
}>;
|
|
14
|
+
outgoingClosedStreams: import("@lodestar/utils").Counter<{
|
|
8
15
|
method: string;
|
|
9
16
|
}>;
|
|
10
17
|
outgoingRequestRoundtripTime: import("@lodestar/utils").Histogram<{
|
|
11
18
|
method: string;
|
|
12
19
|
}>;
|
|
13
|
-
outgoingErrors: import("@lodestar/utils").
|
|
20
|
+
outgoingErrors: import("@lodestar/utils").GaugeExtra<{
|
|
21
|
+
method: string;
|
|
22
|
+
}>;
|
|
23
|
+
outgoingErrorReasons: import("@lodestar/utils").GaugeExtra<{
|
|
24
|
+
reason: RequestErrorCode;
|
|
25
|
+
}>;
|
|
26
|
+
incomingRequests: import("@lodestar/utils").GaugeExtra<{
|
|
27
|
+
method: string;
|
|
28
|
+
}>;
|
|
29
|
+
incomingOpenedStreams: import("@lodestar/utils").Counter<{
|
|
14
30
|
method: string;
|
|
15
31
|
}>;
|
|
16
|
-
|
|
32
|
+
incomingClosedStreams: import("@lodestar/utils").Counter<{
|
|
17
33
|
method: string;
|
|
18
34
|
}>;
|
|
19
35
|
incomingRequestHandlerTime: import("@lodestar/utils").Histogram<{
|
|
20
36
|
method: string;
|
|
21
37
|
}>;
|
|
22
|
-
incomingErrors: import("@lodestar/utils").
|
|
38
|
+
incomingErrors: import("@lodestar/utils").GaugeExtra<{
|
|
23
39
|
method: string;
|
|
24
40
|
}>;
|
|
25
41
|
outgoingResponseTTFB: import("@lodestar/utils").Histogram<{
|
|
@@ -28,6 +44,7 @@ export declare function getMetrics(register: MetricsRegister): {
|
|
|
28
44
|
incomingResponseTTFB: import("@lodestar/utils").Histogram<{
|
|
29
45
|
method: string;
|
|
30
46
|
}>;
|
|
31
|
-
dialErrors: import("@lodestar/utils").
|
|
47
|
+
dialErrors: import("@lodestar/utils").GaugeExtra<import("@lodestar/utils").NoLabels>;
|
|
48
|
+
selfRateLimiterPeerCount: import("@lodestar/utils").GaugeExtra<import("@lodestar/utils").NoLabels>;
|
|
32
49
|
};
|
|
33
50
|
//# sourceMappingURL=metrics.d.ts.map
|
package/lib/metrics.js
CHANGED
|
@@ -9,6 +9,16 @@ export function getMetrics(register) {
|
|
|
9
9
|
help: "Counts total requests done per method",
|
|
10
10
|
labelNames: ["method"],
|
|
11
11
|
}),
|
|
12
|
+
outgoingOpenedStreams: register.counter({
|
|
13
|
+
name: "beacon_reqresp_outgoing_opened_streams_total",
|
|
14
|
+
help: "Counts total opened streams per method",
|
|
15
|
+
labelNames: ["method"],
|
|
16
|
+
}),
|
|
17
|
+
outgoingClosedStreams: register.counter({
|
|
18
|
+
name: "beacon_reqresp_outgoing_closed_streams_total",
|
|
19
|
+
help: "Counts total closed streams per method",
|
|
20
|
+
labelNames: ["method"],
|
|
21
|
+
}),
|
|
12
22
|
outgoingRequestRoundtripTime: register.histogram({
|
|
13
23
|
name: "beacon_reqresp_outgoing_request_roundtrip_time_seconds",
|
|
14
24
|
help: "Histogram of outgoing requests round-trip time",
|
|
@@ -21,11 +31,26 @@ export function getMetrics(register) {
|
|
|
21
31
|
help: "Counts total failed requests done per method",
|
|
22
32
|
labelNames: ["method"],
|
|
23
33
|
}),
|
|
34
|
+
outgoingErrorReasons: register.gauge({
|
|
35
|
+
name: "beacon_reqresp_outgoing_requests_error_reason_total",
|
|
36
|
+
help: "Count total outgoing request errors by reason",
|
|
37
|
+
labelNames: ["reason"],
|
|
38
|
+
}),
|
|
24
39
|
incomingRequests: register.gauge({
|
|
25
40
|
name: "beacon_reqresp_incoming_requests_total",
|
|
26
41
|
help: "Counts total responses handled per method",
|
|
27
42
|
labelNames: ["method"],
|
|
28
43
|
}),
|
|
44
|
+
incomingOpenedStreams: register.counter({
|
|
45
|
+
name: "beacon_reqresp_incoming_opened_streams_total",
|
|
46
|
+
help: "Counts total incoming opened streams per method",
|
|
47
|
+
labelNames: ["method"],
|
|
48
|
+
}),
|
|
49
|
+
incomingClosedStreams: register.counter({
|
|
50
|
+
name: "beacon_reqresp_incoming_closed_streams_total",
|
|
51
|
+
help: "Counts total incoming closed streams per method",
|
|
52
|
+
labelNames: ["method"],
|
|
53
|
+
}),
|
|
29
54
|
incomingRequestHandlerTime: register.histogram({
|
|
30
55
|
name: "beacon_reqresp_incoming_request_handler_time_seconds",
|
|
31
56
|
help: "Histogram of incoming requests internal handling time",
|
|
@@ -56,6 +81,10 @@ export function getMetrics(register) {
|
|
|
56
81
|
name: "beacon_reqresp_dial_errors_total",
|
|
57
82
|
help: "Count total dial errors",
|
|
58
83
|
}),
|
|
84
|
+
selfRateLimiterPeerCount: register.gauge({
|
|
85
|
+
name: "beacon_reqresp_self_rate_limiter_peer_count",
|
|
86
|
+
help: "Count of peers tracked by the self rate limiter",
|
|
87
|
+
}),
|
|
59
88
|
};
|
|
60
89
|
}
|
|
61
90
|
//# sourceMappingURL=metrics.js.map
|
package/lib/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Logger } from "@lodestar/utils";
|
|
2
|
+
type PeerIdStr = string;
|
|
3
|
+
type ProtocolID = string;
|
|
4
|
+
/** Sometimes a peer request comes AFTER libp2p disconnect event, check for such peers every 2 minutes */
|
|
5
|
+
export declare const CHECK_DISCONNECTED_PEERS_INTERVAL_MS: number;
|
|
6
|
+
/**
|
|
7
|
+
* Timeout to consider a request is no longer in progress
|
|
8
|
+
* this is to cover the case where `requestCompleted()` is not called due to unexpected errors
|
|
9
|
+
* for example https://github.com/ChainSafe/lodestar/issues/8256
|
|
10
|
+
**/
|
|
11
|
+
export declare const REQUEST_TIMEOUT_MS: number;
|
|
12
|
+
type RequestId = number;
|
|
13
|
+
/**
|
|
14
|
+
* Simple rate limiter that allows a maximum of 2 concurrent requests per protocol per peer.
|
|
15
|
+
* The consumer should either prevent requests from being sent when the limit is reached or handle the case when the request is not allowed.
|
|
16
|
+
*/
|
|
17
|
+
export declare class SelfRateLimiter {
|
|
18
|
+
private readonly logger?;
|
|
19
|
+
private readonly rateLimitersPerPeer;
|
|
20
|
+
/**
|
|
21
|
+
* It's not convenient to handle a peer disconnected event so we track the last seen requests by peer.
|
|
22
|
+
* This is the same design to `ReqRespRateLimiter`.
|
|
23
|
+
**/
|
|
24
|
+
private lastSeenRequestsByPeer;
|
|
25
|
+
/** Interval to check lastSeenMessagesByPeer */
|
|
26
|
+
private cleanupInterval;
|
|
27
|
+
constructor(logger?: Logger | undefined);
|
|
28
|
+
start(): void;
|
|
29
|
+
stop(): void;
|
|
30
|
+
/**
|
|
31
|
+
* called before we send a request to a peer.
|
|
32
|
+
*/
|
|
33
|
+
allows(peerId: PeerIdStr, protocolId: ProtocolID, requestId: RequestId): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* called when a request to a peer is completed, regardless of success or failure.
|
|
36
|
+
* This should NOT be called when the request was not allowed
|
|
37
|
+
*/
|
|
38
|
+
requestCompleted(peerId: PeerIdStr, protocolId: ProtocolID, requestId: RequestId): void;
|
|
39
|
+
getPeerCount(): number;
|
|
40
|
+
private checkDisconnectedPeers;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=selfRateLimiter.d.ts.map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { MapDef } from "@lodestar/utils";
|
|
2
|
+
/** https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#constants */
|
|
3
|
+
const MAX_CONCURRENT_REQUESTS = 2;
|
|
4
|
+
/** Sometimes a peer request comes AFTER libp2p disconnect event, check for such peers every 2 minutes */
|
|
5
|
+
export const CHECK_DISCONNECTED_PEERS_INTERVAL_MS = 2 * 60 * 1000;
|
|
6
|
+
/** Given PING_INTERVAL constants of 15s/20s, we consider a peer is disconnected if there is no request in 1 minute */
|
|
7
|
+
const DISCONNECTED_TIMEOUT_MS = 60 * 1000;
|
|
8
|
+
/**
|
|
9
|
+
* Timeout to consider a request is no longer in progress
|
|
10
|
+
* this is to cover the case where `requestCompleted()` is not called due to unexpected errors
|
|
11
|
+
* for example https://github.com/ChainSafe/lodestar/issues/8256
|
|
12
|
+
**/
|
|
13
|
+
export const REQUEST_TIMEOUT_MS = 30 * 1000;
|
|
14
|
+
/**
|
|
15
|
+
* Simple rate limiter that allows a maximum of 2 concurrent requests per protocol per peer.
|
|
16
|
+
* The consumer should either prevent requests from being sent when the limit is reached or handle the case when the request is not allowed.
|
|
17
|
+
*/
|
|
18
|
+
export class SelfRateLimiter {
|
|
19
|
+
constructor(logger) {
|
|
20
|
+
this.logger = logger;
|
|
21
|
+
/** Interval to check lastSeenMessagesByPeer */
|
|
22
|
+
this.cleanupInterval = undefined;
|
|
23
|
+
this.rateLimitersPerPeer = new MapDef(() => new MapDef(() => new Map()));
|
|
24
|
+
this.lastSeenRequestsByPeer = new Map();
|
|
25
|
+
}
|
|
26
|
+
start() {
|
|
27
|
+
this.cleanupInterval = setInterval(this.checkDisconnectedPeers.bind(this), CHECK_DISCONNECTED_PEERS_INTERVAL_MS);
|
|
28
|
+
}
|
|
29
|
+
stop() {
|
|
30
|
+
if (this.cleanupInterval !== undefined) {
|
|
31
|
+
clearInterval(this.cleanupInterval);
|
|
32
|
+
this.cleanupInterval = undefined;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* called before we send a request to a peer.
|
|
37
|
+
*/
|
|
38
|
+
allows(peerId, protocolId, requestId) {
|
|
39
|
+
const now = Date.now();
|
|
40
|
+
const peerRateLimiter = this.rateLimitersPerPeer.getOrDefault(peerId);
|
|
41
|
+
const trackedRequests = peerRateLimiter.getOrDefault(protocolId);
|
|
42
|
+
this.lastSeenRequestsByPeer.set(peerId, now);
|
|
43
|
+
let inProgressRequests = 0;
|
|
44
|
+
for (const [trackedRequestId, trackedRequestTimeMs] of trackedRequests.entries()) {
|
|
45
|
+
if (trackedRequestTimeMs + REQUEST_TIMEOUT_MS <= now) {
|
|
46
|
+
// request timed out, remove it
|
|
47
|
+
trackedRequests.delete(trackedRequestId);
|
|
48
|
+
this.logger?.debug("SelfRateLimiter: request timed out, removing it", {
|
|
49
|
+
requestId: trackedRequestId,
|
|
50
|
+
requestTime: trackedRequestTimeMs,
|
|
51
|
+
peerId,
|
|
52
|
+
protocolId,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
inProgressRequests++;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (inProgressRequests >= MAX_CONCURRENT_REQUESTS) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
trackedRequests.set(requestId, now);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* called when a request to a peer is completed, regardless of success or failure.
|
|
67
|
+
* This should NOT be called when the request was not allowed
|
|
68
|
+
*/
|
|
69
|
+
requestCompleted(peerId, protocolId, requestId) {
|
|
70
|
+
const peerRateLimiter = this.rateLimitersPerPeer.getOrDefault(peerId);
|
|
71
|
+
const trackedRequests = peerRateLimiter.getOrDefault(protocolId);
|
|
72
|
+
trackedRequests.delete(requestId);
|
|
73
|
+
}
|
|
74
|
+
getPeerCount() {
|
|
75
|
+
return this.rateLimitersPerPeer.size;
|
|
76
|
+
}
|
|
77
|
+
checkDisconnectedPeers() {
|
|
78
|
+
const now = Date.now();
|
|
79
|
+
for (const [peerIdStr, lastSeenTime] of this.lastSeenRequestsByPeer.entries()) {
|
|
80
|
+
if (now - lastSeenTime >= DISCONNECTED_TIMEOUT_MS) {
|
|
81
|
+
this.rateLimitersPerPeer.delete(peerIdStr);
|
|
82
|
+
this.lastSeenRequestsByPeer.delete(peerIdStr);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=selfRateLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selfRateLimiter.js","sourceRoot":"","sources":["../../src/rate_limiter/selfRateLimiter.ts"],"names":[],"mappings":"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"}
|
package/lib/request/errors.d.ts
CHANGED
|
@@ -29,6 +29,10 @@ export declare enum RequestErrorCode {
|
|
|
29
29
|
RESP_TIMEOUT = "REQUEST_ERROR_RESP_TIMEOUT",
|
|
30
30
|
/** Request rate limited */
|
|
31
31
|
REQUEST_RATE_LIMITED = "REQUEST_ERROR_RATE_LIMITED",
|
|
32
|
+
/** Request self rate limited */
|
|
33
|
+
REQUEST_SELF_RATE_LIMITED = "REQUEST_ERROR_SELF_RATE_LIMITED",
|
|
34
|
+
/** Response rate limited */
|
|
35
|
+
RESP_RATE_LIMITED = "RESPONSE_ERROR_RATE_LIMITED",
|
|
32
36
|
/** For malformed SSZ (metadata) responses */
|
|
33
37
|
SSZ_OVER_MAX_SIZE = "SSZ_SNAPPY_ERROR_OVER_SSZ_MAX_SIZE"
|
|
34
38
|
}
|
|
@@ -58,8 +62,6 @@ type RequestErrorType = {
|
|
|
58
62
|
} | {
|
|
59
63
|
code: RequestErrorCode.REQUEST_ERROR;
|
|
60
64
|
error: Error;
|
|
61
|
-
} | {
|
|
62
|
-
code: RequestErrorCode.RESPONSE_TIMEOUT;
|
|
63
65
|
} | {
|
|
64
66
|
code: RequestErrorCode.EMPTY_RESPONSE;
|
|
65
67
|
} | {
|
|
@@ -68,6 +70,10 @@ type RequestErrorType = {
|
|
|
68
70
|
code: RequestErrorCode.RESP_TIMEOUT;
|
|
69
71
|
} | {
|
|
70
72
|
code: RequestErrorCode.REQUEST_RATE_LIMITED;
|
|
73
|
+
} | {
|
|
74
|
+
code: RequestErrorCode.REQUEST_SELF_RATE_LIMITED;
|
|
75
|
+
} | {
|
|
76
|
+
code: RequestErrorCode.RESP_RATE_LIMITED;
|
|
71
77
|
} | {
|
|
72
78
|
code: RequestErrorCode.SSZ_OVER_MAX_SIZE;
|
|
73
79
|
};
|
package/lib/request/errors.js
CHANGED
|
@@ -30,6 +30,10 @@ export var RequestErrorCode;
|
|
|
30
30
|
RequestErrorCode["RESP_TIMEOUT"] = "REQUEST_ERROR_RESP_TIMEOUT";
|
|
31
31
|
/** Request rate limited */
|
|
32
32
|
RequestErrorCode["REQUEST_RATE_LIMITED"] = "REQUEST_ERROR_RATE_LIMITED";
|
|
33
|
+
/** Request self rate limited */
|
|
34
|
+
RequestErrorCode["REQUEST_SELF_RATE_LIMITED"] = "REQUEST_ERROR_SELF_RATE_LIMITED";
|
|
35
|
+
/** Response rate limited */
|
|
36
|
+
RequestErrorCode["RESP_RATE_LIMITED"] = "RESPONSE_ERROR_RATE_LIMITED";
|
|
33
37
|
/** For malformed SSZ (metadata) responses */
|
|
34
38
|
RequestErrorCode["SSZ_OVER_MAX_SIZE"] = "SSZ_SNAPPY_ERROR_OVER_SSZ_MAX_SIZE";
|
|
35
39
|
})(RequestErrorCode || (RequestErrorCode = {}));
|
|
@@ -50,6 +54,17 @@ export class RequestError extends LodestarError {
|
|
|
50
54
|
*/
|
|
51
55
|
export function responseStatusErrorToRequestError(e) {
|
|
52
56
|
const { errorMessage, status } = e;
|
|
57
|
+
// rate limited error from clients have different status, for example: lighthouse responds with 139, teku responds with 1
|
|
58
|
+
// but all of them has "rate limit" in the error message
|
|
59
|
+
// refer to https://github.com/ChainSafe/lodestar/issues/8065#issuecomment-3157266196
|
|
60
|
+
const errorMessageLowercase = errorMessage.toLowerCase();
|
|
61
|
+
if (errorMessageLowercase.includes("rate limit")) {
|
|
62
|
+
return { code: RequestErrorCode.RESP_RATE_LIMITED };
|
|
63
|
+
}
|
|
64
|
+
// Grandine may return this without standard RespStatus, see https://github.com/ChainSafe/lodestar/issues/8110
|
|
65
|
+
if (errorMessageLowercase.includes("wait ")) {
|
|
66
|
+
return { code: RequestErrorCode.RESP_TIMEOUT };
|
|
67
|
+
}
|
|
53
68
|
switch (status) {
|
|
54
69
|
case RespStatus.INVALID_REQUEST:
|
|
55
70
|
return { code: RequestErrorCode.INVALID_REQUEST, errorMessage };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/request/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAsB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAC,UAAU,EAAyB,MAAM,iBAAiB,CAAC;AAGnE,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/request/errors.ts"],"names":[],"mappings":"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"}
|
package/lib/request/index.js
CHANGED
|
@@ -64,6 +64,7 @@ export async function* sendRequest({ logger, libp2p, metrics, peerClient }, peer
|
|
|
64
64
|
}
|
|
65
65
|
throw new RequestError({ code: RequestErrorCode.DIAL_ERROR, error: e });
|
|
66
66
|
});
|
|
67
|
+
metrics?.outgoingOpenedStreams?.inc({ method });
|
|
67
68
|
// TODO: Does the TTFB timer start on opening stream or after receiving request
|
|
68
69
|
const timerTTFB = metrics?.outgoingResponseTTFB.startTimer({ method });
|
|
69
70
|
// Parse protocol selected by the responder
|
|
@@ -71,6 +72,8 @@ export async function* sendRequest({ logger, libp2p, metrics, peerClient }, peer
|
|
|
71
72
|
const protocol = protocolsMap.get(protocolId);
|
|
72
73
|
if (!protocol)
|
|
73
74
|
throw Error(`dialProtocol selected unknown protocolId ${protocolId}`);
|
|
75
|
+
// Override with actual version that was negotiated
|
|
76
|
+
logCtx.version = protocol.version;
|
|
74
77
|
logger.debug("Req sending request", logCtx);
|
|
75
78
|
// Spec: The requester MUST close the write side of the stream once it finishes writing the request message
|
|
76
79
|
// Impl: stream.sink is closed automatically by js-libp2p-mplex when piped source is exhausted
|
|
@@ -136,7 +139,7 @@ export async function* sendRequest({ logger, libp2p, metrics, peerClient }, peer
|
|
|
136
139
|
// NOTE: Only log once per request to verbose, intermediate steps to debug
|
|
137
140
|
// NOTE: Do not log the response, logs get extremely cluttered
|
|
138
141
|
// NOTE: add double space after "Req " to align log with the "Resp " log
|
|
139
|
-
logger.verbose("Req done",
|
|
142
|
+
logger.verbose("Req done", logCtx);
|
|
140
143
|
}
|
|
141
144
|
finally {
|
|
142
145
|
clearTimeout(timeoutTTFB);
|
|
@@ -146,6 +149,8 @@ export async function* sendRequest({ logger, libp2p, metrics, peerClient }, peer
|
|
|
146
149
|
// `stream.close()` libp2p-mplex will .end() the source (it-pushable instance)
|
|
147
150
|
// If collectResponses() exhausts the source, it-pushable.end() can be safely called multiple times
|
|
148
151
|
await stream.close();
|
|
152
|
+
metrics?.outgoingClosedStreams?.inc({ method });
|
|
153
|
+
logger.verbose("Req stream closed", logCtx);
|
|
149
154
|
}
|
|
150
155
|
}
|
|
151
156
|
catch (e) {
|
package/lib/request/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/request/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/request/index.ts"],"names":[],"mappings":"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"}
|
package/lib/response/index.js
CHANGED
|
@@ -21,7 +21,14 @@ export const DEFAULT_REQUEST_TIMEOUT = 5 * 1000; // 5 sec
|
|
|
21
21
|
*/
|
|
22
22
|
export async function handleRequest({ logger, metrics, stream, peerId, protocol, protocolID, rateLimiter, signal, requestId = 0, peerClient = "unknown", requestTimeoutMs, }) {
|
|
23
23
|
const REQUEST_TIMEOUT = requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT;
|
|
24
|
-
const logCtx = {
|
|
24
|
+
const logCtx = {
|
|
25
|
+
method: protocol.method,
|
|
26
|
+
version: protocol.version,
|
|
27
|
+
client: peerClient,
|
|
28
|
+
peer: prettyPrintPeerId(peerId),
|
|
29
|
+
requestId,
|
|
30
|
+
};
|
|
31
|
+
metrics?.incomingOpenedStreams.inc({ method: protocol.method });
|
|
25
32
|
let responseError = null;
|
|
26
33
|
await pipe(
|
|
27
34
|
// Yields success chunks and error chunks in the same generator
|
|
@@ -72,6 +79,7 @@ export async function handleRequest({ logger, metrics, stream, peerId, protocol,
|
|
|
72
79
|
// If `requestDecode()` throws the stream.source must be closed manually
|
|
73
80
|
// To ensure the stream.source it-pushable instance is always closed, stream.close() is called always
|
|
74
81
|
await stream.close();
|
|
82
|
+
metrics?.incomingClosedStreams.inc({ method: protocol.method });
|
|
75
83
|
// TODO: It may happen that stream.sink returns before returning stream.source first,
|
|
76
84
|
// so you never see "Resp received request" in the logs and the response ends without
|
|
77
85
|
// sending any chunk, triggering EMPTY_RESPONSE error on the requesting side
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/response/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,YAAY,EAAE,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAC,IAAI,EAAC,MAAM,SAAS,CAAC;AAE7B,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAC,mBAAmB,EAAE,qBAAqB,EAAC,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAG3C,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAC,aAAa,EAAC,CAAC;AAEvB,+HAA+H;AAC/H,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ;AAkBzD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,MAAM,EACN,OAAO,EACP,MAAM,EACN,MAAM,EACN,QAAQ,EACR,UAAU,EACV,WAAW,EACX,MAAM,EACN,SAAS,GAAG,CAAC,EACb,UAAU,GAAG,SAAS,EACtB,gBAAgB,GACE;IAClB,MAAM,eAAe,GAAG,gBAAgB,IAAI,uBAAuB,CAAC;IAEpE,MAAM,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/response/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,5 +6,5 @@ export declare function encodeErrorMessage(errorMessage: string, encoding: Encod
|
|
|
6
6
|
/**
|
|
7
7
|
* Decodes error message from network bytes and removes non printable, non ascii characters.
|
|
8
8
|
*/
|
|
9
|
-
export declare function decodeErrorMessage(
|
|
9
|
+
export declare function decodeErrorMessage(encodedErrorMessage: Uint8Array): Promise<string>;
|
|
10
10
|
//# sourceMappingURL=errorMessage.d.ts.map
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { decode as varintDecode, encodingLength as varintEncodingLength } from "uint8-varint";
|
|
2
|
+
import { Uint8ArrayList } from "uint8arraylist";
|
|
1
3
|
import { writeSszSnappyPayload } from "../encodingStrategies/sszSnappy/encode.js";
|
|
4
|
+
import { SnappyFramesUncompress } from "../encodingStrategies/sszSnappy/snappyFrames/uncompress.js";
|
|
2
5
|
import { Encoding } from "../types.js";
|
|
3
6
|
// ErrorMessage schema:
|
|
4
7
|
//
|
|
@@ -24,9 +27,23 @@ export async function* encodeErrorMessage(errorMessage, encoding) {
|
|
|
24
27
|
/**
|
|
25
28
|
* Decodes error message from network bytes and removes non printable, non ascii characters.
|
|
26
29
|
*/
|
|
27
|
-
export function decodeErrorMessage(
|
|
30
|
+
export async function decodeErrorMessage(encodedErrorMessage) {
|
|
28
31
|
const encoder = new TextDecoder();
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
let sszDataLength;
|
|
33
|
+
try {
|
|
34
|
+
sszDataLength = varintDecode(encodedErrorMessage);
|
|
35
|
+
const decompressor = new SnappyFramesUncompress();
|
|
36
|
+
const varintBytes = varintEncodingLength(sszDataLength);
|
|
37
|
+
const errorMessage = decompressor.uncompress(new Uint8ArrayList(encodedErrorMessage.subarray(varintBytes)));
|
|
38
|
+
if (errorMessage == null || errorMessage.length !== sszDataLength) {
|
|
39
|
+
throw new Error("Malformed input: data length mismatch");
|
|
40
|
+
}
|
|
41
|
+
// remove non ascii characters from string
|
|
42
|
+
return encoder.decode(errorMessage.subarray(0)).replace(/[^\x20-\x7F]/g, "");
|
|
43
|
+
}
|
|
44
|
+
catch (_e) {
|
|
45
|
+
// remove non ascii characters from string
|
|
46
|
+
return encoder.decode(encodedErrorMessage.slice(0, 256)).replace(/[^\x20-\x7F]/g, "");
|
|
47
|
+
}
|
|
31
48
|
}
|
|
32
49
|
//# sourceMappingURL=errorMessage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorMessage.js","sourceRoot":"","sources":["../../src/utils/errorMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AAErC,uBAAuB;AACvB,EAAE;AACF,IAAI;AACJ,mCAAmC;AACnC,IAAI;AACJ,EAAE;AACF,uFAAuF;AACvF,wFAAwF;AACxF,EAAE;AACF,sHAAsH;AAEtH;;GAEG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,kBAAkB,CAAC,YAAoB,EAAE,QAAkB;IAChF,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEzD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,UAAU;YACtB,KAAK,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"errorMessage.js","sourceRoot":"","sources":["../../src/utils/errorMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,IAAI,YAAY,EAAE,cAAc,IAAI,oBAAoB,EAAC,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAC,cAAc,EAAC,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAC,qBAAqB,EAAC,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAC,sBAAsB,EAAC,MAAM,4DAA4D,CAAC;AAClG,OAAO,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AAErC,uBAAuB;AACvB,EAAE;AACF,IAAI;AACJ,mCAAmC;AACnC,IAAI;AACJ,EAAE;AACF,uFAAuF;AACvF,wFAAwF;AACxF,EAAE;AACF,sHAAsH;AAEtH;;GAEG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,kBAAkB,CAAC,YAAoB,EAAE,QAAkB;IAChF,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEzD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,UAAU;YACtB,KAAK,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,mBAA+B;IACtE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,aAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,aAAa,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,mBAAmB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5G,IAAI,YAAY,IAAI,IAAI,IAAI,YAAY,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,0CAA0C;QAC1C,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,0CAA0C;QAC1C,OAAO,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"bugs": {
|
|
12
12
|
"url": "https://github.com/ChainSafe/lodestar/issues"
|
|
13
13
|
},
|
|
14
|
-
"version": "1.
|
|
14
|
+
"version": "1.34.0-dev.07d20103f0",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -54,9 +54,9 @@
|
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"@chainsafe/fast-crc32c": "^4.2.0",
|
|
56
56
|
"@libp2p/interface": "^2.7.0",
|
|
57
|
-
"@lodestar/config": "
|
|
58
|
-
"@lodestar/params": "
|
|
59
|
-
"@lodestar/utils": "
|
|
57
|
+
"@lodestar/config": "1.34.0-dev.07d20103f0",
|
|
58
|
+
"@lodestar/params": "1.34.0-dev.07d20103f0",
|
|
59
|
+
"@lodestar/utils": "1.34.0-dev.07d20103f0",
|
|
60
60
|
"it-all": "^3.0.4",
|
|
61
61
|
"it-pipe": "^3.0.1",
|
|
62
62
|
"snappy": "^7.2.2",
|
|
@@ -65,8 +65,8 @@
|
|
|
65
65
|
"uint8arraylist": "^2.4.7"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"@lodestar/logger": "
|
|
69
|
-
"@lodestar/types": "
|
|
68
|
+
"@lodestar/logger": "1.34.0-dev.07d20103f0",
|
|
69
|
+
"@lodestar/types": "1.34.0-dev.07d20103f0",
|
|
70
70
|
"libp2p": "2.9.0"
|
|
71
71
|
},
|
|
72
72
|
"peerDependencies": {
|
|
@@ -80,5 +80,5 @@
|
|
|
80
80
|
"reqresp",
|
|
81
81
|
"blockchain"
|
|
82
82
|
],
|
|
83
|
-
"gitHead": "
|
|
83
|
+
"gitHead": "8553a1c045527e57595080cdeefbde1920e6e84c"
|
|
84
84
|
}
|