From 3dbc08a8ec11c38549161fa95c5ee2c74f874970 Mon Sep 17 00:00:00 2001 From: tbssajal Date: Tue, 27 Dec 2022 21:20:40 +0600 Subject: [PATCH] added prometheus for tracking --- src/Lachain.Core/Network/BannedPeerTracker.cs | 19 +++++++++++++++++++ src/Lachain.Networking/Hub/ClientWorker.cs | 7 +++++++ .../PeerFault/PeerBanManager.cs | 16 ++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/src/Lachain.Core/Network/BannedPeerTracker.cs b/src/Lachain.Core/Network/BannedPeerTracker.cs index 861bff43c..615223391 100644 --- a/src/Lachain.Core/Network/BannedPeerTracker.cs +++ b/src/Lachain.Core/Network/BannedPeerTracker.cs @@ -23,6 +23,7 @@ using Lachain.Storage.Repositories; using Lachain.Utility; using Lachain.Utility.Utils; +using Prometheus; namespace Lachain.Core.Network { @@ -31,6 +32,19 @@ public class BannedPeerTracker : IBannedPeerTracker // Scans for banned peer in system contract tx // If a peer is banned locally, then sends a system contract tx to broadcast private static readonly ILogger Logger = LoggerFactory.GetLoggerForClass(); + private static readonly Counter BanVotesCounter = Metrics.CreateCounter( + "lachain_peer_ban_vote_count", + "Number of times a peer was voted by validators to be banned", + "peer" + ); + private static readonly Gauge BannedByVotesCycle = Metrics.CreateGauge( + "lachain_peer_banned_by_vote_cycle", + "Latest cycle where a peer was banned for having enough votes from validators", + new GaugeConfiguration + { + LabelNames = new[] {"peer", "votes"} + } + ); private readonly IPeerBanManager _banManager; private readonly ITransactionBuilder _transactionBuilder; private readonly ITransactionSigner _transactionSigner; @@ -201,9 +215,14 @@ private void ProcessBanRequest(InvocationContext context) } var votes = _repostiroy.AddVoteForBannedPeer(cycle, peerToBan, sender); _banPeerVotes[peerToBan.ToPublicKey()] = votes; + BanVotesCounter.WithLabels(peerToBan.ToHex()).Inc(); if (votes > ThresholdForBan) { // ban peer as more ThresholdForBan validators voted for this peer + Logger.LogTrace( + $"Peer {peerToBan.ToHex()} is banned on request of {votes} validators (Threshold {ThresholdForBan}) in cycle {cycle}" + ); + BannedByVotesCycle.WithLabels(peerToBan.ToHex(), votes.ToString()).Set(cycle); _banManager.BanPeer(peerToBan); } } diff --git a/src/Lachain.Networking/Hub/ClientWorker.cs b/src/Lachain.Networking/Hub/ClientWorker.cs index ee55f0f5d..692196bc0 100644 --- a/src/Lachain.Networking/Hub/ClientWorker.cs +++ b/src/Lachain.Networking/Hub/ClientWorker.cs @@ -29,6 +29,12 @@ public class ClientWorker : IDisposable "peer", "message_type" ); + private static readonly Counter PenaltyCounter = Metrics.CreateCounter( + "lachain_peer_penalty_count", + "Number of penalties done by peer", + "peer" + ); + public byte[] PeerPublicKey { get; } private readonly IMessageFactory _messageFactory; private readonly HubConnector _hubConnector; @@ -195,6 +201,7 @@ public int AdvanceEra(ulong era) public void IncPenalty() { + PenaltyCounter.WithLabels(PeerPublicKey.ToHex()).Inc(); _penaltyHandler.IncPenalty(); } } diff --git a/src/Lachain.Networking/PeerFault/PeerBanManager.cs b/src/Lachain.Networking/PeerFault/PeerBanManager.cs index 2e029e9a6..38fdc6500 100644 --- a/src/Lachain.Networking/PeerFault/PeerBanManager.cs +++ b/src/Lachain.Networking/PeerFault/PeerBanManager.cs @@ -9,12 +9,26 @@ using Lachain.Proto; using Lachain.Storage.Repositories; using Lachain.Utility.Utils; +using Prometheus; namespace Lachain.Networking.PeerFault { public class PeerBanManager : IPeerBanManager { private static readonly ILogger Logger = LoggerFactory.GetLoggerForClass(); + private static readonly Counter BanForPenaltyCounter = Metrics.CreateCounter( + "lachain_peer_banned_for_penalty_count", + "Number of times a peer was banned for penalty", + "peer" + ); + private static readonly Gauge BanByPenaltyCycle = Metrics.CreateGauge( + "lachain_peer_banned_cycle", + "Latest cycle where a peer was banned for penalty", + new GaugeConfiguration + { + LabelNames = new[] {"peer", "penalties"} + } + ); private ulong _cycle = 0; // ban this peer for 3 cycles: this _cycle, _cycle + 1 and _cycle + 2 // this way even if he can become validator, will not get any attendance @@ -120,6 +134,8 @@ private void BanPeerForPenalty(object? sender, (byte[] publicKey, ulong penaltie Task.Factory.StartNew(() => { var (publicKey, penalties) = @event; + BanForPenaltyCounter.WithLabels(publicKey.ToHex()).Inc(); + BanByPenaltyCycle.WithLabels(publicKey.ToHex(), penalties.ToString()).Set(_cycle); BanPeer(publicKey); Logger.LogTrace($"Banned peer {publicKey.ToHex()} for {penalties} penalties during cycle {_cycle}"); OnPeerBanned?.Invoke(this, (publicKey, penalties));