@lodestar/beacon-node
Version:
A Typescript implementation of the beacon chain
267 lines • 12.5 kB
JavaScript
export function createNetworkCoreMetrics(register) {
return {
register,
// Peers
peers: register.gauge({
name: "libp2p_peers",
help: "number of connected peers",
}),
peersByDirection: register.gauge({
name: "lodestar_peers_by_direction_count",
help: "number of peers, labeled by direction",
labelNames: ["direction"],
}),
peersByClient: register.gauge({
name: "lodestar_peers_by_client_count",
help: "number of peers, labeled by client",
labelNames: ["client"],
}),
peerLongLivedAttnets: register.histogram({
name: "lodestar_peer_long_lived_attnets_count",
help: "Histogram of current count of long lived attnets of connected peers",
buckets: [0, 4, 16, 32, 64],
}),
peerScoreByClient: register.histogram({
name: "lodestar_app_peer_score",
help: "Current peer score at lodestar app side",
// Min score = -100, max score = 100, disconnect = -20, ban = -50
buckets: [-100, -50, -20, 0, 25],
labelNames: ["client"],
}),
peerGossipScoreByClient: register.histogram({
name: "lodestar_gossip_score_by_client",
help: "Gossip peer score by client",
labelNames: ["client"],
// based on gossipScoreThresholds and negativeGossipScoreIgnoreThreshold
buckets: [-16000, -8000, -4000, -1000, 0, 5, 100],
}),
peerConnectionLength: register.histogram({
name: "lodestar_peer_connection_seconds",
help: "Current peer connection length in second",
// Have good resolution on shorter times. After 1 day, don't count any longer
// 5s 20s 1m 3m 10m 30m 1h 6h 24h
buckets: [5, 20, 60, 180, 600, 1200, 3600, 21600, 86400],
}),
peersSync: register.gauge({
name: "lodestar_peers_sync_count",
help: "Current count of peers useful for sync",
}),
peerConnectedEvent: register.gauge({
name: "lodestar_peer_connected_total",
help: "Total number of peer:connected event, labeled by direction",
labelNames: ["direction", "status"],
}),
peerDisconnectedEvent: register.gauge({
name: "lodestar_peer_disconnected_total",
help: "Total number of peer:disconnected event, labeled by direction",
labelNames: ["direction"],
}),
peerGoodbyeReceived: register.gauge({
name: "lodestar_peer_goodbye_received_total",
help: "Total number of goodbye received, labeled by reason",
labelNames: ["reason"],
}),
peerLongConnectionDisconnect: register.gauge({
name: "lodestar_peer_long_connection_disconnect_total",
help: "For peers with long connection, track disconnect reason",
labelNames: ["reason"],
}),
peerGoodbyeSent: register.gauge({
name: "lodestar_peer_goodbye_sent_total",
help: "Total number of goodbye sent, labeled by reason",
labelNames: ["reason"],
}),
peersRequestedToConnect: register.gauge({
name: "lodestar_peers_requested_total_to_connect",
help: "Prioritization results total peers count requested to connect",
}),
peersRequestedToDisconnect: register.gauge({
name: "lodestar_peers_requested_total_to_disconnect",
help: "Prioritization results total peers count requested to disconnect",
labelNames: ["reason"],
}),
peersRequestedSubnetsToQuery: register.gauge({
name: "lodestar_peers_requested_total_subnets_to_query",
help: "Prioritization results total subnets to query and discover peers in",
labelNames: ["type"],
}),
peersRequestedSubnetsPeerCount: register.gauge({
name: "lodestar_peers_requested_total_subnets_peers_count",
help: "Prioritization results total peers in subnets to query and discover peers in",
labelNames: ["type"],
}),
peersReportPeerCount: register.gauge({
name: "lodestar_peers_report_peer_count",
help: "network.reportPeer count by reason",
labelNames: ["reason"],
}),
peerManager: {
heartbeatDuration: register.histogram({
name: "lodestar_peer_manager_heartbeat_duration_seconds",
help: "Peer manager heartbeat function duration in seconds",
buckets: [0.001, 0.01, 0.1, 1],
}),
starved: register.gauge({
name: "lodestar_peer_manager_starved_bool",
help: "Whether lodestar is starved of data while syncing",
}),
},
leakedConnectionsCount: register.gauge({
name: "lodestar_peer_manager_leaked_connections_count",
help: "Total libp2p leaked connections detected by lodestar",
}),
discovery: {
peersToConnect: register.gauge({
name: "lodestar_discovery_peers_to_connect",
help: "Current peers to connect count from discoverPeers requests",
}),
subnetPeersToConnect: register.gauge({
name: "lodestar_discovery_subnet_peers_to_connect",
help: "Current peers to connect count from discoverPeers requests",
labelNames: ["type"],
}),
subnetsToConnect: register.gauge({
name: "lodestar_discovery_subnets_to_connect",
help: "Current subnets to connect count from discoverPeers requests",
labelNames: ["type"],
}),
cachedENRsSize: register.gauge({
name: "lodestar_discovery_cached_enrs_size",
help: "Current size of the cachedENRs Set",
}),
findNodeQueryRequests: register.gauge({
name: "lodestar_discovery_find_node_query_requests_total",
help: "Total count of find node queries started",
labelNames: ["action"],
}),
findNodeQueryTime: register.histogram({
name: "lodestar_discovery_find_node_query_time_seconds",
help: "Time to complete a find node query in seconds in seconds",
buckets: [5, 60],
}),
findNodeQueryEnrCount: register.gauge({
name: "lodestar_discovery_find_node_query_enrs_total",
help: "Total count of found ENRs in queries",
}),
discoveredStatus: register.gauge({
name: "lodestar_discovery_discovered_status_total_count",
help: "Total count of status results of PeerDiscovery.onDiscovered() function",
labelNames: ["status"],
}),
dialAttempts: register.gauge({
name: "lodestar_discovery_total_dial_attempts",
help: "Total dial attempts by peer discovery",
}),
notDialReason: register.gauge({
name: "lodestar_discovery_not_dial_reason_total_count",
help: "Total count of not dial reasons",
labelNames: ["reason"],
}),
dialTime: register.histogram({
name: "lodestar_discovery_dial_time_seconds",
help: "Time to dial peers in seconds",
labelNames: ["status"],
buckets: [0.1, 5, 60],
}),
dialError: register.gauge({
name: "lodestar_discovery_dial_error_total_count",
help: "Total count of dial errors",
labelNames: ["reason"],
}),
},
reqResp: {
rateLimitErrors: register.gauge({
name: "beacon_reqresp_rate_limiter_errors_total",
help: "Count rate limiter errors",
labelNames: ["method"],
}),
},
discv5: {
decodeEnrAttemptCount: register.counter({
name: "lodestar_discv5_decode_enr_attempt_count",
help: "Count of total attempts to decode enrs",
}),
decodeEnrErrorCount: register.counter({
name: "lodestar_discv5_decode_enr_error_count",
help: "Count of total errors attempting to decode enrs",
}),
},
attnetsService: {
committeeSubnets: register.gauge({
name: "lodestar_attnets_service_committee_subnets_total",
help: "Count of committee subnets",
}),
subscriptionsCommittee: register.gauge({
name: "lodestar_attnets_service_committee_subscriptions_total",
help: "Count of committee subscriptions",
}),
subscriptionsCommitteeMeshPeers: register.histogram({
name: "lodestar_attnets_service_committee_subscriptions_mesh_peers",
help: "Histogram of mesh peers per committee subscription",
labelNames: ["subnet"],
// Dlow = 6, D = 8, DHi = 12 plus 2 more buckets
buckets: [0, 4, 6, 8, 12],
}),
subscriptionsCommitteeTimeToStableMesh: register.histogram({
name: "lodestar_attnets_service_committee_subscriptions_time_to_stable_mesh_seconds",
help: "Histogram of time until committee subscription is considered healthy (>= 6 mesh peers)",
labelNames: ["subnet"],
// we subscribe 2 slots = 24s before aggregator duty
buckets: [0, 6, 12, 18, 24],
}),
subscriptionsRandom: register.gauge({
name: "lodestar_attnets_service_random_subscriptions_total",
help: "Count of random subscriptions",
}),
longLivedSubscriptions: register.gauge({
name: "lodestar_attnets_service_long_lived_subscriptions_total",
help: "Count of long lived subscriptions",
}),
subscribeSubnets: register.gauge({
name: "lodestar_attnets_service_subscribe_subnets_total",
help: "Count of subscribe_subnets calls",
labelNames: ["subnet", "src"],
}),
unsubscribeSubnets: register.gauge({
name: "lodestar_attnets_service_unsubscribe_subnets_total",
help: "Count of unsubscribe_subnets calls",
labelNames: ["subnet", "src"],
}),
aggregatorSlotSubnetCount: register.gauge({
name: "lodestar_attnets_service_aggregator_slot_subnet_total",
help: "Count of aggregator per slot and subnet",
}),
},
syncnetsService: {
subscriptionsCommittee: register.gauge({
name: "lodestar_syncnets_service_committee_subscriptions_total",
help: "Count of syncnet committee subscriptions",
}),
subscribeSubnets: register.gauge({
name: "lodestar_syncnets_service_subscribe_subnets_total",
help: "Count of syncnet subscribe_subnets calls",
labelNames: ["subnet"],
}),
unsubscribeSubnets: register.gauge({
name: "lodestar_syncnets_service_unsubscribe_subnets_total",
help: "Count of syncnet unsubscribe_subnets calls",
labelNames: ["subnet"],
}),
},
};
}
export function getNetworkCoreWorkerMetrics(register) {
return {
reqRespBridgeRespCallerPending: register.gauge({
name: "lodestar_network_worker_reqresp_bridge_caller_pending_count",
help: "Current count of pending elements in respBridgeCaller",
}),
networkWorkerWireEventsOnWorkerThreadLatency: register.histogram({
name: "lodestar_network_worker_wire_events_on_worker_thread_latency_seconds",
help: "Latency in seconds to transmit network events to worker thread across parent port",
labelNames: ["eventName"],
buckets: [0.001, 0.003, 0.01, 0.03, 0.1],
}),
};
}
//# sourceMappingURL=metrics.js.map