From 13aeefb0ebb44bbba725a43110af330c4e5aad38 Mon Sep 17 00:00:00 2001 From: tuyennhv Date: Thu, 24 Aug 2023 15:13:00 +0700 Subject: [PATCH 1/9] chore: merge if statements in isFinalizedRootOrDescendant (#5908) --- .../fork-choice/src/protoArray/protoArray.ts | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/packages/fork-choice/src/protoArray/protoArray.ts b/packages/fork-choice/src/protoArray/protoArray.ts index a09980b56aff..b2c030e17540 100644 --- a/packages/fork-choice/src/protoArray/protoArray.ts +++ b/packages/fork-choice/src/protoArray/protoArray.ts @@ -753,19 +753,12 @@ export class ProtoArray { // The finalized and justified checkpoints represent a list of known // ancestors of `node` that are likely to coincide with the store's // finalized checkpoint. - if (node.finalizedEpoch === this.finalizedEpoch && node.finalizedRoot === this.finalizedRoot) { - return true; - } - - if (node.justifiedEpoch === this.finalizedEpoch && node.justifiedRoot === this.finalizedRoot) { - return true; - } - - if (node.unrealizedFinalizedEpoch === this.finalizedEpoch && node.unrealizedFinalizedRoot === this.finalizedRoot) { - return true; - } - - if (node.unrealizedJustifiedEpoch === this.finalizedEpoch && node.unrealizedJustifiedRoot === this.finalizedRoot) { + if ( + (node.finalizedEpoch === this.finalizedEpoch && node.finalizedRoot === this.finalizedRoot) || + (node.justifiedEpoch === this.finalizedEpoch && node.justifiedRoot === this.finalizedRoot) || + (node.unrealizedFinalizedEpoch === this.finalizedEpoch && node.unrealizedFinalizedRoot === this.finalizedRoot) || + (node.unrealizedJustifiedEpoch === this.finalizedEpoch && node.unrealizedJustifiedRoot === this.finalizedRoot) + ) { return true; } From e50877ff5d44b130b22e9c92e0c605e055ecd81e Mon Sep 17 00:00:00 2001 From: tuyennhv Date: Thu, 24 Aug 2023 15:15:27 +0700 Subject: [PATCH 2/9] feat: take profiles of main thread and discv5 thread (#5909) * feat: api to take profile of main thread * feat: take profile of discv5 thread --- packages/api/src/beacon/routes/lodestar.ts | 17 ++++++---- .../src/api/impl/lodestar/index.ts | 32 ++++++++++++++++--- .../src/network/core/networkCore.ts | 4 +++ .../src/network/core/networkCoreWorker.ts | 7 ++-- .../network/core/networkCoreWorkerHandler.ts | 5 ++- .../beacon-node/src/network/core/types.ts | 6 ++-- .../beacon-node/src/network/discv5/index.ts | 4 +++ .../beacon-node/src/network/discv5/types.ts | 3 ++ .../beacon-node/src/network/discv5/worker.ts | 9 ++++++ packages/beacon-node/src/network/interface.ts | 3 +- packages/beacon-node/src/network/network.ts | 6 +++- .../onWorker/dataSerialization.test.ts | 2 ++ 12 files changed, 78 insertions(+), 20 deletions(-) diff --git a/packages/api/src/beacon/routes/lodestar.ts b/packages/api/src/beacon/routes/lodestar.ts index 936785c246c7..8979f31a14c1 100644 --- a/packages/api/src/beacon/routes/lodestar.ts +++ b/packages/api/src/beacon/routes/lodestar.ts @@ -74,11 +74,14 @@ export type LodestarNodePeer = NodePeer & { agentVersion: string; }; +export type LodestarThreadType = "main" | "network" | "discv5"; + export type Api = { /** Trigger to write a heapdump to disk at `dirpath`. May take > 1min */ writeHeapdump(dirpath?: string): Promise>; /** Trigger to write 10m network thread profile to disk */ - writeNetworkThreadProfile( + writeProfile( + thread?: LodestarThreadType, duration?: number, dirpath?: string ): Promise>; @@ -130,7 +133,7 @@ export type Api = { */ export const routesData: RoutesData = { writeHeapdump: {url: "/eth/v1/lodestar/write_heapdump", method: "POST"}, - writeNetworkThreadProfile: {url: "/eth/v1/lodestar/write_network_thread_profile", method: "POST"}, + writeProfile: {url: "/eth/v1/lodestar/write_profile", method: "POST"}, getLatestWeakSubjectivityCheckpointEpoch: {url: "/eth/v1/lodestar/ws_epoch", method: "GET"}, getSyncChainsDebugState: {url: "/eth/v1/lodestar/sync_chains_debug_state", method: "GET"}, getGossipQueueItems: {url: "/eth/v1/lodestar/gossip_queue_items/:gossipType", method: "GET"}, @@ -151,7 +154,7 @@ export const routesData: RoutesData = { export type ReqTypes = { writeHeapdump: {query: {dirpath?: string}}; - writeNetworkThreadProfile: {query: {duration?: number; dirpath?: string}}; + writeProfile: {query: {thread?: LodestarThreadType; duration?: number; dirpath?: string}}; getLatestWeakSubjectivityCheckpointEpoch: ReqEmpty; getSyncChainsDebugState: ReqEmpty; getGossipQueueItems: {params: {gossipType: string}}; @@ -177,9 +180,9 @@ export function getReqSerializers(): ReqSerializers { parseReq: ({query}) => [query.dirpath], schema: {query: {dirpath: Schema.String}}, }, - writeNetworkThreadProfile: { - writeReq: (duration, dirpath) => ({query: {duration, dirpath}}), - parseReq: ({query}) => [query.duration, query.dirpath], + writeProfile: { + writeReq: (thread, duration, dirpath) => ({query: {thread, duration, dirpath}}), + parseReq: ({query}) => [query.thread, query.duration, query.dirpath], schema: {query: {dirpath: Schema.String}}, }, getLatestWeakSubjectivityCheckpointEpoch: reqEmpty, @@ -224,7 +227,7 @@ export function getReqSerializers(): ReqSerializers { export function getReturnTypes(): ReturnTypes { return { writeHeapdump: sameType(), - writeNetworkThreadProfile: sameType(), + writeProfile: sameType(), getLatestWeakSubjectivityCheckpointEpoch: sameType(), getSyncChainsDebugState: jsonType("snake"), getGossipQueueItems: jsonType("snake"), diff --git a/packages/beacon-node/src/api/impl/lodestar/index.ts b/packages/beacon-node/src/api/impl/lodestar/index.ts index 62e336138191..edbb154c7feb 100644 --- a/packages/beacon-node/src/api/impl/lodestar/index.ts +++ b/packages/beacon-node/src/api/impl/lodestar/index.ts @@ -1,3 +1,5 @@ +import fs from "node:fs"; +import path from "node:path"; import {toHexString} from "@chainsafe/ssz"; import {routes, ServerApi} from "@lodestar/api"; import {Repository} from "@lodestar/db"; @@ -5,11 +7,14 @@ import {toHex} from "@lodestar/utils"; import {getLatestWeakSubjectivityCheckpointEpoch} from "@lodestar/state-transition"; import {ChainForkConfig} from "@lodestar/config"; import {ssz} from "@lodestar/types"; +import {LodestarThreadType} from "@lodestar/api/lib/beacon/routes/lodestar.js"; +import {SLOTS_PER_EPOCH} from "@lodestar/params"; import {BeaconChain} from "../../../chain/index.js"; import {QueuedStateRegenerator, RegenRequest} from "../../../chain/regen/index.js"; import {GossipType} from "../../../network/index.js"; import {IBeaconDb} from "../../../db/interface.js"; import {ApiModules} from "../types.js"; +import {profileNodeJS} from "../../../util/profile.js"; export function getLodestarApi({ chain, @@ -19,7 +24,8 @@ export function getLodestarApi({ sync, }: Pick): ServerApi { let writingHeapdump = false; - let writingNetworkProfile = false; + let writingProfile = false; + const defaultProfileMs = SLOTS_PER_EPOCH * config.SECONDS_PER_SLOT * 1000; return { async writeHeapdump(dirpath = ".") { @@ -48,16 +54,32 @@ export function getLodestarApi({ } }, - async writeNetworkThreadProfile(durationMs?: number, dirpath?: string) { - if (writingNetworkProfile) { + async writeProfile(thread: LodestarThreadType = "network", durationMs = defaultProfileMs, dirpath = ".") { + if (writingProfile) { throw Error("Already writing network profile"); } + writingProfile = true; try { - const filepath = await network.writeNetworkThreadProfile(durationMs, dirpath); + let filepath: string; + let profile: string; + switch (thread) { + case "network": + filepath = await network.writeNetworkThreadProfile(durationMs, dirpath); + break; + case "discv5": + filepath = await network.writeDiscv5Profile(durationMs, dirpath); + break; + default: + // main thread + profile = await profileNodeJS(durationMs); + filepath = path.join(dirpath, `main_thread_${new Date().toISOString()}.cpuprofile`); + fs.writeFileSync(filepath, profile); + break; + } return {data: {filepath}}; } finally { - writingNetworkProfile = false; + writingProfile = false; } }, diff --git a/packages/beacon-node/src/network/core/networkCore.ts b/packages/beacon-node/src/network/core/networkCore.ts index ea44d4948a39..34733739a996 100644 --- a/packages/beacon-node/src/network/core/networkCore.ts +++ b/packages/beacon-node/src/network/core/networkCore.ts @@ -421,6 +421,10 @@ export class NetworkCore implements INetworkCore { throw new Error("Method not implemented, please configure network thread"); } + async writeDiscv5Profile(durationMs: number, dirpath: string): Promise { + return this.peerManager["discovery"]?.discv5.writeProfile(durationMs, dirpath) ?? "no discv5"; + } + /** * Handle subscriptions through fork transitions, @see FORK_EPOCH_LOOKAHEAD */ diff --git a/packages/beacon-node/src/network/core/networkCoreWorker.ts b/packages/beacon-node/src/network/core/networkCoreWorker.ts index 4f28670711c4..ef3408038343 100644 --- a/packages/beacon-node/src/network/core/networkCoreWorker.ts +++ b/packages/beacon-node/src/network/core/networkCoreWorker.ts @@ -6,7 +6,6 @@ import {expose} from "@chainsafe/threads/worker"; import type {WorkerModule} from "@chainsafe/threads/dist/types/worker.js"; import {chainConfigFromJson, createBeaconConfig} from "@lodestar/config"; import {getNodeLogger} from "@lodestar/logger/node"; -import {SLOTS_PER_EPOCH} from "@lodestar/params"; import {collectNodeJSMetrics, RegistryMetricCreator} from "../../metrics/index.js"; import {AsyncIterableBridgeCaller, AsyncIterableBridgeHandler} from "../../util/asyncIterableToEvents.js"; import {Clock} from "../../util/clock.js"; @@ -36,7 +35,6 @@ if (!parentPort) throw Error("parentPort must be defined"); const config = createBeaconConfig(chainConfigFromJson(workerData.chainConfigJson), workerData.genesisValidatorsRoot); const peerId = await createFromProtobuf(workerData.peerIdProto); -const DEFAULT_PROFILE_DURATION = SLOTS_PER_EPOCH * config.SECONDS_PER_SLOT * 1000; // TODO: Pass options from main thread for logging // TODO: Logging won't be visible in file loggers @@ -153,12 +151,15 @@ const libp2pWorkerApi: NetworkWorkerApi = { dumpGossipPeerScoreStats: () => core.dumpGossipPeerScoreStats(), dumpDiscv5KadValues: () => core.dumpDiscv5KadValues(), dumpMeshPeers: () => core.dumpMeshPeers(), - writeProfile: async (durationMs = DEFAULT_PROFILE_DURATION, dirpath = ".") => { + writeProfile: async (durationMs: number, dirpath: string) => { const profile = await profileNodeJS(durationMs); const filePath = path.join(dirpath, `network_thread_${new Date().toISOString()}.cpuprofile`); fs.writeFileSync(filePath, profile); return filePath; }, + writeDiscv5Profile: async (durationMs: number, dirpath: string) => { + return core.writeDiscv5Profile(durationMs, dirpath); + }, }; expose(libp2pWorkerApi as WorkerModule); diff --git a/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts b/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts index f615458ddd12..bd9e71e5e6bd 100644 --- a/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts +++ b/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts @@ -210,9 +210,12 @@ export class WorkerNetworkCore implements INetworkCore { dumpMeshPeers(): Promise> { return this.getApi().dumpMeshPeers(); } - writeNetworkThreadProfile(durationMs?: number, dirpath?: string): Promise { + writeNetworkThreadProfile(durationMs: number, dirpath: string): Promise { return this.getApi().writeProfile(durationMs, dirpath); } + writeDiscv5Profile(durationMs: number, dirpath: string): Promise { + return this.getApi().writeDiscv5Profile(durationMs, dirpath); + } private getApi(): NetworkWorkerApi { return this.modules.workerApi; diff --git a/packages/beacon-node/src/network/core/types.ts b/packages/beacon-node/src/network/core/types.ts index a1e8f5d9c1cc..d36d339e9a97 100644 --- a/packages/beacon-node/src/network/core/types.ts +++ b/packages/beacon-node/src/network/core/types.ts @@ -61,7 +61,8 @@ export interface INetworkCore extends INetworkCorePublic { close(): Promise; scrapeMetrics(): Promise; - writeNetworkThreadProfile(durationMs?: number, dirpath?: string): Promise; + writeNetworkThreadProfile(durationMs: number, dirpath: string): Promise; + writeDiscv5Profile(durationMs: number, dirpath: string): Promise; } /** @@ -100,7 +101,8 @@ export type NetworkWorkerApi = INetworkCorePublic & { close(): Promise; scrapeMetrics(): Promise; - writeProfile(durationMs?: number, dirpath?: string): Promise; + writeProfile(durationMs: number, dirpath: string): Promise; + writeDiscv5Profile(durationMs: number, dirpath: string): Promise; // TODO: ReqResp outgoing // TODO: ReqResp incoming diff --git a/packages/beacon-node/src/network/discv5/index.ts b/packages/beacon-node/src/network/discv5/index.ts index d5bc9bb0dffd..bf0108ebe571 100644 --- a/packages/beacon-node/src/network/discv5/index.ts +++ b/packages/beacon-node/src/network/discv5/index.ts @@ -103,6 +103,10 @@ export class Discv5Worker extends (EventEmitter as {new (): StrictEventEmitter { + return this.workerApi.writeProfile(durationMs, dirpath); + } + private decodeEnrs(objs: ENRData[]): ENR[] { const enrs: ENR[] = []; for (const obj of objs) { diff --git a/packages/beacon-node/src/network/discv5/types.ts b/packages/beacon-node/src/network/discv5/types.ts index 3c06e4ebb27e..cea262cc9e89 100644 --- a/packages/beacon-node/src/network/discv5/types.ts +++ b/packages/beacon-node/src/network/discv5/types.ts @@ -62,6 +62,9 @@ export type Discv5WorkerApi = { /** Prometheus metrics string */ scrapeMetrics(): Promise; + + /** write profile to disc */ + writeProfile(durationMs: number, dirpath: string): Promise; /** tear down discv5 resources */ close(): Promise; }; diff --git a/packages/beacon-node/src/network/discv5/worker.ts b/packages/beacon-node/src/network/discv5/worker.ts index 9b7cb1a6dce3..31f434f94476 100644 --- a/packages/beacon-node/src/network/discv5/worker.ts +++ b/packages/beacon-node/src/network/discv5/worker.ts @@ -1,4 +1,6 @@ import worker from "node:worker_threads"; +import path from "node:path"; +import fs from "node:fs"; import {createFromProtobuf} from "@libp2p/peer-id-factory"; import {Multiaddr, multiaddr} from "@multiformats/multiaddr"; import {Gauge} from "prom-client"; @@ -9,6 +11,7 @@ import {createBeaconConfig} from "@lodestar/config"; import {getNodeLogger} from "@lodestar/logger/node"; import {RegistryMetricCreator} from "../../metrics/index.js"; import {collectNodeJSMetrics} from "../../metrics/nodeJsMetrics.js"; +import {profileNodeJS} from "../../util/profile.js"; import {Discv5WorkerApi, Discv5WorkerData} from "./types.js"; import {enrRelevance, ENRRelevance} from "./utils.js"; @@ -98,6 +101,12 @@ const module: Discv5WorkerApi = { async scrapeMetrics(): Promise { return (await metricsRegistry?.metrics()) ?? ""; }, + writeProfile: async (durationMs: number, dirpath: string) => { + const profile = await profileNodeJS(durationMs); + const filePath = path.join(dirpath, `discv5_thread_${new Date().toISOString()}.cpuprofile`); + fs.writeFileSync(filePath, profile); + return filePath; + }, async close() { closeMetrics?.(); discv5.removeListener("discovered", onDiscovered); diff --git a/packages/beacon-node/src/network/interface.ts b/packages/beacon-node/src/network/interface.ts index b9ca9e002116..e0718368c672 100644 --- a/packages/beacon-node/src/network/interface.ts +++ b/packages/beacon-node/src/network/interface.ts @@ -58,7 +58,8 @@ export interface INetwork extends INetworkCorePublic { // Debug dumpGossipQueue(gossipType: GossipType): Promise; - writeNetworkThreadProfile(durationMs?: number, dirpath?: string): Promise; + writeNetworkThreadProfile(durationMs: number, dirpath: string): Promise; + writeDiscv5Profile(durationMs: number, dirpath: string): Promise; } export type LodestarComponents = Pick< diff --git a/packages/beacon-node/src/network/network.ts b/packages/beacon-node/src/network/network.ts index 4453a0e92145..fba3c7a23e22 100644 --- a/packages/beacon-node/src/network/network.ts +++ b/packages/beacon-node/src/network/network.ts @@ -537,10 +537,14 @@ export class Network implements INetwork { return this.networkProcessor.dumpGossipQueue(gossipType); } - async writeNetworkThreadProfile(durationMs?: number, dirpath?: string): Promise { + async writeNetworkThreadProfile(durationMs: number, dirpath: string): Promise { return this.core.writeNetworkThreadProfile(durationMs, dirpath); } + async writeDiscv5Profile(durationMs: number, dirpath: string): Promise { + return this.core.writeDiscv5Profile(durationMs, dirpath); + } + private onLightClientFinalityUpdate = async (finalityUpdate: allForks.LightClientFinalityUpdate): Promise => { // TODO: Review is OK to remove if (this.hasAttachedSyncCommitteeMember()) diff --git a/packages/beacon-node/test/e2e/network/onWorker/dataSerialization.test.ts b/packages/beacon-node/test/e2e/network/onWorker/dataSerialization.test.ts index 12841953372e..517359b93efd 100644 --- a/packages/beacon-node/test/e2e/network/onWorker/dataSerialization.test.ts +++ b/packages/beacon-node/test/e2e/network/onWorker/dataSerialization.test.ts @@ -142,6 +142,7 @@ describe("data serialization through worker boundary", function () { close: [], scrapeMetrics: [], writeProfile: [0, ""], + writeDiscv5Profile: [0, ""], }; const lodestarPeer: routes.lodestar.LodestarNodePeer = { @@ -204,6 +205,7 @@ describe("data serialization through worker boundary", function () { close: null, scrapeMetrics: "test-metrics", writeProfile: "", + writeDiscv5Profile: "", }; type TestCase = {id: string; data: unknown; shouldFail?: boolean}; From 72e95e2096ec4d62d29555d7d577db58adc6b334 Mon Sep 17 00:00:00 2001 From: tuyennhv Date: Thu, 24 Aug 2023 19:31:24 +0700 Subject: [PATCH 3/9] chore: add batch attestation metrics to Grafana (#5910) --- dashboards/lodestar_networking.json | 340 ++++++++++++++++++++++++---- 1 file changed, 298 insertions(+), 42 deletions(-) diff --git a/dashboards/lodestar_networking.json b/dashboards/lodestar_networking.json index d6f0307f4089..cd1da4c06c71 100644 --- a/dashboards/lodestar_networking.json +++ b/dashboards/lodestar_networking.json @@ -3910,32 +3910,7 @@ }, "mappings": [] }, - "overrides": [ - { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "GOSSIP_ERROR_PAST_SLOT" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": true - } - } - ] - } - ] + "overrides": [] }, "gridPos": { "h": 8, @@ -4571,13 +4546,294 @@ "title": "Used States", "type": "timeseries" }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "unit": "s" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "key_size" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "unit", + "value": "none" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 179 + }, + "id": 617, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(lodestar_gossip_validation_queue_key_age_seconds_sum[$rate_interval])\n/\nrate(lodestar_gossip_validation_queue_key_age_seconds_count[$rate_interval])", + "legendFormat": "key_age", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(lodestar_gossip_validation_queue_time_seconds_sum[$rate_interval])\n/\nrate(lodestar_gossip_validation_queue_time_seconds_count[$rate_interval])", + "hide": false, + "legendFormat": "queue_time", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "lodestar_gossip_validation_queue_key_size{topic=\"beacon_attestation\"}", + "hide": false, + "legendFormat": "key_size", + "range": true, + "refId": "C" + } + ], + "title": "Indexed Gossip Queue", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 187 + }, + "id": 619, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(lodestar_gossip_attestation_verified_in_batch_histogram_sum[$rate_interval])\n/\n(\n rate(lodestar_gossip_attestation_verified_in_batch_histogram_sum[$rate_interval]) +\n rate(lodestar_gossip_attestation_verified_non_batch_count[$rate_interval])\n)", + "legendFormat": "batch_percentage", + "range": true, + "refId": "A" + } + ], + "title": "Batch Percentage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 187 + }, + "id": 621, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Magma", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "show": true, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "9.3.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "lodestar_gossip_attestation_verified_in_batch_histogram_bucket", + "format": "heatmap", + "instant": false, + "legendFormat": "{{le}}", + "range": true, + "refId": "A" + } + ], + "title": "Batch Histogram", + "type": "heatmap" + }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 187 + "y": 195 }, "id": 600, "panels": [], @@ -4633,7 +4889,7 @@ "h": 8, "w": 12, "x": 0, - "y": 188 + "y": 196 }, "id": 602, "options": { @@ -4761,7 +5017,7 @@ "h": 8, "w": 12, "x": 12, - "y": 188 + "y": 196 }, "id": 604, "options": { @@ -4913,7 +5169,7 @@ "h": 8, "w": 12, "x": 0, - "y": 196 + "y": 204 }, "id": 603, "options": { @@ -4992,7 +5248,7 @@ "h": 8, "w": 12, "x": 12, - "y": 196 + "y": 204 }, "id": 601, "options": { @@ -5033,7 +5289,7 @@ "h": 1, "w": 24, "x": 0, - "y": 204 + "y": 212 }, "id": 188, "panels": [], @@ -5098,7 +5354,7 @@ "h": 8, "w": 12, "x": 0, - "y": 205 + "y": 213 }, "id": 180, "options": { @@ -5179,7 +5435,7 @@ "h": 8, "w": 12, "x": 12, - "y": 205 + "y": 213 }, "id": 176, "options": { @@ -5260,7 +5516,7 @@ "h": 8, "w": 12, "x": 0, - "y": 213 + "y": 221 }, "id": 182, "options": { @@ -5341,7 +5597,7 @@ "h": 8, "w": 12, "x": 12, - "y": 213 + "y": 221 }, "id": 178, "options": { @@ -5422,7 +5678,7 @@ "h": 8, "w": 12, "x": 0, - "y": 221 + "y": 229 }, "id": 605, "options": { @@ -5505,7 +5761,7 @@ "h": 8, "w": 12, "x": 12, - "y": 221 + "y": 229 }, "id": 606, "options": { @@ -5588,7 +5844,7 @@ "h": 8, "w": 12, "x": 0, - "y": 229 + "y": 237 }, "id": 498, "options": { @@ -5669,7 +5925,7 @@ "h": 8, "w": 12, "x": 12, - "y": 229 + "y": 237 }, "id": 500, "options": { @@ -5750,7 +6006,7 @@ "h": 8, "w": 12, "x": 0, - "y": 237 + "y": 245 }, "id": 184, "options": { @@ -5831,7 +6087,7 @@ "h": 8, "w": 12, "x": 12, - "y": 237 + "y": 245 }, "id": 501, "options": { From 4bd554f9986cffcbad4a2fd1c557c9e427861d67 Mon Sep 17 00:00:00 2001 From: Phil Ngo <58080811+philknows@users.noreply.github.com> Date: Thu, 24 Aug 2023 10:25:24 -0600 Subject: [PATCH 4/9] chore: update Capella fork epoch on Holesky (#5911) Update Capella fork epoch on Holesky --- packages/config/src/chainConfig/networks/holesky.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/config/src/chainConfig/networks/holesky.ts b/packages/config/src/chainConfig/networks/holesky.ts index 3481b79b8a7f..ef47a61a4002 100644 --- a/packages/config/src/chainConfig/networks/holesky.ts +++ b/packages/config/src/chainConfig/networks/holesky.ts @@ -30,7 +30,7 @@ export const holeskyChainConfig: ChainConfig = { TERMINAL_TOTAL_DIFFICULTY: BigInt("0"), // Capella CAPELLA_FORK_VERSION: b("0x30017000"), - CAPELLA_FORK_EPOCH: 10, + CAPELLA_FORK_EPOCH: 256, // # 28,000,000,000 Gwei to ensure quicker ejection EJECTION_BALANCE: 28000000000, From 1b40a919e3c5fc882588a1d0fd0c3adf755dc939 Mon Sep 17 00:00:00 2001 From: Matthew Keil Date: Thu, 24 Aug 2023 16:33:01 -0600 Subject: [PATCH 5/9] feat(beacon-node): network worker new space adjustment (#5829) * feat: up worker maxYoungGenerationSizeMb to 32 * feat: up worker maxYoungGenerationSizeMb to 64 * feat(dashboards): update memory panels on vm/host * feat(network-worker): update new space to 512mb * fix(dashboard): add newline to end of file * fix(dashboard): lint vm * feat: up worker maxYoungGenerationSizeMb to 32 * feat: up worker maxYoungGenerationSizeMb to 64 * feat(dashboards): update memory panels on vm/host * feat(network-worker): update new space to 512mb * fix(dashboard): add newline to end of file * fix(dashboard): lint vm * fix: dashboard lint * feat(network-worker): maxYoungGenerationSizeMb to 128mb * fix(dashboards): revert dashboard changes * fix: revert changes to dashboard and package.json * feat(network-worker): use young generation value from research * feat(cli): add hidden maxYoungGenerationSizeMb * fix: update bad merge conflict resolution * fix: update bad merge conflict resolution * chore: lint --fix code --- .../src/network/core/networkCoreWorkerHandler.ts | 16 +++++++++++++++- packages/beacon-node/src/network/options.ts | 3 +++ .../cli/src/options/beaconNodeOptions/network.ts | 10 ++++++++++ .../test/unit/options/beaconNodeOptions.test.ts | 2 ++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts b/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts index bd9e71e5e6bd..46c06456c429 100644 --- a/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts +++ b/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts @@ -107,7 +107,21 @@ export class WorkerNetworkCore implements INetworkCore { loggerOpts: modules.logger.toOpts(), }; - const worker = new Worker("./networkCoreWorker.js", {workerData} as ConstructorParameters[1]); + const worker = new Worker("./networkCoreWorker.js", { + workerData, + /** + * maxYoungGenerationSizeMb defaults to 152mb through the cli option defaults. + * That default value was determined via https://github.com/ChainSafe/lodestar/issues/2115 and + * should be tuned further as needed. If we update network code and see substantial + * difference in the quantity of garbage collected this should get updated. A value that is + * too low will result in too much GC time and a value that is too high causes increased mark + * and sweep for some reason (which is much much slower than scavenge). A marginally too high + * number causes detrimental slowdown from increased variable lookup time. Empirical evidence + * showed that there is a pretty big window of "correct" values but we can always tune as + * necessary + */ + resourceLimits: {maxYoungGenerationSizeMb: opts.maxYoungGenerationSizeMb}, + } as ConstructorParameters[1]); // eslint-disable-next-line @typescript-eslint/no-explicit-any const workerApi = (await spawn(worker, { diff --git a/packages/beacon-node/src/network/options.ts b/packages/beacon-node/src/network/options.ts index 79f5f6544817..b490e3c7206d 100644 --- a/packages/beacon-node/src/network/options.ts +++ b/packages/beacon-node/src/network/options.ts @@ -21,6 +21,7 @@ export interface NetworkOptions version?: string; private?: boolean; useWorker?: boolean; + maxYoungGenerationSizeMb?: number; } export const defaultNetworkOptions: NetworkOptions = { @@ -32,6 +33,8 @@ export const defaultNetworkOptions: NetworkOptions = { discv5: null, rateLimitMultiplier: 1, useWorker: true, + // default set via research in https://github.com/ChainSafe/lodestar/issues/2115 + maxYoungGenerationSizeMb: 152, // subscribe to 2 subnets per node since v1.10 deterministicLongLivedAttnets: true, // subscribe 2 slots before aggregator dutied slot to get stable mesh peers as monitored on goerli diff --git a/packages/cli/src/options/beaconNodeOptions/network.ts b/packages/cli/src/options/beaconNodeOptions/network.ts index e10cfeca0f70..745308ec7c8c 100644 --- a/packages/cli/src/options/beaconNodeOptions/network.ts +++ b/packages/cli/src/options/beaconNodeOptions/network.ts @@ -35,6 +35,7 @@ export type NetworkArgs = { "network.rateLimitMultiplier"?: number; "network.maxGossipTopicConcurrency"?: number; "network.useWorker"?: boolean; + "network.maxYoungGenerationSizeMb"?: number; /** @deprecated This option is deprecated and should be removed in next major release. */ "network.requestCountPeerLimit"?: number; @@ -153,6 +154,7 @@ export function parseArgs(args: NetworkArgs): IBeaconNodeOptions["network"] { rateLimitMultiplier: args["network.rateLimitMultiplier"], maxGossipTopicConcurrency: args["network.maxGossipTopicConcurrency"], useWorker: args["network.useWorker"], + maxYoungGenerationSizeMb: args["network.maxYoungGenerationSizeMb"], }; } @@ -385,4 +387,12 @@ export const options: CliCommandOptions = { hidden: true, group: "network", }, + + "network.maxYoungGenerationSizeMb": { + type: "number", + hidden: true, + group: "network", + description: "Max size of young generation in megabytes. Defaults to 152mb", + defaultDescription: String(defaultOptions.network.maxYoungGenerationSizeMb), + }, }; diff --git a/packages/cli/test/unit/options/beaconNodeOptions.test.ts b/packages/cli/test/unit/options/beaconNodeOptions.test.ts index 442b4c529d9b..b0f0254443dc 100644 --- a/packages/cli/test/unit/options/beaconNodeOptions.test.ts +++ b/packages/cli/test/unit/options/beaconNodeOptions.test.ts @@ -96,6 +96,7 @@ describe("options / beaconNodeOptions", () => { "network.rateLimitMultiplier": 1, "network.maxGossipTopicConcurrency": 64, "network.useWorker": true, + "network.maxYoungGenerationSizeMb": 152, "sync.isSingleNode": true, "sync.disableProcessAsChainSegment": true, @@ -199,6 +200,7 @@ describe("options / beaconNodeOptions", () => { rateLimitMultiplier: 1, maxGossipTopicConcurrency: 64, useWorker: true, + maxYoungGenerationSizeMb: 152, }, sync: { isSingleNode: true, From 5fd04f0d0be90b723554f1b230cbe1068b25ce5a Mon Sep 17 00:00:00 2001 From: Cayman Date: Thu, 24 Aug 2023 18:47:16 -0400 Subject: [PATCH 6/9] v1.11.0 --- lerna.json | 2 +- packages/api/package.json | 10 +++++----- packages/beacon-node/package.json | 26 +++++++++++++------------- packages/cli/package.json | 26 +++++++++++++------------- packages/config/package.json | 6 +++--- packages/db/package.json | 8 ++++---- packages/flare/package.json | 14 +++++++------- packages/fork-choice/package.json | 12 ++++++------ packages/light-client/package.json | 14 +++++++------- packages/logger/package.json | 8 ++++---- packages/params/package.json | 2 +- packages/prover/package.json | 18 +++++++++--------- packages/reqresp/package.json | 12 ++++++------ packages/spec-test-util/package.json | 4 ++-- packages/state-transition/package.json | 10 +++++----- packages/test-utils/package.json | 4 ++-- packages/types/package.json | 4 ++-- packages/utils/package.json | 2 +- packages/validator/package.json | 16 ++++++++-------- 19 files changed, 99 insertions(+), 99 deletions(-) diff --git a/lerna.json b/lerna.json index 049221287c4e..36126fe71630 100644 --- a/lerna.json +++ b/lerna.json @@ -5,7 +5,7 @@ "npmClient": "yarn", "useWorkspaces": true, "useNx": true, - "version": "1.10.0", + "version": "1.11.0", "stream": "true", "command": { "version": { diff --git a/packages/api/package.json b/packages/api/package.json index 8975a4cef42a..f2bda020ba9f 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/ChainSafe/lodestar/issues" }, - "version": "1.10.0", + "version": "1.11.0", "type": "module", "exports": { ".": { @@ -71,10 +71,10 @@ "dependencies": { "@chainsafe/persistent-merkle-tree": "^0.5.0", "@chainsafe/ssz": "^0.10.2", - "@lodestar/config": "^1.10.0", - "@lodestar/params": "^1.10.0", - "@lodestar/types": "^1.10.0", - "@lodestar/utils": "^1.10.0", + "@lodestar/config": "^1.11.0", + "@lodestar/params": "^1.11.0", + "@lodestar/types": "^1.11.0", + "@lodestar/utils": "^1.11.0", "eventsource": "^2.0.2", "qs": "^6.11.1" }, diff --git a/packages/beacon-node/package.json b/packages/beacon-node/package.json index 6edf5ce7086f..95ec9b2a55c6 100644 --- a/packages/beacon-node/package.json +++ b/packages/beacon-node/package.json @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/ChainSafe/lodestar/issues" }, - "version": "1.10.0", + "version": "1.11.0", "type": "module", "exports": { ".": { @@ -117,18 +117,18 @@ "@libp2p/peer-id-factory": "^3.0.2", "@libp2p/prometheus-metrics": "^2.0.2", "@libp2p/tcp": "8.0.2", - "@lodestar/api": "^1.10.0", - "@lodestar/config": "^1.10.0", - "@lodestar/db": "^1.10.0", - "@lodestar/fork-choice": "^1.10.0", - "@lodestar/light-client": "^1.10.0", - "@lodestar/logger": "^1.10.0", - "@lodestar/params": "^1.10.0", - "@lodestar/reqresp": "^1.10.0", - "@lodestar/state-transition": "^1.10.0", - "@lodestar/types": "^1.10.0", - "@lodestar/utils": "^1.10.0", - "@lodestar/validator": "^1.10.0", + "@lodestar/api": "^1.11.0", + "@lodestar/config": "^1.11.0", + "@lodestar/db": "^1.11.0", + "@lodestar/fork-choice": "^1.11.0", + "@lodestar/light-client": "^1.11.0", + "@lodestar/logger": "^1.11.0", + "@lodestar/params": "^1.11.0", + "@lodestar/reqresp": "^1.11.0", + "@lodestar/state-transition": "^1.11.0", + "@lodestar/types": "^1.11.0", + "@lodestar/utils": "^1.11.0", + "@lodestar/validator": "^1.11.0", "@multiformats/multiaddr": "^12.1.3", "@types/datastore-level": "^3.0.0", "buffer-xor": "^2.0.2", diff --git a/packages/cli/package.json b/packages/cli/package.json index 87bba9b342f7..3aa5193824da 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@chainsafe/lodestar", - "version": "1.10.0", + "version": "1.11.0", "description": "Command line interface for lodestar", "author": "ChainSafe Systems", "license": "LGPL-3.0", @@ -64,17 +64,17 @@ "@libp2p/crypto": "^2.0.2", "@libp2p/peer-id": "^3.0.1", "@libp2p/peer-id-factory": "^3.0.2", - "@lodestar/api": "^1.10.0", - "@lodestar/beacon-node": "^1.10.0", - "@lodestar/config": "^1.10.0", - "@lodestar/db": "^1.10.0", - "@lodestar/light-client": "^1.10.0", - "@lodestar/logger": "^1.10.0", - "@lodestar/params": "^1.10.0", - "@lodestar/state-transition": "^1.10.0", - "@lodestar/types": "^1.10.0", - "@lodestar/utils": "^1.10.0", - "@lodestar/validator": "^1.10.0", + "@lodestar/api": "^1.11.0", + "@lodestar/beacon-node": "^1.11.0", + "@lodestar/config": "^1.11.0", + "@lodestar/db": "^1.11.0", + "@lodestar/light-client": "^1.11.0", + "@lodestar/logger": "^1.11.0", + "@lodestar/params": "^1.11.0", + "@lodestar/state-transition": "^1.11.0", + "@lodestar/types": "^1.11.0", + "@lodestar/utils": "^1.11.0", + "@lodestar/validator": "^1.11.0", "@multiformats/multiaddr": "^12.1.3", "@types/lockfile": "^1.0.2", "bip39": "^3.1.0", @@ -95,7 +95,7 @@ "yargs": "^17.7.1" }, "devDependencies": { - "@lodestar/test-utils": "^1.10.0", + "@lodestar/test-utils": "^1.11.0", "@types/debug": "^4.1.7", "@types/expand-tilde": "^2.0.0", "@types/got": "^9.6.12", diff --git a/packages/config/package.json b/packages/config/package.json index 6c8ad07f47f5..e707887dcc29 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@lodestar/config", - "version": "1.10.0", + "version": "1.11.0", "description": "Chain configuration required for lodestar", "author": "ChainSafe Systems", "license": "Apache-2.0", @@ -65,7 +65,7 @@ ], "dependencies": { "@chainsafe/ssz": "^0.10.2", - "@lodestar/params": "^1.10.0", - "@lodestar/types": "^1.10.0" + "@lodestar/params": "^1.11.0", + "@lodestar/types": "^1.11.0" } } diff --git a/packages/db/package.json b/packages/db/package.json index 8018399280ef..a0c382dc76dd 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,6 +1,6 @@ { "name": "@lodestar/db", - "version": "1.10.0", + "version": "1.11.0", "description": "DB modules of Lodestar", "author": "ChainSafe Systems", "homepage": "https://github.com/ChainSafe/lodestar#readme", @@ -38,13 +38,13 @@ }, "dependencies": { "@chainsafe/ssz": "^0.10.2", - "@lodestar/config": "^1.10.0", - "@lodestar/utils": "^1.10.0", + "@lodestar/config": "^1.11.0", + "@lodestar/utils": "^1.11.0", "@types/levelup": "^4.3.3", "it-all": "^3.0.2", "level": "^8.0.0" }, "devDependencies": { - "@lodestar/logger": "^1.10.0" + "@lodestar/logger": "^1.11.0" } } diff --git a/packages/flare/package.json b/packages/flare/package.json index 96ae5c9f2506..0a008f2ad7e8 100644 --- a/packages/flare/package.json +++ b/packages/flare/package.json @@ -1,6 +1,6 @@ { "name": "@lodestar/flare", - "version": "1.10.0", + "version": "1.11.0", "description": "Beacon chain debugging tool", "author": "ChainSafe Systems", "license": "Apache-2.0", @@ -60,12 +60,12 @@ "dependencies": { "@chainsafe/bls": "7.1.1", "@chainsafe/bls-keygen": "^0.3.0", - "@lodestar/api": "^1.10.0", - "@lodestar/config": "^1.10.0", - "@lodestar/params": "^1.10.0", - "@lodestar/state-transition": "^1.10.0", - "@lodestar/types": "^1.10.0", - "@lodestar/utils": "^1.10.0", + "@lodestar/api": "^1.11.0", + "@lodestar/config": "^1.11.0", + "@lodestar/params": "^1.11.0", + "@lodestar/state-transition": "^1.11.0", + "@lodestar/types": "^1.11.0", + "@lodestar/utils": "^1.11.0", "source-map-support": "^0.5.21", "yargs": "^17.7.1" }, diff --git a/packages/fork-choice/package.json b/packages/fork-choice/package.json index 060ef5138515..727e7b81ed4b 100644 --- a/packages/fork-choice/package.json +++ b/packages/fork-choice/package.json @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/ChainSafe/lodestar/issues" }, - "version": "1.10.0", + "version": "1.11.0", "type": "module", "exports": "./lib/index.js", "types": "./lib/index.d.ts", @@ -39,11 +39,11 @@ }, "dependencies": { "@chainsafe/ssz": "^0.10.2", - "@lodestar/config": "^1.10.0", - "@lodestar/params": "^1.10.0", - "@lodestar/state-transition": "^1.10.0", - "@lodestar/types": "^1.10.0", - "@lodestar/utils": "^1.10.0" + "@lodestar/config": "^1.11.0", + "@lodestar/params": "^1.11.0", + "@lodestar/state-transition": "^1.11.0", + "@lodestar/types": "^1.11.0", + "@lodestar/utils": "^1.11.0" }, "keywords": [ "ethereum", diff --git a/packages/light-client/package.json b/packages/light-client/package.json index 8f8b2bb8f3aa..042af27e5902 100644 --- a/packages/light-client/package.json +++ b/packages/light-client/package.json @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/ChainSafe/lodestar/issues" }, - "version": "1.10.0", + "version": "1.11.0", "type": "module", "exports": { ".": { @@ -67,12 +67,12 @@ "@chainsafe/bls": "7.1.1", "@chainsafe/persistent-merkle-tree": "^0.5.0", "@chainsafe/ssz": "^0.10.2", - "@lodestar/api": "^1.10.0", - "@lodestar/config": "^1.10.0", - "@lodestar/params": "^1.10.0", - "@lodestar/state-transition": "^1.10.0", - "@lodestar/types": "^1.10.0", - "@lodestar/utils": "^1.10.0", + "@lodestar/api": "^1.11.0", + "@lodestar/config": "^1.11.0", + "@lodestar/params": "^1.11.0", + "@lodestar/state-transition": "^1.11.0", + "@lodestar/types": "^1.11.0", + "@lodestar/utils": "^1.11.0", "mitt": "^3.0.0", "strict-event-emitter-types": "^2.0.0" }, diff --git a/packages/logger/package.json b/packages/logger/package.json index c43cdf18b51c..cd6231cb6e72 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/ChainSafe/lodestar/issues" }, - "version": "1.10.0", + "version": "1.11.0", "type": "module", "exports": { ".": { @@ -63,16 +63,16 @@ }, "types": "lib/index.d.ts", "dependencies": { - "@lodestar/utils": "^1.10.0", + "@lodestar/utils": "^1.11.0", "winston": "^3.8.2", "winston-daily-rotate-file": "^4.7.1", "winston-transport": "^4.5.0" }, "devDependencies": { + "@lodestar/test-utils": "^1.11.0", "@types/triple-beam": "^1.3.2", "rimraf": "^4.4.1", - "triple-beam": "^1.3.0", - "@lodestar/test-utils": "^1.10.0" + "triple-beam": "^1.3.0" }, "keywords": [ "ethereum", diff --git a/packages/params/package.json b/packages/params/package.json index 7f50080d154a..52e7974f8294 100644 --- a/packages/params/package.json +++ b/packages/params/package.json @@ -1,6 +1,6 @@ { "name": "@lodestar/params", - "version": "1.10.0", + "version": "1.11.0", "description": "Chain parameters required for lodestar", "author": "ChainSafe Systems", "license": "Apache-2.0", diff --git a/packages/prover/package.json b/packages/prover/package.json index 52d68ca94707..5c283a38c760 100644 --- a/packages/prover/package.json +++ b/packages/prover/package.json @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/ChainSafe/lodestar/issues" }, - "version": "1.10.0", + "version": "1.11.0", "type": "module", "exports": { ".": { @@ -69,13 +69,13 @@ "@ethereumjs/tx": "^4.1.2", "@ethereumjs/util": "^8.0.6", "@ethereumjs/vm": "^6.4.2", - "@lodestar/api": "^1.10.0", - "@lodestar/config": "^1.10.0", - "@lodestar/light-client": "^1.10.0", - "@lodestar/logger": "^1.10.0", - "@lodestar/params": "^1.10.0", - "@lodestar/types": "^1.10.0", - "@lodestar/utils": "^1.10.0", + "@lodestar/api": "^1.11.0", + "@lodestar/config": "^1.11.0", + "@lodestar/light-client": "^1.11.0", + "@lodestar/logger": "^1.11.0", + "@lodestar/params": "^1.11.0", + "@lodestar/types": "^1.11.0", + "@lodestar/utils": "^1.11.0", "ethereum-cryptography": "^1.2.0", "find-up": "^6.3.0", "http-proxy": "^1.18.1", @@ -84,7 +84,7 @@ "yargs": "^17.7.1" }, "devDependencies": { - "@lodestar/test-utils": "^1.10.0", + "@lodestar/test-utils": "^1.11.0", "@types/http-proxy": "^1.17.10", "@types/yargs": "^17.0.24", "axios": "^1.3.4", diff --git a/packages/reqresp/package.json b/packages/reqresp/package.json index 4f6c9f17c2da..1031cccc2d74 100644 --- a/packages/reqresp/package.json +++ b/packages/reqresp/package.json @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/ChainSafe/lodestar/issues" }, - "version": "1.10.0", + "version": "1.11.0", "type": "module", "exports": { ".": { @@ -56,9 +56,9 @@ "dependencies": { "@chainsafe/fast-crc32c": "^4.1.1", "@libp2p/interface": "^0.1.1", - "@lodestar/config": "^1.10.0", - "@lodestar/params": "^1.10.0", - "@lodestar/utils": "^1.10.0", + "@lodestar/config": "^1.11.0", + "@lodestar/params": "^1.11.0", + "@lodestar/utils": "^1.11.0", "it-all": "^3.0.2", "it-pipe": "^3.0.1", "snappy": "^7.2.2", @@ -67,8 +67,8 @@ "uint8arraylist": "^2.4.3" }, "devDependencies": { - "@lodestar/logger": "^1.10.0", - "@lodestar/types": "^1.10.0", + "@lodestar/logger": "^1.11.0", + "@lodestar/types": "^1.11.0", "libp2p": "0.46.3" }, "peerDependencies": { diff --git a/packages/spec-test-util/package.json b/packages/spec-test-util/package.json index 2c78c2d33ea1..9fbf1129bc0b 100644 --- a/packages/spec-test-util/package.json +++ b/packages/spec-test-util/package.json @@ -1,6 +1,6 @@ { "name": "@lodestar/spec-test-util", - "version": "1.10.0", + "version": "1.11.0", "description": "Spec test suite generator from yaml test files", "author": "ChainSafe Systems", "license": "Apache-2.0", @@ -45,7 +45,7 @@ "blockchain" ], "dependencies": { - "@lodestar/utils": "^1.10.0", + "@lodestar/utils": "^1.11.0", "async-retry": "^1.3.3", "axios": "^1.3.4", "chai": "^4.3.7", diff --git a/packages/state-transition/package.json b/packages/state-transition/package.json index 1e263f42dd8a..a7549b83269f 100644 --- a/packages/state-transition/package.json +++ b/packages/state-transition/package.json @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/ChainSafe/lodestar/issues" }, - "version": "1.10.0", + "version": "1.11.0", "type": "module", "exports": { ".": { @@ -62,10 +62,10 @@ "@chainsafe/persistent-merkle-tree": "^0.5.0", "@chainsafe/persistent-ts": "^0.19.1", "@chainsafe/ssz": "^0.10.2", - "@lodestar/config": "^1.10.0", - "@lodestar/params": "^1.10.0", - "@lodestar/types": "^1.10.0", - "@lodestar/utils": "^1.10.0", + "@lodestar/config": "^1.11.0", + "@lodestar/params": "^1.11.0", + "@lodestar/types": "^1.11.0", + "@lodestar/utils": "^1.11.0", "bigint-buffer": "^1.1.5", "buffer-xor": "^2.0.2" }, diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 975a82a38d8d..2fd5c78bd279 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@lodestar/test-utils", "private": true, - "version": "1.10.0", + "version": "1.11.0", "description": "Test utilities reused across other packages", "author": "ChainSafe Systems", "license": "Apache-2.0", @@ -61,7 +61,7 @@ "blockchain" ], "dependencies": { - "@lodestar/utils": "^1.10.0", + "@lodestar/utils": "^1.11.0", "axios": "^1.3.4", "chai": "^4.3.7", "mocha": "^10.2.0", diff --git a/packages/types/package.json b/packages/types/package.json index 522b1a56ab27..41e55ca4b776 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/ChainSafe/lodestar/issues" }, - "version": "1.10.0", + "version": "1.11.0", "type": "module", "exports": { ".": { @@ -68,7 +68,7 @@ "types": "lib/index.d.ts", "dependencies": { "@chainsafe/ssz": "^0.10.2", - "@lodestar/params": "^1.10.0" + "@lodestar/params": "^1.11.0" }, "keywords": [ "ethereum", diff --git a/packages/utils/package.json b/packages/utils/package.json index edb28f92508b..d7de75d84177 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/ChainSafe/lodestar/issues" }, - "version": "1.10.0", + "version": "1.11.0", "type": "module", "exports": "./lib/index.js", "files": [ diff --git a/packages/validator/package.json b/packages/validator/package.json index 25fefd5626b7..b4345b767109 100644 --- a/packages/validator/package.json +++ b/packages/validator/package.json @@ -1,6 +1,6 @@ { "name": "@lodestar/validator", - "version": "1.10.0", + "version": "1.11.0", "description": "A Typescript implementation of the validator client", "author": "ChainSafe Systems", "license": "LGPL-3.0", @@ -50,13 +50,13 @@ "dependencies": { "@chainsafe/bls": "7.1.1", "@chainsafe/ssz": "^0.10.2", - "@lodestar/api": "^1.10.0", - "@lodestar/config": "^1.10.0", - "@lodestar/db": "^1.10.0", - "@lodestar/params": "^1.10.0", - "@lodestar/state-transition": "^1.10.0", - "@lodestar/types": "^1.10.0", - "@lodestar/utils": "^1.10.0", + "@lodestar/api": "^1.11.0", + "@lodestar/config": "^1.11.0", + "@lodestar/db": "^1.11.0", + "@lodestar/params": "^1.11.0", + "@lodestar/state-transition": "^1.11.0", + "@lodestar/types": "^1.11.0", + "@lodestar/utils": "^1.11.0", "bigint-buffer": "^1.1.5", "strict-event-emitter-types": "^2.0.0" }, From a27992de2304c5ddb317226f7badbfe973699bef Mon Sep 17 00:00:00 2001 From: tuyennhv Date: Tue, 29 Aug 2023 23:11:30 +0700 Subject: [PATCH 7/9] fix: mesh peers - inclusion and churn sum by reason metrics (#5918) * fix: mesh peers - inclusion and churn sum by reason metrics * fix: remove unintentional change --- dashboards/lodestar_debug_gossipsub.json | 121 +++++++++++++++++++++-- 1 file changed, 111 insertions(+), 10 deletions(-) diff --git a/dashboards/lodestar_debug_gossipsub.json b/dashboards/lodestar_debug_gossipsub.json index 1442b2baa7ac..eaed0c9842f6 100644 --- a/dashboards/lodestar_debug_gossipsub.json +++ b/dashboards/lodestar_debug_gossipsub.json @@ -1717,10 +1717,12 @@ "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "editorMode": "code", "exemplar": false, "expr": "sum(\n rate(gossipsub_mesh_peer_inclusion_events_total[$rate_interval])\n) by (topic)", "interval": "", "legendFormat": "+ {{topic}}", + "range": true, "refId": "A" }, { @@ -1728,11 +1730,13 @@ "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "editorMode": "code", "exemplar": false, "expr": "- sum(\n rate(gossipsub_peer_churn_events_total [$rate_interval])\n) by (topic)", "hide": false, "interval": "", "legendFormat": "- {{topic}}", + "range": true, "refId": "B" } ], @@ -1809,23 +1813,120 @@ "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, - "exemplar": false, - "expr": "sum(\n rate(gossipsub_mesh_peer_inclusion_events_total[$rate_interval])\n) by (reason)", + "editorMode": "code", + "expr": "sum(rate(gossipsub_mesh_peer_inclusion_events_fanout_total[$rate_interval]))", "hide": false, - "interval": "", - "legendFormat": "+ {{reason}}", - "refId": "B" + "legendFormat": "+ fanout", + "range": true, + "refId": "C" }, { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, - "exemplar": false, - "expr": "- sum(\n rate(gossipsub_peer_churn_events_total [$rate_interval])\n) by (reason)", - "interval": "", - "legendFormat": "- {{reason}}", - "refId": "A" + "editorMode": "code", + "expr": "sum(rate(gossipsub_mesh_peer_inclusion_events_random_total[$rate_interval]))", + "hide": false, + "legendFormat": "+ random", + "range": true, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(rate(gossipsub_mesh_peer_inclusion_events_subscribed_total[$rate_interval]))", + "hide": false, + "legendFormat": "+ subscribed", + "range": true, + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(rate(gossipsub_mesh_peer_inclusion_events_outbound_total[$rate_interval]))", + "hide": false, + "legendFormat": "+ outbound", + "range": true, + "refId": "F" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(rate(gossipsub_mesh_peer_inclusion_events_not_enough_total[$rate_interval]))", + "hide": false, + "legendFormat": "+ not_enough", + "range": true, + "refId": "G" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(rate(gossipsub_mesh_peer_inclusion_events_opportunistic_total[$rate_interval]))", + "hide": false, + "legendFormat": "+ opportunistic", + "range": true, + "refId": "H" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "- sum(rate(gossipsub_peer_churn_events_disconnected_total[$rate_interval]))", + "hide": false, + "legendFormat": "- disconnected", + "range": true, + "refId": "I" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "- sum(rate(gossipsub_peer_churn_events_bad_score_total[$rate_interval]))", + "hide": false, + "legendFormat": "- bad_score", + "range": true, + "refId": "J" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "- sum(rate(gossipsub_peer_churn_events_prune_total[$rate_interval]))", + "hide": false, + "legendFormat": "- prune", + "range": true, + "refId": "K" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "- sum(rate(gossipsub_peer_churn_events_excess_total[$rate_interval]))", + "hide": false, + "legendFormat": "- excess", + "range": true, + "refId": "L" } ], "title": "Mesh inclusion (+) / churn (-) events - sum by reason", From b34bbe355a9bd673044b63b9054b5436c9d4bade Mon Sep 17 00:00:00 2001 From: tuyennhv Date: Tue, 29 Aug 2023 23:12:16 +0700 Subject: [PATCH 8/9] chore: track time to stable mesh metric in Grafana (#5916) * chore: track time to stable mesh metric in Grafana * fix: add rate() --- dashboards/lodestar_networking.json | 207 +++++++++++++++++++--------- 1 file changed, 143 insertions(+), 64 deletions(-) diff --git a/dashboards/lodestar_networking.json b/dashboards/lodestar_networking.json index cd1da4c06c71..bac5e4495cdc 100644 --- a/dashboards/lodestar_networking.json +++ b/dashboards/lodestar_networking.json @@ -768,13 +768,92 @@ "title": "Topic peers count", "type": "timeseries" }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "id": 623, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Magma", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "show": true, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "9.3.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(lodestar_attnets_service_committee_subscriptions_time_to_stable_mesh_seconds_bucket[$rate_interval]) * 1000", + "format": "heatmap", + "legendFormat": "{{le}}", + "range": true, + "refId": "A" + } + ], + "title": "Committee Subscriptions - Seconds to stable mesh", + "type": "heatmap" + }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 30 + "y": 38 }, "id": 608, "panels": [], @@ -833,7 +912,7 @@ "h": 6, "w": 12, "x": 0, - "y": 31 + "y": 39 }, "id": 148, "options": { @@ -947,7 +1026,7 @@ "h": 6, "w": 12, "x": 12, - "y": 31 + "y": 39 }, "id": 609, "options": { @@ -1018,7 +1097,7 @@ "h": 1, "w": 24, "x": 0, - "y": 37 + "y": 45 }, "id": 28, "panels": [], @@ -1085,7 +1164,7 @@ "h": 8, "w": 12, "x": 0, - "y": 38 + "y": 46 }, "id": 30, "options": { @@ -1170,7 +1249,7 @@ "h": 8, "w": 12, "x": 12, - "y": 38 + "y": 46 }, "id": 507, "options": { @@ -1258,7 +1337,7 @@ "h": 8, "w": 12, "x": 0, - "y": 46 + "y": 54 }, "id": 32, "options": { @@ -1325,7 +1404,7 @@ "h": 8, "w": 12, "x": 12, - "y": 46 + "y": 54 }, "heatmap": {}, "hideZeroBuckets": false, @@ -1455,7 +1534,7 @@ "h": 8, "w": 12, "x": 0, - "y": 54 + "y": 62 }, "id": 506, "options": { @@ -1523,7 +1602,7 @@ "h": 8, "w": 12, "x": 12, - "y": 54 + "y": 62 }, "heatmap": {}, "hideZeroBuckets": false, @@ -1635,7 +1714,7 @@ "h": 8, "w": 12, "x": 0, - "y": 62 + "y": 70 }, "heatmap": {}, "hideZeroBuckets": false, @@ -1780,7 +1859,7 @@ "h": 8, "w": 12, "x": 12, - "y": 62 + "y": 70 }, "id": 34, "options": { @@ -1878,7 +1957,7 @@ "h": 7, "w": 12, "x": 0, - "y": 70 + "y": 78 }, "id": 508, "options": { @@ -1961,7 +2040,7 @@ "h": 7, "w": 12, "x": 12, - "y": 70 + "y": 78 }, "id": 38, "options": { @@ -2005,7 +2084,7 @@ "h": 1, "w": 24, "x": 0, - "y": 77 + "y": 85 }, "id": 512, "panels": [], @@ -2042,7 +2121,7 @@ "h": 7, "w": 12, "x": 0, - "y": 78 + "y": 86 }, "hiddenSeries": false, "id": 294, @@ -2152,7 +2231,7 @@ "h": 7, "w": 6, "x": 12, - "y": 78 + "y": 86 }, "hiddenSeries": false, "id": 296, @@ -2248,7 +2327,7 @@ "h": 7, "w": 6, "x": 18, - "y": 78 + "y": 86 }, "hiddenSeries": false, "id": 297, @@ -2371,7 +2450,7 @@ "h": 8, "w": 12, "x": 0, - "y": 85 + "y": 93 }, "id": 611, "options": { @@ -2475,7 +2554,7 @@ "h": 8, "w": 12, "x": 12, - "y": 85 + "y": 93 }, "id": 613, "options": { @@ -2516,7 +2595,7 @@ "h": 1, "w": 24, "x": 0, - "y": 93 + "y": 101 }, "id": 75, "panels": [], @@ -2582,7 +2661,7 @@ "h": 8, "w": 12, "x": 0, - "y": 94 + "y": 102 }, "id": 77, "options": { @@ -2665,7 +2744,7 @@ "h": 8, "w": 12, "x": 12, - "y": 94 + "y": 102 }, "id": 80, "options": { @@ -2748,7 +2827,7 @@ "h": 9, "w": 12, "x": 0, - "y": 102 + "y": 110 }, "id": 79, "options": { @@ -2832,7 +2911,7 @@ "h": 8, "w": 12, "x": 12, - "y": 102 + "y": 110 }, "id": 78, "options": { @@ -2914,7 +2993,7 @@ "h": 10, "w": 12, "x": 12, - "y": 110 + "y": 118 }, "id": 88, "options": { @@ -2997,7 +3076,7 @@ "h": 10, "w": 12, "x": 0, - "y": 111 + "y": 119 }, "id": 82, "options": { @@ -3081,7 +3160,7 @@ "h": 8, "w": 12, "x": 12, - "y": 120 + "y": 128 }, "id": 333, "options": { @@ -3177,7 +3256,7 @@ "h": 8, "w": 12, "x": 0, - "y": 121 + "y": 129 }, "id": 244, "options": { @@ -3238,7 +3317,7 @@ "h": 1, "w": 24, "x": 0, - "y": 129 + "y": 137 }, "id": 524, "panels": [], @@ -3318,7 +3397,7 @@ "h": 8, "w": 12, "x": 0, - "y": 130 + "y": 138 }, "id": 514, "options": { @@ -3422,7 +3501,7 @@ "h": 5, "w": 12, "x": 12, - "y": 130 + "y": 138 }, "id": 520, "options": { @@ -3503,7 +3582,7 @@ "h": 5, "w": 12, "x": 12, - "y": 135 + "y": 143 }, "id": 522, "options": { @@ -3559,7 +3638,7 @@ "h": 8, "w": 12, "x": 0, - "y": 138 + "y": 146 }, "id": 518, "options": { @@ -3664,7 +3743,7 @@ "h": 6, "w": 12, "x": 12, - "y": 140 + "y": 148 }, "id": 521, "options": { @@ -3745,7 +3824,7 @@ "h": 8, "w": 12, "x": 0, - "y": 146 + "y": 154 }, "id": 540, "options": { @@ -3824,7 +3903,7 @@ "h": 8, "w": 12, "x": 12, - "y": 146 + "y": 154 }, "id": 542, "options": { @@ -3861,7 +3940,7 @@ "h": 1, "w": 24, "x": 0, - "y": 154 + "y": 162 }, "id": 528, "panels": [], @@ -3916,7 +3995,7 @@ "h": 8, "w": 12, "x": 0, - "y": 155 + "y": 163 }, "id": 526, "options": { @@ -4013,7 +4092,7 @@ "h": 8, "w": 12, "x": 12, - "y": 155 + "y": 163 }, "id": 530, "options": { @@ -4117,7 +4196,7 @@ "h": 8, "w": 12, "x": 0, - "y": 163 + "y": 171 }, "id": 534, "options": { @@ -4208,7 +4287,7 @@ "h": 8, "w": 12, "x": 12, - "y": 163 + "y": 171 }, "id": 532, "options": { @@ -4304,7 +4383,7 @@ "h": 8, "w": 12, "x": 0, - "y": 171 + "y": 179 }, "id": 536, "options": { @@ -4412,7 +4491,7 @@ "h": 8, "w": 12, "x": 12, - "y": 171 + "y": 179 }, "id": 538, "options": { @@ -4503,7 +4582,7 @@ "h": 8, "w": 12, "x": 0, - "y": 179 + "y": 187 }, "id": 615, "options": { @@ -4612,7 +4691,7 @@ "h": 8, "w": 12, "x": 12, - "y": 179 + "y": 187 }, "id": 617, "options": { @@ -4716,7 +4795,7 @@ "h": 8, "w": 12, "x": 0, - "y": 187 + "y": 195 }, "id": 619, "options": { @@ -4771,7 +4850,7 @@ "h": 8, "w": 12, "x": 12, - "y": 187 + "y": 195 }, "id": 621, "options": { @@ -4833,7 +4912,7 @@ "h": 1, "w": 24, "x": 0, - "y": 195 + "y": 203 }, "id": 600, "panels": [], @@ -4889,7 +4968,7 @@ "h": 8, "w": 12, "x": 0, - "y": 196 + "y": 204 }, "id": 602, "options": { @@ -5017,7 +5096,7 @@ "h": 8, "w": 12, "x": 12, - "y": 196 + "y": 204 }, "id": 604, "options": { @@ -5169,7 +5248,7 @@ "h": 8, "w": 12, "x": 0, - "y": 204 + "y": 212 }, "id": 603, "options": { @@ -5248,7 +5327,7 @@ "h": 8, "w": 12, "x": 12, - "y": 204 + "y": 212 }, "id": 601, "options": { @@ -5289,7 +5368,7 @@ "h": 1, "w": 24, "x": 0, - "y": 212 + "y": 220 }, "id": 188, "panels": [], @@ -5354,7 +5433,7 @@ "h": 8, "w": 12, "x": 0, - "y": 213 + "y": 221 }, "id": 180, "options": { @@ -5435,7 +5514,7 @@ "h": 8, "w": 12, "x": 12, - "y": 213 + "y": 221 }, "id": 176, "options": { @@ -5516,7 +5595,7 @@ "h": 8, "w": 12, "x": 0, - "y": 221 + "y": 229 }, "id": 182, "options": { @@ -5597,7 +5676,7 @@ "h": 8, "w": 12, "x": 12, - "y": 221 + "y": 229 }, "id": 178, "options": { @@ -5678,7 +5757,7 @@ "h": 8, "w": 12, "x": 0, - "y": 229 + "y": 237 }, "id": 605, "options": { @@ -5761,7 +5840,7 @@ "h": 8, "w": 12, "x": 12, - "y": 229 + "y": 237 }, "id": 606, "options": { @@ -5844,7 +5923,7 @@ "h": 8, "w": 12, "x": 0, - "y": 237 + "y": 245 }, "id": 498, "options": { @@ -5925,7 +6004,7 @@ "h": 8, "w": 12, "x": 12, - "y": 237 + "y": 245 }, "id": 500, "options": { @@ -6006,7 +6085,7 @@ "h": 8, "w": 12, "x": 0, - "y": 245 + "y": 253 }, "id": 184, "options": { @@ -6087,7 +6166,7 @@ "h": 8, "w": 12, "x": 12, - "y": 245 + "y": 253 }, "id": 501, "options": { From 3b5941a684a8ff9fdb6b76256aa5234a984e387b Mon Sep 17 00:00:00 2001 From: tuyennhv Date: Wed, 30 Aug 2023 11:05:03 +0700 Subject: [PATCH 9/9] chore: add rate() to batch histogram panel (#5921) --- dashboards/lodestar_networking.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboards/lodestar_networking.json b/dashboards/lodestar_networking.json index bac5e4495cdc..7a18f218db7b 100644 --- a/dashboards/lodestar_networking.json +++ b/dashboards/lodestar_networking.json @@ -4895,7 +4895,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "lodestar_gossip_attestation_verified_in_batch_histogram_bucket", + "expr": "rate(lodestar_gossip_attestation_verified_in_batch_histogram_bucket[$rate_interval])", "format": "heatmap", "instant": false, "legendFormat": "{{le}}",